From 075844cb8bdec981708ca6d8473b99bac1461430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Wed, 27 Oct 2021 17:15:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E4=B8=AD=E8=B0=83=E6=95=B4=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F=E5=AE=BD=E5=BA=A6=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整位置时通过设置后端的属性,然后dock进行监听到属性变化后,再修改任务栏的位置 Log: Task: https://pms.uniontech.com/zentao/task-view-89698.html Influence: 控制中心中调整任务栏高度,任务栏显示异常 Change-Id: I68c385ba6934146675a2fbb224fe3a80b2362b61 --- frame/util/multiscreenworker.cpp | 43 +++++++++++++++++++ frame/util/multiscreenworker.h | 1 + frame/window/mainwindow.cpp | 36 +++++++++++----- .../module_widget.cpp | 22 ++-------- 4 files changed, 73 insertions(+), 29 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index a0e9d8bc0..d58f13317 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -1334,6 +1334,49 @@ void MultiScreenWorker::checkXEventMonitorService() } } +QRect MultiScreenWorker::getDockShowMinGeometry(const QString &screenName, bool withoutScale) +{ + QRect rect; + const double ratio = withoutScale ? 1 : qApp->devicePixelRatio(); + const int margin = static_cast((m_displayMode == DisplayMode::Fashion ? 10 : 0) * (withoutScale ? qApp->devicePixelRatio() : 1)); + const int dockSize = 40; + + for (auto s : DIS_INS->screens()) { + if (s->name() == screenName) { + // 拿到当前显示器缩放之前的分辨率 + QRect screenRect = s->handle()->geometry(); + + switch (m_position) { + case Position::Top: + rect.setX(static_cast(screenRect.x() + margin)); + rect.setY(static_cast(screenRect.y() + margin)); + rect.setWidth(static_cast(screenRect.width() / ratio - 2 * margin)); + rect.setHeight(dockSize); + break; + case Position::Bottom: + rect.setX(static_cast(screenRect.x() + margin)); + rect.setY(static_cast(screenRect.y() + screenRect.height() / ratio - margin - dockSize)); + rect.setWidth(static_cast(screenRect.width() / ratio - 2 * margin)); + rect.setHeight(dockSize); + break; + case Position::Left: + rect.setX(static_cast(screenRect.x() + margin)); + rect.setY(static_cast(screenRect.y() + margin)); + rect.setWidth(dockSize); + rect.setHeight(static_cast(screenRect.height() / ratio - 2 * margin)); + break; + case Position::Right: + rect.setX(static_cast(screenRect.x() + screenRect.width() / ratio - margin - dockSize)); + rect.setY(static_cast(screenRect.y() + margin)); + rect.setWidth(dockSize); + rect.setHeight(static_cast(screenRect.height() / ratio - 2 * margin)); + break; + } + } + } + return rect; +} + /** * @brief 获取任务栏显示时的参数。目前多屏情况下缩放保持一致,如果后续缩放规则修改,这里需要重新调整 * diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index c5bc9e8f1..1b75e5eeb 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -150,6 +150,7 @@ public: QRect dockRect(const QString &screenName, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode); QRect dockRect(const QString &screenName); + QRect getDockShowMinGeometry(const QString &screenName, bool withoutScale = false); signals: void opacityChanged(const quint8 value) const; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 309d27eb9..7b5626cda 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -467,25 +467,34 @@ void MainWindow::resetDragWindow() void MainWindow::resizeDock(int offset) { - const QRect &rect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen() - , m_multiScreenWorker->position() - , HideMode::KeepShowing, - m_multiScreenWorker->displayMode()); + const QRect &rect = m_multiScreenWorker->getDockShowMinGeometry(m_multiScreenWorker->deskScreen()); QRect newRect; switch (m_multiScreenWorker->position()) { - case Top: + case Top: { + newRect.setX(rect.x()); + newRect.setY(rect.y()); + newRect.setWidth(rect.width()); + newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE)); + } + break; case Bottom: { newRect.setX(rect.x()); - newRect.setY(rect.y() + rect.height() - qBound(MAINWINDOW_MIN_SIZE, rect.height() + offset, MAINWINDOW_MAX_SIZE)); + newRect.setY(rect.y() + rect.height() - qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE)); newRect.setWidth(rect.width()); - newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, rect.height() + offset, MAINWINDOW_MAX_SIZE)); + newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE)); } break; - case Left: - case Right: { - newRect.setX(rect.x() + rect.width() - qBound(MAINWINDOW_MIN_SIZE, rect.width() + offset, MAINWINDOW_MAX_SIZE)); + case Left: { + newRect.setX(rect.x()); newRect.setY(rect.y()); - newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, rect.width() - offset, MAINWINDOW_MAX_SIZE)); + newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE)); + newRect.setHeight(rect.height()); + } + break; + case Right: { + newRect.setX(rect.x() + rect.width() - qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE)); + newRect.setY(rect.y()); + newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE)); newRect.setHeight(rect.height()); } break; @@ -493,7 +502,12 @@ void MainWindow::resizeDock(int offset) // 更新界面大小 m_mainPanel->setFixedSize(newRect.size()); + QEvent event(QEvent::LayoutRequest); + qApp->sendEvent(m_mainPanel, &event); + m_mainPanel->repaint(); setFixedSize(newRect.size()); + qApp->sendEvent(this, &event); + this->repaint(); move(newRect.topLeft()); } diff --git a/plugins/dcc-dock-settings-plugin/module_widget.cpp b/plugins/dcc-dock-settings-plugin/module_widget.cpp index dd14b8be8..28b7502a6 100644 --- a/plugins/dcc-dock-settings-plugin/module_widget.cpp +++ b/plugins/dcc-dock-settings-plugin/module_widget.cpp @@ -76,6 +76,8 @@ ModuleWidget::ModuleWidget(QWidget *parent) , m_dockInter(new DBusInter("com.deepin.dde.Dock", "/com/deepin/dde/Dock", QDBusConnection::sessionBus(), this)) , m_gsettingsWatcher(new GSettingWatcher("com.deepin.dde.control-center", "personalization", this)) { + // 异步,否则频繁调用可能会导致卡顿 + m_daemonDockInter->setSync(false); initUI(); connect(m_dockInter, &DBusInter::pluginVisibleChanged, this, &ModuleWidget::updateItemCheckStatus); @@ -167,22 +169,8 @@ void ModuleWidget::initUI() connect(m_daemonDockInter, &DBusDock::DisplayModeChanged, this, &ModuleWidget::updateSliderValue); connect(m_daemonDockInter, &DBusDock::WindowSizeFashionChanged, this, &ModuleWidget::updateSliderValue); connect(m_daemonDockInter, &DBusDock::WindowSizeEfficientChanged, this, &ModuleWidget::updateSliderValue); - connect(m_sizeSlider->slider(), &DSlider::valueChanged, m_sizeSlider->slider(), &DSlider::sliderMoved); - connect(m_sizeSlider->slider(), &DSlider::sliderMoved, this, [ = ] (int value) { - int lastValue = 0; - if (m_daemonDockInter->displayMode() == DisplayMode::Fashion) { - lastValue = int(m_daemonDockInter->windowSizeFashion()); - } else if (m_daemonDockInter->displayMode() == DisplayMode::Efficient) { - lastValue = int(m_daemonDockInter->windowSizeEfficient()); - } else { - Q_ASSERT_X(false, __FILE__, "not supported"); - } - - // 得到绝对偏移值 - int offset = value - lastValue; - - m_dockInter->resizeDock(offset); - }); + connect(m_sizeSlider->slider(), &DSlider::sliderMoved, m_sizeSlider->slider(), &DSlider::valueChanged); + connect(m_sizeSlider->slider(), &DSlider::valueChanged, m_dockInter, &DBusInter::resizeDock); updateSliderValue(); m_gsettingsWatcher->bind("sizeSlider", m_sizeSlider); @@ -320,8 +308,6 @@ void ModuleWidget::updateSliderValue() } else if (displayMode == DisplayMode::Efficient) { if (int(m_daemonDockInter->windowSizeEfficient()) != m_sizeSlider->slider()->value()) m_sizeSlider->slider()->setValue(int(m_daemonDockInter->windowSizeEfficient())); - } else { - Q_ASSERT_X(false, __FILE__, "not supported"); } m_sizeSlider->slider()->blockSignals(false); }