mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-02 15:45:21 +00:00
feat: 任务栏特效模式集成托盘区域和快捷设置的功能
去掉原来的插件设置区域,将最新的托盘和快捷设置的功能集成进来 Log: 任务栏特效模式集成托盘区域和快捷设置的功能 Influence: v23任务栏特效模式 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I985f43d2da28464641fa159c8c6b5040c97e7a49
This commit is contained in:
parent
728b700dba
commit
4e7b27a395
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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; // 垃圾箱插件(需要特殊处理一下)
|
||||
};
|
||||
|
@ -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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user