fix: 修复调整任务栏位置后显示错误的问题

在调整窗口尺寸的时候,同时设置子窗口的尺寸,更新子窗口的布局,保证子窗口在调整位置后正确显示

Log:
Influence: 时尚模式下,将任务栏从下方调整在左侧,观察托盘面板显示是否正常
Task: https://pms.uniontech.com/task-view-218981.html
Change-Id: Iaa1f62c93b2ca705e212483eee2cdb5894a5a475
This commit is contained in:
donghualin 2022-12-05 13:55:03 +08:00
parent 5530675d05
commit e08e86dbff
4 changed files with 66 additions and 69 deletions

View File

@ -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<DockItem *>(m_appAreaSonLayout->itemAt(i)->widget());

View File

@ -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

View File

@ -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<uint>(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<MainWindowBase *>(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();
}

View File

@ -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);