feat: 任务栏特效模式集成托盘区域和快捷设置的功能

去掉原来的插件设置区域,将最新的托盘和快捷设置的功能集成进来

Log: 任务栏特效模式集成托盘区域和快捷设置的功能
Influence: v23任务栏特效模式
Task: https://pms.uniontech.com/task-view-112073.html
Change-Id: I985f43d2da28464641fa159c8c6b5040c97e7a49
This commit is contained in:
donghualin 2022-05-12 16:24:54 +08:00
parent 728b700dba
commit 4e7b27a395
6 changed files with 261 additions and 93 deletions

View File

@ -109,7 +109,7 @@ file(GLOB SRC_PATH
add_subdirectory("frame")
add_subdirectory("plugins")
add_subdirectory("tests")
#add_subdirectory("tests")
# Install settings
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)

View File

@ -63,7 +63,7 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *help
initConnection();
initMembers();
initDBus();
initDockMode();
initDisplayData();
initUI();
}
@ -150,8 +150,7 @@ QRect MultiScreenWorker::dockRectWithoutScale(const QString &screenName, const P
{
if (hideMode == HideMode::KeepShowing)
return getDockShowGeometry(screenName, pos, displayMode, true);
else
return getDockHideGeometry(screenName, pos, displayMode, true);
return getDockHideGeometry(screenName, pos, displayMode, true);
}
void MultiScreenWorker::onAutoHideChanged(bool autoHide)
@ -908,6 +907,7 @@ void MultiScreenWorker::initConnection()
connect(qApp, &QApplication::primaryScreenChanged, this, &MultiScreenWorker::primaryScreenChanged);
connect(DIS_INS, &DisplayManager::primaryScreenChanged, this, &MultiScreenWorker::primaryScreenChanged);
connect(DIS_INS, &DisplayManager::screenInfoChanged, this, &MultiScreenWorker::requestUpdateMonitorInfo);
connect(parent()->panel(), &MainPanelControl::sizeChanged, this, [ this ] { resetDockScreen(); });
connect(m_launcherInter, static_cast<void (DBusLuncher::*)(bool) const>(&DBusLuncher::VisibleChanged), this, [ = ](bool value) { setStates(LauncherDisplay, value); });
@ -965,7 +965,7 @@ void MultiScreenWorker::initUI()
QTimer::singleShot(0, this, [ = ] {onOpacityChanged(m_dockInter->opacity());});
}
void MultiScreenWorker::initDBus()
void MultiScreenWorker::initDockMode()
{
if (m_dockInter->isValid()) {
m_position = static_cast<Dock::Position >(m_dockInter->position());
@ -974,6 +974,8 @@ void MultiScreenWorker::initDBus()
m_displayMode = static_cast<Dock::DisplayMode >(m_dockInter->displayMode());
m_opacity = m_dockInter->opacity();
parent()->panel()->setDisplayMode(m_displayMode);
DockItem::setDockPosition(m_position);
qApp->setProperty(PROP_POSITION, QVariant::fromValue(m_position));
DockItem::setDockDisplayMode(m_displayMode);
@ -1000,7 +1002,7 @@ void MultiScreenWorker::initDisplayData()
*/
void MultiScreenWorker::reInitDisplayData()
{
initDBus();
initDockMode();
initDisplayData();
}
@ -1276,7 +1278,8 @@ void MultiScreenWorker::resetDockScreen()
if (testState(ChangePositionAnimationStart)
|| testState(HideAnimationStart)
|| testState(ShowAnimationStart)
|| testState(DockIsShowing))
|| testState(DockIsShowing)
|| testState(DockIsDraging))
return;
m_ds.updateDockedScreen(getValidScreen(position()));
@ -1506,28 +1509,37 @@ QRect MultiScreenWorker::getDockShowGeometry(const QString &screenName, const Po
switch (pos) {
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));
parent()->panel()->setScreenSize(static_cast<int>(screenRect.width()));
rect.setX((static_cast<int>(screenRect.width() / ratio) - parent()->panel()->suitableSize(ratio).width()) / 2);
rect.setY(static_cast<int>((screenRect.y() + margin) / ratio));
rect.setWidth(parent()->panel()->suitableSize(ratio).width());
rect.setHeight(dockSize);
break;
case Position::Bottom:
rect.setX(static_cast<int>(screenRect.x() + margin));
// 先用设置屏幕尺寸理论上不应该在此处设置因为这是在一个get方法里面后续改成直接获取在其他地方设置
parent()->panel()->setScreenSize(static_cast<int>(screenRect.width()));
rect.setX((static_cast<int>(screenRect.width() / ratio) - parent()->panel()->suitableSize(ratio).width()) / 2);
rect.setY(static_cast<int>(screenRect.y() + screenRect.height() / ratio - margin - dockSize));
rect.setWidth(static_cast<int>(screenRect.width() / ratio - 2 * margin));
rect.setWidth(parent()->panel()->suitableSize(ratio).width());
rect.setHeight(dockSize);
break;
case Position::Left:
parent()->panel()->setScreenSize(static_cast<int>(screenRect.height()));
rect.setX(static_cast<int>(screenRect.x() + margin));
rect.setY(static_cast<int>(screenRect.y() + margin));
rect.setY((static_cast<int>(screenRect.height() / ratio) - parent()->panel()->suitableSize(ratio).height()) / 2);
rect.setWidth(dockSize);
rect.setHeight(static_cast<int>(screenRect.height() / ratio - 2 * margin));
rect.setHeight(parent()->panel()->suitableSize(ratio).height());
break;
case Position::Right:
parent()->panel()->setScreenSize(static_cast<int>(screenRect.height()));
rect.setX(static_cast<int>(screenRect.x() + screenRect.width() / ratio - margin - dockSize));
rect.setY(static_cast<int>(screenRect.y() + margin));
rect.setY((static_cast<int>(screenRect.height() / ratio) - parent()->panel()->suitableSize(ratio).height()) / 2);
rect.setWidth(dockSize);
rect.setHeight(static_cast<int>(screenRect.height() / ratio - 2 * margin));
rect.setHeight(parent()->panel()->suitableSize(ratio).height());
break;
}
}

