From 091b52bccddaa2ea9795b4542aca892d7a27c849 Mon Sep 17 00:00:00 2001 From: listenerri Date: Mon, 3 Dec 2018 18:16:39 +0800 Subject: [PATCH] fix: dock hide problem and remove old imp efficient dock still hide in auto/smart hide mode while applet of plugins is showing and mouse leaved https://github.com/linuxdeepin/developer-center/issues/707 Change-Id: I373ce94e802f79e1430a636d5019b24fdbaa650b --- frame/controller/dockpluginscontroller.cpp | 33 ++++++-------- frame/controller/dockpluginscontroller.h | 2 + frame/item/traypluginitem.cpp | 4 -- interfaces/pluginproxyinterface.h | 3 ++ plugins/tray/abstracttraywidget.h | 2 + plugins/tray/fashiontrayitem.cpp | 22 ---------- plugins/tray/fashiontrayitem.h | 2 - plugins/tray/system-trays/systemtrayitem.h | 6 +-- .../system-trays/systemtrayscontroller.cpp | 18 +++++++- .../tray/system-trays/systemtrayscontroller.h | 2 + plugins/tray/trayplugin.cpp | 44 +++++++++++++++++++ plugins/tray/trayplugin.h | 3 ++ 12 files changed, 90 insertions(+), 51 deletions(-) diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index b5d85dedd..b88e215bd 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -94,19 +94,6 @@ void DockPluginsController::itemRemoved(PluginsItemInterface * const itemInter, item->deleteLater(); } -//void DockPluginsController::requestRefershWindowVisible() -//{ -// for (auto list : m_pluginList.values()) -// { -// for (auto item : list.values()) -// { -// Q_ASSERT(item); -// emit item->requestRefershWindowVisible(); -// return; -// } -// } -//} - void DockPluginsController::requestContextMenu(PluginsItemInterface * const itemInter, const QString &itemKey) { PluginsItem *item = pluginItemAt(itemInter, itemKey); @@ -115,13 +102,21 @@ void DockPluginsController::requestContextMenu(PluginsItemInterface * const item item->showContextMenu(); } -//void DockPluginsController::requestPopupApplet(PluginsItemInterface * const itemInter, const QString &itemKey) -//{ -// PluginsItem *item = pluginItemAt(itemInter, itemKey); +void DockPluginsController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) +{ + PluginsItem *item = pluginItemAt(itemInter, itemKey); + Q_ASSERT(item); -// Q_ASSERT(item); -// item->showPopupApplet(); -//} + Q_EMIT item->requestWindowAutoHide(autoHide); +} + +void DockPluginsController::requestRefershWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + PluginsItem *item = pluginItemAt(itemInter, itemKey); + Q_ASSERT(item); + + Q_EMIT item->requestRefershWindowVisible(); +} void DockPluginsController::startLoader() { diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index b0f3940d1..88545861c 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -46,6 +46,8 @@ public: void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey); void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey); void requestContextMenu(PluginsItemInterface * const itemInter, const QString &itemKey); + void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) Q_DECL_OVERRIDE; + void requestRefershWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) Q_DECL_OVERRIDE; void saveValue(PluginsItemInterface *const itemInter, const QString &itemKey, const QVariant &value); const QVariant getValue(PluginsItemInterface *const itemInter, const QString &itemKey, const QVariant& failback = QVariant()); diff --git a/frame/item/traypluginitem.cpp b/frame/item/traypluginitem.cpp index 3a81f6c61..afcbb2813 100644 --- a/frame/item/traypluginitem.cpp +++ b/frame/item/traypluginitem.cpp @@ -51,10 +51,6 @@ bool TrayPluginItem::eventFilter(QObject *watched, QEvent *e) const QString &propertyName = static_cast(e)->propertyName(); if (propertyName == "FashionTraySize") { Q_EMIT fashionTraySizeChanged(watched->property("FashionTraySize").toSize()); - } else if (propertyName == "RequestWindowAutoHide") { - Q_EMIT requestWindowAutoHide(watched->property("RequestWindowAutoHide").toBool()); - } else if (propertyName == "RequestRefershWindowVisible") { - Q_EMIT requestRefershWindowVisible(); } } diff --git a/interfaces/pluginproxyinterface.h b/interfaces/pluginproxyinterface.h index d58d13792..c6a56eaf4 100644 --- a/interfaces/pluginproxyinterface.h +++ b/interfaces/pluginproxyinterface.h @@ -63,6 +63,9 @@ public: /// virtual void requestContextMenu(PluginsItemInterface * const itemInter, const QString &itemKey) = 0; + virtual void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) = 0; + virtual void requestRefershWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) = 0; + /// /// \brief saveValue /// save module config to .config/deepin/dde-dock.conf diff --git a/plugins/tray/abstracttraywidget.h b/plugins/tray/abstracttraywidget.h index 5a891a460..9a9fe80c6 100644 --- a/plugins/tray/abstracttraywidget.h +++ b/plugins/tray/abstracttraywidget.h @@ -46,6 +46,8 @@ Q_SIGNALS: void iconChanged(); void clicked(); void needAttention(); + void requestWindowAutoHide(const bool autoHide); + void requestRefershWindowVisible(); protected: void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; diff --git a/plugins/tray/fashiontrayitem.cpp b/plugins/tray/fashiontrayitem.cpp index 91ad288d9..f3ee62d24 100644 --- a/plugins/tray/fashiontrayitem.cpp +++ b/plugins/tray/fashiontrayitem.cpp @@ -122,12 +122,6 @@ void FashionTrayItem::trayWidgetAdded(const QString &itemKey, AbstractTrayWidget connect(wrapper, &FashionTrayWidgetWrapper::dragStop, this, &FashionTrayItem::onItemDragStop, Qt::UniqueConnection); connect(wrapper, &FashionTrayWidgetWrapper::requestSwapWithDragging, this, &FashionTrayItem::onItemRequestSwapWithDragging, Qt::UniqueConnection); - if (trayWidget->trayTyep() == AbstractTrayWidget::TrayType::SystemTray) { - SystemTrayItem * sysTrayWidget = static_cast(trayWidget); - connect(sysTrayWidget, &SystemTrayItem::requestWindowAutoHide, this, &FashionTrayItem::requestWindowAutoHide, Qt::UniqueConnection); - connect(sysTrayWidget, &SystemTrayItem::requestRefershWindowVisible, this, &FashionTrayItem::requestRefershWindowVisible, Qt::UniqueConnection); - } - requestResize(); } @@ -604,22 +598,6 @@ void FashionTrayItem::switchAttionTray(FashionTrayWidgetWrapper *attentionWrappe m_currentAttentionTray = attentionWrapper; } -void FashionTrayItem::requestWindowAutoHide(const bool autoHide) -{ - // reset property "RequestWindowAutoHide" to EMIT the signal of DockItem - // TODO: 考虑新增插件接口 - - setProperty("RequestWindowAutoHide", autoHide); -} - -void FashionTrayItem::requestRefershWindowVisible() -{ - // reset property "RequestRefershWindowVisible" to EMIT the signal of DockItem - // TODO: 考虑新增插件接口 - - setProperty("RequestRefershWindowVisible", !property("RequestRefershWindowVisible").toBool()); -} - void FashionTrayItem::refreshTraysVisible() { const bool expand = m_controlWidget->expanded(); diff --git a/plugins/tray/fashiontrayitem.h b/plugins/tray/fashiontrayitem.h index 49cd72910..e4ef8e3b7 100644 --- a/plugins/tray/fashiontrayitem.h +++ b/plugins/tray/fashiontrayitem.h @@ -77,8 +77,6 @@ private Q_SLOTS: void moveOutAttionTray(); void moveInAttionTray(); void switchAttionTray(FashionTrayWidgetWrapper *attentionWrapper); - void requestWindowAutoHide(const bool autoHide); - void requestRefershWindowVisible(); void refreshTraysVisible(); void onItemDragStart(); void onItemDragStop(); diff --git a/plugins/tray/system-trays/systemtrayitem.h b/plugins/tray/system-trays/systemtrayitem.h index 962129460..173e39d92 100644 --- a/plugins/tray/system-trays/systemtrayitem.h +++ b/plugins/tray/system-trays/systemtrayitem.h @@ -54,9 +54,9 @@ public: QWidget *centralWidget() const; void detachPluginWidget(); -Q_SIGNALS: - void requestWindowAutoHide(const bool autoHide) const; - void requestRefershWindowVisible() const; +//Q_SIGNALS: +// void requestWindowAutoHide(const bool autoHide) const; +// void requestRefershWindowVisible() const; protected: bool event(QEvent *event) Q_DECL_OVERRIDE; diff --git a/plugins/tray/system-trays/systemtrayscontroller.cpp b/plugins/tray/system-trays/systemtrayscontroller.cpp index 5de21cabc..df63a4c70 100644 --- a/plugins/tray/system-trays/systemtrayscontroller.cpp +++ b/plugins/tray/system-trays/systemtrayscontroller.cpp @@ -88,7 +88,23 @@ void SystemTraysController::requestContextMenu(PluginsItemInterface * const item SystemTrayItem *item = pluginItemAt(itemInter, itemKey); Q_ASSERT(item); -// item->showContextMenu(); + // item->showContextMenu(); +} + +void SystemTraysController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) +{ + SystemTrayItem *item = pluginItemAt(itemInter, itemKey); + Q_ASSERT(item); + + Q_EMIT item->requestWindowAutoHide(autoHide); +} + +void SystemTraysController::requestRefershWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + SystemTrayItem *item = pluginItemAt(itemInter, itemKey); + Q_ASSERT(item); + + Q_EMIT item->requestRefershWindowVisible(); } void SystemTraysController::startLoader() diff --git a/plugins/tray/system-trays/systemtrayscontroller.h b/plugins/tray/system-trays/systemtrayscontroller.h index 3ccc5ff3f..3853f50b0 100644 --- a/plugins/tray/system-trays/systemtrayscontroller.h +++ b/plugins/tray/system-trays/systemtrayscontroller.h @@ -43,6 +43,8 @@ public: void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey); void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey); void requestContextMenu(PluginsItemInterface * const itemInter, const QString &itemKey); + void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) Q_DECL_OVERRIDE; + void requestRefershWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) Q_DECL_OVERRIDE; void saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value); const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& failback = QVariant()); diff --git a/plugins/tray/trayplugin.cpp b/plugins/tray/trayplugin.cpp index f9385dde8..3090a6c69 100644 --- a/plugins/tray/trayplugin.cpp +++ b/plugins/tray/trayplugin.cpp @@ -246,6 +246,19 @@ bool TrayPlugin::isSystemTrayItem(const QString &itemKey) return false; } +QString TrayPlugin::itemKeyOfTrayWidget(AbstractTrayWidget *trayWidget) +{ + QString itemKey; + + if (displayMode() == Dock::DisplayMode::Fashion) { + itemKey = FASHION_MODE_ITEM; + } else { + itemKey = m_trayMap.key(trayWidget); + } + + return itemKey; +} + void TrayPlugin::sniItemsChanged() { const QStringList &itemServicePaths = m_sniWatcher->RegisteredStatusNotifierItems(); @@ -289,6 +302,15 @@ void TrayPlugin::addTrayWidget(const QString &itemKey, AbstractTrayWidget *trayW return; } + connect(trayWidget, &AbstractTrayWidget::requestWindowAutoHide, this, [=](const bool autoHide) { + const QString &key = displayMode() == Dock::DisplayMode::Fashion ? FASHION_MODE_ITEM : itemKey; + m_proxyInter->requestWindowAutoHide(this, key, autoHide); + }, Qt::UniqueConnection); + connect(trayWidget, &AbstractTrayWidget::requestRefershWindowVisible, this, [=] { + const QString &key = displayMode() == Dock::DisplayMode::Fashion ? FASHION_MODE_ITEM : itemKey; + m_proxyInter->requestRefershWindowVisible(this, key); + }, Qt::UniqueConnection); + if (!m_trayMap.values().contains(trayWidget)) { m_trayMap.insert(itemKey, trayWidget); } @@ -403,6 +425,28 @@ void TrayPlugin::switchToMode(const Dock::DisplayMode mode) } } +void TrayPlugin::onRequestWindowAutoHide(const bool autoHide) +{ + const QString &itemKey = itemKeyOfTrayWidget(static_cast(sender())); + + if (itemKey.isEmpty()) { + return; + } + + m_proxyInter->requestWindowAutoHide(this, itemKey, autoHide); +} + +void TrayPlugin::onRequestRefershWindowVisible() +{ + const QString &itemKey = itemKeyOfTrayWidget(static_cast(sender())); + + if (itemKey.isEmpty()) { + return; + } + + m_proxyInter->requestRefershWindowVisible(this, itemKey); +} + void TrayPlugin::loadIndicator() { QDir indicatorConfDir("/etc/dde-dock/indicator"); diff --git a/plugins/tray/trayplugin.h b/plugins/tray/trayplugin.h index fe53056cd..3b452e59d 100644 --- a/plugins/tray/trayplugin.h +++ b/plugins/tray/trayplugin.h @@ -69,6 +69,7 @@ private: void loadIndicator(); const QString getWindowClass(quint32 winId); bool isSystemTrayItem(const QString &itemKey); + QString itemKeyOfTrayWidget(AbstractTrayWidget *trayWidget); private slots: void addTrayWidget(const QString &itemKey, AbstractTrayWidget *trayWidget); @@ -79,6 +80,8 @@ private slots: void trayChanged(quint32 winId); void sniItemIconChanged(); void switchToMode(const Dock::DisplayMode mode); + void onRequestWindowAutoHide(const bool autoHide); + void onRequestRefershWindowVisible(); private: DBusTrayManager *m_trayInter;