mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-01 07:05:48 +00:00
fix: 修复调整任务栏位置后显示错误的问题
在调整窗口尺寸的时候,同时设置子窗口的尺寸,更新子窗口的布局,保证子窗口在调整位置后正确显示 Log: Influence: 时尚模式下,将任务栏从下方调整在左侧,观察托盘面板显示是否正常 Task: https://pms.uniontech.com/task-view-218981.html Change-Id: Iaa1f62c93b2ca705e212483eee2cdb5894a5a475
This commit is contained in:
parent
5530675d05
commit
e08e86dbff
@ -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());
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user