dde-dock/frame/util/menuworker.cpp
donghualin 1691e7188c fix: 任务栏代码结构优化解耦
原来的TrayManagerWindow的类是放到MainPanelWindow类里面作为它的一部分,导致窗管在显示的时候有很多问题
修改方案:
1、将左右侧区域拆分成两个窗体,让它们继承自相同的基类MainWindowBase。
2、左右区域公共的部分,例如圆角、展示区域、动画获取等,都在基类中实现或者通过接口返回
3、增加WindowManager类,管理所有的界面,WindowManager类无需知道具体子类的指针,只需要根据相应的接口来获取即可
4、所有的界面类在main.cpp中创建,调用WindowManager对象设置
5、拆分MultiScreenWorker类,使MultiScreenWorker类只关心任务栏相关的逻辑,无需关心窗体或界面

Log: 优化任务栏的显示问题
Influence: 打开任务栏,观察时尚模式下圆角,左右侧区域中间是否连接在一起等
Bug: https://pms.uniontech.com/bug-view-137267.html
Bug: https://pms.uniontech.com/bug-view-140029.html
Bug: https://pms.uniontech.com/bug-view-134527.html
Bug: https://pms.uniontech.com/bug-view-146743.html
Bug: https://pms.uniontech.com/bug-view-150293.html
Change-Id: I4266f6f8c983f61258b92834d93cdacd0221d7de
2022-08-25 19:31:44 +00:00

189 lines
7.0 KiB
C++

