diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 25787babd..1b2c76ba4 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -63,9 +63,29 @@ typedef struct DragInfo{ if (dragPoint.isNull()) return false; - return (qAbs(currentPoint.x() - dragPoint.x()) >=5 || + if (!dragPixmap()) + return false; + + return (qAbs(currentPoint.x() - dragPoint.x()) >= 5 || qAbs(currentPoint.y() - dragPoint.y()) >= 5); } + + QPixmap dragPixmap() const { + if (!dockItem) + return QPixmap(); + + QPixmap pixmap = dockItem->pluginItem()->icon(DockPart::QuickShow).pixmap(QSize(ITEMSIZE, ITEMSIZE)); + if (!pixmap.isNull()) + return pixmap; + + QString itemKey = QuickSettingController::instance()->itemKey(dockItem->pluginItem()); + QWidget *itemWidget = dockItem->pluginItem()->itemWidget(itemKey); + if (!itemWidget) + return QPixmap(); + + itemWidget->setFixedSize(20, 20); + return itemWidget->grab(); + } } DragInfo; static QStringList fixedPluginNames{ "network", "sound", "power" }; @@ -235,7 +255,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) QMouseEvent *mouseEvent = static_cast(event); if (m_dragInfo->canDrag(mouseEvent->pos())) { - startDrag(m_dragInfo->dockItem->pluginItem()); + startDrag(); m_dragInfo->reset(); } break; @@ -349,14 +369,19 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do dockItem->update(); } -void QuickPluginWindow::startDrag(PluginsItemInterface *moveItem) +void QuickPluginWindow::startDrag() { + if (!m_dragInfo->dockItem) + return; + + PluginsItemInterface *moveItem = m_dragInfo->dockItem->pluginItem(); AppDrag *drag = new AppDrag(this, new QuickDragWidget); QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem); drag->setMimeData(mimedata); drag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size())); - QPixmap dragPixmap = moveItem->icon(DockPart::QuickPanel).pixmap(QSize(ITEMSIZE, ITEMSIZE)); + QPixmap dragPixmap = m_dragInfo->dragPixmap(); drag->setPixmap(dragPixmap); + drag->setHotSpot(QPoint(0, 0)); connect(drag->appDragWidget(), &AppDragWidget::requestSplitWindow, this, [ this, moveItem ] { diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 27fe3c09c..5bcdfa4f2 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -73,7 +73,7 @@ private Q_SLOTS: private: void initUi(); void initConnection(); - void startDrag(PluginsItemInterface *moveItem); + void startDrag(); PluginsItemInterface *findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems); int getDropIndex(QPoint point); QPoint popupPoint(QWidget *widget) const; @@ -106,12 +106,12 @@ protected: void enterEvent(QEvent *event) override; void leaveEvent(QEvent *event) override; - QPixmap iconPixmap() const; - private: QPoint topleftPoint() const; QPoint popupMarkPoint() const; + QPixmap iconPixmap() const; + private Q_SLOTS: void onMenuActionClicked(QAction *action); diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index e89ff39cd..9266d482c 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -80,6 +80,7 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_displaySettingWidget(new DisplaySettingWidget(this)) , m_childPage(new PluginChildPage(this)) , m_dragInfo(new struct QuickDragInfo) + , m_childShowPlugin(nullptr) { initUi(); initConnection(); @@ -94,6 +95,7 @@ QuickSettingContainer::~QuickSettingContainer() void QuickSettingContainer::showHomePage() { + m_childShowPlugin = nullptr; m_switchLayout->setCurrentIndex(0); } @@ -239,6 +241,8 @@ void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) m_quickSettings.removeOne(removeItem); removeItem->deleteLater(); + if (m_childShowPlugin == itemInter) + showHomePage(); updateItemLayout(); onResizeView(); @@ -250,7 +254,8 @@ void QuickSettingContainer::onShowChildWidget(QWidget *childWidget) if (!quickWidget) return; - showWidget(childWidget, quickWidget->pluginItem()->pluginDisplayName()); + m_childShowPlugin = quickWidget->pluginItem(); + showWidget(childWidget, m_childShowPlugin->pluginDisplayName()); onResizeView(); } diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 0fb6dab92..905b23fe7 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -103,6 +103,7 @@ private: PluginChildPage *m_childPage; QuickDragInfo *m_dragInfo; QList m_quickSettings; + PluginsItemInterface *m_childShowPlugin; }; class QuickPluginMimeData : public QMimeData