mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +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 获取任务栏显示时的参数。目前多屏情况下缩放保持一致,如果后续缩放规则修改,这里需要重新调整
|
* @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, 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;
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user