From 3857259758b5fc34e5de72344b5d4c500570080e Mon Sep 17 00:00:00 2001 From: Yutao Meng Date: Tue, 15 Oct 2024 20:50:39 +0800 Subject: [PATCH] feat: Allow plugins sending close quick panel requests Bug: https://pms.uniontech.com/bug-view-272277.html Log: --- src/loader/widgetplugin.cpp | 62 +++++++++++-------- src/protocol/plugin-manager-v1.xml | 1 + src/tray-wayland-integration/plugin.h | 1 + .../pluginsurface.cpp | 5 ++ 4 files changed, 44 insertions(+), 25 deletions(-) diff --git a/src/loader/widgetplugin.cpp b/src/loader/widgetplugin.cpp index 9676d60e..8956c284 100644 --- a/src/loader/widgetplugin.cpp +++ b/src/loader/widgetplugin.cpp @@ -218,36 +218,48 @@ void WidgetPlugin::requestRefreshWindowVisible(PluginsItemInterface * const item void WidgetPlugin::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) { - if (!visible) return; - QWidget* appletWidget = itemInter->itemPopupApplet(itemKey); - if (!appletWidget) { - qWarning() << itemKey << " plugin applet popup is null"; - return; - } + qDebug() << "requestSetAppletVisible was called"; + + if (!visible) { + if (appletWidget == nullptr || !appletWidget->isVisible()) { + qDebug() << "send hide quick panel message"; + Plugin::EmbedPlugin *plugin = Plugin::EmbedPlugin::get(itemInter->itemWidget(itemKey)->window()->windowHandle()); + if (plugin) { + emit plugin->closeQuickPanel(); + } else { + qWarning() << "plugin is null"; + } + } + } else { + if (!appletWidget) { + qWarning() << itemKey << " plugin applet popup is null"; + return; + } - updateDockContainerState(itemInter, false); - if (Plugin::PluginPopup::contains(appletWidget->windowHandle())) { - Plugin::PluginPopup::remove(appletWidget->windowHandle()); - } + updateDockContainerState(itemInter, false); + if (Plugin::PluginPopup::contains(appletWidget->windowHandle())) { + Plugin::PluginPopup::remove(appletWidget->windowHandle()); + } - appletWidget->winId(); - appletWidget->setParent(nullptr); - appletWidget->setAttribute(Qt::WA_TranslucentBackground); + appletWidget->winId(); + appletWidget->setParent(nullptr); + appletWidget->setAttribute(Qt::WA_TranslucentBackground); + + bool hasCreated = Plugin::PluginPopup::contains(appletWidget->windowHandle()); + auto pluginPopup = Plugin::PluginPopup::get(appletWidget->windowHandle()); + if (!hasCreated) { + connect(pluginPopup, &Plugin::PluginPopup::eventGeometry, appletWidget, [appletWidget](const QRect &geometry) { + appletWidget->setFixedSize(geometry.size()); + appletWidget->update(); + }); + } - bool hasCreated = Plugin::PluginPopup::contains(appletWidget->windowHandle()); - auto pluginPopup = Plugin::PluginPopup::get(appletWidget->windowHandle()); - if (!hasCreated) { - connect(pluginPopup, &Plugin::PluginPopup::eventGeometry, appletWidget, [appletWidget](const QRect &geometry) { - appletWidget->setFixedSize(geometry.size()); - appletWidget->update(); - }); + pluginPopup->setPluginId(m_pluginsItemInterface->pluginName()); + pluginPopup->setItemKey(itemKey); + pluginPopup->setPopupType(Plugin::PluginPopup::PopupTypeEmbed); + appletWidget->show(); } - - pluginPopup->setPluginId(m_pluginsItemInterface->pluginName()); - pluginPopup->setItemKey(itemKey); - pluginPopup->setPopupType(Plugin::PluginPopup::PopupTypeEmbed); - appletWidget->show(); } void WidgetPlugin::saveValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &value) diff --git a/src/protocol/plugin-manager-v1.xml b/src/protocol/plugin-manager-v1.xml index 864d9f61..99f9aed6 100644 --- a/src/protocol/plugin-manager-v1.xml +++ b/src/protocol/plugin-manager-v1.xml @@ -125,5 +125,6 @@ + diff --git a/src/tray-wayland-integration/plugin.h b/src/tray-wayland-integration/plugin.h index dfdcea4f..74323fc1 100644 --- a/src/tray-wayland-integration/plugin.h +++ b/src/tray-wayland-integration/plugin.h @@ -80,6 +80,7 @@ class Q_DECL_EXPORT EmbedPlugin : public QObject void requestMessage(const QString &msg); void pluginRecvMouseEvent(int type); void rawGlobalPosChanged(); + void closeQuickPanel(); private: explicit EmbedPlugin(QWindow* window); diff --git a/src/tray-wayland-integration/pluginsurface.cpp b/src/tray-wayland-integration/pluginsurface.cpp index 9e26f7b2..7a29cd32 100644 --- a/src/tray-wayland-integration/pluginsurface.cpp +++ b/src/tray-wayland-integration/pluginsurface.cpp @@ -30,6 +30,11 @@ PluginSurface::PluginSurface(PluginManager *manager, QtWaylandClient::QWaylandWi connect(m_plugin, &EmbedPlugin::pluginRecvMouseEvent, this, [this] (int type){ mouse_event(type); }); + + connect(m_plugin, &EmbedPlugin::closeQuickPanel, this, [this] { + qDebug() << "send close popup signal"; + close_quick_panel(); + }); } PluginSurface::~PluginSurface()