From 5ad52ae4078063994a405c90af43d591689bf3b7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 19:24:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9E=E6=88=96=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=98=BE=E7=A4=BA=E5=B1=8F=E6=8F=92=E4=BB=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=B7=BB=E5=8A=A0=E6=88=96=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加显示屏变化的信号,当新增或删除显示屏的时候,根据信号来移除或新增插件 Log: Influence: 拔出显示屏后再插入显示屏,观察任务栏快捷面板中的亮度设置插件是否发生变化 Task: https://pms.uniontech.com/task-view-220489.html Change-Id: If093e8c2de7e6574be7cdecd5f44f7b379cfb886 --- plugins/display/brightnessmodel.cpp | 59 +++++++++++++++++++++++----- plugins/display/brightnessmodel.h | 7 ++++ plugins/display/brightnesswidget.cpp | 8 ---- plugins/display/brightnesswidget.h | 2 - plugins/display/displayplugin.cpp | 16 +++++--- plugins/display/displayplugin.h | 2 +- 6 files changed, 69 insertions(+), 25 deletions(-) diff --git a/plugins/display/brightnessmodel.cpp b/plugins/display/brightnessmodel.cpp index e7c024bce..9d05e97f1 100644 --- a/plugins/display/brightnessmodel.cpp +++ b/plugins/display/brightnessmodel.cpp @@ -43,16 +43,12 @@ BrightnessModel::BrightnessModel(QObject *parent) QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); if (dbusInter.isValid()) { // 读取所有的屏幕的信息 - QString primaryScreenName = dbusInter.property("Primary").value(); - QList paths = dbusInter.property("Monitors").value>(); - for (QDBusObjectPath path : paths) { - BrightMonitor *monitor = new BrightMonitor(path.path(), this); - monitor->setPrimary(primaryScreenName == monitor->name()); - m_monitor << monitor; - } - } + m_primaryScreenName = dbusInter.property("Primary").value(); + m_monitor = readMonitors(dbusInter.property("Monitors").value>()); - connect(qApp, &QApplication::primaryScreenChanged, this, &BrightnessModel::primaryScreenChanged); + QDBusConnection::sessionBus().connect(serviceName, servicePath, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); + } } BrightnessModel::~BrightnessModel() @@ -87,6 +83,51 @@ void BrightnessModel::primaryScreenChanged(QScreen *screen) Q_EMIT primaryChanged(defaultMonitor); } +void BrightnessModel::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != serviceInterface) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Primary")) { + m_primaryScreenName = changedProps.value("Primary").toString(); + BrightMonitor *defaultMonitor = nullptr; + for (BrightMonitor *monitor : m_monitor) { + monitor->setPrimary(monitor->name() == m_primaryScreenName); + if (monitor->isPrimary()) + defaultMonitor = monitor; + } + + if (defaultMonitor) + Q_EMIT primaryChanged(defaultMonitor); + } else if (changedProps.contains("Monitors")) { + int oldSize = m_monitor.size(); + qDeleteAll(m_monitor); + m_monitor = readMonitors(changedProps.value("Monitors").value>()); + if (oldSize == 1 && m_monitor.size() == 0) { + Q_EMIT screenVisibleChanged(false); + } else if (oldSize == 0 && m_monitor.size() == 1) { + Q_EMIT screenVisibleChanged(true); + } + } +} + +QList BrightnessModel::readMonitors(const QList &paths) +{ + QList monitors; + for (QDBusObjectPath path : paths) { + BrightMonitor *monitor = new BrightMonitor(path.path(), this); + monitor->setPrimary(m_primaryScreenName == monitor->name()); + monitors << monitor; + } + return monitors; +} + /** * @brief monitor */ diff --git a/plugins/display/brightnessmodel.h b/plugins/display/brightnessmodel.h index b9c0c022b..ca569f3fc 100644 --- a/plugins/display/brightnessmodel.h +++ b/plugins/display/brightnessmodel.h @@ -22,6 +22,7 @@ #ifndef BRIGHTNESSMODEL_H #define BRIGHTNESSMODEL_H +#include #include class BrightMonitor; @@ -41,12 +42,18 @@ public: Q_SIGNALS: void primaryChanged(BrightMonitor *); + void screenVisibleChanged(bool); protected Q_SLOTS: void primaryScreenChanged(QScreen *screen); + void onPropertyChanged(const QDBusMessage &msg); + +private: + QList readMonitors(const QList &paths); private: QList m_monitor; + QString m_primaryScreenName; }; class BrightMonitor : public QObject diff --git a/plugins/display/brightnesswidget.cpp b/plugins/display/brightnesswidget.cpp index 2c148e2ac..a25d66558 100644 --- a/plugins/display/brightnesswidget.cpp +++ b/plugins/display/brightnesswidget.cpp @@ -48,14 +48,6 @@ void BrightnessWidget::showEvent(QShowEvent *event) // 显示的时候更新一下slider的主屏幕亮度值 updateSliderValue(); - Q_EMIT visibleChanged(true); -} - -void BrightnessWidget::hideEvent(QHideEvent *event) -{ - QWidget::hideEvent(event); - - Q_EMIT visibleChanged(true); } void BrightnessWidget::initUi() diff --git a/plugins/display/brightnesswidget.h b/plugins/display/brightnesswidget.h index 78a4cf77d..881d0b892 100644 --- a/plugins/display/brightnesswidget.h +++ b/plugins/display/brightnesswidget.h @@ -38,12 +38,10 @@ public: ~BrightnessWidget() override; Q_SIGNALS: - void visibleChanged(bool); void brightClicked(); protected: void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; private: void initUi(); diff --git a/plugins/display/displayplugin.cpp b/plugins/display/displayplugin.cpp index 86258b1a5..ba4d82a0a 100644 --- a/plugins/display/displayplugin.cpp +++ b/plugins/display/displayplugin.cpp @@ -35,15 +35,13 @@ #include -#define PLUGIN_STATE_KEY "enable" -#define TIME_FORMAT_KEY "Use24HourFormat" using namespace Dock; DisplayPlugin::DisplayPlugin(QObject *parent) : QObject(parent) , m_displayWidget(nullptr) , m_displaySettingWidget(nullptr) , m_displayTips(nullptr) - , m_model(new BrightnessModel(this)) + , m_model(nullptr) { } @@ -64,15 +62,23 @@ void DisplayPlugin::init(PluginProxyInterface *proxyInter) m_proxyInter = proxyInter; m_displayTips.reset(new TipsWidget); - m_displayWidget.reset(new BrightnessWidget(m_model)); + m_model.reset(new BrightnessModel); + m_displayWidget.reset(new BrightnessWidget(m_model.data())); m_displayWidget->setFixedHeight(60); m_displaySettingWidget.reset(new DisplaySettingWidget); - m_proxyInter->itemAdded(this, pluginName()); + if (m_model->monitors().size() > 0) + m_proxyInter->itemAdded(this, pluginName()); connect(m_displayWidget.data(), &BrightnessWidget::brightClicked, this, [ this ] { m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); }); + connect(m_model.data(), &BrightnessModel::screenVisibleChanged, this, [ this ](bool visible) { + if (visible) + m_proxyInter->itemAdded(this, pluginName()); + else + m_proxyInter->itemRemoved(this, pluginName()); + }); } QWidget *DisplayPlugin::itemWidget(const QString &itemKey) diff --git a/plugins/display/displayplugin.h b/plugins/display/displayplugin.h index ed1fe4064..6c197a1fc 100644 --- a/plugins/display/displayplugin.h +++ b/plugins/display/displayplugin.h @@ -59,7 +59,7 @@ private: QScopedPointer m_displayWidget; QScopedPointer m_displaySettingWidget; QScopedPointer m_displayTips; - BrightnessModel *m_model; + QScopedPointer m_model; }; #endif // DATETIMEPLUGIN_H