dde-dock/plugins/pluginmanager/iconmanager.cpp
donghualin 9b6d09ffab fix: 修复图标异常问题
1、修复拖动过程中组合图标尺寸显示异常的问题
2、修复从控制中心设置插件显示隐藏引起的异常问题
3、修复高缩放率下的组合图标显示异常问题
4、修复蓝牙面板在不同的主题下颜色的显示的问题
5、社区版键盘布局默认在任务栏显示

Log: 修复图标显示的问题
Influence: 高缩放率下,观察组合图标显示是否正常
Bug: https://pms.uniontech.com/bug-view-181723.html
Change-Id: Id351063095a2290731876ce896c2cd05a32d4ec0
2023-01-14 16:41:51 +08:00

179 lines
6.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (C) 2023 ~ 2023 Deepin Technology Co., Ltd.
*
* Author: donghualin <donghualin@uniontech.com>
*
* Maintainer: donghualin <donghualin@uniontech.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "iconmanager.h"
#include "dockplugincontroller.h"
#include "pluginsiteminterface.h"
#include <DDciIcon>
#include <DWindowManagerHelper>
#include <DSysInfo>
#include <DPlatformTheme>
#include <QPainter>
#include <QPainterPath>
#define ITEMSPACE 6
#define ITEMHEIGHT 16
#define ITEMWIDTH 18
#define MINISIZE 1
#define STARTPOS 2
static QStringList pluginNames = {"power", "sound", "network"};
DGUI_USE_NAMESPACE
IconManager::IconManager(DockPluginController *pluginController, QObject *parent)
: QObject{parent}
, m_pluginController(pluginController)
, m_size(QSize(ITEMWIDTH, ITEMHEIGHT))
, m_position(Dock::Position::Bottom)
, m_displayMode(Dock::DisplayMode::Efficient)
{
}
void IconManager::updateSize(QSize size)
{
m_size = size;
}
void IconManager::setPosition(Dock::Position position)
{
m_position = position;
}
void IconManager::setDisplayMode(Dock::DisplayMode displayMode)
{
m_displayMode = displayMode;
}
QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const
{
QList<PluginsItemInterface *> plugins;
for (const QString &pluginName : pluginNames) {
PluginsItemInterface *plugin = findPlugin(pluginName);
if (plugin)
plugins << plugin;
}
if (plugins.size() < 2) {
// 缺省图标
DDciIcon::Theme theme = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType ? DDciIcon::Light : DDciIcon::Dark;
DDciIcon dciIcon(QString(":/resources/dock_control.dci"));
QPixmap pixmap = dciIcon.pixmap(QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio(), ITEMHEIGHT, theme, DDciIcon::Normal);
QColor foreColor = (colorType == DGuiApplicationHelper::ColorType::DarkType ? Qt::white : Qt::black);
foreColor.setAlphaF(0.8);
QPainter pa(&pixmap);
pa.setCompositionMode(QPainter::CompositionMode_SourceIn);
pa.fillRect(pixmap.rect(), foreColor);
return pixmap;
}
int itemSpace = 0;
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
itemSpace = (m_displayMode == Dock::DisplayMode::Efficient ? 8 : 10);
else
itemSpace = 2;
// 组合图标
QPixmap pixmap;
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) {
// 高效模式下高度固定为30, 时尚模式下,高度随着任务栏的大小变化而变化
int iconHeight = (m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.height() - 8);
if (iconHeight <= 0)
iconHeight = MINISIZE;
int iconWidth = STARTPOS;
for (PluginsItemInterface *plugin : plugins) {
QIcon icon = plugin->icon(DockPart::QuickShow);
QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio();
QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0)
iconSize = iconSizes.first();
iconWidth += iconSize.width();
}
iconWidth += itemSpace * (plugins.size() - 1);
pixmap = QPixmap(iconWidth, iconHeight);
} else {
// 左右方向高效模式下宽度固定为30时尚模式下宽度随任务栏的大小变化而变化
int iconWidth = m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.width() - 8;
if (iconWidth <= 0)
iconWidth = MINISIZE;
int iconHeight = STARTPOS;
for (PluginsItemInterface *plugin : plugins) {
QIcon icon = plugin->icon(DockPart::QuickShow);
QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio();
QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0)
iconSize = iconSizes.first();
iconHeight += iconSize.height();
}
iconHeight += itemSpace * (plugins.size() - 1);
pixmap = QPixmap(iconWidth, iconHeight);
}
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing);
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) {
int x = STARTPOS;
for (PluginsItemInterface *plugin : plugins) {
QIcon icon = plugin->icon(DockPart::QuickShow);
QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio();
QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0)
iconSize = iconSizes.first();
QPixmap pixmapDraw = icon.pixmap(iconSize);
QRect rectPixmap(QPoint(x, (pixmap.height() - iconSize.height()) / 2), iconSize);
painter.drawPixmap(rectPixmap, pixmapDraw);
x += iconSize.width() + itemSpace;
}
} else {
int y = STARTPOS;
for (PluginsItemInterface *plugin : plugins) {
QIcon icon = plugin->icon(DockPart::QuickShow);
QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio();
QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0)
iconSize = iconSizes.first();
QPixmap pixmapDraw = icon.pixmap(iconSize);
QRect rectPixmap(QPoint((pixmap.width() - iconSize.width()) / 2, y), iconSize);
painter.drawPixmap(rectPixmap, pixmapDraw);
y += iconSize.height() + itemSpace;
}
}
painter.end();
return pixmap;
}
bool IconManager::isFixedPlugin(PluginsItemInterface *plugin) const
{
return pluginNames.contains(plugin->pluginName());
}
PluginsItemInterface *IconManager::findPlugin(const QString &pluginName) const
{
QList<PluginsItemInterface *> plugins = m_pluginController->currentPlugins();
for (PluginsItemInterface *plugin : plugins) {
if (plugin->pluginName() == pluginName)
return plugin;
}
return nullptr;
}