fix: 新增或移除显示屏插件自动添加或删除

增加显示屏变化的信号,当新增或删除显示屏的时候,根据信号来移除或新增插件

Log:
Influence: 拔出显示屏后再插入显示屏,观察任务栏快捷面板中的亮度设置插件是否发生变化
Task: https://pms.uniontech.com/task-view-220489.html
Change-Id: If093e8c2de7e6574be7cdecd5f44f7b379cfb886
This commit is contained in:
donghualin 2022-11-28 19:24:43 +08:00
parent 9ebbd85dde
commit 5ad52ae407
6 changed files with 69 additions and 25 deletions

View File

@ -43,16 +43,12 @@ BrightnessModel::BrightnessModel(QObject *parent)
QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus());
if (dbusInter.isValid()) {
// 读取所有的屏幕的信息
QString primaryScreenName = dbusInter.property("Primary").value<QString>();
QList<QDBusObjectPath> paths = dbusInter.property("Monitors").value<QList<QDBusObjectPath>>();
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<QString>();
m_monitor = readMonitors(dbusInter.property("Monitors").value<QList<QDBusObjectPath>>());
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<QVariant> arguments = msg.arguments();
if (3 != arguments.count())
return;
QString interfaceName = msg.arguments().at(0).toString();
if (interfaceName != serviceInterface)
return;
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
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<QList<QDBusObjectPath>>());
if (oldSize == 1 && m_monitor.size() == 0) {
Q_EMIT screenVisibleChanged(false);
} else if (oldSize == 0 && m_monitor.size() == 1) {
Q_EMIT screenVisibleChanged(true);
}
}
}
QList<BrightMonitor *> BrightnessModel::readMonitors(const QList<QDBusObjectPath> &paths)
{
QList<BrightMonitor *> monitors;
for (QDBusObjectPath path : paths) {
BrightMonitor *monitor = new BrightMonitor(path.path(), this);
monitor->setPrimary(m_primaryScreenName == monitor->name());
monitors << monitor;
}
return monitors;
}
/**
* @brief monitor
*/

View File

@ -22,6 +22,7 @@
#ifndef BRIGHTNESSMODEL_H
#define BRIGHTNESSMODEL_H
#include <QDBusObjectPath>
#include <QObject>
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<BrightMonitor *> readMonitors(const QList<QDBusObjectPath> &paths);
private:
QList<BrightMonitor *> m_monitor;
QString m_primaryScreenName;
};
class BrightMonitor : public QObject

View File

@ -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()

View File

@ -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();

View File

@ -35,15 +35,13 @@
#include <unistd.h>
#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)

View File

@ -59,7 +59,7 @@ private:
QScopedPointer<BrightnessWidget> m_displayWidget;
QScopedPointer<DisplaySettingWidget> m_displaySettingWidget;
QScopedPointer<Dock::TipsWidget> m_displayTips;
BrightnessModel *m_model;
QScopedPointer<BrightnessModel> m_model;
};
#endif // DATETIMEPLUGIN_H