diff --git a/src/loader/pluginitem.cpp b/src/loader/pluginitem.cpp index 0f438c377..a60b2ce90 100644 --- a/src/loader/pluginitem.cpp +++ b/src/loader/pluginitem.cpp @@ -109,6 +109,7 @@ QWidget *PluginItem::itemPopupApplet() pluginPopup->setPluginId(m_pluginsItemInterface->pluginName()); pluginPopup->setItemKey(m_itemKey); pluginPopup->setPopupType(Plugin::PluginPopup::PopupTypePanel); + Q_EMIT appletOpened(popup); return popup; } return nullptr; diff --git a/src/loader/pluginitem.h b/src/loader/pluginitem.h index 731fc2cb4..0aa5994e4 100644 --- a/src/loader/pluginitem.h +++ b/src/loader/pluginitem.h @@ -40,6 +40,7 @@ class PluginItem : public QWidget signals: void recvMouseEvent(int type); void sigRequestShutdown(const QString &type); + void appletOpened(QWidget *applet); protected: void mousePressEvent(QMouseEvent *e) override; diff --git a/src/loader/widgetplugin.cpp b/src/loader/widgetplugin.cpp index 3bd2e4a0b..206962bb1 100644 --- a/src/loader/widgetplugin.cpp +++ b/src/loader/widgetplugin.cpp @@ -288,6 +288,8 @@ void WidgetPlugin::requestSetAppletVisible(PluginsItemInterface * const itemInte return; } + trackAppletWidget(appletWidget); + updateDockContainerState(itemInter, false); if (Plugin::PluginPopup::contains(appletWidget->windowHandle())) { Plugin::PluginPopup::remove(appletWidget->windowHandle()); @@ -377,9 +379,50 @@ void WidgetPlugin::onDockEventMessageArrived(const QString &message) } auto pluginsItemInterfaceV2 = dynamic_cast(m_pluginsItemInterface); - if (pluginsItemInterfaceV2) { - pluginsItemInterfaceV2->message(message); + if (!pluginsItemInterfaceV2) + return; + + if (getRootObj(message).value(Dock::MSG_TYPE).toString() == Dock::MSG_SET_APPLET_MIN_HEIGHT) { + if (m_appletWidget && m_appletWidget->isVisible()) { + m_pendingAppletMinHeightMsg = message; + return; + } + m_pendingAppletMinHeightMsg.clear(); } + + pluginsItemInterfaceV2->message(message); +} + +void WidgetPlugin::trackAppletWidget(QWidget *applet) +{ + if (!applet || m_appletWidget == applet) + return; + + if (m_appletWidget) + m_appletWidget->removeEventFilter(this); + + m_appletWidget = applet; + m_appletWidget->installEventFilter(this); +} + +void WidgetPlugin::flushPendingAppletMinHeight() +{ + if (m_pendingAppletMinHeightMsg.isEmpty()) + return; + + const QString message = m_pendingAppletMinHeightMsg; + m_pendingAppletMinHeightMsg.clear(); + + if (auto pluginsItemInterfaceV2 = dynamic_cast(m_pluginsItemInterface)) + pluginsItemInterfaceV2->message(message); +} + +bool WidgetPlugin::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_appletWidget && event->type() == QEvent::Show) + flushPendingAppletMinHeight(); + + return QObject::eventFilter(watched, event); } void WidgetPlugin::setFashionMode(bool fashionMode) @@ -512,6 +555,7 @@ void WidgetPlugin::initConnections(Plugin::EmbedPlugin *plugin, PluginItem *plug connect(plugin, &Plugin::EmbedPlugin::dockColorThemeChanged, this, &WidgetPlugin::onDockColorThemeChanged, Qt::UniqueConnection); connect(plugin, &Plugin::EmbedPlugin::dockPositionChanged, this, &WidgetPlugin::onDockPositionChanged, Qt::UniqueConnection); connect(plugin, &Plugin::EmbedPlugin::eventMessage, this, &WidgetPlugin::onDockEventMessageArrived, Qt::UniqueConnection); + connect(pluginItem, &PluginItem::appletOpened, this, &WidgetPlugin::trackAppletWidget, Qt::UniqueConnection); connect(plugin, &Plugin::EmbedPlugin::eventGeometry, this, [this, plugin, pluginItem](const QRect &geometry) { if (plugin->pluginType() == Plugin::EmbedPlugin::Quick) { diff --git a/src/loader/widgetplugin.h b/src/loader/widgetplugin.h index bcab8adad..6b538aea4 100644 --- a/src/loader/widgetplugin.h +++ b/src/loader/widgetplugin.h @@ -14,6 +14,7 @@ #include #include #include +#include namespace Plugin { class EmbedPlugin; @@ -47,6 +48,9 @@ public Q_SLOTS: void onDockDisplayModeChanged(uint32_t displayMode); void onDockEventMessageArrived(const QString &message); +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + private: Plugin::EmbedPlugin* getPlugin(QWidget*); void initConnections(Plugin::EmbedPlugin *plugin, PluginItem *pluginItem); @@ -56,6 +60,8 @@ public Q_SLOTS: bool bindCardPluginSurface(PluginsItemInterface *itemInter); int getPluginFlags(); void pluginUpdateDockSize(const QSize &size); + void trackAppletWidget(QWidget *applet); + void flushPendingAppletMinHeight(); static QString messageCallback(PluginsItemInterfaceV2 *, const QString &); static bool supportFlag(PluginsItemInterfaceV2 *pluginV2); @@ -68,6 +74,8 @@ public Q_SLOTS: QPointer m_cardItem; bool m_fashionMode = false; bool m_itemAdded = false; + QPointer m_appletWidget; + QString m_pendingAppletMinHeightMsg; }; }