fix: 修改插件区域出现重复的电池图标问题

1.修改电池图标状态刷新处理
2.将电池插件改到快捷面板内
3.快捷面板组合图标改为默认图标

Log: 修改插件区域出现重复的电池图标问题
Bug: https://pms.uniontech.com/bug-view-184085.html
Influence: 任务栏-电池图标状态刷新
Change-Id: I8af36acfd9a42efa186338c115f33255af5c1fa6
This commit is contained in:
caixiangrong 2023-01-30 13:14:32 +08:00
parent a572f8a37d
commit 50dad25442
11 changed files with 63 additions and 149 deletions

View File

@ -17,7 +17,7 @@
"visibility":"public"
},
"Dock_Quick_Plugins": {
"value": ["shutdown", "trash"],
"value": ["power", "network", "shutdown", "trash"],
"serial": 0,
"flags": [],
"name": "显示在任务栏上的快捷插件",
@ -37,4 +37,4 @@
"visibility": "private"
}
}
}
}

View File

@ -31,29 +31,21 @@
#include <QPainterPath>
#define ITEMSPACE 6
#define ITEMHEIGHT 16
#define ITEMWIDTH 18
#define IMAGESIZE 12
#define ITEMSIZE 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;
@ -66,104 +58,14 @@ void IconManager::setDisplayMode(Dock::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());
// 缺省图标
QPixmap pixmap = QIcon::fromTheme("dock-control-panel").pixmap(ITEMSIZE, ITEMSIZE);
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.scaled(pixmap.size() / qApp->devicePixelRatio());
}
PluginsItemInterface *IconManager::findPlugin(const QString &pluginName) const

View File

@ -35,18 +35,15 @@ class IconManager : public QObject
public:
explicit IconManager(DockPluginController *pluginController, QObject *parent = nullptr);
void updateSize(QSize size);
void setPosition(Dock::Position position);
void setDisplayMode(Dock::DisplayMode displayMode);
QPixmap pixmap(DGuiApplicationHelper::ColorType colorType) const;
bool isFixedPlugin(PluginsItemInterface *plugin) const;
private:
PluginsItemInterface *findPlugin(const QString &pluginName) const;
private:
DockPluginController *m_pluginController;
QSize m_size;
Dock::Position m_position;
Dock::DisplayMode m_displayMode;
};

View File

