diff --git a/frame/util/dockpopupwindow.cpp b/frame/util/dockpopupwindow.cpp index 11912ae82..0c97f79a8 100644 --- a/frame/util/dockpopupwindow.cpp +++ b/frame/util/dockpopupwindow.cpp @@ -39,6 +39,7 @@ DockPopupWindow::DockPopupWindow(QWidget *parent) , m_model(false) , m_eventMonitor(new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus(), this)) , m_enableMouseRelease(true) + , m_extendWidget(nullptr) { setMargin(0); m_wmHelper = DWindowManagerHelper::instance(); @@ -85,6 +86,11 @@ void DockPopupWindow::setContent(QWidget *content) DArrowRectangle::setContent(content); } +void DockPopupWindow::setExtendWidget(QWidget *widget) +{ + m_extendWidget = widget; +} + void DockPopupWindow::show(const QPoint &pos, const bool model) { m_model = model; @@ -141,6 +147,12 @@ void DockPopupWindow::showEvent(QShowEvent *e) QTimer::singleShot(1, this, &DockPopupWindow::ensureRaised); } +void DockPopupWindow::hideEvent(QHideEvent *event) +{ + m_extendWidget = nullptr; + Dtk::Widget::DArrowRectangle::hideEvent(event); +} + void DockPopupWindow::enterEvent(QEvent *e) { DArrowRectangle::enterEvent(e); @@ -191,6 +203,14 @@ void DockPopupWindow::onButtonPress(int type, int x, int y, const QString &key) if (popupRect.contains(x, y)) return; + if (m_extendWidget) { + // 计算额外添加的区域,如果鼠标的点击点在额外的区域内,也无需隐藏 + QPoint extendPoint = m_extendWidget->mapToGlobal(QPoint(0, 0)); + QRect extendRect(extendPoint * qApp->devicePixelRatio(), m_extendWidget->size() * qApp->devicePixelRatio()); + if (extendRect.contains(QPoint(x, y))) + return; + } + emit accept(); hide(); } diff --git a/frame/util/dockpopupwindow.h b/frame/util/dockpopupwindow.h index c96695be4..0457a3964 100644 --- a/frame/util/dockpopupwindow.h +++ b/frame/util/dockpopupwindow.h @@ -44,6 +44,7 @@ public: bool model() const; void setContent(QWidget *content); + void setExtendWidget(QWidget *widget); public slots: void show(const QPoint &pos, const bool model = false); @@ -60,6 +61,7 @@ signals: protected: void showEvent(QShowEvent *e); + void hideEvent(QHideEvent *event); void enterEvent(QEvent *e); bool eventFilter(QObject *o, QEvent *e); void blockButtonRelease(); @@ -77,6 +79,7 @@ private: QString m_eventKey; DWindowManagerHelper *m_wmHelper; bool m_enableMouseRelease; + QWidget *m_extendWidget; }; #endif // DOCKPOPUPWINDOW_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 7897f15d9..40484ffc8 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -416,7 +416,7 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do void QuickPluginWindow::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) { - showPopup(getDockItemByPlugin(itemInter), itemInter, itemInter->itemPopupApplet(itemKey)); + showPopup(getDockItemByPlugin(itemInter), itemInter, itemInter->itemPopupApplet(itemKey), false); } void QuickPluginWindow::startDrag() @@ -433,8 +433,6 @@ void QuickPluginWindow::startDrag() drag->setPixmap(dragPixmap); drag->setHotSpot(dragPixmap.rect().center()); - //connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, &QuickPluginWindow::onPluginDropItem); - //connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, &QuickPluginWindow::onPluginDragMove); drag->exec(Qt::CopyAction); // 获取当前鼠标在任务栏快捷图标区域的位置 @@ -477,13 +475,19 @@ QuickDockItem *QuickPluginWindow::getActiveDockItem(QPoint point) const return selectWidget; } -void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *itemInter, QWidget *childPage) +void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *itemInter, QWidget *childPage, bool isClicked) { if (!isVisible()) return; bool canBack = true; DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); + if (isClicked && popWindow->isVisible()) { + // 如果是点击插件,并且该插件曾经打开快捷面板且已经是显示状态,那么就直接隐藏快捷面板 + popWindow->hide(); + return; + } + if (!popWindow->isVisible()) { if (Utils::IS_WAYLAND_DISPLAY) { // TODO: 临时解决方案,如果是wayland环境,toolTip没有消失,因此,此处直接调用接口来隐藏 @@ -500,6 +504,7 @@ void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *ite } } + popWindow->setExtendWidget(item); popWindow->show(popupPoint(item), true); canBack = false; } @@ -568,53 +573,6 @@ int QuickPluginWindow::getDropIndex(QPoint point) return -1; } -/*void QuickPluginWindow::onPluginDropItem(QDropEvent *event) -{ - const QuickPluginMimeData *data = qobject_cast(event->mimeData()); - if (!data) - return; - - // 获取当前鼠标在任务栏快捷图标区域的位置 - QPoint currentPoint = mapFromGlobal(QCursor::pos()); - // 获取区域图标插入的位置 - QuickPluginModel::instance()->addPlugin(data->pluginItemInterface(), getDropIndex(currentPoint)); -}*/ - -void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) -{ - QPoint currentPoint = mapFromGlobal(QCursor::pos()); - const QuickPluginMimeData *data = qobject_cast(event->mimeData()); - if (!data) - return; - - // 查找移动的 - PluginsItemInterface *sourceItem = data->pluginItemInterface(); - if (!sourceItem) - return; - - QuickDockItem *sourceMoveWidget = getDockItemByPlugin(sourceItem); - QuickDockItem *targetItem = getActiveDockItem(currentPoint); - // 如果未找到要移动的目标位置,或者移动的目标位置是固定插件,或者原插件和目标插件是同一个插件,则不做任何操作 - if (!sourceMoveWidget || !targetItem || sourceMoveWidget == targetItem) - return; - - // 重新对所有的插件进行排序 - QMap allItems; - for (int i = 0; i < m_mainLayout->count(); i++) { - QWidget *childWidget = m_mainLayout->itemAt(i)->widget(); - allItems[childWidget] = i; - } - // 调整列表中的位置 -/* int sourceIndex = m_activeSettingItems.indexOf(sourceItem); - int targetIndex = m_activeSettingItems.indexOf(targetItem->pluginItem()); - if (sourceIndex >= 0) - m_activeSettingItems.move(sourceIndex, targetIndex); - else - m_activeSettingItems.insert(targetIndex, sourceItem); -*/ - event->accept(); -} - void QuickPluginWindow::dragMoveEvent(QDragMoveEvent *event) { event->accept(); diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 563541ef9..64d37f301 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -69,8 +69,6 @@ protected: private Q_SLOTS: void onRequestUpdate(); - //void onPluginDropItem(QDropEvent *event); - void onPluginDragMove(QDragMoveEvent *event); void onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart); void onRequestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); @@ -83,7 +81,7 @@ private: QPoint popupPoint(QWidget *widget) const; QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); QuickDockItem *getActiveDockItem(QPoint point) const; - void showPopup(QuickDockItem *item, PluginsItemInterface *itemInter = nullptr, QWidget *childPage = nullptr); + void showPopup(QuickDockItem *item, PluginsItemInterface *itemInter = nullptr, QWidget *childPage = nullptr, bool isClicked = true); QList quickDockItems(); private: