fix: 解决控制中心中调整任务栏宽度时任务栏位置显示异常问题

调整位置时通过设置后端的属性,然后dock进行监听到属性变化后,再修改任务栏的位置

Log:
Task: https://pms.uniontech.com/zentao/task-view-89698.html
Influence: 控制中心中调整任务栏高度,任务栏显示异常
Change-Id: I68c385ba6934146675a2fbb224fe3a80b2362b61
This commit is contained in:
范朋程 2021-10-27 17:15:24 +08:00
parent 264e4fed8b
commit 075844cb8b
4 changed files with 73 additions and 29 deletions

View File

@ -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<int>((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<int>(screenRect.x() + margin));
rect.setY(static_cast<int>(screenRect.y() + margin));
rect.setWidth(static_cast<int>(screenRect.width() / ratio - 2 * margin));
rect.setHeight(dockSize);
break;
case Position::Bottom:
rect.setX(static_cast<int>(screenRect.x() + margin));
rect.setY(static_cast<int>(screenRect.y() + screenRect.height() / ratio - margin - dockSize));
rect.setWidth(static_cast<int>(screenRect.width() / ratio - 2 * margin));
rect.setHeight(dockSize);
break;
case Position::Left:
rect.setX(static_cast<int>(screenRect.x() + margin));
rect.setY(static_cast<int>(screenRect.y() + margin));
rect.setWidth(dockSize);
rect.setHeight(static_cast<int>(screenRect.height() / ratio - 2 * margin));
break;
case Position::Right:
rect.setX(static_cast<int>(screenRect.x() + screenRect.width() / ratio - margin - dockSize));
rect.setY(static_cast<int>(screenRect.y() + margin));
rect.setWidth(dockSize);
rect.setHeight(static_cast<int>(screenRect.height() / ratio - 2 * margin));
break;
}
}
}
return rect;
}
/**
* @brief
*

View File

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

View File

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

View File

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