fix: 修复智能隐藏下切换模式显示错乱的问题

原因:在切换模式的时候,需要重新计算任务栏的大小,但是由于时尚模式和高效模式下的尺寸不一样,所以在计算图标的时候会以切换之前的尺寸为参考来进行计算,导致计算的结果错误
修复:在切换模式的时候,提前设置任务栏的尺寸(上下为高度,左右为宽度),这样在下次计算图标的时候获取到的尺寸始终是以正确的尺寸进行计算,任务栏显示正常

Log: 修复智能隐藏下切换模式显示错乱
Influence: 任务栏设置为智能隐藏,从高效模式切换到时尚模式,观察任务栏显示是否正常
Bug: https://pms.uniontech.com/bug-view-176321.html
Change-Id: Ia66cb3e96d4f42c42acc921315e9457d582a82c1
This commit is contained in:
donghualin 2022-12-12 09:52:52 +00:00
parent 477bc09965
commit 5e4c288cea
14 changed files with 118 additions and 74 deletions

View File

@ -674,7 +674,7 @@ void MultiScreenWorker::resetDockScreen()
if (testState(ChangePositionAnimationStart)
|| testState(HideAnimationStart)
|| testState(ShowAnimationStart)
|| testState(DockIsDraging))
|| Utils::isDraging())
return;
DOCK_SCREEN->updateDockedScreen(getValidScreen(position()));

View File

@ -86,7 +86,6 @@ public:
MousePress = 0x10, // 当前鼠标是否被按下
TouchPress = 0x20, // 当前触摸屏下是否按下
LauncherDisplay = 0x40, // 启动器是否显示
DockIsDraging = 0x80, // 任务栏正在拖拽
// 如果要添加新的状态,可以在上面添加
RunState_Mask = 0xffffffff,

View File

