feat: 任务栏增加多屏配置处理逻辑

多屏位置切换时间配置+固定屏幕显示配置

Log: 任务栏增加多屏配置处理逻辑
Task: https://pms.uniontech.com/zentao/task-view-37417.html
Change-Id: I9c272b95866addaeb49c78fa64e5f889074f8f4d
Reviewed-on: http://gerrit.uniontech.com/c/dde-dock/+/4724
Reviewed-by: <mailman@uniontech.com>
Reviewed-by: fanpengcheng <fanpengcheng@uniontech.com>
Tested-by: <mailman@uniontech.com>
This commit is contained in:
liuxing 2020-09-15 19:54:47 +08:00
parent c5b030348a
commit 5a586988fa
3 changed files with 91 additions and 11 deletions

View File

@ -31,6 +31,9 @@
#include <QDBusConnection>
const QString MonitorsSwitchTime = "monitorsSwitchTime";
const QString OnlyShowPrimary = "onlyShowPrimary";
// 保证以下数据更新顺序(大环节顺序不要变,内部还有一些小的调整,比如任务栏显示区域更新的时候,里面内容的布局方向可能也要更新...)
// Monitor数据屏幕是否可停靠更新监视唤醒区域更新任务栏显示区域更新拖拽区域更新通知后端接口通知窗管
@ -48,6 +51,7 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *help
, m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus()))
, m_monitorUpdateTimer(new QTimer(this))
, m_delayTimer(new QTimer(this))
, m_monitorSetting(nullptr)
, m_showAni(new QVariantAnimation(this))
, m_hideAni(new QVariantAnimation(this))
, m_ds(m_displayInter->primary())
@ -58,6 +62,7 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *help
{
qDebug() << "init dock screen: " << m_ds.current();
initMembers();
initGSettingConfig();
initDBus();
initConnection();
initDisplayData();
@ -339,6 +344,7 @@ void MultiScreenWorker::primaryScreenChanged()
{
// 先更新主屏信息
m_ds.updatePrimary(m_displayInter->primary());
m_mtrInfo.setPrimary(m_displayInter->primary());
const int screenRawHeight = m_displayInter->screenHeight();
const int screenRawWidth = m_displayInter->screenWidth();
@ -914,6 +920,26 @@ void MultiScreenWorker::initMembers()
checkXEventMonitorService();
}
void MultiScreenWorker::initGSettingConfig()
{
if (QGSettings::isSchemaInstalled("com.deepin.dde.dock.mainwidow")) {
m_monitorSetting = new QGSettings("com.deepin.dde.dock.mainwidow", "/com/deepin/dde/dock/mainwidow/", this);
if (m_monitorSetting->keys().contains(MonitorsSwitchTime)) {
m_delayTimer->setInterval(m_monitorSetting->get(MonitorsSwitchTime).toInt());
} else {
qDebug() << "can not find key:" << MonitorsSwitchTime;
}
if (m_monitorSetting->keys().contains(OnlyShowPrimary)) {
m_mtrInfo.setShowInPrimary(m_monitorSetting->get(OnlyShowPrimary).toBool());
} else {
qDebug() << "can not find key:" << OnlyShowPrimary;
}
} else {
qDebug() << "com.deepin.dde.dock is uninstalled.";
}
}
void MultiScreenWorker::initConnection()
{
connect(m_showAni, &QVariantAnimation::valueChanged, this, static_cast<void (MultiScreenWorker::*)(const QVariant &value)>(&MultiScreenWorker::updateParentGeometry));
@ -990,6 +1016,8 @@ void MultiScreenWorker::initConnection()
// 通知窗管
emit requestNotifyWindowManager();
});
connect(m_monitorSetting, &QGSettings::changed, this, &MultiScreenWorker::onConfigChange);
}
void MultiScreenWorker::initUI()
@ -1029,6 +1057,7 @@ void MultiScreenWorker::initDBus()
m_screenRawHeight = m_displayInter->screenHeight();
m_screenRawWidth = m_displayInter->screenWidth();
m_ds = DockScreen(m_displayInter->primary());
m_mtrInfo.setPrimary(m_displayInter->primary());
}
}
@ -1759,10 +1788,10 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY)
// 任务栏显示状态,但需要切换屏幕
if (toScreen != m_ds.current()) {
m_delayScreen = toScreen;
if (!m_delayTimer->isActive())
if (!m_delayTimer->isActive()) {
m_delayScreen = toScreen;
m_delayTimer->start();
}
} else {
// 任务栏隐藏状态,但需要显示
if (hideMode() == HideMode::KeepShowing) {
@ -1790,3 +1819,14 @@ void MultiScreenWorker::hideAni(const QString &screen)
{
return hideAni(screen, m_position, m_displayMode);
}
void MultiScreenWorker::onConfigChange(const QString &changeKey)
{
if (changeKey == MonitorsSwitchTime) {
m_delayTimer->setInterval(m_monitorSetting->get(MonitorsSwitchTime).toInt());
} else if (changeKey == OnlyShowPrimary) {
m_mtrInfo.setShowInPrimary(m_monitorSetting->get(OnlyShowPrimary).toBool());
// 每次切换都更新一下屏幕显示的信息
emit requestUpdateMonitorInfo();
}
}

View File

@ -41,9 +41,9 @@
#define WINDOWMARGIN ((m_displayMode == Dock::Efficient) ? 0 : 10)
#define ANIMATIONTIME 300
#define FREE_POINT(p) if (p) {\
delete p;\
p = nullptr;\
}\
delete p;\
p = nullptr;\
}\
DGUI_USE_NAMESPACE
/**
@ -62,6 +62,7 @@ class QVariantAnimation;
class QWidget;
class QTimer;
class MainWindow;
class QGSettings;
/**
* @brief The MonitorInfo class
@ -77,7 +78,7 @@ public:
* @brief data
* @return
*/
inline const QMap<Monitor *, MonitorInter *> data() {return m_monitorInfo;}
inline QMap<Monitor *, MonitorInter *> data() {return m_monitorInfo;}
/**
* @brief validMonitor
@ -89,12 +90,14 @@ public:
QMapIterator<Monitor *, MonitorInter *>it(m_monitorInfo);
while (it.hasNext()) {
it.next();
if (it.key()->enable())
// 仅显示在主屏的情况下,可用屏幕信息只提供主屏幕
if ((!m_showInPrimary && it.key()->enable())
|| (m_showInPrimary && it.key()->name() == m_primary)) {
list << it.key();
}
}
return list;
}
/**
* @brief insert
* @param mon 
@ -106,7 +109,6 @@ public:
Q_EMIT monitorChanged();
}
/**
* @brief remove
* @param mon 
@ -119,6 +121,24 @@ public:
Q_EMIT monitorChanged();
}
/**
* @brief setShowInPrimary
* @param showIn
*/
void setShowInPrimary(const bool &showIn)
{
if (m_showInPrimary != showIn)
m_showInPrimary = showIn;
}
/**
* @brief setPrimary
* @param primary
*/
void setPrimary(const QString &primary)
{
if (m_primary != primary)
m_primary = primary;
}
signals:
/**
@ -128,6 +148,8 @@ signals:
private:
QMap<Monitor *, MonitorInter *> m_monitorInfo;
QString m_primary;
bool m_showInPrimary = false;
};
/**
@ -316,9 +338,13 @@ private slots:
void onTouchPress(int type, int x, int y, const QString &key);
void onTouchRelease(int type, int x, int y, const QString &key);
// gsetting配置改变响应槽
void onConfigChange(const QString &changeKey);
private:
// 初始化数据信息
void initMembers();
void initGSettingConfig();
void initDBus();
void initConnection();
void initUI();
@ -431,7 +457,9 @@ private:
// update monitor info
QTimer *m_monitorUpdateTimer;
QTimer *m_delayTimer; // sp3需求,切换屏幕显示延时2秒唤起任务栏
QTimer *m_delayTimer; // sp3需求切换屏幕显示延时默认2秒唤起任务栏
QGSettings *m_monitorSetting; // 多屏配置控制
// animation
QVariantAnimation *m_showAni;

View File

@ -291,4 +291,16 @@
</description>
</key>
</schema>
<schema path="/com/deepin/dde/dock/mainwidow/" id="com.deepin.dde.dock.mainwidow" gettext-domain="DDE">
<key type="u" name="monitors-switch-time">
<default>2000</default>
<summary>Unit: ms</summary>
<description>Control duration of dock switch in monitors</description>
</key>
<key type="b" name="only-show-primary">
<default>false</default>
<summary></summary>
<description>Determine to show dock only in primary monitor</description>
</key>
</schema>
</schemalist>