/*
* Copyright (C) 2018 ~ 2020 Deepin Technology Co., Ltd.
*
* Author: fanpengcheng <fanpengcheng_cm@deepin.com>
*
* Maintainer: fanpengcheng <fanpengcheng_cm@deepin.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "menuworker.h"
#include "dockitemmanager.h"
#include "utils.h"
#include "displaymanager.h"
#include <QAction>
#include <QMenu>
#include <QGSettings>
#include <DApplication>
#include <DDBusSender>
#define DIS_INS DisplayManager::instance()
MenuWorker::MenuWorker(QObject *parent)
: QObject(parent)
, m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this))
{
}
void MenuWorker::createMenu(QMenu *settingsMenu)
{
settingsMenu->setAccessibleName("settingsmenu");
settingsMenu->setTitle("Settings Menu");
// 模式
const QGSettings *menuSettings = Utils::ModuleSettingsPtr("menu");
if (!menuSettings || !menuSettings->keys().contains("modeVisible") || menuSettings->get("modeVisible").toBool()) {
const DisplayMode displayMode = static_cast<DisplayMode>(m_dockInter->displayMode());
QMenu *modeSubMenu = new QMenu(settingsMenu);
modeSubMenu->setAccessibleName("modesubmenu");
QAction *fashionModeAct = new QAction(tr("Fashion Mode"), this);
QAction *efficientModeAct = new QAction(tr("Efficient Mode"), this);
fashionModeAct->setCheckable(true);
efficientModeAct->setCheckable(true);
fashionModeAct->setChecked(displayMode == Fashion);
efficientModeAct->setChecked(displayMode == Efficient);
connect(fashionModeAct, &QAction::triggered, this, [ = ]{ m_dockInter->setDisplayMode(DisplayMode::Fashion); });
connect(efficientModeAct, &QAction::triggered, this, [ = ]{ m_dockInter->setDisplayMode(DisplayMode::Efficient); });
modeSubMenu->addAction(fashionModeAct);
modeSubMenu->addAction(efficientModeAct);
QAction *act = new QAction(tr("Mode"), this);
act->setMenu(modeSubMenu);
settingsMenu->addAction(act);
}
// 位置
if (!menuSettings || !menuSettings->keys().contains("locationVisible") || menuSettings->get("locationVisible").toBool()) {
const Position position = static_cast<Position>(m_dockInter->position());
QMenu *locationSubMenu = new QMenu(settingsMenu);
locationSubMenu->setAccessibleName("locationsubmenu");
QAction *topPosAct = new QAction(tr("Top"), this);
QAction *bottomPosAct = new QAction(tr("Bottom"), this);
QAction *leftPosAct = new QAction(tr("Left"), this);
QAction *rightPosAct = new QAction(tr("Right"), this);
topPosAct->setCheckable(true);
bottomPosAct->setCheckable(true);
leftPosAct->setCheckable(true);
rightPosAct->setCheckable(true);
topPosAct->setChecked(position == Top);
bottomPosAct->setChecked(position == Bottom);
leftPosAct->setChecked(position == Left);
rightPosAct->setChecked(position == Right);
connect(topPosAct, &QAction::triggered, this, [ = ]{ m_dockInter->setPosition(Top); });
connect(bottomPosAct, &QAction::triggered, this, [ = ]{ m_dockInter->setPosition(Bottom); });
connect(leftPosAct, &QAction::triggered, this, [ = ]{ m_dockInter->setPosition(Left); });
connect(rightPosAct, &QAction::triggered, this, [ = ]{ m_dockInter->setPosition(Right); });
locationSubMenu->addAction(topPosAct);
locationSubMenu->addAction(bottomPosAct);
locationSubMenu->addAction(leftPosAct);
locationSubMenu->addAction(rightPosAct);
QAction *act = new QAction(tr("Location"), this);
act->setMenu(locationSubMenu);
settingsMenu->addAction(act);
}
// 状态
if (!menuSettings || !menuSettings->keys().contains("statusVisible") || menuSettings->get("statusVisible").toBool()) {
const HideMode hideMode = static_cast<HideMode>(m_dockInter->hideMode());
QMenu *statusSubMenu = new QMenu(settingsMenu);
statusSubMenu->setAccessibleName("statussubmenu");
QAction *keepShownAct = new QAction(tr("Keep Shown"), this);
QAction *keepHiddenAct = new QAction(tr("Keep Hidden"), this);
QAction *smartHideAct = new QAction(tr("Smart Hide"), this);
keepShownAct->setCheckable(true);
keepHiddenAct->setCheckable(true);
smartHideAct->setCheckable(true);
keepShownAct->setChecked(hideMode == KeepShowing);
keepHiddenAct->setChecked(hideMode == KeepHidden);
smartHideAct->setChecked(hideMode == SmartHide);
connect(keepShownAct, &QAction::triggered, this, [ = ]{ m_dockInter->setHideMode(KeepShowing); });
connect(keepHiddenAct, &QAction::triggered, this, [ = ]{ m_dockInter->setHideMode(KeepHidden); });
connect(smartHideAct, &QAction::triggered, this, [ = ]{ m_dockInter->setHideMode(SmartHide); });
statusSubMenu->addAction(keepShownAct);
statusSubMenu->addAction(keepHiddenAct);
statusSubMenu->addAction(smartHideAct);
QAction *act = new QAction(tr("Status"), this);
act->setMenu(statusSubMenu);
settingsMenu->addAction(act);
}
// 任务栏配置
if (!menuSettings || !menuSettings->keys().contains("settingVisible") || menuSettings->get("settingVisible").toBool()) {
QAction *act = new QAction(tr("Dock settings"), this);
connect(act, &QAction::triggered, this, &MenuWorker::onDockSettingsTriggered);
settingsMenu->addAction(act);
}
delete menuSettings;
}
void MenuWorker::onDockSettingsTriggered()
{
#ifdef USE_AM
DDBusSender().service("org.deepin.dde.ControlCenter1")
.path("/org/deepin/dde/ControlCenter1")
.interface("org.deepin.dde.ControlCenter1")
.method("ShowPage")
.arg(QString("personalization/desktop/dock"))
.call();
#else
DDBusSender().service("com.deepin.dde.ControlCenter")
.path("/com/deepin/dde/ControlCenter")
.interface("com.deepin.dde.ControlCenter")
.method("ShowPage")
.arg(QString("personalization/dock"))
.call();
#endif
}
void MenuWorker::exec()
{
// 菜单功能被禁用
static const QGSettings *setting = Utils::ModuleSettingsPtr("menu", QByteArray());
if (setting && setting->keys().contains("enable") && !setting->get("enable").toBool()) {
return;
}
QMenu menu;
if (Utils::IS_WAYLAND_DISPLAY)
menu.setWindowFlag(Qt::FramelessWindowHint);
createMenu(&menu);
menu.exec(QCursor::pos());
}