diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index cdb60aea3..5e2db39ce 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -9,6 +9,8 @@ DockPluginsController::DockPluginsController(DockItemController *itemControllerI : QObject(itemControllerInter), m_itemControllerInter(itemControllerInter) { + qApp->installEventFilter(this); + QMetaObject::invokeMethod(this, "loadPlugins", Qt::QueuedConnection); } @@ -20,12 +22,18 @@ void DockPluginsController::itemAdded(PluginsItemInterface * const itemInter, co { PluginsItem *item = new PluginsItem(itemInter, itemKey); + m_pluginList[itemInter][itemKey] = item; + emit pluginItemInserted(item); } -DisplayMode DockPluginsController::displayMode() const +void DockPluginsController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) { - return Fashion; + PluginsItem *item = pluginItemAt(itemInter, itemKey); + + Q_ASSERT(item); + + item->update(); } void DockPluginsController::loadPlugins() @@ -65,3 +73,43 @@ void DockPluginsController::loadPlugins() // m_pluginsInterfaceList.append(interface); } } + +void DockPluginsController::displayModeChanged() +{ + const DisplayMode displayMode = qApp->property(PROP_DISPLAY_MODE).value(); + for (auto inter : m_pluginList.keys()) + inter->displayModeChanged(displayMode); +} + +void DockPluginsController::positionChanged() +{ + const Position position = qApp->property(PROP_POSITION).value(); + for (auto inter : m_pluginList.keys()) + inter->positionChanged(position); +} + +bool DockPluginsController::eventFilter(QObject *o, QEvent *e) +{ + if (o != qApp) + return false; + if (e->type() != QEvent::DynamicPropertyChange) + return false; + + QDynamicPropertyChangeEvent * const dpce = static_cast(e); + const QString propertyName = dpce->propertyName(); + + if (propertyName == PROP_POSITION) + positionChanged(); + else if (propertyName == PROP_DISPLAY_MODE) + displayModeChanged(); + + return false; +} + +PluginsItem *DockPluginsController::pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const +{ + if (!m_pluginList.contains(itemInter)) + return nullptr; + + return m_pluginList[itemInter][itemKey]; +} diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index 3c27b8d1b..a753df690 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -6,6 +6,7 @@ #include #include +#include class DockItemController; class PluginsItemInterface; @@ -19,18 +20,24 @@ public: // implements PluginProxyInterface void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey); - - Dock::DisplayMode displayMode() const; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey); signals: void pluginItemInserted(PluginsItem *pluginsItem) const; private slots: void loadPlugins(); + void displayModeChanged(); + void positionChanged(); + +private: + bool eventFilter(QObject *o, QEvent *e); + PluginsItem *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; private: // QList m_pluginsInterfaceList; // QList m_pluginLoaderList; + QMap> m_pluginList; DockItemController *m_itemControllerInter; }; diff --git a/interfaces/pluginproxyinterface.h b/interfaces/pluginproxyinterface.h index e5bcee424..6795b031c 100644 --- a/interfaces/pluginproxyinterface.h +++ b/interfaces/pluginproxyinterface.h @@ -10,8 +10,7 @@ class PluginProxyInterface { public: virtual void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) = 0; - - virtual Dock::DisplayMode displayMode() const = 0; + virtual void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) = 0; }; #endif // PLUGINPROXYINTERFACE_H diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index bd4e877f1..dc77375c2 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -22,11 +22,15 @@ public: virtual const QString pluginName() = 0; // init plugins virtual void init(PluginProxyInterface *proxyInter) = 0; + // dock display mode changed + virtual void displayModeChanged(const Dock::DisplayMode displayMode) {Q_UNUSED(displayMode);} + // dock position changed + virtual void positionChanged(const Dock::Position position) {Q_UNUSED(position);} // plugins type, simple icon or complex widget virtual PluginType pluginType(const QString &itemKey) = 0; // item sort key - virtual int itemSortKey(const QString &itemKey) {Q_UNUSED(itemKey); return -1;} + virtual int itemSortKey(const QString &itemKey) {Q_UNUSED(itemKey); return 0;} // if complex widget mode, only return widget to plugins item virtual QWidget *itemWidget(const QString &itemKey) {Q_UNUSED(itemKey); return nullptr;} @@ -34,6 +38,17 @@ public: virtual const QIcon itemIcon(const QString &itemKey) {Q_UNUSED(itemKey); return QIcon();} virtual const QString itemCommand(const QString &itemKey) {Q_UNUSED(itemKey); return QString();} +protected: + Dock::DisplayMode displayMode() const + { + return qApp->property(PROP_DISPLAY_MODE).value(); + } + + Dock::Position position() const + { + return qApp->property(PROP_POSITION).value(); + } + protected: PluginProxyInterface *m_proxyInter; }; diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index b079b67a2..ea8cc88a3 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -35,6 +35,13 @@ void DatetimePlugin::init(PluginProxyInterface *proxyInter) m_proxyInter->itemAdded(this, QString()); } +int DatetimePlugin::itemSortKey(const QString &itemKey) const +{ + Q_UNUSED(itemKey); + + return -1; +} + QWidget *DatetimePlugin::itemWidget(const QString &itemKey) { Q_UNUSED(itemKey); diff --git a/plugins/datetime/datetimeplugin.h b/plugins/datetime/datetimeplugin.h index 23769bc05..e41772ad0 100644 --- a/plugins/datetime/datetimeplugin.h +++ b/plugins/datetime/datetimeplugin.h @@ -20,6 +20,8 @@ public: PluginType pluginType(const QString &itemKey); void init(PluginProxyInterface *proxyInter); + int itemSortKey(const QString &itemKey) const; + QWidget *itemWidget(const QString &itemKey); private slots: diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index 87318aec3..ac56f161d 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -39,10 +39,3 @@ const QString ShutdownPlugin::itemCommand(const QString &itemKey) return QString("dbus-send --print-reply --dest=com.deepin.dde.shutdownFront /com/deepin/dde/shutdownFront com.deepin.dde.shutdownFront.Show"); } - -int ShutdownPlugin::itemSortKey(const QString &itemKey) -{ - Q_UNUSED(itemKey); - - return 0; -} diff --git a/plugins/shutdown/shutdownplugin.h b/plugins/shutdown/shutdownplugin.h index 996765afd..f94935b6d 100644 --- a/plugins/shutdown/shutdownplugin.h +++ b/plugins/shutdown/shutdownplugin.h @@ -14,7 +14,6 @@ public: const QString pluginName(); void init(PluginProxyInterface *proxyInter); - int itemSortKey(const QString &itemKey); PluginType pluginType(const QString &itemKey);