Skip to content

Commit

Permalink
refact: using DAppletBridge to connect other applet
Browse files Browse the repository at this point in the history
  • Loading branch information
18202781743 authored and deepin-bot[bot] committed Oct 21, 2024
1 parent cc619f4 commit 67e3e1b
Show file tree
Hide file tree
Showing 11 changed files with 63 additions and 227 deletions.
32 changes: 7 additions & 25 deletions frame/dsqmlglobal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "private/dsqmlglobal_p.h"

#include "applet.h"
#include "containment.h"
#include "appletbridge.h"
#include "pluginloader.h"

#include <QLoggingCategory>
Expand Down Expand Up @@ -46,34 +46,16 @@ DQmlGlobal::~DQmlGlobal()
{
}

DApplet *DQmlGlobal::applet(const QString &pluginId) const
DAppletProxy *DQmlGlobal::applet(const QString &pluginId) const
{
D_DC(DQmlGlobal);
const auto list = appletList(pluginId);
if (!list.isEmpty())
return list.first();
return nullptr;
DAppletBridge bridge(pluginId);
return bridge.applet();
}

QList<DApplet *> DQmlGlobal::appletList(const QString &pluginId) const
QList<DAppletProxy *> DQmlGlobal::appletList(const QString &pluginId) const
{
D_DC(DQmlGlobal);
QList<DApplet *> ret;
auto root = qobject_cast<DContainment *>(rootApplet());

QQueue<DContainment *> containments;
containments.enqueue(root);
while (!containments.isEmpty()) {
DContainment *containment = containments.dequeue();
for (const auto applet : containment->applets()) {
if (auto item = qobject_cast<DContainment *>(applet)) {
containments.enqueue(item);
}
if (applet->pluginId() == pluginId)
ret << applet;
}
}
return ret;
DAppletBridge bridge(pluginId);
return bridge.applets();
}

QList<QWindow *> DQmlGlobal::allChildrenWindows(QWindow *target)
Expand Down
20 changes: 0 additions & 20 deletions frame/pluginloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -358,26 +358,6 @@ DApplet *DPluginLoader::rootApplet() const
return d->m_rootApplet.data();
}

QList<DS_NAMESPACE::DApplet *> DPluginLoader::findApplets(const QString & pluginId)
{
QList<DS_NAMESPACE::DApplet *> ret;
auto root = qobject_cast<DS_NAMESPACE::DContainment *>(rootApplet());

QQueue<DS_NAMESPACE::DContainment *> containments;
containments.enqueue(root);
while (!containments.isEmpty()) {
DS_NAMESPACE::DContainment *containment = containments.dequeue();
for (const auto applet : containment->applets()) {
if (auto item = qobject_cast<DS_NAMESPACE::DContainment *>(applet)) {
containments.enqueue(item);
}
if (applet->pluginId() == pluginId)
ret << applet;
}
}
return ret;
}

