fix: 增加对控制中心设置不同主题下图标的接口

1、任务栏插件接口中增加根据主题来获取不同图标的接口
2、声音、蓝牙、电源、虚拟键盘、回收站等插件完善控制中心的接口
3、任务栏图标的显示根据不同的主题来获取

Log: 完善对控制中心设置不同主题的接口
Influence: 在控制中心切换主题,观察图标是否发生变化
Bug: https://pms.uniontech.com/bug-view-172365.html
Change-Id: Ia02193c9ebcf10559195c6fb8fe6227f581e165b
This commit is contained in:
donghualin 2022-11-23 05:27:16 +00:00 committed by songwentao
parent c27b9788dc
commit a41df224f6
23 changed files with 153 additions and 22 deletions

View File

@ -156,14 +156,15 @@ QList<PluginsItemInterface *> QuickSettingController::pluginInSettings()
{
QList<PluginsItemInterface *> settingPlugins;
// 用于在控制中心显示可改变位置的插件,这里只提供
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &plugins = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginsMap();
QList<PluginsItemInterface *> allPlugins = plugins.keys();
QList<PluginsItemInterface *> allPlugins = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginCurrent();
for (PluginsItemInterface *plugin : allPlugins) {
if (plugin->pluginDisplayName().isEmpty())
continue;
PluginAttribute pluginAttr = pluginAttribute(plugin);
if (pluginAttr == QuickSettingController::PluginAttribute::Quick
|| pluginAttr == QuickSettingController::PluginAttribute::System
|| pluginAttr == QuickSettingController::PluginAttribute::Tool
|| pluginAttr == QuickSettingController::PluginAttribute::Tray)
|| pluginAttr == QuickSettingController::PluginAttribute::Tool)
settingPlugins << plugin;
}

View File

@ -28,6 +28,8 @@
#include "pluginsitem.h"
#include "settingconfig.h"
#include <DGuiApplicationHelper>
#include <QScreen>
#include <QDebug>
#include <QGSettings>
@ -39,14 +41,14 @@ 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;
<< "icon_light:" << info.iconLight << "icon_dark:" << info.iconDark << "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 << info.name << info.displayName << info.itemKey << info.settingKey << info.iconLight << info.iconDark << info.visible;
arg.endStructure();
return arg;
}
@ -54,7 +56,7 @@ QDBusArgument &operator<<(QDBusArgument &arg, const DockItemInfo &info)
const QDBusArgument &operator>>(const QDBusArgument &arg, DockItemInfo &info)
{
arg.beginStructure();
arg >> info.name >> info.displayName >> info.itemKey >> info.settingKey >> info.icon >> info.visible;
arg >> info.name >> info.displayName >> info.itemKey >> info.settingKey >> info.iconLight >> info.iconDark >> info.visible;
arg.endStructure();
return arg;
}
@ -180,12 +182,20 @@ DockItemInfos DBusDockAdaptors::plugins()
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);
QIcon lightIcon = getSettingIcon(plugin, pixmapSize, DGuiApplicationHelper::ColorType::LightType);
if (!lightIcon.isNull()) {
QBuffer buffer(&info.iconLight);
if (buffer.open(QIODevice::WriteOnly)) {
QPixmap pixmap = icon.pixmap(pixmapSize);
pixmap.save(&buffer, "bmp");
QPixmap pixmap = lightIcon.pixmap(pixmapSize);
pixmap.save(&buffer, "png");
}
}
QIcon darkIcon = getSettingIcon(plugin, pixmapSize, DGuiApplicationHelper::ColorType::DarkType);
if (!darkIcon.isNull()) {
QBuffer buffer(&info.iconDark);
if (buffer.open(QIODevice::WriteOnly)) {
QPixmap pixmap = darkIcon.pixmap(pixmapSize);
pixmap.save(&buffer, "png");
}
}
pluginInfos << info;
@ -311,7 +321,7 @@ QList<PluginsItemInterface *> DBusDockAdaptors::localPlugins() const
return QuickSettingController::instance()->pluginInSettings();
}
QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const
QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize, int colorType) const
{
auto iconSize = [](const QIcon &icon) {
QList<QSize> iconSizes = icon.availableSizes();
@ -321,7 +331,7 @@ QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixm
return defaultIconSize;
};
// 先获取控制中心的设置图标
QIcon icon = plugin->icon(DockPart::DCCSetting);
QIcon icon = plugin->icon(DockPart::DCCSetting, colorType);
if (!icon.isNull()) {
pixmapSize = iconSize(icon);
return icon;
@ -331,7 +341,7 @@ QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixm
QuickSettingController::PluginAttribute pluginAttr = QuickSettingController::instance()->pluginAttribute(plugin);
switch(pluginAttr) {
case QuickSettingController::PluginAttribute::System: {
icon = plugin->icon(DockPart::SystemPanel);
icon = plugin->icon(DockPart::SystemPanel, colorType);
pixmapSize = defaultIconSize;
QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0)
@ -339,9 +349,9 @@ QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixm
break;
}
case QuickSettingController::PluginAttribute::Quick: {
icon = plugin->icon(DockPart::QuickShow);
icon = plugin->icon(DockPart::QuickShow, colorType);
if (icon.isNull())
icon = plugin->icon(DockPart::QuickPanel);
icon = plugin->icon(DockPart::QuickPanel, colorType);
pixmapSize = defaultIconSize;
QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0)

View File

@ -40,7 +40,8 @@ struct DockItemInfo
QString displayName;
QString itemKey;
QString settingKey;
QByteArray icon;
QByteArray iconLight;
QByteArray iconDark;
bool visible;
};
@ -135,7 +136,7 @@ signals:
private:
bool isPluginValid(const QString &name);
QList<PluginsItemInterface *> localPlugins() const;
QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const;
QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize, int colorType) const;
private:
QGSettings *m_gsettings;

