mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
feat: 隐藏显示动画调整
任务栏智能隐藏或一直隐藏时,鼠标移动到屏幕边缘过一段时间再唤起任务栏 DConfig配置:delayIntervalOnHide,默认值0,单位毫秒 Log: 隐藏显示动画调整 Change-Id: I3a93a868e790566b6548f83ff740f5913db9bcc8
This commit is contained in:
parent
dc03c4331c
commit
16d8ee9253
@ -37,6 +37,17 @@
|
|||||||
"description":"show(or restore) desktop will toggle after the hover interval (in milliseconds)",
|
"description":"show(or restore) desktop will toggle after the hover interval (in milliseconds)",
|
||||||
"permissions":"readwrite",
|
"permissions":"readwrite",
|
||||||
"visibility":"private"
|
"visibility":"private"
|
||||||
|
},
|
||||||
|
"delayIntervalOnHide":{
|
||||||
|
"value": 0,
|
||||||
|
"serial": 0,
|
||||||
|
"flags":[],
|
||||||
|
"name":"delayIntervalOnHide",
|
||||||
|
"name[zh_CN]":"任务栏隐藏状态时,从当前屏幕显示时的延时显示时间",
|
||||||
|
"description[zh_CN]":"任务栏智能隐藏或一直隐藏时,鼠标移动到当前所在屏幕边缘过一段时间再唤起任务栏(以毫秒为单位)",
|
||||||
|
"description":"When the dock is hidden, move the mouse to the edge of the current screen and then recall the dock (in milliseconds)",
|
||||||
|
"permissions":"readwrite",
|
||||||
|
"visibility":"private"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,8 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent)
|
|||||||
, m_dockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this))
|
, m_dockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this))
|
||||||
, m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus(), this))
|
, m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus(), this))
|
||||||
, m_monitorUpdateTimer(new QTimer(this))
|
, m_monitorUpdateTimer(new QTimer(this))
|
||||||
, m_delayWakeTimer(new QTimer(this))
|
, m_delayWakeOnScreenSwitchTimer(new QTimer(this))
|
||||||
|
, m_delayWakeOnHideTimer(new QTimer(this))
|
||||||
, m_ds(DIS_INS->primary())
|
, m_ds(DIS_INS->primary())
|
||||||
, m_screenMonitor(new ScreenChangeMonitor(&m_ds, this))
|
, m_screenMonitor(new ScreenChangeMonitor(&m_ds, this))
|
||||||
, m_state(AutoHide)
|
, m_state(AutoHide)
|
||||||
@ -211,7 +212,7 @@ void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString
|
|||||||
m_ds.updateDockedScreen(getValidScreen(position()));
|
m_ds.updateDockedScreen(getValidScreen(position()));
|
||||||
|
|
||||||
// 鼠标移动到任务栏界面之外,停止计时器(延时2秒改变任务栏所在屏幕)
|
// 鼠标移动到任务栏界面之外,停止计时器(延时2秒改变任务栏所在屏幕)
|
||||||
m_delayWakeTimer->stop();
|
m_delayWakeOnScreenSwitchTimer->stop();
|
||||||
|
|
||||||
if (m_hideMode == HideMode::KeepShowing
|
if (m_hideMode == HideMode::KeepShowing
|
||||||
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
|
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
|
||||||
@ -936,7 +937,16 @@ void MultiScreenWorker::initMembers()
|
|||||||
m_monitorUpdateTimer->setInterval(100);
|
m_monitorUpdateTimer->setInterval(100);
|
||||||
m_monitorUpdateTimer->setSingleShot(true);
|
m_monitorUpdateTimer->setSingleShot(true);
|
||||||
|
|
||||||
m_delayWakeTimer->setSingleShot(true);
|
// 优化显示方式,隐藏后再显示会延迟一小段时间
|
||||||
|
QScopedPointer<DConfig> config(DConfig::create("org.deepin.dde.dock", "org.deepin.dde.dock"));
|
||||||
|
if (config->isValid() && config->keyList().contains("delayIntervalOnHide")) {
|
||||||
|
m_delayWakeOnHideTimer->setInterval(config->value("delayIntervalOnHide").toInt());
|
||||||
|
} else {
|
||||||
|
m_delayWakeOnHideTimer->setInterval(0);
|
||||||
|
}
|
||||||
|
m_delayWakeOnHideTimer->setSingleShot(true);
|
||||||
|
|
||||||
|
m_delayWakeOnScreenSwitchTimer->setSingleShot(true);
|
||||||
|
|
||||||
setStates(LauncherDisplay, m_launcherInter->isValid() ? m_launcherInter->visible() : false);
|
setStates(LauncherDisplay, m_launcherInter->isValid() ? m_launcherInter->visible() : false);
|
||||||
|
|
||||||
@ -979,7 +989,19 @@ void MultiScreenWorker::initConnection()
|
|||||||
connect(this, &MultiScreenWorker::requestNotifyWindowManager, this, &MultiScreenWorker::onRequestNotifyWindowManager);
|
connect(this, &MultiScreenWorker::requestNotifyWindowManager, this, &MultiScreenWorker::onRequestNotifyWindowManager);
|
||||||
connect(this, &MultiScreenWorker::requestUpdateMonitorInfo, this, &MultiScreenWorker::onRequestUpdateMonitorInfo);
|
connect(this, &MultiScreenWorker::requestUpdateMonitorInfo, this, &MultiScreenWorker::onRequestUpdateMonitorInfo);
|
||||||
|
|
||||||
connect(m_delayWakeTimer, &QTimer::timeout, this, &MultiScreenWorker::onRequestDelayShowDock);
|
connect(m_delayWakeOnScreenSwitchTimer, &QTimer::timeout, this, &MultiScreenWorker::onRequestDelayShowDock);
|
||||||
|
connect(m_delayWakeOnHideTimer, &QTimer::timeout, this, [ = ] {
|
||||||
|
// 鼠标处于按下状态,不再显示
|
||||||
|
if (testState(MousePress))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const QRect boundRect = parent()->visibleRegion().boundingRect();
|
||||||
|
qDebug() << "boundRect:" << boundRect;
|
||||||
|
if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide)
|
||||||
|
&& (boundRect.size().isEmpty())) {
|
||||||
|
displayAnimation(m_ds.current(), AniAction::Show);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// 更新任务栏内容展示方式
|
// 更新任务栏内容展示方式
|
||||||
connect(this, &MultiScreenWorker::requestUpdateLayout, this, &MultiScreenWorker::onRequestUpdateLayout);
|
connect(this, &MultiScreenWorker::requestUpdateLayout, this, &MultiScreenWorker::onRequestUpdateLayout);
|
||||||
@ -1442,11 +1464,18 @@ void MultiScreenWorker::checkXEventMonitorService()
|
|||||||
{
|
{
|
||||||
auto connectionInit = [ = ](XEventMonitor * eventInter, XEventMonitor * extralEventInter, XEventMonitor * touchEventInter) {
|
auto connectionInit = [ = ](XEventMonitor * eventInter, XEventMonitor * extralEventInter, XEventMonitor * touchEventInter) {
|
||||||
connect(eventInter, &XEventMonitor::CursorMove, this, &MultiScreenWorker::onRegionMonitorChanged);
|
connect(eventInter, &XEventMonitor::CursorMove, this, &MultiScreenWorker::onRegionMonitorChanged);
|
||||||
|
connect(eventInter, &XEventMonitor::CursorOut, this, [ = ] { m_delayWakeOnHideTimer->stop(); });
|
||||||
connect(eventInter, &XEventMonitor::ButtonPress, this, [ = ] { setStates(MousePress, true); });
|
connect(eventInter, &XEventMonitor::ButtonPress, this, [ = ] { setStates(MousePress, true); });
|
||||||
connect(eventInter, &XEventMonitor::ButtonRelease, this, [ = ](int i, int x, int y, const QString &key) {
|
connect(eventInter, &XEventMonitor::ButtonRelease, this, [ = ](int i, int x, int y, const QString &key) {
|
||||||
Q_UNUSED(i);
|
Q_UNUSED(i);
|
||||||
Q_UNUSED(key);
|
Q_UNUSED(key);
|
||||||
setStates(MousePress, false);
|
setStates(MousePress, false);
|
||||||
|
|
||||||
|
// 鼠标松开时,重新计时
|
||||||
|
if (key == m_registerKey) {
|
||||||
|
m_delayWakeOnHideTimer->start();
|
||||||
|
}
|
||||||
|
|
||||||
// 在鼠标拖动任务栏在最大尺寸的时候,如果当前任务栏为隐藏模式(一直隐藏或智能隐藏),在松开鼠标的那一刻,判断当前
|
// 在鼠标拖动任务栏在最大尺寸的时候,如果当前任务栏为隐藏模式(一直隐藏或智能隐藏),在松开鼠标的那一刻,判断当前
|
||||||
// 鼠标位置是否在任务栏外面(isCursorOut(x,y)==true),此时需要触发onExtralRegionMonitorChanged函数,
|
// 鼠标位置是否在任务栏外面(isCursorOut(x,y)==true),此时需要触发onExtralRegionMonitorChanged函数,
|
||||||
// 目的是为了让其触发隐藏
|
// 目的是为了让其触发隐藏
|
||||||
@ -1821,9 +1850,9 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY)
|
|||||||
|
|
||||||
// 任务栏显示状态,但需要切换屏幕
|
// 任务栏显示状态,但需要切换屏幕
|
||||||
if (toScreen != m_ds.current()) {
|
if (toScreen != m_ds.current()) {
|
||||||
if (!m_delayWakeTimer->isActive()) {
|
if (!m_delayWakeOnScreenSwitchTimer->isActive()) {
|
||||||
m_delayScreen = toScreen;
|
m_delayScreen = toScreen;
|
||||||
m_delayWakeTimer->start(Utils::SettingValue("com.deepin.dde.dock.mainwindow", "/com/deepin/dde/dock/mainwindow/", MonitorsSwitchTime, 2000).toInt());
|
m_delayWakeOnScreenSwitchTimer->start(Utils::SettingValue("com.deepin.dde.dock.mainwindow", "/com/deepin/dde/dock/mainwindow/", MonitorsSwitchTime, 2000).toInt());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 任务栏隐藏状态,但需要显示
|
// 任务栏隐藏状态,但需要显示
|
||||||
@ -1838,12 +1867,7 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QRect boundRect = parent()->visibleRegion().boundingRect();
|
m_delayWakeOnHideTimer->start();
|
||||||
qDebug() << "boundRect:" << boundRect;
|
|
||||||
if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide)
|
|
||||||
&& (boundRect.size().isEmpty())) {
|
|
||||||
displayAnimation(m_ds.current(), AniAction::Show);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +247,8 @@ private:
|
|||||||
|
|
||||||
// update monitor info
|
// update monitor info
|
||||||
QTimer *m_monitorUpdateTimer;
|
QTimer *m_monitorUpdateTimer;
|
||||||
QTimer *m_delayWakeTimer; // sp3需求,切换屏幕显示延时,默认2秒唤起任务栏
|
QTimer *m_delayWakeOnScreenSwitchTimer; // sp3需求,切换屏幕显示延时,默认2秒唤起任务栏
|
||||||
|
QTimer *m_delayWakeOnHideTimer; // 任务栏在同一个屏幕隐藏后再唤出时,需要短暂延时
|
||||||
|
|
||||||
DockScreen m_ds; // 屏幕名称信息
|
DockScreen m_ds; // 屏幕名称信息
|
||||||
ScreenChangeMonitor *m_screenMonitor; // 用于监视屏幕是否为系统先拔再插
|
ScreenChangeMonitor *m_screenMonitor; // 用于监视屏幕是否为系统先拔再插
|
||||||
|
Loading…
x
Reference in New Issue
Block a user