@ -35,6 +35,19 @@ namespace Utils {
const bool IS_WAYLAND_DISPLAY = !qgetenv("WAYLAND_DISPLAY").isEmpty();
inline bool isDraging()
{
if (!qApp->property("isDraging").isValid())
return false;
return qApp->property("isDraging").toBool();
}
inline void setIsDraging(bool isDraging)
{
qApp->setProperty("isDraging", isDraging);
}
/**
* @brief SettingsPtr QGSettings指针
* @param schema_id The id of the schema

View File

@ -392,16 +392,6 @@ void DateTimeDisplayer::leaveEvent(QEvent *event)
m_tipPopupWindow->hide();
}
void DateTimeDisplayer::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event);
int oldSize = m_currentSize;
m_currentSize = (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) ? width() : height();
if (oldSize != m_currentSize)
Q_EMIT requestUpdate();
}
void DateTimeDisplayer::updateLastData(const DateTimeInfo &info)
{
m_lastDateString = info.m_date;

View File

@ -64,7 +64,6 @@ protected:
void paintEvent(QPaintEvent *e) override;
void enterEvent(QEvent *event) override;
void leaveEvent(QEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
private:
void updatePolicy();

View File

@ -51,7 +51,7 @@ DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent)
, m_toolLayout(new QBoxLayout(QBoxLayout::RightToLeft, m_toolWidget))
, m_toolLineLabel(new QLabel(this))
, m_dateTimeWidget(new DateTimeDisplayer(true, this))
, m_systemPuginWidget(new SystemPluginWindow(this))
, m_systemPuginWidget(new SystemPluginWindow(dockInter, this))
, m_quickIconWidget(new QuickPluginWindow(this))
, m_trayView(new TrayGridView(this))
, m_model(TrayModel::getDockModel())

View File

@ -986,13 +986,9 @@ QSize MainPanelControl::suitableSize(const Position &position, int screenSize, d
if (ratio <= 0)
ratio = qApp->devicePixelRatio();
int dockSize = ((position == Position::Top || position == Position::Bottom) ? height() : width());
// 如果实际的尺寸超过了任务栏允许的最大尺寸,此时可能是在发生位置变换,这个时候使用接口获取的尺寸即可
// 如果任务栏在隐藏状态那么此时获取到的高度为0此时从后端获取任务栏的实际高度
HideState hideState = static_cast<HideState>(qApp->property(PROP_HIDE_STATE).toInt());
if (dockSize > DOCK_MAX_SIZE || hideState == HideState::Hide)
dockSize = static_cast<int>((m_displayMode == DisplayMode::Efficient ? m_dockInter->windowSizeEfficient() : m_dockInter->windowSizeFashion()) * qApp->devicePixelRatio());
// 如果当前任务栏正在调整大小,就以当前任务栏的实际尺寸作为它的尺寸,否则,就以后端存储的尺寸作为它计算宽度(上下)或高度(左右)的参考
int dockSize = Utils::isDraging() ? ((position == Position::Top || position == Position::Bottom) ? height() : width())
: (static_cast<int>((m_displayMode == DisplayMode::Efficient ? m_dockInter->windowSizeEfficient() : m_dockInter->windowSizeFashion()) * qApp->devicePixelRatio()));
if (m_displayMode == DisplayMode::Efficient) {
// 如果是高效模式
if (position == Position::Top || position == Position::Bottom)

View File

@ -129,7 +129,7 @@ void MainWindowBase::initConnection()
connect(&m_platformWindowHandle, &DPlatformWindowHandle::windowRadiusChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
connect(m_dragWidget, &DragWidget::dragFinished, this, [ = ] {
m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, false);
Utils::setIsDraging(false);
});
// -拖拽任务栏改变高度或宽度-------------------------------------------------------------------------------
@ -252,7 +252,7 @@ void MainWindowBase::onMainWindowSizeChanged(QPoint offset)
break;
}
m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, true);
Utils::setIsDraging(true);
setFixedSize(newRect.size());
move(newRect.topLeft());

View File

@ -22,6 +22,7 @@
#include "systemplugincontroller.h"
#include "systempluginitem.h"
#include "quicksettingcontroller.h"
#include "utils.h"
#include <DListView>
#include <DGuiApplicationHelper>
@ -35,12 +36,13 @@
#define MINICONSIZE 24
#define ICONMARGIN 8
SystemPluginWindow::SystemPluginWindow(QWidget *parent)
SystemPluginWindow::SystemPluginWindow(DockInter *dockInter, QWidget *parent)
: QWidget(parent)
, m_listView(new DListView(this))
, m_displayMode(Dock::DisplayMode::Efficient)
, m_position(Dock::Position::Bottom)
, m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this))
, m_dockInter(dockInter)
{
initUi();
initConnection();
@ -53,13 +55,20 @@ SystemPluginWindow::~SystemPluginWindow()
void SystemPluginWindow::setDisplayMode(const DisplayMode &displayMode)
{
m_displayMode = displayMode;
QObjectList childObjects = children();
for (QObject *childObject : childObjects) {
StretchPluginsItem *item = qobject_cast<StretchPluginsItem *>(childObject);
if (!item)
continue;
item->setDisplayMode(displayMode);
QList<StretchPluginsItem *> items = stretchItems();
switch (m_position) {
case Dock::Position::Top:
case Dock::Position::Bottom: {
for (StretchPluginsItem *item : items)
item->setDisplayMode(displayMode);
break;
}
case Dock::Position::Left:
case Dock::Position::Right: {
for (StretchPluginsItem *item : items)
item->setDisplayMode(displayMode);
break;
}
}
}
@ -94,28 +103,18 @@ QSize SystemPluginWindow::suitableSize() const
QSize SystemPluginWindow::suitableSize(const Position &position) const
{
QObjectList childs = children();
QList<StretchPluginsItem *> items = stretchItems();
if (position == Dock::Position::Top || position == Dock::Position::Bottom) {
int itemWidth = 0;
for (QObject *childObject : childs) {
StretchPluginsItem *childItem = qobject_cast<StretchPluginsItem *>(childObject);
if (!childItem)
continue;
itemWidth += childItem->suitableSize(position).width();
}
for (StretchPluginsItem *item : items)
itemWidth += item->suitableSize(position).width();
return QSize(itemWidth, QWIDGETSIZE_MAX);
}
int itemHeight = 0;
for (QObject *childObject : childs) {
StretchPluginsItem *item = qobject_cast<StretchPluginsItem *>(childObject);
if (!item)
continue;
for (StretchPluginsItem *item : items)
itemHeight += item->suitableSize(position).height();
}
return QSize(QWIDGETSIZE_MAX, itemHeight);
}
@ -170,7 +169,7 @@ StretchPluginsItem *SystemPluginWindow::findPluginItemWidget(PluginsItemInterfac
void SystemPluginWindow::pluginAdded(PluginsItemInterface *plugin)
{
StretchPluginsItem *item = new StretchPluginsItem(plugin, QuickSettingController::instance()->itemKey(plugin));
StretchPluginsItem *item = new StretchPluginsItem(m_dockInter, plugin, QuickSettingController::instance()->itemKey(plugin));
item->setDisplayMode(m_displayMode);
item->setPosition(m_position);
item->installEventFilter(this);
@ -180,6 +179,20 @@ void SystemPluginWindow::pluginAdded(PluginsItemInterface *plugin)
Q_EMIT itemChanged();
}
QList<StretchPluginsItem *> SystemPluginWindow::stretchItems() const
{
QList<StretchPluginsItem *> items;
QObjectList childObjects = children();
for (QObject *childObject : childObjects) {
StretchPluginsItem *item = qobject_cast<StretchPluginsItem *>(childObject);
if (!item)
continue;
items << item;
}
return items;
}
void SystemPluginWindow::onPluginItemRemoved(PluginsItemInterface *pluginItem)
{
StretchPluginsItem *item = findPluginItemWidget(pluginItem);
@ -204,11 +217,12 @@ void SystemPluginWindow::onPluginItemUpdated(PluginsItemInterface *pluginItem)
Dock::Position StretchPluginsItem::m_position = Dock::Position::Bottom;
StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter, const QString &itemKey, QWidget *parent)
StretchPluginsItem::StretchPluginsItem(DockInter *dockInter, PluginsItemInterface * const pluginInter, const QString &itemKey, QWidget *parent)
: DockItem(parent)
, m_pluginInter(pluginInter)
, m_itemKey(itemKey)
, m_displayMode(Dock::DisplayMode::Efficient)
, m_dockInter(dockInter)
{
}
@ -278,7 +292,6 @@ QSize StretchPluginsItem::suitableSize(const Position &position) const
int textWidth = 0;
if (needShowText())
textWidth = QFontMetrics(textFont(position)).boundingRect(m_pluginInter->pluginDisplayName()).width();
return QSize(qMax(textWidth, iconSize) + (m_displayMode == Dock::DisplayMode::Efficient ? 5 : 10) * 2, -1);
}
@ -318,9 +331,20 @@ bool StretchPluginsItem::needShowText() const
// 如果是高效模式,则不需要显示下面的文本
if (m_displayMode == Dock::DisplayMode::Efficient)
return false;
// 图标的尺寸
#define ICONSIZE 20
// 图标与文本,图标距离上方和文本距离下方的尺寸
#define SPACEMARGIN 6
// 文本的高度
#define TEXTSIZE 14
// 当前插件父窗口与顶层窗口的上下边距
#define OUTMARGIN 7
// 任务栏在上方或者下方显示的时候根据设计图只有在当前区域高度大于50的时候才同时显示文本和图标
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
return height() >= 50;
return ((Utils::isDraging() ? topLevelWidget()->height() : m_dockInter->windowSizeFashion()) >=
(OUTMARGIN * 2 + SPACEMARGIN * 3 + ICONSIZE + TEXTSIZE));
return true;
}

View File

@ -23,6 +23,7 @@
#include "constants.h"
#include "dockitem.h"
#include "dbusutil.h"
#include <QWidget>
@ -39,7 +40,7 @@ class SystemPluginWindow : public QWidget
Q_OBJECT
public:
explicit SystemPluginWindow(QWidget *parent = nullptr);
explicit SystemPluginWindow(DockInter *dockInter, QWidget *parent = nullptr);
~SystemPluginWindow() override;
void setDisplayMode(const Dock::DisplayMode &displayMode);
void setPositon(Dock::Position position);
@ -58,6 +59,7 @@ private:
void initConnection();
StretchPluginsItem *findPluginItemWidget(PluginsItemInterface *pluginItem);
void pluginAdded(PluginsItemInterface *plugin);
QList<StretchPluginsItem *> stretchItems() const;
private Q_SLOTS:
void onPluginItemRemoved(PluginsItemInterface *pluginItem);
@ -68,6 +70,7 @@ private:
Dock::DisplayMode m_displayMode;
Dock::Position m_position;
QBoxLayout *m_mainLayout;
DockInter *m_dockInter;
};
class StretchPluginsItem : public DockItem
@ -75,7 +78,7 @@ class StretchPluginsItem : public DockItem
Q_OBJECT
public:
StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr);
StretchPluginsItem(DockInter *dockInter, PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr);
~StretchPluginsItem() override;
void setDisplayMode(const Dock::DisplayMode &displayMode);
static void setPosition(Dock::Position position);
@ -108,6 +111,7 @@ private:
Dock::DisplayMode m_displayMode;
static Dock::Position m_position;
QPoint m_mousePressPoint;
DockInter *m_dockInter;
};
#endif // SYSTEMPLUGINWINDOW_H

View File

@ -29,6 +29,7 @@
#include "datetimedisplayer.h"
#include "expandiconwidget.h"
#include "quickdragcore.h"
#include "utils.h"
#include <DGuiApplicationHelper>
#include <DRegionMonitor>
@ -43,6 +44,7 @@
#define CRITLCALHEIGHT 42
#define CONTENTSPACE 7
#define SINGLEROWSPACE 4
// 高度小于等于这个值的时候,间距最小值
#define MINHIGHT 46
// 最小值与最大值的差值
@ -53,7 +55,8 @@
TrayManagerWindow::TrayManagerWindow(QWidget *parent)
: QWidget(parent)
, m_appPluginDatetimeWidget(new QWidget(this))
, m_systemPluginWidget(new SystemPluginWindow(this))
, m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this))
, m_systemPluginWidget(new SystemPluginWindow(m_dockInter, this))
, m_appPluginWidget(new QWidget(m_appPluginDatetimeWidget))
, m_quickIconWidget(new QuickPluginWindow(m_appPluginWidget))
, m_dateTimeWidget(new DateTimeDisplayer(false, m_appPluginDatetimeWidget))
@ -65,7 +68,6 @@ TrayManagerWindow::TrayManagerWindow(QWidget *parent)
, m_position(Dock::Position::Bottom)
, m_displayMode(Dock::DisplayMode::Fashion)
, m_splitLine(new QLabel(m_appPluginDatetimeWidget))
, m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this))
, m_singleShow(false)
, m_borderRadius(0)
{
@ -90,11 +92,33 @@ void TrayManagerWindow::updateBorderRadius(int borderRadius)
void TrayManagerWindow::updateLayout()
{
if (!isVisible())
return;
int dockSize = 0;
if (Utils::isDraging()) {
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
dockSize = topLevelWidget()->height();
else
dockSize = topLevelWidget()->width();
} else {
dockSize = m_dockInter->windowSizeFashion();
}
bool lastIsSingle = m_singleShow;
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
m_singleShow = (height() <= CRITLCALHEIGHT);
else
updateItemLayout(dockSize);
// 当插件区域从单行变成两行或者两行变成单行的时候,发送该信号,通知外部重新调整区域大小
if (lastIsSingle != m_singleShow)
Q_EMIT requestUpdate();
}
void TrayManagerWindow::updateItemLayout(int dockSize)
{
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) {
m_singleShow = (dockSize <= CRITLCALHEIGHT);
} else {
m_singleShow = true;
}
if (m_singleShow)
resetSingleDirection();
@ -104,10 +128,6 @@ void TrayManagerWindow::updateLayout()
resetChildWidgetSize();
// 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示
Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0));
// 当插件区域从单行变成两行或者两行变成单行的时候,发送该信号,通知外部重新调整区域大小
if (lastIsSingle != m_singleShow)
Q_EMIT requestUpdate();
}
void TrayManagerWindow::setPositon(Dock::Position position)
@ -136,11 +156,12 @@ void TrayManagerWindow::setPositon(Dock::Position position)
void TrayManagerWindow::setDisplayMode(Dock::DisplayMode displayMode)
{
m_displayMode = displayMode;
// 从时尚模式切换到高效模式的时候,需要重新布局
onTrayCountChanged();
m_systemPluginWidget->setDisplayMode(displayMode);
// 如果当前模式为高效模式则设置当前的trayView为其计算位置的参照
if (displayMode == Dock::DisplayMode::Fashion)
if (displayMode == Dock::DisplayMode::Fashion) {
ExpandIconWidget::popupTrayView()->setReferGridView(m_trayView);
updateItemLayout(m_dockInter->windowSizeFashion());
}
}
int TrayManagerWindow::appDatetimeSize(const Dock::Position &position) const
@ -285,11 +306,9 @@ void TrayManagerWindow::initConnection()
});
connect(m_systemPluginWidget, &SystemPluginWindow::itemChanged, this, [ this ] {
// 当系统插件发生变化的时候,同样需要调整尺寸
m_systemPluginWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
m_systemPluginWidget->setFixedWidth(m_systemPluginWidget->suitableSize().width());
else
else
m_systemPluginWidget->setFixedHeight(m_systemPluginWidget->suitableSize().height());
Q_EMIT requestUpdate();
@ -335,10 +354,8 @@ void TrayManagerWindow::resetChildWidgetSize()
m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), trayHeight);
// 设置右侧的电源按钮的尺寸
m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize());
// 如果顶层窗体的高度为0则直接让其间距为0否则就会出现隐藏模式下有8个像素的高度依然显示
int space = topLevelWidget()->height() == 0 ? 0 : 4;
m_mainLayout->setContentsMargins(space, space, space ,space);
m_mainLayout->setSpacing(space);
m_mainLayout->setContentsMargins(SINGLEROWSPACE, SINGLEROWSPACE, SINGLEROWSPACE, SINGLEROWSPACE);
m_mainLayout->setSpacing(SINGLEROWSPACE);
// 单行显示需要重新设置插件和时间日期的位置,不显示分割线
m_splitLine->setVisible(false);
m_appPluginWidget->move(0, 0);
@ -354,7 +371,7 @@ void TrayManagerWindow::resetChildWidgetSize()
int dateTimeHeight = m_appPluginDatetimeWidget->height() - - m.top() - m.bottom() - trayHeight;
m_dateTimeWidget->setFixedSize(dateTimeWidth, dateTimeHeight);
m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize());
int contentSpace = qMin(MAXDIFF, qMax(height() - MINHIGHT, 0)) + MINSPACE;
int contentSpace = qMin(MAXDIFF, qMax(((Utils::isDraging() ? height() : (int)m_dockInter->windowSizeFashion()) - MINHIGHT), 0)) + MINSPACE;
m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace);
m_mainLayout->setSpacing(contentSpace);
@ -391,7 +408,7 @@ void TrayManagerWindow::resetChildWidgetSize()
m_appPluginWidget->setFixedSize(sizeWidth, trayHeight + quickAreaHeight);
m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize());
int contentSpace = (qMin(MAXDIFF, qMax(width() - MINHIGHT, 0)) + MINSPACE);
int contentSpace = (qMin(MAXDIFF, qMax((Utils::isDraging() ? width() : (int)m_dockInter->windowSizeFashion()) - MINHIGHT, 0)) + MINSPACE);
m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace);
m_mainLayout->setSpacing(contentSpace);

View File

@ -83,12 +83,14 @@ private:
int appDatetimeSize(const Dock::Position &position) const;
QPainterPath roundedPaths();
void updateItemLayout(int dockSize);
private Q_SLOTS:
void onTrayCountChanged();
private:
QWidget *m_appPluginDatetimeWidget;
DockInter *m_dockInter;
SystemPluginWindow *m_systemPluginWidget;
QWidget *m_appPluginWidget;
QuickPluginWindow *m_quickIconWidget;
@ -101,7 +103,6 @@ private:
Dock::Position m_position;
Dock::DisplayMode m_displayMode;
QLabel *m_splitLine;
DockInter *m_dockInter;
bool m_singleShow; // 用于记录当前日期时间和插件区域是显示一行还是显示多行
int m_borderRadius; // 圆角的值
};

View File

@ -170,7 +170,7 @@ void WindowManager::resizeDock(int offset, bool dragging)
if (!screen)
return;
m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, dragging);
Utils::setIsDraging(dragging);
int dockSize = qBound(DOCK_MIN_SIZE, offset, DOCK_MAX_SIZE);
for (MainWindowBase *mainWindow : m_topWindows) {

View File

@ -30,6 +30,7 @@ namespace Dock {
#define DOCK_PLUGIN_API_VERSION "2.0.0"
#define PROP_DISPLAY_MODE "DisplayMode"
#define PROP_DOCK_DRAGING "isDraging"
#define PLUGIN_BACKGROUND_MAX_SIZE 40
#define PLUGIN_BACKGROUND_MIN_SIZE 20