mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00

1、修复拖动过程中组合图标尺寸显示异常的问题 2、修复从控制中心设置插件显示隐藏引起的异常问题 3、修复高缩放率下的组合图标显示异常问题 4、修复蓝牙面板在不同的主题下颜色的显示的问题 5、社区版键盘布局默认在任务栏显示 Log: 修复图标显示的问题 Influence: 高缩放率下,观察组合图标显示是否正常 Bug: https://pms.uniontech.com/bug-view-181723.html Change-Id: Id351063095a2290731876ce896c2cd05a32d4ec0
179 lines
6.7 KiB
C++
179 lines
6.7 KiB
C++
/*
|
||
* 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;
|
||
}
|