mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-02 15:45:21 +00:00
fix: 修改插件区域出现重复的电池图标问题
1.修改电池图标状态刷新处理 2.将电池插件改到快捷面板内 3.快捷面板组合图标改为默认图标 Log: 修改插件区域出现重复的电池图标问题 Bug: https://pms.uniontech.com/bug-view-184085.html Influence: 任务栏-电池图标状态刷新 Change-Id: I8af36acfd9a42efa186338c115f33255af5c1fa6
This commit is contained in:
parent
a572f8a37d
commit
50dad25442
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -1,5 +0,0 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>resources/dock_control.dci</file>
|
||||
</qresource>
|
||||
</RCC>
|
Binary file not shown.
Binary file not shown.
5
plugins/pluginmanager/resources/pluginmanager.qrc
Normal file
5
plugins/pluginmanager/resources/pluginmanager.qrc
Normal file
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/dsg">
|
||||
<file>built-in-icons/dock-control-panel.dci</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user