diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 9021bc8c5..0a4717869 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -162,7 +162,8 @@ QList QuickSettingController::pluginInSettings() PluginAttribute pluginAttr = pluginAttribute(plugin); if (pluginAttr == QuickSettingController::PluginAttribute::Quick || pluginAttr == QuickSettingController::PluginAttribute::System - || pluginAttr == QuickSettingController::PluginAttribute::Tool) + || pluginAttr == QuickSettingController::PluginAttribute::Tool + || pluginAttr == QuickSettingController::PluginAttribute::Tray) settingPlugins << plugin; } diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index 8cca73401..e45e87c2e 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -26,10 +26,46 @@ #include "proxyplugincontroller.h" #include "quicksettingcontroller.h" #include "pluginsitem.h" +#include "settingconfig.h" #include #include #include +#include + +const QSize defaultIconSize = QSize(20, 20); + +QDebug operator<<(QDebug argument, const DockItemInfo &info) +{ + argument << "name:" << info.name << ", displayName:" << info.displayName + << "itemKey:" << info.itemKey << "SettingKey:" << info.settingKey + << "icon:" << info.icon << "visible:" << info.visible; + return argument; +} + +QDBusArgument &operator<<(QDBusArgument &arg, const DockItemInfo &info) +{ + arg.beginStructure(); + arg << info.name << info.displayName << info.itemKey << info.settingKey << info.icon << info.visible; + arg.endStructure(); + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, DockItemInfo &info) +{ + arg.beginStructure(); + arg >> info.name >> info.displayName >> info.itemKey >> info.settingKey >> info.icon >> info.visible; + arg.endStructure(); + return arg; +} + +void registerPluginInfoMetaType() +{ + qRegisterMetaType("DockItemInfo"); + qDBusRegisterMetaType(); + qRegisterMetaType("DockItemInfos"); + qDBusRegisterMetaType(); +} DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) : QDBusAbstractAdaptor(parent) @@ -48,7 +84,7 @@ DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) }); } - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); connect(DockItemManager::instance(), &DockItemManager::itemInserted, this, [ = ] (const int index, DockItem *item) { Q_UNUSED(index); if (item->itemType() == DockItem::Plugins @@ -73,6 +109,8 @@ DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) } } }); + + registerPluginInfoMetaType(); } DBusDockAdaptors::~DBusDockAdaptors() @@ -101,7 +139,7 @@ void DBusDockAdaptors::ReloadPlugins() QStringList DBusDockAdaptors::GetLoadedPlugins() { - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); QStringList nameList; QMap map; for (auto plugin : allPlugin) { @@ -128,6 +166,34 @@ QStringList DBusDockAdaptors::GetLoadedPlugins() return newList; } +DockItemInfos DBusDockAdaptors::plugins() +{ + // 获取本地加载的插件 + QList allPlugin = localPlugins(); + DockItemInfos pluginInfos; + QStringList quickSettingKeys = SETTINGCONFIG->value("Dock_Quick_Plugin_Name").toStringList(); + for (PluginsItemInterface *plugin : allPlugin) { + DockItemInfo info; + info.name = plugin->pluginName(); + info.displayName = plugin->pluginDisplayName(); + info.itemKey = plugin->pluginName(); + info.settingKey = "Dock_Quick_Plugin_Name"; + info.visible = quickSettingKeys.contains(info.itemKey); + QSize pixmapSize; + QIcon icon = getSettingIcon(plugin, pixmapSize); + if (!icon.isNull()) { + QBuffer buffer(&info.icon); + if (buffer.open(QIODevice::WriteOnly)) { + QPixmap pixmap = icon.pixmap(pixmapSize); + pixmap.save(&buffer, "bmp"); + } + } + pluginInfos << info; + } + + return pluginInfos; +} + void DBusDockAdaptors::resizeDock(int offset, bool dragging) { m_windowManager->resizeDock(offset, dragging); @@ -136,7 +202,7 @@ void DBusDockAdaptors::resizeDock(int offset, bool dragging) // 返回每个插件的识别Key(所以此值应始终不变),供个性化插件根据key去匹配每个插件对应的图标 QString DBusDockAdaptors::getPluginKey(const QString &pluginName) { - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); for (auto plugin : allPlugin) { if (plugin->pluginDisplayName() == pluginName) return plugin->pluginName(); @@ -147,7 +213,7 @@ QString DBusDockAdaptors::getPluginKey(const QString &pluginName) bool DBusDockAdaptors::getPluginVisible(const QString &pluginName) { - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); for (auto *p : allPlugin) { if (!p->pluginIsAllowDisable()) continue; @@ -169,7 +235,7 @@ bool DBusDockAdaptors::getPluginVisible(const QString &pluginName) void DBusDockAdaptors::setPluginVisible(const QString &pluginName, bool visible) { - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); for (auto *p : allPlugin) { if (!p->pluginIsAllowDisable()) continue; @@ -192,6 +258,17 @@ void DBusDockAdaptors::setPluginVisible(const QString &pluginName, bool visible) qInfo() << "Unable to set information for this plugin"; } +void DBusDockAdaptors::setItemOnDock(const QString settingKey, const QString &itemKey, bool visible) +{ + QStringList settings = SETTINGCONFIG->value(settingKey).toStringList(); + if (visible && !settings.contains(itemKey)) + settings << itemKey; + else if (!visible && settings.contains(itemKey)) + settings.removeOne(itemKey); + + SETTINGCONFIG->setValue(settingKey, settings); +} + QRect DBusDockAdaptors::geometry() const { return m_windowManager->geometry(); @@ -229,7 +306,56 @@ bool DBusDockAdaptors::isPluginValid(const QString &name) return true; } -QList DBusDockAdaptors::plugins() const +QList DBusDockAdaptors::localPlugins() const { return QuickSettingController::instance()->pluginInSettings(); } + +QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const +{ + auto iconSize = [](const QIcon &icon) { + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + return iconSizes[0]; + + return defaultIconSize; + }; + // 先获取控制中心的设置图标 + QIcon icon = plugin->icon(DockPart::DCCSetting); + if (!icon.isNull()) { + pixmapSize = iconSize(icon); + return icon; + } + + // 如果插件中没有设置图标,则根据插件的类型,获取其他的图标 + QuickSettingController::PluginAttribute pluginAttr = QuickSettingController::instance()->pluginAttribute(plugin); + switch(pluginAttr) { + case QuickSettingController::PluginAttribute::System: { + icon = plugin->icon(DockPart::SystemPanel); + pixmapSize = defaultIconSize; + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + pixmapSize = iconSizes[0]; + break; + } + case QuickSettingController::PluginAttribute::Quick: { + icon = plugin->icon(DockPart::QuickShow); + if (icon.isNull()) + icon = plugin->icon(DockPart::QuickPanel); + pixmapSize = defaultIconSize; + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + pixmapSize = iconSizes[0]; + break; + } + default: + break; + } + + if (icon.isNull()) { + icon = QIcon(":/icons/resources/dcc_dock_plug_in.svg"); + pixmapSize = QSize(20, 20); + } + + return icon; +} diff --git a/frame/dbus/dbusdockadaptors.h b/frame/dbus/dbusdockadaptors.h index d3188235a..1cb2faf91 100644 --- a/frame/dbus/dbusdockadaptors.h +++ b/frame/dbus/dbusdockadaptors.h @@ -22,10 +22,11 @@ #ifndef DBUSDOCKADAPTORS_H #define DBUSDOCKADAPTORS_H -#include - #include "mainwindow.h" +#include +#include + /* * Adaptor class for interface com.deepin.dde.Dock */ @@ -33,6 +34,28 @@ class QGSettings; class WindowManager; class PluginsItemInterface; +struct DockItemInfo +{ + QString name; + QString displayName; + QString itemKey; + QString settingKey; + QByteArray icon; + bool visible; +}; + +QDebug operator<<(QDebug argument, const DockItemInfo &info); +QDBusArgument &operator<<(QDBusArgument &arg, const DockItemInfo &info); +const QDBusArgument &operator>>(const QDBusArgument &arg, DockItemInfo &info); + +Q_DECLARE_METATYPE(DockItemInfo) + +typedef QList DockItemInfos; + +Q_DECLARE_METATYPE(DockItemInfos) + +void registerPluginInfoMetaType(); + class DBusDockAdaptors: public QDBusAbstractAdaptor { Q_OBJECT @@ -46,6 +69,10 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor " " " " " " + " >" + " " + " \n" + " " " " " " " " @@ -62,6 +89,10 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor " " " " " " + " " + " " + " " + " " " " " " " " @@ -80,6 +111,7 @@ public Q_SLOTS: // METHODS void ReloadPlugins(); QStringList GetLoadedPlugins(); + DockItemInfos plugins(); void resizeDock(int offset, bool dragging); @@ -87,6 +119,7 @@ public Q_SLOTS: // METHODS bool getPluginVisible(const QString &pluginName); void setPluginVisible(const QString &pluginName, bool visible); + void setItemOnDock(const QString settingKey, const QString &itemKey, bool visible); public: // PROPERTIES QRect geometry() const; @@ -101,7 +134,8 @@ signals: private: bool isPluginValid(const QString &name); - QList plugins() const; + QList localPlugins() const; + QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const; private: QGSettings *m_gsettings; diff --git a/frame/item/item.qrc b/frame/item/item.qrc index b53265823..789855e93 100644 --- a/frame/item/item.qrc +++ b/frame/item/item.qrc @@ -89,5 +89,6 @@ resources/ICON_Device_Headphone.svg resources/ICON_Device_Laptop_dark.svg resources/ICON_Device_Laptop.svg + resources/dcc_dock_plug_in.svg diff --git a/frame/item/resources/dcc_dock_plug_in.svg b/frame/item/resources/dcc_dock_plug_in.svg new file mode 100644 index 000000000..5ab6bf7fd --- /dev/null +++ b/frame/item/resources/dcc_dock_plug_in.svg @@ -0,0 +1,7 @@ + + + icon/dock/plug-in2 + + + + \ No newline at end of file diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 0e148d599..be7cd0a51 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -29,9 +29,10 @@ // 任务栏的部件位置 enum class DockPart { - QuickShow = 0, // 快捷插件显示区域 - QuickPanel, // 快捷面板区域 - SystemPanel // 系统插件显示区域 + QuickShow = 0, // 快捷插件显示区域 + QuickPanel, // 快捷面板区域 + SystemPanel, // 系统插件显示区域 + DCCSetting // 显示在控制中心个性化设置的图标 }; // 快捷面板详情页面的itemWidget对应的itemKey