feat: 增加返回给控制中心设置插件和托盘应用的接口

增加plugins接口,用于给控制中心提供在任务栏上显示的插件或托盘区域,提供setItemOnDock接口,用于在控制中心设置哪些项在任务栏上面显示

Log: 给控制中心提供任务栏插件和托盘显示的接口
Influence: 无
Task: https://pms.uniontech.com/task-view-216841.html
Change-Id: Id6abde586915e5827188156222804914a9edf7c9
This commit is contained in:
donghualin 2022-11-18 03:19:58 +00:00
parent e98f1df2f5
commit e6a73fe3c3
6 changed files with 183 additions and 13 deletions

View File

@ -162,7 +162,8 @@ QList<PluginsItemInterface *> 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;
}

View File

@ -26,10 +26,46 @@
#include "proxyplugincontroller.h"
#include "quicksettingcontroller.h"
#include "pluginsitem.h"
#include "settingconfig.h"
#include <QScreen>
#include <QDebug>
#include <QGSettings>
#include <QDBusMetaType>
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>("DockItemInfo");
qDBusRegisterMetaType<DockItemInfo>();
qRegisterMetaType<DockItemInfos>("DockItemInfos");
qDBusRegisterMetaType<DockItemInfos>();
}
DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent)
: QDBusAbstractAdaptor(parent)
@ -48,7 +84,7 @@ DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent)
});
}
QList<PluginsItemInterface *> allPlugin = plugins();
QList<PluginsItemInterface *> 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<PluginsItemInterface *> allPlugin = plugins();
QList<PluginsItemInterface *> allPlugin = localPlugins();
QStringList nameList;
QMap<QString, QString> map;
for (auto plugin : allPlugin) {
@ -128,6 +166,34 @@ QStringList DBusDockAdaptors::GetLoadedPlugins()
return newList;
}
DockItemInfos DBusDockAdaptors::plugins()
{
// 获取本地加载的插件
QList<PluginsItemInterface *> 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<PluginsItemInterface *> allPlugin = plugins();
QList<PluginsItemInterface *> 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<PluginsItemInterface *> allPlugin = plugins();
QList<PluginsItemInterface *> 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<PluginsItemInterface *> allPlugin = plugins();
QList<PluginsItemInterface *> 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<PluginsItemInterface *> DBusDockAdaptors::plugins() const
QList<PluginsItemInterface *> DBusDockAdaptors::localPlugins() const
{
return QuickSettingController::instance()->pluginInSettings();
}
QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const
{
auto iconSize = [](const QIcon &icon) {
QList<QSize> 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<QSize> 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<QSize> 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;
}

View File

@ -22,10 +22,11 @@
#ifndef DBUSDOCKADAPTORS_H
#define DBUSDOCKADAPTORS_H
#include <QtDBus/QtDBus>
#include "mainwindow.h"
#include <QtDBus/QtDBus>
#include <QDBusArgument>
/*
* 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<DockItemInfo> DockItemInfos;
Q_DECLARE_METATYPE(DockItemInfos)
void registerPluginInfoMetaType();
class DBusDockAdaptors: public QDBusAbstractAdaptor
{
Q_OBJECT
@ -46,6 +69,10 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor
" <method name=\"GetLoadedPlugins\">"
" <arg name=\"list\" type=\"as\" direction=\"out\"/>"
" </method>"
" <method name=\"plugins\">>"
" <arg type=\"a(sssssb)\" direction=\"out\"/>"
" <annotation value=\"PluginInfos\" name=\"org.qtproject.QtDBus.QtTypeName.Out0\"/>\n"
" </method>"
" <method name=\"resizeDock\">"
" <arg name=\"offset\" type=\"i\" direction=\"in\"/>"
" <arg name=\"dragging\" type=\"b\" direction=\"in\"/>"
@ -62,6 +89,10 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor
" <arg name=\"pluginName\" type=\"s\" direction=\"in\"/>"
" <arg name=\"visible\" type=\"b\" direction=\"in\"/>"
" </method>"
" <method name=\"setItemOnDock\">"
" <arg name=\"itemKey\" type=\"s\" direction=\"in\"/>"
" <arg name=\"visible\" type=\"b\" direction=\"in\"/>"
" </method>"
" <signal name=\"pluginVisibleChanged\">"
" <arg type=\"s\"/>"
" <arg type=\"b\"/>"
@ -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<PluginsItemInterface *> plugins() const;
QList<PluginsItemInterface *> localPlugins() const;
QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const;
private:
QGSettings *m_gsettings;

View File

@ -89,5 +89,6 @@
<file>resources/ICON_Device_Headphone.svg</file>
<file>resources/ICON_Device_Laptop_dark.svg</file>
<file>resources/ICON_Device_Laptop.svg</file>
<file>resources/dcc_dock_plug_in.svg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>icon/dock/plug-in2</title>
<g id="icon/dock/plug-in2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M7.5,1 C8.6045695,1 9.5,1.8954305 9.5,3 C9.5,3.364732 9.4023677,3.70666076 9.23181186,4.0010775 L12,4 C12.5522847,4 13,4.44771525 13,5 L12.9996679,7.26775657 C13.2939163,7.09746762 13.6355757,7 14,7 C15.1045695,7 16,7.8954305 16,9 C16,10.1045695 15.1045695,11 14,11 C13.6355757,11 13.2939163,10.9025324 12.9996679,10.7322434 L13,13 C13,13.5522847 12.5522847,14 12,14 L3,14 C2.44771525,14 2,13.5522847 2,13 L1.99858626,10.5809198 C2.22625932,10.6893264 2.48104412,10.75 2.75,10.75 C3.71649831,10.75 4.5,9.96649831 4.5,9 C4.5,8.03350169 3.71649831,7.25 2.75,7.25 C2.48104412,7.25 2.22625932,7.31067361 1.99858626,7.41908017 L2,5 C2,4.44771525 2.44771525,4 3,4 L5.76818814,4.0010775 C5.5976323,3.70666076 5.5,3.364732 5.5,3 C5.5,1.8954305 6.3954305,1 7.5,1 Z" id="形状结合" fill="#536076"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -29,9 +29,10 @@
// 任务栏的部件位置
enum class DockPart {
QuickShow = 0, // 快捷插件显示区域
QuickPanel, // 快捷面板区域
SystemPanel // 系统插件显示区域
QuickShow = 0, // 快捷插件显示区域
QuickPanel, // 快捷面板区域
SystemPanel, // 系统插件显示区域
DCCSetting // 显示在控制中心个性化设置的图标
};
// 快捷面板详情页面的itemWidget对应的itemKey