QList<DPluginMetaData> DPluginLoader::childrenPlugin(const QString &pluginId) const
{
D_DC(DPluginLoader);
Expand Down
2 changes: 0 additions & 2 deletions frame/pluginloader.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ class DS_SHARE DPluginLoader : public QObject, public DTK_CORE_NAMESPACE::DObjec
DApplet *loadApplet(const DAppletData &data);
DApplet *rootApplet() const;

QList<DS_NAMESPACE::DApplet *> findApplets(const QString & pluginId);

QList<DPluginMetaData> childrenPlugin(const QString &pluginId) const;
DPluginMetaData parentPlugin(const QString &pluginId) const;
DPluginMetaData plugin(const QString &pluginId) const;
Expand Down
5 changes: 3 additions & 2 deletions frame/private/dsqmlglobal_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ QT_END_NAMESPACE

DS_BEGIN_NAMESPACE
class DApplet;
class DAppletProxy;

class DQmlGlobalPrivate;
class DQmlGlobal : public QObject, public DTK_CORE_NAMESPACE::DObject
Expand All @@ -26,8 +27,8 @@ class DQmlGlobal : public QObject, public DTK_CORE_NAMESPACE::DObject
explicit DQmlGlobal(QObject *parent = nullptr);
~DQmlGlobal() override;

Q_INVOKABLE DApplet *applet(const QString &pluginId) const;
Q_INVOKABLE QList<DApplet *> appletList(const QString &pluginId) const;
Q_INVOKABLE DAppletProxy *applet(const QString &pluginId) const;
Q_INVOKABLE QList<DAppletProxy *> appletList(const QString &pluginId) const;
Q_INVOKABLE static void closeChildrenWindows(QWindow *target);
Q_INVOKABLE bool grabKeyboard(QWindow *target, bool grab = true);
Q_INVOKABLE bool grabMouse(QWindow *target, bool grab = true);
Expand Down
93 changes: 19 additions & 74 deletions panels/dock/dockdbusproxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,47 +11,40 @@
#include <QObject>

#include <DWindowManagerHelper>
#include <appletbridge.h>

DGUI_USE_NAMESPACE
DS_USE_NAMESPACE

namespace dock {
DockDBusProxy::DockDBusProxy(DockPanel* parent)
: QObject(parent)
, m_oldDockApplet(nullptr)
, m_clipboardApplet(nullptr)
, m_searchApplet(nullptr)
, m_multitaskviewApplet(nullptr)
, m_trayApplet(nullptr)
{
registerPluginInfoMetaType();

connect(DockSettings::instance(), &DockSettings::pluginsVisibleChanged, this, [this] (const QVariantMap &pluginsVisible) {
setPluginVisible("org.deepin.ds.dock.clipboarditem", pluginsVisible);
setPluginVisible("org.deepin.ds.dock.searchitem", pluginsVisible);
setPluginVisible("org.deepin.ds.dock.multitaskview", pluginsVisible);
});
connect(parent, &DockPanel::rootObjectChanged, this, [this]() {
auto pluginsVisible = DockSettings::instance()->pluginsVisible();
setPluginVisible("org.deepin.ds.dock.clipboarditem", pluginsVisible);
setPluginVisible("org.deepin.ds.dock.searchitem", pluginsVisible);
setPluginVisible("org.deepin.ds.dock.multitaskview", pluginsVisible);
});

// Communicate with the other module
auto getOtherApplet = [ = ] {
QList<DS_NAMESPACE::DApplet *> list = appletList("org.deepin.ds.dock.tray");
if (!list.isEmpty()) m_trayApplet = list.first();

list = appletList("org.deepin.ds.dock.clipboarditem");
if (!list.isEmpty()) m_clipboardApplet = list.first();

list = appletList("org.deepin.ds.dock.searchitem");
if (!list.isEmpty()) m_searchApplet = list.first();

list = appletList("org.deepin.ds.dock.multitaskview");
if (!list.isEmpty()) m_multitaskviewApplet = list.first();
{
DAppletBridge bridge("org.deepin.ds.dock.tray");
m_trayApplet = bridge.applet();
}
{
DAppletBridge bridge("org.deepin.ds.dock.multitaskview");
m_multitaskviewApplet = bridge.applet();
}

return m_trayApplet && m_clipboardApplet && m_searchApplet && m_multitaskviewApplet;
return m_trayApplet && m_multitaskviewApplet;
};

// TODO: DQmlGlobal maybe missing a signal which named `appletListChanged`?
Expand All @@ -78,42 +71,14 @@ QString DockDBusProxy::getAppID(const QString &desktopfile)
return desktopfile.mid(desktopfile.lastIndexOf(desktopLeft) + desktopLeft.size(), desktopfile.lastIndexOf(desktopSuffix) - desktopfile.lastIndexOf(desktopLeft) - desktopLeft.size());
}

QList<DS_NAMESPACE::DApplet *> DockDBusProxy::appletList(const QString &pluginId) const
{
QList<DS_NAMESPACE::DApplet *> ret;
auto root = qobject_cast<DS_NAMESPACE::DContainment *>(parent());

QQueue<DS_NAMESPACE::DContainment *> containments;
containments.enqueue(root);
while (!containments.isEmpty()) {
DS_NAMESPACE::DContainment *containment = containments.dequeue();
for (const auto applet : containment->applets()) {
if (auto item = qobject_cast<DS_NAMESPACE::DContainment *>(applet)) {
containments.enqueue(item);
}
if (applet->pluginId() == pluginId)
ret << applet;
}
}
return ret;
}

DS_NAMESPACE::DApplet *DockDBusProxy::applet(const QString &pluginId) const
{
const auto list = appletList(pluginId);
if (!list.isEmpty())
return list.first();
return nullptr;
}

QRect DockDBusProxy::geometry()
{
return parent()->window() ? parent()->window()->geometry() : QRect();
}

void DockDBusProxy::setPluginVisible(const QString &pluginId, const QVariantMap &pluginsVisible)
{
if (auto item = applet(pluginId)) {
if (DAppletBridge bridge(pluginId); auto item = bridge.applet()) {
DockItemInfo itemInfo;
QMetaObject::invokeMethod(item, "dockItemInfo", Qt::DirectConnection, qReturnArg(itemInfo));
QString itemKey = itemInfo.itemKey;
Expand Down Expand Up @@ -194,7 +159,8 @@ bool DockDBusProxy::RequestDock(const QString &desktopFile, int index) {
if (id.isEmpty())
return false;

auto appletItem = applet("org.deepin.ds.dock.taskmanager");
DAppletBridge bridge("org.deepin.ds.dock.taskmanager");
auto appletItem = bridge.applet();
if (nullptr == appletItem)
return false;
bool res = true;
Expand All @@ -208,7 +174,8 @@ bool DockDBusProxy::IsDocked(const QString &desktopFile)
if (id.isEmpty())
return false;

auto appletItem = applet("org.deepin.ds.dock.taskmanager");
DAppletBridge bridge("org.deepin.ds.dock.taskmanager");
auto appletItem = bridge.applet();
if (nullptr == appletItem)
return false;
bool res = true;
Expand All @@ -219,7 +186,8 @@ bool DockDBusProxy::IsDocked(const QString &desktopFile)
bool DockDBusProxy::RequestUndock(const QString &desktopFile)
{
QString id = getAppID(desktopFile);
auto appletItem = applet("org.deepin.ds.dock.taskmanager");
DAppletBridge bridge("org.deepin.ds.dock.taskmanager");
auto appletItem = bridge.applet();
if (nullptr == appletItem)
return false;
bool res = true;
Expand All @@ -240,19 +208,6 @@ DockItemInfos DockDBusProxy::plugins()
QMetaObject::invokeMethod(m_trayApplet, "dockItemInfos", Qt::DirectConnection, qReturnArg(iteminfos));
}

if (m_clipboardApplet) {
DockItemInfo info;
if (QMetaObject::invokeMethod(m_clipboardApplet, "dockItemInfo", Qt::DirectConnection, qReturnArg(info))) {
iteminfos.append(info);
}
}

if (m_searchApplet) {
DockItemInfo info;
if (QMetaObject::invokeMethod(m_searchApplet, "dockItemInfo", Qt::DirectConnection, qReturnArg(info)))
iteminfos.append(info);
}

if (m_multitaskviewApplet && DWindowManagerHelper::instance()->hasComposite()) {
DockItemInfo info;
if (QMetaObject::invokeMethod(m_multitaskviewApplet, "dockItemInfo", Qt::DirectConnection, qReturnArg(info))) {
Expand All @@ -274,17 +229,7 @@ void DockDBusProxy::callShow()

void DockDBusProxy::setItemOnDock(const QString &settingKey, const QString &itemKey, bool visible)
{
if (itemKey == "clipboard" && m_clipboardApplet) {
QMetaObject::invokeMethod(m_clipboardApplet, "setVisible", Qt::QueuedConnection, visible);
auto pluginsVisible = DockSettings::instance()->pluginsVisible();
pluginsVisible[itemKey] = visible;
DockSettings::instance()->setPluginsVisible(pluginsVisible);
} else if (itemKey == "search" && m_searchApplet) {
QMetaObject::invokeMethod(m_searchApplet, "setVisible", Qt::QueuedConnection, visible);
auto pluginsVisible = DockSettings::instance()->pluginsVisible();
pluginsVisible[itemKey] = visible;
DockSettings::instance()->setPluginsVisible(pluginsVisible);
} else if (itemKey == "multitasking-view" && m_multitaskviewApplet) {
if (itemKey == "multitasking-view" && m_multitaskviewApplet) {
QMetaObject::invokeMethod(m_multitaskviewApplet, "setVisible", Qt::QueuedConnection, visible);
auto pluginsVisible = DockSettings::instance()->pluginsVisible();
pluginsVisible[itemKey] = visible;
Expand Down
12 changes: 5 additions & 7 deletions panels/dock/dockdbusproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#include "constants.h"
#include "dockiteminfo.h"

#include <appletproxy.h>

#include <QObject>
#include <QDBusContext>
#include <QDBusArgument>
Expand Down Expand Up @@ -78,15 +80,11 @@ class DockDBusProxy final: public QObject, public QDBusContext
private:
DockPanel* parent() const;
QString getAppID(const QString &desktopfile);
QList<DS_NAMESPACE::DApplet *> appletList(const QString &pluginId) const;
DS_NAMESPACE::DApplet *applet(const QString &pluginId) const;
void setPluginVisible(const QString &pluginId, const QVariantMap &pluginsVisible);

DS_NAMESPACE::DApplet *m_oldDockApplet;
DS_NAMESPACE::DApplet *m_clipboardApplet;
DS_NAMESPACE::DApplet *m_searchApplet;
DS_NAMESPACE::DApplet *m_multitaskviewApplet;
DS_NAMESPACE::DApplet *m_trayApplet;
DS_NAMESPACE::DAppletProxy *m_oldDockApplet;
DS_NAMESPACE::DAppletProxy *m_multitaskviewApplet;
DS_NAMESPACE::DAppletProxy *m_trayApplet;
};
}

9 changes: 5 additions & 4 deletions panels/dock/taskmanager/taskmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include "globals.h"
#include "itemmodel.h"
#include "pluginfactory.h"
#include "pluginloader.h"
#include "rolecombinemodel.h"
#include "taskmanager.h"
#include "taskmanageradaptor.h"
Expand All @@ -22,6 +21,8 @@
#include <QGuiApplication>
#include <QStringLiteral>

#include <appletbridge.h>

#ifdef BUILD_WITH_X11
#include "x11windowmonitor.h"
#endif
Expand Down Expand Up @@ -80,9 +81,9 @@ bool TaskManager::init()

DApplet::init();

auto c = DS_NAMESPACE::DPluginLoader::instance()->findApplets("org.deepin.ds.dde-apps");
if (c.size() > 0) {
auto model = c.first()->property("appModel").value<QAbstractItemModel *>();
DS_NAMESPACE::DAppletBridge bridge("org.deepin.ds.dde-apps");
if (auto applet = bridge.applet()) {
auto model = applet->property("appModel").value<QAbstractItemModel *>();
m_activeAppModel =
new RoleCombineModel(m_windowMonitor.data(), model, AbstractWindow::identityRole, [](QVariant data, QAbstractItemModel *model) -> QModelIndex {
auto roleNames = model->roleNames();
Expand Down
28 changes: 4 additions & 24 deletions panels/notification/bubble/bubblepanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <QLoggingCategory>
#include <QQueue>
#include <appletbridge.h>

#include "dbaccessor.h"

Expand Down Expand Up @@ -37,16 +38,15 @@ bool BubblePanel::load()
bool BubblePanel::init()
{
DPanel::init();

auto applets = appletList("org.deepin.ds.notificationserver");
if (applets.isEmpty() || !applets.at(0)) {
DS_NAMESPACE::DAppletBridge bridge("org.deepin.ds.notificationserver");
m_notificationServer = bridge.applet();
if (!m_notificationServer) {
qCWarning(notifyLog) << "Can't get notification server object";
return false;
}

m_accessor = DBAccessor::instance();

m_notificationServer = applets.at(0);
connect(m_notificationServer, SIGNAL(notificationStateChanged(qint64, int)), this, SLOT(onNotificationStateChanged(qint64, int)));

connect(m_bubbles, &BubbleModel::rowsInserted, this, &BubblePanel::onBubbleCountChanged);
Expand Down Expand Up @@ -122,26 +122,6 @@ void BubblePanel::onBubbleCountChanged()
setVisible(!isEmpty && enabled());
}

QList<DS_NAMESPACE::DApplet *> BubblePanel::appletList(const QString &pluginId) const
{
QList<DS_NAMESPACE::DApplet *> ret;
auto root = qobject_cast<DS_NAMESPACE::DContainment *>(parent());

QQueue<DS_NAMESPACE::DContainment *> containments;
containments.enqueue(root);
while (!containments.isEmpty()) {
DS_NAMESPACE::DContainment *containment = containments.dequeue();
for (const auto applet : containment->applets()) {
if (auto item = qobject_cast<DS_NAMESPACE::DContainment *>(applet)) {
containments.enqueue(item);
}
if (applet->pluginId() == pluginId)
ret << applet;
}
}
return ret;
}

void BubblePanel::addBubble(qint64 id)
{
const auto entity = m_accessor->fetchEntity(id);
Expand Down
Loading

0 comments on commit 67e3e1b

Please sign in to comment.