View File

@ -120,6 +120,7 @@ public:
TouchPress = 0x20, // 当前触摸屏下是否按下
LauncherDisplay = 0x40, // 启动器是否显示
DockIsShowing = 0x80, // 任务栏正在显示
DockIsDraging = 0x100, // 任务栏正在拖拽
// 如果要添加新的状态,可以在上面添加
RunState_Mask = 0xffffffff,
@ -214,7 +215,7 @@ private:
MainWindow *parent();
// 初始化数据信息
void initMembers();
void initDBus();
void initDockMode();
void initConnection();
void initUI();
void initDisplayData();

View File

@ -31,6 +31,7 @@
#include "utils.h"
#include "desktop_widget.h"
#include "imageutil.h"
#include "traymanagerwindow.h"
#include <QDrag>
#include <QTimer>
@ -75,6 +76,7 @@ MainPanelControl::MainPanelControl(QWidget *parent)
, m_trayAreaLayout(new QBoxLayout(QBoxLayout::LeftToRight, this))
, m_traySpliter(new QLabel(this))
, m_pluginAreaWidget(new QWidget(this))
, m_trayManagerWidget(new TrayManagerWindow(this))
, m_pluginLayout(new QBoxLayout(QBoxLayout::LeftToRight, this))
, m_desktopWidget(new DesktopWidget(this))
, m_position(Position::Bottom)
@ -82,10 +84,12 @@ MainPanelControl::MainPanelControl(QWidget *parent)
, m_appDragWidget(nullptr)
, m_dislayMode(Efficient)
, m_tray(nullptr)
, m_screenSize(-1)
, m_trashItem(nullptr)
{
initUI();
updateMainPanelLayout();
updateModeChange();
setAcceptDrops(true);
setMouseTracking(true);
@ -141,6 +145,20 @@ void MainPanelControl::initUI()
m_pluginLayout->setContentsMargins(0, 0, 0, 0);
m_mainPanelLayout->addWidget(m_pluginAreaWidget, 0, Qt::AlignCenter);
m_mainPanelLayout->addSpacing(15);
m_mainPanelLayout->addWidget(m_trayManagerWidget);
connect(m_trayManagerWidget, &TrayManagerWindow::sizeChanged, this, [ this ] {
QSize suitableSize = m_trayManagerWidget->suitableSize();
if (m_position == Position::Right || m_position == Position::Left)
m_trayManagerWidget->setFixedSize(width(), suitableSize.height());
else
m_trayManagerWidget->setFixedSize(suitableSize.width(), height());
Q_EMIT sizeChanged();
});
/* 桌面预览 */
m_desktopWidget->setObjectName("showdesktoparea");
m_mainPanelLayout->addWidget(m_desktopWidget);
@ -160,6 +178,7 @@ void MainPanelControl::setDisplayMode(DisplayMode dislayMode)
{
if (dislayMode == m_dislayMode)
return;
m_dislayMode = dislayMode;
updateDisplayMode();
}
@ -176,6 +195,7 @@ void MainPanelControl::updateMainPanelLayout()
m_appAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_pluginAreaWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
m_trayAreaWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
m_trayManagerWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
m_mainPanelLayout->setDirection(QBoxLayout::LeftToRight);
m_fixedAreaLayout->setDirection(QBoxLayout::LeftToRight);
m_pluginLayout->setDirection(QBoxLayout::LeftToRight);
@ -190,6 +210,7 @@ void MainPanelControl::updateMainPanelLayout()
m_appAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_pluginAreaWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
m_trayAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
m_trayManagerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
m_mainPanelLayout->setDirection(QBoxLayout::TopToBottom);
m_fixedAreaLayout->setDirection(QBoxLayout::TopToBottom);
m_pluginLayout->setDirection(QBoxLayout::TopToBottom);
@ -220,6 +241,7 @@ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg)
wdg->setMaximumSize(width(),width());
}
m_fixedAreaLayout->insertWidget(index, wdg);
Q_EMIT sizeChanged();
}
/**往应用区域添加应用
@ -235,6 +257,7 @@ void MainPanelControl::addAppAreaItem(int index, QWidget *wdg)
wdg->setMaximumSize(width(),width());
}
m_appAreaSonLayout->insertWidget(index, wdg);
Q_EMIT sizeChanged();
}
/**往托盘插件区域添加应用
@ -274,6 +297,7 @@ void MainPanelControl::addPluginAreaItem(int index, QWidget *wdg)
void MainPanelControl::removeFixedAreaItem(QWidget *wdg)
{
m_fixedAreaLayout->removeWidget(wdg);
Q_EMIT sizeChanged();
}
/**移除应用区域某一应用
@ -283,6 +307,7 @@ void MainPanelControl::removeFixedAreaItem(QWidget *wdg)
void MainPanelControl::removeAppAreaItem(QWidget *wdg)
{
m_appAreaSonLayout->removeWidget(wdg);
Q_EMIT sizeChanged();
}
/**移除托盘插件区域某一应用
@ -357,7 +382,10 @@ void MainPanelControl::setPositonValue(Dock::Position position)
return;
m_position = position;
QTimer::singleShot(0, this, &MainPanelControl::updateMainPanelLayout);
QMetaObject::invokeMethod(this, [ this ] {
m_trayManagerWidget->setPositon(m_position);
updateMainPanelLayout();
}, Qt::QueuedConnection);
}
/**向任务栏插入各类应用,并将属于同一个应用的窗口合并到同一个应用图标
@ -865,10 +893,22 @@ DockItem *MainPanelControl::dropTargetItem(DockItem *sourceItem, QPoint point)
void MainPanelControl::updateDisplayMode()
{
updateModeChange();
moveAppSonWidget();
resizeDesktopWidget();
}
void MainPanelControl::updateModeChange()
{
m_trayAreaWidget->setVisible(m_dislayMode == DisplayMode::Efficient);
m_traySpliter->setVisible(m_dislayMode == DisplayMode::Efficient);
m_appSpliter->setVisible(m_dislayMode == DisplayMode::Efficient);
m_pluginAreaWidget->setVisible(m_dislayMode == DisplayMode::Efficient);
m_trayManagerWidget->setVisible(m_dislayMode != DisplayMode::Efficient);
if (m_tray)
m_tray->setVisible(m_dislayMode == DisplayMode::Efficient);
}
/**把驻留应用和被打开的应用所在窗口移动到指定位置
* @brief MainPanelControl::moveAppSonWidget
*/
@ -930,6 +970,69 @@ void MainPanelControl::updatePluginsLayout()
}
}
QPainterPath MainPanelControl::areaPath()
{
if (m_dislayMode == DisplayMode::Efficient)
return QPainterPath();
QPainterPath path;
int leftWidth = m_fixedAreaWidget->width() + m_fixedSpliter->width() + m_appAreaWidget->width() + 10;
int roundHeight = height();
path.addRoundedRect(QRect(0, 0, leftWidth, roundHeight), 18, 18);
path.addRoundedRect(QRect(leftWidth + 10, 0, m_trayManagerWidget->width(), roundHeight), 18, 18);
return path;
}
void MainPanelControl::setScreenSize(int size)
{
m_screenSize = size;
}
QSize MainPanelControl::suitableSize(double deviceRatio)
{
if (m_screenSize <= 0)
return QSize(-1, -1);
double ratio = deviceRatio;
if (ratio <= 0)
ratio = qApp->devicePixelRatio();
if (m_dislayMode == DisplayMode::Efficient) {
// 如果是高效模式
if (m_position == Position::Top || m_position == Position::Bottom)
return QSize(static_cast<int>(m_screenSize / ratio), height());
return QSize(width(), static_cast<int>(m_screenSize / ratio));
}
// 如果是特效模式
int totalLength = static_cast<int>(m_screenSize / ratio);
// 减去右侧托盘和快捷设置还有插件区域的尺寸
totalLength -= (((m_position == Position::Top || m_position == Position::Bottom) ? m_trayManagerWidget->width() : m_trayManagerWidget->height()) / ratio);
// 需要参与计算的图标的总数
int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count();
if (iconCount <= 0) {
if (m_position == Position::Top || m_position == Position::Bottom)
return QSize((static_cast<int>((m_trayManagerWidget->width() + 20) / ratio)), height());
return QSize(width(), static_cast<int>((m_trayManagerWidget->height() + 20) / ratio));
}
int yu = (totalLength % iconCount);
// icon宽度 = (总宽度-余数)/icon个数
int iconSize = (totalLength - yu) / iconCount;
if (m_position == Position::Top || m_position == Position::Bottom) {
iconSize = iconSize < height() ? iconSize : height();
return QSize(iconSize * iconCount + static_cast<int>((m_fixedSpliter->width() + m_trayManagerWidget->width() + 20) / ratio),
static_cast<int>(height() / ratio));
}
iconSize = iconSize < width() ? iconSize : width();
return QSize(width(), iconSize * iconCount + static_cast<int>((m_fixedSpliter->height() + m_trayManagerWidget->height() + 20) / ratio));
}
void MainPanelControl::itemUpdated(DockItem *item)
{
item->updateGeometry();
@ -960,89 +1063,120 @@ void MainPanelControl::paintEvent(QPaintEvent *event)
*/
void MainPanelControl::resizeDockIcon()
{
int iconSize = 0;
int tray_item_size = 0;
int iconCount = 0;
// 总宽度
int totalLength = ((m_position == Position::Top) || (m_position == Position::Bottom)) ? width() : height();
if (m_dislayMode == DisplayMode::Fashion) {
int totalLength = m_screenSize;
// 减去右侧托盘和插件区域的宽度
totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? m_trayManagerWidget->width() : m_trayManagerWidget->height();
// 减去托盘间隔区域
if (m_tray) {
totalLength -= (m_tray->trayVisibleItemCount() + 1) * 10;
}
iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count();
// 减去3个分割线的宽度
totalLength -= 3 * SPLITER_SIZE;
if (iconCount <= 0)
return;
// 减去显示桌面图标宽度
totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? m_desktopWidget->width() : m_desktopWidget->height();
// 余数
int yu = (totalLength % iconCount);
// icon宽度 = (总宽度-余数)/icon个数
iconSize = (totalLength - yu) / iconCount;
int pluginItemCount = 0;
int calcPluginItemCount = 0;
// 计算插件图标的最大或最小值
tray_item_size = qBound(20, iconSize, 40);
if ((m_position == Position::Top) || (m_position == Position::Bottom)) {
tray_item_size = qMin(tray_item_size,height());
tray_item_size = std::min(tray_item_size, height() - 20);
} else {
tray_item_size = qMin(tray_item_size,width());
tray_item_size = std::min(tray_item_size, width() - 20);
}
// 因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局
// 因此需要通过多一层布局来获取各插件
for (int i = 0; i < m_pluginLayout->count(); ++ i) {
QLayout *layout = m_pluginLayout->itemAt(i)->layout();
if (layout) {
PluginsItem *w = static_cast<PluginsItem *>(layout->itemAt(0)->widget());
if (w) {
// 如果插件大小由自己决定,则不参与计算需要减去其宽度,其他插件则需要参与计算并计数
if ((m_position == Position::Top || m_position == Position::Bottom) && (w->sizeHint().height() != -1)) {
totalLength -= w->width();
} else if ((m_position == Position::Top || m_position == Position::Bottom) && (w->sizeHint().width() != -1)) {
totalLength -= w->height();
} else {
calcPluginItemCount ++;
if (tray_item_size < 20)
tray_item_size = 20;
// 余数
yu = (totalLength % iconCount);
// icon宽度 = (总宽度-余数)/icon个数
iconSize = (totalLength - yu) / iconCount;
} else {
int totalLength = ((m_position == Position::Top) || (m_position == Position::Bottom)) ? width() : height();
// 减去托盘间隔区域
if (m_tray) {
totalLength -= (m_tray->trayVisibleItemCount() + 1) * 10;
}
// 减去3个分割线的宽度
totalLength -= 3 * SPLITER_SIZE;
// 减去显示桌面图标宽度
totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? m_desktopWidget->width() : m_desktopWidget->height();
int pluginItemCount = 0;
int calcPluginItemCount = 0;
// 因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局
// 因此需要通过多一层布局来获取各插件
for (int i = 0; i < m_pluginLayout->count(); ++ i) {
QLayout *layout = m_pluginLayout->itemAt(i)->layout();
if (layout) {
PluginsItem *w = static_cast<PluginsItem *>(layout->itemAt(0)->widget());
if (w) {
// 如果插件大小由自己决定,则不参与计算需要减去其宽度,其他插件则需要参与计算并计数
if ((m_position == Position::Top || m_position == Position::Bottom) && (w->sizeHint().height() != -1)) {
totalLength -= w->width();
} else if ((m_position == Position::Top || m_position == Position::Bottom) && (w->sizeHint().width() != -1)) {
totalLength -= w->height();
} else {
calcPluginItemCount ++;
}
// 所有插件个数,用于计算插件之间的间隔之和
pluginItemCount ++;
}
// 所有插件个数,用于计算插件之间的间隔之和
pluginItemCount ++;
}
}
// 减去插件间隔大小, 只有一个插件或没有插件都是间隔20,2个或以上每多一个插件多间隔10
if (pluginItemCount > 1)
totalLength -= (pluginItemCount + 1) * 10;
else
totalLength -= 20;
if (totalLength < 0)
return;
// 参与计算的插件的个数包含托盘和插件
int pluginCount = m_tray ? m_tray->trayVisibleItemCount() + calcPluginItemCount : calcPluginItemCount;
// 需要计算的图标总数
int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + pluginCount;
if (iconCount <= 0)
return;
// 余数
int yu = (totalLength % iconCount);
// icon宽度 = (总宽度-余数)/icon个数
iconSize = (totalLength - yu) / iconCount;
// 计算插件图标的最大或最小值
tray_item_size = qBound(20, iconSize, 40);
if ((m_position == Position::Top) || (m_position == Position::Bottom)) {
tray_item_size = qMin(tray_item_size,height());
tray_item_size = std::min(tray_item_size, height() - 20);
} else {
tray_item_size = qMin(tray_item_size,width());
tray_item_size = std::min(tray_item_size, width() - 20);
}
if (tray_item_size < 20)
tray_item_size = 20;
// 减去插件图标的大小后重新计算固定图标和应用图标的平均大小
totalLength -= tray_item_size * pluginCount;
iconCount -= pluginCount;
// 余数
yu = (totalLength % iconCount);
// icon宽度 = (总宽度-余数)/icon个数
iconSize = (totalLength - yu) / iconCount;
}
// 减去插件间隔大小, 只有一个插件或没有插件都是间隔20,2个或以上每多一个插件多间隔10
if (pluginItemCount > 1)
totalLength -= (pluginItemCount + 1) * 10;
else
totalLength -= 20;
if (totalLength < 0)
return;
// 参与计算的插件的个数包含托盘和插件
int pluginCount = m_tray ? m_tray->trayVisibleItemCount() + calcPluginItemCount : calcPluginItemCount;
// 需要计算的图标总数
int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + pluginCount;
if (iconCount <= 0)
return;
// 余数
int yu = (totalLength % iconCount);
// icon宽度 = (总宽度-余数)/icon个数
int iconSize = (totalLength - yu) / iconCount;
// 计算插件图标的最大或最小值
int tray_item_size = qBound(20, iconSize, 40);
if ((m_position == Position::Top) || (m_position == Position::Bottom)) {
tray_item_size = qMin(tray_item_size,height());
tray_item_size = std::min(tray_item_size, height() - 20);
} else {
tray_item_size = qMin(tray_item_size,width());
tray_item_size = std::min(tray_item_size, width() - 20);
}
if (tray_item_size < 20)
tray_item_size = 20;
// 减去插件图标的大小后重新计算固定图标和应用图标的平均大小
totalLength -= tray_item_size * pluginCount;
iconCount -= pluginCount;
// 余数
yu = (totalLength % iconCount);
// icon宽度 = (总宽度-余数)/icon个数
iconSize = (totalLength - yu) / iconCount;
if ((m_position == Position::Top) || (m_position == Position::Bottom)) {
if (iconSize >= height()) {
calcuDockIconSize(height(), height(), tray_item_size);
@ -1107,6 +1241,7 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize)
QLayout *layout = m_pluginLayout->itemAt(i)->layout();
if (layout) {
PluginsItem *pItem = static_cast<PluginsItem *>(layout->itemAt(0)->widget());
qInfo() << pItem->pluginItem()->pluginDisplayName();
if (pItem) {
if (pItem->sizeHint().width() == -1) {
pItem->setFixedSize(traySize, traySize);
@ -1155,10 +1290,14 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize)
*/
void MainPanelControl::resizeDesktopWidget()
{
if (m_position == Position::Right || m_position == Position::Left)
QSize suitableSize = m_trayManagerWidget->suitableSize();
if (m_position == Position::Right || m_position == Position::Left) {
m_desktopWidget->setFixedSize(width(), DESKTOP_SIZE);
else
m_trayManagerWidget->setFixedSize(width(), suitableSize.height());
} else {
m_desktopWidget->setFixedSize(DESKTOP_SIZE, height());
m_trayManagerWidget->setFixedSize(suitableSize.width(), height());
}
if (DisplayMode::Fashion == m_dislayMode)
m_desktopWidget->setFixedSize(0, 0);

View File

@ -38,6 +38,8 @@ class DockItem;
class PlaceholderItem;
class AppDragWidget;
class DesktopWidget;
class TrayManagerWindow;
class MainPanelControl : public QWidget
{
Q_OBJECT
@ -48,6 +50,9 @@ public:
void setDisplayMode(DisplayMode dislayMode);
void resizeDockIcon();
void updatePluginsLayout();
QPainterPath areaPath();
void setScreenSize(int size);
QSize suitableSize(double deviceRatio);
public slots:
void insertItem(const int index, DockItem *item);
@ -57,6 +62,7 @@ public slots:
signals:
void itemMoved(DockItem *sourceItem, DockItem *targetItem);
void itemAdded(const QString &appDesktop, int idx);
void sizeChanged();
private:
void initUI();
@ -64,6 +70,7 @@ private:
void updateMainPanelLayout();
void updateDisplayMode();
void moveAppSonWidget();
void updateModeChange();
void addFixedAreaItem(int index, QWidget *wdg);
void removeFixedAreaItem(QWidget *wdg);
@ -109,6 +116,7 @@ private:
QBoxLayout *m_trayAreaLayout; //
QLabel *m_traySpliter; // 托盘区域与插件区域间的分割线
QWidget *m_pluginAreaWidget; // 插件区域
TrayManagerWindow *m_trayManagerWidget;
QBoxLayout *m_pluginLayout; //
DesktopWidget *m_desktopWidget; // 桌面预览区域
@ -120,6 +128,7 @@ private:
QPoint m_mousePressPos;
TrayPluginItem *m_tray;
int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置
int m_screenSize;
PluginsItem *m_trashItem; // 垃圾箱插件(需要特殊处理一下)
};

View File

@ -315,6 +315,7 @@ void MainWindow::initConnections()
connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
connect(&m_platformWindowHandle, &DPlatformWindowHandle::frameMarginsChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
connect(&m_platformWindowHandle, &DPlatformWindowHandle::windowRadiusChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
connect(m_mainPanel, &MainPanelControl::sizeChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &MainWindow::onDbusNameOwnerChanged);
@ -332,7 +333,10 @@ void MainWindow::initConnections()
connect(m_updateDragAreaTimer, &QTimer::timeout, m_multiScreenWorker, &MultiScreenWorker::onRequestUpdateRegionMonitor);
connect(m_dragWidget, &DragWidget::dragPointOffset, this, [ = ] { qApp->setProperty(DRAG_STATE_PROP, true); });
connect(m_dragWidget, &DragWidget::dragFinished, this, [ = ] { qApp->setProperty(DRAG_STATE_PROP, false); });
connect(m_dragWidget, &DragWidget::dragFinished, this, [ = ] {
m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, false);
qApp->setProperty(DRAG_STATE_PROP, false);
});
connect(m_dragWidget, &DragWidget::dragPointOffset, this, &MainWindow::onMainWindowSizeChanged);
connect(m_dragWidget, &DragWidget::dragFinished, this, &MainWindow::resetDragWindow); // 更新拖拽区域
@ -382,6 +386,8 @@ void MainWindow::adjustShadowMask()
m_platformWindowHandle.setWindowRadius(radius);
m_mainPanel->updatePluginsLayout();
setMaskPath(m_mainPanel->areaPath());
}
void MainWindow::onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner)
@ -560,6 +566,7 @@ void MainWindow::onMainWindowSizeChanged(QPoint offset)
break;
}
m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, true);
// 更新界面大小
m_mainPanel->setFixedSize(newRect.size());
setFixedSize(newRect.size());