feat: 隐藏显示动画调整

任务栏智能隐藏或一直隐藏时,鼠标移动到屏幕边缘过一段时间再唤起任务栏
DConfig配置:delayIntervalOnHide,默认值0,单位毫秒

Log: 隐藏显示动画调整
Change-Id: I3a93a868e790566b6548f83ff740f5913db9bcc8
This commit is contained in:
范朋程 2022-11-24 17:05:32 +08:00 committed by deepin-bot[bot]
parent dc03c4331c
commit 16d8ee9253
3 changed files with 49 additions and 13 deletions

View File

@ -37,6 +37,17 @@
"description":"show(or restore) desktop will toggle after the hover interval (in milliseconds)",
"permissions":"readwrite",
"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"
}
}
}

View File

@ -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_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus(), 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_screenMonitor(new ScreenChangeMonitor(&m_ds, this))
, m_state(AutoHide)
@ -211,7 +212,7 @@ void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString
m_ds.updateDockedScreen(getValidScreen(position()));
// 鼠标移动到任务栏界面之外停止计时器延时2秒改变任务栏所在屏幕
m_delayWakeTimer->stop();
m_delayWakeOnScreenSwitchTimer->stop();
if (m_hideMode == HideMode::KeepShowing
|| ((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->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);
@ -979,7 +989,19 @@ void MultiScreenWorker::initConnection()
connect(this, &MultiScreenWorker::requestNotifyWindowManager, this, &MultiScreenWorker::onRequestNotifyWindowManager);
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);
@ -1442,11 +1464,18 @@ void MultiScreenWorker::checkXEventMonitorService()
{
auto connectionInit = [ = ](XEventMonitor * eventInter, XEventMonitor * extralEventInter, XEventMonitor * touchEventInter) {
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::ButtonRelease, this, [ = ](int i, int x, int y, const QString &key) {
Q_UNUSED(i);
Q_UNUSED(key);
setStates(MousePress, false);
// 鼠标松开时,重新计时
if (key == m_registerKey) {
m_delayWakeOnHideTimer->start();
}
// 在鼠标拖动任务栏在最大尺寸的时候,如果当前任务栏为隐藏模式(一直隐藏或智能隐藏),在松开鼠标的那一刻,判断当前
// 鼠标位置是否在任务栏外面(isCursorOut(x,y)==true)此时需要触发onExtralRegionMonitorChanged函数
// 目的是为了让其触发隐藏
@ -1821,9 +1850,9 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY)
// 任务栏显示状态,但需要切换屏幕
if (toScreen != m_ds.current()) {
if (!m_delayWakeTimer->isActive()) {
if (!m_delayWakeOnScreenSwitchTimer->isActive()) {
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 {
// 任务栏隐藏状态,但需要显示
@ -1838,12 +1867,7 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY)
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);
}
m_delayWakeOnHideTimer->start();
}
}

View File

@ -247,7 +247,8 @@ private:
// update monitor info
QTimer *m_monitorUpdateTimer;
QTimer *m_delayWakeTimer; // sp3需求切换屏幕显示延时默认2秒唤起任务栏
QTimer *m_delayWakeOnScreenSwitchTimer; // sp3需求切换屏幕显示延时默认2秒唤起任务栏
QTimer *m_delayWakeOnHideTimer; // 任务栏在同一个屏幕隐藏后再唤出时,需要短暂延时
DockScreen m_ds; // 屏幕名称信息
ScreenChangeMonitor *m_screenMonitor; // 用于监视屏幕是否为系统先拔再插