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 * @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, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode);
QRect dockRect(const QString &screenName); QRect dockRect(const QString &screenName);
QRect getDockShowMinGeometry(const QString &screenName, bool withoutScale = false);
signals: signals:
void opacityChanged(const quint8 value) const; void opacityChanged(const quint8 value) const;

View File

@ -467,25 +467,34 @@ void MainWindow::resetDragWindow()
void MainWindow::resizeDock(int offset) void MainWindow::resizeDock(int offset)
{ {
const QRect &rect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen() const QRect &rect = m_multiScreenWorker->getDockShowMinGeometry(m_multiScreenWorker->deskScreen());
, m_multiScreenWorker->position()
, HideMode::KeepShowing,
m_multiScreenWorker->displayMode());
QRect newRect; QRect newRect;
switch (m_multiScreenWorker->position()) { 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: { case Bottom: {
newRect.setX(rect.x()); 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.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; break;
case Left: case Left: {
case Right: { newRect.setX(rect.x());
newRect.setX(rect.x() + rect.width() - qBound(MAINWINDOW_MIN_SIZE, rect.width() + offset, MAINWINDOW_MAX_SIZE));
newRect.setY(rect.y()); 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()); newRect.setHeight(rect.height());
} }
break; break;
@ -493,7 +502,12 @@ void MainWindow::resizeDock(int offset)
// 更新界面大小 // 更新界面大小
m_mainPanel->setFixedSize(newRect.size()); m_mainPanel->setFixedSize(newRect.size());
QEvent event(QEvent::LayoutRequest);
qApp->sendEvent(m_mainPanel, &event);
m_mainPanel->repaint();
setFixedSize(newRect.size()); setFixedSize(newRect.size());
qApp->sendEvent(this, &event);
this->repaint();
move(newRect.topLeft()); 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_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_gsettingsWatcher(new GSettingWatcher("com.deepin.dde.control-center", "personalization", this))
{ {
// 异步,否则频繁调用可能会导致卡顿
m_daemonDockInter->setSync(false);
initUI(); initUI();
connect(m_dockInter, &DBusInter::pluginVisibleChanged, this, &ModuleWidget::updateItemCheckStatus); 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::DisplayModeChanged, this, &ModuleWidget::updateSliderValue);
connect(m_daemonDockInter, &DBusDock::WindowSizeFashionChanged, this, &ModuleWidget::updateSliderValue); connect(m_daemonDockInter, &DBusDock::WindowSizeFashionChanged, this, &ModuleWidget::updateSliderValue);
connect(m_daemonDockInter, &DBusDock::WindowSizeEfficientChanged, 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, m_sizeSlider->slider(), &DSlider::valueChanged);
connect(m_sizeSlider->slider(), &DSlider::sliderMoved, this, [ = ] (int value) { connect(m_sizeSlider->slider(), &DSlider::valueChanged, m_dockInter, &DBusInter::resizeDock);
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);
});
updateSliderValue(); updateSliderValue();
m_gsettingsWatcher->bind("sizeSlider", m_sizeSlider); m_gsettingsWatcher->bind("sizeSlider", m_sizeSlider);
@ -320,8 +308,6 @@ void ModuleWidget::updateSliderValue()
} else if (displayMode == DisplayMode::Efficient) { } else if (displayMode == DisplayMode::Efficient) {
if (int(m_daemonDockInter->windowSizeEfficient()) != m_sizeSlider->slider()->value()) if (int(m_daemonDockInter->windowSizeEfficient()) != m_sizeSlider->slider()->value())
m_sizeSlider->slider()->setValue(int(m_daemonDockInter->windowSizeEfficient())); m_sizeSlider->slider()->setValue(int(m_daemonDockInter->windowSizeEfficient()));
} else {
Q_ASSERT_X(false, __FILE__, "not supported");
} }
m_sizeSlider->slider()->blockSignals(false); m_sizeSlider->slider()->blockSignals(false);
} }