View File

@ -63,6 +63,11 @@ AbstractPluginsController::~AbstractPluginsController()
}
}
QList<PluginsItemInterface *> AbstractPluginsController::pluginCurrent() const
{
return m_pluginExists;
}
void AbstractPluginsController::saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value)
{
savePluginValue(getPluginInterface(itemInter), key, value);
@ -85,6 +90,7 @@ void AbstractPluginsController::itemAdded(PluginsItemInterface * const itemInter
if (pluginAdapter)
pluginAdapter->setItemKey(itemKey);
m_pluginExists << pluginItem;
pluginItemAdded(pluginItem, itemKey);
}
@ -95,6 +101,7 @@ void AbstractPluginsController::itemUpdate(PluginsItemInterface * const itemInte
void AbstractPluginsController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey)
{
m_pluginExists.removeOne(itemInter);
pluginItemRemoved(getPluginInterface(itemInter), itemKey);
}

View File

@ -43,6 +43,7 @@ public:
~ AbstractPluginsController() override;
void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {}
virtual QList<PluginsItemInterface *> pluginCurrent() const;
virtual bool needLoad(PluginsItemInterface *) { return true; }
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &pluginsMap();
@ -101,6 +102,7 @@ private:
// filepath, interface, loaded
QMap<QPair<QString, PluginsItemInterface *>, bool> m_pluginLoadMap;
QList<PluginsItemInterface *> m_pluginExists;
QJsonObject m_pluginSettingsObject;
QMap<qulonglong, PluginAdapter *> m_pluginAdapterMap;

View File

@ -29,6 +29,7 @@
#include <DStyleOption>
#include <DStandardItem>
#include <DGuiApplicationHelper>
#include <QDrag>
#include <QScrollBar>
@ -655,7 +656,7 @@ void QuickDockItem::leaveEvent(QEvent *event)
QPixmap QuickDockItem::iconPixmap() const
{
int pixmapSize = static_cast<int>(ICONHEIGHT * qApp->devicePixelRatio());
QIcon icon = m_pluginItem->icon(DockPart::QuickShow);
QIcon icon = m_pluginItem->icon(DockPart::QuickShow, DGuiApplicationHelper::instance()->themeType());
if (!icon.isNull())
return icon.pixmap(pixmapSize, pixmapSize);

View File

@ -278,6 +278,12 @@ public:
///
virtual QString description() const { return QString(); }
///
/// the icon for the plugin
/// themeType {0:UnknownType 1:LightType 2:DarkType}
///
virtual QIcon icon(const DockPart &dockPart, int themeType) { return icon(dockPart); }
protected:
///
/// \brief m_proxyInter

View File

@ -24,8 +24,12 @@
#include "bluetoothwidget.h"
#include "adaptersmanager.h"
#include <DGuiApplicationHelper>
#define STATE_KEY "enable"
DGUI_USE_NAMESPACE
BluetoothPlugin::BluetoothPlugin(QObject *parent)
: QObject(parent)
, m_adapterManager(new AdaptersManager(this))
@ -150,6 +154,14 @@ QIcon BluetoothPlugin::icon(const DockPart &)
return icon;
}
QIcon BluetoothPlugin::icon(const DockPart &dockPart, int themeType)
{
if (themeType == DGuiApplicationHelper::ColorType::DarkType)
return QIcon(":/bluetooth-active-symbolic.svg");
return QIcon(":/bluetooth-active-symbolic-dark.svg");
}
PluginsItemInterface::PluginStatus BluetoothPlugin::status() const
{
if (m_bluetoothItem.data()->isPowered())

View File

@ -56,6 +56,7 @@ public:
void pluginSettingsChanged() override;
QIcon icon(const DockPart &) override;
QIcon icon(const DockPart &dockPart, int themeType) override;
PluginStatus status() const override;
QString description() const override;

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/keyboard</title>
<g id="icon/dock/keyboard" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M14,2 C15.1045695,2 16,2.8954305 16,4 L16,12 C16,13.1045695 15.1045695,14 14,14 L2,14 C0.8954305,14 1.3527075e-16,13.1045695 0,12 L0,4 C-1.3527075e-16,2.8954305 0.8954305,2 2,2 L14,2 Z M13.9931545,3 L2.00684547,3 C1.45078007,3 1,3.4556644 1,3.99539757 L1,12.0046024 C1,12.5543453 1.44994876,13 2.00684547,13 L13.9931545,13 C14.5492199,13 15,12.5443356 15,12.0046024 L15,3.99539757 C15,3.44565467 14.5500512,3 13.9931545,3 Z M5,10 L5,12 L2,12 L2,10 L5,10 Z M11,10 L11,12 L6,12 L6,10 L11,10 Z M14,10 L14,12 L12,12 L12,10 L14,10 Z M6,7 L6,9 L2,9 L2,7 L6,7 Z M9,7 L9,9 L7,9 L7,7 L9,7 Z M14,7 L14,9 L10,9 L10,7 L14,7 Z M5,4 L5,6 L2,6 L2,4 L5,4 Z M8,4 L8,6 L6,6 L6,4 L8,4 Z M11,4 L11,6 L9,6 L9,4 L11,4 Z M14,4 L14,6 L12,6 L12,4 L14,4 Z" id="形状结合" fill="#536076"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,5 +1,6 @@
<RCC>
<qresource prefix="/icons">
<file>icon/deepin-virtualkeyboard.svg</file>
<file>icon/dcc_keyboard.svg</file>
</qresource>
</RCC>

View File

@ -167,6 +167,9 @@ void OnboardPlugin::pluginSettingsChanged()
QIcon OnboardPlugin::icon(const DockPart &dockPart)
{
if (dockPart == DockPart::DCCSetting)
return QIcon(":/icons/icon/dcc_keyboard.svg");
if (dockPart == DockPart::QuickPanel)
return m_onboardItem->iconPixmap(24);

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-set/power</title>
<g id="icon/dock-set/power" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M8,1 C11.8659932,1 15,4.13400675 15,8 C15,11.8659932 11.8659932,15 8,15 C4.13400675,15 1,11.8659932 1,8 C1,4.13400675 4.13400675,1 8,1 Z M5.35903478,3.72431037 C5.19110576,3.5050971 4.87726493,3.46352301 4.65805167,3.63145203 C3.30807232,4.665608 2.5,6.26636725 2.5,8 C2.5,11.0375661 4.96243388,13.5 8,13.5 C11.0375661,13.5 13.5,11.0375661 13.5,8 C13.5,6.27318712 12.698307,4.67801229 11.357281,3.64324033 C11.1386573,3.47454441 10.8246728,3.51501883 10.6559769,3.73364248 C10.487281,3.95226613 10.5277554,4.26625067 10.746379,4.43494659 C11.8445789,5.28234731 12.5,6.58647654 12.5,8 C12.5,10.4852814 10.4852814,12.5 8,12.5 C5.51471863,12.5 3.5,10.4852814 3.5,8 C3.5,6.58090106 4.1606451,5.27218928 5.26617644,4.42529349 C5.4853897,4.25736447 5.5269638,3.94352364 5.35903478,3.72431037 Z M8,2.5 C7.72385763,2.5 7.5,2.72385763 7.5,3 L7.5,3 L7.5,7.5 C7.5,7.77614237 7.72385763,8 8,8 C8.27614237,8 8.5,7.77614237 8.5,7.5 L8.5,7.5 L8.5,3 C8.5,2.72385763 8.27614237,2.5 8,2.5 Z" id="形状结合" fill="#536076"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -3,5 +3,6 @@
<file>resources/icons/fashion.svg</file>
<file>resources/icons/normal.svg</file>
<file>resources/icons/system-shutdown.svg</file>
<file>resources/icons/dcc_shutdown.svg</file>
</qresource>
</RCC>

View File

@ -60,7 +60,7 @@ const QString ShutdownPlugin::pluginName() const
const QString ShutdownPlugin::pluginDisplayName() const
{
return tr("Power");
return tr("shutdown");
}
QWidget *ShutdownPlugin::itemWidget(const QString &itemKey)
@ -304,7 +304,8 @@ void ShutdownPlugin::pluginSettingsChanged()
QIcon ShutdownPlugin::icon(const DockPart &dockPart)
{
Q_UNUSED(dockPart);
if (dockPart == DockPart::DCCSetting)
return QIcon(":/icons/resources/icons/dcc_shutdown.svg");
QIcon shutdownIcon;
shutdownIcon.addPixmap(m_shutdownWidget->loadPixmap());

View File

@ -254,6 +254,50 @@ QPixmap SoundItem::pixmap() const
return m_iconPixmap;
}
QPixmap SoundItem::pixmap(int colorType) const
{
const Dock::DisplayMode displayMode = Dock::DisplayMode::Efficient;
const double volmue = m_applet->volumeValue();
const double maxVolmue = m_applet->maxVolumeValue();
const bool mute = m_applet->existActiveOutputDevice() ? m_sinkInter->mute() : true;
QString iconString;
if (displayMode == Dock::Fashion) {
QString volumeString;
if (volmue >= 1000)
volumeString = "100";
else
volumeString = QString("0") + ('0' + int(volmue / 100)) + "0";
iconString = "audio-volume-" + volumeString;
if (mute)
iconString += "-muted";
} else {
QString volumeString;
if (mute)
volumeString = "muted";
else if (int(volmue) == 0)
volumeString = "off";
else if (volmue / maxVolmue > double(2) / 3)
volumeString = "high";
else if (volmue / maxVolmue > double(1) / 3)
volumeString = "medium";
else
volumeString = "low";
iconString = QString("audio-volume-%1-symbolic").arg(volumeString);
}
const auto ratio = devicePixelRatioF();
int iconSize = PLUGIN_ICON_MAX_SIZE;
if (colorType == DGuiApplicationHelper::LightType)
iconString.append(PLUGIN_MIN_ICON_NAME);
return ImageUtil::loadSvg(iconString, ":/", iconSize, ratio);
}
void SoundItem::sinkChanged(DBusSink *sink)
{
m_sinkInter = sink;

View File

@ -51,6 +51,7 @@ public:
void refreshIcon();
void refreshTips(const int volume, const bool force = false);
QPixmap pixmap() const;
QPixmap pixmap(int colorType) const;
signals:
void requestContextMenu() const;

View File

@ -148,6 +148,11 @@ QIcon SoundPlugin::icon(const DockPart &)
return m_soundItem->pixmap();
}
QIcon SoundPlugin::icon(const DockPart &dockPart, int themeType)
{
return m_soundItem->pixmap(themeType);
}
PluginsItemInterface::PluginStatus SoundPlugin::status() const
{
return SoundPlugin::Active;

View File

@ -52,6 +52,7 @@ public:
void refreshIcon(const QString &itemKey) override;
void pluginSettingsChanged() override;
QIcon icon(const DockPart &) override;
QIcon icon(const DockPart &dockPart, int themeType) override;
PluginStatus status() const override;
private:

View File

@ -0,0 +1,9 @@
<?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/trash</title>
<g id="icon/dock/trash" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="ICON-/-Action-/-Delete" transform="translate(2.000000, 1.000000)" fill="#536076">
<path d="M6,0 C9.3137085,0 12,0.927517607 12,2.33333333 C12,2.36106207 11.953792,2.58428654 11.8613761,3.00300675 L11.8113175,3.22865817 C11.5058314,4.59966698 10.8293981,7.54007214 9.78201742,12.0498737 L9.68861237,12.451864 C9.6289802,12.7085364 9.47044588,12.9312968 9.24747157,13.0717216 C8.26482407,13.6905739 7.18233355,14 6,14 C4.91617954,14 3.91625723,13.739989 3.00023307,13.2199671 L2.75248331,13.0717045 C2.52951762,12.9312828 2.37098512,12.7085342 2.31134306,12.4518733 C0.770447686,5.82085682 0,2.44801015 0,2.33333333 C0,0.927517607 2.6862915,0 6,0 Z M6,1.16666667 C3.3490332,1.16666667 1.2,1.68900113 1.2,2.33333333 C1.2,2.97766554 3.3490332,3.5 6,3.5 C8.6509668,3.5 10.8,2.97766554 10.8,2.33333333 C10.8,1.68900113 8.6509668,1.16666667 6,1.16666667 Z" id="形状结合"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,5 +1,6 @@
<RCC>
<qresource prefix="/">
<file>icons/dcc_trash.svg</file>
<file>icons/user-trash.svg</file>
</qresource>
</RCC>

View File

@ -188,6 +188,14 @@ void TrashPlugin::pluginSettingsChanged()
refreshPluginItemsVisible();
}
QIcon TrashPlugin::icon(const DockPart &dockPart, int themeType)
{
if (dockPart == DockPart::DCCSetting)
return QIcon(":/icons/dcc_trash.svg");
return QIcon();
}
void TrashPlugin::refreshPluginItemsVisible()
{
if (pluginIsDisable()) {

View File

@ -62,6 +62,7 @@ public:
void setSortKey(const QString &itemKey, const int order) override;
void displayModeChanged(const Dock::DisplayMode displayMode) override;
void pluginSettingsChanged() override;
QIcon icon(const DockPart &dockPart, int themeType) override;
private:
void refreshPluginItemsVisible();