@ -54,21 +54,6 @@ void PluginManager::init(PluginProxyInterface *proxyInter)
m_iconManager->setPosition(position());
m_iconManager->setDisplayMode(displayMode());
connect(m_dockController.data(), &DockPluginController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter) {
if (m_iconManager->isFixedPlugin(itemInter)) {
m_proxyInter->itemUpdate(this, pluginName());
}
});
connect(m_dockController.data(), &DockPluginController::pluginUpdated, this, [ this ](PluginsItemInterface *itemInter) {
if (m_iconManager->isFixedPlugin(itemInter)) {
m_proxyInter->itemUpdate(this, pluginName());
}
});
connect(m_dockController.data(), &DockPluginController::pluginRemoved, this, [ this ](PluginsItemInterface *itemInter) {
if (m_iconManager->isFixedPlugin(itemInter)) {
m_proxyInter->itemUpdate(this, pluginName());
}
});
connect(m_dockController.data(), &DockPluginController::requestAppletVisible, this, [ this ](PluginsItemInterface *itemInter, const QString &itemKey, bool visible) {
if (visible) {
QWidget *appletWidget = itemInter->itemPopupApplet(itemKey);
@ -123,15 +108,6 @@ PluginsItemInterface::PluginSizePolicy PluginManager::pluginSizePolicy() const
return PluginSizePolicy::Custom;
}
bool PluginManager::eventHandler(QEvent *event)
{
if (event->type() == QEvent::Resize) {
QResizeEvent *resizeEvent = static_cast<QResizeEvent *>(event);
m_iconManager->updateSize(resizeEvent->size());
}
return PluginsItemInterface::eventHandler(event);
}
void PluginManager::positionChanged(const Dock::Position position)
{
m_iconManager->setPosition(position);

View File

@ -49,7 +49,6 @@ public:
PluginSizePolicy pluginSizePolicy() const override;
protected:
bool eventHandler(QEvent *event) override;
void positionChanged(const Dock::Position position) override;
void displayModeChanged(const Dock::DisplayMode displayMode) override;

View File

@ -1,5 +0,0 @@
<RCC>
<qresource prefix="/">
<file>resources/dock_control.dci</file>
</qresource>
</RCC>

View File

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/dsg">
<file>built-in-icons/dock-control-panel.dci</file>
</qresource>
</RCC>

View File

@ -26,7 +26,9 @@
#include <QIcon>
#include <QGSettings>
#include <QHBoxLayout>
#include <DFontSizeManager>
#include <DDBusSender>
#define PLUGIN_STATE_KEY "enable"
@ -48,11 +50,13 @@ PowerPlugin::PowerPlugin(QObject *parent)
, m_systemPowerInter(nullptr)
, m_powerInter(nullptr)
, m_preChargeTimer(new QTimer(this))
, m_quickPanel(nullptr)
{
m_tipsLabel->setVisible(false);
m_tipsLabel->setObjectName("power");
m_preChargeTimer->setInterval(DELAYTIME);
m_preChargeTimer->setSingleShot(true);
initQuickPanel();
connect(m_preChargeTimer,&QTimer::timeout,this,&PowerPlugin::refreshTipsData);
}
@ -70,6 +74,8 @@ QWidget *PowerPlugin::itemWidget(const QString &itemKey)
{
if (itemKey == POWER_KEY)
return m_powerStatusWidget.data();
if (itemKey == QUICK_ITEM_KEY)
return m_quickPanel;
return nullptr;
}
@ -99,7 +105,7 @@ void PowerPlugin::init(PluginProxyInterface *proxyInter)
const QString PowerPlugin::itemCommand(const QString &itemKey)
{
if (itemKey == POWER_KEY)
return QString("dbus-send --print-reply --dest=org.deepin.dde.ControlCenter1 /org/deepin/dde/ControlCenter1 org.deepin.dde.ControlCenter1.ShowPage \"string:power\"");
return QString("dbus-send --print-reply --dest=org.deepin.dde.ControlCenter1 /org/deepin/dde/ControlCenter1 org.deepin.dde.ControlCenter1.ShowPage string:power");
return QString();
}
@ -143,9 +149,14 @@ void PowerPlugin::setSortKey(const QString &itemKey, const int order)
QIcon PowerPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType)
{
// 电池插件不显示在快捷面板上,因此此处返回空图标
static QIcon batteryIcon;
const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(themeType);
// 快捷面板使用m_quickPanel
if (dockPart == DockPart::QuickPanel) {
m_imageLabel->setPixmap(pixmap);
return QIcon();
}
static QIcon batteryIcon;
batteryIcon.detach();
batteryIcon.addPixmap(pixmap);
return batteryIcon;
@ -153,11 +164,12 @@ QIcon PowerPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorTy
PluginFlags PowerPlugin::flags() const
{
// 电池插件在任务栏上面展示,在快捷面板展示,并且可以拖动,可以在其前面插入其他插件,能在控制中心设置是否显示隐藏
// 电池插件在任务栏上面展示,在快捷面板展示,并且可以拖动,可以在其前面插入其他插件,能在控制中心设置是否显示隐藏
return PluginFlag::Type_Common
| PluginFlag::Attribute_CanDrag
| PluginFlag::Attribute_CanInsert
| PluginFlag::Attribute_ForceDock;
| PluginFlag::Attribute_CanSetting
| PluginFlag::Quick_Single;
}
void PowerPlugin::updateBatteryVisible()
@ -182,6 +194,8 @@ void PowerPlugin::loadPlugin()
m_powerStatusWidget.reset(new PowerStatusWidget);
connect(m_powerStatusWidget.get(), &PowerStatusWidget::iconChanged, this, [ this ] {
m_proxyInter->updateDockInfo(this, DockPart::QuickPanel);
m_proxyInter->updateDockInfo(this, DockPart::QuickShow);
m_proxyInter->itemUpdate(this, POWER_KEY);
});
@ -226,7 +240,7 @@ void PowerPlugin::refreshTipsData()
const uint percentage = qMin(100.0, qMax(0.0, data.value("Display")));
const QString value = QString("%1%").arg(std::round(percentage));
const int batteryState = m_powerInter->batteryState()["Display"];
m_labelText->setText(value);
if (m_preChargeTimer->isActive() && m_showTimeToFull) {
// 插入电源后20秒内算作预充电时间此时计算剩余充电时间是不准确的
QString tips = tr("Capacity %1 ...").arg(value);
@ -274,3 +288,25 @@ void PowerPlugin::refreshTipsData()
m_tipsLabel->setText(tips);
}
}
void PowerPlugin::initQuickPanel()
{
m_quickPanel = new QWidget();
QVBoxLayout *layout = new QVBoxLayout(m_quickPanel);
layout->setAlignment(Qt::AlignVCenter);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
m_imageLabel = new QLabel(m_quickPanel);
m_imageLabel->setObjectName("imageLabel");
m_imageLabel->setFixedHeight(24);
m_imageLabel->setAlignment(Qt::AlignCenter);
m_labelText = new QLabel(m_quickPanel);
m_labelText->setObjectName("textLabel");
m_labelText->setFixedHeight(11);
m_labelText->setAlignment(Qt::AlignCenter);
m_labelText->setFont(Dtk::Widget::DFontSizeManager::instance()->t10());
layout->addWidget(m_imageLabel);
layout->addSpacing(7);
layout->addWidget(m_labelText);
}

View File

@ -62,6 +62,7 @@ private:
void loadPlugin();
void onGSettingsChanged(const QString &key);
void refreshTipsData();
void initQuickPanel();
private:
bool m_pluginLoaded;
@ -73,6 +74,9 @@ private:
SystemPowerInter *m_systemPowerInter;
DBusPower *m_powerInter;
QTimer *m_preChargeTimer;
QWidget *m_quickPanel;
QLabel *m_imageLabel;
QLabel *m_labelText;
};
#endif // POWERPLUGIN_H