66#include " dsglobal.h"
77#include " constants.h"
88#include " dockpanel.h"
9+ #include " ddockapplet.h"
910#include " dockdbusproxy.h"
1011
1112#include < QObject>
1213
1314#include < DWindowManagerHelper>
15+ #include < DDciIcon>
1416
1517DGUI_USE_NAMESPACE
1618
1719namespace dock {
1820DockDBusProxy::DockDBusProxy (DockPanel* parent)
1921 : QObject(parent)
2022 , m_oldDockApplet(nullptr )
21- , m_clipboardApplet(nullptr )
22- , m_searchApplet(nullptr )
23- , m_multitaskviewApplet(nullptr )
2423{
2524 registerPluginInfoMetaType ();
2625
2726 connect (DockSettings::instance (), &DockSettings::pluginsVisibleChanged, this , [this ] (const QVariantMap &pluginsVisible) {
28- setPluginVisible (" org.deepin.ds.dock.clipboarditem" , pluginsVisible);
29- setPluginVisible (" org.deepin.ds.dock.searchitem" , pluginsVisible);
30- setPluginVisible (" org.deepin.ds.dock.multitaskview" , pluginsVisible);
27+ for (auto applet : m_dockApplets) {
28+ QString itemKey = applet->itemKey ();
29+ if (pluginsVisible.contains (itemKey)) {
30+ applet->setVisible (pluginsVisible[itemKey].toBool ());
31+ } else {
32+ auto settingPluginsVisible = DockSettings::instance ()->pluginsVisible ();
33+ settingPluginsVisible[itemKey] = true ;
34+ DockSettings::instance ()->setPluginsVisible (settingPluginsVisible);
35+ }
36+ }
3137 });
3238 connect (parent, &DockPanel::rootObjectChanged, this , [this ]() {
3339 auto pluginsVisible = DockSettings::instance ()->pluginsVisible ();
34- setPluginVisible (" org.deepin.ds.dock.clipboarditem" , pluginsVisible);
35- setPluginVisible (" org.deepin.ds.dock.searchitem" , pluginsVisible);
36- setPluginVisible (" org.deepin.ds.dock.multitaskview" , pluginsVisible);
40+ for (auto applet : m_dockApplets) {
41+ QString itemKey = applet->itemKey ();
42+ if (pluginsVisible.contains (itemKey)) {
43+ applet->setVisible (pluginsVisible[itemKey].toBool ());
44+ } else {
45+ auto settingPluginsVisible = DockSettings::instance ()->pluginsVisible ();
46+ settingPluginsVisible[itemKey] = true ;
47+ DockSettings::instance ()->setPluginsVisible (settingPluginsVisible);
48+ }
49+ }
3750 });
3851
3952 auto root = qobject_cast<DS_NAMESPACE::DContainment *>(this ->parent ());
@@ -88,12 +101,15 @@ QRect DockDBusProxy::geometry()
88101
89102void DockDBusProxy::setPluginVisible (const QString &pluginId, const QVariantMap &pluginsVisible)
90103{
91- if (auto item = applet (pluginId)) {
92- DockItemInfo itemInfo;
93- QMetaObject::invokeMethod (item, " dockItemInfo" , Qt::DirectConnection, qReturnArg (itemInfo));
94- QString itemKey = itemInfo.itemKey ;
104+ auto it = std::find_if (m_dockApplets.begin (), m_dockApplets.end (), [ = ] (DS_NAMESPACE::DDockApplet *applet) {
105+ return pluginId == applet->pluginId ();
106+ });
107+
108+ if (it != m_dockApplets.end ()) {
109+ auto applet = (*it);
110+ const auto &itemKey = applet->itemKey ();
95111 if (pluginsVisible.contains (itemKey)) {
96- QMetaObject::invokeMethod (item, " setVisible" , Qt::QueuedConnection, pluginsVisible[itemKey].toBool ());
112+ applet-> setVisible ( pluginsVisible[itemKey].toBool ());
97113 } else {
98114 auto settingPluginsVisible = DockSettings::instance ()->pluginsVisible ();
99115 settingPluginsVisible[itemKey] = true ;
@@ -204,18 +220,27 @@ bool DockDBusProxy::RequestUndock(const QString &desktopFile)
204220
205221void DockDBusProxy::onAppletListChanged ()
206222{
207- // Communicate with the other module
223+ // for old dock
208224 QList<DS_NAMESPACE::DApplet *> list = appletList (" org.deepin.ds.dock.tray" );
209225 if (!m_oldDockApplet && !list.isEmpty ()) m_oldDockApplet = list.first ();
210226
211- list = appletList (" org.deepin.ds.dock.clipboarditem" );
212- if (!m_clipboardApplet && !list.isEmpty ()) m_clipboardApplet = list.first ();
213-
214- list = appletList (" org.deepin.ds.dock.searchitem" );
215- if (!m_searchApplet && !list.isEmpty ()) m_searchApplet = list.first ();
227+ // other dock plugin
228+ m_dockApplets.clear ();
229+ auto root = qobject_cast<DS_NAMESPACE::DContainment *>(parent ());
216230
217- list = appletList (" org.deepin.ds.dock.multitaskview" );
218- if (!m_multitaskviewApplet && !list.isEmpty ()) m_multitaskviewApplet = list.first ();
231+ QQueue<DS_NAMESPACE::DContainment *> containments;
232+ containments.enqueue (root);
233+ while (!containments.isEmpty ()) {
234+ DS_NAMESPACE::DContainment *containment = containments.dequeue ();
235+ for (const auto applet : containment->applets ()) {
236+ if (auto item = qobject_cast<DS_NAMESPACE::DContainment *>(applet)) {
237+ containments.enqueue (item);
238+ }
239+ if (auto dockApplet = qobject_cast<DS_NAMESPACE::DDockApplet *>(applet)) {
240+ m_dockApplets << dockApplet;
241+ }
242+ }
243+ }
219244}
220245
221246QStringList DockDBusProxy::GetLoadedPlugins ()
@@ -231,25 +256,46 @@ DockItemInfos DockDBusProxy::plugins()
231256 QMetaObject::invokeMethod (m_oldDockApplet, " plugins" , Qt::DirectConnection, qReturnArg (iteminfos));
232257 }
233258
234- if (m_clipboardApplet ) {
259+ for ( auto applet : m_dockApplets ) {
235260 DockItemInfo info;
236- if (QMetaObject::invokeMethod (m_clipboardApplet, " dockItemInfo" , Qt::DirectConnection, qReturnArg (info))) {
237- iteminfos.append (info);
261+ info.name = applet->name ();
262+ info.displayName = applet->displayName ();
263+ info.itemKey = applet->itemKey ();
264+ info.settingKey = applet->settingKey ();
265+ info.visible = applet->visible ();
266+
267+ {
268+ const auto lightPalette = DGuiApplicationHelper::instance ()->applicationPalette (DGuiApplicationHelper::LightType);
269+ auto lightPixmap = DDciIcon::fromTheme (applet->icon ()).pixmap (
270+ qApp->devicePixelRatio (),
271+ 30 ,
272+ DDciIcon::Light,
273+ DDciIcon::Normal,
274+ DDciIconPalette::fromQPalette (lightPalette)
275+ );
276+ QBuffer buffer (&info.iconLight );
277+ if (buffer.open (QIODevice::WriteOnly)) {
278+ lightPixmap.save (&buffer, " png" );
279+ }
280+ }
281+ {
282+ const auto darkPalette = DGuiApplicationHelper::instance ()->applicationPalette (DGuiApplicationHelper::DarkType);
283+ auto darkPixmap = DDciIcon::fromTheme (" search" ).pixmap (
284+ qApp->devicePixelRatio (),
285+ 30 ,
286+ DDciIcon::Dark,
287+ DDciIcon::Normal,
288+ DDciIconPalette::fromQPalette (darkPalette)
289+ );
290+ QBuffer buffer (&info.iconDark );
291+ if (buffer.open (QIODevice::WriteOnly)) {
292+ darkPixmap.save (&buffer, " png" );
293+ }
238294 }
239- }
240295
241- if (m_searchApplet) {
242- DockItemInfo info;
243- if (QMetaObject::invokeMethod (m_searchApplet, " dockItemInfo" , Qt::DirectConnection, qReturnArg (info)))
244- iteminfos.append (info);
296+ iteminfos.append (info);
245297 }
246298
247- if (m_multitaskviewApplet && DWindowManagerHelper::instance ()->hasComposite ()) {
248- DockItemInfo info;
249- if (QMetaObject::invokeMethod (m_multitaskviewApplet, " dockItemInfo" , Qt::DirectConnection, qReturnArg (info))) {
250- iteminfos.append (info);
251- }
252- }
253299 return iteminfos;
254300}
255301
@@ -265,23 +311,16 @@ void DockDBusProxy::callShow()
265311
266312void DockDBusProxy::setItemOnDock (const QString &settingKey, const QString &itemKey, bool visible)
267313{
268- if (itemKey == " clipboard" && m_clipboardApplet) {
269- QMetaObject::invokeMethod (m_clipboardApplet, " setVisible" , Qt::QueuedConnection, visible);
270- auto pluginsVisible = DockSettings::instance ()->pluginsVisible ();
271- pluginsVisible[itemKey] = visible;
272- DockSettings::instance ()->setPluginsVisible (pluginsVisible);
273- } else if (itemKey == " search" && m_searchApplet) {
274- QMetaObject::invokeMethod (m_searchApplet, " setVisible" , Qt::QueuedConnection, visible);
275- auto pluginsVisible = DockSettings::instance ()->pluginsVisible ();
276- pluginsVisible[itemKey] = visible;
277- DockSettings::instance ()->setPluginsVisible (pluginsVisible);
278- } else if (itemKey == " multitasking-view" && m_multitaskviewApplet) {
279- QMetaObject::invokeMethod (m_multitaskviewApplet, " setVisible" , Qt::QueuedConnection, visible);
314+ auto it = std::find_if (m_dockApplets.begin (), m_dockApplets.end (), [ = ] (DS_NAMESPACE::DDockApplet *applet) {
315+ return itemKey == applet->itemKey ();
316+ });
317+
318+ if (it != m_dockApplets.end ()) {
319+ auto applet = (*it);
320+ applet->setVisible (visible);
280321 auto pluginsVisible = DockSettings::instance ()->pluginsVisible ();
281322 pluginsVisible[itemKey] = visible;
282323 DockSettings::instance ()->setPluginsVisible (pluginsVisible);
283- } else if (m_oldDockApplet) {
284- QMetaObject::invokeMethod (m_oldDockApplet, " setItemOnDock" , Qt::QueuedConnection, settingKey, itemKey, visible);
285324 }
286325}
287326
0 commit comments