mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-03 00:15:21 +00:00
new plugin interface, proxy, plugin manager etc.
This commit is contained in:
parent
8efd47bf3b
commit
f9a0aacfa4
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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()
|
||||
{
|
||||
|
||||
|
@ -49,7 +49,6 @@ private:
|
||||
void hideMenu();
|
||||
|
||||
void initAppManager();
|
||||
void initSystrayManager();
|
||||
private:
|
||||
DockLayout * leftLayout;
|
||||
DockLayout *rightLayout;
|
||||
|
@ -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
|
||||
|
50
dde-dock/src/dockpluginmanager.cpp
Normal file
50
dde-dock/src/dockpluginmanager.cpp
Normal 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;
|
||||
}
|
||||
}
|
24
dde-dock/src/dockpluginmanager.h
Normal file
24
dde-dock/src/dockpluginmanager.h
Normal 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
|
36
dde-dock/src/dockpluginproxy.cpp
Normal file
36
dde-dock/src/dockpluginproxy.cpp
Normal 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;
|
||||
}
|
28
dde-dock/src/dockpluginproxy.h
Normal file
28
dde-dock/src/dockpluginproxy.h
Normal 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
|
13
dde-dock/src/dockpluginproxyinterface.h
Normal file
13
dde-dock/src/dockpluginproxyinterface.h
Normal 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
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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!";
|
||||
}
|
||||
}
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user