new plugin interface, proxy, plugin manager etc.

This commit is contained in:
Hualet Wang 2015-07-03 14:00:10 +08:00
parent 8efd47bf3b
commit f9a0aacfa4
16 changed files with 227 additions and 101 deletions

View File

@ -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;
}

View File

@ -1,28 +1,30 @@
#include <QtDBus/QDBusConnection>
#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<uint> 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);
}

View File

@ -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<QString, QWidget*> 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

View File

@ -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 \

View File

@ -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<DockPluginProxy*> 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()
{

View File

@ -49,7 +49,6 @@ private:
void hideMenu();
void initAppManager();
void initSystrayManager();
private:
DockLayout * leftLayout;
DockLayout *rightLayout;

View File

@ -4,13 +4,18 @@
#include <QObject>
#include <QStringList>
#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

View File

@ -0,0 +1,50 @@
#include <QDir>
#include <QPluginLoader>
#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<DockPluginProxy*> 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<DockPluginInterface*>(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;
}
}

View File

@ -0,0 +1,24 @@
#ifndef DOCKPLUGINMANAGER_H
#define DOCKPLUGINMANAGER_H
#include <QObject>
#include <QMap>
#include <qstringlist.h>
class DockPluginProxy;
class DockPluginManager : public QObject
{
Q_OBJECT
public:
explicit DockPluginManager(QObject *parent = 0);
QList<DockPluginProxy*> getAll();
private:
QStringList m_searchPaths;
QMap<QString, DockPluginProxy*> m_proxies;
DockPluginProxy* loadPlugin(QString &path);
};
#endif // DOCKPLUGINMANAGER_H

View File

@ -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<PluginItemWrapper*>(item);
if (wrapper->uuid() == uuid) {
return item;
}
}
return NULL;
}

View File

@ -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<AbstractDockItem*> m_items;
DockPluginInterface * m_plugin;
AbstractDockItem * getItem(QString uuid);
};
#endif // DOCKPLUGINPROXY_H

View File

@ -0,0 +1,13 @@
#ifndef DOCKPLUGINPROXYINTERFACE_H
#define DOCKPLUGINPROXYINTERFACE_H
#include <QString>
class DockPluginProxyInterface
{
public:
virtual void itemAddedEvent(QString uuid) = 0;
virtual void itemRemovedEvent(QString uuid) = 0;
};
#endif // DOCKPLUGINPROXYINTERFACE_H

View File

@ -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;
}

View File

@ -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;

View File

@ -1,47 +0,0 @@
#include <QDir>
#include <QPluginLoader>
#include <QDebug>
#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<AbstractDockItem*> SystrayManager::trayIcons()
{
QList<AbstractDockItem*> 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<DockPluginInterface*>(plugin);
m_plugin->init();
} else {
qWarning() << "Failed to load systray plugin.";
qWarning() << loader.errorString();
}
} else {
qWarning() << "libdock-systray-plugin.so file not found!";
}
}

View File

@ -1,22 +0,0 @@
#ifndef SYSTRAYMANAGER_H
#define SYSTRAYMANAGER_H
#include <QObject>
#include "dockplugininterface.h"
class AbstractDockItem;
class SystrayManager : public QObject
{
Q_OBJECT
public:
explicit SystrayManager(QObject *parent = 0);
QList<AbstractDockItem*> trayIcons();
private:
DockPluginInterface *m_plugin;
void loadPlugin();
};
#endif // SYSTRAYMANAGER_H