From e08e86dbffdc648d5481fa2de9b72c1ceffa489a Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 5 Dec 2022 13:55:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E4=BD=8D=E7=BD=AE=E5=90=8E=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在调整窗口尺寸的时候,同时设置子窗口的尺寸,更新子窗口的布局,保证子窗口在调整位置后正确显示 Log: Influence: 时尚模式下,将任务栏从下方调整在左侧,观察托盘面板显示是否正常 Task: https://pms.uniontech.com/task-view-218981.html Change-Id: Iaa1f62c93b2ca705e212483eee2cdb5894a5a475 --- frame/window/mainpanelcontrol.cpp | 17 +++-- frame/window/traymainwindow.cpp | 2 + frame/window/windowmanager.cpp | 113 +++++++++++++++--------------- frame/window/windowmanager.h | 3 +- 4 files changed, 66 insertions(+), 69 deletions(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 3918c2cac..15a5dc16f 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -175,6 +175,7 @@ void MainPanelControl::initUI() m_toolSonAreaWidget->setLayout(m_toolSonLayout); m_toolSonLayout->setSpacing(0); m_toolSonLayout->setContentsMargins(0, 0, 0, 0); + m_toolSonLayout->setAlignment(Qt::AlignCenter); m_toolAreaLayout->addWidget(m_toolSonAreaWidget); // 添加托盘区域(包括托盘图标和插件)等 @@ -265,7 +266,7 @@ void MainPanelControl::updateMainPanelLayout() */ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg) { - if(m_position == Position::Top || m_position == Position::Bottom) { + if (m_position == Position::Top || m_position == Position::Bottom) { wdg->setMaximumSize(height(),height()); } else { wdg->setMaximumSize(width(),width()); @@ -349,11 +350,9 @@ void MainPanelControl::updateAppAreaSonWidgetSize() if ((m_position == Position::Top) || (m_position == Position::Bottom)) { m_appAreaSonWidget->setMaximumHeight(height()); m_appAreaSonWidget->setMaximumWidth(m_appAreaWidget->width()); - m_recentAreaWidget->setFixedHeight(height()); } else { m_appAreaSonWidget->setMaximumWidth(width()); m_appAreaSonWidget->setMaximumHeight(m_appAreaWidget->height()); - m_recentAreaWidget->setFixedWidth(width()); } m_appAreaSonWidget->adjustSize(); @@ -1299,9 +1298,9 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) // 时尚模式下计算最近打开应用区域的尺寸 if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - m_recentAreaWidget->setFixedWidth(appItemSize * m_recentLayout->count()); + m_recentAreaWidget->setFixedSize(appItemSize * m_recentLayout->count(), QWIDGETSIZE_MAX); else - m_recentAreaWidget->setFixedHeight(appItemSize * m_recentLayout->count()); + m_recentAreaWidget->setFixedSize(QWIDGETSIZE_MAX, appItemSize * m_recentLayout->count()); } if (m_multiWindowLayout->count() > 0) { @@ -1338,16 +1337,16 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) m_toolSonLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - m_toolSonAreaWidget->setFixedWidth(appItemSize * m_toolSonLayout->count()); + m_toolSonAreaWidget->setFixedSize(appItemSize * m_toolSonLayout->count(), QWIDGETSIZE_MAX); } else { - m_toolSonAreaWidget->setFixedHeight(appItemSize * m_toolSonLayout->count()); + m_toolSonAreaWidget->setFixedSize(QWIDGETSIZE_MAX, appItemSize * m_toolSonLayout->count()); } } if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - m_toolAreaWidget->setFixedWidth(m_multiWindowWidget->width() + m_toolSonAreaWidget->width()); + m_toolAreaWidget->setFixedSize(m_multiWindowWidget->width() + m_toolSonAreaWidget->width(), QWIDGETSIZE_MAX); else - m_toolAreaWidget->setFixedHeight(m_multiWindowWidget->height() + m_toolSonAreaWidget->height()); + m_toolAreaWidget->setFixedSize(QWIDGETSIZE_MAX, m_multiWindowWidget->height() + m_toolSonAreaWidget->height()); } else { for (int i = 0; i < m_appAreaSonLayout->count(); ++i) { DockItem *dockItem = qobject_cast(m_appAreaSonLayout->itemAt(i)->widget()); diff --git a/frame/window/traymainwindow.cpp b/frame/window/traymainwindow.cpp index d9356e12b..4c5c77b04 100644 --- a/frame/window/traymainwindow.cpp +++ b/frame/window/traymainwindow.cpp @@ -115,6 +115,7 @@ void TrayMainWindow::updateParentGeometry(const Dock::Position &position, const // 引起无限循环,因此,在设置尺寸的时候阻塞信号,防止进入死循环 m_trayManager->blockSignals(true); m_trayManager->setFixedSize(panelRect.size()); + m_trayManager->updateLayout(); m_trayManager->blockSignals(false); } @@ -127,6 +128,7 @@ void TrayMainWindow::resetPanelGeometry() { m_trayManager->setFixedSize(size()); m_trayManager->move(0, 0); + m_trayManager->updateLayout(); } int TrayMainWindow::dockSpace() const diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 58649f53b..536c3f2ff 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -67,7 +67,9 @@ WindowManager::~WindowManager() void WindowManager::addWindow(MainWindowBase *window) { - connect(window, &MainWindowBase::requestUpdate, this, &WindowManager::onRequestUpdate); + connect(window, &MainWindowBase::requestUpdate, this, [ window, this ] { + updateDockGeometry(window->geometry()); + }); window->setPosition(m_multiScreenWorker->position()); window->setDisplayMode(m_multiScreenWorker->displayMode()); @@ -405,6 +407,57 @@ void WindowManager::RegisterDdeSession() } } +void WindowManager::updateDockGeometry(const QRect &rect) +{ + // 如果当前正在执行动画,则无需设置 + if (m_multiScreenWorker->testState(MultiScreenWorker::ChangePositionAnimationStart) + || m_multiScreenWorker->testState(MultiScreenWorker::ShowAnimationStart) + || m_multiScreenWorker->testState(MultiScreenWorker::HideAnimationStart)) + return; + + QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + + for (MainWindowBase *mainWindow : m_topWindows) { + if (!mainWindow->isVisible()) + continue; + + QRect windowShowSize = mainWindow->getDockGeometry(screen, m_multiScreenWorker->position(), + m_multiScreenWorker->displayMode(), Dock::HideState::Show); + switch(m_position) { + case Dock::Position::Top: { + windowShowSize.setHeight(rect.height()); + break; + } + case Dock::Position::Bottom: { + int bottomY = windowShowSize.y() + windowShowSize.height(); + windowShowSize.setY(bottomY - rect.height()); + windowShowSize.setHeight(rect.height()); + break; + } + case Dock::Position::Left: { + windowShowSize.setWidth(rect.width()); + break; + } + case Dock::Position::Right: { + int righyX = windowShowSize.x() + windowShowSize.width(); + windowShowSize.setX(righyX - rect.width()); + windowShowSize.setWidth(rect.width()); + break; + } + } + + mainWindow->blockSignals(true); + mainWindow->raise(); + mainWindow->setFixedSize(windowShowSize.size()); + mainWindow->move(windowShowSize.topLeft()); + mainWindow->resetPanelGeometry(); + mainWindow->blockSignals(false); + } + + // 抛出geometry变化的信号,通知控制中心调整尺寸 + Q_EMIT panelGeometryChanged(); +} + void WindowManager::initConnection() { connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &WindowManager::onDbusNameOwnerChanged); @@ -503,7 +556,7 @@ void WindowManager::onPlayAnimation(const QString &screenName, const Dock::Posit showAniFinish(); if (updatePos) onPositionChanged(m_multiScreenWorker->position()); - m_multiScreenWorker->setStates(MultiScreenWorker::ShowAnimationStart, false); + m_multiScreenWorker->setStates(MultiScreenWorker::ShowAnimationStart, false); break; case Dock::AniAction::Hide: hideAniFinish(); @@ -752,59 +805,3 @@ void WindowManager::onRequestNotifyWindowManager() static_cast(strutEnd)); // 设置任务栏终点坐标(上下为x,左右为y) } } - -void WindowManager::onRequestUpdate() -{ - // 如果当前正在执行动画,则无需设置 - if (m_multiScreenWorker->testState(MultiScreenWorker::ChangePositionAnimationStart) - || m_multiScreenWorker->testState(MultiScreenWorker::ShowAnimationStart) - || m_multiScreenWorker->testState(MultiScreenWorker::HideAnimationStart)) - return; - - QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); - // 查找发送信号的窗口 - MainWindowBase *dragWindow = qobject_cast(sender()); - if (!dragWindow || !screen) - return; - - QRect dragGeometry = dragWindow->geometry(); - for (MainWindowBase *mainWindow : m_topWindows) { - if (!mainWindow->isVisible()) - continue; - - QRect windowShowSize = mainWindow->getDockGeometry(screen, m_multiScreenWorker->position(), - m_multiScreenWorker->displayMode(), Dock::HideState::Show); - switch(m_position) { - case Dock::Position::Top: { - windowShowSize.setHeight(dragGeometry.height()); - break; - } - case Dock::Position::Bottom: { - int bottomY = windowShowSize.y() + windowShowSize.height(); - windowShowSize.setY(bottomY - dragGeometry.height()); - windowShowSize.setHeight(dragGeometry.height()); - break; - } - case Dock::Position::Left: { - windowShowSize.setWidth(dragGeometry.width()); - break; - } - case Dock::Position::Right: { - int righyX = windowShowSize.x() + windowShowSize.width(); - windowShowSize.setX(righyX - dragGeometry.width()); - windowShowSize.setWidth(dragGeometry.width()); - break; - } - } - - mainWindow->blockSignals(true); - mainWindow->raise(); - mainWindow->setFixedSize(windowShowSize.size()); - mainWindow->move(windowShowSize.topLeft()); - mainWindow->resetPanelGeometry(); - mainWindow->blockSignals(false); - } - - // 抛出geometry变化的信号,通知控制中心调整尺寸 - Q_EMIT panelGeometryChanged(); -} diff --git a/frame/window/windowmanager.h b/frame/window/windowmanager.h index 6b33289d5..9cf681899 100644 --- a/frame/window/windowmanager.h +++ b/frame/window/windowmanager.h @@ -67,10 +67,9 @@ private: QRect getDockGeometry(bool withoutScale = false) const; // 计算左右侧加起来的区域大小 void RegisterDdeSession(); + void updateDockGeometry(const QRect &rect); private Q_SLOTS: - void onRequestUpdate(); // 调整尺寸的时候 - void onUpdateDockGeometry(const Dock::HideMode &hideMode); void onPositionChanged(const Dock::Position &position); void onDisplayModeChanged(const Dock::DisplayMode &displayMode);