mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-02 15:45:21 +00:00
fix: 解决控制中心中调整任务栏宽度时任务栏位置显示异常问题
调整位置时通过设置后端的属性,然后dock进行监听到属性变化后,再修改任务栏的位置 Log: Task: https://pms.uniontech.com/zentao/task-view-89698.html Influence: 控制中心中调整任务栏高度,任务栏显示异常 Change-Id: I68c385ba6934146675a2fbb224fe3a80b2362b61
This commit is contained in:
parent
264e4fed8b
commit
075844cb8b
@ -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 获取任务栏显示时的参数。目前多屏情况下缩放保持一致,如果后续缩放规则修改,这里需要重新调整
|
||||
*
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user