fix(frame): 动画在多屏情况下异常

多屏条件下添加了较多功能,而这些功能发生时改变了dock的一些状态,且这些状态有些有相叠的情况,所以删除了一些状态值,也另添了一些状态值来区分不同情况

Log: 修复任务栏在多屏情况下的一些异常
Bug: https://pms.uniontech.com/zentao/bug-view-34468.html
Bug: https://pms.uniontech.com/zentao/bug-view-34458.html
Bug: https://pms.uniontech.com/zentao/bug-view-34454.html
Bug: https://pms.uniontech.com/zentao/bug-view-33736.html
Bug: https://pms.uniontech.com/zentao/bug-view-33718.html
Bug: https://pms.uniontech.com/zentao/bug-view-33693.html
Bug: https://pms.uniontech.com/zentao/bug-view-32105.html
This commit is contained in:
zhaolong 2020-06-22 18:15:39 +08:00
parent 31aa41978d
commit 00e6e2d6fb
3 changed files with 96 additions and 106 deletions

View File

@ -375,7 +375,6 @@ void DockSettings::menuActionClicked(QAction *action)
if (action == &m_efficientModeAct) if (action == &m_efficientModeAct)
return m_dockInter->setDisplayMode(Efficient); return m_dockInter->setDisplayMode(Efficient);
m_isMouseMoveCause = false;
if (action == &m_topPosAct) if (action == &m_topPosAct)
return m_dockInter->setPosition(Top); return m_dockInter->setPosition(Top);
if (action == &m_bottomPosAct) if (action == &m_bottomPosAct)
@ -423,6 +422,7 @@ void DockSettings::onPositionChanged()
return; return;
m_position = nextPos; m_position = nextPos;
m_isMouseMoveCause = false;
// 位置改变 重新计算可停靠任务栏的位置 // 位置改变 重新计算可停靠任务栏的位置
calculateMultiScreensPos(); calculateMultiScreensPos();
@ -499,8 +499,6 @@ void DockSettings::resetFrontendGeometry()
m_frontendRect = QRect(p.x(), p.y(), w, h); m_frontendRect = QRect(p.x(), p.y(), w, h);
m_dockInter->SetFrontendWindowRect(p.x(), p.y(), w, h); m_dockInter->SetFrontendWindowRect(p.x(), p.y(), w, h);
emit requestUpdateDockGeometry(m_frontendRect);
} }
void DockSettings::updateFrontendGeometry() void DockSettings::updateFrontendGeometry()
@ -847,9 +845,6 @@ void DockSettings::calculateRelativePos(Monitor *s1, Monitor *s2)
if (isAligment) { if (isAligment) {
s1->dockPosition().rightDock = false; s1->dockPosition().rightDock = false;
s2->dockPosition().leftDock = false; s2->dockPosition().leftDock = false;
} else {
s1->dockPosition().rightDock = false;
s2->dockPosition().leftDock = false;
} }
} }
// s1右 s2左 // s1右 s2左
@ -859,9 +854,6 @@ void DockSettings::calculateRelativePos(Monitor *s1, Monitor *s2)
if (isAligment) { if (isAligment) {
s1->dockPosition().leftDock = false; s1->dockPosition().leftDock = false;
s2->dockPosition().rightDock = false; s2->dockPosition().rightDock = false;
} else {
s1->dockPosition().leftDock = false;
s2->dockPosition().rightDock = false;
} }
} }
} }
@ -874,9 +866,6 @@ void DockSettings::calculateRelativePos(Monitor *s1, Monitor *s2)
if (isAligment) { if (isAligment) {
s1->dockPosition().bottomDock = false; s1->dockPosition().bottomDock = false;
s2->dockPosition().topDock = false; s2->dockPosition().topDock = false;
} else {
s1->dockPosition().bottomDock = false;
s2->dockPosition().topDock = false;
} }
} }
// s1下 s2上 // s1下 s2上
@ -886,9 +875,6 @@ void DockSettings::calculateRelativePos(Monitor *s1, Monitor *s2)
if (isAligment) { if (isAligment) {
s1->dockPosition().topDock = false; s1->dockPosition().topDock = false;
s2->dockPosition().bottomDock = false; s2->dockPosition().bottomDock = false;
} else {
s1->dockPosition().topDock = false;
s2->dockPosition().bottomDock = false;
} }
} }
} }

View File

@ -95,7 +95,6 @@ signals:
void trayCountChanged() const; void trayCountChanged() const;
// 分标率发生变化需要更新XEventMonitor的监视区域 // 分标率发生变化需要更新XEventMonitor的监视区域
void requestUpdateRegionWatch(); void requestUpdateRegionWatch();
void requestUpdateDockGeometry(const QRect &rect);
public slots: public slots:
void updateGeometry(); void updateGeometry();

