From f9a0aacfa43746bb925a417c7a67d0571e236427 Mon Sep 17 00:00:00 2001 From: Hualet Wang Date: Fri, 3 Jul 2015 14:00:10 +0800 Subject: [PATCH] new plugin interface, proxy, plugin manager etc. --- dde-dock-systray-plugin/docktrayitem.cpp | 6 +-- dde-dock-systray-plugin/systrayplugin.cpp | 34 +++++++++++++-- dde-dock-systray-plugin/systrayplugin.h | 12 +++++- dde-dock/dde-dock.pro | 12 +++--- dde-dock/src/Panel/panel.cpp | 19 ++++----- dde-dock/src/Panel/panel.h | 1 - dde-dock/src/dockplugininterface.h | 7 +++- dde-dock/src/dockpluginmanager.cpp | 50 +++++++++++++++++++++++ dde-dock/src/dockpluginmanager.h | 24 +++++++++++ dde-dock/src/dockpluginproxy.cpp | 36 ++++++++++++++++ dde-dock/src/dockpluginproxy.h | 28 +++++++++++++ dde-dock/src/dockpluginproxyinterface.h | 13 ++++++ dde-dock/src/pluginitemwrapper.cpp | 14 +++++-- dde-dock/src/pluginitemwrapper.h | 3 ++ dde-dock/src/systraymanager.cpp | 47 --------------------- dde-dock/src/systraymanager.h | 22 ---------- 16 files changed, 227 insertions(+), 101 deletions(-) create mode 100644 dde-dock/src/dockpluginmanager.cpp create mode 100644 dde-dock/src/dockpluginmanager.h create mode 100644 dde-dock/src/dockpluginproxy.cpp create mode 100644 dde-dock/src/dockpluginproxy.h create mode 100644 dde-dock/src/dockpluginproxyinterface.h delete mode 100644 dde-dock/src/systraymanager.cpp delete mode 100644 dde-dock/src/systraymanager.h diff --git a/dde-dock-systray-plugin/docktrayitem.cpp b/dde-dock-systray-plugin/docktrayitem.cpp index 3ad8952f9..ca5a857d7 100644 --- a/dde-dock-systray-plugin/docktrayitem.cpp +++ b/dde-dock-systray-plugin/docktrayitem.cpp @@ -8,10 +8,8 @@ DockTrayItem * DockTrayItem::fromWinId(WId winId) QWindow *win = QWindow::fromWinId(winId); QWidget *child = QWidget::createWindowContainer(win, item); - - QHBoxLayout *layout = new QHBoxLayout(item); - layout->addWidget(child); - item->setLayout(layout); + child->setFixedSize(item->size()); + child->setParent(item); return item; } diff --git a/dde-dock-systray-plugin/systrayplugin.cpp b/dde-dock-systray-plugin/systrayplugin.cpp index b9842c7e3..7c732ff1b 100644 --- a/dde-dock-systray-plugin/systrayplugin.cpp +++ b/dde-dock-systray-plugin/systrayplugin.cpp @@ -1,28 +1,30 @@ #include #include "systrayplugin.h" -#include "abstractdockitem.h" - SystrayPlugin::~SystrayPlugin() { this->clearItems(); } -void SystrayPlugin::init() +void SystrayPlugin::init(DockPluginProxyInterface * proxier) { + m_proxier = proxier; + if (!m_dbusTrayManager) { m_dbusTrayManager = new com::deepin::dde::TrayManager("com.deepin.dde.TrayManager", "/com/deepin/dde/TrayManager", QDBusConnection::sessionBus(), this); + connect(m_dbusTrayManager, &TrayManager::Added, this, &SystrayPlugin::onAdded); + connect(m_dbusTrayManager, &TrayManager::Removed, this, &SystrayPlugin::onRemoved); } QList trayIcons = m_dbusTrayManager->trayIcons(); qDebug() << "Found trayicons: " << trayIcons; foreach (uint trayIcon, trayIcons) { - m_items[QString::number(trayIcon)] = DockTrayItem::fromWinId(trayIcon); + onAdded(trayIcon); } } @@ -36,6 +38,12 @@ QWidget * SystrayPlugin::getItem(QString uuid) return m_items.value(uuid); } +QString SystrayPlugin::name() +{ + return QString("systray"); +} + +// private methods void SystrayPlugin::clearItems() { foreach (QWidget * item, m_items) { @@ -43,3 +51,21 @@ void SystrayPlugin::clearItems() } m_items.clear(); } + +// private slots +void SystrayPlugin::onAdded(WId winId) +{ + QString key = QString::number(winId); + + DockTrayItem *item = DockTrayItem::fromWinId(winId); + m_items[key] = item; + + m_proxier->itemAddedEvent(key); +} + +void SystrayPlugin::onRemoved(WId winId) +{ + QString key = QString::number(winId); + + m_proxier->itemRemovedEvent(key); +} diff --git a/dde-dock-systray-plugin/systrayplugin.h b/dde-dock-systray-plugin/systrayplugin.h index 0f9699d6c..eca50778a 100644 --- a/dde-dock-systray-plugin/systrayplugin.h +++ b/dde-dock-systray-plugin/systrayplugin.h @@ -6,9 +6,10 @@ #include "docktrayitem.h" #include "dockplugininterface.h" +#include "dockpluginproxyinterface.h" #include "dbustraymanager.h" -class SystrayPlugin : public QObject, DockPluginInterface +class SystrayPlugin : public QObject, public DockPluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.deepin.Dock.PluginInterface" FILE "systray.json") @@ -17,15 +18,22 @@ class SystrayPlugin : public QObject, DockPluginInterface public: ~SystrayPlugin(); - void init() Q_DECL_OVERRIDE; + void init(DockPluginProxyInterface * proxier) Q_DECL_OVERRIDE; QStringList uuids() Q_DECL_OVERRIDE; QWidget * getItem(QString uuid) Q_DECL_OVERRIDE; + QString name() Q_DECL_OVERRIDE; + private: QMap m_items; + DockPluginProxyInterface * m_proxier = 0; com::deepin::dde::TrayManager *m_dbusTrayManager = 0; void clearItems(); + +private slots: + void onAdded(WId winId); + void onRemoved(WId winId); }; #endif // SYSTRAYPLUGIN_H diff --git a/dde-dock/dde-dock.pro b/dde-dock/dde-dock.pro index ff47691ee..2af18a6db 100644 --- a/dde-dock/dde-dock.pro +++ b/dde-dock/dde-dock.pro @@ -22,7 +22,6 @@ SOURCES += \ src/Widgets/windowpreview.cpp \ src/Panel/panel.cpp \ src/Widgets/appitem.cpp \ - src/systraymanager.cpp \ src/Panel/panelmenu.cpp \ src/Controller/dockmodedata.cpp \ src/Controller/dockconstants.cpp \ @@ -34,8 +33,9 @@ SOURCES += \ src/DBus/dbusdockedappmanager.cpp \ src/DBus/dbusdocksetting.cpp \ src/pluginitemwrapper.cpp \ - src/Widgets/arrowrectangle.cpp - + src/Widgets/arrowrectangle.cpp \ + src/dockpluginproxy.cpp \ + src/dockpluginmanager.cpp HEADERS += \ src/abstractdockitem.h \ src/dockplugininterface.h \ @@ -47,7 +47,6 @@ HEADERS += \ src/Widgets/windowpreview.h \ src/Panel/panel.h \ src/Widgets/appitem.h \ - src/systraymanager.h \ src/Panel/panelmenu.h \ src/Controller/dockmodedata.h \ src/Controller/dockconstants.h \ @@ -59,7 +58,10 @@ HEADERS += \ src/DBus/dbusdockedappmanager.h \ src/DBus/dbusdocksetting.h \ src/pluginitemwrapper.h \ - src/Widgets/arrowrectangle.h + src/Widgets/arrowrectangle.h\ + src/dockpluginproxyinterface.h \ + src/dockpluginproxy.h \ + src/dockpluginmanager.h RESOURCES += \ images.qrc \ diff --git a/dde-dock/src/Panel/panel.cpp b/dde-dock/src/Panel/panel.cpp index ff2a78223..003934a33 100644 --- a/dde-dock/src/Panel/panel.cpp +++ b/dde-dock/src/Panel/panel.cpp @@ -1,5 +1,6 @@ #include "panel.h" -#include "systraymanager.h" +#include "dockpluginproxy.h" +#include "dockpluginmanager.h" Panel::Panel(QWidget *parent) : QLabel(parent),parentWidget(parent) @@ -25,11 +26,16 @@ Panel::Panel(QWidget *parent) connect(dockCons, SIGNAL(dockModeChanged(DockConstants::DockMode,DockConstants::DockMode)), this, SLOT(slotDockModeChanged(DockConstants::DockMode,DockConstants::DockMode))); + DockPluginManager *pluginManager = new DockPluginManager(this); + QList proxies = pluginManager->getAll(); + foreach (DockPluginProxy* proxy, proxies) { + connect(proxy, &DockPluginProxy::itemAdded, [=](AbstractDockItem* item) { rightLayout->addItem(item); }); + connect(proxy, &DockPluginProxy::itemRemoved, [=](AbstractDockItem* item) { rightLayout->removeItem(rightLayout->indexOf(item)); }); + } panelMenu = new PanelMenu(); initAppManager(); - initSystrayManager(); slotDockModeChanged(dockCons->getDockMode(),dockCons->getDockMode()); } @@ -193,15 +199,6 @@ void Panel::initAppManager() m_appManager->updateEntries(); } -void Panel::initSystrayManager() -{ - SystrayManager *manager = new SystrayManager(); - foreach (AbstractDockItem *item, manager->trayIcons()) { - rightLayout->addItem(item); - qDebug() << item->geometry()<<"=====++++++++"; - } -} - Panel::~Panel() { diff --git a/dde-dock/src/Panel/panel.h b/dde-dock/src/Panel/panel.h index 91b7a2fbd..c3ce5d0d8 100644 --- a/dde-dock/src/Panel/panel.h +++ b/dde-dock/src/Panel/panel.h @@ -49,7 +49,6 @@ private: void hideMenu(); void initAppManager(); - void initSystrayManager(); private: DockLayout * leftLayout; DockLayout *rightLayout; diff --git a/dde-dock/src/dockplugininterface.h b/dde-dock/src/dockplugininterface.h index f60c8eb71..551eaf17e 100644 --- a/dde-dock/src/dockplugininterface.h +++ b/dde-dock/src/dockplugininterface.h @@ -4,13 +4,18 @@ #include #include +#include "dockpluginproxyinterface.h" + class DockPluginInterface { public: virtual ~DockPluginInterface() {} - virtual void init() = 0; + virtual void init(DockPluginProxyInterface *proxy) = 0; + virtual QStringList uuids() = 0; virtual QWidget* getItem(QString uuid) = 0; + + virtual QString name() = 0; }; QT_BEGIN_NAMESPACE diff --git a/dde-dock/src/dockpluginmanager.cpp b/dde-dock/src/dockpluginmanager.cpp new file mode 100644 index 000000000..763542b0c --- /dev/null +++ b/dde-dock/src/dockpluginmanager.cpp @@ -0,0 +1,50 @@ +#include +#include + +#include "dockpluginmanager.h" +#include "dockpluginproxy.h" +#include "dockplugininterface.h" + +DockPluginManager::DockPluginManager(QObject *parent) : + QObject(parent) +{ + m_searchPaths << "/usr/share/dde-dock/plugins/"; + + foreach (QString path, m_searchPaths) { + QDir pluginsDir(path); + + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { + QString pluginPath = pluginsDir.absoluteFilePath(fileName); + DockPluginProxy * proxy = loadPlugin(pluginPath); + m_proxies[pluginPath] = proxy; + } + } +} + +QList DockPluginManager::getAll() +{ + return m_proxies.values(); +} + +// private methods +DockPluginProxy* DockPluginManager::loadPlugin(QString &path) +{ + QPluginLoader pluginLoader(path); + QObject *plugin = pluginLoader.instance(); + + if (plugin) { + DockPluginInterface * interface = qobject_cast(plugin); + if (interface) { + DockPluginProxy *proxy = new DockPluginProxy(interface); + interface->init(proxy); + qDebug() << "Plugin loaded: " << path; + return proxy; + } else { + qWarning() << "Load plugin failed(failed to convert) " << path; + return NULL; + } + } else { + qWarning() << "Load plugin failed" << pluginLoader.errorString(); + return NULL; + } +} diff --git a/dde-dock/src/dockpluginmanager.h b/dde-dock/src/dockpluginmanager.h new file mode 100644 index 000000000..5d6f0e4e2 --- /dev/null +++ b/dde-dock/src/dockpluginmanager.h @@ -0,0 +1,24 @@ +#ifndef DOCKPLUGINMANAGER_H +#define DOCKPLUGINMANAGER_H + +#include +#include +#include + +class DockPluginProxy; +class DockPluginManager : public QObject +{ + Q_OBJECT +public: + explicit DockPluginManager(QObject *parent = 0); + + QList getAll(); + +private: + QStringList m_searchPaths; + QMap m_proxies; + + DockPluginProxy* loadPlugin(QString &path); +}; + +#endif // DOCKPLUGINMANAGER_H diff --git a/dde-dock/src/dockpluginproxy.cpp b/dde-dock/src/dockpluginproxy.cpp new file mode 100644 index 000000000..1014b835d --- /dev/null +++ b/dde-dock/src/dockpluginproxy.cpp @@ -0,0 +1,36 @@ +#include "dockpluginproxy.h" +#include "pluginitemwrapper.h" + +DockPluginProxy::DockPluginProxy(DockPluginInterface * plugin, QObject * parent) : + QObject(parent), + m_plugin(plugin) +{ +} + +void DockPluginProxy::itemAddedEvent(QString uuid) +{ + qDebug() << "Item added on plugin " << m_plugin->name(); + + AbstractDockItem * item = new PluginItemWrapper(m_plugin, uuid); + m_items << item; + + emit itemAdded(item); +} + +void DockPluginProxy::itemRemovedEvent(QString uuid) +{ + qDebug() << "Item removed on plugin " << m_plugin->name(); + + emit itemRemoved(getItem(uuid)); +} + +AbstractDockItem * DockPluginProxy::getItem(QString uuid) +{ + foreach (AbstractDockItem * item, m_items) { + PluginItemWrapper *wrapper = qobject_cast(item); + if (wrapper->uuid() == uuid) { + return item; + } + } + return NULL; +} diff --git a/dde-dock/src/dockpluginproxy.h b/dde-dock/src/dockpluginproxy.h new file mode 100644 index 000000000..c3bca2457 --- /dev/null +++ b/dde-dock/src/dockpluginproxy.h @@ -0,0 +1,28 @@ +#ifndef DOCKPLUGINPROXY_H +#define DOCKPLUGINPROXY_H + +#include "dockplugininterface.h" +#include "dockpluginproxyinterface.h" +#include "abstractdockitem.h" + +class DockPluginProxy : public QObject, public DockPluginProxyInterface +{ + Q_OBJECT +public: + DockPluginProxy(DockPluginInterface * plugin, QObject * parent = 0); + + void itemAddedEvent(QString uuid) Q_DECL_OVERRIDE; + void itemRemovedEvent(QString uuid) Q_DECL_OVERRIDE; + +signals: + void itemAdded(AbstractDockItem * item); + void itemRemoved(AbstractDockItem * item); + +private: + QList m_items; + DockPluginInterface * m_plugin; + + AbstractDockItem * getItem(QString uuid); +}; + +#endif // DOCKPLUGINPROXY_H diff --git a/dde-dock/src/dockpluginproxyinterface.h b/dde-dock/src/dockpluginproxyinterface.h new file mode 100644 index 000000000..4ace5d85f --- /dev/null +++ b/dde-dock/src/dockpluginproxyinterface.h @@ -0,0 +1,13 @@ +#ifndef DOCKPLUGINPROXYINTERFACE_H +#define DOCKPLUGINPROXYINTERFACE_H + +#include + +class DockPluginProxyInterface +{ +public: + virtual void itemAddedEvent(QString uuid) = 0; + virtual void itemRemovedEvent(QString uuid) = 0; +}; + +#endif // DOCKPLUGINPROXYINTERFACE_H diff --git a/dde-dock/src/pluginitemwrapper.cpp b/dde-dock/src/pluginitemwrapper.cpp index b8996ff9a..ada9de163 100644 --- a/dde-dock/src/pluginitemwrapper.cpp +++ b/dde-dock/src/pluginitemwrapper.cpp @@ -2,10 +2,11 @@ PluginItemWrapper::PluginItemWrapper(DockPluginInterface *plugin, QString uuid, QWidget * parent) : - AbstractDockItem(parent), - m_plugin(plugin), - m_uuid(uuid) + AbstractDockItem(parent) { + m_plugin = plugin; + m_uuid = uuid; + if (m_plugin) { QWidget * item = m_plugin->getItem(uuid); @@ -13,7 +14,12 @@ PluginItemWrapper::PluginItemWrapper(DockPluginInterface *plugin, setFixedSize(item->size()); item->setParent(this); - item->move(this->rect().center() - item->rect().center()); } } } + +QString PluginItemWrapper::uuid() const +{ + return m_uuid; +} + diff --git a/dde-dock/src/pluginitemwrapper.h b/dde-dock/src/pluginitemwrapper.h index d33f63e80..696c808fb 100644 --- a/dde-dock/src/pluginitemwrapper.h +++ b/dde-dock/src/pluginitemwrapper.h @@ -6,10 +6,13 @@ class PluginItemWrapper : public AbstractDockItem { + Q_OBJECT public: PluginItemWrapper(DockPluginInterface *plugin, QString uuid, QWidget * parent = 0); + QString uuid() const; + private: DockPluginInterface * m_plugin; QString m_uuid; diff --git a/dde-dock/src/systraymanager.cpp b/dde-dock/src/systraymanager.cpp deleted file mode 100644 index e617c2ef7..000000000 --- a/dde-dock/src/systraymanager.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include -#include - -#include "systraymanager.h" -#include "pluginitemwrapper.h" - -static QString SystrayPluginPath = "/usr/share/dde-dock/plugins/libdock-systray-plugin.so"; - -SystrayManager::SystrayManager(QObject *parent) - : QObject(parent), - m_plugin(0) -{ - this->loadPlugin(); -} - -QList SystrayManager::trayIcons() -{ - QList result; - - if (m_plugin) { - QStringList uuids = m_plugin->uuids(); - - foreach (QString uuid, uuids) { - result << new PluginItemWrapper(m_plugin, uuid); - } - } - - return result; -} - -void SystrayManager::loadPlugin() -{ - if (QFile::exists(SystrayPluginPath)) { - QPluginLoader loader(SystrayPluginPath); - QObject *plugin = loader.instance(); - if (plugin) { - m_plugin = qobject_cast(plugin); - m_plugin->init(); - } else { - qWarning() << "Failed to load systray plugin."; - qWarning() << loader.errorString(); - } - } else { - qWarning() << "libdock-systray-plugin.so file not found!"; - } -} diff --git a/dde-dock/src/systraymanager.h b/dde-dock/src/systraymanager.h deleted file mode 100644 index 318cefafd..000000000 --- a/dde-dock/src/systraymanager.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef SYSTRAYMANAGER_H -#define SYSTRAYMANAGER_H - -#include -#include "dockplugininterface.h" - -class AbstractDockItem; -class SystrayManager : public QObject -{ - Q_OBJECT -public: - explicit SystrayManager(QObject *parent = 0); - - QList trayIcons(); - -private: - DockPluginInterface *m_plugin; - - void loadPlugin(); -}; - -#endif // SYSTRAYMANAGER_H