View File

@ -195,23 +195,22 @@ MainWindow::MainWindow(QWidget *parent)
const QRect windowRect = m_settings->windowRect(m_dockPosition, false); const QRect windowRect = m_settings->windowRect(m_dockPosition, false);
switch (m_dockPosition) { switch (m_dockPosition) {
case Dock::Top: case Dock::Top:
m_mainPanel->move(0, val - windowRect.height()); m_mainPanel->move(0, val - windowRect.height());
QWidget::move(windowRect.topLeft()); QWidget::move(windowRect.topLeft());
break; break;
case Dock::Bottom: case Dock::Bottom:
m_mainPanel->move(0, 0); m_mainPanel->move(0, 0);
QWidget::move(windowRect.left(), windowRect.bottom() - val); QWidget::move(windowRect.left(), windowRect.bottom() - val);
break; break;
case Dock::Left: case Dock::Left:
m_mainPanel->move(val - windowRect.width(), 0); m_mainPanel->move(val - windowRect.width(), 0);
QWidget::move(windowRect.topLeft()); QWidget::move(windowRect.topLeft());
break; break;
case Dock::Right: case Dock::Right:
m_mainPanel->move(0, 0); m_mainPanel->move(0, 0);
QWidget::move(windowRect.right() - val, windowRect.top()); QWidget::move(windowRect.right() - val, windowRect.top());
break; break;
Q_UNREACHABLE();
} }
if (m_dockPosition == Dock::Top || m_dockPosition == Dock::Bottom) { if (m_dockPosition == Dock::Top || m_dockPosition == Dock::Bottom) {
@ -231,23 +230,24 @@ MainWindow::MainWindow(QWidget *parent)
const QRect windowRect = m_settings->windowRect(m_dockPosition, false, true); const QRect windowRect = m_settings->windowRect(m_dockPosition, false, true);
const int margin = m_settings->dockMargin(); const int margin = m_settings->dockMargin();
switch (m_dockPosition) { switch (m_dockPosition) {
case Dock::Top: case Dock::Top:
m_mainPanel->move(0, val - windowRect.height()); m_mainPanel->move(0, val - windowRect.height());
QWidget::move(windowRect.left(), windowRect.top() - margin); QWidget::move(windowRect.left(), windowRect.top() - margin);
break; break;
case Dock::Bottom: case Dock::Bottom:
m_mainPanel->move(0, 0); m_mainPanel->move(0, 0);
QWidget::move(windowRect.left(), windowRect.bottom() - val + margin); QWidget::move(windowRect.left(), windowRect.bottom() - val + margin);
break; break;
case Dock::Left: case Dock::Left:
m_mainPanel->move(val - windowRect.width(), 0); m_mainPanel->move(val - windowRect.width(), 0);
QWidget::move(windowRect.left() - margin, windowRect.top()); QWidget::move(windowRect.left() - margin, windowRect.top());
break; break;
case Dock::Right: case Dock::Right:
m_mainPanel->move(0, 0); m_mainPanel->move(0, 0);
QWidget::move(windowRect.right() - val + margin, windowRect.top()); QWidget::move(windowRect.right() - val + margin, windowRect.top());
break; break;
} }
if (m_dockPosition == Dock::Top || m_dockPosition == Dock::Bottom) { if (m_dockPosition == Dock::Top || m_dockPosition == Dock::Bottom) {
QWidget::setFixedHeight(val); QWidget::setFixedHeight(val);
} else { } else {
@ -257,8 +257,8 @@ MainWindow::MainWindow(QWidget *parent)
connect(m_panelShowAni, &QVariantAnimation::finished, [ this ]() { connect(m_panelShowAni, &QVariantAnimation::finished, [ this ]() {
const QRect windowRect = m_settings->windowRect(m_dockPosition); const QRect windowRect = m_settings->windowRect(m_dockPosition);
QWidget::move(windowRect.topLeft());
QWidget::setFixedSize(windowRect.size()); QWidget::setFixedSize(windowRect.size());
QWidget::move(windowRect.topLeft());
m_mainPanel->move(QPoint(0, 0)); m_mainPanel->move(QPoint(0, 0));
qDebug() << "Show animation finished:" << frameGeometry(); qDebug() << "Show animation finished:" << frameGeometry();
qDebug() << "Show animation finished not frame:" << geometry(); qDebug() << "Show animation finished not frame:" << geometry();
@ -271,11 +271,12 @@ MainWindow::MainWindow(QWidget *parent)
m_settings->posChangedUpdateSettings(); m_settings->posChangedUpdateSettings();
const QRect windowRect = m_settings->windowRect(m_dockPosition, true); const QRect windowRect = m_settings->windowRect(m_dockPosition, true);
QWidget::move(windowRect.topLeft());
QWidget::setFixedSize(windowRect.size()); QWidget::setFixedSize(windowRect.size());
QWidget::move(windowRect.topLeft());
m_mainPanel->move(QPoint(0, 0)); m_mainPanel->move(QPoint(0, 0));
qDebug() << "Hide animation finished" << frameGeometry(); qDebug() << "Hide animation finished" << frameGeometry();
qDebug() << "Hide animation finished not frame:" << geometry();
}); });
updateRegionMonitorWatch(); updateRegionMonitorWatch();
@ -296,20 +297,20 @@ void MainWindow::launch()
setVisible(true); setVisible(true);
updatePanelVisible(); updatePanelVisible();
resetPanelEnvironment(); resetPanelEnvironment();
// 用于更新界面的布局方向 // 用于更新mainwindow圆角
m_shadowMaskOptimizeTimer->start(); m_shadowMaskOptimizeTimer->start();
}); });
} }
bool MainWindow::event(QEvent *e) bool MainWindow::event(QEvent *e)
{ {
switch (e->type()) { // switch (e->type()) {
case QEvent::Move: // case QEvent::Move:
if (!e->spontaneous()) // if (!e->spontaneous())
QTimer::singleShot(100, this, &MainWindow::positionCheck); // QTimer::singleShot(100, this, &MainWindow::positionCheck);
break; // break;
default:; // default:;
} // }
return QWidget::event(e); return QWidget::event(e);
} }
@ -318,24 +319,23 @@ void MainWindow::showEvent(QShowEvent *e)
{ {
QWidget::showEvent(e); QWidget::showEvent(e);
// connect(qGuiApp, &QGuiApplication::primaryScreenChanged, // connect(qGuiApp, &QGuiApplication::primaryScreenChanged,
// windowHandle(), [this](QScreen * new_screen) { // windowHandle(), [this](QScreen * new_screen) {
// QScreen *old_screen = windowHandle()->screen(); // QScreen *old_screen = windowHandle()->screen();
// windowHandle()->setScreen(new_screen); // windowHandle()->setScreen(new_screen);
// // 屏幕变化后可能导致控件缩放比变化,此时应该重设控件位置大小 // // 屏幕变化后可能导致控件缩放比变化,此时应该重设控件位置大小
// // 比如:窗口大小为 100 x 100, 显示在缩放比为 1.0 的屏幕上,此时窗口的真实大小 = 100x100 // // 比如:窗口大小为 100 x 100, 显示在缩放比为 1.0 的屏幕上,此时窗口的真实大小 = 100x100
// // 随后窗口被移动到了缩放比为 2.0 的屏幕上,应该将真实大小改为 200x200。另外只能使用 // // 随后窗口被移动到了缩放比为 2.0 的屏幕上,应该将真实大小改为 200x200。另外只能使用
// // QPlatformWindow直接设置大小来绕过QWidget和QWindow对新旧geometry的比较。 // // QPlatformWindow直接设置大小来绕过QWidget和QWindow对新旧geometry的比较。
// const qreal scale = devicePixelRatioF(); // const qreal scale = devicePixelRatioF();
// const QPoint screenPos = new_screen->geometry().topLeft(); // const QPoint screenPos = new_screen->geometry().topLeft();
// const QPoint posInScreen = this->pos() - old_screen->geometry().topLeft(); // const QPoint posInScreen = this->pos() - old_screen->geometry().topLeft();
// const QPoint pos = screenPos + posInScreen * scale; // const QPoint pos = screenPos + posInScreen * scale;
// const QSize size = this->size() * scale; // const QSize size = this->size() * scale;
// windowHandle()->handle()->setGeometry(QRect(pos, size));
// }, Qt::UniqueConnection);
// windowHandle()->handle()->setGeometry(QRect(pos, size)); // windowHandle()->setScreen(qGuiApp->primaryScreen());
// }, Qt::UniqueConnection);
// windowHandle()->setScreen(qGuiApp->primaryScreen());
} }
void MainWindow::mousePressEvent(QMouseEvent *e) void MainWindow::mousePressEvent(QMouseEvent *e)
@ -440,8 +440,7 @@ void MainWindow::compositeChanged()
const int duration = 0; const int duration = 0;
#endif #endif
//TODO 隐藏动画暂时不设置时间了,后面动画相关的代码需要进行重构,目前的逻辑太复杂,不容易分析和定位问题 m_panelHideAni->setDuration(duration);
m_panelHideAni->setDuration(0);
m_panelShowAni->setDuration(duration); m_panelShowAni->setDuration(duration);
m_shadowMaskOptimizeTimer->start(); m_shadowMaskOptimizeTimer->start();
@ -708,7 +707,7 @@ void MainWindow::setStrutPartial()
void MainWindow::expand() void MainWindow::expand()
{ {
qDebug() << "expand"; qDebug() << "expand started";
if (m_panelHideAni->state() == QPropertyAnimation::Running) { if (m_panelHideAni->state() == QPropertyAnimation::Running) {
m_panelHideAni->stop(); m_panelHideAni->stop();
emit m_panelHideAni->finished(); emit m_panelHideAni->finished();
@ -739,6 +738,7 @@ void MainWindow::expand()
m_panelShowAni->setStartValue(startValue); m_panelShowAni->setStartValue(startValue);
m_panelShowAni->setEndValue(endValue); m_panelShowAni->setEndValue(endValue);
m_panelShowAni->start(); m_panelShowAni->start();
qDebug() << "show ani start";
m_shadowMaskOptimizeTimer->start(); m_shadowMaskOptimizeTimer->start();
m_settings->posChangedUpdateSettings(); m_settings->posChangedUpdateSettings();
} }
@ -746,7 +746,7 @@ void MainWindow::expand()
void MainWindow::narrow() void MainWindow::narrow()
{ {
qDebug() << "narrow"; qDebug() << "narrow started";
int startValue = (m_dockPosition == Top || m_dockPosition == Bottom) ? height() : width(); int startValue = (m_dockPosition == Top || m_dockPosition == Bottom) ? height() : width();
qDebug() << "narrow " << "start value:" << startValue; qDebug() << "narrow " << "start value:" << startValue;
@ -838,9 +838,7 @@ void MainWindow::positionCheck()
return; return;
// this may cause some position error and animation caton // this may cause some position error and animation caton
bool isHide = m_settings->hideState() == Hide && !testAttribute(Qt::WA_UnderMouse); // internalMove();
const QRect windowRect = m_settings->windowRect(m_dockPosition, isHide);
internalMove(windowRect.topLeft());
} }
void MainWindow::onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) void MainWindow::onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner)
@ -986,9 +984,24 @@ void MainWindow::onRegionMonitorChanged(int x, int y, const QString &key)
if (!screen) if (!screen)
return; return;
if (Utils::onScreenEdge(QPoint(x, y))) { QRect screenRect = screen->geometry();
qDebug() << "screen not changed"; qDebug() << y << screenRect.y() << screenRect.y() + screenRect.height() / 2;
return; switch (m_dockPosition) {
case Top:
if (y > screenRect.y() + screenRect.height() / 2)
return;
break;
case Bottom:
if (y < screenRect.y() + screenRect.height() / 2)
return;
break;
case Left:
if (x > screenRect.x() + screenRect.width() / 2)
return;
break;
case Right:
if (x < screenRect.x() + screenRect.width() / 2)
return;
} }
if (screen->name() == m_settings->currentDockScreen()) { if (screen->name() == m_settings->currentDockScreen()) {
@ -1003,30 +1016,22 @@ void MainWindow::onRegionMonitorChanged(int x, int y, const QString &key)
} else { } else {
// 移动Dock至相应屏相应位置 // 移动Dock至相应屏相应位置
if (m_settings->setDockScreen(screen->name())) { if (m_settings->setDockScreen(screen->name())) {
if (m_settings->hideMode() == KeepShowing || m_settings->hideMode() == SmartHide) if (m_settings->hideMode() == KeepShowing || m_settings->hideMode() == SmartHide) {
positionChanged(); narrow();
newPositionExpand();
}
else { else {
int screenWidth = screen->size().width(); int screenWidth = screen->size().width();
int screenHeight = screen->size().height(); int screenHeight = screen->size().height();
switch (m_dockPosition) { switch (m_dockPosition) {
case Dock::Top: case Dock::Top:
case Dock::Bottom: { case Dock::Bottom:
// 特殊处理arm机器上setFixedSize响应有点慢能看到明显的界面从短变长的过程 setFixedWidth(screenWidth);
const int height = this->height(); break;
setFixedHeight(0); case Dock::Left:
setFixedWidth(screenWidth); case Dock::Right:
setFixedHeight(height); setFixedHeight(screenHeight);
} break;
break;
case Dock::Left:
case Dock::Right: {
// 同上
const int width = this->width();
setFixedWidth(0);
setFixedHeight(screenHeight);
setFixedWidth(width);
}
break;
} }
expand(); expand();
} }