From 9d811ac826068701b3a723b59720131a2d449642 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 25 Apr 2022 12:53:20 +0800 Subject: [PATCH 001/257] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E5=AF=B9dde-?= =?UTF-8?q?control-center-dev=E5=8C=85=E7=9A=84=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除项目中对dde-control-center-dev包的引用和其他相关的内容 Log: 删除对dde-control-center-dev包的引用 Influence: 无 Task: https://pms.uniontech.com/task-view-114411.html Change-Id: I38323556c35fb5c5ec870207f6fceac082c13099 --- debian/control | 1 - plugins/CMakeLists.txt | 2 +- tests/CMakeLists.txt | 17 ++++++++++------- .../ut_gsettings_watcher.cpp | 13 ++++++++----- .../ut_module_widget.cpp | 6 +++--- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/debian/control b/debian/control index a2b50592b..15fbeab94 100644 --- a/debian/control +++ b/debian/control @@ -26,7 +26,6 @@ Build-Depends: debhelper (>= 8.0.0), libgtest-dev, libgmock-dev, qttools5-dev, - dde-control-center-dev, libxcursor-dev Standards-Version: 3.9.8 Homepage: http://www.deepin.org/ diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 0876aacbb..133748410 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -11,5 +11,5 @@ add_subdirectory("overlay-warning") add_subdirectory("show-desktop") add_subdirectory("multitasking") add_subdirectory("bluetooth") -add_subdirectory("dcc-dock-plugin") +#add_subdirectory("dcc-dock-plugin") add_subdirectory("airplane-mode") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 45994a1c4..bda3e8ace 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -14,19 +14,22 @@ file(GLOB_RECURSE SRCS "../widgets/*.h" "../widgets/*.cpp") +list(REMOVE_ITEM SRCS "plugins/dcc-dock-settings-plugin/*.cpp") + # Sources files file(GLOB_RECURSE PLUGIN_SRCS "../plugins/bluetooth/*.h" "../plugins/bluetooth/*.cpp" "../plugins/bluetooth/componments/*.h" "../plugins/bluetooth/componments/*.cpp" - "../plugins/dcc-dock-plugin/*.h" - "../plugins/dcc-dock-plugin/*.cpp" + #"../plugins/dcc-dock-plugin/*.h" + #"../plugins/dcc-dock-plugin/*.cpp" "../frame/util/horizontalseperator.h" "../frame/util/horizontalseperator.cpp") + # 其包含的"interface/moduleinterface.h"文件中定义了ModuleInterface_iid,任务栏插件框架的interface文件中也有定义 -list(FILTER PLUGIN_SRCS EXCLUDE REGEX "../plugins/dcc-dock-plugin/settings_module.*") +#list(FILTER PLUGIN_SRCS EXCLUDE REGEX "../plugins/dcc-dock-plugin/settings_module.*") # 用于测试覆盖率的编译条件 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -lgcov") @@ -48,7 +51,7 @@ find_package(Qt5DBus REQUIRED) find_package(DtkWidget REQUIRED) find_package(Qt5Svg REQUIRED) find_package(Qt5 COMPONENTS Test REQUIRED) -find_package(DdeControlCenter REQUIRED) +#find_package(DdeControlCenter REQUIRED) find_package(GTest REQUIRED) find_package(GMock REQUIRED) @@ -72,12 +75,12 @@ target_include_directories(${BIN_NAME} PUBLIC ${DFrameworkDBus_INCLUDE_DIRS} ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} - ${DdeControlCenter_INCLUDE_DIR} + #${DdeControlCenter_INCLUDE_DIR} ../interfaces fakedbus ../plugins/bluetooth ../plugins/bluetooth/componments - ../plugins/dcc-dock-plugin + #../plugins/dcc-dock-plugin ) # 链接库 @@ -92,7 +95,7 @@ target_link_libraries(${BIN_NAME} PRIVATE ${Qt5DBus_LIBRARIES} ${QGSettings_LIBRARIES} ${Qt5Svg_LIBRARIES} - ${DdeControlCenter_LIBRARIES} + #${DdeControlCenter_LIBRARIES} ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} -lpthread diff --git a/tests/plugins/dcc-dock-settings-plugin/ut_gsettings_watcher.cpp b/tests/plugins/dcc-dock-settings-plugin/ut_gsettings_watcher.cpp index 8c262d744..f0de0deff 100644 --- a/tests/plugins/dcc-dock-settings-plugin/ut_gsettings_watcher.cpp +++ b/tests/plugins/dcc-dock-settings-plugin/ut_gsettings_watcher.cpp @@ -1,17 +1,17 @@ -#include "config_watcher.h" +//#include "config_watcher.h" #include #include -using namespace dcc_dock_plugin; +//using namespace dcc_dock_plugin; class Test_GSettingWatcher : public QObject, public ::testing::Test {}; TEST_F(Test_GSettingWatcher, bind) { - ConfigWatcher watcher("dde.dock.plugin.dconfig"); +/* ConfigWatcher watcher("dde.dock.plugin.dconfig"); QWidget widget; watcher.bind("Control-Center_Dock_Plugins", &widget); @@ -19,24 +19,27 @@ TEST_F(Test_GSettingWatcher, bind) watcher.bind("invalid", &widget); watcher.bind("", &widget); watcher.bind("", nullptr); + */ } TEST_F(Test_GSettingWatcher, setStatus) { - ConfigWatcher watcher("dde.dock.plugin.dconfig"); +/* ConfigWatcher watcher("dde.dock.plugin.dconfig"); QWidget widget; watcher.bind("Control-Center_Dock_Plugins", &widget); watcher.setStatus("Control-Center_Dock_Plugins", &widget); + */ } TEST_F(Test_GSettingWatcher, onStatusModeChanged) { - ConfigWatcher watcher("dde.dock.plugin.dconfig"); +/* ConfigWatcher watcher("dde.dock.plugin.dconfig"); QWidget widget; watcher.bind("Control-Center_Dock_Plugins", &widget); watcher.onStatusModeChanged("Control-Center_Dock_Plugins"); watcher.onStatusModeChanged("invalid"); watcher.onStatusModeChanged(""); + */ } diff --git a/tests/plugins/dcc-dock-settings-plugin/ut_module_widget.cpp b/tests/plugins/dcc-dock-settings-plugin/ut_module_widget.cpp index 5815110e9..6d47281c7 100644 --- a/tests/plugins/dcc-dock-settings-plugin/ut_module_widget.cpp +++ b/tests/plugins/dcc-dock-settings-plugin/ut_module_widget.cpp @@ -1,4 +1,4 @@ -#include "module_widget.h" +//#include "module_widget.h" #include @@ -9,7 +9,7 @@ class Test_ModuleWidget : public QObject, public ::testing::Test TEST_F(Test_ModuleWidget, updateSliderValue) { - ModuleWidget widget; + //ModuleWidget widget; - widget.updateSliderValue(); + //widget.updateSliderValue(); } From 3f09aabf210492bfeef107dc9f23bba06f9effcb Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 27 Apr 2022 10:16:09 +0800 Subject: [PATCH 002/257] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E5=AF=B9dde-?= =?UTF-8?q?control-center-dev=E5=8C=85=E7=9A=84=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除项目中对dde-control-center-dev包的引用和其他相关的内容 Log: 删除对dde-control-center-dev包的引用 Influence: 无 Task: https://pms.uniontech.com/task-view-114411.html Change-Id: Ide84fd08089a2631492a97836761fdd90762c94c --- debian/control | 7 ------- debian/dcc-dock-plugin.install | 1 - 2 files changed, 8 deletions(-) delete mode 100644 debian/dcc-dock-plugin.install diff --git a/debian/control b/debian/control index 15fbeab94..4c2e53d39 100644 --- a/debian/control +++ b/debian/control @@ -47,7 +47,6 @@ Recommends: dde-disk-mount-plugin, dde-dock-onboard-plugin, dock-network-plugin, - dcc-dock-plugin, dde-network-dialog Conflicts: dde-workspace (<< 2.90.5), @@ -70,9 +69,3 @@ Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, onboard Description: deepin desktop-environment - dock plugin for onboard Dock plugin for onboard of deepin desktop-environment - -Package: dcc-dock-plugin -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, onboard -Description: deepin desktop-environment - dcc plugin for dock settings - Dcc plugin for dock settings of deepin desktop-environment diff --git a/debian/dcc-dock-plugin.install b/debian/dcc-dock-plugin.install deleted file mode 100644 index 140ba65be..000000000 --- a/debian/dcc-dock-plugin.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/dde-control-center/modules/libdcc-dock-plugin.so From 40c2d7ead06ebce75fbfb48439b5018ebf58e100 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 6 May 2022 15:11:40 +0800 Subject: [PATCH 003/257] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除无用运行依赖,直接使用shlibs:Depends即可 Log: 删除无用运行依赖 Influence: 无 Task: https://pms.uniontech.com/task-view-119973.html Change-Id: I57ba8e567d39f0e785a4e3d6ff60e5192697f481 --- debian/control | 4 ---- 1 file changed, 4 deletions(-) diff --git a/debian/control b/debian/control index 4c2e53d39..69391aaab 100644 --- a/debian/control +++ b/debian/control @@ -34,10 +34,6 @@ Package: dde-dock Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, deepin-desktop-schemas (>=5.9.14), - libdtkwidget5 (>=5.4.19), - libdtkcore5 (>=5.4.14), - libdtkgui5 (>=5.4.13), - libdframeworkdbus2 (>=5.4.6), dde-qt5xcb-plugin (>=5.0.25), dde-daemon (>=5.13.12), startdde (>=5.8.9), From d00f484408087cc0aaa6923b3854dae5a99952ca Mon Sep 17 00:00:00 2001 From: Fan PengCheng Date: Tue, 1 Feb 2022 14:57:48 +0800 Subject: [PATCH 004/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A5?= =?UTF-8?q?=E5=8E=86=E5=9B=BE=E6=A0=87=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 某些情况下,日历图标中的3月会显示错位,这部分是因为3月在svg图片中信息和其他月份不一样,当前已修改 Log: 修复部分情况下日历图标显示异常的问题 Influence: 日历图标显示 Task: https://pms.uniontech.com/task-view-122601.html Change-Id: I0bb098e22402c163323f7b89cf0ffd3de25bb044 --- frame/util/themeappicon.cpp | 202 ++++++++++++++++----------------- frame/util/themeappicon.h | 2 +- tests/util/ut_themeappicon.cpp | 3 +- 3 files changed, 101 insertions(+), 106 deletions(-) diff --git a/frame/util/themeappicon.cpp b/frame/util/themeappicon.cpp index 81b667808..349cb8b69 100644 --- a/frame/util/themeappicon.cpp +++ b/frame/util/themeappicon.cpp @@ -95,7 +95,7 @@ bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size, QString name = QStandardPaths::standardLocations(QStandardPaths::TempLocation).first() + "/" + QString::number(QDate::currentDate().year()) + "_" + QString::number(QDate::currentDate().dayOfYear()) + ".svg"; - if (!createCalendarIcon(name)) { + if (!createCalendarIcon(QDate::currentDate(), name)) { qWarning() << "file: "<< name << " ,create failed!"; } @@ -169,128 +169,122 @@ bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size, return ret; } -bool ThemeAppIcon::createCalendarIcon(const QString &fileName) +bool ThemeAppIcon::createCalendarIcon(const QDate &date, const QString &fileName) { - static const QByteArrayList dayList= {"\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" - , "" + static const QByteArrayList &dayList= { "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" }; - static const QByteArrayList monthList= {"\n" - , "\n" - , "\n" - "MAR\n" - "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" + static const QByteArrayList &monthList= { "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" }; - static const QByteArrayList weekList= {"\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - , "\n" - }; + static const QByteArrayList &weekList= { "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n" + , "\n"}; if (!QFile(fileName).exists()) { // create svg QFile file(fileName); - if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; - } - file.write(QByteArray("\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n")); + + file.write(QByteArray("\n" + "\n" + " 0101\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n")); // 日期 - file.write(dayList.at(QDate::currentDate().day() - 1)); - file.write(QByteArray("\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n")); + file.write(" " + dayList.at(date.day() - 1)); + file.write(QByteArray(" \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n")); // 右下角 - file.write(QByteArray("\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n")); + file.write(QByteArray(" \n")); // 背景 - file.write(QByteArray("\n" - " \n" - " \n")); + file.write(QByteArray(" \n" + " \n" + " \n" + " \n" + " \n")); // 月份 - file.write(monthList.at(QDate::currentDate().month() - 1)); + file.write(" " + monthList.at(date.month() - 1)); // 日期 - file.write(QByteArray("\n" - " \n" - " \n" - " \n" - " \n")); + file.write(QByteArray(" \n" + " \n" + " \n" + " \n" + " \n")); // 星期 - file.write(weekList.at(QDate::currentDate().dayOfWeek() - 1)); + file.write(" " + weekList.at(date.dayOfWeek() - 1)); // 右下角 - file.write(QByteArray("\n" - "\n" - "\n" - "\n")); + file.write(QByteArray(" \n" + "")); file.close(); } diff --git a/frame/util/themeappicon.h b/frame/util/themeappicon.h index 35fb218c6..e96687c5f 100644 --- a/frame/util/themeappicon.h +++ b/frame/util/themeappicon.h @@ -35,7 +35,7 @@ public: static bool getIcon(QPixmap &pix, const QString iconName, const int size, bool reObtain = false); private: - static bool createCalendarIcon(const QString &fileName); + static bool createCalendarIcon(const QDate &date, const QString &fileName); }; #endif // THEMEAPPICON_H diff --git a/tests/util/ut_themeappicon.cpp b/tests/util/ut_themeappicon.cpp index 82986ac9a..4a9c6fccb 100644 --- a/tests/util/ut_themeappicon.cpp +++ b/tests/util/ut_themeappicon.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -86,6 +87,6 @@ TEST_F(Ut_ThemeAppIcon, getIcon_test4) TEST_F(Ut_ThemeAppIcon, createCalendarIcon_test) { const QString &filePath = "/tmp/calendar.svg"; - ASSERT_TRUE(ThemeAppIcon::createCalendarIcon(filePath)); + ASSERT_TRUE(ThemeAppIcon::createCalendarIcon(QDate::currentDate(), filePath)); QFile::remove(filePath); } From f3ad519535c6b355e4554eb52b498da52c956e21 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 May 2022 17:35:50 +0800 Subject: [PATCH 005/257] =?UTF-8?q?feat:=20=E5=BF=AB=E6=8D=B7=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=9D=A2=E6=9D=BF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完成快捷设置面板加载插件,显示插件,完成快捷设置的插件的接口 Log: 完成快捷设置面板的基本功能 Influence: v23任务栏快捷设置面板 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: Idaf5c50f8f447d684646afd3ed0fa3e42a94f83c --- CMakeLists.txt | 3 + frame/CMakeLists.txt | 1 + frame/controller/quicksettingcontroller.cpp | 72 +++ frame/controller/quicksettingcontroller.h | 37 ++ frame/item/components/appdrag.cpp | 7 +- frame/item/components/appdrag.h | 2 +- frame/item/components/appdragwidget.cpp | 40 ++ frame/item/components/appdragwidget.h | 20 +- frame/item/dockitem.h | 1 + frame/item/item.qrc | 18 + frame/item/pluginsitem.cpp | 26 + frame/item/pluginsitem.h | 17 + frame/item/quicksettingitem.cpp | 215 +++++++ frame/item/quicksettingitem.h | 44 ++ .../item/resources/ICON_Device_Headphone.svg | 17 + .../resources/ICON_Device_Headphone_dark.svg | 17 + frame/item/resources/ICON_Device_Laptop.svg | 17 + .../resources/ICON_Device_Laptop_dark.svg | 17 + .../item/resources/audio-volume-high-dark.svg | 3 + frame/item/resources/audio-volume-high.svg | 3 + .../item/resources/audio-volume-low-dark.svg | 3 + frame/item/resources/audio-volume-low.svg | 3 + .../resources/audio-volume-medium-dark.svg | 3 + frame/item/resources/audio-volume-medium.svg | 3 + .../resources/audio-volume-muted-dark.svg | 3 + frame/item/resources/audio-volume-muted.svg | 3 + frame/item/resources/brightness.svg | 15 + frame/item/resources/brightnesshigh.svg | 3 + frame/item/resources/brightnesslow.svg | 3 + frame/item/resources/broadcast.svg | 15 + frame/item/resources/laptop.svg | 15 + frame/item/resources/volume.svg | 15 + frame/model/brightnessmodel.cpp | 179 ++++++ frame/model/brightnessmodel.h | 86 +++ frame/model/mediaplayermodel.cpp | 259 ++++++++ frame/model/mediaplayermodel.h | 126 ++++ frame/model/volumemodel.cpp | 589 ++++++++++++++++++ frame/model/volumemodel.h | 141 +++++ .../components/brightnessmonitorwidget.cpp | 171 +++++ .../components/brightnessmonitorwidget.h | 49 ++ frame/window/components/brightnesswidget.cpp | 70 +++ frame/window/components/brightnesswidget.h | 41 ++ frame/window/components/customslider.cpp | 214 +++++++ frame/window/components/customslider.h | 82 +++ frame/window/components/mediawidget.cpp | 178 ++++++ frame/window/components/mediawidget.h | 74 +++ frame/window/components/settingdelegate.cpp | 90 +++ frame/window/components/settingdelegate.h | 27 + .../window/components/volumedeviceswidget.cpp | 206 ++++++ frame/window/components/volumedeviceswidget.h | 50 ++ frame/window/components/volumewidget.cpp | 134 ++++ frame/window/components/volumewidget.h | 45 ++ frame/window/mainpanelcontrol.cpp | 2 + frame/window/quickpluginwindow.cpp | 323 ++++++++++ frame/window/quickpluginwindow.h | 56 ++ frame/window/quicksettingcontainer.cpp | 415 ++++++++++++ frame/window/quicksettingcontainer.h | 122 ++++ interfaces/pluginsiteminterface.h | 30 + 58 files changed, 4416 insertions(+), 4 deletions(-) create mode 100644 frame/controller/quicksettingcontroller.cpp create mode 100644 frame/controller/quicksettingcontroller.h create mode 100644 frame/item/quicksettingitem.cpp create mode 100644 frame/item/quicksettingitem.h create mode 100644 frame/item/resources/ICON_Device_Headphone.svg create mode 100644 frame/item/resources/ICON_Device_Headphone_dark.svg create mode 100644 frame/item/resources/ICON_Device_Laptop.svg create mode 100644 frame/item/resources/ICON_Device_Laptop_dark.svg create mode 100644 frame/item/resources/audio-volume-high-dark.svg create mode 100644 frame/item/resources/audio-volume-high.svg create mode 100644 frame/item/resources/audio-volume-low-dark.svg create mode 100644 frame/item/resources/audio-volume-low.svg create mode 100644 frame/item/resources/audio-volume-medium-dark.svg create mode 100644 frame/item/resources/audio-volume-medium.svg create mode 100644 frame/item/resources/audio-volume-muted-dark.svg create mode 100644 frame/item/resources/audio-volume-muted.svg create mode 100644 frame/item/resources/brightness.svg create mode 100644 frame/item/resources/brightnesshigh.svg create mode 100644 frame/item/resources/brightnesslow.svg create mode 100644 frame/item/resources/broadcast.svg create mode 100644 frame/item/resources/laptop.svg create mode 100644 frame/item/resources/volume.svg create mode 100644 frame/model/brightnessmodel.cpp create mode 100644 frame/model/brightnessmodel.h create mode 100644 frame/model/mediaplayermodel.cpp create mode 100644 frame/model/mediaplayermodel.h create mode 100644 frame/model/volumemodel.cpp create mode 100644 frame/model/volumemodel.h create mode 100644 frame/window/components/brightnessmonitorwidget.cpp create mode 100644 frame/window/components/brightnessmonitorwidget.h create mode 100644 frame/window/components/brightnesswidget.cpp create mode 100644 frame/window/components/brightnesswidget.h create mode 100644 frame/window/components/customslider.cpp create mode 100644 frame/window/components/customslider.h create mode 100644 frame/window/components/mediawidget.cpp create mode 100644 frame/window/components/mediawidget.h create mode 100644 frame/window/components/settingdelegate.cpp create mode 100644 frame/window/components/settingdelegate.h create mode 100644 frame/window/components/volumedeviceswidget.cpp create mode 100644 frame/window/components/volumedeviceswidget.h create mode 100644 frame/window/components/volumewidget.cpp create mode 100644 frame/window/components/volumewidget.h create mode 100644 frame/window/quickpluginwindow.cpp create mode 100644 frame/window/quickpluginwindow.h create mode 100644 frame/window/quicksettingcontainer.cpp create mode 100644 frame/window/quicksettingcontainer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 796ec368b..31900057c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,7 @@ include_directories( frame/item frame/item/components frame/item/resources + frame/model frame/util frame/window frame/window/components @@ -77,6 +78,7 @@ aux_source_directory(frame/dbus DBUS) aux_source_directory(frame/dbus/sni SNI) aux_source_directory(frame/display DISPLAY) aux_source_directory(frame/item ITEM) +aux_source_directory(frame/model MODEL) aux_source_directory(frame/item/components ITEMCOMPONENTS) aux_source_directory(frame/item/resources RESOURCES) aux_source_directory(frame/util UTIL) @@ -91,6 +93,7 @@ file(GLOB SRC_PATH ${SNI} ${DISPLAY} ${ITEM} + ${MODEL} ${ITEMCOMPONENTS} ${UTIL} ${WINDOW} diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index f443efc09..8893e9a99 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -51,6 +51,7 @@ target_include_directories(${BIN_NAME} PUBLIC display item item/components + model util window window/components diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp new file mode 100644 index 000000000..dfb444423 --- /dev/null +++ b/frame/controller/quicksettingcontroller.cpp @@ -0,0 +1,72 @@ +#include "quicksettingcontroller.h" +#include "quicksettingitem.h" + +QuickSettingController::QuickSettingController(QObject *parent) + : AbstractPluginsController(parent) +{ + // 异步加载本地插件 + QMetaObject::invokeMethod(this, &QuickSettingController::startLoader, Qt::QueuedConnection); +} + +QuickSettingController::~QuickSettingController() +{ +} + +void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + QList::iterator findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(), + [ = ](QuickSettingItem *item) { + return item->itemKey() == itemKey; + }); + + if (findItemIterator != m_quickSettingItems.end()) + return; + + QuickSettingItem *quickItem = new QuickSettingItem(itemInter, itemKey); + + m_quickSettingItems << quickItem; + + emit pluginInsert(quickItem); +} + +void QuickSettingController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) +{ + auto findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(), + [ = ](QuickSettingItem *item) { + return item->pluginItem() == itemInter; + }); + if (findItemIterator != m_quickSettingItems.end()) { + QuickSettingItem *settingItem = *findItemIterator; + settingItem->update(); + } +} + +void QuickSettingController::itemRemoved(PluginsItemInterface * const itemInter, const QString &) +{ + // 删除本地记录的插件列表 + QList::iterator findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(), + [ = ](QuickSettingItem *item) { + return (item->pluginItem() == itemInter); + }); + if (findItemIterator != m_quickSettingItems.end()) { + QuickSettingItem *quickItem = *findItemIterator; + m_quickSettingItems.removeOne(quickItem); + Q_EMIT pluginRemove(quickItem); + quickItem->deleteLater(); + } +} + +QuickSettingController *QuickSettingController::instance() +{ + static QuickSettingController instance; + return &instance; +} + +void QuickSettingController::startLoader() +{ + QString pluginsDir("../plugins/quick-trays"); + if (!QDir(pluginsDir).exists()) + pluginsDir = "/usr/lib/dde-dock/plugins/quick-trays"; + + AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); +} diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h new file mode 100644 index 000000000..aaafa91cc --- /dev/null +++ b/frame/controller/quicksettingcontroller.h @@ -0,0 +1,37 @@ +#ifndef QUICKSETTINGCONTROLLER_H +#define QUICKSETTINGCONTROLLER_H + +#include "abstractpluginscontroller.h" + +class QuickSettingItem; + +class QuickSettingController : public AbstractPluginsController +{ + Q_OBJECT + +public: + static QuickSettingController *instance(); + const QList &settingItems() const { return m_quickSettingItems; } + +Q_SIGNALS: + void pluginInsert(QuickSettingItem *); + void pluginRemove(QuickSettingItem *); + +protected: + void startLoader(); + QuickSettingController(QObject *parent = Q_NULLPTR); + ~QuickSettingController() override; + +protected: + void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &) override; + void itemRemoved(PluginsItemInterface * const itemInter, const QString &) override; + void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} + void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} + void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + +private: + QList m_quickSettingItems; +}; + +#endif // CONTAINERPLUGINSCONTROLLER_H diff --git a/frame/item/components/appdrag.cpp b/frame/item/components/appdrag.cpp index 2f3676a47..633cea9e1 100644 --- a/frame/item/components/appdrag.cpp +++ b/frame/item/components/appdrag.cpp @@ -27,10 +27,13 @@ #include -AppDrag::AppDrag(QObject *dragSource) +AppDrag::AppDrag(QObject *dragSource, AppDragWidget *dragWidget) : QDrag(dragSource) - , m_appDragWidget(new AppDragWidget) + , m_appDragWidget(dragWidget) { + if (!m_appDragWidget) + m_appDragWidget = new AppDragWidget; + // delete by itself m_appDragWidget->setVisible(false); diff --git a/frame/item/components/appdrag.h b/frame/item/components/appdrag.h index 98fccdec9..3817a41eb 100644 --- a/frame/item/components/appdrag.h +++ b/frame/item/components/appdrag.h @@ -30,7 +30,7 @@ class AppDrag : public QDrag { public: - explicit AppDrag(QObject *dragSource); + explicit AppDrag(QObject *dragSource, AppDragWidget *dragWidget = Q_NULLPTR); virtual ~AppDrag(); void setPixmap(const QPixmap &); diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index 1054cce09..e01993e33 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -431,3 +431,43 @@ void AppDragWidget::moveEvent(QMoveEvent *event) Q_UNUSED(event); showRemoveTips(); } + +QuickDragWidget::QuickDragWidget(QWidget *parent) + : AppDragWidget(parent) +{ + +} + +QuickDragWidget::~QuickDragWidget() +{ +} + +void QuickDragWidget::dropEvent(QDropEvent *event) +{ + Q_UNUSED(event); + + m_followMouseTimer->stop(); + m_bDragDrop = false; + + if (isRemoveAble(QCursor::pos())) { + if (DWindowManagerHelper::instance()->hasComposite()) + showRemoveAnimation(); + else + hide(); + + m_popupWindow->setVisible(false); + } else { + if (DWindowManagerHelper::instance()->hasComposite()) + showGoBackAnimation(); + else + hide(); + + Q_EMIT requestDropItem(); + } +} + +void QuickDragWidget::dragMoveEvent(QDragMoveEvent *event) +{ + AppDragWidget::dragMoveEvent(event); + requestDragMove(event); +} diff --git a/frame/item/components/appdragwidget.h b/frame/item/components/appdragwidget.h index 63d110805..b799e71f1 100644 --- a/frame/item/components/appdragwidget.h +++ b/frame/item/components/appdragwidget.h @@ -81,6 +81,7 @@ private: class AppDragWidget : public QGraphicsView { Q_OBJECT + public: explicit AppDragWidget(QWidget *parent = Q_NULLPTR); @@ -118,7 +119,7 @@ private: private Q_SLOTS: void onFollowMouse(); -private: +protected: QScopedPointer m_object; QGraphicsScene *m_scene; QTimer *m_followMouseTimer; @@ -144,4 +145,21 @@ private: DockItem *m_item; }; +class QuickDragWidget : public AppDragWidget +{ + Q_OBJECT + +Q_SIGNALS: + void requestDropItem(); + void requestDragMove(QDragMoveEvent *event); + +public: + explicit QuickDragWidget(QWidget *parent = Q_NULLPTR); + ~QuickDragWidget() override; + +protected: + void dropEvent(QDropEvent *event) override; + void dragMoveEvent(QDragMoveEvent *event) override; +}; + #endif /* APPDRAGWIDGET_H */ diff --git a/frame/item/dockitem.h b/frame/item/dockitem.h index 31ac5cd88..b1b7728c8 100644 --- a/frame/item/dockitem.h +++ b/frame/item/dockitem.h @@ -46,6 +46,7 @@ public: FixedPlugin, Placeholder, TrayPlugin, + QuickSettingPlugin }; public: diff --git a/frame/item/item.qrc b/frame/item/item.qrc index 213d454ef..7461879ca 100644 --- a/frame/item/item.qrc +++ b/frame/item/item.qrc @@ -67,5 +67,23 @@ resources/week5.svg resources/week6.svg resources/week7.svg + resources/brightnesshigh.svg + resources/brightnesslow.svg + resources/audio-volume-high-dark.svg + resources/audio-volume-high.svg + resources/audio-volume-low-dark.svg + resources/audio-volume-low.svg + resources/audio-volume-medium.svg + resources/audio-volume-muted-dark.svg + resources/audio-volume-muted.svg + resources/audio-volume-medium-dark.svg + resources/brightness.svg + resources/laptop.svg + resources/volume.svg + resources/broadcast.svg + resources/ICON_Device_Headphone_dark.svg + resources/ICON_Device_Headphone.svg + resources/ICON_Device_Laptop_dark.svg + resources/ICON_Device_Laptop.svg diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index b94d188eb..9ff61e1f9 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -318,3 +318,29 @@ void PluginsItem::setDraging(bool bDrag) m_centralWidget->setVisible(!bDrag); } + +PluginsItemInterface *PluginsItem::pluginItem() const +{ + return m_pluginInter; +} + +StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter, const QString &itemKey, const QString &plginApi, QWidget *parent) + : PluginsItem (pluginInter, itemKey, plginApi, parent) + , m_nameLabel(new QLabel(this)) +{ + m_nameLabel->setText(pluginInter->pluginDisplayName()); + m_nameLabel->setAlignment(Qt::AlignCenter); + QBoxLayout *mainLayout = static_cast(layout()); + mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + mainLayout->addWidget(m_nameLabel); +} + +StretchPluginsItem::~StretchPluginsItem() +{ +} + +void StretchPluginsItem::resizeEvent(QResizeEvent *event) +{ + m_nameLabel->setVisible(height() >= 30); + PluginsItem::resizeEvent(event); +} diff --git a/frame/item/pluginsitem.h b/frame/item/pluginsitem.h index 2f2751091..e08a81f4d 100644 --- a/frame/item/pluginsitem.h +++ b/frame/item/pluginsitem.h @@ -51,6 +51,8 @@ public: virtual void setDraging(bool bDrag) override; + PluginsItemInterface *pluginItem() const; + public slots: void refreshIcon() override; @@ -89,4 +91,19 @@ private: const QGSettings *m_gsettings; }; +class StretchPluginsItem : public PluginsItem +{ + Q_OBJECT + +public: + StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QString &plginApi, QWidget *parent = nullptr); + ~StretchPluginsItem() override; + +protected: + void resizeEvent(QResizeEvent *event) override; + +private: + QLabel *m_nameLabel; +}; + #endif // PLUGINSITEM_H diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp new file mode 100644 index 000000000..0d2da9967 --- /dev/null +++ b/frame/item/quicksettingitem.cpp @@ -0,0 +1,215 @@ +#include "quicksettingitem.h" +#include "pluginsiteminterface.h" + +#include +#include + +#include +#include + +#define ICONWIDTH 24 +#define ICONHEIGHT 24 +#define ICONSPACE 10 +#define RADIUS 8 +#define FONTSIZE 10 + +#define BGWIDTH 128 +#define BGSIZE 36 +#define OPENICONSIZE 12 +static QSize expandSize = QSize(6, 10); + +QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) + : DockItem(parent) + , m_pluginInter(pluginInter) + , m_itemKey(itemKey) +{ + setAcceptDrops(true); + this->installEventFilter(this); +} + +QuickSettingItem::~QuickSettingItem() +{ +} + +PluginsItemInterface *QuickSettingItem::pluginItem() const +{ + return m_pluginInter; +} + +DockItem::ItemType QuickSettingItem::itemType() const +{ + return DockItem::QuickSettingPlugin; +} + +const QPixmap QuickSettingItem::dragPixmap() +{ + QPixmap pm = m_pluginInter->icon()->pixmap(ICONWIDTH, ICONHEIGHT); + + QPainter pa(&pm); + pa.setPen(foregroundColor()); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pm.rect(), foregroundColor()); + + QPixmap pmRet(ICONWIDTH + ICONSPACE + FONTSIZE * 2, ICONHEIGHT + ICONSPACE + FONTSIZE * 2); + pmRet.fill(Qt::transparent); + QPainter paRet(&pmRet); + paRet.drawPixmap(QPoint((ICONSPACE + FONTSIZE * 2) / 2, 0), pm); + paRet.setPen(pa.pen()); + + QFont ft; + ft.setPixelSize(FONTSIZE); + paRet.setFont(ft); + QTextOption option; + option.setAlignment(Qt::AlignTop | Qt::AlignHCenter); + paRet.drawText(QRect(QPoint(0, ICONHEIGHT + ICONSPACE), + QPoint(pmRet.width(), pmRet.height())), m_pluginInter->pluginDisplayName(), option); + return pmRet; +} + +const QString QuickSettingItem::itemKey() const +{ + return m_itemKey; +} + +void QuickSettingItem::paintEvent(QPaintEvent *e) +{ + QWidget::paintEvent(e); + QPainter painter(this); + painter.setRenderHint(QPainter::RenderHint::Antialiasing); + painter.setPen(foregroundColor()); + QPainterPath path; + path.addRoundedRect(rect(), RADIUS, RADIUS); + painter.setClipPath(path); + + // 绘制背景色 + painter.fillRect(rect(), backgroundColor()); + // 让图标填上前景色 + QPixmap pm = m_pluginInter->icon()->pixmap(ICONWIDTH, ICONHEIGHT); + QPainter pa(&pm); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pm.rect(), painter.pen().brush()); + if (m_pluginInter->isPrimary()) { + // 如果是主图标,则显示阴影背景 + int marginXSpace = xMarginSpace(); + int marginYSpace = yMarginSpace(); + QRect iconBg(marginXSpace, marginYSpace, BGSIZE, BGSIZE); + painter.save(); + painter.setPen(Qt::NoPen); + painter.setBrush(shadowColor()); + painter.drawEllipse(iconBg); + painter.restore(); + QRect rctIcon(iconBg.x() + (iconBg.width() - ICONWIDTH) / 2, + iconBg.y() + (iconBg.height() - ICONHEIGHT) / 2, + ICONWIDTH, ICONHEIGHT); + painter.drawPixmap(rctIcon, pm); + // 绘制文字 + painter.setPen(QColor(0, 0, 0)); + + QRect rctPluginName(iconBg.right() + 10, iconBg.top(), BGWIDTH - BGSIZE - OPENICONSIZE - 10 * 2, BGSIZE / 2); + QFont font = DFontSizeManager::instance()->t6(); + font.setBold(true); + painter.setFont(font); + QTextOption textOption; + textOption.setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + QString displayName = QFontMetrics(font).elidedText(m_pluginInter->pluginDisplayName(), Qt::TextElideMode::ElideRight, rctPluginName.width()); + QFontMetrics fm(font); + painter.drawText(rctPluginName, displayName, textOption); + // 绘制下方啊的状态文字 + QRect rctPluginStatus(rctPluginName.x(), rctPluginName.bottom() + 1, + rctPluginName.width(), BGSIZE / 2); + font = DFontSizeManager::instance()->t10(); + painter.setFont(font); + QString description = QFontMetrics(font).elidedText(m_pluginInter->description(), Qt::TextElideMode::ElideRight, rctPluginStatus.width()); + painter.drawText(rctPluginStatus, description, textOption); + // 绘制右侧的展开按钮 + QPen pen; + pen.setColor(QColor(0, 0, 0)); + pen.setWidth(2); + painter.setPen(pen); + int iconLeft = rect().width() - marginXSpace - expandSize.width(); + int iconRight = rect().width() - marginXSpace; + painter.drawLine(QPoint(iconLeft, (rctIcon.y() + (rctIcon.height() - expandSize.height()) / 2)), + QPoint(iconRight, (rctIcon.y() + rctIcon.height() / 2))); + painter.drawLine(QPoint(iconRight, (rctIcon.y() + rctIcon.height() / 2)), + QPoint(iconLeft, (rctIcon.y() + (rctIcon.height() + expandSize.height()) / 2))); + } else { + // 绘制图标 + QRect rctIcon = iconRect(); + painter.drawPixmap(rctIcon, pm); + // 绘制文字 + QFont ft; + ft.setPixelSize(FONTSIZE); + painter.setFont(ft); + QTextOption option; + option.setAlignment(Qt::AlignTop | Qt::AlignHCenter); + painter.drawText(QRect(QPoint(0, rctIcon.top() + ICONHEIGHT + ICONSPACE), + QPoint(width(), height())), m_pluginInter->pluginDisplayName(), option); + } +} + +QRect QuickSettingItem::iconRect() +{ + int left = (width() - ICONWIDTH) / 2; + int top = (height() - ICONHEIGHT - ICONSPACE - 10) / 2; + return QRect(left, top, ICONWIDTH, ICONHEIGHT); +} + +QColor QuickSettingItem::foregroundColor() const +{ + // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 + if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) + return QColor(0, 129, 255); + + if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Deactive) + return QColor(51, 51, 51); + + return QColor(181, 181, 181); +} + +QColor QuickSettingItem::backgroundColor() const +{ + // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 + if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) + return QColor(250, 250, 252); + + return QColor(241, 241, 246); +} + +QColor QuickSettingItem::shadowColor() const +{ + // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 + if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) + return QColor(217, 219, 226); + + return QColor(199, 203, 222); +} + +void QuickSettingItem::mouseReleaseEvent(QMouseEvent *event) +{ + // 如果是鼠标的按下事件 + if (m_pluginInter->isPrimary()) { + QMouseEvent *mouseEvent = static_cast(event); + QRect rctExpand(rect().width() - xMarginSpace() - expandSize.width(), + (rect().height() - expandSize.height()) / 2, + expandSize.width(), expandSize.height()); + if (rctExpand.contains(mapFromGlobal(mouseEvent->globalPos()))) + Q_EMIT detailClicked(m_pluginInter); + } else { + const QString command = m_pluginInter->itemCommand(m_itemKey); + if (!command.isEmpty()) + QProcess::startDetached(command); + + if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey)) + showPopupApplet(w); + } +} + +int QuickSettingItem::xMarginSpace() +{ + return (rect().width() - BGWIDTH) / 2; +} + +int QuickSettingItem::yMarginSpace() +{ + return (rect().height() - BGSIZE) / 2; +} diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h new file mode 100644 index 000000000..185000415 --- /dev/null +++ b/frame/item/quicksettingitem.h @@ -0,0 +1,44 @@ +#ifndef QUICKSETTINGITEM_H +#define QUICKSETTINGITEM_H + +#include "dockitem.h" + +class PluginsItemInterface; + +class QuickSettingItem : public DockItem +{ + Q_OBJECT + + friend class QuickSettingController; + +Q_SIGNALS: + void detailClicked(PluginsItemInterface *); + +public: + PluginsItemInterface *pluginItem() const; + ItemType itemType() const override; + const QPixmap dragPixmap(); + const QString itemKey() const; + +protected: + QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + ~QuickSettingItem() override; + + void paintEvent(QPaintEvent *e) override; + QRect iconRect(); + QColor foregroundColor() const; + QColor backgroundColor() const; + QColor shadowColor() const; + + void mouseReleaseEvent(QMouseEvent *event) override; + +private: + int xMarginSpace(); + int yMarginSpace(); + +private: + PluginsItemInterface *m_pluginInter; + QString m_itemKey; +}; + +#endif // QUICKSETTINGITEM_H diff --git a/frame/item/resources/ICON_Device_Headphone.svg b/frame/item/resources/ICON_Device_Headphone.svg new file mode 100644 index 000000000..c2aeaccf2 --- /dev/null +++ b/frame/item/resources/ICON_Device_Headphone.svg @@ -0,0 +1,17 @@ + + + -mockplus- + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/item/resources/ICON_Device_Headphone_dark.svg b/frame/item/resources/ICON_Device_Headphone_dark.svg new file mode 100644 index 000000000..7c797d1e1 --- /dev/null +++ b/frame/item/resources/ICON_Device_Headphone_dark.svg @@ -0,0 +1,17 @@ + + + -mockplus- + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/item/resources/ICON_Device_Laptop.svg b/frame/item/resources/ICON_Device_Laptop.svg new file mode 100644 index 000000000..115314c7c --- /dev/null +++ b/frame/item/resources/ICON_Device_Laptop.svg @@ -0,0 +1,17 @@ + + + -mockplus- + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/item/resources/ICON_Device_Laptop_dark.svg b/frame/item/resources/ICON_Device_Laptop_dark.svg new file mode 100644 index 000000000..3ba0d45f1 --- /dev/null +++ b/frame/item/resources/ICON_Device_Laptop_dark.svg @@ -0,0 +1,17 @@ + + + -mockplus- + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/item/resources/audio-volume-high-dark.svg b/frame/item/resources/audio-volume-high-dark.svg new file mode 100644 index 000000000..4d4091a65 --- /dev/null +++ b/frame/item/resources/audio-volume-high-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/audio-volume-high.svg b/frame/item/resources/audio-volume-high.svg new file mode 100644 index 000000000..81e42bb50 --- /dev/null +++ b/frame/item/resources/audio-volume-high.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/audio-volume-low-dark.svg b/frame/item/resources/audio-volume-low-dark.svg new file mode 100644 index 000000000..2a1451bd7 --- /dev/null +++ b/frame/item/resources/audio-volume-low-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/audio-volume-low.svg b/frame/item/resources/audio-volume-low.svg new file mode 100644 index 000000000..67caf09c3 --- /dev/null +++ b/frame/item/resources/audio-volume-low.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/audio-volume-medium-dark.svg b/frame/item/resources/audio-volume-medium-dark.svg new file mode 100644 index 000000000..aa30f960f --- /dev/null +++ b/frame/item/resources/audio-volume-medium-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/audio-volume-medium.svg b/frame/item/resources/audio-volume-medium.svg new file mode 100644 index 000000000..1558aff33 --- /dev/null +++ b/frame/item/resources/audio-volume-medium.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/audio-volume-muted-dark.svg b/frame/item/resources/audio-volume-muted-dark.svg new file mode 100644 index 000000000..1b62397ef --- /dev/null +++ b/frame/item/resources/audio-volume-muted-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/audio-volume-muted.svg b/frame/item/resources/audio-volume-muted.svg new file mode 100644 index 000000000..be87cfead --- /dev/null +++ b/frame/item/resources/audio-volume-muted.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/brightness.svg b/frame/item/resources/brightness.svg new file mode 100644 index 000000000..31d4f9830 --- /dev/null +++ b/frame/item/resources/brightness.svg @@ -0,0 +1,15 @@ + + + ICON / MenuItem / Brightness+ + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/item/resources/brightnesshigh.svg b/frame/item/resources/brightnesshigh.svg new file mode 100644 index 000000000..baeb9afcd --- /dev/null +++ b/frame/item/resources/brightnesshigh.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/brightnesslow.svg b/frame/item/resources/brightnesslow.svg new file mode 100644 index 000000000..c5a11a167 --- /dev/null +++ b/frame/item/resources/brightnesslow.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/broadcast.svg b/frame/item/resources/broadcast.svg new file mode 100644 index 000000000..f45b1ae57 --- /dev/null +++ b/frame/item/resources/broadcast.svg @@ -0,0 +1,15 @@ + + + ICON / MenuItem / Broadcast + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/item/resources/laptop.svg b/frame/item/resources/laptop.svg new file mode 100644 index 000000000..90bf3ee48 --- /dev/null +++ b/frame/item/resources/laptop.svg @@ -0,0 +1,15 @@ + + + ICON / Device / Laptop + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/item/resources/volume.svg b/frame/item/resources/volume.svg new file mode 100644 index 000000000..1655e82f1 --- /dev/null +++ b/frame/item/resources/volume.svg @@ -0,0 +1,15 @@ + + + ICON / MenuItem / Volume+ + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/model/brightnessmodel.cpp b/frame/model/brightnessmodel.cpp new file mode 100644 index 000000000..8bc884c42 --- /dev/null +++ b/frame/model/brightnessmodel.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "brightnessmodel.h" + +#include +#include +#include +#include +#include +#include + +static const QString serviceName("com.deepin.daemon.Display"); +static const QString servicePath("/com/deepin/daemon/Display"); +static const QString serviceInterface("com.deepin.daemon.Display"); +static const QString propertiesInterface("org.freedesktop.DBus.Properties"); + +BrightnessModel::BrightnessModel(QObject *parent) + : QObject(parent) +{ + QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + // 读取所有的屏幕的信息 + QString primaryScreenName = qApp->primaryScreen() ? qApp->primaryScreen()->name() : QString(); + QList paths = dbusInter.property("Monitors").value>(); + for (QDBusObjectPath path : paths) { + BrightMonitor *monitor = new BrightMonitor(path.path(), this); + m_monitor << monitor; + connect(monitor, &BrightMonitor::brightnessChanged, this, [ = ] { + Q_EMIT brightnessChanged(monitor); + }); + } + } + + QDBusConnection::sessionBus().connect(serviceName, servicePath, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); +} + +BrightnessModel::~BrightnessModel() +{ +} + +QList BrightnessModel::monitors() +{ + return m_monitor; +} + +void BrightnessModel::setBrightness(BrightMonitor *monitor, int brightness) +{ + setBrightness(monitor->name(), brightness); +} + +void BrightnessModel::setBrightness(QString name, int brightness) +{ + callMethod("SetBrightness", { name, static_cast(brightness *0.01) }); +} + +QDBusMessage BrightnessModel::callMethod(const QString &methodName, const QList &argument) +{ + QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); + reply.waitForFinished(); + return reply.reply(); + } + return QDBusMessage(); +} + +void BrightnessModel::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != serviceInterface) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Brightness")) { + } +} + +/** + * @brief monitor + */ +BrightMonitor::BrightMonitor(QString path, QObject *parent) + : QObject(parent) + , m_path(path) + , m_brightness(100) + , m_enabled(false) +{ + QDBusInterface dbusInter(serviceName, path, serviceInterface + QString(".Monitor"), QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + // 读取所有的屏幕的信息 + m_name = dbusInter.property("Name").toString(); + m_brightness = static_cast(dbusInter.property("Brightness").toDouble() * 100); + m_enabled = dbusInter.property("Enabled").toBool(); + } + + QDBusConnection::sessionBus().connect(serviceName, path, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); +} + +BrightMonitor::~BrightMonitor() +{ +} + +int BrightMonitor::brihtness() +{ + return m_brightness; +} + +bool BrightMonitor::enabled() +{ + return m_enabled; +} + +QString BrightMonitor::name() +{ + return m_name; +} + +void BrightMonitor::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != QString("%1.Monitor").arg(serviceInterface)) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Brightness")) { + int brightness = static_cast(changedProps.value("Brightness").value() * 100); + if (brightness != m_brightness) { + m_brightness = brightness; + Q_EMIT brightnessChanged(brightness); + } + } + if (changedProps.contains("Name")) { + QString name = changedProps.value("Name").value(); + if (name != m_name) { + m_name = name; + Q_EMIT nameChanged(name); + } + } + if (changedProps.contains("Enabled")) { + bool enabled = changedProps.value("Enabled").value(); + if (enabled != m_enabled) { + m_enabled = enabled; + Q_EMIT enabledChanged(enabled); + } + } +} + diff --git a/frame/model/brightnessmodel.h b/frame/model/brightnessmodel.h new file mode 100644 index 000000000..b220c67f2 --- /dev/null +++ b/frame/model/brightnessmodel.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2011 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef BRIGHTNESSMODEL_H +#define BRIGHTNESSMODEL_H + +#include + +class BrightMonitor; +class QDBusMessage; + +class BrightnessModel : public QObject +{ + Q_OBJECT + +Q_SIGNALS: + void brightnessChanged(BrightMonitor *); + +public: + explicit BrightnessModel(QObject *parent = nullptr); + ~BrightnessModel(); + + QList monitors(); + void setBrightness(BrightMonitor *monitor, int brightness); + void setBrightness(QString name, int brightness); + +protected: + QDBusMessage callMethod(const QString &methodName, const QList &argument); + +protected Q_SLOTS: + void onPropertyChanged(const QDBusMessage &msg); + +private: + QList m_monitor; +}; + +class BrightMonitor : public QObject +{ + Q_OBJECT + + friend class BrightnessModel; + +Q_SIGNALS: + void brightnessChanged(int); + void nameChanged(QString); + void enabledChanged(bool); + +public: + int brihtness(); + bool enabled(); + QString name(); + //bool isDefault(); + +protected: + explicit BrightMonitor(QString path, QObject *parent); + ~BrightMonitor(); + +protected Q_SLOTS: + void onPropertyChanged(const QDBusMessage &msg); + +private: + QString m_path; + QString m_name; + int m_brightness; + bool m_enabled; +}; + +#endif // DISPLAYMODEL_H diff --git a/frame/model/mediaplayermodel.cpp b/frame/model/mediaplayermodel.cpp new file mode 100644 index 000000000..32dd6041e --- /dev/null +++ b/frame/model/mediaplayermodel.cpp @@ -0,0 +1,259 @@ +#include "mediaplayermodel.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MediaPlayerModel::MediaPlayerModel(QObject *parent) + : QObject(parent) + , m_isActived(false) + , m_mediaInter(nullptr) +{ + initMediaPlayer(); +} + +MediaPlayerModel::~MediaPlayerModel() +{ +} + +MediaPlayerModel *MediaPlayerModel::instance() +{ + static MediaPlayerModel instance; + return &instance; +} + +bool MediaPlayerModel::isActived() +{ + return m_isActived; +} + +bool MediaPlayerModel::canGoNext() +{ + return m_mediaInter ? m_mediaInter->canGoNext() : false; +} + +bool MediaPlayerModel::canGoPrevious() +{ + return m_mediaInter ? m_mediaInter->canGoPrevious() : false; +} + +bool MediaPlayerModel::canPause() +{ + + return m_mediaInter ? m_mediaInter->canPause() : false; +} + +MediaPlayerModel::PlayStatus MediaPlayerModel::status() +{ + if (!m_isActived || !m_mediaInter) + return PlayStatus::Stop; + + return convertStatus(m_mediaInter->playbackStatus()); +} + +const QString MediaPlayerModel::name() +{ + if (m_mediaInter) { + Dict data = m_mediaInter->metadata(); + return data["xesam:title"].toString(); + } + + return QString(); +} + +const QString MediaPlayerModel::iconUrl() +{ + if (m_mediaInter) { + Dict data = m_mediaInter->metadata(); + return data["mpris:artUrl"].toString(); + } + + return QString(); +} + +const QString MediaPlayerModel::album() +{ + if (m_mediaInter) { + Dict data = m_mediaInter->metadata(); + return data["xesam:album"].toString(); + } + + return QString(); +} + +const QString MediaPlayerModel::artist() +{ + if (m_mediaInter) { + Dict data = m_mediaInter->metadata(); + return data["xesam:artist"].toString(); + } + + return QString(); +} + +void MediaPlayerModel::setStatus(const MediaPlayerModel::PlayStatus &stat) +{ + if (!m_mediaInter) + return; + + switch (stat) { + case MediaPlayerModel::PlayStatus::Play: { + m_mediaInter->Play(); + break; + } + case MediaPlayerModel::PlayStatus::Stop: { + m_mediaInter->Stop(); + break; + } + case MediaPlayerModel::PlayStatus::Pause: { + m_mediaInter->Pause(); + break; + } + default: break; + } +} + +void MediaPlayerModel::playNext() +{ + if (m_mediaInter) + m_mediaInter->Next(); +} + +void MediaPlayerModel::initMediaPlayer() +{ + QDBusInterface dbusInter("org.freedesktop.DBus", "/", "org.freedesktop.DBus", QDBusConnection::sessionBus(), this); + QDBusPendingCall call = dbusInter.asyncCall("ListNames"); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); + connect(watcher, &QDBusPendingCallWatcher::finished, [ = ] { + m_serviceName.clear(); + if (call.isError()) + return; + + QDBusReply reply = call.reply(); + const QStringList &serviceList = reply.value(); + + for (const QString &serv : serviceList) { + if (!serv.startsWith("org.mpris.MediaPlayer2")) + continue; + + QDBusInterface serviceInterface(serv, "/org/mpris/MediaPlayer2", + "org.mpris.MediaPlayer2.Player", QDBusConnection::sessionBus(), this); + // 如果开启了谷歌浏览器的后台服务(org.mpris.MediaPlayer2.chromium.instance17352) + // 也符合名称要求,但是它不是音乐服务,此时需要判断是否存在这个属性 + QVariant v = serviceInterface.property("CanPlay"); + if (!v.isValid() || !v.value()) + continue; + + m_serviceName = serv; + break; + } + + if (!m_serviceName.isEmpty()) { + m_isActived = true; + + m_mediaInter = new MediaPlayerInterface(m_serviceName, "/org/mpris/MediaPlayer2", QDBusConnection::sessionBus(), this); + connect(m_mediaInter, &MediaPlayerInterface::PlaybackStatusChanged, this, [ this ] { + Q_EMIT statusChanged(convertStatus(m_mediaInter->playbackStatus())); + }); + connect(m_mediaInter, &MediaPlayerInterface::MetadataChanged, this, &MediaPlayerModel::metadataChanged); + Dict v = m_mediaInter->metadata(); + m_name = v.value("xesam:title").toString(); + m_icon = v.value("mpris:artUrl").toString(); + m_album = v.value("xesam:album").toString(); + m_artist = v.value("xesam:artist").toString(); + Q_EMIT startStop(true); + return; + } + + QDBusConnectionInterface *dbusInterface = QDBusConnection::sessionBus().interface(); + connect(dbusInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, + [ = ](const QString &name, const QString &, const QString &newOwner) { + if (name.startsWith("org.mpris.MediaPlayer2")) { + // 启动了音乐播放 + m_isActived = !newOwner.isEmpty(); + if (m_isActived) { + m_serviceName = name; + m_mediaInter = new MediaPlayerInterface(m_serviceName, "/org/mpris/MediaPlayer2", QDBusConnection::sessionBus(), this); + connect(m_mediaInter, &MediaPlayerInterface::PlaybackStatusChanged, this, [ this ] { + Q_EMIT statusChanged(convertStatus(m_mediaInter->playbackStatus())); + }); + connect(m_mediaInter, &MediaPlayerInterface::MetadataChanged, this, &MediaPlayerModel::metadataChanged); + Dict v = m_mediaInter->metadata(); + m_name = v.value("xesam:title").toString(); + m_icon = v.value("mpris:artUrl").toString(); + m_album = v.value("xesam:album").toString(); + m_artist = v.value("xesam:artist").toString(); + } else { + if (!m_serviceName.isEmpty()) { + delete m_mediaInter; + m_mediaInter = nullptr; + } + m_serviceName.clear(); + } + Q_EMIT startStop(m_isActived); + } + }); + connect(dbusInterface, &QDBusConnectionInterface::serviceUnregistered, this, + [ = ](const QString &service) { + if (service.startsWith("org.mpris.MediaPlayer2")) { + // 启动了音乐播放 + m_serviceName.clear(); + m_isActived = false; + Q_EMIT startStop(m_isActived); + } + }); + }); + connect(watcher, &QDBusPendingCallWatcher::finished, watcher, &QDBusPendingCallWatcher::deleteLater); +} + +MediaPlayerModel::PlayStatus MediaPlayerModel::convertStatus(const QString &stat) +{ + if (stat == "Paused") + return PlayStatus::Pause; + if (stat == "Playing") + return PlayStatus::Play; + if (stat == "Stopped") + return PlayStatus::Stop; + + return PlayStatus::Unknow; +} + +MediaPlayerInterface::MediaPlayerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, "org.mpris.MediaPlayer2.Player", connection, parent) +{ + QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); +} + +MediaPlayerInterface::~MediaPlayerInterface() +{ + QDBusConnection::sessionBus().disconnect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); +} + +void MediaPlayerInterface::onPropertyChanged(const QDBusMessage& msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName !="org.mpris.MediaPlayer2.Player") + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + QStringList keys = changedProps.keys(); + foreach(const QString &prop, keys) { + const QMetaObject* self = metaObject(); + for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) { + QMetaProperty p = self->property(i); + if (p.name() == prop) { + Q_EMIT p.notifySignal().invoke(this); + } + } + } +} diff --git a/frame/model/mediaplayermodel.h b/frame/model/mediaplayermodel.h new file mode 100644 index 000000000..9dff56df8 --- /dev/null +++ b/frame/model/mediaplayermodel.h @@ -0,0 +1,126 @@ +#ifndef MEDIAPLAYERMODEL_H +#define MEDIAPLAYERMODEL_H + +#include +#include +#include + +typedef QMap Dict; +Q_DECLARE_METATYPE(Dict) + +class QDBusMessage; +class QDBusConnection; +class MediaPlayerInterface; + +class MediaPlayerModel : public QObject +{ + Q_OBJECT + +public: + enum PlayStatus { + Unknow = 0, + Play, + Pause, + Stop + }; + +Q_SIGNALS: + void startStop(bool); + void statusChanged(const PlayStatus &); + void metadataChanged(); + +public: + static MediaPlayerModel *instance(); + bool isActived(); + bool canGoNext(); + bool canGoPrevious(); + bool canPause(); + + PlayStatus status(); + const QString name(); + const QString iconUrl(); + const QString album(); + const QString artist(); + + void setStatus(const PlayStatus &stat); + void playNext(); + +protected: + explicit MediaPlayerModel(QObject *parent = nullptr); + ~MediaPlayerModel(); + +private: + void initMediaPlayer(); + PlayStatus convertStatus(const QString &stat); + +private: + bool m_isActived; + QString m_serviceName; + QString m_name; + QString m_icon; + QString m_album; + QString m_artist; + MediaPlayerInterface *m_mediaInter; +}; + +class MediaPlayerInterface : public QDBusAbstractInterface +{ + Q_OBJECT + +Q_SIGNALS: + void MetadataChanged(); + void CanGoNextChanged(); + void CanGoPreviousChanged(); + void CanPauseChanged(); + void PlaybackStatusChanged(); + +public: + MediaPlayerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); + ~MediaPlayerInterface(); + +public: + inline QDBusPendingReply<> Play() { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Play"), argumentList); + } + + inline QDBusPendingReply<> Stop() { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Stop"), argumentList); + } + + inline QDBusPendingReply<> Pause() { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Pause"), argumentList); + } + + inline QDBusPendingReply<> Next() { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Next"), argumentList); + } + + Q_PROPERTY(Dict Metadata READ metadata NOTIFY MetadataChanged) + inline Dict metadata() const + { return qvariant_cast(property("Metadata")); } + + Q_PROPERTY(bool CanGoNext READ canGoNext NOTIFY CanGoNextChanged) + inline bool canGoNext() const + { return qvariant_cast< bool >(property("CanGoNext")); } + + Q_PROPERTY(bool CanGoPrevious READ canGoPrevious NOTIFY CanGoPreviousChanged) + inline bool canGoPrevious() const + { return qvariant_cast< bool >(property("CanGoPrevious")); } + + Q_PROPERTY(bool CanPause READ canPause NOTIFY CanPauseChanged) + inline bool canPause() const + { return qvariant_cast< bool >(property("CanPause")); } + + Q_PROPERTY(QString PlaybackStatus READ playbackStatus NOTIFY PlaybackStatusChanged) + inline QString playbackStatus() const + { return qvariant_cast< QString >(property("PlaybackStatus")); } + +private Q_SLOTS: + void onPropertyChanged(const QDBusMessage& msg); +}; + +#endif // MEDIAPLAYERLISTENER_H diff --git a/frame/model/volumemodel.cpp b/frame/model/volumemodel.cpp new file mode 100644 index 000000000..15920020e --- /dev/null +++ b/frame/model/volumemodel.cpp @@ -0,0 +1,589 @@ +#include "volumemodel.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * @brief 声音控制的类 + * @param parent + */ + +static const QString serviceName = QString("com.deepin.daemon.Audio"); +static const QString servicePath = QString("/com/deepin/daemon/Audio"); +static const QString interfaceName = QString("com.deepin.daemon.Audio"); +static const QString propertiesInterface = QString("org.freedesktop.DBus.Properties"); + +VolumeModel::VolumeModel(QObject *parent) + : QObject(parent) +{ + initService(); +} + +VolumeModel::~VolumeModel() +{ + clearPorts(); + clearSinks(); +} + +void VolumeModel::setActivePort(AudioPorts *port) +{ + callMethod("SetPort", { port->cardId(), port->name(), port->direction() }); +} + +QList VolumeModel::sinks() const +{ + return m_sinks; +} + +QList VolumeModel::ports() const +{ + return m_ports; +} + +AudioSink *VolumeModel::defaultSink() const +{ + for (AudioSink *sink : m_sinks) { + if (sink->isDefault()) + return sink; + } + + return nullptr; +} + +void VolumeModel::setVolume(int volumn) +{ + for (AudioSink *audiosink : m_sinks) { + if (audiosink->isDefault()) { + audiosink->setVolume(volumn, true); + break; + } + } +} + +void VolumeModel::setMute(bool value) +{ + for (AudioSink *audiosink : m_sinks) { + if (audiosink->isDefault()) { + audiosink->setMute(value); + break; + } + } +} + +int VolumeModel::volume() +{ + for (AudioSink *audiosink : m_sinks) { + if (audiosink->isDefault()) + return audiosink->volume(); + } + + return 0; +} + +bool VolumeModel::isMute() +{ + for (AudioSink *audiosink : m_sinks) { + if (audiosink->isDefault()) + return audiosink->isMute(); + } + + return false; +} + +bool VolumeModel::existActiveOutputDevice() +{ + for (AudioPorts *port : m_ports) { + if (port->direction() == 1) + return true; + } + + return false; +} + +void VolumeModel::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interName = msg.arguments().at(0).toString(); + if (interName != interfaceName) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("DefaultSink")) { + QVariant defaultSink = changedProps.value("DefaultSink"); + QString defaultSinkPath = defaultSink.value().path(); + for (AudioSink *audioSink : m_sinks) { + if (audioSink->m_devicePath == defaultSinkPath) { + updateDefaultSink(audioSink); + Q_EMIT defaultSinkChanged(audioSink); + break; + } + } + } +} + +void VolumeModel::initService() +{ + QDBusConnection::sessionBus().connect(serviceName, servicePath, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); + + reloadSinks(); + reloadPorts(); + + QDBusConnectionInterface *dbusInterface = QDBusConnection::sessionBus().interface(); + connect(dbusInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, + [ = ](const QString &name, const QString &, const QString &newOwner) { + if (name == serviceName) { + if (newOwner.isEmpty()) { + QDBusConnection::sessionBus().disconnect(serviceName, servicePath, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); + clearSinks(); + } else { + QDBusConnection::sessionBus().connect(serviceName, servicePath, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); + reloadSinks(); + reloadPorts(); + } + } + }); +} + +void VolumeModel::reloadSinks() +{ + clearSinks(); + QList sinkPaths = properties>("Sinks"); + for (const QDBusObjectPath &sinkPath : sinkPaths) { + AudioSink *sink = new AudioSink(sinkPath.path(), this); + connect(sink, &AudioSink::volumeChanged, this, [ = ](int volume) { + if (sink->isDefault()) + Q_EMIT volumeChanged(volume); + }); + connect(sink, &AudioSink::muteChanged, this, [ = ](bool isMute) { + if (sink->isDefault()) + Q_EMIT muteChanged(isMute); + }); + + m_sinks << sink; + } +} + +void VolumeModel::reloadPorts() +{ + clearPorts(); + QString cards = properties("CardsWithoutUnavailable"); + QJsonParseError error; + QJsonDocument json = QJsonDocument::fromJson(cards.toLocal8Bit(), &error); + if (error.error != QJsonParseError::NoError) + return; + + int sinkCardId = -1; + QString sinkCardName; + AudioSink *sink = defaultSink(); + if (sink) { + sinkCardId = sink->cardId(); + sinkCardName = sink->name(); + } + + QJsonArray array = json.array(); + for (const QJsonValue value : array) { + QJsonObject cardObject = value.toObject(); + int cardId = cardObject.value("Id").toInt(); + QString cardName = cardObject.value("Name").toString(); + QJsonArray jPorts = cardObject.value("Ports").toArray(); + for (const QJsonValue jPortValue : jPorts) { + QJsonObject jPort = jPortValue.toObject(); + if (!jPort.value("Enabled").toBool()) + continue; + + int direction = jPort.value("Direction").toInt(); + if (direction != 1) + continue; + + AudioPorts *port = new AudioPorts(cardId, cardName); + port->setName(jPort.value("Name").toString()); + port->setDescription(jPort.value("Description").toString()); + port->setDirection(direction); + if (port->cardId() == sinkCardId && port->name() == sinkCardName) + port->setIsChecked(true); + + m_ports << port; + } + } +} + +void VolumeModel::updateDefaultSink(AudioSink *audioSink) +{ + bool checkChanged = false; + for (AudioPorts *port : m_ports) { + bool oldChecked = port->isChecked(); + port->setIsChecked(port->cardId() == audioSink->cardId() + && port->name() == audioSink->name()); + + if (oldChecked != port->isChecked() && port->isChecked()) + checkChanged = true; + } + + if (checkChanged) + Q_EMIT checkPortChanged(); +} + +void VolumeModel::clearSinks() +{ + for (AudioSink *sink : m_sinks) + delete sink; + + m_sinks.clear(); +} + +void VolumeModel::clearPorts() +{ + for (AudioPorts *port : m_ports) + delete port; + + m_ports.clear(); +} + +QDBusMessage VolumeModel::callMethod(const QString &methodName, const QList &argument) +{ + QDBusInterface dbusInter(serviceName, servicePath, interfaceName, QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); + reply.waitForFinished(); + return reply.reply(); + } + return QDBusMessage(); +} + +template +T VolumeModel::properties(const QString &propName) +{ + QDBusInterface dbusInter(serviceName, servicePath, interfaceName, QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QByteArray ba = propName.toLatin1(); + const char *prop = ba.data(); + return dbusInter.property(prop).value(); + } + + return T(); +} + +/** + * @brief 具体的声音设备 + * @param parent + */ + +AudioSink::AudioSink(QString path, QObject *parent) + : QObject(parent) + , m_devicePath(path) +{ + QDBusConnection::sessionBus().connect(serviceName, path, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage&))); +} + +AudioSink::~AudioSink() +{ +} + +bool AudioSink::isDefault() +{ + QDBusInterface dbusInter(serviceName, servicePath, interfaceName, QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QString defaultSink = dbusInter.property("DefaultSink").value().path(); + return defaultSink == m_devicePath; + } + + return false; +} + +bool AudioSink::isHeadPhone() +{ + return false; +} + +void AudioSink::setBalance(double value, bool isPlay) +{ + callMethod("SetBalance", { value, isPlay }); +} + +void AudioSink::setFade(double value) +{ + callMethod("SetFade", { value }); +} + +void AudioSink::setMute(bool mute) +{ + callMethod("SetMute", { mute }); +} + +void AudioSink::setPort(QString name) +{ + callMethod("SetPort", { name }); +} + +void AudioSink::setVolume(double value, bool isPlay) +{ + callMethod("SetVolume", { value * 0.01, isPlay }); +} + +bool AudioSink::isMute() +{ + return getProperties("Mute"); +} + +bool AudioSink::supportBalance() +{ + return getProperties("SupportBalance"); +} + +bool AudioSink::suoportFade() +{ + return getProperties("SupportFade"); +} + +double AudioSink::balance() +{ + return getProperties("Balance"); +} + +double AudioSink::baseVolume() +{ + return getProperties("BaseVolume"); +} + +double AudioSink::fade() +{ + return getProperties("Fade"); +} + +int AudioSink::volume() +{ + return static_cast(getProperties("Volume") * 100); +} + +QString AudioSink::description() +{ + QVariantList value = getPropertiesByFreeDesktop("ActivePort"); + if (value.size() >= 2) + return value[1].toString(); + + return getProperties("Description"); +} + +QString AudioSink::name() +{ + QVariantList value = getPropertiesByFreeDesktop("ActivePort"); + if (value.size() >= 2) + return value[0].toString(); + + return getProperties("Name"); +} + +int AudioSink::cardId() +{ + return getProperties("Card"); +} + +void AudioSink::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != propertiesInterface) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Volume")) + Q_EMIT volumeChanged(static_cast(changedProps.value("Volume").toDouble() * 100)); + + if (changedProps.contains("Mute")) + Q_EMIT muteChanged(changedProps.value("Mute").toBool()); +} + +template +T AudioSink::getProperties(const QString &propName) +{ + QDBusInterface dbusInter(serviceName, m_devicePath, interfaceName + QString(".Sink"), QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QByteArray ba = propName.toLatin1(); + const char *prop = ba.data(); + return dbusInter.property(prop).value(); + } + + return T(); +} + +QDBusMessage AudioSink::callMethod(const QString &methodName, const QList &argument) +{ + QDBusInterface dbusInter(serviceName, m_devicePath, interfaceName + QString(".Sink"), QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); + reply.waitForFinished(); + return reply.reply(); + } + + return QDBusMessage(); +} + +static QVariantList argToString(const QDBusArgument &busArg) +{ + QVariantList out; + QString busSig = busArg.currentSignature(); + bool doIterate = false; + QDBusArgument::ElementType elementType = busArg.currentType(); + + switch (elementType) { + case QDBusArgument::BasicType: + case QDBusArgument::VariantType: { + QVariant value = busArg.asVariant(); + switch (value.type()) { + case QVariant::Bool: + out << value.toBool(); + break; + case QVariant::Int: + out << value.toInt(); + break; + case QVariant::String: + out << value.toString(); + break; + case QVariant::UInt: + out << value.toUInt(); + break; + case QVariant::ULongLong: + out << value.toULongLong(); + break; + case QMetaType::UChar: + out << value.toUInt(); + break; + default: + out << QVariant(); + break; + } + out += busArg.asVariant().toString(); + break; + } + case QDBusArgument::StructureType: + busArg.beginStructure(); + doIterate = true; + break; + case QDBusArgument::ArrayType: + busArg.beginArray(); + doIterate = true; + break; + case QDBusArgument::MapType: + busArg.beginMap(); + doIterate = true; + break; + case QDBusArgument::UnknownType: + default: + out << QVariant(); + return out; + } + + if (doIterate && !busArg.atEnd()) { + while (!busArg.atEnd()) { + out << argToString(busArg); + if (out.isEmpty()) + break; + } + } + + return out; +} + +QVariantList AudioSink::getPropertiesByFreeDesktop(const QString &propName) +{ + QDBusInterface dbusInter(serviceName, m_devicePath, "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList("Get", { interfaceName + ".Sink", propName }); + reply.waitForFinished(); + QVariantList lists = reply.reply().arguments(); + for (QVariantList::ConstIterator it = lists.begin(); it != lists.end(); ++it) { + QVariant arg = (*it); + const QVariant v = qvariant_cast(arg).variant(); + return argToString(v.value()); + } + } + + return QVariantList(); +} + +AudioPorts::AudioPorts(int cardId, QString cardName) + : m_cardId(cardId) + , m_cardName(cardName) + , m_isCheck(false) + , m_isHeadPhone(false) +{ +} + +AudioPorts::~AudioPorts() +{ +} + +int AudioPorts::cardId() const +{ + return m_cardId; +} + +QString AudioPorts::cardName() const +{ + return m_cardName; +} + +void AudioPorts::setName(const QString &name) +{ + m_portName = name; +} + +QString AudioPorts::name() const +{ + return m_portName; +} + +void AudioPorts::setDescription(const QString &desc) +{ + m_description = desc; +} + +QString AudioPorts::description() const +{ + return m_description; +} + +void AudioPorts::setDirection(int dir) +{ + m_direction = dir; +} + +void AudioPorts::setIsChecked(bool isChecked) +{ + m_isCheck = isChecked; +} + +int AudioPorts::direction() const +{ + return m_direction; +} + +bool AudioPorts::isChecked() const +{ + return m_isCheck; +} + +bool AudioPorts::isHeadPhone() const +{ + return m_isHeadPhone; +} diff --git a/frame/model/volumemodel.h b/frame/model/volumemodel.h new file mode 100644 index 000000000..e698c59fc --- /dev/null +++ b/frame/model/volumemodel.h @@ -0,0 +1,141 @@ +#ifndef VOLUMNMODEL_H +#define VOLUMNMODEL_H + +#include + +class QDBusMessage; +class AudioSink; +class AudioPorts; + +class VolumeModel : public QObject +{ + Q_OBJECT + +Q_SIGNALS: + void defaultSinkChanged(AudioSink *); + void volumeChanged(int); + void muteChanged(bool); + void checkPortChanged(); + +public: + explicit VolumeModel(QObject *parent); + ~VolumeModel(); + + void setActivePort(AudioPorts *port); + + QList sinks() const; + QList ports() const; + + AudioSink *defaultSink() const; + + void setVolume(int volume); + void setMute(bool value); + + int volume(); + bool isMute(); + bool existActiveOutputDevice(); + +private Q_SLOTS: + void onPropertyChanged(const QDBusMessage& msg); + +private: + void initService(); + void reloadSinks(); + void reloadPorts(); + void clearSinks(); + void clearPorts(); + void updateDefaultSink(AudioSink *audioSink); + +private: + QDBusMessage callMethod(const QString &methodName, const QList &argument); + template + T properties(const QString &propName); + +private: + QList m_sinks; + QList m_ports; +}; + +class AudioSink : public QObject +{ + Q_OBJECT + + friend class VolumeModel; + +Q_SIGNALS: + void volumeChanged(int); + void muteChanged(bool); + +public: + bool isDefault(); + bool isHeadPhone(); + + void setBalance(double value, bool isPlay); + void setFade(double value); + void setMute(bool mute); + void setPort(QString name); + void setVolume(double value, bool isPlay); + + bool isMute(); + bool supportBalance(); + bool suoportFade(); + double balance(); + double baseVolume(); + double fade(); + int volume(); + QString description(); + QString name(); + int cardId(); + +private Q_SLOTS: + void onPropertyChanged(const QDBusMessage& msg); + +protected: + explicit AudioSink(QString path, QObject *parent = nullptr); + ~AudioSink(); + +private: + QDBusMessage callMethod(const QString &methodName, const QList &argument); + template + T getProperties(const QString &propName); + + QList getPropertiesByFreeDesktop(const QString &propName); + +private: + QString m_devicePath; +}; + +class AudioPorts : public QObject +{ + Q_OBJECT + + friend class VolumeModel; + +public: + int cardId() const; + QString cardName() const; + QString name() const; + QString description() const; + int direction() const; + bool isChecked() const; + bool isHeadPhone() const; + +protected: + AudioPorts(int cardId, QString cardName); + ~AudioPorts(); + void setName(const QString &name); + void setDescription(const QString &desc); + void setDirection(int dir); + void setIsChecked(bool isChecked); + +private: + int m_cardId; + QString m_cardName; + QString m_portName; + QString m_description; + int m_direction; + bool m_isCheck; + bool m_isHeadPhone; +}; + +#endif // VOLUMNMODEL_H diff --git a/frame/window/components/brightnessmonitorwidget.cpp b/frame/window/components/brightnessmonitorwidget.cpp new file mode 100644 index 000000000..ee0358876 --- /dev/null +++ b/frame/window/components/brightnessmonitorwidget.cpp @@ -0,0 +1,171 @@ +#include "brightnessmonitorwidget.h" +#include "brightnessmodel.h" +#include "customslider.h" +#include "settingdelegate.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +#define ITEMSPACE 16 + +BrightnessMonitorWidget::BrightnessMonitorWidget(BrightnessModel *model, QWidget *parent) + : QWidget(parent) + , m_sliderWidget(new QWidget(this)) + , m_sliderLayout(new QVBoxLayout(m_sliderWidget)) + , m_descriptionLabel(new QLabel(tr("Output Device"), this)) + , m_deviceList(new DListView(this)) + , m_brightModel(model) + , m_model(new QStandardItemModel(this)) + , m_delegate(new SettingDelegate(m_deviceList)) +{ + initUi(); + initConnection(); + reloadMonitor(); + + QMetaObject::invokeMethod(this, [ this ]{ + resetHeight(); + }, Qt::QueuedConnection); +} + +BrightnessMonitorWidget::~BrightnessMonitorWidget() +{ +} + +void BrightnessMonitorWidget::initUi() +{ + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(10, 12, 10, 12); + layout->setSpacing(6); + + m_sliderLayout->setContentsMargins(0, 0, 0, 0); + m_sliderLayout->setSpacing(5); + + QList monitors = m_brightModel->monitors(); + for (BrightMonitor *monitor : monitors) { + SliderContainer *container = new SliderContainer(CustomSlider::Normal, m_sliderWidget); + container->setTitle(monitor->name()); + container->slider()->setIconSize(QSize(20, 20)); + container->slider()->setLeftIcon(QIcon(":/icons/resources/brightnesslow")); + container->slider()->setRightIcon(QIcon(":/icons/resources/brightnesshigh")); + container->setFixedHeight(50); + m_sliderLayout->addWidget(container); + + m_sliderContainers << qMakePair(monitor, container); + } + + layout->addSpacing(ITEMSPACE - layout->spacing()); + layout->addWidget(m_sliderWidget); + layout->addSpacing(4); + layout->addWidget(m_descriptionLabel); + + m_deviceList->setContentsMargins(0, 0, 0, 0); + m_deviceList->setModel(m_model); + m_deviceList->setViewMode(QListView::ListMode); + m_deviceList->setMovement(QListView::Free); + m_deviceList->setItemRadius(12); + m_deviceList->setWordWrap(false); + m_deviceList->verticalScrollBar()->setVisible(false); + m_deviceList->horizontalScrollBar()->setVisible(false); + m_deviceList->setOrientation(QListView::Flow::TopToBottom, false); + layout->addWidget(m_deviceList); + layout->addStretch(); + m_deviceList->setSpacing(10); + + m_deviceList->setItemDelegate(m_delegate); +} + +void BrightnessMonitorWidget::initConnection() +{ + connect(m_delegate, &SettingDelegate::selectIndexChanged, this, [ this ](const QModelIndex &index) { + BrightMonitor *monitor = index.data(itemDataRole).value(); + if (monitor) { + m_deviceList->update(); + // 更新滚动条的内容 + onBrightChanged(monitor); + } else { + QDBusInterface controlcenter("com.deepin.dde.ControlCenter", "/com/deepin/dde/ControlCenter", + "com.deepin.dde.ControlCenter", QDBusConnection::sessionBus()); + controlcenter.call("ShowModule", "display"); + hide(); + } + }); + + for (QPair container : m_sliderContainers) { + SliderContainer *slider = container.second; + connect(slider->slider(), &CustomSlider::valueChanged, this, [ = ](int value) { + m_brightModel->setBrightness(container.first, value); + }); + } + + connect(m_brightModel, &BrightnessModel::brightnessChanged, this, &BrightnessMonitorWidget::onBrightChanged); +} + +void BrightnessMonitorWidget::reloadMonitor() +{ + m_model->clear(); + QList monitots = m_brightModel->monitors(); + for (BrightMonitor *monitor : monitots) { + DStandardItem *item = new DStandardItem; + item->setIcon(QIcon(":/icons/resources/laptop.svg")); + item->setText(monitor->name()); + item->setFlags(Qt::NoItemFlags); + item->setData(QVariant::fromValue(monitor), itemDataRole); + m_model->appendRow(item); + onBrightChanged(monitor); + } + // 显示设置 + DStandardItem *settingItem = new DStandardItem; + settingItem->setIcon(QIcon("")); + settingItem->setText(tr("Display settings")); + settingItem->setFlags(Qt::NoItemFlags); + settingItem->setData(false, itemCheckRole); + m_model->appendRow(settingItem); +} + +void BrightnessMonitorWidget::onBrightChanged(BrightMonitor *monitor) +{ + for (QPair container : m_sliderContainers) { + SliderContainer *slider = container.second; + if (container.first == monitor) { + slider->slider()->blockSignals(true); + slider->slider()->setValue(monitor->brihtness()); + slider->slider()->blockSignals(false); + } + } +} + +void BrightnessMonitorWidget::resetHeight() +{ + int viewHeight = 0; + for (int i = 0; i < m_model->rowCount(); i++) { + QRect indexRect = m_deviceList->visualRect(m_model->index(i, 0)); + viewHeight += indexRect.height(); + // 上下间距 + viewHeight += m_deviceList->spacing() * 2; + } + // 设置列表的高度 + m_deviceList->setFixedHeight(viewHeight); + QMargins sliderMargin = m_sliderLayout->contentsMargins(); + int sliderHeight = sliderMargin.top() + sliderMargin.bottom(); + for (QPair container : m_sliderContainers) { + SliderContainer *slider = container.second; + sliderHeight += slider->height(); + } + + m_sliderWidget->setFixedHeight(sliderHeight); + QMargins m = layout()->contentsMargins(); + int space1 = ITEMSPACE - layout()->spacing(); + int space2 = 4; + int height = m.top() + m.bottom() + sliderHeight + space1 + + m_descriptionLabel->height() + space2 + m_deviceList->height(); + setFixedHeight(height); +} diff --git a/frame/window/components/brightnessmonitorwidget.h b/frame/window/components/brightnessmonitorwidget.h new file mode 100644 index 000000000..d63c131eb --- /dev/null +++ b/frame/window/components/brightnessmonitorwidget.h @@ -0,0 +1,49 @@ +#ifndef BRIGHTNESSMONITORWIDGET_H +#define BRIGHTNESSMONITORWIDGET_H + +#include +#include + +class QLabel; +class CustomSlider; +class BrightnessModel; +class QStandardItemModel; +class QVBoxLayout; +class SliderContainer; +class BrightMonitor; +class SettingDelegate; + +namespace Dtk { namespace Widget { class DListView; } } + +using namespace Dtk::Widget; + +class BrightnessMonitorWidget : public QWidget +{ + Q_OBJECT + +public: + explicit BrightnessMonitorWidget(BrightnessModel *model, QWidget *parent = nullptr); + ~BrightnessMonitorWidget() override; + +private: + void initUi(); + void initConnection(); + void reloadMonitor(); + + void resetHeight(); + +private Q_SLOTS: + void onBrightChanged(BrightMonitor *monitor); + +private: + QWidget *m_sliderWidget; + QVBoxLayout *m_sliderLayout; + QList> m_sliderContainers; + QLabel *m_descriptionLabel; + DListView *m_deviceList; + BrightnessModel *m_brightModel; + QStandardItemModel *m_model; + SettingDelegate *m_delegate; +}; + +#endif // BRIGHTNESSMONITORWIDGET_H diff --git a/frame/window/components/brightnesswidget.cpp b/frame/window/components/brightnesswidget.cpp new file mode 100644 index 000000000..978f9d962 --- /dev/null +++ b/frame/window/components/brightnesswidget.cpp @@ -0,0 +1,70 @@ +#include "brightnesswidget.h" +#include "customslider.h" +#include "brightnessmodel.h" +#include "brightnessmonitorwidget.h" + +#include +#include + +BrightnessWidget::BrightnessWidget(QWidget *parent) + : DBlurEffectWidget(parent) + , m_slider(new CustomSlider(CustomSlider::SliderType::Normal, this)) + , m_model(new BrightnessModel(this)) +{ + initUi(); + initConenction(); + onUpdateBright(); +} + +BrightnessWidget::~BrightnessWidget() +{ +} + +BrightnessModel *BrightnessWidget::model() +{ + return m_model; +} + +void BrightnessWidget::showEvent(QShowEvent *event) +{ + DBlurEffectWidget::showEvent(event); + Q_EMIT visibleChanged(true); +} + +void BrightnessWidget::hideEvent(QHideEvent *event) +{ + DBlurEffectWidget::hideEvent(event); + Q_EMIT visibleChanged(true); +} + +void BrightnessWidget::initUi() +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setContentsMargins(20, 0, 20, 0); + layout->addWidget(m_slider); + + m_slider->setPageStep(1); + m_slider->setIconSize(QSize(24, 24)); + + m_slider->setLeftIcon(QIcon(":/icons/resources/brightness.svg")); + m_slider->setRightIcon(QIcon::fromTheme(":/icons/resources/ICON_Device_Laptop.svg")); + m_slider->setTickPosition(QSlider::TicksBelow); +} + +void BrightnessWidget::initConenction() +{ + connect(m_slider, &CustomSlider::iconClicked, this, [ this ](DSlider::SliderIcons icon, bool) { + if (icon == DSlider::SliderIcons::RightIcon) + Q_EMIT rightIconClicked(); + }); + connect(m_slider, &CustomSlider::valueChanged, this, [ this ](int value) { + + }); + + connect(m_model, &BrightnessModel::brightnessChanged, this, &BrightnessWidget::onUpdateBright); +} + +void BrightnessWidget::onUpdateBright() +{ + +} diff --git a/frame/window/components/brightnesswidget.h b/frame/window/components/brightnesswidget.h new file mode 100644 index 000000000..7988f486f --- /dev/null +++ b/frame/window/components/brightnesswidget.h @@ -0,0 +1,41 @@ +#ifndef BRIGHTNESSWIDGET_H +#define BRIGHTNESSWIDGET_H + +#include + +DWIDGET_USE_NAMESPACE + +class CustomSlider; +class BrightnessModel; +class BrightMonitor; + +class BrightnessWidget : public DBlurEffectWidget +{ + Q_OBJECT + +public: + explicit BrightnessWidget(QWidget *parent = nullptr); + ~BrightnessWidget() override; + BrightnessModel *model(); + +Q_SIGNALS: + void visibleChanged(bool); + void rightIconClicked(); + +protected: + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + +private Q_SLOTS: + void onUpdateBright(); + +private: + void initUi(); + void initConenction(); + +private: + CustomSlider *m_slider; + BrightnessModel *m_model; +}; + +#endif // LIGHTSETTINGWIDGET_H diff --git a/frame/window/components/customslider.cpp b/frame/window/components/customslider.cpp new file mode 100644 index 000000000..80c1b0a2f --- /dev/null +++ b/frame/window/components/customslider.cpp @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#include "customslider.h" + +#include +#include + +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +CustomSlider::CustomSlider(CustomSlider::SliderType type, QWidget *parent) + : DSlider(Qt::Horizontal, parent) + , m_separateValue(0) +{ + setType(type); + DSlider::slider()->setTracking(false); +} + +CustomSlider::CustomSlider(Qt::Orientation orientation, QWidget *parent) + : DSlider(orientation, parent) +{ + DSlider::slider()->setTracking(false); +} + +void CustomSlider::setType(CustomSlider::SliderType type) +{ + switch (type) { + case Vernier: setProperty("handleType", "Vernier"); break; + case Progress: setProperty("handleType", "None"); break; + default: setProperty("handleType", "Normal"); break; + } +} + +QSlider *CustomSlider::qtSlider() +{ + return DSlider::slider(); +} + +void CustomSlider::setRange(int min, int max) +{ + setMinimum(min); + setMaximum(max); +} + +void CustomSlider::setTickPosition(QSlider::TickPosition tick) +{ + m_tickPosition = tick; +} + +void CustomSlider::setTickInterval(int ti) +{ + DSlider::slider()->setTickInterval(ti); +} + +void CustomSlider::setSliderPosition(int Position) +{ + DSlider::slider()->setSliderPosition(Position); +} + +void CustomSlider::setAnnotations(const QStringList &annotations) +{ + switch (m_tickPosition) { + case QSlider::TicksLeft: + setLeftTicks(annotations); + break; + case QSlider::TicksRight: + setRightTicks(annotations); + break; + default: + break; + } +} + +void CustomSlider::setOrientation(Qt::Orientation orientation) +{ + Q_UNUSED(orientation) +} + +void CustomSlider::setSeparateValue(int value) +{ + m_separateValue = value; +} + +void CustomSlider::wheelEvent(QWheelEvent *e) +{ + e->ignore(); +} + +void CustomSlider::paintEvent(QPaintEvent *e) +{ + Q_UNUSED(e) + + if (m_separateValue <= 0) + return; + + QPainter pa(this); + auto dpa = DApplicationHelper::instance()->palette(this); + QPen penLine = QPen(dpa.color(DPalette::ObviousBackground), 2); + + //超过间隔线后需要更换间隔线颜色为活动色 + if (qtSlider()->value() >= m_separateValue ) { + QPalette pe = this->palette(); + QColor brushColor(pe.color(QPalette::Highlight)); + penLine.setColor(brushColor); + } + + int margin = DStyle::pixelMetric(style(), DStyle::PM_FocusBorderSpacing) + DStyle::pixelMetric(style(), DStyle::PM_FocusBorderSpacing); + int offsetSize = style()->pixelMetric(QStyle::PM_SliderLength, nullptr, this) / 2; + int width = this->qtSlider()->width(); + + width -= 2 * offsetSize + margin * 2; + Qt::Orientation orient = this->orientation(); + QSlider::TickPosition tick = m_tickPosition; + QSlider* slider = DSlider::slider(); + qreal percentage = (m_separateValue - slider->minimum()) * 1.0 / (slider->maximum() - slider->minimum()); + + pa.setPen(penLine); + int leftIconwidth = 0; + //获取左边声音图标宽度 + QGridLayout *gridLayout = dynamic_cast(this->layout()); + if (!gridLayout) + return; + QLayoutItem* item = gridLayout->itemAtPosition(1, 0); + if (item) { + leftIconwidth = item->geometry().size().width(); + } + + qreal startX = offsetSize + margin + leftIconwidth + this->contentsMargins().left(); + qreal startY = slider->y() + 10; + //分别绘制滑动条上方矩形和下方矩形,避免与滑动条重叠, + //画笔宽为2个像素,设置绘制时矩形高设为3,可达到高度为5的效果 + if (orient == Qt::Horizontal) { + qreal sliderX = percentage * width; + if (slider->value() >= m_separateValue) { + int num = (sliderX + 2) / 3; + qAbs(3 * num + 1 - sliderX) - qAbs(sliderX - (3 * num - 2)) >= 0 ? num : num++; + sliderX = 3 * num - 2; + } else { + //将分割线左、右的滚动条进行比较获取距离最相近的位置,绘制分割线 + sliderX = (slider->maximum() - m_separateValue) * 1.0 * width / slider->maximum(); + int num = (sliderX + 1) / 3; + qAbs(3 * num - sliderX) - qAbs(sliderX - 3 * (num - 1)) >= 0 ? num : num++; + sliderX = width - (3 * num - 1); + } + if (tick == QSlider::TicksAbove || tick == QSlider::TicksBelow || tick == QSlider::NoTicks) { + pa.drawLine(QPointF(startX + sliderX, startY), QPointF(startX + sliderX, startY + 3)); + pa.drawLine(QPointF(startX + sliderX, startY + 9), QPointF(startX + sliderX, startY + 12)); + } + } +} + +SliderContainer::SliderContainer(CustomSlider::SliderType type, QWidget *parent) + : QWidget (parent) + , m_slider(new CustomSlider(type, this)) + , m_titleLabel(new QLabel(this)) +{ + QVBoxLayout *mainlayout = new QVBoxLayout(this); + mainlayout->setContentsMargins(0, 0, 0, 0); + mainlayout->setSpacing(5); + mainlayout->addWidget(m_titleLabel); + mainlayout->addWidget(m_slider); +} + +SliderContainer::SliderContainer(Qt::Orientation orientation, QWidget *parent) + : QWidget(parent) + , m_slider(new CustomSlider(orientation, this)) + , m_titleLabel(new QLabel(this)) +{ + QVBoxLayout *mainlayout = new QVBoxLayout(this); + mainlayout->setContentsMargins(0, 1, 0, 0); + mainlayout->setSpacing(1); + + m_titleLabel->setFixedHeight(8); + mainlayout->addWidget(m_titleLabel); + mainlayout->addWidget(m_slider); +} + +SliderContainer::~SliderContainer() +{ +} + +void SliderContainer::setTitle(const QString &title) +{ + m_titleLabel->setText(title); +} + +CustomSlider *SliderContainer::slider() +{ + return m_slider; +} diff --git a/frame/window/components/customslider.h b/frame/window/components/customslider.h new file mode 100644 index 000000000..5c8a5ad8f --- /dev/null +++ b/frame/window/components/customslider.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#ifndef CUSTOMCTRL_H +#define CUSTOMCTRL_H + +#include +#include + +class QLabel; + +class CustomSlider : public DTK_WIDGET_NAMESPACE::DSlider +{ + Q_OBJECT + +public: + enum SliderType { + Normal, + Vernier, + Progress + }; + +public: + explicit CustomSlider(SliderType type = Normal, QWidget *parent = nullptr); + explicit CustomSlider(Qt::Orientation orientation, QWidget *parent = nullptr); + + inline CustomSlider *slider() const { return const_cast(this); } + QSlider *qtSlider(); + + void setType(SliderType type); + void setRange(int min, int max); + void setTickPosition(QSlider::TickPosition tick); + void setTickInterval(int ti); + void setSliderPosition(int Position); + void setAnnotations(const QStringList &annotations); + void setOrientation(Qt::Orientation orientation); + //当value大于0时,在slider中插入一条分隔线 + void setSeparateValue(int value = 0); + +protected: + void wheelEvent(QWheelEvent *e); + void paintEvent(QPaintEvent *e); +private: + QSlider::TickPosition m_tickPosition = QSlider::TicksBelow; + int m_separateValue; +}; + +class SliderContainer : public QWidget +{ + Q_OBJECT + +public: + explicit SliderContainer(CustomSlider::SliderType type = CustomSlider::Normal, QWidget *parent = nullptr); + explicit SliderContainer(Qt::Orientation orientation, QWidget *parent); + ~SliderContainer(); + void setTitle(const QString &title); + CustomSlider *slider(); + +private: + CustomSlider *m_slider; + QLabel *m_titleLabel; +}; + +#endif // VOLUMESLIDER_H diff --git a/frame/window/components/mediawidget.cpp b/frame/window/components/mediawidget.cpp new file mode 100644 index 000000000..436920f93 --- /dev/null +++ b/frame/window/components/mediawidget.cpp @@ -0,0 +1,178 @@ +#include "mediawidget.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +MediaWidget::MediaWidget(QWidget *parent) + : DBlurEffectWidget(parent) + , m_musicIcon(new QLabel(this)) + , m_musicName(new QLabel(this)) + , m_musicSinger(new QLabel(this)) + , m_pausePlayButton(new MusicButton(this)) + , m_nextButton(new MusicButton(this)) +{ + initUi(); + initConnection(); +} + +MediaWidget::~MediaWidget() +{ +} + +void MediaWidget::showEvent(QShowEvent *event) +{ + DBlurEffectWidget::showEvent(event); + Q_EMIT visibleChanged(true); +} + +void MediaWidget::hideEvent(QHideEvent *event) +{ + DBlurEffectWidget::hideEvent(event); + Q_EMIT visibleChanged(false); +} + +void MediaWidget::statusChanged(const MediaPlayerModel::PlayStatus &newStatus) +{ + switch (newStatus) { + case MediaPlayerModel::PlayStatus::Play: { + m_pausePlayButton->setButtonType(MusicButton::ButtonType::Pause); + break; + } + case MediaPlayerModel::PlayStatus::Stop: + case MediaPlayerModel::PlayStatus::Pause: { + m_pausePlayButton->setButtonType(MusicButton::ButtonType::Playing); + break; + } + default: break; + } +} + +void MediaWidget::onPlayClicked() +{ + // 设置当前的播放状态 + MediaPlayerModel *player = MediaPlayerModel::instance(); + if (player->status() == MediaPlayerModel::PlayStatus::Play) + player->setStatus(MediaPlayerModel::PlayStatus::Pause); + else + player->setStatus(MediaPlayerModel::PlayStatus::Play); +} + +void MediaWidget::onNext() +{ + // 播放下一曲 + MediaPlayerModel *player = MediaPlayerModel::instance(); + player->playNext(); +} + +void MediaWidget::initUi() +{ + m_pausePlayButton->setFixedWidth(20); + m_nextButton->setFixedWidth(20); + + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(20, 0, 20, 0); + mainLayout->addWidget(m_musicIcon); + + QWidget *infoWidget = new QWidget(this); + QVBoxLayout *infoLayout = new QVBoxLayout(infoWidget); + infoLayout->addWidget(m_musicName); + infoLayout->addWidget(m_musicSinger); + mainLayout->addWidget(infoWidget); + mainLayout->addWidget(m_pausePlayButton); + mainLayout->addSpacing(25); + mainLayout->addWidget(m_nextButton); + + m_musicIcon->setFixedSize(32, 32); + m_musicName->setFont(DFontSizeManager::instance()->t8()); + m_musicSinger->setFont(DFontSizeManager::instance()->t10()); + setVisible(MediaPlayerModel::instance()->isActived()); +} + +void MediaWidget::initConnection() +{ + MediaPlayerModel *mediaPlayer = MediaPlayerModel::instance(); + connect(mediaPlayer, &MediaPlayerModel::startStop, this, [ this, mediaPlayer ](bool startOrStop) { + setVisible(startOrStop); + m_nextButton->setEnabled(mediaPlayer->canGoNext()); + onUpdateMediaInfo(); + statusChanged(mediaPlayer->status()); + }); + connect(mediaPlayer, &MediaPlayerModel::metadataChanged, this, &MediaWidget::onUpdateMediaInfo); + connect(mediaPlayer, &MediaPlayerModel::statusChanged, this, &MediaWidget::statusChanged); + connect(m_pausePlayButton, &MusicButton::clicked, this, &MediaWidget::onPlayClicked); + connect(m_nextButton, &MusicButton::clicked, this, &MediaWidget::onNext); + + m_pausePlayButton->setButtonType(mediaPlayer->status() == MediaPlayerModel::PlayStatus::Play ? + MusicButton::ButtonType::Pause : MusicButton::ButtonType::Playing); + m_nextButton->setButtonType(MusicButton::ButtonType::Next); +} + +void MediaWidget::onUpdateMediaInfo() +{ + MediaPlayerModel *mediaPlayer = MediaPlayerModel::instance(); + m_musicName->setText(mediaPlayer->name()); + QString file = mediaPlayer->iconUrl(); + if (file.startsWith("file:///")) + file.replace("file:///", "/"); + m_musicIcon->setPixmap(QPixmap(file).scaled(m_musicIcon->size())); + m_musicSinger->setText(mediaPlayer->artist()); +} + +/** + * @brief 音乐播放的相关按钮 + * @param parent + */ +MusicButton::MusicButton(QWidget *parent) + : QWidget(parent) +{ + installEventFilter(this); +} + +MusicButton::~MusicButton() +{ +} + +void MusicButton::paintEvent(QPaintEvent *event) +{ +#define ICONHEIGHT 20 + Q_UNUSED(event); + int width = this->width(); + int height = this->height(); + int startX = 2; + int startY = (height - ICONHEIGHT) / 2; + QColor color(0, 0, 0); + QPainter painter(this); + painter.save(); + painter.setRenderHint(QPainter::Antialiasing); + painter.setPen(color); + painter.setBrush(color); + if (m_buttonType == ButtonType::Pause) { + painter.drawRect(QRect(startX, startY, 6, ICONHEIGHT)); + painter.drawRect(QRect(width - 6 - 2, startY, 6, ICONHEIGHT)); + } else { + QPainterPath trianglePath; + trianglePath.moveTo(startX, startY); + trianglePath.lineTo(width - 6, height / 2); + trianglePath.lineTo(startX, startY + ICONHEIGHT); + trianglePath.lineTo(startX, startY); + painter.drawPath(trianglePath); + if (m_buttonType == ButtonType::Next) + painter.drawRect(width - 6, startY, 2, ICONHEIGHT); + } + painter.restore(); +} + +void MusicButton::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event); + Q_EMIT clicked(); +} diff --git a/frame/window/components/mediawidget.h b/frame/window/components/mediawidget.h new file mode 100644 index 000000000..6a727e7b4 --- /dev/null +++ b/frame/window/components/mediawidget.h @@ -0,0 +1,74 @@ +#ifndef MEDIAWIDGET_H +#define MEDIAWIDGET_H + +#include "mediaplayermodel.h" + +#include + +class QLabel; +class MusicButton; + +DWIDGET_USE_NAMESPACE + +class MediaWidget : public DBlurEffectWidget +{ + Q_OBJECT + +public: + explicit MediaWidget(QWidget *parent = nullptr); + ~MediaWidget() override; + +Q_SIGNALS: + void visibleChanged(bool); + +protected: + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + +private Q_SLOTS: + void statusChanged(const MediaPlayerModel::PlayStatus &newStatus); + void onPlayClicked(); + void onNext(); + void onUpdateMediaInfo(); + +private: + void initUi(); + void initConnection(); + +private: + QLabel *m_musicIcon; + QLabel *m_musicName; + QLabel *m_musicSinger; + MusicButton *m_pausePlayButton; + MusicButton *m_nextButton; +}; + +// 音乐播放按钮 +class MusicButton : public QWidget +{ + Q_OBJECT + +Q_SIGNALS: + void clicked(); + +public: + enum ButtonType { Playing = 0, Pause, Next }; + +public: + MusicButton(QWidget *parent = Q_NULLPTR); + ~MusicButton() override; + + inline void setButtonType(const ButtonType &bt) { + m_buttonType = bt; + update(); + } + +protected: + void paintEvent(QPaintEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + +private: + ButtonType m_buttonType; +}; + +#endif // MEDIAWIDGER_H diff --git a/frame/window/components/settingdelegate.cpp b/frame/window/components/settingdelegate.cpp new file mode 100644 index 000000000..0827d4fab --- /dev/null +++ b/frame/window/components/settingdelegate.cpp @@ -0,0 +1,90 @@ +#include "settingdelegate.h" + +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +SettingDelegate::SettingDelegate(QAbstractItemView *parent) + : DStyledItemDelegate(parent) +{ + parent->installEventFilter(this); +} + +SettingDelegate::~SettingDelegate() +{ +} + +void SettingDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + painter->save(); + + QRect indexRect = option.rect; + // 绘制背景色 + bool isOver = option.state & QStyle::State_MouseOver; + bool isDefault = index.data(itemCheckRole).toBool(); + if (isDefault) { + QPainterPath path, path1; + path.addRoundedRect(indexRect, 8, 8); + + DPalette palette = DGuiApplicationHelper::instance()->applicationPalette(); + painter->fillPath(path, palette.color(QPalette::ColorRole::Highlight)); + } else { + QPainterPath path; + path.addRoundedRect(indexRect, 8, 8); + painter->fillPath(path, isOver ? QColor(0, 0, 0, 100) : QColor(0, 0, 0, 64)); + } + // 绘制图标 + QRect rectIcon = indexRect; + rectIcon.setX(20); + QIcon icon = index.data(Qt::DecorationRole).value(); + QPixmap pixmap(icon.pixmap(16, 16)); + rectIcon.setY(indexRect.y() + (rectIcon.height() - pixmap.height()) / 2); + rectIcon.setWidth(pixmap.width()); + rectIcon.setHeight(pixmap.height()); + painter->drawPixmap(rectIcon, pixmap); +#define RIGHTSPACE 11 +#define SELECTICONSIZE 10 + // 绘制文本 + QRect rectText; + rectText.setX(rectIcon.left() + rectIcon.width() + 8); + rectText.setWidth(indexRect.width() - rectText.x() - RIGHTSPACE - SELECTICONSIZE - 5); + QPen pen(isDefault ? QColor(255, 255, 255) : QColor(0, 0, 0)); + pen.setWidth(2); + painter->setPen(pen); + QFont ft(DFontSizeManager::instance()->t6()); + QFontMetrics ftm(ft); + QString text = QFontMetrics(ft).elidedText(index.data(Qt::DisplayRole).toString(), Qt::TextElideMode::ElideRight, + rectText.width()); + painter->setFont(ft); + rectText.setY(indexRect.y() + (indexRect.height() - QFontMetrics(ft).height()) / 2); + rectText.setHeight(QFontMetrics(ft).height()); + painter->drawText(rectText, text); + // 如果当前是默认的输出设备,则绘制右侧的对钩 + if (isDefault) { + QPointF points[3] = { + QPointF(indexRect.width() - RIGHTSPACE - SELECTICONSIZE, indexRect.center().y()), + QPointF(indexRect.width() - RIGHTSPACE - SELECTICONSIZE / 2, rectIcon.bottom() + 2), + QPointF(indexRect.width() - RIGHTSPACE, rectIcon.top() - 2) + }; + painter->drawPolyline(points, 3); + } + + painter->restore(); +} + +bool SettingDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) +{ + if (event->type() == QEvent::MouseButtonRelease) { + QRect rctIndex = option.rect; + rctIndex.setHeight(rctIndex.height() - spacing()); + QMouseEvent *mouseEvent = static_cast(event); + if (rctIndex.contains(mouseEvent->pos())) + Q_EMIT selectIndexChanged(index); + } + + return DStyledItemDelegate::editorEvent(event, model, option, index); +} diff --git a/frame/window/components/settingdelegate.h b/frame/window/components/settingdelegate.h new file mode 100644 index 000000000..40d70f680 --- /dev/null +++ b/frame/window/components/settingdelegate.h @@ -0,0 +1,27 @@ +#ifndef SETTINGDELEGATE_H +#define SETTINGDELEGATE_H + +#include + +DWIDGET_USE_NAMESPACE + +static const int itemCheckRole = Dtk::UserRole + 1; +static const int itemDataRole = Dtk::UserRole + 2; + +class SettingDelegate : public DStyledItemDelegate +{ + Q_OBJECT + +Q_SIGNALS: + void selectIndexChanged(const QModelIndex &); + +public: + explicit SettingDelegate(QAbstractItemView *parent = nullptr); + ~SettingDelegate() override; + +protected: + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override; +}; + +#endif // SETTINGDELEGATE_H diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp new file mode 100644 index 000000000..af3d15e2b --- /dev/null +++ b/frame/window/components/volumedeviceswidget.cpp @@ -0,0 +1,206 @@ +#include "volumedeviceswidget.h" +#include "customslider.h" +#include "volumemodel.h" +#include "settingdelegate.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +#define HEADERHEIGHT 30 +#define ITEMSPACE 16 + +VolumeDevicesWidget::VolumeDevicesWidget(VolumeModel *model, QWidget *parent) + : QWidget(parent) + , m_volumeSlider(new CustomSlider(CustomSlider::Normal, this)) + , m_descriptionLabel(new QLabel(tr("Output Device"), this)) + , m_deviceList(new DListView(this)) + , m_volumeModel(model) + , m_audioSink(nullptr) + , m_model(new QStandardItemModel(this)) + , m_delegate(new SettingDelegate(m_deviceList)) +{ + initUi(); + initConnection(); + reloadAudioDevices(); + + QMetaObject::invokeMethod(this, [ this ] { + resetVolumeInfo(); + resizeHeight(); + }, Qt::QueuedConnection); +} + +VolumeDevicesWidget::~VolumeDevicesWidget() +{ +} + +void VolumeDevicesWidget::initUi() +{ + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(6); + + m_volumeSlider->setIconSize(QSize(36, 36)); + m_volumeSlider->setLeftIcon(QIcon(leftIcon())); + m_volumeSlider->setRightIcon(QIcon(rightIcon())); + + layout->addWidget(m_volumeSlider); + layout->addSpacing(4); + layout->addWidget(m_descriptionLabel); + + m_deviceList->setModel(m_model); + m_deviceList->setViewMode(QListView::ListMode); + m_deviceList->setMovement(QListView::Free); + m_deviceList->setItemRadius(12); + m_deviceList->setWordWrap(false); + m_deviceList->verticalScrollBar()->setVisible(false); + m_deviceList->horizontalScrollBar()->setVisible(false); + m_deviceList->setOrientation(QListView::Flow::TopToBottom, false); + layout->addWidget(m_deviceList); + m_deviceList->setSpacing(10); + + m_deviceList->setItemDelegate(m_delegate); +} + +void VolumeDevicesWidget::reloadAudioDevices() +{ + QList ports = m_volumeModel->ports(); + for (AudioPorts *port : ports) { + DStandardItem *item = new DStandardItem; + item->setText(QString("%1(%2)").arg(port->description()).arg(port->cardName())); + item->setIcon(QIcon(soundIconFile(port))); + item->setFlags(Qt::NoItemFlags); + item->setData(port->isChecked(), itemCheckRole); + item->setData(QVariant::fromValue(port), itemDataRole); + m_model->appendRow(item); + if (port->isChecked()) + m_deviceList->setCurrentIndex(m_model->indexFromItem(item)); + } + + DStandardItem *settingItem = new DStandardItem; + settingItem->setText(tr("Sound settings")); + settingItem->setFlags(Qt::NoItemFlags); + settingItem->setData(false, itemCheckRole); + m_model->appendRow(settingItem); +} + +void VolumeDevicesWidget::initConnection() +{ + m_audioSink = m_volumeModel->defaultSink(); + auto adjustVolumeSlider = [ this ](int volume) { + m_volumeSlider->blockSignals(true); + m_volumeSlider->setValue(volume); + m_volumeSlider->blockSignals(false); + }; + if (m_audioSink) + connect(m_audioSink, &AudioSink::volumeChanged, this, adjustVolumeSlider); + connect(m_volumeModel, &VolumeModel::defaultSinkChanged, this, [ this, adjustVolumeSlider ](AudioSink *sink) { + if (m_audioSink) + disconnect(m_audioSink); + + m_audioSink = sink; + if (m_audioSink) + connect(m_audioSink, &AudioSink::volumeChanged, this, adjustVolumeSlider); + + resetVolumeInfo(); + m_deviceList->update(); + }); + + connect(m_volumeSlider, &CustomSlider::valueChanged, this, [ this ](int value) { + AudioSink *defSink = m_volumeModel->defaultSink(); + if (!defSink) + return; + + defSink->setVolume(value, true); + }); + connect(m_volumeModel, &VolumeModel::checkPortChanged, this, [ this ] { + for (int i = 0; i < m_model->rowCount(); i++) { + QModelIndex index = m_model->index(i, 0); + AudioPorts *port = index.data(itemDataRole).value(); + if (port) + m_model->setData(index, port->isChecked(), itemCheckRole); + } + m_deviceList->update(); + }); + + connect(m_delegate, &SettingDelegate::selectIndexChanged, this, [ this ](const QModelIndex &index) { + AudioPorts *port = index.data(itemDataRole).value(); + if (port) { + m_volumeModel->setActivePort(port); + m_deviceList->update(); + } else { + // 打开控制中心的声音模块 + QDBusInterface controlcenter("com.deepin.dde.ControlCenter", "/com/deepin/dde/ControlCenter", + "com.deepin.dde.ControlCenter", QDBusConnection::sessionBus()); + controlcenter.call("ShowModule", "sound"); + hide(); + } + }); +} + +QString VolumeDevicesWidget::leftIcon() +{ + QString iconLeft = QString(":/icons/resources/audio-volume-%1").arg(m_volumeModel->isMute() ? "muted" : "low"); + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + iconLeft.append("-dark"); + + return iconLeft; +} + +QString VolumeDevicesWidget::rightIcon() +{ + QString iconRight = QString(":/icons/resources/audio-volume-high"); + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + iconRight.append("-dark"); + + return iconRight; +} + +const QString VolumeDevicesWidget::soundIconFile(AudioPorts *port) const +{ + if (!port) + return QString(); + + if (port->isHeadPhone()) { + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/ICON_Device_Headphone_dark.svg"); + + return QString(":/icons/resources/ICON_Device_Headphone.svg"); + } + + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/ICON_Device_Laptop_dark.svg"); + + return QString(":/icons/resources/ICON_Device_Laptop.svg"); +} + +void VolumeDevicesWidget::resizeHeight() +{ + m_deviceList->adjustSize(); + QMargins m = layout()->contentsMargins(); + int height = m.top() + m.bottom() + HEADERHEIGHT + m_volumeSlider->height() + ITEMSPACE + + m_descriptionLabel->height() + m_deviceList->height(); + + setFixedHeight(height); +} + +void VolumeDevicesWidget::resetVolumeInfo() +{ + AudioSink *defaultSink = m_volumeModel->defaultSink(); + if (!defaultSink) + return; + + m_volumeSlider->blockSignals(true); + m_volumeSlider->setValue(defaultSink->volume()); + m_volumeSlider->blockSignals(false); +} diff --git a/frame/window/components/volumedeviceswidget.h b/frame/window/components/volumedeviceswidget.h new file mode 100644 index 000000000..7ffd55474 --- /dev/null +++ b/frame/window/components/volumedeviceswidget.h @@ -0,0 +1,50 @@ +#ifndef VOLUMEDEVICESWIDGET_H +#define VOLUMEDEVICESWIDGET_H + +#include + +#include + +namespace Dtk { namespace Widget { class DListView; } } + +using namespace Dtk::Widget; + +class CustomSlider; +class QStandardItemModel; +class QLabel; +class VolumeModel; +class AudioPorts; +class AudioSink; +class SettingDelegate; + +class VolumeDevicesWidget : public QWidget +{ + Q_OBJECT + +public: + explicit VolumeDevicesWidget(VolumeModel *model, QWidget *parent = nullptr); + ~VolumeDevicesWidget() override; + +private: + void initUi(); + void reloadAudioDevices(); + void initConnection(); + QString leftIcon(); + QString rightIcon(); + const QString soundIconFile(AudioPorts *port) const; + + void resizeHeight(); + + void resetVolumeInfo(); + +private: + CustomSlider *m_volumeSlider; + QLabel *m_descriptionLabel; + DListView *m_deviceList; + VolumeModel *m_volumeModel; + AudioSink *m_audioSink; + QStandardItemModel *m_model; + SettingDelegate *m_delegate; +}; + +#endif // VOLUMEDEVICESWIDGET_H diff --git a/frame/window/components/volumewidget.cpp b/frame/window/components/volumewidget.cpp new file mode 100644 index 000000000..4447e3a5a --- /dev/null +++ b/frame/window/components/volumewidget.cpp @@ -0,0 +1,134 @@ +#include "volumewidget.h" +#include "customslider.h" +#include "imageutil.h" +#include "volumemodel.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DGUI_USE_NAMESPACE + +#define ICON_SIZE 24 + +VolumeWidget::VolumeWidget(QWidget *parent) + : DBlurEffectWidget(parent) + , m_volumeController(new VolumeModel(this)) + , m_volumnCtrl(new CustomSlider(Qt::Horizontal, this)) + , m_defaultSink(m_volumeController->defaultSink()) +{ + initUi(); + initConnection(); +} + +VolumeWidget::~VolumeWidget() +{ +} + +void VolumeWidget::initUi() +{ + if (m_defaultSink) + m_volumnCtrl->setValue(m_defaultSink->volume()); + + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(20, 0, 20, 0); + mainLayout->addWidget(m_volumnCtrl); + + m_volumnCtrl->setIconSize(QSize(36, 36)); + m_volumnCtrl->setLeftIcon(QIcon(leftIcon())); + m_volumnCtrl->setRightIcon(QIcon(rightIcon())); + + bool existActiveOutputDevice = m_volumeController->existActiveOutputDevice(); + setEnabled(existActiveOutputDevice); +} + +void VolumeWidget::initConnection() +{ + auto setCtrlVolumeValue = [this](int volume) { + m_volumnCtrl->blockSignals(true); + m_volumnCtrl->setValue(volume); + m_volumnCtrl->blockSignals(false); + }; + if (m_defaultSink) + connect(m_defaultSink, &AudioSink::volumeChanged, this, setCtrlVolumeValue); + + connect(m_volumeController, &VolumeModel::defaultSinkChanged, this, [ this, setCtrlVolumeValue ](AudioSink *sink) { + if (m_defaultSink) + disconnect(m_defaultSink); + + m_defaultSink = sink; + if (sink) { + setCtrlVolumeValue(sink->volume()); + connect(m_defaultSink, &AudioSink::volumeChanged, this, setCtrlVolumeValue); + } + }); + + connect(m_volumnCtrl, &DTK_WIDGET_NAMESPACE::DSlider::valueChanged, this, [ this ](int value) { + AudioSink *sink = m_volumeController->defaultSink(); + if (sink) + sink->setVolume(value, true); + }); + + connect(m_volumeController, &VolumeModel::muteChanged, this, [ this ] { + m_volumnCtrl->setLeftIcon(QIcon(leftIcon())); + }); + + connect(m_volumnCtrl, &CustomSlider::iconClicked, this, [ this ](DSlider::SliderIcons icon, bool) { + switch (icon) { + case DSlider::SliderIcons::LeftIcon: { + if (m_volumeController->existActiveOutputDevice()) + m_volumeController->setMute(!m_volumeController->isMute()); + break; + } + case DSlider::SliderIcons::RightIcon: { + // 弹出音量选择对话框 + Q_EMIT rightIconClick(); + break; + } + } + }); +} + + +VolumeModel *VolumeWidget::model() +{ + return m_volumeController; +} + +void VolumeWidget::showEvent(QShowEvent *event) +{ + DBlurEffectWidget::showEvent(event); + Q_EMIT visibleChanged(true); +} + +void VolumeWidget::hideEvent(QHideEvent *event) +{ + DBlurEffectWidget::hideEvent(event); + Q_EMIT visibleChanged(false); +} + +const QString VolumeWidget::leftIcon() +{ + bool existActiveOutputDevice = m_volumeController->existActiveOutputDevice(); + const bool mute = existActiveOutputDevice ? m_volumeController->isMute() : true; + if (mute) + return QString(":/icons/resources/audio-volume-muted-dark"); + + return QString(":/icons/resources/volume"); +} + +const QString VolumeWidget::rightIcon() +{ + return QString(":/icons/resources/broadcast"); +} diff --git a/frame/window/components/volumewidget.h b/frame/window/components/volumewidget.h new file mode 100644 index 000000000..5daa52665 --- /dev/null +++ b/frame/window/components/volumewidget.h @@ -0,0 +1,45 @@ +#ifndef VOLUMEWIDGET_H +#define VOLUMEWIDGET_H + +#include +#include + +class VolumeModel; +class QDBusMessage; +class CustomSlider; +class QLabel; +class AudioSink; + +DWIDGET_USE_NAMESPACE + +class VolumeWidget : public DBlurEffectWidget +{ + Q_OBJECT + +public: + explicit VolumeWidget(QWidget *parent = nullptr); + ~VolumeWidget() override; + VolumeModel *model(); + +Q_SIGNALS: + void visibleChanged(bool); + void rightIconClick(); + +protected: + void initUi(); + void initConnection(); + + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + +private: + const QString leftIcon(); + const QString rightIcon(); + +private: + VolumeModel *m_volumeController; + CustomSlider *m_volumnCtrl; + AudioSink *m_defaultSink; +}; + +#endif // VOLUMEWIDGET_H diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 9a2c39295..eb7b4fd71 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -389,6 +389,7 @@ void MainPanelControl::insertItem(int index, DockItem *item) case DockItem::Plugins: addPluginAreaItem(index, item); break; + default: break; } // 同removeItem处 注意:不能屏蔽此接口,否则会造成插件插入时无法显示 @@ -420,6 +421,7 @@ void MainPanelControl::removeItem(DockItem *item) case DockItem::Plugins: removePluginAreaItem(item); break; + default: break; } item->removeEventFilter(this); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp new file mode 100644 index 000000000..139e4c541 --- /dev/null +++ b/frame/window/quickpluginwindow.cpp @@ -0,0 +1,323 @@ +#include "quickpluginwindow.h" +#include "quicksettingcontroller.h" +#include "quicksettingitem.h" +#include "pluginsiteminterface.h" +#include "quicksettingcontainer.h" +#include "appdrag.h" + +#include +#include + +#include +#include +#include +#include +#include + +#define ITEMSIZE 22 +#define ITEMSPACE 6 + +static QStringList fixedPluginKeys{ "network-item-key", "sound-item-key", "power" }; +const int itemDataRole = Dtk::UserRole + 1; +const int itemSortRole = Dtk::UserRole + 2; + +QuickPluginWindow::QuickPluginWindow(QWidget *parent) + : QWidget(parent) + , m_listView(new DListView(this)) + , m_model(new QStandardItemModel(this)) + , m_position(Dock::Position::Bottom) +{ + initUi(); + initConnection(); + + setAcceptDrops(true); + setMouseTracking(true); + + this->installEventFilter(this); +} + +QuickPluginWindow::~QuickPluginWindow() +{ +} + +void QuickPluginWindow::initUi() +{ + m_listView->setModel(m_model); + m_listView->setViewMode(QListView::IconMode); + m_listView->setMovement(QListView::Free); + m_listView->setWordWrap(false); + m_listView->verticalScrollBar()->setVisible(false); + m_listView->horizontalScrollBar()->setVisible(false); + m_listView->setOrientation(QListView::Flow::LeftToRight, false); + m_listView->setGridSize(QSize(ITEMSIZE + 10, ITEMSIZE + 10)); + m_listView->setSpacing(ITEMSPACE); + m_listView->setContentsMargins(0,0,0,0); + m_model->setSortRole(itemSortRole); + + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setContentsMargins(0,0,0,0); + layout->setSpacing(0); + layout->addWidget(m_listView); + + const QList &items = QuickSettingController::instance()->settingItems(); + for (QuickSettingItem *settingItem : items) { + const QString itemKey = settingItem->itemKey(); + if (!fixedPluginKeys.contains(itemKey)) + return; + + addPlugin(settingItem); + } +} + +void QuickPluginWindow::setPositon(Position position) +{ + if (m_position == position) + return; + + m_position = position; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + m_listView->setOrientation(QListView::Flow::LeftToRight, false); + else + m_listView->setOrientation(QListView::Flow::TopToBottom, false); +} + +void QuickPluginWindow::addPlugin(QuickSettingItem *item) +{ + // 判断当前的插件是否存在,如果存在,则不插入 + for (int i = 0; i < m_model->rowCount(); i++) { + QStandardItem *myItem = m_model->item(i, 0); + QuickSettingItem *settingItem = myItem->data(itemDataRole).value(); + if (settingItem == item) { + m_model->sort(0); + return; + } + } + + DStandardItem *standItem = createStandItem(item); + if (!standItem) + return; + + m_model->appendRow(standItem); + resetSortRole(); + m_model->sort(0); + Q_EMIT itemCountChanged(); +} + +QSize QuickPluginWindow::suitableSize() +{ + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + return QSize((ITEMSIZE + ITEMSPACE) * m_model->rowCount() + ITEMSPACE, ITEMSIZE); + + return QSize(ITEMSIZE, (ITEMSIZE + ITEMSPACE) * m_model->rowCount() + ITEMSPACE); +} + +void QuickPluginWindow::removePlugin(QuickSettingItem *item) +{ + for (int i = 0; i < m_model->rowCount(); i++) { + QModelIndex index = m_model->index(i, 0); + QuickSettingItem *quickItem = index.data(itemDataRole).value(); + if (quickItem == item) { + m_model->removeRow(i); + break; + } + } + m_model->sort(0); + + Q_EMIT itemCountChanged(); +} + +void QuickPluginWindow::resetSortRole() +{ + QList> fixedItems; + QList activeItems; + for (int i = 0; i < m_model->rowCount(); i++) { + QModelIndex index = m_model->index(i, 0); + if (!index.data(itemDataRole).canConvert()) + continue; + + QuickSettingItem *settingItem = index.data(itemDataRole).value(); + if (fixedPluginKeys.contains(settingItem->itemKey())) + fixedItems.push_back({ m_model->item(i, 0), fixedPluginKeys.indexOf(settingItem->itemKey()) }); + else + activeItems << m_model->item(i, 0); + } + + for (int i = 0; i < activeItems.size(); i++) { + QStandardItem *item = activeItems[i]; + item->setData(i, itemSortRole); + } + + for (QPair item : fixedItems) + item.first->setData(activeItems.size() + item.second, itemSortRole); +} + +DStandardItem *QuickPluginWindow::createStandItem(QuickSettingItem *item) +{ + const QString itemKey = item->itemKey(); + QWidget *itemWidget = item->pluginItem()->itemWidget(itemKey); + if (!itemWidget) + return nullptr; + + itemWidget->setParent(m_listView); + DStandardItem *standItem = new DStandardItem; + standItem->setFlags(Qt::ItemIsEnabled); + standItem->setBackground(Qt::transparent); + standItem->setData(QVariant::fromValue(item), itemDataRole); + + DViewItemAction *action = new DViewItemAction(Qt::AlignCenter, QSize(ITEMSIZE, ITEMSIZE), QSize(ITEMSIZE, ITEMSIZE), true); + action->setWidget(itemWidget); + connect(action, &DViewItemAction::triggered, this, [ this ] { + QPoint ptCurrent = pos(); + QWidget *callWidget = parentWidget(); + if (callWidget) + ptCurrent = callWidget->mapToGlobal(ptCurrent); + + QuickSettingContainer::popWindow()->show(ptCurrent); + }); + connect(action, &DViewItemAction::destroyed, this, [ itemWidget ] { + itemWidget->setParent(nullptr); + itemWidget->hide(); + }); + + standItem->setActionList(Qt::LeftEdge, { action }); + return standItem; +} + +void QuickPluginWindow::mouseReleaseEvent(QMouseEvent *event) +{ + QMouseEvent *mouseEvent = static_cast(event); + QModelIndex selectedIndex = m_listView->indexAt(mouseEvent->pos()); + if (!selectedIndex.isValid()) + return; + + QuickSettingItem *moveItem = selectedIndex.data(itemDataRole).value(); + if (!moveItem) + return; + + if (fixedPluginKeys.contains(moveItem->itemKey())) { + QPoint currentPoint = pos(); + QWidget *callWidget = parentWidget(); + if (callWidget) + currentPoint = callWidget->mapToGlobal(currentPoint); + + QuickSettingContainer::popWindow()->show(currentPoint); + } +} + +void QuickPluginWindow::mousePressEvent(QMouseEvent *event) +{ + QModelIndex selectedIndex = m_listView->indexAt(event->pos()); + if (!selectedIndex.isValid()) { + QWidget::mousePressEvent(event); + return; + } + + QuickSettingItem *moveItem = selectedIndex.data(itemDataRole).value(); + if (!moveItem) { + QWidget::mousePressEvent(event); + return; + } + + if (fixedPluginKeys.contains(moveItem->itemKey())) { + QWidget::mousePressEvent(event); + return; + } + + startDrag(moveItem); +} + +void QuickPluginWindow::startDrag(QuickSettingItem *moveItem) +{ + AppDrag *drag = new AppDrag(this, new QuickDragWidget); + CustomMimeData *mimedata = new CustomMimeData; + mimedata->setData(moveItem); + drag->setMimeData(mimedata); + drag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size())); + QPixmap dragPixmap = moveItem->pluginItem()->icon()->pixmap(QSize(ITEMSIZE, ITEMSIZE)); + drag->setPixmap(dragPixmap); + drag->setHotSpot(QPoint(dragPixmap.width() / 2, dragPixmap.height() / 2)); + + connect(drag->appDragWidget(), &AppDragWidget::requestRemoveItem, this, [ this, moveItem ] { + removePlugin(moveItem); + }); + + connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, [ this, moveItem ](){ + addPlugin(moveItem); + }); + connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, [ this ](QDragMoveEvent *eve){ + QPoint ptCurrent = m_listView->mapFromGlobal(QCursor::pos()); + QModelIndex index = m_listView->indexAt(ptCurrent); + if (!index.isValid()) + return; + + CustomMimeData *data = const_cast(qobject_cast(eve->mimeData())); + if (!data) + return; + + QuickSettingItem *sourceItem = static_cast(data->data()); + if (!sourceItem) + return; + + QuickSettingItem *targetItem = index.data(itemDataRole).value(); + if (!targetItem || fixedPluginKeys.contains(targetItem->itemKey()) || sourceItem == targetItem) + return; + + // recall all sortroles + QList> allItems; + for (int i = 0; i < m_model->rowCount(); i++) { + QModelIndex rowIndex = m_model->index(i, 0); + allItems.push_back({ rowIndex, rowIndex.data(itemDataRole).value() }); + } + auto findIndex = [ allItems ](QuickSettingItem *item) { + for (int i = 0; i < allItems.size(); i++) { + const QPair &rowItem = allItems[i]; + if (rowItem.second == item) + return i; + } + return -1; + }; + int sourceIndex = findIndex(sourceItem); + int targetIndex = findIndex(targetItem); + if (sourceIndex < 0 || targetIndex < 0 || sourceIndex == targetIndex) + return; + + allItems.move(sourceIndex, targetIndex); + + for (int i = 0; i < allItems.size(); i++) { + const QPair &rowItem = allItems[i]; + m_model->setData(rowItem.first, i, itemSortRole); + } + + eve->accept(); + }); + + drag->exec(Qt::MoveAction | Qt::CopyAction); +} + +void QuickPluginWindow::initConnection() +{ + connect(QuickSettingController::instance(), &QuickSettingController::pluginInsert, this, [ this ](QuickSettingItem * settingItem) { + const QString itemKey = settingItem->itemKey(); + if (!fixedPluginKeys.contains(itemKey)) + return; + + addPlugin(settingItem); + }); + + connect(QuickSettingController::instance(), &QuickSettingController::pluginRemove, this, [ this ](QuickSettingItem *settingItem) { + removePlugin(settingItem); + }); +} + +int QuickPluginWindow::fixedItemCount() +{ + int count = 0; + for (int i = 0; i < m_model->rowCount(); i++) { + QModelIndex index = m_model->index(i, 0); + QuickSettingItem *item = index.data(itemDataRole).value(); + if (item && fixedPluginKeys.contains(item->itemKey())) + count++; + } + + return count; +} diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h new file mode 100644 index 000000000..dc765c02d --- /dev/null +++ b/frame/window/quickpluginwindow.h @@ -0,0 +1,56 @@ +#ifndef QUICKPLUGINWINDOW_H +#define QUICKPLUGINWINDOW_H + +#include "constants.h" + +#include + +class QuickSettingItem; +class PluginsItemInterface; +class QHBoxLayout; +class QuickSettingContainer; +class QStandardItemModel; +class QStandardItem; +class QMouseEvent; + +namespace Dtk { namespace Gui { class DRegionMonitor; } + namespace Widget { class DListView; class DStandardItem; } } + +using namespace Dtk::Widget; + +class QuickPluginWindow : public QWidget +{ + Q_OBJECT + +Q_SIGNALS: + void itemCountChanged(); + +public: + explicit QuickPluginWindow(QWidget *parent = nullptr); + ~QuickPluginWindow() override; + + void setPositon(Dock::Position position); + void addPlugin(QuickSettingItem *item); + + QSize suitableSize(); + +protected: + void mouseReleaseEvent(QMouseEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + +private: + void initUi(); + void initConnection(); + void resetSortRole(); + int fixedItemCount(); + DStandardItem *createStandItem(QuickSettingItem *item); + void removePlugin(QuickSettingItem *item); + void startDrag(QuickSettingItem *moveItem); + +private: + DListView *m_listView; + QStandardItemModel *m_model; + Dock::Position m_position; +}; + +#endif // QUICKPLUGINWINDOW_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp new file mode 100644 index 000000000..ce1de0c44 --- /dev/null +++ b/frame/window/quicksettingcontainer.cpp @@ -0,0 +1,415 @@ +#include "quicksettingcontainer.h" +#include "quicksettingcontroller.h" +#include "pluginsiteminterface.h" +#include "quicksettingitem.h" +#include "mediawidget.h" +#include "dockpopupwindow.h" +#include "brightnesswidget.h" +#include "volumewidget.h" +#include "volumedeviceswidget.h" +#include "brightnessmonitorwidget.h" + +#include +#include +#include + +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +static const int QuickItemRole = Dtk::UserRole + 10; + +#define ITEMWIDTH 70 +#define ITEMHEIGHT 60 +#define CTRLHEIGHT 56 +#define ITEMSPACE 10 +#define COLUMNCOUNT 4 + +QuickSettingContainer::QuickSettingContainer(QWidget *parent) + : QWidget(parent) + , m_switchLayout(new QStackedLayout(this)) + , m_mainWidget(new QWidget(this)) + , m_pluginWidget(new QWidget(m_mainWidget)) + , m_mainlayout(new QVBoxLayout(m_mainWidget)) + , m_pluginLoader(QuickSettingController::instance()) + , m_playerWidget(new MediaWidget(m_mainWidget)) + , m_volumnWidget(new VolumeWidget(m_mainWidget)) + , m_brihtnessWidget(new BrightnessWidget(m_mainWidget)) + , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumnWidget->model(), this)) + , m_brightSettingWidget(new BrightnessMonitorWidget(m_brihtnessWidget->model(), this)) + , m_childPage(new PluginChildPage(this)) +{ + initUi(); + initConnection(); +} + +QuickSettingContainer::~QuickSettingContainer() +{ +} + +void QuickSettingContainer::showHomePage() +{ + m_switchLayout->setCurrentIndex(0); +} + +DockPopupWindow *QuickSettingContainer::popWindow() +{ + static DockPopupWindow *popView = nullptr; + if (!popView) { + popView = new DockPopupWindow; + popView->setWindowFlag(Qt::Popup); + popView->setShadowBlurRadius(20); + popView->setRadius(18); + popView->setShadowYOffset(2); + popView->setShadowXOffset(0); + popView->setArrowWidth(18); + popView->setArrowHeight(10); + + QuickSettingContainer *container = new QuickSettingContainer(popView); + popView->setContent(container); + } else { + QuickSettingContainer *container = static_cast(popView->getContent()); + container->showHomePage(); + } + + return popView; +} + +void QuickSettingContainer::initQuickItem(QuickSettingItem *quickItem) +{ + int pluginWidth = ITEMWIDTH; + if (quickItem->pluginItem()->isPrimary()) + pluginWidth = ITEMWIDTH * 2 + ITEMSPACE; + + quickItem->setFixedSize(pluginWidth, ITEMHEIGHT); + quickItem->setParent(m_pluginWidget); + quickItem->setMouseTracking(true); + quickItem->installEventFilter(this); + connect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); +} + +void QuickSettingContainer::onItemDetailClick(PluginsItemInterface *pluginInter) +{ + QuickSettingItem *quickItemWidget = static_cast(sender()); + if (!quickItemWidget) + return; + + QWidget *widget = pluginInter->itemWidget(quickItemWidget->itemKey()); + if (!widget) + return; + + showWidget(widget, pluginInter->pluginDisplayName()); +} + +bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_childPage && event->type() == QEvent::Resize) + resizeView(); + + return QWidget::eventFilter(watched, event); +} + +void QuickSettingContainer::showWidget(QWidget *widget, const QString &title) +{ + m_childPage->setTitle(title); + m_childPage->pushWidget(widget); + m_switchLayout->setCurrentWidget(m_childPage); +} + +void QuickSettingContainer::onPluginInsert(QuickSettingItem *quickItem) +{ + initQuickItem(quickItem); + resetItemPosition(); + resizeView(); +} + +void QuickSettingContainer::onPluginRemove(QuickSettingItem *quickItem) +{ + QObjectList childrens = m_pluginWidget->children(); + for (QObject *child : childrens) { + if (child != quickItem) + continue; + + disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); + quickItem->setParent(nullptr); + quickItem->removeEventFilter(this); + quickItem->setMouseTracking(false); + quickItem->hide(); + break; + } + //调整子控件的位置 + resetItemPosition(); + resizeView(); +} + +void QuickSettingContainer::mousePressEvent(QMouseEvent *event) +{ + if (event->button() != Qt::LeftButton) + return; + + QuickSettingItem *moveItem = qobject_cast(childAt(event->pos())); + if (!moveItem || moveItem->pluginItem()->isPrimary()) + return QWidget::mousePressEvent(event); + + QDrag *drag = new QDrag(this); + CustomMimeData *mimedata = new CustomMimeData; + mimedata->setData(moveItem); + drag->setMimeData(mimedata); + QPixmap dragPixmap = moveItem->dragPixmap(); + drag->setPixmap(dragPixmap); + drag->setHotSpot(QPoint(dragPixmap.width() / 2, dragPixmap.height() / 2)); + + drag->exec(Qt::MoveAction | Qt::CopyAction); +} + +void QuickSettingContainer::resetItemPosition() +{ + QObjectList childrens = m_pluginWidget->children(); + QList primaryQuickItems; + QList quickItems; + for (QObject *child : childrens) { + QuickSettingItem *quickItem = qobject_cast(child); + if (!quickItem || quickItem->isHidden()) + continue; + + if (quickItem->pluginItem()->isPrimary()) + primaryQuickItems << quickItem; + else + quickItems << quickItem; + } + static QStringList existKeys = {"network-item-key", "sound-item-key", "VPN", "PROJECTSCREEN"}; + qSort(primaryQuickItems.begin(), primaryQuickItems.end(), [ = ](QuickSettingItem *item1, QuickSettingItem *item2) { + int index1 = existKeys.indexOf(item1->itemKey()); + int index2 = existKeys.indexOf(item2->itemKey()); + if (index1 >= 0 || index2 >= 0) { + return index1 < index2; + } + return true; + }); + int primaryColumnCount = COLUMNCOUNT / 2; + for (int i = 0; i < primaryQuickItems.size(); i++) { + QuickSettingItem *quickitem = primaryQuickItems[i]; + QPoint ptItem(ITEMSPACE + (ITEMWIDTH + ITEMSPACE) * 2 * (i % primaryColumnCount), + (ITEMHEIGHT + ITEMSPACE) * (static_cast(i / primaryColumnCount))); + quickitem->move(ptItem); + } + int startCount = primaryQuickItems.size() * 2; + for (int i = 0; i < quickItems.size(); i++) { + QuickSettingItem *qsi = quickItems[i]; + int columnIndex = (startCount + i) % COLUMNCOUNT; + int rowIndex = (startCount + i) / COLUMNCOUNT; + int x = (ITEMWIDTH + ITEMSPACE) * columnIndex + ITEMSPACE; + int y = (ITEMHEIGHT + ITEMSPACE) * rowIndex; + qsi->move(x, y); + } +} + +void QuickSettingContainer::initUi() +{ + auto setWidgetStyle = [](DBlurEffectWidget *widget) { + widget->setMaskColor(QColor(239, 240, 245)); + widget->setBlurRectXRadius(8); + widget->setBlurRectYRadius(8); + }; + + // 添加音乐播放插件 + m_playerWidget->setFixedHeight(CTRLHEIGHT); + m_volumnWidget->setFixedHeight(CTRLHEIGHT); + m_brihtnessWidget->setFixedHeight(CTRLHEIGHT); + + setWidgetStyle(m_playerWidget); + setWidgetStyle(m_volumnWidget); + setWidgetStyle(m_brihtnessWidget); + + m_mainlayout->setSpacing(0); + m_mainlayout->setContentsMargins(0, ITEMSPACE, 0, ITEMSPACE); + + m_mainlayout->addWidget(m_pluginWidget); + + QWidget *ctrlWidget = new QWidget(m_mainWidget); + QVBoxLayout *ctrlLayout = new QVBoxLayout(ctrlWidget); + ctrlLayout->setContentsMargins(ITEMSPACE, ITEMSPACE, ITEMSPACE, ITEMSPACE); + + ctrlLayout->addSpacing(ITEMSPACE); + ctrlLayout->addWidget(m_playerWidget); + ctrlLayout->setSpacing(ITEMSPACE); + ctrlLayout->addWidget(m_volumnWidget); + ctrlLayout->setSpacing(ITEMSPACE); + ctrlLayout->addWidget(m_brihtnessWidget); + + m_mainlayout->addWidget(ctrlWidget); + // 加载所有的插件 + QList pluginItems = m_pluginLoader->settingItems(); + for (QuickSettingItem *quickItem: pluginItems) + initQuickItem(quickItem); + + m_switchLayout->addWidget(m_mainWidget); + m_switchLayout->addWidget(m_childPage); + + m_volumeSettingWidget->hide(); + m_brightSettingWidget->hide(); + + setMouseTracking(true); + setAcceptDrops(true); + + QMetaObject::invokeMethod(this, [ = ] { + if (pluginItems.size() > 0) + resetItemPosition(); + // 设置当前窗口的大小 + resizeView(); + setFixedWidth(ITEMWIDTH * 4 + (ITEMSPACE * 5)); + }, Qt::QueuedConnection); +} + +void QuickSettingContainer::initConnection() +{ + connect(m_pluginLoader, &QuickSettingController::pluginInsert, this, &QuickSettingContainer::onPluginInsert); + connect(m_pluginLoader, &QuickSettingController::pluginRemove, this, &QuickSettingContainer::onPluginRemove); + connect(m_playerWidget, &MediaWidget::visibleChanged, this, [ this ] { resizeView(); }); + connect(m_volumnWidget, &VolumeWidget::visibleChanged, this, [ this ] { resizeView(); }); + connect(m_volumnWidget, &VolumeWidget::rightIconClick, this, [ this ] { + showWidget(m_volumeSettingWidget, tr("voice")); + resizeView(); + }); + connect(m_brihtnessWidget, &BrightnessWidget::visibleChanged, this, [ this ] { resizeView(); }); + connect(m_brihtnessWidget, &BrightnessWidget::rightIconClicked, this, [ this ] { + showWidget(m_brightSettingWidget, tr("brightness")); + resizeView(); + }); + connect(m_childPage, &PluginChildPage::back, this, [ this ] { + m_switchLayout->setCurrentWidget(m_mainWidget); + }); + connect(m_childPage, &PluginChildPage::closeSelf, this, [ this ] { + if (!m_childPage->isBack()) + topLevelWidget()->hide(); + }); + m_childPage->installEventFilter(this); +} + +void QuickSettingContainer::resizeView() +{ + if (m_switchLayout->currentWidget() == m_mainWidget) { + QList pluginItems = m_pluginLoader->settingItems(); + int selfPluginCount = 0; + for (QuickSettingItem *item : pluginItems) { + // 如果是置顶的插件,则认为它占用两个普通插件的位置 + int increCount = (item->pluginItem()->isPrimary() ? 2 : 1); + selfPluginCount += increCount; + } + int rowCount = selfPluginCount / COLUMNCOUNT; + if (selfPluginCount % COLUMNCOUNT > 0) + rowCount++; + + m_pluginWidget->setFixedHeight(ITEMHEIGHT * rowCount + ITEMSPACE * (rowCount - 1)); + + int panelCount = 0; + if (m_playerWidget->isVisible()) + panelCount++; + if (m_volumnWidget->isVisible()) + panelCount++; + if (m_brihtnessWidget->isVisible()) + panelCount++; + + int topHeight = ((ITEMHEIGHT + ITEMSPACE) * rowCount) + ITEMSPACE; + setFixedHeight(topHeight + (CTRLHEIGHT + ITEMSPACE) * panelCount + ITEMSPACE); + } else if (m_switchLayout->currentWidget() == m_childPage) { + setFixedHeight(m_childPage->height()); + } +} + +/** + * @brief PluginChildPage::PluginChildPage + * @param parent + */ +PluginChildPage::PluginChildPage(QWidget *parent) + : QWidget(parent) + , m_headerWidget(new QWidget(this)) + , m_back(new QLabel(m_headerWidget)) + , m_title(new QLabel(m_headerWidget)) + , m_container(new QWidget(this)) + , m_topWidget(nullptr) + , m_containerLayout(new QVBoxLayout(m_container)) + , m_isBack(false) +{ + initUi(); + m_back->installEventFilter(this); +} + +PluginChildPage::~PluginChildPage() +{ +} + +void PluginChildPage::pushWidget(QWidget *widget) +{ + // 首先将界面其他的窗体移除 + for (int i = m_containerLayout->count() - 1; i >= 0; i--) { + QLayoutItem *item = m_containerLayout->itemAt(i); + item->widget()->removeEventFilter(this); + item->widget()->hide(); + m_containerLayout->removeItem(item); + } + m_topWidget = widget; + widget->installEventFilter(this); + m_containerLayout->addWidget(widget); + widget->show(); + m_isBack = false; + QMetaObject::invokeMethod(this, &PluginChildPage::resetHeight, Qt::QueuedConnection); +} + +void PluginChildPage::setTitle(const QString &text) +{ + m_title->setText(text); +} + +bool PluginChildPage::isBack() +{ + return m_isBack; +} + +void PluginChildPage::initUi() +{ + m_back->setFixedWidth(24); + m_title->setAlignment(Qt::AlignCenter); + QHBoxLayout *headerLayout = new QHBoxLayout(m_headerWidget); + headerLayout->setContentsMargins(11, 12, 24 + 11, 12); + headerLayout->setSpacing(0); + headerLayout->addWidget(m_back); + headerLayout->addWidget(m_title); + m_headerWidget->setFixedHeight(48); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + + mainLayout->addWidget(m_headerWidget); + mainLayout->addWidget(m_container); + m_containerLayout->setContentsMargins(11, 0, 11, 0); + m_containerLayout->setSpacing(0); +} + +bool PluginChildPage::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_back && event->type() == QEvent::MouseButtonRelease) { + m_isBack = true; + Q_EMIT back(); + return true; + } + if (watched == m_topWidget) { + if (event->type() == QEvent::Hide) { + Q_EMIT closeSelf(); + return true; + } + if (event->type() == QEvent::Resize) + resetHeight(); + } + return QWidget::eventFilter(watched, event); +} + +void PluginChildPage::resetHeight() +{ + QMargins m = m_containerLayout->contentsMargins(); + m_container->setFixedHeight(m.top() + m.bottom() + m_topWidget->height()); + setFixedHeight(m_headerWidget->height() + m_container->height()); +} diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h new file mode 100644 index 000000000..090d28698 --- /dev/null +++ b/frame/window/quicksettingcontainer.h @@ -0,0 +1,122 @@ +#ifndef QUICKSETTINGCONTAINER_H +#define QUICKSETTINGCONTAINER_H + +#include "pluginproxyinterface.h" + +#include "dtkwidget_global.h" + +#include + +#include + +class DockItem; +class QVBoxLayout; +class QuickSettingController; +class MediaWidget; +class VolumeWidget; +class BrightnessWidget; +class QuickSettingItem; +class DockPopupWindow; +class QStackedLayout; +class VolumeDevicesWidget; +class BrightnessMonitorWidget; +class QLabel; +class PluginChildPage; + +DWIDGET_USE_NAMESPACE + +class QuickSettingContainer : public QWidget +{ + Q_OBJECT + +public: + static DockPopupWindow *popWindow(); + +protected: + void mousePressEvent(QMouseEvent *event) override; + explicit QuickSettingContainer(QWidget *parent = nullptr); + ~QuickSettingContainer() override; + void showHomePage(); + +private Q_SLOTS: + void onPluginInsert(QuickSettingItem *quickItem); + void onPluginRemove(QuickSettingItem *quickItem); + void onItemDetailClick(PluginsItemInterface *pluginInter); + bool eventFilter(QObject *watched, QEvent *event) override; + +private: + // 加载UI + void initUi(); + // 初始化槽函数 + void initConnection(); + // 调整尺寸 + void resizeView(); + // 调整控件位置 + void resetItemPosition(); + // 初始化控件项目 + void initQuickItem(QuickSettingItem *quickItem); + // 显示具体的窗体 + void showWidget(QWidget *widget, const QString &title); + +private: + QStackedLayout *m_switchLayout; + QWidget *m_mainWidget; + QWidget *m_pluginWidget; + QVBoxLayout *m_mainlayout; + QuickSettingController *m_pluginLoader; + MediaWidget *m_playerWidget; + VolumeWidget *m_volumnWidget; + BrightnessWidget *m_brihtnessWidget; + + VolumeDevicesWidget *m_volumeSettingWidget; + BrightnessMonitorWidget *m_brightSettingWidget; + PluginChildPage *m_childPage; +}; + +class CustomMimeData : public QMimeData +{ + Q_OBJECT + +public: + CustomMimeData() : QMimeData(), m_data(nullptr) {} + ~CustomMimeData() {} + void setData(void *data) { m_data = data; } + void *data() { return m_data; } + +private: + void *m_data; +}; + +class PluginChildPage : public QWidget +{ + Q_OBJECT + +Q_SIGNALS: + void back(); + void closeSelf(); + +public: + explicit PluginChildPage(QWidget *parent); + ~PluginChildPage() override; + void pushWidget(QWidget *widget); + void setTitle(const QString &text); + bool isBack(); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + +private: + void initUi(); + void resetHeight(); + +private: + QWidget *m_headerWidget; + QLabel *m_back; + QLabel *m_title; + QWidget *m_container; + QWidget *m_topWidget; + QVBoxLayout *m_containerLayout; + bool m_isBack; +}; + +#endif // PLUGINCONTAINER_H diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 30de23e66..9c12f0016 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -48,6 +48,12 @@ public: Custom = 1 << 1 // The custom }; + enum PluginStatus { + Deactive = 0, + Active, + Disabled + }; + /// /// \brief ~PluginsItemInterface /// DON'T try to delete m_proxyInter. @@ -243,6 +249,30 @@ public: /// virtual PluginSizePolicy pluginSizePolicy() const { return System; } + /// + /// the icon display on plugin panel + /// + /// + virtual const QIcon *icon() { return nullptr; } + + /// + /// the plugin status + /// + /// + virtual PluginStatus status() const { return PluginStatus::Deactive; } + + /// + /// return is primary plugin,if true, the plugin will display on top + /// the default value is false + /// + virtual bool isPrimary() const { return false; } + + /// + /// return the detail value, it will display in the center + /// + /// + virtual QString description() const { return QString(); } + protected: /// /// \brief m_proxyInter From 728b700dba7165b746f3f0d7589e35e54c91a84c Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 May 2022 17:09:10 +0800 Subject: [PATCH 006/257] =?UTF-8?q?feat:=20=E7=89=B9=E6=95=88=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E5=8F=B3=E4=BE=A7=E6=8F=92=E4=BB=B6=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完成插件区域的引用图标加载、快捷设置的展示、老插件的加载等功能 Log: 完成特效模式下右侧插件区域的功能 Influence: v23任务栏右侧插件区域 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: I1599907d4529c57070ee2e21b70cc0c17f132e5e --- CMakeLists.txt | 6 + frame/CMakeLists.txt | 7 +- frame/controller/dockpluginscontroller.cpp | 7 +- frame/controller/dockpluginscontroller.h | 3 + frame/controller/systemplugincontroller.cpp | 172 ++++ frame/controller/systemplugincontroller.h | 68 ++ frame/item/arrow-down.svg | 3 + frame/item/arrow-left.svg | 3 + frame/item/arrow-right.svg | 3 + frame/item/arrow-up.svg | 3 + frame/item/item.qrc | 4 + frame/item/resources/arrow-down-dark.svg | 3 + frame/item/resources/arrow-left-dark.svg | 3 + frame/item/resources/arrow-right-dark.svg | 3 + frame/item/resources/arrow-up-dark.svg | 3 + frame/window/components/datetimedisplayer.cpp | 153 ++++ frame/window/components/datetimedisplayer.h | 51 ++ frame/window/systempluginwindow.cpp | 167 ++++ frame/window/systempluginwindow.h | 59 ++ frame/window/tray/dbustraymanager.cpp | 31 + frame/window/tray/dbustraymanager.h | 113 +++ frame/window/tray/tray_delegate.cpp | 132 +++ frame/window/tray/tray_delegate.h | 56 ++ frame/window/tray/tray_gridview.cpp | 375 ++++++++ frame/window/tray/tray_gridview.h | 63 ++ frame/window/tray/tray_model.cpp | 411 +++++++++ frame/window/tray/tray_model.h | 124 +++ frame/window/tray/tray_monitor.cpp | 78 ++ frame/window/tray/tray_monitor.h | 41 + frame/window/tray/widgets/basetraywidget.cpp | 164 ++++ frame/window/tray/widgets/basetraywidget.h | 76 ++ .../window/tray/widgets/expandiconwidget.cpp | 167 ++++ frame/window/tray/widgets/expandiconwidget.h | 46 + frame/window/tray/widgets/indicatorplugin.cpp | 274 ++++++ frame/window/tray/widgets/indicatorplugin.h | 31 + .../window/tray/widgets/indicatortrayitem.cpp | 258 ++++++ frame/window/tray/widgets/indicatortrayitem.h | 73 ++ .../window/tray/widgets/snitrayitemwidget.cpp | 801 ++++++++++++++++++ frame/window/tray/widgets/snitrayitemwidget.h | 156 ++++ .../window/tray/widgets/systempluginitem.cpp | 508 +++++++++++ frame/window/tray/widgets/systempluginitem.h | 118 +++ .../tray/widgets/xembedtrayitemwidget.cpp | 621 ++++++++++++++ .../tray/widgets/xembedtrayitemwidget.h | 84 ++ frame/window/traymanagerwindow.cpp | 381 +++++++++ frame/window/traymanagerwindow.h | 72 ++ tests/CMakeLists.txt | 3 +- 46 files changed, 5975 insertions(+), 3 deletions(-) create mode 100644 frame/controller/systemplugincontroller.cpp create mode 100644 frame/controller/systemplugincontroller.h create mode 100644 frame/item/arrow-down.svg create mode 100644 frame/item/arrow-left.svg create mode 100644 frame/item/arrow-right.svg create mode 100644 frame/item/arrow-up.svg create mode 100644 frame/item/resources/arrow-down-dark.svg create mode 100644 frame/item/resources/arrow-left-dark.svg create mode 100644 frame/item/resources/arrow-right-dark.svg create mode 100644 frame/item/resources/arrow-up-dark.svg create mode 100644 frame/window/components/datetimedisplayer.cpp create mode 100644 frame/window/components/datetimedisplayer.h create mode 100644 frame/window/systempluginwindow.cpp create mode 100644 frame/window/systempluginwindow.h create mode 100644 frame/window/tray/dbustraymanager.cpp create mode 100644 frame/window/tray/dbustraymanager.h create mode 100644 frame/window/tray/tray_delegate.cpp create mode 100644 frame/window/tray/tray_delegate.h create mode 100644 frame/window/tray/tray_gridview.cpp create mode 100644 frame/window/tray/tray_gridview.h create mode 100644 frame/window/tray/tray_model.cpp create mode 100644 frame/window/tray/tray_model.h create mode 100644 frame/window/tray/tray_monitor.cpp create mode 100644 frame/window/tray/tray_monitor.h create mode 100644 frame/window/tray/widgets/basetraywidget.cpp create mode 100644 frame/window/tray/widgets/basetraywidget.h create mode 100644 frame/window/tray/widgets/expandiconwidget.cpp create mode 100644 frame/window/tray/widgets/expandiconwidget.h create mode 100644 frame/window/tray/widgets/indicatorplugin.cpp create mode 100644 frame/window/tray/widgets/indicatorplugin.h create mode 100644 frame/window/tray/widgets/indicatortrayitem.cpp create mode 100644 frame/window/tray/widgets/indicatortrayitem.h create mode 100644 frame/window/tray/widgets/snitrayitemwidget.cpp create mode 100644 frame/window/tray/widgets/snitrayitemwidget.h create mode 100644 frame/window/tray/widgets/systempluginitem.cpp create mode 100644 frame/window/tray/widgets/systempluginitem.h create mode 100644 frame/window/tray/widgets/xembedtrayitemwidget.cpp create mode 100644 frame/window/tray/widgets/xembedtrayitemwidget.h create mode 100644 frame/window/traymanagerwindow.cpp create mode 100644 frame/window/traymanagerwindow.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 31900057c..01f523d68 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,8 @@ include_directories( frame/util frame/window frame/window/components + frame/window/tray + frame/window/tray/widgets frame/xcb ../widgets ../interfaces @@ -84,6 +86,8 @@ aux_source_directory(frame/item/resources RESOURCES) aux_source_directory(frame/util UTIL) aux_source_directory(frame/window WINDOW) aux_source_directory(frame/window/components WINDOWCOMPONENTS) +aux_source_directory(frame/window/tray WINDOWTRAY) +aux_source_directory(frame/window/tray/widgets WINDOWTRAYWIDGET) aux_source_directory(frame/xcb XCB) file(GLOB SRC_PATH @@ -98,6 +102,8 @@ file(GLOB SRC_PATH ${UTIL} ${WINDOW} ${WINDOWCOMPONENTS} + ${WINDOWTRAY} + ${WINDOWTRAYWIDGET} ${XCB} ) diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index 8893e9a99..20724aa79 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -21,8 +21,9 @@ find_package(Qt5DBus REQUIRED) find_package(Qt5Svg REQUIRED) find_package(DtkWidget REQUIRED) find_package(DtkCMake REQUIRED) +find_package(dbusmenu-qt5 REQUIRED) -pkg_check_modules(XCB_EWMH REQUIRED xcb-ewmh x11 xcursor) +pkg_check_modules(XCB_EWMH REQUIRED xcb-image xcb-ewmh xcb-composite xtst x11 dbusmenu-qt5 xext xcursor) pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) pkg_check_modules(DtkGUI REQUIRED dtkgui) @@ -43,6 +44,7 @@ target_include_directories(${BIN_NAME} PUBLIC ${QGSettings_INCLUDE_DIRS} ${DtkGUI_INCLUDE_DIRS} ${Qt5Svg_INCLUDE_DIRS} + ${dbusmenu-qt5_INCLUDE_DIRS} ../interfaces ../widgets accessible @@ -55,6 +57,8 @@ target_include_directories(${BIN_NAME} PUBLIC util window window/components + window/tray + window/tray/widgets xcb ../plugins/tray ../plugins/show-desktop @@ -78,6 +82,7 @@ target_link_libraries(${BIN_NAME} PRIVATE ${QGSettings_LIBRARIES} ${DtkGUI_LIBRARIES} ${Qt5Svg_LIBRARIES} + -lpthread -lm ) if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "sw_64") diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index 012a92f5c..c941c78fa 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -59,7 +59,7 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con connect(static_cast(item), &TrayPluginItem::trayVisableCountChanged, this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection); } else { - item = new PluginsItem(itemInter, itemKey, pluginApi); + item = createPluginsItem(itemInter, itemKey, pluginApi); } mPluginsMap[itemInter][itemKey] = item; @@ -67,6 +67,11 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con emit pluginItemInserted(item); } +PluginsItem *DockPluginsController::createPluginsItem(PluginsItemInterface *const itemInter, const QString &itemKey, const QString &pluginApi) +{ + return new PluginsItem(itemInter, itemKey, pluginApi); +} + void DockPluginsController::itemUpdate(PluginsItemInterface *const itemInter, const QString &itemKey) { PluginsItem *item = static_cast(pluginItemAt(itemInter, itemKey)); diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index af759c5de..6765951cf 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -54,6 +54,9 @@ public: void startLoader(); +protected: + virtual PluginsItem *createPluginsItem(PluginsItemInterface *const itemInter, const QString &itemKey, const QString &pluginApi); + signals: void pluginItemInserted(PluginsItem *pluginItem) const; void pluginItemRemoved(PluginsItem *pluginItem) const; diff --git a/frame/controller/systemplugincontroller.cpp b/frame/controller/systemplugincontroller.cpp new file mode 100644 index 000000000..fc6ff25a5 --- /dev/null +++ b/frame/controller/systemplugincontroller.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#include "systemplugincontroller.h" +#include "pluginsiteminterface.h" +#include "utils.h" +#include "systempluginitem.h" + +#include +#include + +SystemPluginController::SystemPluginController(QObject *parent) + : AbstractPluginsController(parent) +{ + setObjectName("SystemTray"); +} + +void SystemPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + QMap> &mPluginsMap = pluginsMap(); + + // check if same item added + if (mPluginsMap.contains(itemInter)) + if (mPluginsMap[itemInter].contains(itemKey)) + return; + + SystemPluginItem *item = new SystemPluginItem(itemInter, itemKey); + connect(item, &SystemPluginItem::itemVisibleChanged, this, [ = ] (bool visible){ + emit visible ? pluginItemAdded(itemKey, item) : pluginItemRemoved(itemKey, item); + }, Qt::QueuedConnection); + + mPluginsMap[itemInter][itemKey] = item; + + // 隐藏的插件不加入到布局中 + if (Utils::SettingValue(QString("com.deepin.dde.dock.module.") + itemInter->pluginName(), QByteArray(), "enable", true).toBool()) + emit pluginItemAdded(itemKey, item); +} + +void SystemPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + if (!item) + return; + + item->update(); + + emit pluginItemUpdated(itemKey, item); +} + +void SystemPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + if (!item) + return; + + item->detachPluginWidget(); + + emit pluginItemRemoved(itemKey, item); + + QMap> &mPluginsMap = pluginsMap(); + mPluginsMap[itemInter].remove(itemKey); + + // do not delete the itemWidget object(specified in the plugin interface) + item->centralWidget()->setParent(nullptr); + + // just delete our wrapper object(PluginsItem) + item->deleteLater(); +} + +void SystemPluginController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) +{ + SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + if (!item) + return; + + Q_EMIT item->requestWindowAutoHide(autoHide); +} + +void SystemPluginController::requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + if (!item) + return; + + Q_EMIT item->requestRefershWindowVisible(); +} + +void SystemPluginController::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) +{ + SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + if (!item) + return; + + if (visible) { + item->showPopupApplet(itemInter->itemPopupApplet(itemKey)); + } else { + item->hidePopup(); + } +} + +int SystemPluginController::systemTrayItemSortKey(const QString &itemKey) +{ + auto inter = pluginInterAt(itemKey); + + if (!inter) { + return -1; + } + + return inter->itemSortKey(itemKey); +} + +void SystemPluginController::setSystemTrayItemSortKey(const QString &itemKey, const int order) +{ + auto inter = pluginInterAt(itemKey); + + if (!inter) { + return; + } + + inter->setSortKey(itemKey, order); +} + +const QVariant SystemPluginController::getValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant &fallback) +{ + auto inter = pluginInterAt(itemKey); + + if (!inter) { + return QVariant(); + } + + return getValue(inter, key, fallback); +} + +void SystemPluginController::saveValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant &value) +{ + auto inter = pluginInterAt(itemKey); + + if (!inter) { + return; + } + + saveValue(inter, key, value); +} + +void SystemPluginController::startLoader() +{ + QString pluginsDir("../plugins/system-trays"); + if (!QDir(pluginsDir).exists()) { + pluginsDir = "/usr/lib/dde-dock/plugins/system-trays"; + } + qDebug() << "using system tray plugins dir:" << pluginsDir; + + AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); +} diff --git a/frame/controller/systemplugincontroller.h b/frame/controller/systemplugincontroller.h new file mode 100644 index 000000000..6dbed0580 --- /dev/null +++ b/frame/controller/systemplugincontroller.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#ifndef SYSTEMTRAYSCONTROLLER_H +#define SYSTEMTRAYSCONTROLLER_H + +#include "pluginproxyinterface.h" +#include "abstractpluginscontroller.h" +#include "abstractpluginscontroller.h" + +#include + +#include +#include +#include +#include + +class PluginsItemInterface; +class SystemPluginItem; + +class SystemPluginController : public AbstractPluginsController +{ + Q_OBJECT + +public: + explicit SystemPluginController(QObject *parent = nullptr); + + // implements PluginProxyInterface + void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; + void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; + + int systemTrayItemSortKey(const QString &itemKey); + void setSystemTrayItemSortKey(const QString &itemKey, const int order); + + const QVariant getValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant& fallback = QVariant()); + void saveValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant &value); + + void startLoader(); + +signals: + void pluginItemAdded(const QString &itemKey, SystemPluginItem *pluginItem); + void pluginItemRemoved(const QString &itemKey, SystemPluginItem *pluginItem); + void pluginItemUpdated(const QString &itemKey, SystemPluginItem *pluginItem); +}; + +#endif // SYSTEMTRAYSCONTROLLER_H diff --git a/frame/item/arrow-down.svg b/frame/item/arrow-down.svg new file mode 100644 index 000000000..f2a7454e6 --- /dev/null +++ b/frame/item/arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/arrow-left.svg b/frame/item/arrow-left.svg new file mode 100644 index 000000000..947aca4ee --- /dev/null +++ b/frame/item/arrow-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/arrow-right.svg b/frame/item/arrow-right.svg new file mode 100644 index 000000000..c4f4b01ad --- /dev/null +++ b/frame/item/arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/arrow-up.svg b/frame/item/arrow-up.svg new file mode 100644 index 000000000..dc7f8328b --- /dev/null +++ b/frame/item/arrow-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/item.qrc b/frame/item/item.qrc index 7461879ca..b53265823 100644 --- a/frame/item/item.qrc +++ b/frame/item/item.qrc @@ -13,6 +13,10 @@ resources/arrow-right.svg resources/arrow-left.svg resources/arrow-down.svg + resources/arrow-up-dark.svg + resources/arrow-right-dark.svg + resources/arrow-left-dark.svg + resources/arrow-down-dark.svg resources/application-x-desktop.svg resources/close_round_hover.svg resources/close_round_press.svg diff --git a/frame/item/resources/arrow-down-dark.svg b/frame/item/resources/arrow-down-dark.svg new file mode 100644 index 000000000..6d5436cab --- /dev/null +++ b/frame/item/resources/arrow-down-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/arrow-left-dark.svg b/frame/item/resources/arrow-left-dark.svg new file mode 100644 index 000000000..1f32c3315 --- /dev/null +++ b/frame/item/resources/arrow-left-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/arrow-right-dark.svg b/frame/item/resources/arrow-right-dark.svg new file mode 100644 index 000000000..04d121e0b --- /dev/null +++ b/frame/item/resources/arrow-right-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/item/resources/arrow-up-dark.svg b/frame/item/resources/arrow-up-dark.svg new file mode 100644 index 000000000..2a72912ff --- /dev/null +++ b/frame/item/resources/arrow-up-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp new file mode 100644 index 000000000..ce95fc966 --- /dev/null +++ b/frame/window/components/datetimedisplayer.cpp @@ -0,0 +1,153 @@ +#include "datetimedisplayer.h" + +#include + +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +#define DATETIMESIZE 40 + +DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) + : QWidget (parent) + , m_timedateInter(new Timedate("com.deepin.daemon.Timedate", "/com/deepin/daemon/Timedate", QDBusConnection::sessionBus(), this)) + , m_position(Dock::Position::Bottom) + , m_timeFont(DFontSizeManager::instance()->t6()) + , m_dateFont(DFontSizeManager::instance()->t10()) +{ + initUi(); + setShortDateFormat(m_timedateInter->shortDateFormat()); + setShortTimeFormat(m_timedateInter->shortTimeFormat()); + connect(m_timedateInter, &Timedate::ShortDateFormatChanged, this, &DateTimeDisplayer::setShortDateFormat); + connect(m_timedateInter, &Timedate::ShortTimeFormatChanged, this, &DateTimeDisplayer::setShortTimeFormat); + // 连接日期时间修改信号,更新日期时间插件的布局 + connect(m_timedateInter, &Timedate::TimeUpdate, this, [ this ] { + update(); + }); +} + +DateTimeDisplayer::~DateTimeDisplayer() +{ +} + +void DateTimeDisplayer::setPositon(Dock::Position position) +{ + if (m_position == position) + return; + + m_position = position; + setCurrentPolicy(); +} + +void DateTimeDisplayer::setCurrentPolicy() +{ + switch (m_position) { + case Dock::Position::Top: + case Dock::Position::Bottom: { + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + break; + } + case Dock::Position::Left: + case Dock::Position::Right: { + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + break; + } + } +} + +void DateTimeDisplayer::initUi() +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); +} + +QSize DateTimeDisplayer::suitableSize() +{ + DateTimeInfo info = dateTimeInfo(); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + return QSize(info.m_dateRect.right(), height()); + + return QSize(width(), info.m_dateRect.bottom()); +} + +DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo() +{ + DateTimeInfo info; + const QDateTime current = QDateTime::currentDateTime(); + + const Dock::Position position = qApp->property(PROP_POSITION).value(); + + info.m_timeRect = rect(); + info.m_dateRect = rect(); + + QString format = m_shortTimeFormat; + if (!m_timedateInter->use24HourFormat()) { + if (position == Dock::Top || position == Dock::Bottom) + format = format.append(" AP"); + else + format = format.append("\nAP"); + } + + info.m_time = current.toString(format); + info.m_date = current.toString(m_shortDateFormat); + int timeWidth = QFontMetrics(m_timeFont).boundingRect(info.m_time).width() + 12 * 2; + int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; + + if (position == Dock::Top || position == Dock::Bottom) { + info.m_timeRect = QRect(10, 0, timeWidth, height()); + int right = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2; + info.m_dateRect = QRect(right, 0, dateWidth, height()); + } else { + info.m_timeRect = QRect(0, 0, timeWidth, DATETIMESIZE / 2); + info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, dateWidth, DATETIMESIZE / 2); + } + return info; +} + +void DateTimeDisplayer::paintEvent(QPaintEvent *e) +{ + Q_UNUSED(e); + + DateTimeInfo info = dateTimeInfo(); + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + painter.setPen(QPen(palette().brightText(), 1)); + + painter.drawText(info.m_timeRect, Qt::AlignLeft | Qt::AlignVCenter, info.m_time); + + painter.setFont(m_dateFont); + painter.drawText(info.m_dateRect, Qt::AlignLeft | Qt::AlignVCenter, info.m_date); +} + +void DateTimeDisplayer::setShortDateFormat(int type) +{ + switch (type) { + case 0: m_shortDateFormat = "yyyy/M/d"; break; + case 1: m_shortDateFormat = "yyyy-M-d"; break; + case 2: m_shortDateFormat = "yyyy.M.d"; break; + case 3: m_shortDateFormat = "yyyy/MM/dd"; break; + case 4: m_shortDateFormat = "yyyy-MM-dd"; break; + case 5: m_shortDateFormat = "yyyy.MM.dd"; break; + case 6: m_shortDateFormat = "yy/M/d"; break; + case 7: m_shortDateFormat = "yy-M-d"; break; + case 8: m_shortDateFormat = "yy.M.d"; break; + default: m_shortDateFormat = "yyyy-MM-dd"; break; + } + + update(); +} + +void DateTimeDisplayer::setShortTimeFormat(int type) +{ + switch (type) { + case 0: m_shortTimeFormat = "h:mm"; break; + case 1: m_shortTimeFormat = "hh:mm"; break; + default: m_shortTimeFormat = "hh:mm"; break; + } + + update(); +} diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h new file mode 100644 index 000000000..dbb8b1a9f --- /dev/null +++ b/frame/window/components/datetimedisplayer.h @@ -0,0 +1,51 @@ +#ifndef DATETIMEDISPLAYER_H +#define DATETIMEDISPLAYER_H + +#include "constants.h" + +#include +#include + +#include + +using Timedate = com::deepin::daemon::Timedate; + +class DateTimeDisplayer : public QWidget +{ + Q_OBJECT + +private: + struct DateTimeInfo { + QString m_time; + QString m_date; + QRect m_timeRect; + QRect m_dateRect; + }; + +public: + explicit DateTimeDisplayer(QWidget *parent = nullptr); + ~DateTimeDisplayer() override; + void setPositon(Dock::Position position); + QSize suitableSize(); + + private: + void initUi(); + void setCurrentPolicy(); + DateTimeInfo dateTimeInfo(); + + void paintEvent(QPaintEvent *e) override; + + private Q_SLOTS: + void setShortDateFormat(int type); + void setShortTimeFormat(int type); + + private: + Timedate *m_timedateInter; + QString m_shortDateFormat; + QString m_shortTimeFormat; + Dock::Position m_position; + mutable QFont m_timeFont; + mutable QFont m_dateFont; +}; + +#endif // DATETIMEDISPLAYER_H diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp new file mode 100644 index 000000000..ce6e8fdbe --- /dev/null +++ b/frame/window/systempluginwindow.cpp @@ -0,0 +1,167 @@ +#include "systempluginwindow.h" +#include "systemplugincontroller.h" +#include "systempluginitem.h" +#include "dockpluginscontroller.h" + +#include +#include +#include + +#define MAXICONSIZE 48 +#define MINICONSIZE 24 +#define ICONMARGIN 8 + +SystemPluginWindow::SystemPluginWindow(QWidget *parent) + : DBlurEffectWidget(parent) + , m_pluginController(new FixedPluginController(this)) + , m_listView(new DListView(this)) + , m_position(Dock::Position::Bottom) + , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) +{ + initUi(); + connect(m_pluginController, &DockPluginsController::pluginItemInserted, this, &SystemPluginWindow::onPluginItemAdded); + connect(m_pluginController, &DockPluginsController::pluginItemRemoved, this, &SystemPluginWindow::onPluginItemRemoved); + connect(m_pluginController, &DockPluginsController::pluginItemUpdated, this, &SystemPluginWindow::onPluginItemUpdated); + QMetaObject::invokeMethod(m_pluginController, &DockPluginsController::startLoader, Qt::QueuedConnection); +} + +SystemPluginWindow::~SystemPluginWindow() +{ +} + +void SystemPluginWindow::setPositon(Position position) +{ + if (m_position == position) + return; + + m_position = position; + + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); + else + m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); +} + +QSize SystemPluginWindow::suitableSize() +{ + QMargins m = m_mainLayout->contentsMargins(); + if (m_mainLayout->direction() == QBoxLayout::Direction::LeftToRight) { + int itemSize = height() - m_mainLayout->contentsMargins().top() - m_mainLayout->contentsMargins().bottom(); + int itemWidth = m.left() + m.right(); + for (int i = 0; i < m_mainLayout->count(); i++) { + QWidget *widget = m_mainLayout->itemAt(i)->widget(); + if (!widget) + continue; + + PluginsItem *item = qobject_cast(widget); + if (!item) + continue; + + // 如果是横向的,则高度是固定,高宽一致,因此读取高度作为它的尺寸值 + itemWidth += itemSize; + if (i < m_mainLayout->count() - 1) + itemWidth += m_mainLayout->spacing(); + } + + itemWidth += m.right(); + return QSize(itemWidth, height()); + } + + int itemSize = width() - m_mainLayout->contentsMargins().left() - m_mainLayout->contentsMargins().right(); + int itemHeight = m.top(); + for (int i = 0; i < m_mainLayout->count(); i++) { + QWidget *widget = m_mainLayout->itemAt(i)->widget(); + if (!widget) + continue; + + PluginsItem *item = qobject_cast(widget); + if (!item) + continue; + + itemHeight += itemSize; + if (i < m_mainLayout->count() - 1) + itemHeight += m_mainLayout->spacing(); + } + + itemHeight += m.bottom(); + + return QSize(width(), itemHeight); +} + +void SystemPluginWindow::resizeEvent(QResizeEvent *event) +{ + DBlurEffectWidget::resizeEvent(event); + Q_EMIT pluginSizeChanged(); +} + +void SystemPluginWindow::initUi() +{ + m_mainLayout->setContentsMargins(8, 8, 8, 8); + m_mainLayout->setSpacing(5); +} + +int SystemPluginWindow::calcIconSize() const +{ + switch (m_position) { + case Dock::Position::Top: + case Dock::Position::Bottom: { + if (height() >= 56) + return MAXICONSIZE; + if (height() <= 40) + return MINICONSIZE; + return height() - ICONMARGIN * 2; + break; + } + case Dock::Position::Left: + case Dock::Position::Right: { + if (width() >= 56) + return MAXICONSIZE; + if (width() <= 40) + return MINICONSIZE; + return width() - ICONMARGIN * 2; + } + } + return -1; +} + +void SystemPluginWindow::onPluginItemAdded(PluginsItem *pluginItem) +{ + if (m_mainLayout->children().contains(pluginItem)) + return; + + m_mainLayout->addWidget(pluginItem); + Q_EMIT pluginSizeChanged(); +} + +void SystemPluginWindow::onPluginItemRemoved(PluginsItem *pluginItem) +{ + if (!m_mainLayout->children().contains(pluginItem)) + return; + + m_mainLayout->removeWidget(pluginItem); + Q_EMIT pluginSizeChanged(); +} + +void SystemPluginWindow::onPluginItemUpdated(PluginsItem *pluginItem) +{ + pluginItem->refreshIcon(); +} + +// can loader plugins +FixedPluginController::FixedPluginController(QObject *parent) + : DockPluginsController(parent) +{ +} + +const QVariant FixedPluginController::getValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &fallback) +{ + if (key == "enable") + return (itemInter->pluginName().compare("shutdown") == 0); + + return AbstractPluginsController::getValue(itemInter, key, fallback); +} + +PluginsItem *FixedPluginController::createPluginsItem(PluginsItemInterface * const itemInter, const QString &itemKey, const QString &pluginApi) +{ + return new StretchPluginsItem(itemInter, itemKey, pluginApi); +} diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h new file mode 100644 index 000000000..56b68f0ef --- /dev/null +++ b/frame/window/systempluginwindow.h @@ -0,0 +1,59 @@ +#ifndef SYSTEMPLUGINWINDOW_H +#define SYSTEMPLUGINWINDOW_H + +#include "constants.h" +#include "dockpluginscontroller.h" + +#include + +class DockPluginsController; +class PluginsItem; +class QBoxLayout; + +namespace Dtk { namespace Widget { class DListView; } } + +DWIDGET_USE_NAMESPACE + +class SystemPluginWindow : public DBlurEffectWidget +{ + Q_OBJECT + +Q_SIGNALS: + void pluginSizeChanged(); + +public: + explicit SystemPluginWindow(QWidget *parent = nullptr); + ~SystemPluginWindow() override; + void setPositon(Dock::Position position); + QSize suitableSize(); + +private: + void initUi(); + int calcIconSize() const; + void resizeEvent(QResizeEvent *event) override; + +private Q_SLOTS: + void onPluginItemAdded(PluginsItem *pluginItem); + void onPluginItemRemoved(PluginsItem *pluginItem); + void onPluginItemUpdated(PluginsItem *pluginItem); + +private: + DockPluginsController *m_pluginController; + DListView *m_listView; + Dock::Position m_position; + QBoxLayout *m_mainLayout; +}; + +class FixedPluginController : public DockPluginsController +{ + Q_OBJECT + +public: + FixedPluginController(QObject *parent); + +protected: + const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override; + PluginsItem *createPluginsItem(PluginsItemInterface *const itemInter, const QString &itemKey, const QString &pluginApi) override; +}; + +#endif // SYSTEMPLUGINWINDOW_H diff --git a/frame/window/tray/dbustraymanager.cpp b/frame/window/tray/dbustraymanager.cpp new file mode 100644 index 000000000..638174b2f --- /dev/null +++ b/frame/window/tray/dbustraymanager.cpp @@ -0,0 +1,31 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager com.deepin.dde.TrayManager.xml + * + * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "dbustraymanager.h" + +/* + * Implementation of interface class DBusTrayManager + */ + +DBusTrayManager::DBusTrayManager(QObject *parent) + : QDBusAbstractInterface("com.deepin.dde.TrayManager", "/com/deepin/dde/TrayManager", staticInterfaceName(), QDBusConnection::sessionBus(), parent) +{ + qRegisterMetaType("TrayList"); + qDBusRegisterMetaType(); + + QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); +} + +DBusTrayManager::~DBusTrayManager() +{ + QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage))); +} + diff --git a/frame/window/tray/dbustraymanager.h b/frame/window/tray/dbustraymanager.h new file mode 100644 index 000000000..f587babb8 --- /dev/null +++ b/frame/window/tray/dbustraymanager.h @@ -0,0 +1,113 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager com.deepin.dde.TrayManager.xml + * + * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef DBUSTRAYMANAGER_H_1467094672 +#define DBUSTRAYMANAGER_H_1467094672 + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef QList TrayList; + +/* + * Proxy class for interface com.deepin.dde.TrayManager + */ +class DBusTrayManager: public QDBusAbstractInterface +{ + Q_OBJECT + + Q_SLOT void __propertyChanged__(const QDBusMessage& msg) + { + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName !="com.deepin.dde.TrayManager") + return; + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + foreach(const QString &prop, changedProps.keys()) { + const QMetaObject* self = metaObject(); + for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) { + QMetaProperty p = self->property(i); + if (p.name() == prop) { + Q_EMIT p.notifySignal().invoke(this); + } + } + } + } +public: + static inline const char *staticInterfaceName() + { return "com.deepin.dde.TrayManager"; } + +public: + explicit DBusTrayManager(QObject *parent = 0); + + ~DBusTrayManager(); + + Q_PROPERTY(TrayList TrayIcons READ trayIcons NOTIFY TrayIconsChanged) + inline TrayList trayIcons() const + { return qvariant_cast< TrayList >(property("TrayIcons")); } + +public Q_SLOTS: // METHODS + inline QDBusPendingReply<> EnableNotification(uint in0, bool in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("EnableNotification"), argumentList); + } + + inline QDBusPendingReply GetName(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("GetName"), argumentList); + } + + inline QDBusPendingReply Manage() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Manage"), argumentList); + } + + inline QDBusPendingReply<> RetryManager() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("RetryManager"), argumentList); + } + + inline QDBusPendingReply Unmanage() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Unmanage"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void Added(uint in0); + void Changed(uint in0); + void Inited(); + void Removed(uint in0); +// begin property changed signals +void TrayIconsChanged(); +}; + +namespace com { + namespace deepin { + namespace dde { + typedef ::DBusTrayManager TrayManager; + } + } +} +#endif diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp new file mode 100644 index 000000000..1a3a601a9 --- /dev/null +++ b/frame/window/tray/tray_delegate.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2018 ~ 2025 Deepin Technology Co., Ltd. + * + * Author: fanpengcheng + * + * Maintainer: fanpengcheng + * + * 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 . + */ +#include "tray_delegate.h" +#include "tray_gridview.h" +#include "tray_model.h" +#include "widgets/xembedtrayitemwidget.h" +#include "widgets/indicatortrayitem.h" +#include "widgets/indicatorplugin.h" +#include "widgets/snitrayitemwidget.h" +#include "widgets/expandiconwidget.h" +#include "utils.h" + +#include +#include +#include +#include +#include + +#include +#include + +TrayDelegate::TrayDelegate(QObject *parent) + : QStyledItemDelegate(parent) + , m_position(Dock::Position::Bottom) +{ +} + +void TrayDelegate::setPositon(Dock::Position position) +{ + m_position = position; +} + +QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(option); + + TrayIconType type = index.data(TrayModel::TypeRole).value(); + QString key = index.data(TrayModel::KeyRole).value(); + QString servicePath = index.data(TrayModel::ServiceRole).value(); + quint32 winId = index.data(TrayModel::WinIdRole).value(); + + BaseTrayWidget *trayWidget = nullptr; + if(type == TrayIconType::XEMBED) { + if (Utils::IS_WAYLAND_DISPLAY) { + trayWidget = new XEmbedTrayItemWidget(winId, nullptr, nullptr, parent); + } else { + int screenp = 0; + static xcb_connection_t *xcb_connection = xcb_connect(qgetenv("DISPLAY"), &screenp); + static Display *m_display = XOpenDisplay(nullptr); + trayWidget = new XEmbedTrayItemWidget(winId, xcb_connection, m_display, parent) ; + } + + const TrayModel *model = qobject_cast(index.model()); + if (model) + connect(model, &TrayModel::requestUpdateIcon, trayWidget, &BaseTrayWidget::updateIcon); + } else if (type == TrayIconType::SNI) { + trayWidget = new SNITrayItemWidget(servicePath, parent); + } else if (type == TrayIconType::EXPANDICON) { + ExpandIconWidget *widget = new ExpandIconWidget(parent); + widget->setPositonValue(m_position); + connect(widget, &ExpandIconWidget::trayVisbleChanged, this, [ = ](bool visible) { + Q_EMIT visibleChanged(index, visible); + }); + connect(this, &TrayDelegate::requestDrag, this, [ = ](bool on) { + if (on) { + widget->setTrayPanelVisible(true); + } else { + // 如果释放鼠标,则判断当前鼠标的位置是否在托盘内部,如果在,则无需隐藏 + QPoint currentPoint = QCursor::pos(); + TrayGridView *view = widget->popupTrayView(); + if (view->geometry().contains(currentPoint)) + widget->setTrayPanelVisible(true); + else + widget->setTrayPanelVisible(false); + } + }); + trayWidget = widget; + } else if (type == TrayIconType::INDICATOR) { + QString indicateName = key; + int flagIndex = indicateName.indexOf("indicator:"); + if (flagIndex >= 0) + indicateName = indicateName.right(indicateName.length() - QString("indicator:").length()); + IndicatorTrayItem *indicatorWidget = new IndicatorTrayItem(indicateName, parent); + connect(indicatorWidget, &IndicatorTrayItem::removed, this, [ = ]{ + Q_EMIT removeRow(index); + }); + trayWidget = indicatorWidget; + } + + return trayWidget; +} + +void TrayDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + BaseTrayWidget *widget = static_cast(editor); + if (widget) { + widget->setNeedShow(!index.data(TrayModel::Blank).toBool()); + } +} + +QSize TrayDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(option); + Q_UNUSED(index); + + return QSize(ITEM_SIZE, ITEM_SIZE); +} + +void TrayDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(index); + QRect rect = option.rect; + editor->setGeometry(rect.x() + ITEM_SPACING, rect.y() + ITEM_SPACING, ITEM_SIZE - (2 * ITEM_SPACING), ITEM_SIZE - 2 * ITEM_SPACING); +} diff --git a/frame/window/tray/tray_delegate.h b/frame/window/tray/tray_delegate.h new file mode 100644 index 000000000..294153029 --- /dev/null +++ b/frame/window/tray/tray_delegate.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2018 ~ 2025 Deepin Technology Co., Ltd. + * + * Author: fanpengcheng + * + * Maintainer: fanpengcheng + * + * 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 . + */ +#ifndef TRAYDELEGATE_H +#define TRAYDELEGATE_H + +#include "constants.h" + +#include + +#define ITEM_SIZE 30 +#define ITEM_SPACING 5 + +struct WinInfo; + +class TrayDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +Q_SIGNALS: + void removeRow(const QModelIndex &) const; + void visibleChanged(const QModelIndex &, bool) const; + void requestDrag(bool) const; + +public: + explicit TrayDelegate(QObject *parent = nullptr); + void setPositon(Dock::Position position); + +protected: + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; + void setEditorData(QWidget *editor, const QModelIndex &index) const override ; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + +private: + Dock::Position m_position; +}; + +#endif // TRAYDELEGATE_H diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp new file mode 100644 index 000000000..cb5247e7b --- /dev/null +++ b/frame/window/tray/tray_gridview.cpp @@ -0,0 +1,375 @@ +#include "tray_gridview.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tray_model.h" +#include "basetraywidget.h" + +TrayGridView::TrayGridView(QWidget *parent) + : DListView(parent) + , m_aniCurveType(QEasingCurve::Linear) + , m_aniDuringTime(250) + , m_dragDistance(15) + , m_aniStartTime(new QTimer(this)) + , m_pressed(false) + , m_aniRunning(false) +{ + initUi(); +} + +void TrayGridView::setDragDistance(int pixel) +{ + m_dragDistance = pixel; +} + +void TrayGridView::setAnimationProperty(const QEasingCurve::Type easing, const int duringTime) +{ + m_aniCurveType = easing; + m_aniDuringTime = duringTime; +} + +void TrayGridView::moveAnimation() +{ + if (m_aniRunning || m_aniStartTime->isActive()) + return; + + const QModelIndex dropModelIndex = indexAt(m_dropPos); + if (!dropModelIndex.isValid()) + return; + + const QModelIndex dragModelIndex = indexAt(m_dragPos); + if (dragModelIndex == dropModelIndex) + return; + + if (!dragModelIndex.isValid()) { + m_dragPos = indexRect(dropModelIndex).center(); + return; + } + + TrayModel *listModel = qobject_cast(model()); + if (!listModel) + return; + + listModel->clearDragDropIndex(); + listModel->setDragingIndex(dragModelIndex); + listModel->setDragDropIndex(dropModelIndex); + + const int startPos = dragModelIndex.row(); + const int endPos = dropModelIndex.row(); + + const bool next = startPos <= endPos; + const int start = next ? startPos : endPos; + const int end = !next ? startPos : endPos; + + for (int i = start + next; i <= (end - !next); i++) + createAnimation(i, next, (i == (end - !next))); + + m_dropPos = indexRect(dropModelIndex).center(); + m_dragPos = indexRect(dropModelIndex).center(); +} + +const QModelIndex TrayGridView::modelIndex(const int index) const +{ + return model()->index(index, 0, QModelIndex()); +} + +const QRect TrayGridView::indexRect(const QModelIndex &index) const +{ + return rectForIndex(index); +} + +void TrayGridView::dropSwap() +{ + qDebug() << "drop end"; + TrayModel *listModel = qobject_cast(model()); + if (!listModel) + return; + + QModelIndex index = indexAt(m_dropPos); + if (!index.isValid()) + return; + + listModel->dropSwap(index.row()); + clearDragModelIndex(); + m_aniRunning = false; + setState(NoState); +} + +void TrayGridView::clearDragModelIndex() +{ + TrayModel *listModel = static_cast(this->model()); + if (!listModel) + return; + + listModel->clearDragDropIndex(); +} + +void TrayGridView::createAnimation(const int pos, const bool moveNext, const bool isLastAni) +{ + qDebug() << "create moveAnimation"; + const QModelIndex index(modelIndex(pos)); + if (!index.isValid()) + return; + + QLabel *floatLabel = new QLabel(this); + QPropertyAnimation *ani = new QPropertyAnimation(floatLabel, "pos", floatLabel); + qreal ratio = qApp->devicePixelRatio(); + + BaseTrayWidget *widget = qobject_cast(indexWidget(index)); + if (!widget) + return; + + QPixmap pixmap = widget->icon(); + + QString text = index.data(Qt::DisplayRole).toString(); + + pixmap.scaled(pixmap.size() * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation); + pixmap.setDevicePixelRatio(ratio); + + floatLabel->setFixedSize(indexRect(index).size()); + floatLabel->setPixmap(pixmap); + floatLabel->show(); + + ani->setStartValue(indexRect(index).center() - QPoint(0, floatLabel->height() /2)); + ani->setEndValue(indexRect(modelIndex(moveNext ? pos - 1 : pos + 1)).center() - QPoint(0, floatLabel->height() /2)); + ani->setEasingCurve(m_aniCurveType); + ani->setDuration(m_aniDuringTime); + + connect(ani, &QPropertyAnimation::finished, floatLabel, &QLabel::deleteLater); + if (isLastAni) { + m_aniRunning = true; + + TrayModel *model = qobject_cast(this->model()); + if (!model) + return; + + connect(ani, &QPropertyAnimation::finished, this, &TrayGridView::dropSwap); + connect(ani, &QPropertyAnimation::valueChanged, m_aniStartTime, &QTimer::stop); + } else { + } + + ani->start(QPropertyAnimation::DeleteWhenStopped); +} + +void TrayGridView::mousePressEvent(QMouseEvent *e) +{ + if (e->buttons() == Qt::LeftButton && !m_aniRunning) + m_dragPos = e->pos(); + + m_pressed = true; +} + +void TrayGridView::mouseMoveEvent(QMouseEvent *e) +{ + setState(QAbstractItemView::NoState); + e->accept(); + + if (e->buttons() == Qt::RightButton) + return DListView::mouseMoveEvent(e); + + QModelIndex index = indexAt(e->pos()); + if (!index.isValid()) + return DListView::mouseMoveEvent(e); + + if (m_pressed && (qAbs(e->pos().x() - m_dragPos.x()) > m_dragDistance || + qAbs(e->pos().y() - m_dragPos.y()) > m_dragDistance)) { + qDebug() << "start drag"; + beginDrag(Qt::CopyAction | Qt::MoveAction); + } +} + +void TrayGridView::mouseReleaseEvent(QMouseEvent *e) +{ + m_pressed = false; +} + +void TrayGridView::dragEnterEvent(QDragEnterEvent *e) +{ + const QModelIndex index = indexAt(e->pos()); + + if (model()->canDropMimeData(e->mimeData(), e->dropAction(), index.row(), + index.column(), QModelIndex())) + e->accept(); + else + e->ignore(); + + Q_EMIT dragEntered(); +} + +void TrayGridView::dragLeaveEvent(QDragLeaveEvent *e) +{ + m_aniStartTime->stop(); + e->accept(); + dragLeaved(); +} + +void TrayGridView::dragMoveEvent(QDragMoveEvent *e) +{ + m_aniStartTime->stop(); + if (m_aniRunning) + return; + + setState(QAbstractItemView::DraggingState); + + QModelIndex index = indexAt(e->pos()); + if (index.isValid()) { + if (m_dropPos != indexRect(index).center()) { + qDebug() << "update drop position: " << index.row(); + m_dropPos = indexRect(index).center(); + } + } + + if (m_pressed) + m_aniStartTime->start(); +} + +void TrayGridView::dropEvent(QDropEvent *e) +{ + setState(DListView::NoState); + clearDragModelIndex(); + + if (m_aniStartTime->isActive()) + m_aniStartTime->stop(); + + if (e->mimeData()->formats().contains("type") && e->source() != this) { + e->setDropAction(Qt::CopyAction); + e->accept(); + + TrayModel *m = qobject_cast(model()); + if (m) { + WinInfo info; + info.type = static_cast(e->mimeData()->data("type").toInt()); + info.key = static_cast(e->mimeData()->data("key")); + info.winId = static_cast(e->mimeData()->data("winId").toInt()); + info.servicePath = static_cast(e->mimeData()->data("servicePath")); + m->addRow(info); + } + } else { + e->ignore(); + } + + DListView::dropEvent(e); +} + +void TrayGridView::beginDrag(Qt::DropActions supportedActions) +{ + QModelIndex modelIndex = indexAt(m_dragPos); + TrayIconType trayType = modelIndex.data(TrayModel::Role::TypeRole).value(); + // 展开图标不能移动 + if (trayType == TrayIconType::EXPANDICON) + return; + + m_dropPos = indexRect(modelIndex).center(); + + TrayModel *listModel = qobject_cast(model()); + if (!listModel) + return; + + BaseTrayWidget *widget = qobject_cast(indexWidget(modelIndex)); + if (!widget) + return; + + auto pixmap = widget->icon(); + + QString text = modelIndex.data(Qt::DisplayRole).toString(); + QString itemKey = modelIndex.data(TrayModel::Role::KeyRole).toString(); + qreal ratio = qApp->devicePixelRatio(); + // 创建拖拽释放时的应用图标 + QLabel *pixLabel = new QLabel(this); + pixLabel->setPixmap(pixmap); + pixLabel->setFixedSize(indexRect(modelIndex).size() / ratio); + + QRect rectIcon(pixLabel->rect().topLeft(), pixLabel->size()); + + listModel->setDragingIndex(modelIndex); + + QDrag *drag = new QDrag(this); + pixmap.scaled(pixmap.size() * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation); + pixmap.setDevicePixelRatio(ratio); + drag->setPixmap(pixmap); + drag->setHotSpot(pixmap.rect().center() / ratio); + QMimeData *data = model()->mimeData(QModelIndexList() << modelIndex); + data->setImageData(pixmap); + drag->setMimeData(data); + + setState(DraggingState); + + listModel->setDragKey(itemKey); + + Qt::DropAction dropAct = drag->exec(supportedActions); + + // 拖拽完成结束动画 + m_aniStartTime->stop(); + m_pressed = false; + + Q_EMIT dragEntered(); + if (dropAct == Qt::IgnoreAction) { + QPropertyAnimation *posAni = new QPropertyAnimation(pixLabel, "pos", pixLabel); + connect(posAni, &QPropertyAnimation::finished, [&, listModel, pixLabel] () { + pixLabel->hide(); + pixLabel->deleteLater(); + listModel->setDragKey(QString()); + clearDragModelIndex(); + + m_dropPos = QPoint(); + m_dragPos = QPoint(); + }); + posAni->setEasingCurve(QEasingCurve::Linear); + posAni->setDuration(m_aniDuringTime); + posAni->setStartValue((QCursor::pos() - QPoint(0, pixLabel->height() / 2))); + posAni->setEndValue(mapToGlobal(m_dropPos) - QPoint(0, pixLabel->height() / 2)); + pixLabel->show(); + posAni->start(QAbstractAnimation::DeleteWhenStopped); + } else { + listModel->setDragKey(QString()); + clearDragModelIndex(); + + m_dropPos = QPoint(); + m_dragPos = QPoint(); + + Q_EMIT requestRemove(itemKey); + } +} + +void TrayGridView::initUi() +{ + setAcceptDrops(true); + setDragEnabled(true); + setDragDropMode(QAbstractItemView::DragDrop); + setDropIndicatorShown(false); + + setMouseTracking(false); + setUniformItemSizes(true); + setFocusPolicy(Qt::NoFocus); + setMovement(DListView::Free); + setOrientation(QListView::LeftToRight, true); + setLayoutMode(DListView::Batched); + setResizeMode(DListView::Adjust); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setFrameStyle(QFrame::NoFrame); + setContentsMargins(0, 0, 0, 0); + setSpacing(0); + setItemSpacing(0); + setBackgroundType(DStyledItemDelegate::RoundedBackground); + setSelectionMode(QListView::SingleSelection); + setVerticalScrollMode(QListView::ScrollPerPixel); + + viewport()->setAcceptDrops(true); + viewport()->setAutoFillBackground(false); + + m_aniStartTime->setInterval(10); + m_aniStartTime->setSingleShot(true); + + connect(m_aniStartTime, &QTimer::timeout, this, &TrayGridView::moveAnimation); +} diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h new file mode 100644 index 000000000..0009370a4 --- /dev/null +++ b/frame/window/tray/tray_gridview.h @@ -0,0 +1,63 @@ +#ifndef TRAYGRIDVIEW_H +#define TRAYGRIDVIEW_H + +#include "constants.h" + +#include + +#include + +DWIDGET_USE_NAMESPACE + +class TrayGridView : public DListView +{ + Q_OBJECT + +public: + TrayGridView(QWidget *parent = Q_NULLPTR); + + void setDragDistance(int pixel); + void setAnimationProperty(const QEasingCurve::Type easing, const int duringTime = 250); + void moveAnimation(); + const QModelIndex modelIndex(const int index) const; + const QRect indexRect(const QModelIndex &index) const; + void dropSwap(); + +Q_SIGNALS: + void requestRemove(const QString &); + void dragLeaved(); + void dragEntered(); + +public Q_SLOTS: + void clearDragModelIndex(); + +protected: + void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + + void dragEnterEvent(QDragEnterEvent *e) Q_DECL_OVERRIDE; + void dragLeaveEvent(QDragLeaveEvent *e) Q_DECL_OVERRIDE; + void dragMoveEvent(QDragMoveEvent *e) Q_DECL_OVERRIDE; + void dropEvent(QDropEvent *e) Q_DECL_OVERRIDE; + void beginDrag(Qt::DropActions supportedActions); + +private: + void initUi(); + void createAnimation(const int pos, const bool moveNext, const bool isLastAni); + +private: + QEasingCurve::Type m_aniCurveType; + int m_aniDuringTime; + + QPoint m_dragPos; + QPoint m_dropPos; + + int m_dragDistance; + + QTimer *m_aniStartTime; + bool m_pressed; + bool m_aniRunning; +}; + +#endif // GRIDVIEW_H diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp new file mode 100644 index 000000000..b878ffb86 --- /dev/null +++ b/frame/window/tray/tray_model.cpp @@ -0,0 +1,411 @@ +#include "tray_model.h" +#include "tray_monitor.h" + +#include "indicatortrayitem.h" +#include "indicatorplugin.h" + +#include +#include +#include +#include +#include + +#define TRAY_DRAG_FALG "tray_drag" + +TrayModel::TrayModel(QListView *view, bool isIconTray, bool hasInputMethod, QObject *parent) + : QAbstractListModel(parent) + , m_dragModelIndex(QModelIndex()) + , m_dropModelIndex(QModelIndex()) + , m_view(view) + , m_monitor(new TrayMonitor(this)) + , m_isTrayIcon(isIconTray) + , m_hasInputMethod(hasInputMethod) +{ + Q_ASSERT(m_view); + + if (isIconTray) { + connect(m_monitor, &TrayMonitor::xEmbedTrayAdded, this, &TrayModel::onXEmbedTrayAdded); + connect(m_monitor, &TrayMonitor::indicatorFounded, this, &TrayModel::onIndicatorFounded); + } + connect(m_monitor, &TrayMonitor::xEmbedTrayRemoved, this, &TrayModel::onXEmbedTrayRemoved); + connect(m_monitor, &TrayMonitor::requestUpdateIcon, this, &TrayModel::requestUpdateIcon); + connect(m_monitor, &TrayMonitor::sniTrayAdded, this, &TrayModel::onSniTrayAdded); + connect(m_monitor, &TrayMonitor::sniTrayRemoved, this, &TrayModel::onSniTrayRemoved); +} + +void TrayModel::dropSwap(int newPos) +{ + if (!m_dragModelIndex.isValid()) + return; + + removeRows(m_dragModelIndex.row(), 1, QModelIndex()); + dropInsert(newPos); + + emit QAbstractItemModel::dataChanged(m_dragModelIndex, m_dropModelIndex); +} + +void TrayModel::dropInsert(int newPos) +{ + beginInsertRows(QModelIndex(), newPos, newPos); + WinInfo name = m_dragInfo; + m_winInfos.insert(newPos, name); + // 更新输入法的位置 + endInsertRows(); +} + +void TrayModel::clearDragDropIndex() +{ + const QModelIndex startIndex = m_dragModelIndex; + const QModelIndex endIndex = m_dropModelIndex; + + m_dragModelIndex = m_dropModelIndex = QModelIndex(); + + emit QAbstractItemModel::dataChanged(startIndex, endIndex); + emit QAbstractItemModel::dataChanged(endIndex, startIndex); +} + +void TrayModel::setDragingIndex(const QModelIndex index) +{ + m_dragModelIndex = index; + m_dropModelIndex = index; + + emit QAbstractListModel::dataChanged(index, index); +} + +void TrayModel::setDragDropIndex(const QModelIndex index) +{ + if (m_dragModelIndex == index) + return; + + m_dropModelIndex = index; + + emit QAbstractListModel::dataChanged(m_dragModelIndex, index); + emit QAbstractListModel::dataChanged(index, m_dragModelIndex); +} + +void TrayModel::setDragKey(const QString &key) +{ + m_dragKey = key; +} + +bool TrayModel::indexDragging(const QModelIndex &index) const +{ + if (index.isValid() && index.data(Role::KeyRole).toString() == m_dragKey) + return true; + + if (!m_dragModelIndex.isValid() || !m_dropModelIndex.isValid()) + return false; + + const int start = m_dragModelIndex.row(); + const int end = m_dropModelIndex.row(); + const int current = index.row(); + + return (start <= end && current >= start && current <= end) + || (start >= end && current <= start && current >= end); +} + +QMimeData *TrayModel::mimeData(const QModelIndexList &indexes) const +{ + Q_ASSERT(indexes.size() == 1); + + QMimeData *mime = new QMimeData; + mime->setData(TRAY_DRAG_FALG, QByteArray()); + for (auto index : indexes) { + if (!index.isValid()) + continue; + + int itemIndex = index.row(); + auto info = m_winInfos.at(itemIndex); + mime->setData("type", QByteArray::number(static_cast(info.type))); + mime->setData("key", info.key.toLatin1()); + mime->setData("winId", QByteArray::number(info.winId)); + mime->setData("servicePath", info.servicePath.toLatin1()); + + //TODO 支持多个index的数据,待支持 + } + return mime; +} + +QVariant TrayModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + int itemIndex = index.row(); + auto info = m_winInfos.at(itemIndex); + + switch (role) { + case Role::TypeRole: + return info.type; + case Role::KeyRole: + return info.key; + case Role::WinIdRole: + return info.winId; + case Role::ServiceRole: + return info.servicePath; + case Role::Blank: + return indexDragging(index); + default: + return QVariant(); + } +} + +bool TrayModel::removeRows(int row, int count, const QModelIndex &parent) +{ + Q_UNUSED(count); + Q_UNUSED(parent); + + if (m_winInfos.size() - 1 < row) + return false; + + beginRemoveRows(parent, row, row); + m_dragInfo = m_winInfos.takeAt(row); + endRemoveRows(); + + return true; +} + +bool TrayModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const +{ + Q_UNUSED(action) + Q_UNUSED(row) + Q_UNUSED(column) + Q_UNUSED(parent) + + return data->formats().contains(TRAY_DRAG_FALG); +} + +Qt::ItemFlags TrayModel::flags(const QModelIndex &index) const +{ + const Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); + m_view->openPersistentEditor(index); + + return defaultFlags | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; +} + +int TrayModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + + return m_winInfos.size(); +} + +bool TrayModel::isIconTray() +{ + return m_isTrayIcon; +} + +void TrayModel::clear() +{ + beginResetModel(); + m_winInfos.clear(); + endResetModel(); +} + +void TrayModel::onXEmbedTrayAdded(quint32 winId) +{ + for (auto info : m_winInfos) { + if (info.winId == winId) + return; + } + + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + WinInfo info; + info.type = XEMBED; + info.key = "wininfo:" + QString::number(winId); + info.winId = winId; + m_winInfos.append(info); + endInsertRows(); +} + +void TrayModel::onXEmbedTrayRemoved(quint32 winId) +{ + for (auto info : m_winInfos) { + if (info.winId == winId) { + int index = m_winInfos.indexOf(info); + beginRemoveRows(QModelIndex(), index, index); + m_winInfos.removeOne(info); + endRemoveRows(); + return; + } + } +} + +QString TrayModel::fileNameByServiceName(const QString &serviceName) +{ + QStringList serviceInfo = serviceName.split("/"); + if (serviceInfo.size() <= 0) + return QString(); + + QDBusInterface dbsInterface("org.freedesktop.DBus", "/org/freedesktop/DBus", + "org.freedesktop.DBus", QDBusConnection::sessionBus(), this); + QDBusMessage msg = dbsInterface.call("GetConnectionUnixProcessID", serviceInfo[0] ); + QList arguments = msg.arguments(); + if (arguments.size() == 0) + return QString(); + + QVariant v = arguments.at(0); + uint pid = v.toUInt(); + QString path = QString("/proc/%1/cmdline").arg(pid); + QFile file(path); + if (file.open(QIODevice::ReadOnly)) { + const QString fileName = file.readAll(); + file.close(); + return fileName; + } + + return QString(); +} + +bool TrayModel::isTypeWriting(const QString &servicePath) +{ + const QString appFilePath = fileNameByServiceName(servicePath); + return appFilePath.startsWith("/usr/bin/fcitx"); +} + +void TrayModel::onSniTrayAdded(const QString &servicePath) +{ + bool typeWriting = isTypeWriting(servicePath); + if ((m_hasInputMethod && !typeWriting) || (!m_hasInputMethod && typeWriting)) + return; + + int citxIndex = -1; + for (int i = 0; i < m_winInfos.size(); i++) { + WinInfo info = m_winInfos[i]; + if (info.servicePath == servicePath) + return; + + if (typeWriting && info.isTypeWriting) + citxIndex = i; + } + + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + WinInfo info; + info.type = SNI; + info.key = "sni:" + servicePath; + info.servicePath = servicePath; + info.isTypeWriting = typeWriting; // 是否为输入法 + if (typeWriting) { + if (citxIndex < 0) { + m_winInfos.append(info); + } else { + // 如果输入法在指定位置,则将输入法移动到指定位置 + m_winInfos[citxIndex] = info; + QTimer::singleShot(150, this, [ = ] { + // 对比需要变化的图标 + emit requestUpdateWidget({ citxIndex }); + }); + } + } else { + m_winInfos.append(info); + } + endInsertRows(); +} + +void TrayModel::onSniTrayRemoved(const QString &servicePath) +{ + for (WinInfo info : m_winInfos) { + if (info.servicePath == servicePath) { + int index = m_winInfos.indexOf(info); + + // 如果为输入法,则无需立刻删除,等100毫秒后再观察是否会删除输入法(因为在100毫秒内如果是切换输入法,就会很快发送add信号) + if (info.isTypeWriting) { + QTimer::singleShot(100, this, [ servicePath, this ] { + for (WinInfo info : m_winInfos) { + if (info.servicePath == servicePath) { + int index = m_winInfos.indexOf(info); + beginRemoveRows(QModelIndex(), index, index); + m_winInfos.removeOne(info); + endRemoveRows(); + } + } + }); + } else { + beginRemoveRows(QModelIndex(), index, index); + m_winInfos.removeOne(info); + endRemoveRows(); + } + break; + } + } +} + +void TrayModel::onIndicatorFounded(const QString &indicatorName) +{ + const QString &itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); + if (exist(itemKey) || !IndicatorTrayItem::isIndicatorKey(itemKey)) + return; + + IndicatorPlugin *indicatorTray = nullptr; + if (!m_indicatorMap.keys().contains(indicatorName)) { + indicatorTray = new IndicatorPlugin(indicatorName, this); + m_indicatorMap[indicatorName] = indicatorTray; + } else { + indicatorTray = m_indicatorMap[itemKey]; + } + + connect(indicatorTray, &IndicatorPlugin::delayLoaded, indicatorTray, [ = ] { + onIndicatorAdded(indicatorName); + }, Qt::UniqueConnection); + + connect(indicatorTray, &IndicatorPlugin::removed, this, [ = ] { + onIndicatorRemoved(indicatorName); + }, Qt::UniqueConnection); +} + +void TrayModel::onIndicatorAdded(const QString &indicatorName) +{ + const QString &itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); + for (auto info : m_winInfos) { + if (info.key == itemKey) + return; + } + + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + WinInfo info; + info.type = INDICATOR; + info.key = itemKey; + m_winInfos.append(info); + endInsertRows(); +} + +void TrayModel::onIndicatorRemoved(const QString &indicatorName) +{ + const QString &itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); + removeRow(itemKey); +} + +void TrayModel::removeRow(const QString &itemKey) +{ + for (auto info : m_winInfos) { + if (info.key == itemKey) { + int index = m_winInfos.indexOf(info); + beginRemoveRows(QModelIndex(), index, index); + m_winInfos.removeOne(info); + endRemoveRows(); + break; + } + } +} + +void TrayModel::addRow(WinInfo info) +{ + for (auto i : m_winInfos) { + if (i.key == info.key) + return; + } + + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + m_winInfos.append(info); + endInsertRows(); +} + +bool TrayModel::exist(const QString &itemKey) +{ + for (auto w : m_winInfos) { + if (w.key == itemKey) + return true; + } + + return false; +} diff --git a/frame/window/tray/tray_model.h b/frame/window/tray/tray_model.h new file mode 100644 index 000000000..3a09e5128 --- /dev/null +++ b/frame/window/tray/tray_model.h @@ -0,0 +1,124 @@ +#ifndef TRAYMODEL_H +#define TRAYMODEL_H + +#include +#include +#include + +class TrayMonitor; +class IndicatorPlugin; + +enum TrayIconType { + UNKNOW, + XEMBED, + SNI, + INDICATOR, + EXPANDICON +}; + +struct WinInfo { + TrayIconType type; + QString key; + quint32 winId; + QString servicePath; + bool isTypeWriting; + + WinInfo() { + type = UNKNOW; + key = QString(); + winId = 0; + servicePath = QString(); + isTypeWriting = false; + } + bool operator==(const WinInfo &other) { + return this->type == other.type + && this->key == other.key + && this->winId == other.winId + && this->servicePath == other.servicePath + && this->isTypeWriting == other.isTypeWriting; + } +}; + +class TrayModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Role { + TypeRole = Qt::UserRole + 1, + KeyRole, + WinIdRole, + ServiceRole, + Blank + }; + + typedef QList WinInfos; + + TrayModel(QListView *view, bool isIconTray, bool hasInputMethod, QObject *parent = Q_NULLPTR); + + void dropSwap(int newPos); + void dropInsert(int newPos); + + void clearDragDropIndex(); + void setDragingIndex(const QModelIndex index); + void setDragDropIndex(const QModelIndex index); + + void setDragKey(const QString &key); + + bool indexDragging(const QModelIndex &index) const; + + int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; + bool isIconTray(); + + void clear(); + +public Q_SLOTS: + void removeRow(const QString &itemKey); + void addRow(WinInfo info); + +Q_SIGNALS: + void requestUpdateIcon(quint32); + void requestUpdateWidget(const QList &); + +private Q_SLOTS: + void onXEmbedTrayAdded(quint32 winId); + void onXEmbedTrayRemoved(quint32 winId); + void onSniTrayAdded(const QString &servicePath); + void onSniTrayRemoved(const QString &servicePath); + + void onIndicatorFounded(const QString &indicatorName); + void onIndicatorAdded(const QString &indicatorName); + void onIndicatorRemoved(const QString &indicatorName); + +private: + bool exist(const QString &itemKey); + QString fileNameByServiceName(const QString &serviceName); + bool isTypeWriting(const QString &servicePath); + +protected: + QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; + bool removeRows(int row, int count, const QModelIndex &parent) Q_DECL_OVERRIDE; + bool canDropMimeData(const QMimeData *data, Qt::DropAction action, + int row, int column, const QModelIndex &parent) const Q_DECL_OVERRIDE; + Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; + +private: + WinInfos m_winInfos; + + QModelIndex m_dragModelIndex; + QModelIndex m_dropModelIndex; + WinInfo m_dragInfo; + QListView *m_view; + TrayMonitor *m_monitor; + + QString m_dragKey; + + QMap m_indicatorMap; + bool m_isTrayIcon; + bool m_hasInputMethod; +}; + +Q_DECLARE_METATYPE(TrayIconType); + +#endif // TRAYMODEL_H diff --git a/frame/window/tray/tray_monitor.cpp b/frame/window/tray/tray_monitor.cpp new file mode 100644 index 000000000..6a45ff5e2 --- /dev/null +++ b/frame/window/tray/tray_monitor.cpp @@ -0,0 +1,78 @@ +#include "tray_monitor.h" + +TrayMonitor::TrayMonitor(QObject *parent) + : QObject(parent) + , m_trayInter(new DBusTrayManager(this)) + , m_sniWatcher(new StatusNotifierWatcher("org.kde.StatusNotifierWatcher", "/StatusNotifierWatcher", QDBusConnection::sessionBus(), this)) +{ + //-------------------------------Tray Embed---------------------------------------------// + connect(m_trayInter, &DBusTrayManager::TrayIconsChanged, this, &TrayMonitor::onTrayIconsChanged, Qt::QueuedConnection); + connect(m_trayInter, &DBusTrayManager::Changed, this, &TrayMonitor::requestUpdateIcon, Qt::QueuedConnection); + m_trayInter->Manage(); + QMetaObject::invokeMethod(this, "onTrayIconsChanged", Qt::QueuedConnection); + + //-------------------------------Tray SNI---------------------------------------------// + connect(m_sniWatcher, &StatusNotifierWatcher::StatusNotifierItemRegistered, this, &TrayMonitor::onSniItemsChanged, Qt::QueuedConnection); + connect(m_sniWatcher, &StatusNotifierWatcher::StatusNotifierItemUnregistered, this, &TrayMonitor::onSniItemsChanged, Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "onSniItemsChanged", Qt::QueuedConnection); + + //-------------------------------Tray Indicator---------------------------------------------// + QMetaObject::invokeMethod(this, "startLoadIndicators", Qt::QueuedConnection); +} + +void TrayMonitor::onTrayIconsChanged() +{ + QList wids = m_trayInter->trayIcons(); + if (m_trayWids == wids) + return; + + for (auto wid : wids) { + if (!m_trayWids.contains(wid)) { + Q_EMIT xEmbedTrayAdded(wid); + } + } + + for (auto wid : m_trayWids) { + if (!wids.contains(wid)) { + Q_EMIT xEmbedTrayRemoved(wid); + } + } + + m_trayWids = wids; +} + +void TrayMonitor::onSniItemsChanged() +{ + //TODO 防止同一个进程注册多个sni服务 + const QStringList &sniServices = m_sniWatcher->registeredStatusNotifierItems(); + if (m_sniServices == sniServices) + return; + + for (auto s : sniServices) { + if (!m_sniServices.contains(s)) { + if (s.startsWith("/") || !s.contains("/")) { + qWarning() << __FUNCTION__ << "invalid sni service" << s; + continue; + } + Q_EMIT sniTrayAdded(s); + } + } + + for (auto s : m_sniServices) { + if (!sniServices.contains(s)) { + Q_EMIT sniTrayRemoved(s); + } + } + + m_sniServices = sniServices; +} + +void TrayMonitor::startLoadIndicators() +{ + QDir indicatorConfDir("/etc/dde-dock/indicator"); + + for (const QFileInfo &fileInfo : indicatorConfDir.entryInfoList({"*.json"}, QDir::Files | QDir::NoDotAndDotDot)) { + const QString &indicatorName = fileInfo.baseName(); + Q_EMIT indicatorFounded(indicatorName); + } +} diff --git a/frame/window/tray/tray_monitor.h b/frame/window/tray/tray_monitor.h new file mode 100644 index 000000000..3a413126c --- /dev/null +++ b/frame/window/tray/tray_monitor.h @@ -0,0 +1,41 @@ +#ifndef TRAYMONITOR_H +#define TRAYMONITOR_H + +#include + +#include "dbustraymanager.h" +#include "statusnotifierwatcher_interface.h" + +using namespace org::kde; +class TrayMonitor : public QObject +{ + Q_OBJECT + +public: + explicit TrayMonitor(QObject *parent = nullptr); + +public Q_SLOTS: + void onTrayIconsChanged(); + void onSniItemsChanged(); + + void startLoadIndicators(); + +Q_SIGNALS: + void requestUpdateIcon(quint32); + void xEmbedTrayAdded(quint32); + void xEmbedTrayRemoved(quint32); + + void sniTrayAdded(const QString &); + void sniTrayRemoved(const QString &); + + void indicatorFounded(const QString &); + +private: + DBusTrayManager *m_trayInter; + StatusNotifierWatcher *m_sniWatcher; + + QList m_trayWids; + QStringList m_sniServices; +}; + +#endif // TRAYMONITOR_H diff --git a/frame/window/tray/widgets/basetraywidget.cpp b/frame/window/tray/widgets/basetraywidget.cpp new file mode 100644 index 000000000..9cb0ddccf --- /dev/null +++ b/frame/window/tray/widgets/basetraywidget.cpp @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#include "constants.h" +#include "basetraywidget.h" + +#include +#include +#include + +BaseTrayWidget::BaseTrayWidget(QWidget *parent, Qt::WindowFlags f) + : QWidget(parent, f) + , m_handleMouseReleaseTimer(new QTimer(this)) + , m_ownerPID(0) + , m_needShow(true) +{ + m_handleMouseReleaseTimer->setSingleShot(true); + m_handleMouseReleaseTimer->setInterval(10); + + connect(m_handleMouseReleaseTimer, &QTimer::timeout, this, &BaseTrayWidget::handleMouseRelease); +} + +BaseTrayWidget::~BaseTrayWidget() +{ + +} + +void BaseTrayWidget::mousePressEvent(QMouseEvent *event) +{ + // call QWidget::mousePressEvent means to show dock-context-menu + // when right button of mouse is pressed immediately in fashion mode + + // here we hide the right button press event when it is click in the special area + if (event->button() == Qt::RightButton && perfectIconRect().contains(event->pos(), true)) { + event->accept(); + return; + } + + QWidget::mousePressEvent(event); +} + +void BaseTrayWidget::mouseReleaseEvent(QMouseEvent *e) +{ + //e->accept(); + + // 由于 XWindowTrayWidget 中对 发送鼠标事件到X窗口的函数, 如 sendClick/sendHoverEvent 中 + // 使用了 setX11PassMouseEvent, 而每次调用 setX11PassMouseEvent 时都会导致产生 mousePress 和 mouseRelease 事件 + // 因此如果直接在这里处理事件会导致一些问题, 所以使用 Timer 来延迟处理 100 毫秒内的最后一个事件 + m_lastMouseReleaseData.first = e->pos(); + m_lastMouseReleaseData.second = e->button(); + + m_handleMouseReleaseTimer->start(); + + QWidget::mouseReleaseEvent(e); +} + +void BaseTrayWidget::handleMouseRelease() +{ + Q_ASSERT(sender() == m_handleMouseReleaseTimer); + + // do not dealwith all mouse event of SystemTray, class SystemTrayItem will handle it + if (trayType() == SystemTray) + return; + + const QPoint point(m_lastMouseReleaseData.first - rect().center()); + if (point.manhattanLength() > 24) + return; + + QPoint globalPos = QCursor::pos(); + uint8_t buttonIndex = XCB_BUTTON_INDEX_1; + + switch (m_lastMouseReleaseData.second) { + case Qt:: MiddleButton: + buttonIndex = XCB_BUTTON_INDEX_2; + break; + case Qt::RightButton: + buttonIndex = XCB_BUTTON_INDEX_3; + break; + default: + break; + } + + sendClick(buttonIndex, globalPos.x(), globalPos.y()); + + // left mouse button clicked + if (buttonIndex == XCB_BUTTON_INDEX_1) { + Q_EMIT clicked(); + } +} + +const QRect BaseTrayWidget::perfectIconRect() const +{ + const QRect itemRect = rect(); + const int iconSize = std::min(itemRect.width(), itemRect.height()); + + QRect iconRect; + iconRect.setWidth(iconSize); + iconRect.setHeight(iconSize); + iconRect.moveTopLeft(itemRect.center() - iconRect.center()); + + return iconRect; +} + +void BaseTrayWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + + const Dock::Position position = qApp->property(PROP_POSITION).value(); + // 保持横纵比 + if (position == Dock::Bottom || position == Dock::Top) { + setMaximumWidth(height()); + setMaximumHeight(QWIDGETSIZE_MAX); + } else { + setMaximumHeight(width()); + setMaximumWidth(QWIDGETSIZE_MAX); + } +} + +uint BaseTrayWidget::getOwnerPID() +{ + return this->m_ownerPID; +} + +bool BaseTrayWidget::needShow() +{ + return m_needShow; +} + +void BaseTrayWidget::setNeedShow(bool needShow) +{ +#ifdef QT_DEBUG + if (m_needShow == needShow) + return; + + m_needShow = needShow; +#else + m_needShow = true; +#endif + + update(); +} + +void BaseTrayWidget::setOwnerPID(uint PID) +{ + this->m_ownerPID = PID; +} diff --git a/frame/window/tray/widgets/basetraywidget.h b/frame/window/tray/widgets/basetraywidget.h new file mode 100644 index 000000000..6f3124c20 --- /dev/null +++ b/frame/window/tray/widgets/basetraywidget.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +class QDBusMessage; +class BaseTrayWidget : public QWidget +{ + Q_OBJECT + +public: + enum TrayType { + ApplicationTray, + SystemTray, + }; + + explicit BaseTrayWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); + virtual ~BaseTrayWidget() override; + + virtual QString itemKeyForConfig() = 0; + virtual void updateIcon() = 0; + virtual void sendClick(uint8_t mouseButton, int x, int y) = 0; + virtual inline TrayType trayType() const { return TrayType::ApplicationTray; } // default is ApplicationTray + virtual bool isValid() {return true;} + uint getOwnerPID(); + virtual bool needShow(); + virtual void setNeedShow(bool needShow); + virtual QPixmap icon() = 0; + +Q_SIGNALS: + void iconChanged(); + void clicked(); + void needAttention(); + void requestWindowAutoHide(const bool autoHide); + void requestRefershWindowVisible(); + +protected: + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *e) override; + + void handleMouseRelease(); + const QRect perfectIconRect() const; + void resizeEvent(QResizeEvent *event) override; + void setOwnerPID(uint PID); + +private: + QTimer *m_handleMouseReleaseTimer; + + QPair m_lastMouseReleaseData; + + uint m_ownerPID; + bool m_needShow; +}; + diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp new file mode 100644 index 000000000..62bfd857c --- /dev/null +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -0,0 +1,167 @@ +#include "expandiconwidget.h" +#include "tray_gridview.h" +#include "tray_model.h" +#include "tray_delegate.h" +#include "dockpopupwindow.h" + +#include +#include +#include + +#include + +DGUI_USE_NAMESPACE + +ExpandIconWidget::ExpandIconWidget(QWidget *parent, Qt::WindowFlags f) + : BaseTrayWidget(parent, f) + , m_regionInter(new DRegionMonitor(this)) + , m_position(Dock::Position::Bottom) + , m_trayView(nullptr) +{ + connect(m_regionInter, &DRegionMonitor::buttonPress, this, &ExpandIconWidget::onGlobMousePress); +} + +ExpandIconWidget::~ExpandIconWidget() +{ +} + +void ExpandIconWidget::setPositonValue(Dock::Position position) +{ + m_position = position; +} + +void ExpandIconWidget::sendClick(uint8_t mouseButton, int x, int y) +{ + Q_UNUSED(x); + Q_UNUSED(y); + + if (mouseButton != XCB_BUTTON_INDEX_1) + return; + + TrayGridView *trayIcon = popupTrayView(); + setTrayPanelVisible(!trayIcon->isVisible()); +} + +void ExpandIconWidget::setTrayPanelVisible(bool visible) +{ + TrayGridView *trayIcon = popupTrayView(); + if (visible) { + resetPosition(); + trayIcon->show(); + m_regionInter->registerRegion(); + } else { + trayIcon->hide(); + m_regionInter->unregisterRegion(); + } +} + +QPixmap ExpandIconWidget::icon() +{ + return QPixmap(dropIconFile()); +} + +void ExpandIconWidget::paintEvent(QPaintEvent *e) +{ + Q_UNUSED(e); + + QPainter painter(this); + QPixmap pixmap(dropIconFile()); + painter.drawPixmap(0, 0, pixmap); +} + +const QString ExpandIconWidget::dropIconFile() const +{ + QString arrow; + switch (m_position) { + case Dock::Position::Bottom: { + arrow = "up"; + break; + } + case Dock::Position::Top: { + arrow = "down"; + break; + } + case Dock::Position::Left: { + arrow = "right"; + break; + } + case Dock::Position::Right: { + arrow = "left"; + break; + } + } + + QString iconFile = QString(":/icons/resources/arrow-%1").arg(arrow); + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + iconFile += QString("-dark"); + + return iconFile + ".svg"; +} + +TrayGridView *ExpandIconWidget::popupTrayView() +{ + if (m_trayView) + return m_trayView; + + m_trayView = new TrayGridView(nullptr); + TrayModel *model = new TrayModel(m_trayView, true, false); + TrayDelegate *trayDelegate = new TrayDelegate(m_trayView); + m_trayView->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup); + m_trayView->setModel(model); + m_trayView->setItemDelegate(trayDelegate); + m_trayView->setSpacing(3); + m_trayView->setDragDistance(5); + + connect(m_trayView, &TrayGridView::rowCountChanged, this, [ this ] { + int count = m_trayView->model()->rowCount(); + if (count > 0) { + int lineCount = (count % 3) != 0 ? (count / 3 + 1) : (count / 3); + // 如果只有一行,则根据实际的数量显示宽度 + int columnCount = qMin(count, 3); + int width = ITEM_SIZE * columnCount + m_trayView->spacing() * 2;; + int height = lineCount * ITEM_SIZE + m_trayView->spacing() * (lineCount - 1) + ITEM_SPACING; + m_trayView->setFixedSize(width, height); + resetPosition(); + } else if (m_trayView->isVisible()) { + m_trayView->hide(); + } + Q_EMIT trayVisbleChanged(count > 0); + }); + + connect(trayDelegate, &TrayDelegate::removeRow, this, [ = ](const QModelIndex &index) { + QAbstractItemModel *abModel = model; + abModel->removeRow(index.row(),index.parent()); + }); + connect(m_trayView, &TrayGridView::requestRemove, model, &TrayModel::removeRow); + return m_trayView; +} + +void ExpandIconWidget::resetPosition() +{ + if (!parentWidget()) + return; + + TrayGridView *trayView = popupTrayView(); + QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); + ptPos.setY(ptPos.y() - trayView->height()); + ptPos.setX(ptPos.x() - trayView->width()); + trayView->move(ptPos); +} + +void ExpandIconWidget::onGlobMousePress(const QPoint &mousePos, const int flag) +{ + if (!isVisible() || !((flag == DRegionMonitor::WatchedFlags::Button_Left) || (flag == DRegionMonitor::WatchedFlags::Button_Right))) + return; + + TrayGridView *trayView = popupTrayView(); + QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); + const QRect rect = QRect(ptPos, size()); + if (rect.contains(mousePos)) + return; + + const QRect rctView(trayView->pos(), trayView->size()); + if (rctView.contains(mousePos)) + return; + + trayView->hide(); +} diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h new file mode 100644 index 000000000..d9316d258 --- /dev/null +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -0,0 +1,46 @@ +#ifndef EXPANDICONWIDGET_H +#define EXPANDICONWIDGET_H + +#include "constants.h" +#include "basetraywidget.h" + +class TrayGridView; +class TrayModel; + +namespace Dtk { namespace Gui { class DRegionMonitor; } } + +class ExpandIconWidget : public BaseTrayWidget +{ + Q_OBJECT + +Q_SIGNALS: + void trayVisbleChanged(bool); + +public: + explicit ExpandIconWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); + ~ExpandIconWidget() override; + void setPositonValue(Dock::Position position); + + void sendClick(uint8_t mouseButton, int x, int y) override; + void setTrayPanelVisible(bool visible); + QString itemKeyForConfig() override { return "Expand"; } + void updateIcon() override {} + QPixmap icon() override; + TrayGridView *popupTrayView(); + +private Q_SLOTS: + void onGlobMousePress(const QPoint &mousePos, const int flag); + +protected: + void paintEvent(QPaintEvent *e) override; + const QString dropIconFile() const; + + void resetPosition(); + +private: + Dtk::Gui::DRegionMonitor *m_regionInter; + Dock::Position m_position; + TrayGridView *m_trayView; +}; + +#endif // EXPANDICONWIDGET_H diff --git a/frame/window/tray/widgets/indicatorplugin.cpp b/frame/window/tray/widgets/indicatorplugin.cpp new file mode 100644 index 000000000..2ee9793fc --- /dev/null +++ b/frame/window/tray/widgets/indicatorplugin.cpp @@ -0,0 +1,274 @@ +#include "indicatorplugin.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class IndicatorPluginPrivate +{ +public: + explicit IndicatorPluginPrivate(IndicatorPlugin *parent) : q_ptr(parent) {} + + void init(); + + void updateContent(); + + void initDBus(const QString &indicatorName); + + template + void featData(const QString &key, + const QJsonObject &data, + const char *propertyChangedSlot, + Func const &callback) + { + Q_Q(IndicatorPlugin); + auto dataConfig = data.value(key).toObject(); + auto dbusService = dataConfig.value("dbus_service").toString(); + auto dbusPath = dataConfig.value("dbus_path").toString(); + auto dbusInterface = dataConfig.value("dbus_interface").toString(); + auto isSystemBus = dataConfig.value("system_dbus").toBool(false); + auto bus = isSystemBus ? QDBusConnection::systemBus() : QDBusConnection::sessionBus(); + + QDBusInterface interface(dbusService, dbusPath, dbusInterface, bus, q); + + if (dataConfig.contains("dbus_method")) { + QString methodName = dataConfig.value("dbus_method").toString(); + auto ratio = qApp->devicePixelRatio(); + QDBusReply reply = interface.call(methodName.toStdString().c_str(), ratio); + callback(reply.value()); + } + + if (dataConfig.contains("dbus_properties")) { + auto propertyName = dataConfig.value("dbus_properties").toString(); + auto propertyNameCStr = propertyName.toStdString(); + propertyInterfaceNames.insert(key, dbusInterface); + propertyNames.insert(key, QString::fromStdString(propertyNameCStr)); + QDBusConnection::sessionBus().connect(dbusService, + dbusPath, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + "sa{sv}as", + q, + propertyChangedSlot); + + // FIXME(sbw): hack for qt dbus property changed signal. + // see: https://bugreports.qt.io/browse/QTBUG-48008 + QDBusConnection::sessionBus().connect(dbusService, + dbusPath, + dbusInterface, + QString("%1Changed").arg(propertyName), + "s", + q, + propertyChangedSlot); + + callback(interface.property(propertyNameCStr.c_str())); + } + } + + template + void propertyChanged(const QString &key, const QDBusMessage &msg, Func const &callback) + { + QList arguments = msg.arguments(); + if (1 == arguments.count()) + { + const QString &v = msg.arguments().at(0).toString(); + callback(v); + return; + } else if (3 != arguments.count()) { + qDebug() << "arguments count must be 3"; + return; + } + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != propertyInterfaceNames.value(key)) { + qDebug() << "interfaceName mismatch" << interfaceName << propertyInterfaceNames.value(key) << key; + return; + } + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains(propertyNames.value(key))) { + callback(changedProps.value(propertyNames.value(key))); + } + } + + IndicatorTrayItem* indicatorTrayWidget = Q_NULLPTR; + QString indicatorName; + QMap propertyNames; + QMap propertyInterfaceNames; + + IndicatorPlugin *q_ptr; + Q_DECLARE_PUBLIC(IndicatorPlugin) +}; + +void IndicatorPluginPrivate::init() +{ + //Q_Q(IndicatorTray); + + indicatorTrayWidget = new IndicatorTrayItem(indicatorName); + + initDBus(indicatorName); + updateContent(); +} + +void IndicatorPluginPrivate::updateContent() +{ + indicatorTrayWidget->update(); + + Q_EMIT indicatorTrayWidget->iconChanged(); +} + +void IndicatorPluginPrivate::initDBus(const QString &indicatorName) +{ + Q_Q(IndicatorPlugin); + + QString filepath = QString("/etc/dde-dock/indicator/%1.json").arg(indicatorName); + QFile confFile(filepath); + if (!confFile.open(QIODevice::ReadOnly)) { + qCritical() << "read indicator config Error"; + } + + QJsonDocument doc = QJsonDocument::fromJson(confFile.readAll()); + confFile.close(); + auto config = doc.object(); + + auto delay = config.value("delay").toInt(0); + + qDebug() << "delay load" << delay << indicatorName << q; + + QTimer::singleShot(delay, [ = ]() { + auto data = config.value("data").toObject(); + + if (data.contains("text")) { + featData("text", data, SLOT(textPropertyChanged(QDBusMessage)), [ = ](QVariant v) { +#ifdef QT_DEBUG // TODO + if (!v.toString().isEmpty()) { +#else + if (v.toString().isEmpty()) { +#endif + Q_EMIT q->removed(); + return; + } + else { + Q_EMIT q->delayLoaded(); + } + indicatorTrayWidget->setText(v.toString()); + updateContent(); + }); + } + + if (data.contains("icon")) { + featData("icon", data, SLOT(iconPropertyChanged(QDBusMessage)), [ = ](QVariant v) { + if (v.toByteArray().isEmpty()) { + Q_EMIT q->removed(); + return; + } + else { + Q_EMIT q->delayLoaded(); + } + indicatorTrayWidget->setPixmapData(v.toByteArray()); + updateContent(); + }); + } + + const QJsonObject action = config.value("action").toObject(); + if (!action.isEmpty() && indicatorTrayWidget) + q->connect(indicatorTrayWidget, &IndicatorTrayItem::clicked, q, [ = ](uint8_t button_index, int x, int y) { + /*std::thread t([=]() -> void { + auto triggerConfig = action.value("trigger").toObject(); + auto dbusService = triggerConfig.value("dbus_service").toString(); + auto dbusPath = triggerConfig.value("dbus_path").toString(); + auto dbusInterface = triggerConfig.value("dbus_interface").toString(); + auto methodName = triggerConfig.value("dbus_method").toString(); + auto isSystemBus = triggerConfig.value("system_dbus").toBool(false); + auto bus = isSystemBus ? QDBusConnection::systemBus() : QDBusConnection::sessionBus(); + + QDBusInterface interface(dbusService, dbusPath, dbusInterface, bus); + QDBusReply reply = interface.call(methodName, button_index, x, y); + if (!reply.isValid()) { + qDebug() << interface.call(methodName); + } + else { + qDebug() << reply.error(); + } + }); + t.detach();*/ + }); + }); +} + +IndicatorPlugin::IndicatorPlugin(const QString &indicatorName, QObject *parent) + : QObject(parent) + , d_ptr(new IndicatorPluginPrivate(this)) +{ + Q_D(IndicatorPlugin); + + d->indicatorName = indicatorName; + d->init(); +} + +IndicatorPlugin::~IndicatorPlugin() +{ + +} + +IndicatorTrayItem *IndicatorPlugin::widget() +{ + Q_D(IndicatorPlugin); + + if (!d->indicatorTrayWidget) { + d->init(); + } + + return d->indicatorTrayWidget; +} + +void IndicatorPlugin::removeWidget() +{ + Q_D(IndicatorPlugin); + + d->indicatorTrayWidget = nullptr; +} + +void IndicatorPlugin::textPropertyChanged(const QDBusMessage &message) +{ + Q_D(IndicatorPlugin); + + d->propertyChanged("text", message, [=] (const QVariant &value) { + if (value.toString().isEmpty()) { + Q_EMIT removed(); + return; + } + + if (!d->indicatorTrayWidget) { + d->init(); + } + + d->indicatorTrayWidget->setText(value.toByteArray()); + }); +} + +void IndicatorPlugin::iconPropertyChanged(const QDBusMessage &message) +{ + Q_D(IndicatorPlugin); + + d->propertyChanged("icon", message, [=] (const QVariant &value) { + if (value.toByteArray().isEmpty()) { + Q_EMIT removed(); + return; + } + + if (!d->indicatorTrayWidget) { + d->init(); + } + + d->indicatorTrayWidget->setPixmapData(value.toByteArray()); + }); +} diff --git a/frame/window/tray/widgets/indicatorplugin.h b/frame/window/tray/widgets/indicatorplugin.h new file mode 100644 index 000000000..81c1a81b0 --- /dev/null +++ b/frame/window/tray/widgets/indicatorplugin.h @@ -0,0 +1,31 @@ +#pragma once + +#include "indicatortrayitem.h" + +#include +#include + +class IndicatorPluginPrivate; +class IndicatorPlugin : public QObject +{ + Q_OBJECT +public: + explicit IndicatorPlugin(const QString &indicatorName, QObject *parent = nullptr); + ~IndicatorPlugin(); + + IndicatorTrayItem *widget(); + + void removeWidget(); + +signals: + void delayLoaded(); + void removed(); + +private slots: + void textPropertyChanged(const QDBusMessage &message); + void iconPropertyChanged(const QDBusMessage &message); + +private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE_D(qGetPtrHelper(d_ptr), IndicatorPlugin) +}; diff --git a/frame/window/tray/widgets/indicatortrayitem.cpp b/frame/window/tray/widgets/indicatortrayitem.cpp new file mode 100644 index 000000000..6da397fee --- /dev/null +++ b/frame/window/tray/widgets/indicatortrayitem.cpp @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#include "indicatortrayitem.h" +//#include "util/utils.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IndicatorTrayItem::IndicatorTrayItem(const QString &indicatorName, QWidget *parent, Qt::WindowFlags f) + : BaseTrayWidget(parent, f) + , m_indicatorName(indicatorName) +// , m_gsettings(Utils::ModuleSettingsPtr("keyboard", QByteArray(), this)) + , m_enableClick(true) +{ + setAttribute(Qt::WA_TranslucentBackground); + + auto layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + m_label = new QLabel(this); + + QPalette p = m_label->palette(); + p.setColor(QPalette::Foreground, Qt::white); + p.setColor(QPalette::Background, Qt::transparent); + m_label->setPalette(p); + + m_label->setAttribute(Qt::WA_TranslucentBackground); + + layout->addWidget(m_label, 0, Qt::AlignCenter); + setLayout(layout); + + // register dbus + auto path = QString("/com/deepin/dde/Dock/Indicator/") + m_indicatorName; + auto interface = QString("com.deepin.dde.Dock.Indicator.") + m_indicatorName; + auto sessionBus = QDBusConnection::sessionBus(); + sessionBus.registerObject(path, + interface, + this, + QDBusConnection::ExportScriptableSlots); + + initDBus(m_indicatorName); +// if (m_gsettings) { +// // 显示键盘布局时更新label的状态 +// if (m_gsettings->keys().contains("itemEnable")) +// enableLabel(m_gsettings->get("itemEnable").toBool()); + +// connect(m_gsettings, &QGSettings::changed, this, &IndicatorTrayWidget::onGSettingsChanged); +// } +} + +IndicatorTrayItem::~IndicatorTrayItem() +{ +} + +QString IndicatorTrayItem::itemKeyForConfig() +{ + return toIndicatorKey(m_indicatorName); +} + +void IndicatorTrayItem::updateIcon() +{ + +} + +void IndicatorTrayItem::sendClick(uint8_t buttonIndex, int x, int y) +{ + if (m_enableClick) + Q_EMIT clicked(buttonIndex, x, y); +} + +void IndicatorTrayItem::enableLabel(bool enable) +{ + QPalette p = m_label->palette(); + if (!enable) { + m_enableClick = false; + p.setColor(QPalette::Disabled, QPalette::Foreground, Qt::lightGray); + p.setColor(QPalette::Disabled, QPalette::Background, Qt::transparent); + m_label->setEnabled(enable); + } else { + m_enableClick = true; + p.setColor(QPalette::Normal, QPalette::BrightText, Qt::white); + p.setColor(QPalette::Normal, QPalette::Background, Qt::transparent); + m_label->setEnabled(enable); + } + + m_label->setPalette(p); + m_label->update(); +} + +QPixmap IndicatorTrayItem::icon() +{ + return QPixmap(); +} + +void IndicatorTrayItem::setPixmapData(const QByteArray &data) +{ + auto rawPixmap = QPixmap::fromImage(QImage::fromData(data)); + rawPixmap.setDevicePixelRatio(devicePixelRatioF()); + m_label->setPixmap(rawPixmap); +} + +void IndicatorTrayItem::setText(const QString &text) +{ + m_label->setText(text); +} + +void IndicatorTrayItem::onGSettingsChanged(const QString &key) +{ + Q_UNUSED(key); + +// if (m_gsettings && m_gsettings->keys().contains("itemEnable")) { +// const bool itemEnable = m_gsettings->get("itemEnable").toBool(); +// enableLabel(itemEnable); + // } +} + +template +void IndicatorTrayItem::featData(const QString &key, + const QJsonObject &data, + const char *propertyChangedSlot, + Func const &callback) +{ + auto dataConfig = data.value(key).toObject(); + auto dbusService = dataConfig.value("dbus_service").toString(); + auto dbusPath = dataConfig.value("dbus_path").toString(); + auto dbusInterface = dataConfig.value("dbus_interface").toString(); + auto isSystemBus = dataConfig.value("system_dbus").toBool(false); + auto bus = isSystemBus ? QDBusConnection::systemBus() : QDBusConnection::sessionBus(); + + QDBusInterface interface(dbusService, dbusPath, dbusInterface, bus, this); + + if (dataConfig.contains("dbus_method")) { + QString methodName = dataConfig.value("dbus_method").toString(); + auto ratio = qApp->devicePixelRatio(); + QDBusReply reply = interface.call(methodName.toStdString().c_str(), ratio); + callback(reply.value()); + } + + qInfo() << dataConfig; + if (dataConfig.contains("dbus_properties")) { + auto propertyName = dataConfig.value("dbus_properties").toString(); + auto propertyNameCStr = propertyName.toStdString(); + //propertyInterfaceNames.insert(key, dbusInterface); + //propertyNames.insert(key, QString::fromStdString(propertyNameCStr)); + QDBusConnection::sessionBus().connect(dbusService, + dbusPath, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + "sa{sv}as", + this, + propertyChangedSlot); + + // FIXME(sbw): hack for qt dbus property changed signal. + // see: https://bugreports.qt.io/browse/QTBUG-48008 + QDBusConnection::sessionBus().connect(dbusService, + dbusPath, + dbusInterface, + QString("%1Changed").arg(propertyName), + "s", + this, + propertyChangedSlot); + + qInfo() << dbusService << dbusPath << dbusInterface; + qInfo() << propertyName << propertyNameCStr.c_str(); + callback(interface.property(propertyNameCStr.c_str())); + } +} + +void IndicatorTrayItem::initDBus(const QString &indicatorName) +{ + QString filepath = QString("/etc/dde-dock/indicator/%1.json").arg(indicatorName); + QFile confFile(filepath); + if (!confFile.open(QIODevice::ReadOnly)) { + qInfo() << "read indicator config Error"; + } + + QJsonDocument doc = QJsonDocument::fromJson(confFile.readAll()); + confFile.close(); + + QJsonObject config = doc.object(); + + auto delay = config.value("delay").toInt(0); + + QTimer::singleShot(delay, [ = ]() { + QJsonObject data = config.value("data").toObject(); + if (data.contains("text")) { + featData("text", data, SLOT(textPropertyChanged(QDBusMessage)), [ = ](QVariant v) { + if (v.toString().isEmpty()) { + Q_EMIT removed(); + return; + } + Q_EMIT delayLoaded(); + setText(v.toString()); + //updateContent(); + }); + } + + if (data.contains("icon")) { + featData("icon", data, SLOT(iconPropertyChanged(QDBusMessage)), [ = ](QVariant v) { + if (v.toByteArray().isEmpty()) { + Q_EMIT removed(); + return; + } + Q_EMIT delayLoaded(); + setPixmapData(v.toByteArray()); + //updateContent(); + }); + } + + const QJsonObject action = config.value("action").toObject(); + if (!action.isEmpty()) + connect(this, &IndicatorTrayItem::clicked, this, [ = ](uint8_t button_index, int x, int y) { + std::thread t([=]() -> void { + auto triggerConfig = action.value("trigger").toObject(); + auto dbusService = triggerConfig.value("dbus_service").toString(); + auto dbusPath = triggerConfig.value("dbus_path").toString(); + auto dbusInterface = triggerConfig.value("dbus_interface").toString(); + auto methodName = triggerConfig.value("dbus_method").toString(); + auto isSystemBus = triggerConfig.value("system_dbus").toBool(false); + auto bus = isSystemBus ? QDBusConnection::systemBus() : QDBusConnection::sessionBus(); + + QDBusInterface interface(dbusService, dbusPath, dbusInterface, bus); + interface.call(methodName, button_index, x, y); + }); + t.detach(); + }); + }); +} + diff --git a/frame/window/tray/widgets/indicatortrayitem.h b/frame/window/tray/widgets/indicatortrayitem.h new file mode 100644 index 000000000..b687c011a --- /dev/null +++ b/frame/window/tray/widgets/indicatortrayitem.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#pragma once + +#include +#include + +#include "basetraywidget.h" + +class QGSettings; + +class IndicatorTrayItem: public BaseTrayWidget +{ + Q_OBJECT + +Q_SIGNALS: + void removed(); + void delayLoaded(); + +public: + explicit IndicatorTrayItem(const QString &indicatorName, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); + ~IndicatorTrayItem() override; + + QString itemKeyForConfig() override; + void updateIcon() override; + void sendClick(uint8_t, int, int) override; + void enableLabel(bool enable); + static QString toIndicatorKey(const QString &indicatorName) { return QString("indicator:%1").arg(indicatorName); } + static bool isIndicatorKey(const QString &itemKey) { return itemKey.startsWith("indicator:"); } + QPixmap icon() override; + +public Q_SLOTS: + Q_SCRIPTABLE void setPixmapData(const QByteArray &data); + Q_SCRIPTABLE void setText(const QString &text); + +private slots: + void onGSettingsChanged(const QString &key); + +private: + void initDBus(const QString &indicatorName); + template + void featData(const QString &key, const QJsonObject &data, const char *propertyChangedSlot, Func const &callback); + +Q_SIGNALS: + void clicked(uint8_t, int, int); + +private: + QLabel *m_label; + + QString m_indicatorName; +// const QGSettings *m_gsettings; + bool m_enableClick; // 置灰时设置为false,不触发click信号 +}; + diff --git a/frame/window/tray/widgets/snitrayitemwidget.cpp b/frame/window/tray/widgets/snitrayitemwidget.cpp new file mode 100644 index 000000000..6bf5b319e --- /dev/null +++ b/frame/window/tray/widgets/snitrayitemwidget.cpp @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#include "snitrayitemwidget.h" +#include "themeappicon.h" +//#include "test/tipswidget.h" + +#include + +#include + +#include +#include + +#include + +DGUI_USE_NAMESPACE + +#define IconSize 20 + +const QStringList ItemCategoryList {"ApplicationStatus", "Communications", "SystemServices", "Hardware"}; +const QStringList ItemStatusList {"Passive", "Active", "NeedsAttention"}; +const QStringList LeftClickInvalidIdList {"sogou-qimpanel",}; +QPointer SNITrayItemWidget::PopupWindow = nullptr; +Dock::Position SNITrayItemWidget::DockPosition = Dock::Position::Top; +using namespace Dock; +SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *parent) + : BaseTrayWidget(parent), + m_menu(nullptr), + m_updateIconTimer(new QTimer(this)) + , m_updateOverlayIconTimer(new QTimer(this)) + , m_updateAttentionIconTimer(new QTimer(this)) + , m_sniServicePath(sniServicePath) + , m_popupTipsDelayTimer(new QTimer(this)) + , m_handleMouseReleaseTimer(new QTimer(this)) +{ + m_popupTipsDelayTimer->setInterval(500); + m_popupTipsDelayTimer->setSingleShot(true); + m_handleMouseReleaseTimer->setSingleShot(true); + m_handleMouseReleaseTimer->setInterval(100); + + connect(m_handleMouseReleaseTimer, &QTimer::timeout, this, &SNITrayItemWidget::handleMouseRelease); + connect(m_popupTipsDelayTimer, &QTimer::timeout, this, &SNITrayItemWidget::showHoverTips); + + if (PopupWindow.isNull()) { + DockPopupWindow *arrowRectangle = new DockPopupWindow(nullptr); + arrowRectangle->setShadowBlurRadius(20); + arrowRectangle->setRadius(6); + arrowRectangle->setShadowYOffset(2); + arrowRectangle->setShadowXOffset(0); + arrowRectangle->setArrowWidth(18); + arrowRectangle->setArrowHeight(10); + arrowRectangle->setObjectName("snitraypopup"); + PopupWindow = arrowRectangle; + connect(qApp, &QApplication::aboutToQuit, PopupWindow, &DockPopupWindow::deleteLater); + } + + if (m_sniServicePath.startsWith("/") || !m_sniServicePath.contains("/")) { + qDebug() << "SNI service path invalid"; + return; + } + + QPair pair = serviceAndPath(m_sniServicePath); + m_dbusService = pair.first; + m_dbusPath = pair.second; + + QDBusConnection conn = QDBusConnection::sessionBus(); + setOwnerPID(conn.interface()->servicePid(m_dbusService)); + + m_sniInter = new StatusNotifierItem(m_dbusService, m_dbusPath, QDBusConnection::sessionBus(), this); + + if (!m_sniInter->isValid()) { + qDebug() << "SNI dbus interface is invalid!" << m_dbusService << m_dbusPath << m_sniInter->lastError(); + return; + } + + m_updateIconTimer->setInterval(100); + m_updateIconTimer->setSingleShot(true); + m_updateOverlayIconTimer->setInterval(500); + m_updateOverlayIconTimer->setSingleShot(true); + m_updateAttentionIconTimer->setInterval(1000); + m_updateAttentionIconTimer->setSingleShot(true); + + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &SNITrayItemWidget::refreshIcon); + connect(m_updateIconTimer, &QTimer::timeout, this, &SNITrayItemWidget::refreshIcon); + connect(m_updateOverlayIconTimer, &QTimer::timeout, this, &SNITrayItemWidget::refreshOverlayIcon); + connect(m_updateAttentionIconTimer, &QTimer::timeout, this, &SNITrayItemWidget::refreshAttentionIcon); + + // SNI property change + // thses signals of properties may not be emit automatically!! + // since the SniInter in on async mode we can not call property's getter function to obtain property directly + // the way to refresh properties(emit the following signals) is call property's getter function and wait these signals + connect(m_sniInter, &StatusNotifierItem::AttentionIconNameChanged, this, &SNITrayItemWidget::onSNIAttentionIconNameChanged); + connect(m_sniInter, &StatusNotifierItem::AttentionIconPixmapChanged, this, &SNITrayItemWidget::onSNIAttentionIconPixmapChanged); + connect(m_sniInter, &StatusNotifierItem::AttentionMovieNameChanged, this, &SNITrayItemWidget::onSNIAttentionMovieNameChanged); + connect(m_sniInter, &StatusNotifierItem::CategoryChanged, this, &SNITrayItemWidget::onSNICategoryChanged); + connect(m_sniInter, &StatusNotifierItem::IconNameChanged, this, &SNITrayItemWidget::onSNIIconNameChanged); + connect(m_sniInter, &StatusNotifierItem::IconPixmapChanged, this, &SNITrayItemWidget::onSNIIconPixmapChanged); + connect(m_sniInter, &StatusNotifierItem::IconThemePathChanged, this, &SNITrayItemWidget::onSNIIconThemePathChanged); + connect(m_sniInter, &StatusNotifierItem::IdChanged, this, &SNITrayItemWidget::onSNIIdChanged); + connect(m_sniInter, &StatusNotifierItem::MenuChanged, this, &SNITrayItemWidget::onSNIMenuChanged); + connect(m_sniInter, &StatusNotifierItem::OverlayIconNameChanged, this, &SNITrayItemWidget::onSNIOverlayIconNameChanged); + connect(m_sniInter, &StatusNotifierItem::OverlayIconPixmapChanged, this, &SNITrayItemWidget::onSNIOverlayIconPixmapChanged); + connect(m_sniInter, &StatusNotifierItem::StatusChanged, this, &SNITrayItemWidget::onSNIStatusChanged); + + // the following signals can be emit automatically + // need refresh cached properties in these slots + connect(m_sniInter, &StatusNotifierItem::NewIcon, [ = ] { + m_sniIconName = m_sniInter->iconName(); + m_sniIconPixmap = m_sniInter->iconPixmap(); + m_sniIconThemePath = m_sniInter->iconThemePath(); + + m_updateIconTimer->start(); + }); + connect(m_sniInter, &StatusNotifierItem::NewOverlayIcon, [ = ] { + m_sniOverlayIconName = m_sniInter->overlayIconName(); + m_sniOverlayIconPixmap = m_sniInter->overlayIconPixmap(); + m_sniIconThemePath = m_sniInter->iconThemePath(); + + m_updateOverlayIconTimer->start(); + }); + connect(m_sniInter, &StatusNotifierItem::NewAttentionIcon, [ = ] { + m_sniAttentionIconName = m_sniInter->attentionIconName(); + m_sniAttentionIconPixmap = m_sniInter->attentionIconPixmap(); + m_sniIconThemePath = m_sniInter->iconThemePath(); + + m_updateAttentionIconTimer->start(); + }); + connect(m_sniInter, &StatusNotifierItem::NewStatus, [ = ] { + onSNIStatusChanged(m_sniInter->status()); + }); + + initSNIPropertys(); +} + +QString SNITrayItemWidget::itemKeyForConfig() +{ + QString key; + + do { + key = m_sniId; + if (!key.isEmpty()) { + break; + } + + key = QDBusInterface(m_dbusService, m_dbusPath, StatusNotifierItem::staticInterfaceName()) + .property("Id").toString(); + if (!key.isEmpty()) { + break; + } + + key = m_sniServicePath; + } while (false); + + return QString("sni:%1").arg(key); +} + +void SNITrayItemWidget::updateIcon() +{ + m_updateIconTimer->start(); +} + +void SNITrayItemWidget::sendClick(uint8_t mouseButton, int x, int y) +{ + switch (mouseButton) { + case XCB_BUTTON_INDEX_1: + // left button click invalid + if (LeftClickInvalidIdList.contains(m_sniId)) { + showContextMenu(x, y); + } else { + m_sniInter->Activate(x, y); + } + break; + case XCB_BUTTON_INDEX_2: + m_sniInter->SecondaryActivate(x, y); + break; + case XCB_BUTTON_INDEX_3: + showContextMenu(x, y); + break; + default: + qDebug() << "unknown mouse button key"; + break; + } +} + +bool SNITrayItemWidget::isValid() +{ + return m_sniInter->isValid(); +} + +SNITrayItemWidget::ItemStatus SNITrayItemWidget::status() +{ + if (!ItemStatusList.contains(m_sniStatus)) { + m_sniStatus = "Active"; + return ItemStatus::Active; + } + + return static_cast(ItemStatusList.indexOf(m_sniStatus)); +} + +SNITrayItemWidget::ItemCategory SNITrayItemWidget::category() +{ + if (!ItemCategoryList.contains(m_sniCategory)) { + return UnknownCategory; + } + + return static_cast(ItemCategoryList.indexOf(m_sniCategory)); +} + +QString SNITrayItemWidget::toSNIKey(const QString &sniServicePath) +{ + return QString("sni:%1").arg(sniServicePath); +} + +bool SNITrayItemWidget::isSNIKey(const QString &itemKey) +{ + return itemKey.startsWith("sni:"); +} + +QPair SNITrayItemWidget::serviceAndPath(const QString &servicePath) +{ + QStringList list = servicePath.split("/"); + QPair pair; + pair.first = list.takeFirst(); + + for (auto i : list) { + pair.second.append("/"); + pair.second.append(i); + } + + return pair; +} + +uint SNITrayItemWidget::servicePID(const QString &servicePath) +{ + QString serviceName = serviceAndPath(servicePath).first; + QDBusConnection conn = QDBusConnection::sessionBus(); + return conn.interface()->servicePid(serviceName); +} + +void SNITrayItemWidget::initSNIPropertys() +{ + m_sniAttentionIconName = m_sniInter->attentionIconName(); + m_sniAttentionIconPixmap = m_sniInter->attentionIconPixmap(); + m_sniAttentionMovieName = m_sniInter->attentionMovieName(); + m_sniCategory = m_sniInter->category(); + m_sniIconName = m_sniInter->iconName(); + m_sniIconPixmap = m_sniInter->iconPixmap(); + m_sniIconThemePath = m_sniInter->iconThemePath(); + m_sniId = m_sniInter->id(); + m_sniMenuPath = m_sniInter->menu(); + m_sniOverlayIconName = m_sniInter->overlayIconName(); + m_sniOverlayIconPixmap = m_sniInter->overlayIconPixmap(); + m_sniStatus = m_sniInter->status(); + + m_updateIconTimer->start(); +} + +void SNITrayItemWidget::initMenu() +{ + const QString &sniMenuPath = m_sniMenuPath.path(); + if (sniMenuPath.isEmpty()) { + qDebug() << "Error: current sni menu path is empty of dbus service:" << m_dbusService << "id:" << m_sniId; + return; + } + + qDebug() << "using sni service path:" << m_dbusService << "menu path:" << sniMenuPath; + + m_dbusMenuImporter = new DBusMenuImporter(m_dbusService, sniMenuPath, ASYNCHRONOUS, this); + + qDebug() << "generate the sni menu object"; + + m_menu = m_dbusMenuImporter->menu(); + + qDebug() << "the sni menu obect is:" << m_menu; +} + +void SNITrayItemWidget::refreshIcon() +{ + QPixmap pix = newIconPixmap(Icon); + if (pix.isNull()) { + return; + } + + m_pixmap = pix; + update(); + Q_EMIT iconChanged(); + + if (!isVisible()) { + Q_EMIT needAttention(); + } +} + +void SNITrayItemWidget::refreshOverlayIcon() +{ + QPixmap pix = newIconPixmap(OverlayIcon); + if (pix.isNull()) { + return; + } + + m_overlayPixmap = pix; + update(); + Q_EMIT iconChanged(); + + if (!isVisible()) { + Q_EMIT needAttention(); + } +} + +void SNITrayItemWidget::refreshAttentionIcon() +{ + /* TODO: A new approach may be needed to deal with attentionIcon */ + QPixmap pix = newIconPixmap(AttentionIcon); + if (pix.isNull()) { + return; + } + + m_pixmap = pix; + update(); + Q_EMIT iconChanged(); + + if (!isVisible()) { + Q_EMIT needAttention(); + } +} + +void SNITrayItemWidget::showContextMenu(int x, int y) +{ + // 这里的PopupWindow属性是置顶的,如果不隐藏,会导致菜单显示不出来 + hidePopup(); + + // ContextMenu does not work + if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) { + m_sniInter->ContextMenu(x, y); + } else { + if (!m_menu) { + qDebug() << "context menu has not be ready, init menu"; + initMenu(); + } + + if (m_menu) + m_menu->popup(QPoint(x, y)); + } +} + +void SNITrayItemWidget::onSNIAttentionIconNameChanged(const QString &value) +{ + m_sniAttentionIconName = value; + + m_updateAttentionIconTimer->start(); +} + +void SNITrayItemWidget::onSNIAttentionIconPixmapChanged(DBusImageList value) +{ + m_sniAttentionIconPixmap = value; + + m_updateAttentionIconTimer->start(); +} + +void SNITrayItemWidget::onSNIAttentionMovieNameChanged(const QString &value) +{ + m_sniAttentionMovieName = value; + + m_updateAttentionIconTimer->start(); +} + +void SNITrayItemWidget::onSNICategoryChanged(const QString &value) +{ + m_sniCategory = value; +} + +void SNITrayItemWidget::onSNIIconNameChanged(const QString &value) +{ + m_sniIconName = value; + + m_updateIconTimer->start(); +} + +void SNITrayItemWidget::onSNIIconPixmapChanged(DBusImageList value) +{ + m_sniIconPixmap = value; + + m_updateIconTimer->start(); +} + +void SNITrayItemWidget::onSNIIconThemePathChanged(const QString &value) +{ + m_sniIconThemePath = value; + + m_updateIconTimer->start(); +} + +void SNITrayItemWidget::onSNIIdChanged(const QString &value) +{ + m_sniId = value; +} + +void SNITrayItemWidget::onSNIMenuChanged(const QDBusObjectPath &value) +{ + m_sniMenuPath = value; +} + +void SNITrayItemWidget::onSNIOverlayIconNameChanged(const QString &value) +{ + m_sniOverlayIconName = value; + + m_updateOverlayIconTimer->start(); +} + +void SNITrayItemWidget::onSNIOverlayIconPixmapChanged(DBusImageList value) +{ + m_sniOverlayIconPixmap = value; + + m_updateOverlayIconTimer->start(); +} + +void SNITrayItemWidget::onSNIStatusChanged(const QString &status) +{ + if (!ItemStatusList.contains(status) || m_sniStatus == status) { + return; + } + + m_sniStatus = status; + + Q_EMIT statusChanged(static_cast(ItemStatusList.indexOf(status))); +} + +void SNITrayItemWidget::paintEvent(QPaintEvent *e) +{ + Q_UNUSED(e); + if (!needShow()) { + return; + } + + if (m_pixmap.isNull()) + return; + + QPainter painter; + painter.begin(this); + painter.setRenderHint(QPainter::Antialiasing); + +//#ifdef QT_DEBUG +// painter.fillRect(rect(), Qt::green); +//#endif + + const QRectF &rf = QRect(rect()); + const QRectF &rfp = QRect(m_pixmap.rect()); + const QPointF &p = rf.center() - rfp.center() / m_pixmap.devicePixelRatioF(); + painter.drawPixmap(p, m_pixmap); + + if (!m_overlayPixmap.isNull()) { + painter.drawPixmap(p, m_overlayPixmap); + } + + painter.end(); +} + +QPixmap SNITrayItemWidget::newIconPixmap(IconType iconType) +{ + QPixmap pixmap; + if (iconType == UnknownIconType) { + return pixmap; + } + + QString iconName; + DBusImageList dbusImageList; + + QString iconThemePath = m_sniIconThemePath; + + switch (iconType) { + case Icon: + iconName = m_sniIconName; + dbusImageList = m_sniIconPixmap; + break; + case OverlayIcon: + iconName = m_sniOverlayIconName; + dbusImageList = m_sniOverlayIconPixmap; + break; + case AttentionIcon: + iconName = m_sniAttentionIconName; + dbusImageList = m_sniAttentionIconPixmap; + break; + case AttentionMovieIcon: + iconName = m_sniAttentionMovieName; + break; + default: + break; + } + + const auto ratio = devicePixelRatioF(); + const int iconSizeScaled = IconSize * ratio; + do { + // load icon from sni dbus + if (!dbusImageList.isEmpty() && !dbusImageList.first().pixels.isEmpty()) { + for (DBusImage dbusImage : dbusImageList) { + char *image_data = dbusImage.pixels.data(); + + if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) { + for (int i = 0; i < dbusImage.pixels.size(); i += 4) { + *(qint32 *)(image_data + i) = qFromBigEndian(*(qint32 *)(image_data + i)); + } + } + + QImage image((const uchar *)dbusImage.pixels.constData(), dbusImage.width, dbusImage.height, QImage::Format_ARGB32); + pixmap = QPixmap::fromImage(image.scaled(iconSizeScaled, iconSizeScaled, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + pixmap.setDevicePixelRatio(ratio); + if (!pixmap.isNull()) { + break; + } + } + } + + // load icon from specified file + if (!iconThemePath.isEmpty() && !iconName.isEmpty()) { + QDirIterator it(iconThemePath, QDirIterator::Subdirectories); + while (it.hasNext()) { + it.next(); + if (it.fileName().startsWith(iconName, Qt::CaseInsensitive)) { + QImage image(it.filePath()); + pixmap = QPixmap::fromImage(image.scaled(iconSizeScaled, iconSizeScaled, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + pixmap.setDevicePixelRatio(ratio); + if (!pixmap.isNull()) { + break; + } + } + } + if (!pixmap.isNull()) { + break; + } + } + + // load icon from theme + // Note: this will ensure return a None-Null pixmap + // so, it should be the last fallback + if (!iconName.isEmpty()) { + // ThemeAppIcon::getIcon 会处理高分屏缩放问题 + ThemeAppIcon::getIcon(pixmap, iconName, IconSize); + if (!pixmap.isNull()) { + break; + } + } + + if (pixmap.isNull()) { + qDebug() << "get icon faild!" << iconType; + } + } while (false); + +// QLabel *l = new QLabel; +// l->setPixmap(pixmap); +// l->setFixedSize(100, 100); +// l->show(); + + return pixmap; +} + +void SNITrayItemWidget::enterEvent(QEvent *event) +{ + // 触屏不显示hover效果 + if (!qApp->property(IS_TOUCH_STATE).toBool()) { + m_popupTipsDelayTimer->start(); + } + + BaseTrayWidget::enterEvent(event); +} + +void SNITrayItemWidget::leaveEvent(QEvent *event) +{ + m_popupTipsDelayTimer->stop(); + if (m_popupShown && !PopupWindow->model()) + hidePopup(); + + update(); + + BaseTrayWidget::leaveEvent(event); +} + +void SNITrayItemWidget::mousePressEvent(QMouseEvent *event) +{ + // call QWidget::mousePressEvent means to show dock-context-menu + // when right button of mouse is pressed immediately in fashion mode + + // here we hide the right button press event when it is click in the special area + m_popupTipsDelayTimer->stop(); + if (event->button() == Qt::RightButton && perfectIconRect().contains(event->pos(), true)) { + event->accept(); + setMouseData(event); + return; + } + + QWidget::mousePressEvent(event); +} + +void SNITrayItemWidget::mouseReleaseEvent(QMouseEvent *e) +{ + //e->accept(); + + // 由于 XWindowTrayWidget 中对 发送鼠标事件到X窗口的函数, 如 sendClick/sendHoverEvent 中 + // 使用了 setX11PassMouseEvent, 而每次调用 setX11PassMouseEvent 时都会导致产生 mousePress 和 mouseRelease 事件 + // 因此如果直接在这里处理事件会导致一些问题, 所以使用 Timer 来延迟处理 100 毫秒内的最后一个事件 + setMouseData(e); + + QWidget::mouseReleaseEvent(e); +} + +void SNITrayItemWidget::handleMouseRelease() +{ + Q_ASSERT(sender() == m_handleMouseReleaseTimer); + + // do not dealwith all mouse event of SystemTray, class SystemTrayItem will handle it + if (trayType() == SystemTray) + return; + + const QPoint point(m_lastMouseReleaseData.first - rect().center()); + if (point.manhattanLength() > 24) + return; + + QPoint globalPos = QCursor::pos(); + uint8_t buttonIndex = XCB_BUTTON_INDEX_1; + + switch (m_lastMouseReleaseData.second) { + case Qt:: MiddleButton: + buttonIndex = XCB_BUTTON_INDEX_2; + break; + case Qt::RightButton: + buttonIndex = XCB_BUTTON_INDEX_3; + break; + default: + break; + } + + sendClick(buttonIndex, globalPos.x(), globalPos.y()); + + // left mouse button clicked + if (buttonIndex == XCB_BUTTON_INDEX_1) { + Q_EMIT clicked(); + } +} + +void SNITrayItemWidget::showHoverTips() +{ + if (PopupWindow->model()) + return; + + // if not in geometry area + const QRect r(topleftPoint(), size()); + if (!r.contains(QCursor::pos())) + return; + + QProcess p; + p.start("qdbus", {m_dbusService}); + if (!p.waitForFinished(1000)) { + qDebug() << "sni dbus service error : " << m_dbusService; + return; + } + + QDBusInterface infc(m_dbusService, m_dbusPath); + QDBusMessage msg = infc.call("Get", "org.kde.StatusNotifierItem", "ToolTip"); + if (msg.type() == QDBusMessage::ReplyMessage) { + QDBusArgument arg = msg.arguments().at(0).value().variant().value(); + DBusToolTip tooltip = qdbus_cast(arg); + + if (tooltip.title.isEmpty()) + return; + +#ifdef QT_DEBUG + setToolTip(tooltip.title); +#else +// // 当提示信息中有换行符时,需要使用setTextList +// if (tooltip.title.contains('\n')) +// m_tipsLabel->setTextList(tooltip.title.split('\n')); +// else +// m_tipsLabel->setText(tooltip.title); + +// m_tipsLabel->setAccessibleName(itemKeyForConfig().replace("sni:","")); + + +// showPopupWindow(m_tipsLabel); +#endif + } +} + +void SNITrayItemWidget::hideNonModel() +{ + // auto hide if popup is not model window + if (m_popupShown && !PopupWindow->model()) + hidePopup(); +} + +void SNITrayItemWidget::popupWindowAccept() +{ + if (!PopupWindow->isVisible()) + return; + + hidePopup(); +} + +void SNITrayItemWidget::hidePopup() +{ + m_popupTipsDelayTimer->stop(); + m_popupShown = false; + PopupWindow->hide(); + + emit PopupWindow->accept(); + emit requestWindowAutoHide(true); +} +// 获取在最外层的窗口(MainWindow)中的位置 +const QPoint SNITrayItemWidget::topleftPoint() const +{ + QPoint p; + const QWidget *w = this; + do { + p += w->pos(); + w = qobject_cast(w->parent()); + } while (w); + + return p; +} + +const QPoint SNITrayItemWidget::popupMarkPoint() const +{ + QPoint p(topleftPoint()); + + const QRect r = rect(); + const QRect wr = window()->rect(); + + switch (DockPosition) { + case Dock::Position::Top: + p += QPoint(r.width() / 2, r.height() + (wr.height() - r.height()) / 2); + break; + case Dock::Position::Bottom: + p += QPoint(r.width() / 2, 0 - (wr.height() - r.height()) / 2); + break; + case Dock::Position::Left: + p += QPoint(r.width() + (wr.width() - r.width()) / 2, r.height() / 2); + break; + case Dock::Position::Right: + p += QPoint(0 - (wr.width() - r.width()) / 2, r.height() / 2); + break; + } + + return p; +} + +QPixmap SNITrayItemWidget::icon() +{ + return m_pixmap; +} + +void SNITrayItemWidget::showPopupWindow(QWidget *const content, const bool model) +{ + m_popupShown = true; + + if (model) + emit requestWindowAutoHide(false); + + DockPopupWindow *popup = PopupWindow.data(); + QWidget *lastContent = popup->getContent(); + if (lastContent) + lastContent->setVisible(false); + + switch (DockPosition) { + case Dock::Position::Top: popup->setArrowDirection(DockPopupWindow::ArrowTop); break; + case Dock::Position::Bottom: popup->setArrowDirection(DockPopupWindow::ArrowBottom); break; + case Dock::Position::Left: popup->setArrowDirection(DockPopupWindow::ArrowLeft); break; + case Dock::Position::Right: popup->setArrowDirection(DockPopupWindow::ArrowRight); break; + } + popup->resize(content->sizeHint()); + popup->setContent(content); + + QPoint p = popupMarkPoint(); + if (!popup->isVisible()) + QMetaObject::invokeMethod(popup, "show", Qt::QueuedConnection, Q_ARG(QPoint, p), Q_ARG(bool, model)); + else + popup->show(p, model); +} + +void SNITrayItemWidget::setMouseData(QMouseEvent *e) +{ + m_lastMouseReleaseData.first = e->pos(); + m_lastMouseReleaseData.second = e->button(); + + m_handleMouseReleaseTimer->start(); +} diff --git a/frame/window/tray/widgets/snitrayitemwidget.h b/frame/window/tray/widgets/snitrayitemwidget.h new file mode 100644 index 000000000..6b9488e35 --- /dev/null +++ b/frame/window/tray/widgets/snitrayitemwidget.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#ifndef SNITRAYWIDGET_H +#define SNITRAYWIDGET_H + +#include "constants.h" +#include "basetraywidget.h" +#include "dockpopupwindow.h" + +#include + +#include +#include +//DWIDGET_USE_NAMESPACE +//DGUI_USE_NAMESPACE +class DBusMenuImporter; +//namespace Dock { +//class TipsWidget; +//} +//using namespace com::deepin::dde; +using namespace org::kde; + +/** + * @brief The SNITrayWidget class + * @note 系统托盘第三方程序窗口 + */ +class SNITrayItemWidget : public BaseTrayWidget +{ + Q_OBJECT + +public: + enum ItemCategory {UnknownCategory = -1, ApplicationStatus, Communications, SystemServices, Hardware}; + enum ItemStatus {Passive, Active, NeedsAttention}; + enum IconType {UnknownIconType = -1, Icon, OverlayIcon, AttentionIcon, AttentionMovieIcon}; + +public: + SNITrayItemWidget(const QString &sniServicePath, QWidget *parent = Q_NULLPTR); + + QString itemKeyForConfig() override; + void updateIcon() override; + void sendClick(uint8_t mouseButton, int x, int y) override; + + bool isValid() override; + SNITrayItemWidget::ItemStatus status(); + SNITrayItemWidget::ItemCategory category(); + + static QString toSNIKey(const QString &sniServicePath); + static bool isSNIKey(const QString &itemKey); + static QPair serviceAndPath(const QString &servicePath); + static uint servicePID(const QString &servicePath); + + void showHoverTips(); + const QPoint topleftPoint() const; + void showPopupWindow(QWidget *const content, const bool model = false); + const QPoint popupMarkPoint() const; + + static void setDockPostion(const Dock::Position pos) { DockPosition = pos; } + + QPixmap icon() override; + +Q_SIGNALS: + void statusChanged(SNITrayItemWidget::ItemStatus status); + +private Q_SLOTS: + void initSNIPropertys(); + void initMenu(); + void refreshIcon(); + void refreshOverlayIcon(); + void refreshAttentionIcon(); + void showContextMenu(int x, int y); + // SNI property change slot + void onSNIAttentionIconNameChanged(const QString &value); + void onSNIAttentionIconPixmapChanged(DBusImageList value); + void onSNIAttentionMovieNameChanged(const QString &value); + void onSNICategoryChanged(const QString &value); + void onSNIIconNameChanged(const QString &value); + void onSNIIconPixmapChanged(DBusImageList value); + void onSNIIconThemePathChanged(const QString &value); + void onSNIIdChanged(const QString &value); + void onSNIMenuChanged(const QDBusObjectPath &value); + void onSNIOverlayIconNameChanged(const QString &value); + void onSNIOverlayIconPixmapChanged(DBusImageList value); + void onSNIStatusChanged(const QString &status); + void hidePopup(); + void hideNonModel(); + void popupWindowAccept(); + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *e) override; + +private: + void paintEvent(QPaintEvent *e) override; + QPixmap newIconPixmap(IconType iconType); + void setMouseData(QMouseEvent *e); + void handleMouseRelease(); + +private: + StatusNotifierItem *m_sniInter; + + DBusMenuImporter *m_dbusMenuImporter; + + QMenu *m_menu; + QTimer *m_updateIconTimer; + QTimer *m_updateOverlayIconTimer; + QTimer *m_updateAttentionIconTimer; + + QString m_sniServicePath; + QString m_dbusService; + QString m_dbusPath; + + QPixmap m_pixmap; + QPixmap m_overlayPixmap; + + // SNI propertys + QString m_sniAttentionIconName; + DBusImageList m_sniAttentionIconPixmap; + QString m_sniAttentionMovieName; + QString m_sniCategory; + QString m_sniIconName; + DBusImageList m_sniIconPixmap; + QString m_sniIconThemePath; + QString m_sniId; + QDBusObjectPath m_sniMenuPath; + QString m_sniOverlayIconName; + DBusImageList m_sniOverlayIconPixmap; + QString m_sniStatus; + QTimer *m_popupTipsDelayTimer; + QTimer *m_handleMouseReleaseTimer; + QPair m_lastMouseReleaseData; + static Dock::Position DockPosition; + static QPointer PopupWindow; +// Dock::TipsWidget *m_tipsLabel; + bool m_popupShown; +}; + +#endif /* SNIWIDGET_H */ diff --git a/frame/window/tray/widgets/systempluginitem.cpp b/frame/window/tray/widgets/systempluginitem.cpp new file mode 100644 index 000000000..de53d6f2b --- /dev/null +++ b/frame/window/tray/widgets/systempluginitem.cpp @@ -0,0 +1,508 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#include "systempluginitem.h" +#include "utils.h" +#include "dockpopupwindow.h" + +#include +#include +#include + +#include + +Dock::Position SystemPluginItem::DockPosition = Dock::Position::Top; +QPointer SystemPluginItem::PopupWindow = nullptr; + +SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) + : BaseTrayWidget(parent) + , m_popupShown(false) + , m_tapAndHold(false) + , m_pluginInter(pluginInter) + , m_centralWidget(m_pluginInter->itemWidget(itemKey)) + , m_popupTipsDelayTimer(new QTimer(this)) + , m_popupAdjustDelayTimer(new QTimer(this)) + , m_itemKey(itemKey) + , m_gsettings(Utils::ModuleSettingsPtr(pluginInter->pluginName(), QByteArray(), this)) +{ + qDebug() << "load tray plugins item: " << m_pluginInter->pluginName() << itemKey << m_centralWidget; + + m_centralWidget->setParent(this); + m_centralWidget->setVisible(true); + m_centralWidget->installEventFilter(this); + + QBoxLayout *hLayout = new QHBoxLayout(this); + hLayout->addWidget(m_centralWidget); + hLayout->setSpacing(0); + hLayout->setMargin(0); + + setLayout(hLayout); + setAccessibleName(m_itemKey); + setAttribute(Qt::WA_TranslucentBackground); + + if (PopupWindow.isNull()) { + DockPopupWindow *arrowRectangle = new DockPopupWindow(nullptr); + arrowRectangle->setShadowBlurRadius(20); + arrowRectangle->setRadius(6); + arrowRectangle->setShadowYOffset(2); + arrowRectangle->setShadowXOffset(0); + arrowRectangle->setArrowWidth(18); + arrowRectangle->setArrowHeight(10); + arrowRectangle->setObjectName("systemtraypopup"); + PopupWindow = arrowRectangle; + connect(qApp, &QApplication::aboutToQuit, PopupWindow, &DockPopupWindow::deleteLater); + } + + // 必须初始化父窗口,否则当主题切换之后再设置父窗口的时候palette会更改为主题切换前的palette + if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey)) { + w->setParent(PopupWindow.data()); + w->setVisible(false); + } + + m_popupTipsDelayTimer->setInterval(500); + m_popupTipsDelayTimer->setSingleShot(true); + + m_popupAdjustDelayTimer->setInterval(10); + m_popupAdjustDelayTimer->setSingleShot(true); + + connect(m_popupTipsDelayTimer, &QTimer::timeout, this, &SystemPluginItem::showHoverTips); + connect(m_popupAdjustDelayTimer, &QTimer::timeout, this, &SystemPluginItem::updatePopupPosition, Qt::QueuedConnection); + connect(&m_contextMenu, &QMenu::triggered, this, &SystemPluginItem::menuActionClicked); + + if (m_gsettings) + connect(m_gsettings, &QGSettings::changed, this, &SystemPluginItem::onGSettingsChanged); + + grabGesture(Qt::TapAndHoldGesture); +} + +SystemPluginItem::~SystemPluginItem() +{ + if (m_popupShown) + popupWindowAccept(); +} + +QString SystemPluginItem::itemKeyForConfig() +{ + return m_itemKey; +} + +void SystemPluginItem::updateIcon() +{ + m_pluginInter->refreshIcon(m_itemKey); +} + +void SystemPluginItem::sendClick(uint8_t mouseButton, int x, int y) +{ + Q_UNUSED(mouseButton); + Q_UNUSED(x); + Q_UNUSED(y); + + // do not process this callback + // handle all mouse event in override mouse function +} + +QWidget *SystemPluginItem::trayTipsWidget() +{ + if (m_pluginInter->itemTipsWidget(m_itemKey)) { + m_pluginInter->itemTipsWidget(m_itemKey)->setAccessibleName(m_pluginInter->pluginName()); + } + + return m_pluginInter->itemTipsWidget(m_itemKey); +} + +QWidget *SystemPluginItem::trayPopupApplet() +{ + if (m_pluginInter->itemPopupApplet(m_itemKey)) { + m_pluginInter->itemPopupApplet(m_itemKey)->setAccessibleName(m_pluginInter->pluginName()); + } + + return m_pluginInter->itemPopupApplet(m_itemKey); +} + +const QString SystemPluginItem::trayClickCommand() +{ + return m_pluginInter->itemCommand(m_itemKey); +} + +const QString SystemPluginItem::contextMenu() const +{ + return m_pluginInter->itemContextMenu(m_itemKey); +} + +void SystemPluginItem::invokedMenuItem(const QString &menuId, const bool checked) +{ + m_pluginInter->invokedMenuItem(m_itemKey, menuId, checked); +} + +QWidget *SystemPluginItem::centralWidget() const +{ + return m_centralWidget; +} + +void SystemPluginItem::detachPluginWidget() +{ + QWidget *widget = m_pluginInter->itemWidget(m_itemKey); + if (widget) + widget->setParent(nullptr); +} + +bool SystemPluginItem::event(QEvent *event) +{ + if (m_popupShown) { + switch (event->type()) { + case QEvent::Paint: + if (!m_popupAdjustDelayTimer->isActive()) + m_popupAdjustDelayTimer->start(); + break; + default:; + } + } + + if (event->type() == QEvent::Gesture) + gestureEvent(static_cast(event)); + + return BaseTrayWidget::event(event); +} + +void SystemPluginItem::enterEvent(QEvent *event) +{ + if (checkGSettingsControl()) { + //网络需要显示Tips,需要特殊处理。 + if (m_pluginInter->pluginName() != "network") + return; + } + + // 触屏不显示hover效果 + if (!qApp->property(IS_TOUCH_STATE).toBool()) { + m_popupTipsDelayTimer->start(); + } + update(); + + BaseTrayWidget::enterEvent(event); +} + +void SystemPluginItem::leaveEvent(QEvent *event) +{ + m_popupTipsDelayTimer->stop(); + + // auto hide if popup is not model window + if (m_popupShown && !PopupWindow->model()) + hidePopup(); + + update(); + + BaseTrayWidget::leaveEvent(event); +} + +void SystemPluginItem::mousePressEvent(QMouseEvent *event) +{ + if (checkGSettingsControl()) { + return; + } + + m_popupTipsDelayTimer->stop(); + hideNonModel(); + + if (event->button() == Qt::RightButton + && perfectIconRect().contains(event->pos(), true)) { + return (m_gsettings && (!m_gsettings->keys().contains("menuEnable") || m_gsettings->get("menuEnable").toBool())) ? showContextMenu() : void(); + } + + BaseTrayWidget::mousePressEvent(event); +} + +void SystemPluginItem::mouseReleaseEvent(QMouseEvent *event) +{ + if (checkGSettingsControl()) { + return; + } + + if (event->button() != Qt::LeftButton) { + return; + } + + if (checkAndResetTapHoldGestureState() && event->source() == Qt::MouseEventSynthesizedByQt) { + qDebug() << "SystemTray: tap and hold gesture detected, ignore the synthesized mouse release event"; + return; + } + + event->accept(); + + showPopupApplet(trayPopupApplet()); + + if (!trayClickCommand().isEmpty()) { + QProcess::startDetached(trayClickCommand()); + } + + BaseTrayWidget::mouseReleaseEvent(event); +} + +void SystemPluginItem::showEvent(QShowEvent *event) +{ + QTimer::singleShot(0, this, [ = ] { + onGSettingsChanged("enable"); + }); + + return BaseTrayWidget::showEvent(event); +} + +const QPoint SystemPluginItem::popupMarkPoint() const +{ + QPoint p(topleftPoint()); + + const QRect r = rect(); + const QRect wr = window()->rect(); + + switch (DockPosition) { + case Dock::Position::Top: + p += QPoint(r.width() / 2, r.height() + (wr.height() - r.height()) / 2); + break; + case Dock::Position::Bottom: + p += QPoint(r.width() / 2, 0 - (wr.height() - r.height()) / 2); + break; + case Dock::Position::Left: + p += QPoint(r.width() + (wr.width() - r.width()) / 2, r.height() / 2); + break; + case Dock::Position::Right: + p += QPoint(0 - (wr.width() - r.width()) / 2, r.height() / 2); + break; + } + + return p; +} + +// 获取在最外层的窗口(MainWindow)中的位置 +const QPoint SystemPluginItem::topleftPoint() const +{ + QPoint p; + const QWidget *w = this; + do { + p += w->pos(); + w = qobject_cast(w->parent()); + } while (w); + + return p; +} + +void SystemPluginItem::hidePopup() +{ + m_popupTipsDelayTimer->stop(); + m_popupAdjustDelayTimer->stop(); + m_popupShown = false; + PopupWindow->hide(); + + DockPopupWindow *popup = PopupWindow.data(); + QWidget *content = popup->getContent(); + if (content) { + content->setVisible(false); + } + + emit PopupWindow->accept(); + emit requestWindowAutoHide(true); +} + +void SystemPluginItem::hideNonModel() +{ + // auto hide if popup is not model window + if (m_popupShown && !PopupWindow->model()) + hidePopup(); +} + +void SystemPluginItem::popupWindowAccept() +{ + if (!PopupWindow->isVisible()) + return; + + disconnect(PopupWindow.data(), &DockPopupWindow::accept, this, &SystemPluginItem::popupWindowAccept); + + hidePopup(); +} + +void SystemPluginItem::showPopupApplet(QWidget *const applet) +{ + if (!applet) + return; + + // another model popup window already exists + if (PopupWindow->model()) { + applet->setVisible(false); + return; + } + + showPopupWindow(applet, true); +} + +void SystemPluginItem::showPopupWindow(QWidget *const content, const bool model) +{ + m_popupShown = true; + m_lastPopupWidget = content; + + if (model) + emit requestWindowAutoHide(false); + + DockPopupWindow *popup = PopupWindow.data(); + QWidget *lastContent = popup->getContent(); + if (lastContent) + lastContent->setVisible(false); + + switch (DockPosition) { + case Dock::Position::Top: popup->setArrowDirection(DockPopupWindow::ArrowTop); break; + case Dock::Position::Bottom: popup->setArrowDirection(DockPopupWindow::ArrowBottom); break; + case Dock::Position::Left: popup->setArrowDirection(DockPopupWindow::ArrowLeft); break; + case Dock::Position::Right: popup->setArrowDirection(DockPopupWindow::ArrowRight); break; + } + popup->resize(content->sizeHint()); + popup->setContent(content); + + QPoint p = popupMarkPoint(); + if (!popup->isVisible()) + QMetaObject::invokeMethod(popup, "show", Qt::QueuedConnection, Q_ARG(QPoint, p), Q_ARG(bool, model)); + else + popup->show(p, model); + + connect(popup, &DockPopupWindow::accept, this, &SystemPluginItem::popupWindowAccept, Qt::UniqueConnection); +} + +void SystemPluginItem::showHoverTips() +{ + // another model popup window already exists + if (PopupWindow->model()) + return; + + // if not in geometry area + const QRect r(topleftPoint(), size()); + if (!r.contains(QCursor::pos())) + return; + + QWidget *const content = trayTipsWidget(); + if (!content) + return; + + showPopupWindow(content); +} + +/*! + * \sa DockItem::checkAndResetTapHoldGestureState + */ +bool SystemPluginItem::checkAndResetTapHoldGestureState() +{ + bool ret = m_tapAndHold; + m_tapAndHold = false; + return ret; +} + +void SystemPluginItem::gestureEvent(QGestureEvent *event) +{ + if (!event) + return; + + QGesture *gesture = event->gesture(Qt::TapAndHoldGesture); + + if (!gesture) + return; + + qDebug() << "SystemTray: got TapAndHoldGesture"; + + m_tapAndHold = true; +} + +void SystemPluginItem::showContextMenu() +{ + const QString menuJson = contextMenu(); + if (menuJson.isEmpty()) + return; + + + QJsonDocument jsonDocument = QJsonDocument::fromJson(menuJson.toLocal8Bit().data()); + if (jsonDocument.isNull()) + return; + + QJsonObject jsonMenu = jsonDocument.object(); + + qDeleteAll(m_contextMenu.actions()); + + QJsonArray jsonMenuItems = jsonMenu.value("items").toArray(); + for (auto item : jsonMenuItems) { + QJsonObject itemObj = item.toObject(); + QAction *action = new QAction(itemObj.value("itemText").toString()); + action->setCheckable(itemObj.value("isCheckable").toBool()); + action->setChecked(itemObj.value("checked").toBool()); + action->setData(itemObj.value("itemId").toString()); + action->setEnabled(itemObj.value("isActive").toBool()); + m_contextMenu.addAction(action); + } + + hidePopup(); + emit requestWindowAutoHide(false); + + m_contextMenu.exec(QCursor::pos()); + + onContextMenuAccepted(); +} + +void SystemPluginItem::menuActionClicked(QAction *action) +{ + invokedMenuItem(action->data().toString(), true); +} + +void SystemPluginItem::onContextMenuAccepted() +{ + emit requestRefershWindowVisible(); + emit requestWindowAutoHide(true); +} + +void SystemPluginItem::updatePopupPosition() +{ + Q_ASSERT(sender() == m_popupAdjustDelayTimer); + + if (!m_popupShown || !PopupWindow->model()) + return; + + if (PopupWindow->getContent() != m_lastPopupWidget.data()) + return popupWindowAccept(); + + const QPoint p = popupMarkPoint(); + PopupWindow->show(p, PopupWindow->model()); +} + +void SystemPluginItem::onGSettingsChanged(const QString &key) { + if (key != "enable") { + return; + } + + if (m_gsettings && m_gsettings->keys().contains("enable")) { + const bool visible = m_gsettings->get("enable").toBool(); + setVisible(visible); + emit itemVisibleChanged(visible); + } +} + +bool SystemPluginItem::checkGSettingsControl() const +{ + // 优先判断com.deepin.dde.dock.module.systemtray的control值是否为true(优先级更高),如果不为true,再判断每一个托盘对应的gsetting配置的control值 + bool isEnable = Utils::SettingValue("com.deepin.dde.dock.module.systemtray", QByteArray(), "control", false).toBool(); + return (isEnable || (m_gsettings && m_gsettings->get("control").toBool())); +} + +QPixmap SystemPluginItem::icon() +{ + return QPixmap(); +} diff --git a/frame/window/tray/widgets/systempluginitem.h b/frame/window/tray/widgets/systempluginitem.h new file mode 100644 index 000000000..f9a9ca148 --- /dev/null +++ b/frame/window/tray/widgets/systempluginitem.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#ifndef SYSTEMTRAYITEM_H +#define SYSTEMTRAYITEM_H + +#include "constants.h" +#include "basetraywidget.h" +#include "pluginsiteminterface.h" + +#include +#include + +class QGSettings; +class Menu; +class DockPopupWindow; + +class SystemPluginItem : public BaseTrayWidget +{ + Q_OBJECT + +public: + SystemPluginItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + ~SystemPluginItem() override; + +public: + QString itemKeyForConfig() override; + void updateIcon() override; + void sendClick(uint8_t mouseButton, int x, int y) override; + inline TrayType trayType() const override { return TrayType::SystemTray; } + QPixmap icon() override; + + QWidget *trayTipsWidget(); + QWidget *trayPopupApplet(); + const QString trayClickCommand(); + const QString contextMenu() const; + void invokedMenuItem(const QString &menuId, const bool checked); + + static void setDockPostion(const Dock::Position pos) { DockPosition = pos; } + + QWidget *centralWidget() const; + void detachPluginWidget(); + void showContextMenu(); + + void showPopupApplet(QWidget * const applet); + void hidePopup(); + +signals: + void itemVisibleChanged(bool visible); + +protected: + bool event(QEvent *event) override; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void showEvent(QShowEvent* event) override; + +protected: + const QPoint popupMarkPoint() const; + const QPoint topleftPoint() const; + + void hideNonModel(); + void popupWindowAccept(); + + virtual void showPopupWindow(QWidget * const content, const bool model = false); + virtual void showHoverTips(); + + bool checkAndResetTapHoldGestureState(); + virtual void gestureEvent(QGestureEvent *event); + +protected Q_SLOTS: + void onContextMenuAccepted(); + +private: + void updatePopupPosition(); + void onGSettingsChanged(const QString &key); + bool checkGSettingsControl() const; + void menuActionClicked(QAction *action); + +private: + bool m_popupShown; + bool m_tapAndHold; + QMenu m_contextMenu; + + PluginsItemInterface* m_pluginInter; + QWidget *m_centralWidget; + + QTimer *m_popupTipsDelayTimer; + QTimer *m_popupAdjustDelayTimer; + + QPointer m_lastPopupWidget; + QString m_itemKey; + + static Dock::Position DockPosition; + static QPointer PopupWindow; + const QGSettings* m_gsettings; +}; + +#endif // SYSTEMTRAYITEM_H diff --git a/frame/window/tray/widgets/xembedtrayitemwidget.cpp b/frame/window/tray/widgets/xembedtrayitemwidget.cpp new file mode 100644 index 000000000..eadb9745f --- /dev/null +++ b/frame/window/tray/widgets/xembedtrayitemwidget.cpp @@ -0,0 +1,621 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#include "constants.h" +#include "xembedtrayitemwidget.h" +//#include "utils.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#define NORMAL_WINDOW_PROP_NAME "WM_CLASS" +#define WINE_WINDOW_PROP_NAME "__wine_prefix" +#define IS_WINE_WINDOW_BY_WM_CLASS "explorer.exe" + +static const qreal iconSize = PLUGIN_ICON_MAX_SIZE; + +const bool IS_WAYLAND_DISPLAY = !qgetenv("WAYLAND_DISPLAY").isEmpty(); + +// this static var hold all suffix of tray widget keys. +// that is in order to fix can not show multiple trays provide by one application, +// so only one property: AppName is not enough to identify all trays. +// here we add a suffix for every tray to fix this problem. +// the first suffix is 1, second is 2, etc. +// NOTE: the first suffix will be omit when construct the key of tray widget. +static QMap> AppWinidSuffixMap; + +//using namespace Utils; + +const QPoint rawXPosition(const QPoint &scaledPos) +{ + QRect g = qApp->primaryScreen() ? qApp->primaryScreen()->geometry() : QRect(); + for (auto *screen : qApp->screens()) + { + const QRect &sg = screen->geometry(); + if (sg.contains(scaledPos)) + { + g = sg; + break; + } + } + + return g.topLeft() + (scaledPos - g.topLeft()) * qApp->devicePixelRatio(); +} + +void sni_cleanup_xcb_image(void *data) +{ + xcb_image_destroy(static_cast(data)); +} + +XEmbedTrayItemWidget::XEmbedTrayItemWidget(quint32 winId, xcb_connection_t *cnn, Display *disp, QWidget *parent) + : BaseTrayWidget(parent) + , m_windowId(winId) + , m_appName(getAppNameForWindow(winId)) + , m_valid(true) + , m_xcbCnn(cnn) + , m_display(disp) +{ + wrapWindow(); + setOwnerPID(getWindowPID(winId)); + + m_updateTimer = new QTimer(this); + m_updateTimer->setInterval(100); + m_updateTimer->setSingleShot(true); + + m_sendHoverEvent = new QTimer(this); + m_sendHoverEvent->setInterval(100); + m_sendHoverEvent->setSingleShot(true); + + connect(m_updateTimer, &QTimer::timeout, this, &XEmbedTrayItemWidget::refershIconImage); + + setMouseTracking(true); + connect(m_sendHoverEvent, &QTimer::timeout, this, &XEmbedTrayItemWidget::sendHoverEvent); + + m_updateTimer->start(); +} + +XEmbedTrayItemWidget::~XEmbedTrayItemWidget() +{ + AppWinidSuffixMap[m_appName].remove(m_windowId); +} + +QString XEmbedTrayItemWidget::itemKeyForConfig() +{ + return QString("window:%1").arg(getAppNameForWindow(m_windowId)); +} + +void XEmbedTrayItemWidget::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + + m_updateTimer->start(); +} + +void XEmbedTrayItemWidget::paintEvent(QPaintEvent *e) +{ + Q_UNUSED(e); + if (!needShow()) { + return; + } + + if (m_image.isNull()) + return m_updateTimer->start(); + + QPainter painter; + painter.begin(this); + painter.setRenderHint(QPainter::Antialiasing); + +//#ifdef QT_DEBUG +// painter.fillRect(rect(), Qt::red); +//#endif + + const QRectF &rf = QRectF(rect()); + const QRectF &rfp = QRectF(m_image.rect()); + const QPointF &p = rf.center() - rfp.center() / m_image.devicePixelRatioF(); + painter.drawImage(p, m_image); + + painter.end(); +} + +void XEmbedTrayItemWidget::mouseMoveEvent(QMouseEvent *e) +{ + BaseTrayWidget::mouseMoveEvent(e); + + // ignore the touchEvent + if (e->source() == Qt::MouseEventSynthesizedByQt) { + return; + } + + m_sendHoverEvent->start(); +} + +void XEmbedTrayItemWidget::configContainerPosition() +{ + auto c = IS_WAYLAND_DISPLAY ? m_xcbCnn : QX11Info::connection(); + if (!c) { + qWarning() << "QX11Info::connection() is " << c; + return; + } + + const QPoint p(rawXPosition(QCursor::pos())); + + const uint32_t containerVals[4] = {uint32_t(p.x()), uint32_t(p.y()), 1, 1}; + xcb_configure_window(c, m_containerWid, + XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, + containerVals); + + + // move the actual tray window to {0,0}, because tray icons from some wine + // applications (QQ, TIM, etc...) may somehow moved to very long distance positions. + const uint32_t trayVals[2] = { 0, 0 }; + xcb_configure_window(c, m_windowId, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, trayVals); + + xcb_flush(c); +} + +void XEmbedTrayItemWidget::wrapWindow() +{ + auto c = IS_WAYLAND_DISPLAY ? m_xcbCnn : QX11Info::connection(); + if (!c) { + qWarning() << "QX11Info::connection() is " << c; + return; + } + + auto cookie = xcb_get_geometry(c, m_windowId); + xcb_get_geometry_reply_t *clientGeom(xcb_get_geometry_reply(c, cookie, Q_NULLPTR)); + if (!clientGeom) { + m_valid = false; + return; + } + free(clientGeom); + + //create a container window + const auto ratio = devicePixelRatioF(); + auto screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data; + m_containerWid = xcb_generate_id(c); + uint32_t values[2]; + auto mask = XCB_CW_BACK_PIXEL | XCB_CW_OVERRIDE_REDIRECT; + values[0] = ParentRelative; //draw a solid background so the embedded icon doesn't get garbage in it + values[1] = true; //bypass wM + xcb_create_window (c, /* connection */ + XCB_COPY_FROM_PARENT, /* depth */ + m_containerWid, /* window Id */ + screen->root, /* parent window */ + 0, 0, /* x, y */ + iconSize * ratio, iconSize * ratio, /* width, height */ + 0, /* border_width */ + XCB_WINDOW_CLASS_INPUT_OUTPUT,/* class */ + screen->root_visual, /* visual */ + mask, values); /* masks */ + + /* + We need the window to exist and be mapped otherwise the child won't render it's contents + + We also need it to exist in the right place to get the clicks working as GTK will check sendEvent locations to see if our window is in the right place. So even though our contents are drawn via compositing we still put this window in the right place + + We can't composite it away anything parented owned by the root window (apparently) + Stack Under works in the non composited case, but it doesn't seem to work in kwin's composited case (probably need set relevant NETWM hint) + + As a last resort set opacity to 0 just to make sure this container never appears + */ +// const uint32_t stackBelowData[] = {XCB_STACK_MODE_BELOW}; +// xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackBelowData); + + if (!IS_WAYLAND_DISPLAY) { + QWindow * win = QWindow::fromWinId(m_containerWid); + win->setOpacity(0); + } else { + const char* opacityName = "_NET_WM_WINDOW_OPACITY\0"; + xcb_intern_atom_cookie_t opacityCookie = xcb_intern_atom(c, false, strlen(opacityName), opacityName); + xcb_intern_atom_reply_t *opacityReply = xcb_intern_atom_reply(c, opacityCookie, 0); + xcb_atom_t opacityAtom = opacityReply->atom; + quint32 opacity = 10; + xcb_change_property(c, + XCB_PROP_MODE_REPLACE, + m_containerWid, + opacityAtom, + XCB_ATOM_CARDINAL, + 32, + 1, + (uchar *)&opacity); + } + +// setX11PassMouseEvent(true); + + xcb_flush(c); + + xcb_map_window(c, m_containerWid); + + xcb_reparent_window(c, m_windowId, + m_containerWid, + 0, 0); + + /* + * Render the embedded window offscreen + */ + xcb_composite_redirect_window(c, m_windowId, XCB_COMPOSITE_REDIRECT_MANUAL); + + + /* we grab the window, but also make sure it's automatically reparented back + * to the root window if we should die. + */ + xcb_change_save_set(c, XCB_SET_MODE_INSERT, m_windowId); + + //tell client we're embedding it + // xembed_message_send(m_windowId, XEMBED_EMBEDDED_NOTIFY, m_containerWid, 0, 0); + + //move window we're embedding + /* + const uint32_t windowMoveConfigVals[2] = { 0, 0 }; + xcb_configure_window(c, m_windowId, + XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, + windowMoveCentially quitting the application. Returns onfigVals); + */ + + //if the window is a clearly stupid size resize to be something sensible + //this is needed as chormium and such when resized just fill the icon with transparent space and only draw in the middle + //however spotify does need this as by default the window size is 900px wide. + //use an artbitrary heuristic to make sure icons are always sensible +// if (clientGeom->width > iconSize || clientGeom->height > iconSize ) + { + const uint32_t windowMoveConfigVals[2] = { uint32_t(iconSize * ratio), uint32_t(iconSize * ratio) }; + xcb_configure_window(c, m_windowId, + XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, + windowMoveConfigVals); + } + + //show the embedded window otherwise nothing happens + xcb_map_window(c, m_windowId); + +// xcb_clear_area(c, 0, m_windowId, 0, 0, qMin(clientGeom->width, iconSize), qMin(clientGeom->height, iconSize)); + + xcb_flush(c); +// setWindowOnTop(false); + setWindowOnTop(true); + setX11PassMouseEvent(true); +} + +void XEmbedTrayItemWidget::sendHoverEvent() +{ + if (!rect().contains(mapFromGlobal(QCursor::pos()))) { + return; + } + + // fake enter event + const QPoint p(rawXPosition(QCursor::pos())); + configContainerPosition(); + setX11PassMouseEvent(false); + setWindowOnTop(true); + Display *display = IS_WAYLAND_DISPLAY ? m_display : QX11Info::display(); + if (display) { + XTestFakeMotionEvent(display, 0, p.x(), p.y(), CurrentTime); + XFlush(display); + } + + QTimer::singleShot(100, this, [=] { setX11PassMouseEvent(true); }); +} + +void XEmbedTrayItemWidget::updateIcon() +{ +// if (!isVisible() && !m_active) +// return; + + m_updateTimer->start(); +} + +//void TrayWidget::hideIcon() +//{ +// auto c = QX11Info::connection(); + +// const uint32_t stackAboveData[] = {XCB_STACK_MODE_BELOW}; +// xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackAboveData); + +// const uint32_t windowMoveConfigVals[2] = {0, 0}; +// xcb_configure_window(c, m_containerWid, +// XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, +// windowMoveConfigVals); + +// hide(); +//} + +void XEmbedTrayItemWidget::sendClick(uint8_t mouseButton, int x, int y) +{ + if (isBadWindow()) + return; + + m_sendHoverEvent->stop(); + + const QPoint p(rawXPosition(QPoint(x, y))); + configContainerPosition(); + setX11PassMouseEvent(false); + setWindowOnTop(true); + + Display *display = IS_WAYLAND_DISPLAY ? m_display : QX11Info::display(); + XTestFakeMotionEvent(display, 0, p.x(), p.y(), CurrentTime); + XFlush(display); + XTestFakeButtonEvent(display, mouseButton, true, CurrentTime); + XFlush(display); + XTestFakeButtonEvent(display, mouseButton, false, CurrentTime); + XFlush(display); + QTimer::singleShot(100, this, [=] { setX11PassMouseEvent(true); }); +} + +// NOTE: WM_NAME may can not obtain successfully +QString XEmbedTrayItemWidget::getWindowProperty(quint32 winId, QString propName) +{ + const auto display = IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + return QString(); + } + + Atom atom_prop = XInternAtom(display, propName.toLocal8Bit(), true); + if (!atom_prop) { + qDebug() << "Error: get window property failed, invalid property atom"; + return QString(); + } + + Atom actual_type_return; + int actual_format_return; + unsigned long nitems_return; + unsigned long bytes_after_return; + unsigned char *prop_return; + + int r = XGetWindowProperty(display, winId, atom_prop, 0, 100, false, AnyPropertyType, + &actual_type_return, &actual_format_return, &nitems_return, + &bytes_after_return, &prop_return); + + Q_UNUSED(r); + +// qDebug() << (r == Success) +// << actual_type_return +// << actual_format_return +// << nitems_return +// << bytes_after_return +// << QString::fromLocal8Bit((char*)prop_return); + if (IS_WAYLAND_DISPLAY) + XCloseDisplay(display); + + return QString::fromLocal8Bit((char*)prop_return); +} + +QString XEmbedTrayItemWidget::toXEmbedKey(quint32 winId) +{ + return QString("window:%1").arg(winId); +} + +bool XEmbedTrayItemWidget::isXEmbedKey(const QString &itemKey) +{ + return itemKey.startsWith("window:"); +} + +QPixmap XEmbedTrayItemWidget::icon() +{ + return QPixmap::fromImage(m_image); +} + +void XEmbedTrayItemWidget::refershIconImage() +{ + const auto ratio = devicePixelRatioF(); + auto c = IS_WAYLAND_DISPLAY ? m_xcbCnn : QX11Info::connection(); + if (!c) { + qWarning() << "QX11Info::connection() is " << c; + return; + } + + auto cookie = xcb_get_geometry(c, m_windowId); + xcb_get_geometry_reply_t *geom(xcb_get_geometry_reply(c, cookie, Q_NULLPTR)); + if (!geom) { + return; + } + + xcb_expose_event_t expose; + expose.response_type = XCB_EXPOSE; + expose.window = m_containerWid; + expose.x = 0; + expose.y = 0; + expose.width = iconSize * ratio; + expose.height = iconSize * ratio; + xcb_send_event_checked(c, false, m_containerWid, XCB_EVENT_MASK_VISIBILITY_CHANGE, reinterpret_cast(&expose)); + xcb_flush(c); + + xcb_image_t *image = xcb_image_get(c, m_windowId, 0, 0, geom->width, geom->height, ~0, XCB_IMAGE_FORMAT_Z_PIXMAP); + if (!image) { + free(geom); + return; + } + + QImage qimage(image->data, image->width, image->height, image->stride, QImage::Format_ARGB32, sni_cleanup_xcb_image, image); + if (qimage.isNull()) { + free(geom); + return; + } + + m_image = qimage.scaled(iconSize * ratio, iconSize * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation); + m_image.setDevicePixelRatio(ratio); + + update(); + Q_EMIT iconChanged(); + + if (!isVisible()) { + Q_EMIT needAttention(); + } +} + +QString XEmbedTrayItemWidget::getAppNameForWindow(quint32 winId) +{ + QString appName; + do { + // is normal application + appName = getWindowProperty(winId, NORMAL_WINDOW_PROP_NAME); + if (!appName.isEmpty() && appName != IS_WINE_WINDOW_BY_WM_CLASS) { + break; + } + + // is wine application + appName = getWindowProperty(winId, WINE_WINDOW_PROP_NAME).split("/").last(); + if (!appName.isEmpty()) { + break; + } + + // fallback to window id + appName = QString::number(winId); + } while (false); + + return appName; +} + +//int XEmbedTrayWidget::getTrayWidgetKeySuffix(const QString &appName, quint32 winId) +//{ +// int suffix = AppWinidSuffixMap.value(appName).value(winId, 0); + +// // return the exist suffix +// if (suffix != 0) { +// return suffix; +// } + +// // it is the first window for this application +// if (!AppWinidSuffixMap.contains(appName)) { +// QMap winIdSuffixMap; +// winIdSuffixMap.insert(winId, 1); +// AppWinidSuffixMap.insert(appName, winIdSuffixMap); +// return 1; +// } + +// QMap subMap = AppWinidSuffixMap.value(appName); +// QList suffixList = subMap.values(); + +// // suffix will never be 0 +// suffixList.removeAll(0); +// std::sort(suffixList.begin(), suffixList.end()); + +// // get the minimum of useable suffix +// int index = 0; +// for (; index < suffixList.size(); ++index) { +// if (suffixList.at(index) != index + 1) { +// break; +// } +// } +// suffix = index + 1; + +// subMap.insert(winId, suffix); +// AppWinidSuffixMap.insert(appName, subMap); + +// return suffix; +//} + +void XEmbedTrayItemWidget::setX11PassMouseEvent(const bool pass) +{ + if (IS_WAYLAND_DISPLAY) { + //会导致wayland下鼠标穿透到桌面,所以直接return掉 + return; + } + + if (pass) + { + XShapeCombineRectangles(QX11Info::display(), m_containerWid, ShapeBounding, 0, 0, nullptr, 0, ShapeSet, YXBanded); + XShapeCombineRectangles(QX11Info::display(), m_containerWid, ShapeInput, 0, 0, nullptr, 0, ShapeSet, YXBanded); + } + else + { + XRectangle rectangle; + rectangle.x = 0; + rectangle.y = 0; + rectangle.width = 1; + rectangle.height = 1; + + XShapeCombineRectangles(QX11Info::display(), m_containerWid, ShapeBounding, 0, 0, &rectangle, 1, ShapeSet, YXBanded); + XShapeCombineRectangles(QX11Info::display(), m_containerWid, ShapeInput, 0, 0, &rectangle, 1, ShapeSet, YXBanded); + } + + XFlush(QX11Info::display()); +} + +void XEmbedTrayItemWidget::setWindowOnTop(const bool top) +{ + auto c = IS_WAYLAND_DISPLAY ? m_xcbCnn : QX11Info::connection(); + if (!c) { + qWarning() << "QX11Info::connection() is " << c; + return; + } + const uint32_t stackAboveData[] = {top ? XCB_STACK_MODE_ABOVE : XCB_STACK_MODE_BELOW}; + xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackAboveData); + xcb_flush(c); +} + +bool XEmbedTrayItemWidget::isBadWindow() +{ + auto c = IS_WAYLAND_DISPLAY ? m_xcbCnn : QX11Info::connection(); + + auto cookie = xcb_get_geometry(c, m_windowId); + xcb_get_geometry_reply_t *clientGeom = xcb_get_geometry_reply(c, cookie, Q_NULLPTR); + bool result = clientGeom ? false : true; + + free(clientGeom); + + return result; +} + +uint XEmbedTrayItemWidget::getWindowPID(uint winId) +{ + const auto display = IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::connection() is " << display; + return 0; + } + + Atom nameAtom = XInternAtom(display, "_NET_WM_PID", 1); + Atom type; + int format, status; + + unsigned long nitems, after; + unsigned char *data; + unsigned int pid = 0; + + status = XGetWindowProperty(display, winId, nameAtom, 0, 1024, 0, + XInternAtom(display, "CARDINAL", 0), &type, &format, &nitems, &after, &data); + if (status == Success && data) { + pid = *((uint*)data); + XFree(data); + } + + if (IS_WAYLAND_DISPLAY) + XCloseDisplay(display); + + return pid; +} diff --git a/frame/window/tray/widgets/xembedtrayitemwidget.h b/frame/window/tray/widgets/xembedtrayitemwidget.h new file mode 100644 index 000000000..cf03ab10a --- /dev/null +++ b/frame/window/tray/widgets/xembedtrayitemwidget.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#ifndef XEMBEDTRAYWIDGET_H +#define XEMBEDTRAYWIDGET_H + +#include "basetraywidget.h" + +#include +#include + +#include + +typedef struct _XDisplay Display; + +class XEmbedTrayItemWidget : public BaseTrayWidget +{ + Q_OBJECT + +public: + explicit XEmbedTrayItemWidget(quint32 winId, xcb_connection_t *cnn = nullptr, Display *disp = nullptr, QWidget *parent = nullptr); + ~XEmbedTrayItemWidget() override; + + QString itemKeyForConfig() override; + void updateIcon() override; + void sendClick(uint8_t mouseButton, int x, int y) override; + + static QString getWindowProperty(quint32 winId, QString propName); + static QString toXEmbedKey(quint32 winId); + static uint getWindowPID(quint32 winId); + static bool isXEmbedKey(const QString &itemKey); + virtual bool isValid() override {return m_valid;} + QPixmap icon() override; + +private: + void showEvent(QShowEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void configContainerPosition(); + + void wrapWindow(); + void sendHoverEvent(); + void refershIconImage(); + + static QString getAppNameForWindow(quint32 winId); + +private slots: + void setX11PassMouseEvent(const bool pass); + void setWindowOnTop(const bool top); + bool isBadWindow(); + +private: + bool m_active = false; + WId m_windowId; + WId m_containerWid; + QImage m_image; + QString m_appName; + + QTimer *m_updateTimer; + QTimer *m_sendHoverEvent; + bool m_valid; + xcb_connection_t *m_xcbCnn; + Display* m_display; +}; + +#endif // XEMBEDTRAYWIDGET_H diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp new file mode 100644 index 000000000..a62579d8c --- /dev/null +++ b/frame/window/traymanagerwindow.cpp @@ -0,0 +1,381 @@ +#include "traymanagerwindow.h" +#include "quickpluginwindow.h" +#include "tray_gridview.h" +#include "tray_delegate.h" +#include "tray_model.h" +#include "constants.h" +#include "quicksettingcontainer.h" +#include "systempluginwindow.h" +#include "datetimedisplayer.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#define MAXFIXEDSIZE 999999 +#define CRITLCALHEIGHT 56 + +TrayManagerWindow::TrayManagerWindow(QWidget *parent) + : QWidget(parent) + , m_appPluginDatetimeWidget(new DBlurEffectWidget(this)) + , m_systemPluginWidget(new SystemPluginWindow(this)) + , m_appPluginWidget(new QWidget(m_appPluginDatetimeWidget)) + , m_quickIconWidget(new QuickPluginWindow(m_appPluginWidget)) + , m_dateTimeWidget(new DateTimeDisplayer(m_appPluginDatetimeWidget)) + , m_appPluginLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) + , m_appDatetimeLayout(new QBoxLayout(QBoxLayout::Direction::TopToBottom, this)) + , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) + , m_trayView(new TrayGridView(this)) + , m_model(new TrayModel(m_trayView, false, true)) + , m_postion(Dock::Position::Bottom) +{ + initUi(); + initConnection(); + + setAcceptDrops(true); + setMouseTracking(true); +} + +TrayManagerWindow::~TrayManagerWindow() +{ +} + +void TrayManagerWindow::setPositon(Dock::Position position) +{ + if (m_postion == position) + return; + + m_postion = position; + QModelIndex index = m_model->index(0, 0); + m_trayView->closePersistentEditor(index); + TrayDelegate *delegate = static_cast(m_trayView->itemDelegate()); + delegate->setPositon(position); + m_trayView->openPersistentEditor(index); + + m_quickIconWidget->setPositon(position); + m_dateTimeWidget->setPositon(position); + m_systemPluginWidget->setPositon(position); + + QTimer::singleShot(0, this, [ this ]{ + if (showSingleRow()) + resetSingleDirection(); + else + resetMultiDirection(); + + resetChildWidgetSize(); + }); +} + +int TrayManagerWindow::appDatetimeSize() +{ + int count = m_trayView->model()->rowCount(); + if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) { + QMargins m = m_appDatetimeLayout->contentsMargins(); + int trayWidth = count * ITEM_SIZE + m_trayView->spacing() * (count - 1) + 5; + int topWidth = trayWidth + m_quickIconWidget->suitableSize().width() + m.left() + m.right() + m_appPluginLayout->spacing(); + int spacing = m.left() + m.right() + m_appPluginLayout->spacing(); + if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) + return topWidth + m_appDatetimeLayout->spacing() + m_dateTimeWidget->suitableSize().width() + m_appDatetimeLayout->spacing() + 10; + + int bottomWidth = m_dateTimeWidget->suitableSize().width(); + return (topWidth > bottomWidth ? topWidth : bottomWidth) + m_appDatetimeLayout->spacing() + spacing + 10; + } + + int trayHeight = count * ITEM_SIZE + m_trayView->spacing() * (count - 1) + 5; + int datetimeHeight = m_dateTimeWidget->suitableSize().height(); + QMargins m = m_appDatetimeLayout->contentsMargins(); + int traypluginHeight = trayHeight + m_quickIconWidget->suitableSize().height() + m.top() + m.bottom() + m_appPluginLayout->spacing(); + if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::TopToBottom) + return traypluginHeight + m_appDatetimeLayout->spacing() + m_dateTimeWidget->suitableSize().height() + 10; + return (traypluginHeight > datetimeHeight ? traypluginHeight : datetimeHeight) + 10; +} + +QSize TrayManagerWindow::suitableSize() +{ + QMargins m = m_mainLayout->contentsMargins(); + if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) { + return QSize(appDatetimeSize() + m_appDatetimeLayout->spacing() + + m_systemPluginWidget->suitableSize().width() + m_mainLayout->spacing() + + m.left() + m.right(), height()); + } + + return QSize(width(), appDatetimeSize() + m_appDatetimeLayout->spacing() + + m_systemPluginWidget->suitableSize().height() + m_mainLayout->spacing() + + m.top() + m.bottom()); +} + +void TrayManagerWindow::resizeEvent(QResizeEvent *event) +{ + Q_UNUSED(event); + + if (showSingleRow()) + resetSingleDirection(); + else + resetMultiDirection(); + + resetChildWidgetSize(); +} + +void TrayManagerWindow::initUi() +{ + TrayDelegate *delegate = new TrayDelegate(m_trayView); + m_trayView->setModel(m_model); + m_trayView->setItemDelegate(delegate); + + WinInfo info; + info.type = TrayIconType::EXPANDICON; + m_model->addRow(info); + m_trayView->openPersistentEditor(m_model->index(0, 0)); + + // 左侧的区域,包括应用托盘插件和下方的日期时间区域 + m_appPluginDatetimeWidget->setBlurRectXRadius(10); + m_appPluginDatetimeWidget->setBlurRectYRadius(10); + m_appPluginDatetimeWidget->setMaskAlpha(uint8_t(0.1 * 255)); + m_appPluginDatetimeWidget->installEventFilter(this); + + m_appPluginLayout->setSpacing(0); + m_appPluginWidget->setLayout(m_appPluginLayout); + m_appPluginLayout->addWidget(m_trayView); + m_appPluginLayout->addWidget(m_quickIconWidget); + + m_appPluginDatetimeWidget->setLayout(m_appDatetimeLayout); + m_appDatetimeLayout->setContentsMargins(0, 0, 0, 0); + m_appDatetimeLayout->setSpacing(3); + m_appDatetimeLayout->addWidget(m_appPluginWidget); + m_appDatetimeLayout->addWidget(m_dateTimeWidget); + + m_systemPluginWidget->setBlurRectXRadius(10); + m_systemPluginWidget->setBlurRectYRadius(10); + m_systemPluginWidget->installEventFilter(this); + m_systemPluginWidget->setMaskAlpha(uint8_t(0.1 * 255)); + + setLayout(m_mainLayout); + m_mainLayout->setContentsMargins(8, 8, 8, 8); + m_mainLayout->setSpacing(10); + m_mainLayout->addWidget(m_appPluginDatetimeWidget); + m_mainLayout->addWidget(m_systemPluginWidget); +} + +void TrayManagerWindow::initConnection() +{ + connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); + connect(m_trayView, &TrayGridView::rowCountChanged, this, &TrayManagerWindow::sizeChanged); + connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, [ this ] { + m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) + m_quickIconWidget->setFixedWidth(m_quickIconWidget->suitableSize().width()); + else + m_quickIconWidget->setFixedHeight(m_quickIconWidget->suitableSize().height()); + + Q_EMIT sizeChanged(); + }); + + connect(m_systemPluginWidget, &SystemPluginWindow::pluginSizeChanged, this, [ this ] { + m_systemPluginWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) + m_systemPluginWidget->setFixedWidth(m_systemPluginWidget->suitableSize().width()); + else + m_systemPluginWidget->setFixedHeight(m_systemPluginWidget->suitableSize().height()); + + Q_EMIT sizeChanged(); + }); + + TrayDelegate *trayDelegate = static_cast(m_trayView->itemDelegate()); + connect(trayDelegate, &TrayDelegate::visibleChanged, this, [ this ](const QModelIndex &index, bool visible) { + m_trayView->setRowHidden(index.row(), !visible); + resetChildWidgetSize(); + Q_EMIT sizeChanged(); + }); + + connect(m_trayView, &TrayGridView::dragLeaved, trayDelegate, [ trayDelegate ]{ + Q_EMIT trayDelegate->requestDrag(true); + }); + connect(m_trayView, &TrayGridView::dragEntered, trayDelegate, [ trayDelegate ]{ + Q_EMIT trayDelegate->requestDrag(false); + }); + connect(m_model, &TrayModel::requestUpdateWidget, this, [ this ](const QList &idxs) { + for (int i = 0; i < idxs.size(); i++) { + int idx = idxs[i]; + if (idx < m_model->rowCount()) { + QModelIndex index = m_model->index(idx); + m_trayView->closePersistentEditor(index); + m_trayView->openPersistentEditor(index); + } + } + }); + + m_trayView->installEventFilter(this); + m_quickIconWidget->installEventFilter(this); + installEventFilter(this); + QMetaObject::invokeMethod(this, &TrayManagerWindow::resetChildWidgetSize, Qt::QueuedConnection); +} + +bool TrayManagerWindow::showSingleRow() +{ + if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) + return height() < CRITLCALHEIGHT; + + return true; +} + +void TrayManagerWindow::resetChildWidgetSize() +{ + int count = 0; + for (int i = 0; i < m_model->rowCount(); i++) { + if (!m_trayView->isRowHidden(i)) + count++; + } + + switch (m_postion) { + case Dock::Position::Top: + case Dock::Position::Bottom: { + int trayWidth = count * ITEM_SIZE + m_trayView->spacing() * (count - 1) + 5; + QMargins m = m_appPluginLayout->contentsMargins(); + m_appPluginDatetimeWidget->setFixedHeight(QWIDGETSIZE_MAX);// 取消固定高度显示 + if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) { + // 单行显示 + int trayHeight = m_appPluginDatetimeWidget->height() - m.top() - m.bottom(); + m_trayView->setFixedSize(trayWidth, trayHeight); + m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); + m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), trayHeight); + } else { + // 多行显示 + int trayHeight = m_appPluginDatetimeWidget->height() / 2 - m.top() - m.bottom(); + m_trayView->setFixedSize(trayWidth, trayHeight); + m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); + m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), m_appPluginDatetimeWidget->height() / 2); + } + m_appPluginDatetimeWidget->setFixedWidth(appDatetimeSize()); + break; + } + case Dock::Position::Left: + case Dock::Position::Right: { + int trayHeight = count * ITEM_SIZE + m_trayView->spacing() * (count - 1) + 5; + int quickAreaHeight = m_quickIconWidget->suitableSize().height(); + QMargins m = m_appPluginLayout->contentsMargins(); + m_appPluginDatetimeWidget->setFixedWidth(QWIDGETSIZE_MAX);// 取消固定宽度显示 + if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::TopToBottom) { + // 宽度较小的情况下,显示一列 + int datetimeHeight = m_dateTimeWidget->suitableSize().height(); + int sizeWidth = m_appPluginDatetimeWidget->width() - m.left() - m.right(); + m_trayView->setFixedSize(sizeWidth, trayHeight); + m_quickIconWidget->setFixedSize(sizeWidth, quickAreaHeight); + m_dateTimeWidget->setFixedSize(sizeWidth, datetimeHeight); + } else { + // 显示两列 + int trayWidth = m_appPluginDatetimeWidget->width() / 2 - m.left() - m.right(); + m_trayView->setFixedSize(trayWidth, trayHeight); + m_quickIconWidget->setFixedSize(trayWidth, quickAreaHeight); + m_dateTimeWidget->setFixedSize(m_appPluginDatetimeWidget->width() / 2, m_dateTimeWidget->suitableSize().height()); + } + m_appPluginDatetimeWidget->setFixedHeight(appDatetimeSize()); + break; + } + } +} + +void TrayManagerWindow::resetSingleDirection() +{ + switch (m_postion) { + case Dock::Position::Top: { + m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); + // 应用和时间在一行显示 + m_appDatetimeLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_appPluginLayout->setContentsMargins(2, 2, 2, 4); + break; + } + case Dock::Position::Bottom: { + m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_appDatetimeLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_appPluginLayout->setContentsMargins(2, 4, 2, 2); + break; + } + case Dock::Position::Left: { + m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_appPluginLayout->setContentsMargins(2, 2, 4, 2); + break; + } + case Dock::Position::Right: { + m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_appPluginLayout->setContentsMargins(4, 2, 2, 2); + break; + } + } +} + +void TrayManagerWindow::resetMultiDirection() +{ + switch (m_postion) { + case Dock::Position::Top: { + m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_appDatetimeLayout->setDirection(QBoxLayout::Direction::BottomToTop); + m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_appPluginLayout->setContentsMargins(2, 2, 2, 4); + break; + } + case Dock::Position::Bottom: { + m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_appPluginLayout->setContentsMargins(2, 4, 2, 2); + break; + } + case Dock::Position::Left: { + m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_appPluginLayout->setContentsMargins(2, 2, 4, 2); + break; + } + case Dock::Position::Right: { + m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_appPluginLayout->setContentsMargins(4, 2, 2, 2); + break; + } + } +} + +void TrayManagerWindow::dragEnterEvent(QDragEnterEvent *e) +{ + e->setDropAction(Qt::CopyAction); + e->accept(); +} + +void TrayManagerWindow::dragMoveEvent(QDragMoveEvent *e) +{ + e->setDropAction(Qt::CopyAction); + e->accept(); +} + +void TrayManagerWindow::dropEvent(QDropEvent *e) +{ + CustomMimeData *mimeData = const_cast(qobject_cast(e->mimeData())); + if (!mimeData) + return; + + if (e->source() == this) + return; + + QuickSettingItem *pluginItem = static_cast(mimeData->data()); + if (pluginItem) + m_quickIconWidget->addPlugin(pluginItem); +} + +void TrayManagerWindow::dragLeaveEvent(QDragLeaveEvent *event) +{ + event->accept(); +} diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h new file mode 100644 index 000000000..80da2deb6 --- /dev/null +++ b/frame/window/traymanagerwindow.h @@ -0,0 +1,72 @@ +#ifndef TRAYMANAGERWINDOW_H +#define TRAYMANAGERWINDOW_H + +#include "constants.h" + +#include + +#include + +namespace Dtk { namespace Gui { class DRegionMonitor; }; + namespace Widget { class DBlurEffectWidget; } } + +using namespace Dtk::Widget; + +using Timedate = com::deepin::daemon::Timedate; + +class QuickPluginWindow; +class QBoxLayout; +class TrayGridView; +class TrayModel; +class SystemPluginWindow; +class QLabel; +class QDropEvent; +class DateTimeDisplayer; + +class TrayManagerWindow : public QWidget +{ + Q_OBJECT + +Q_SIGNALS: + void sizeChanged(); + +public: + explicit TrayManagerWindow(QWidget *parent = nullptr); + ~TrayManagerWindow() override; + void setPositon(Dock::Position position); + QSize suitableSize(); + +protected: + void resizeEvent(QResizeEvent *event) override; + +private: + void initUi(); + void initConnection(); + + void resetChildWidgetSize(); + void resetMultiDirection(); + void resetSingleDirection(); + + void dragEnterEvent(QDragEnterEvent *e) override; + void dragMoveEvent(QDragMoveEvent *e) override; + void dropEvent(QDropEvent *e) override; + void dragLeaveEvent(QDragLeaveEvent *event) override; + + bool showSingleRow(); + int appDatetimeSize(); + +private: + DBlurEffectWidget *m_appPluginDatetimeWidget; + SystemPluginWindow *m_systemPluginWidget; + QWidget *m_appPluginWidget; + QuickPluginWindow *m_quickIconWidget; + DateTimeDisplayer *m_dateTimeWidget; + QBoxLayout *m_appPluginLayout; + QBoxLayout *m_appDatetimeLayout; + QBoxLayout *m_mainLayout; + TrayGridView *m_trayView; + TrayModel *m_model; + Dock::Position m_postion; +}; + +#endif // PLUGINWINDOW_H diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bda3e8ace..86b83aa63 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -54,10 +54,11 @@ find_package(Qt5 COMPONENTS Test REQUIRED) #find_package(DdeControlCenter REQUIRED) find_package(GTest REQUIRED) find_package(GMock REQUIRED) +find_package(dbusmenu-qt5 REQUIRED) pkg_check_modules(QGSettings REQUIRED gsettings-qt) pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) -pkg_check_modules(XCB_EWMH REQUIRED xcb-ewmh x11 xcursor) +pkg_check_modules(XCB_EWMH REQUIRED xcb-image xcb-composite xtst xcb-ewmh xext dbusmenu-qt5 x11 xcursor) # 添加执行文件信息 add_executable(${BIN_NAME} From 4e7b27a39529fc38cc0918ad93cd537326e4f80a Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 May 2022 16:24:54 +0800 Subject: [PATCH 007/257] =?UTF-8?q?feat:=20=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E7=89=B9=E6=95=88=E6=A8=A1=E5=BC=8F=E9=9B=86=E6=88=90=E6=89=98?= =?UTF-8?q?=E7=9B=98=E5=8C=BA=E5=9F=9F=E5=92=8C=E5=BF=AB=E6=8D=B7=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去掉原来的插件设置区域,将最新的托盘和快捷设置的功能集成进来 Log: 任务栏特效模式集成托盘区域和快捷设置的功能 Influence: v23任务栏特效模式 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I985f43d2da28464641fa159c8c6b5040c97e7a49 --- CMakeLists.txt | 2 +- frame/util/multiscreenworker.cpp | 42 +++-- frame/util/multiscreenworker.h | 3 +- frame/window/mainpanelcontrol.cpp | 289 ++++++++++++++++++++++-------- frame/window/mainpanelcontrol.h | 9 + frame/window/mainwindow.cpp | 9 +- 6 files changed, 261 insertions(+), 93 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 01f523d68..b46bbdc35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 1275a0659..43651ff9f 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -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(&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(m_dockInter->position()); @@ -974,6 +974,8 @@ void MultiScreenWorker::initDBus() m_displayMode = static_cast(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(screenRect.x() + margin)); - rect.setY(static_cast(screenRect.y() + margin)); - rect.setWidth(static_cast(screenRect.width() / ratio - 2 * margin)); + parent()->panel()->setScreenSize(static_cast(screenRect.width())); + + rect.setX((static_cast(screenRect.width() / ratio) - parent()->panel()->suitableSize(ratio).width()) / 2); + rect.setY(static_cast((screenRect.y() + margin) / ratio)); + rect.setWidth(parent()->panel()->suitableSize(ratio).width()); rect.setHeight(dockSize); break; case Position::Bottom: - rect.setX(static_cast(screenRect.x() + margin)); + // 先用设置屏幕尺寸,理论上不应该在此处设置,因为这是在一个get方法里面,后续改成直接获取,在其他地方设置 + parent()->panel()->setScreenSize(static_cast(screenRect.width())); + + rect.setX((static_cast(screenRect.width() / ratio) - parent()->panel()->suitableSize(ratio).width()) / 2); rect.setY(static_cast(screenRect.y() + screenRect.height() / ratio - margin - dockSize)); - rect.setWidth(static_cast(screenRect.width() / ratio - 2 * margin)); + rect.setWidth(parent()->panel()->suitableSize(ratio).width()); rect.setHeight(dockSize); break; case Position::Left: + parent()->panel()->setScreenSize(static_cast(screenRect.height())); + rect.setX(static_cast(screenRect.x() + margin)); - rect.setY(static_cast(screenRect.y() + margin)); + rect.setY((static_cast(screenRect.height() / ratio) - parent()->panel()->suitableSize(ratio).height()) / 2); rect.setWidth(dockSize); - rect.setHeight(static_cast(screenRect.height() / ratio - 2 * margin)); + rect.setHeight(parent()->panel()->suitableSize(ratio).height()); break; case Position::Right: + parent()->panel()->setScreenSize(static_cast(screenRect.height())); + rect.setX(static_cast(screenRect.x() + screenRect.width() / ratio - margin - dockSize)); - rect.setY(static_cast(screenRect.y() + margin)); + rect.setY((static_cast(screenRect.height() / ratio) - parent()->panel()->suitableSize(ratio).height()) / 2); rect.setWidth(dockSize); - rect.setHeight(static_cast(screenRect.height() / ratio - 2 * margin)); + rect.setHeight(parent()->panel()->suitableSize(ratio).height()); break; } } diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index 84f7b0523..abebf10b4 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -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(); diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index eb7b4fd71..ed77791d6 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -31,6 +31,7 @@ #include "utils.h" #include "desktop_widget.h" #include "imageutil.h" +#include "traymanagerwindow.h" #include #include @@ -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(m_screenSize / ratio), height()); + + return QSize(width(), static_cast(m_screenSize / ratio)); + } + + // 如果是特效模式 + int totalLength = static_cast(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((m_trayManagerWidget->width() + 20) / ratio)), height()); + + return QSize(width(), static_cast((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((m_fixedSpliter->width() + m_trayManagerWidget->width() + 20) / ratio), + static_cast(height() / ratio)); + } + + iconSize = iconSize < width() ? iconSize : width(); + + return QSize(width(), iconSize * iconCount + static_cast((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(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(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(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); diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 288e4b74a..8e420f252 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -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; // 垃圾箱插件(需要特殊处理一下) }; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index d19e48b1c..ac6a9a91c 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -315,6 +315,7 @@ void MainWindow::initConnections() connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); connect(&m_platformWindowHandle, &DPlatformWindowHandle::frameMarginsChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); connect(&m_platformWindowHandle, &DPlatformWindowHandle::windowRadiusChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); + connect(m_mainPanel, &MainPanelControl::sizeChanged, m_shadowMaskOptimizeTimer, static_cast(&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()); From 6d209d8ddb87d0a42a260a44b337b8c67ea3c482 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 17 May 2022 20:57:09 +0800 Subject: [PATCH 008/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8Fbug=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.增加license 2.修复bug 3.UI调整 Log: 优化任务栏代码 Influence: v23任务栏 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: Ic66428699f6060d8b0baefa3dbc2d3603d320242 --- frame/controller/quicksettingcontroller.cpp | 24 +- frame/controller/quicksettingcontroller.h | 26 +- frame/item/pluginsitem.cpp | 5 + frame/item/quicksettingitem.cpp | 22 +- frame/item/quicksettingitem.h | 20 + frame/model/brightnessmodel.cpp | 47 +- frame/model/brightnessmodel.h | 16 +- frame/model/mediaplayermodel.h | 10 +- frame/model/volumemodel.cpp | 313 +++---------- frame/model/volumemodel.h | 54 +-- frame/util/abstractpluginscontroller.cpp | 11 + frame/util/abstractpluginscontroller.h | 3 + .../components/brightnessmonitorwidget.cpp | 42 +- .../components/brightnessmonitorwidget.h | 20 + frame/window/components/brightnesswidget.cpp | 37 +- frame/window/components/brightnesswidget.h | 22 +- frame/window/components/datetimedisplayer.cpp | 164 ++++--- frame/window/components/datetimedisplayer.h | 52 ++- frame/window/components/mediawidget.cpp | 20 + frame/window/components/mediawidget.h | 20 + frame/window/components/settingdelegate.cpp | 20 + frame/window/components/settingdelegate.h | 26 +- .../window/components/volumedeviceswidget.cpp | 30 +- frame/window/components/volumedeviceswidget.h | 20 + frame/window/components/volumewidget.cpp | 20 + frame/window/components/volumewidget.h | 20 + frame/window/mainpanelcontrol.cpp | 4 +- frame/window/pluginchildpage.cpp | 116 +++++ frame/window/pluginchildpage.h | 61 +++ frame/window/quickpluginwindow.cpp | 411 +++++++++--------- frame/window/quickpluginwindow.h | 47 +- frame/window/quicksettingcontainer.cpp | 240 +++++----- frame/window/quicksettingcontainer.h | 72 ++- frame/window/systempluginwindow.cpp | 34 +- frame/window/systempluginwindow.h | 30 +- frame/window/tray/tray_delegate.cpp | 125 +++++- frame/window/tray/tray_delegate.h | 19 +- frame/window/tray/tray_gridview.cpp | 163 ++++++- frame/window/tray/tray_gridview.h | 28 +- frame/window/tray/tray_model.cpp | 74 +++- frame/window/tray/tray_model.h | 45 +- frame/window/tray/tray_monitor.cpp | 20 + frame/window/tray/tray_monitor.h | 32 +- frame/window/tray/widgets/basetraywidget.cpp | 9 +- frame/window/tray/widgets/basetraywidget.h | 7 +- .../window/tray/widgets/expandiconwidget.cpp | 190 +++++--- frame/window/tray/widgets/expandiconwidget.h | 59 ++- frame/window/tray/widgets/indicatorplugin.cpp | 43 +- frame/window/tray/widgets/indicatorplugin.h | 20 + .../window/tray/widgets/indicatortrayitem.cpp | 146 +------ frame/window/tray/widgets/indicatortrayitem.h | 17 +- frame/window/traymanagerwindow.cpp | 165 ++++--- frame/window/traymanagerwindow.h | 23 + 53 files changed, 2077 insertions(+), 1187 deletions(-) create mode 100644 frame/window/pluginchildpage.cpp create mode 100644 frame/window/pluginchildpage.h diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index dfb444423..71150e1fa 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "quicksettingcontroller.h" #include "quicksettingitem.h" @@ -26,7 +46,7 @@ void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, c m_quickSettingItems << quickItem; - emit pluginInsert(quickItem); + emit pluginInserted(quickItem); } void QuickSettingController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) @@ -51,7 +71,7 @@ void QuickSettingController::itemRemoved(PluginsItemInterface * const itemInter, if (findItemIterator != m_quickSettingItems.end()) { QuickSettingItem *quickItem = *findItemIterator; m_quickSettingItems.removeOne(quickItem); - Q_EMIT pluginRemove(quickItem); + Q_EMIT pluginRemoved(quickItem); quickItem->deleteLater(); } } diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index aaafa91cc..10bc312b1 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef QUICKSETTINGCONTROLLER_H #define QUICKSETTINGCONTROLLER_H @@ -14,12 +34,12 @@ public: const QList &settingItems() const { return m_quickSettingItems; } Q_SIGNALS: - void pluginInsert(QuickSettingItem *); - void pluginRemove(QuickSettingItem *); + void pluginInserted(QuickSettingItem *); + void pluginRemoved(QuickSettingItem *); protected: void startLoader(); - QuickSettingController(QObject *parent = Q_NULLPTR); + explicit QuickSettingController(QObject *parent = Q_NULLPTR); ~QuickSettingController() override; protected: diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index 9ff61e1f9..43ec245b3 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -24,6 +24,8 @@ #include "pluginsiteminterface.h" #include "utils.h" +#include + #include #include #include @@ -328,10 +330,13 @@ StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter, : PluginsItem (pluginInter, itemKey, plginApi, parent) , m_nameLabel(new QLabel(this)) { + m_nameLabel->setFont(DFontSizeManager::instance()->t10()); m_nameLabel->setText(pluginInter->pluginDisplayName()); m_nameLabel->setAlignment(Qt::AlignCenter); QBoxLayout *mainLayout = static_cast(layout()); + mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + mainLayout->addSpacing(10); mainLayout->addWidget(m_nameLabel); } diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 0d2da9967..7cf401bb5 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -1,4 +1,24 @@ -#include "quicksettingitem.h" +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "quicksettingitem.h" #include "pluginsiteminterface.h" #include diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 185000415..1d1eb47c4 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef QUICKSETTINGITEM_H #define QUICKSETTINGITEM_H diff --git a/frame/model/brightnessmodel.cpp b/frame/model/brightnessmodel.cpp index 8bc884c42..33efb327d 100644 --- a/frame/model/brightnessmodel.cpp +++ b/frame/model/brightnessmodel.cpp @@ -43,10 +43,11 @@ BrightnessModel::BrightnessModel(QObject *parent) QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); if (dbusInter.isValid()) { // 读取所有的屏幕的信息 - QString primaryScreenName = qApp->primaryScreen() ? qApp->primaryScreen()->name() : QString(); + QString primaryScreenName = dbusInter.property("Primary").value(); QList paths = dbusInter.property("Monitors").value>(); for (QDBusObjectPath path : paths) { BrightMonitor *monitor = new BrightMonitor(path.path(), this); + monitor->setPrimary(primaryScreenName == monitor->name()); m_monitor << monitor; connect(monitor, &BrightMonitor::brightnessChanged, this, [ = ] { Q_EMIT brightnessChanged(monitor); @@ -54,8 +55,7 @@ BrightnessModel::BrightnessModel(QObject *parent) } } - QDBusConnection::sessionBus().connect(serviceName, servicePath, propertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); + connect(qApp, &QApplication::primaryScreenChanged, this, &BrightnessModel::primaryScreenChanged); } BrightnessModel::~BrightnessModel() @@ -67,6 +67,16 @@ QList BrightnessModel::monitors() return m_monitor; } +BrightMonitor *BrightnessModel::primaryMonitor() const +{ + for (BrightMonitor *monitor : m_monitor) { + if (monitor->isPrimary()) + return monitor; + } + + return nullptr; +} + void BrightnessModel::setBrightness(BrightMonitor *monitor, int brightness) { setBrightness(monitor->name(), brightness); @@ -88,19 +98,17 @@ QDBusMessage BrightnessModel::callMethod(const QString &methodName, const QList< return QDBusMessage(); } -void BrightnessModel::onPropertyChanged(const QDBusMessage &msg) +void BrightnessModel::primaryScreenChanged(QScreen *screen) { - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != serviceInterface) - return; - - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - if (changedProps.contains("Brightness")) { + BrightMonitor *defaultMonitor = nullptr; + for (BrightMonitor *monitor : m_monitor) { + monitor->setPrimary(monitor->name() == screen->name()); + if (monitor->isPrimary()) + defaultMonitor = monitor; } + + if (defaultMonitor) + Q_EMIT primaryChanged(defaultMonitor); } /** @@ -111,6 +119,7 @@ BrightMonitor::BrightMonitor(QString path, QObject *parent) , m_path(path) , m_brightness(100) , m_enabled(false) + , m_isPrimary(false) { QDBusInterface dbusInter(serviceName, path, serviceInterface + QString(".Monitor"), QDBusConnection::sessionBus()); if (dbusInter.isValid()) { @@ -128,6 +137,11 @@ BrightMonitor::~BrightMonitor() { } +void BrightMonitor::setPrimary(bool primary) +{ + m_isPrimary = primary; +} + int BrightMonitor::brihtness() { return m_brightness; @@ -143,6 +157,11 @@ QString BrightMonitor::name() return m_name; } +bool BrightMonitor::isPrimary() +{ + return m_isPrimary; +} + void BrightMonitor::onPropertyChanged(const QDBusMessage &msg) { QList arguments = msg.arguments(); diff --git a/frame/model/brightnessmodel.h b/frame/model/brightnessmodel.h index b220c67f2..e22549cd9 100644 --- a/frame/model/brightnessmodel.h +++ b/frame/model/brightnessmodel.h @@ -26,27 +26,30 @@ class BrightMonitor; class QDBusMessage; +class QScreen; class BrightnessModel : public QObject { Q_OBJECT -Q_SIGNALS: - void brightnessChanged(BrightMonitor *); - public: explicit BrightnessModel(QObject *parent = nullptr); ~BrightnessModel(); QList monitors(); + BrightMonitor *primaryMonitor() const; void setBrightness(BrightMonitor *monitor, int brightness); void setBrightness(QString name, int brightness); +Q_SIGNALS: + void brightnessChanged(BrightMonitor *); + void primaryChanged(BrightMonitor *); + protected: QDBusMessage callMethod(const QString &methodName, const QList &argument); protected Q_SLOTS: - void onPropertyChanged(const QDBusMessage &msg); + void primaryScreenChanged(QScreen *screen); private: QList m_monitor; @@ -67,12 +70,14 @@ public: int brihtness(); bool enabled(); QString name(); - //bool isDefault(); + bool isPrimary(); protected: explicit BrightMonitor(QString path, QObject *parent); ~BrightMonitor(); + void setPrimary(bool primary); + protected Q_SLOTS: void onPropertyChanged(const QDBusMessage &msg); @@ -81,6 +86,7 @@ private: QString m_name; int m_brightness; bool m_enabled; + bool m_isPrimary; }; #endif // DISPLAYMODEL_H diff --git a/frame/model/mediaplayermodel.h b/frame/model/mediaplayermodel.h index 9dff56df8..880ea2270 100644 --- a/frame/model/mediaplayermodel.h +++ b/frame/model/mediaplayermodel.h @@ -24,11 +24,6 @@ public: Stop }; -Q_SIGNALS: - void startStop(bool); - void statusChanged(const PlayStatus &); - void metadataChanged(); - public: static MediaPlayerModel *instance(); bool isActived(); @@ -45,6 +40,11 @@ public: void setStatus(const PlayStatus &stat); void playNext(); +Q_SIGNALS: + void startStop(bool); + void statusChanged(const PlayStatus &); + void metadataChanged(); + protected: explicit MediaPlayerModel(QObject *parent = nullptr); ~MediaPlayerModel(); diff --git a/frame/model/volumemodel.cpp b/frame/model/volumemodel.cpp index 15920020e..45f2b2074 100644 --- a/frame/model/volumemodel.cpp +++ b/frame/model/volumemodel.cpp @@ -1,17 +1,10 @@ #include "volumemodel.h" -#include -#include -#include -#include -#include -#include #include #include #include #include #include -#include /** * @brief 声音控制的类 @@ -20,13 +13,14 @@ static const QString serviceName = QString("com.deepin.daemon.Audio"); static const QString servicePath = QString("/com/deepin/daemon/Audio"); -static const QString interfaceName = QString("com.deepin.daemon.Audio"); -static const QString propertiesInterface = QString("org.freedesktop.DBus.Properties"); VolumeModel::VolumeModel(QObject *parent) : QObject(parent) + , m_audio(new DBusAudio(serviceName, servicePath, QDBusConnection::sessionBus(), this)) { - initService(); + reloadSinks(); + reloadPorts(); + connect(m_audio, &DBusAudio::DefaultSinkChanged, this, &VolumeModel::onDefaultSinkChanged); } VolumeModel::~VolumeModel() @@ -37,7 +31,7 @@ VolumeModel::~VolumeModel() void VolumeModel::setActivePort(AudioPorts *port) { - callMethod("SetPort", { port->cardId(), port->name(), port->direction() }); + m_audio->SetPort(port->cardId(), port->name(), port->direction()); } QList VolumeModel::sinks() const @@ -110,62 +104,14 @@ bool VolumeModel::existActiveOutputDevice() return false; } -void VolumeModel::onPropertyChanged(const QDBusMessage &msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - - QString interName = msg.arguments().at(0).toString(); - if (interName != interfaceName) - return; - - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - if (changedProps.contains("DefaultSink")) { - QVariant defaultSink = changedProps.value("DefaultSink"); - QString defaultSinkPath = defaultSink.value().path(); - for (AudioSink *audioSink : m_sinks) { - if (audioSink->m_devicePath == defaultSinkPath) { - updateDefaultSink(audioSink); - Q_EMIT defaultSinkChanged(audioSink); - break; - } - } - } -} - -void VolumeModel::initService() -{ - QDBusConnection::sessionBus().connect(serviceName, servicePath, propertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); - - reloadSinks(); - reloadPorts(); - - QDBusConnectionInterface *dbusInterface = QDBusConnection::sessionBus().interface(); - connect(dbusInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, - [ = ](const QString &name, const QString &, const QString &newOwner) { - if (name == serviceName) { - if (newOwner.isEmpty()) { - QDBusConnection::sessionBus().disconnect(serviceName, servicePath, propertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); - clearSinks(); - } else { - QDBusConnection::sessionBus().connect(serviceName, servicePath, propertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); - reloadSinks(); - reloadPorts(); - } - } - }); -} - void VolumeModel::reloadSinks() { clearSinks(); - QList sinkPaths = properties>("Sinks"); + const QString defaultSinkPath = m_audio->defaultSink().path(); + QList sinkPaths = m_audio->sinks(); for (const QDBusObjectPath &sinkPath : sinkPaths) { - AudioSink *sink = new AudioSink(sinkPath.path(), this); + const QString path = sinkPath.path(); + AudioSink *sink = new AudioSink(path, (path == defaultSinkPath), this); connect(sink, &AudioSink::volumeChanged, this, [ = ](int volume) { if (sink->isDefault()) Q_EMIT volumeChanged(volume); @@ -182,13 +128,13 @@ void VolumeModel::reloadSinks() void VolumeModel::reloadPorts() { clearPorts(); - QString cards = properties("CardsWithoutUnavailable"); + QString cards = m_audio->cardsWithoutUnavailable(); QJsonParseError error; QJsonDocument json = QJsonDocument::fromJson(cards.toLocal8Bit(), &error); if (error.error != QJsonParseError::NoError) return; - int sinkCardId = -1; + uint sinkCardId = 0; QString sinkCardName; AudioSink *sink = defaultSink(); if (sink) { @@ -199,7 +145,7 @@ void VolumeModel::reloadPorts() QJsonArray array = json.array(); for (const QJsonValue value : array) { QJsonObject cardObject = value.toObject(); - int cardId = cardObject.value("Id").toInt(); + uint cardId = static_cast(cardObject.value("Id").toInt()); QString cardName = cardObject.value("Name").toString(); QJsonArray jPorts = cardObject.value("Ports").toArray(); for (const QJsonValue jPortValue : jPorts) { @@ -223,8 +169,19 @@ void VolumeModel::reloadPorts() } } -void VolumeModel::updateDefaultSink(AudioSink *audioSink) +void VolumeModel::onDefaultSinkChanged(const QDBusObjectPath &value) { + AudioSink *audioSink = nullptr; + const QString defaultPath = value.path(); + for (AudioSink *sink : m_sinks) { + sink->setDefault(defaultPath == sink->m_devicePath); + if (sink->isDefault()) + audioSink = sink; + } + + if (!audioSink) + return; + bool checkChanged = false; for (AudioPorts *port : m_ports) { bool oldChecked = port->isChecked(); @@ -237,6 +194,8 @@ void VolumeModel::updateDefaultSink(AudioSink *audioSink) if (checkChanged) Q_EMIT checkPortChanged(); + + Q_EMIT defaultSinkChanged(audioSink); } void VolumeModel::clearSinks() @@ -255,56 +214,35 @@ void VolumeModel::clearPorts() m_ports.clear(); } -QDBusMessage VolumeModel::callMethod(const QString &methodName, const QList &argument) -{ - QDBusInterface dbusInter(serviceName, servicePath, interfaceName, QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); - reply.waitForFinished(); - return reply.reply(); - } - return QDBusMessage(); -} - -template -T VolumeModel::properties(const QString &propName) -{ - QDBusInterface dbusInter(serviceName, servicePath, interfaceName, QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - QByteArray ba = propName.toLatin1(); - const char *prop = ba.data(); - return dbusInter.property(prop).value(); - } - - return T(); -} - /** * @brief 具体的声音设备 * @param parent */ -AudioSink::AudioSink(QString path, QObject *parent) +AudioSink::AudioSink(QString path, bool isDefault, QObject *parent) : QObject(parent) , m_devicePath(path) + , m_sink(new DBusSink(serviceName, path, QDBusConnection::sessionBus(), this)) + , m_isDefault(isDefault) { - QDBusConnection::sessionBus().connect(serviceName, path, propertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage&))); + connect(m_sink, &DBusSink::MuteChanged, this, &AudioSink::muteChanged); + connect(m_sink, &DBusSink::VolumeChanged, this, [ this ](double value) { + Q_EMIT this->volumeChanged(static_cast(value * 100)); + }); } AudioSink::~AudioSink() { } +void AudioSink::setDefault(bool isDefaultSink) +{ + m_isDefault = isDefaultSink; +} + bool AudioSink::isDefault() { - QDBusInterface dbusInter(serviceName, servicePath, interfaceName, QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - QString defaultSink = dbusInter.property("DefaultSink").value().path(); - return defaultSink == m_devicePath; - } - - return false; + return m_isDefault; } bool AudioSink::isHeadPhone() @@ -314,216 +252,83 @@ bool AudioSink::isHeadPhone() void AudioSink::setBalance(double value, bool isPlay) { - callMethod("SetBalance", { value, isPlay }); + m_sink->SetBalance(value, isPlay); } void AudioSink::setFade(double value) { - callMethod("SetFade", { value }); + m_sink->SetFade(value); } void AudioSink::setMute(bool mute) { - callMethod("SetMute", { mute }); + m_sink->SetMute(mute); } void AudioSink::setPort(QString name) { - callMethod("SetPort", { name }); + m_sink->SetPort(name); } -void AudioSink::setVolume(double value, bool isPlay) +void AudioSink::setVolume(int value, bool isPlay) { - callMethod("SetVolume", { value * 0.01, isPlay }); + m_sink->SetVolume((value * 0.01), isPlay); } bool AudioSink::isMute() { - return getProperties("Mute"); + return m_sink->mute(); } bool AudioSink::supportBalance() { - return getProperties("SupportBalance"); + return m_sink->supportBalance(); } bool AudioSink::suoportFade() { - return getProperties("SupportFade"); + return m_sink->supportFade(); } double AudioSink::balance() { - return getProperties("Balance"); + return m_sink->balance(); } double AudioSink::baseVolume() { - return getProperties("BaseVolume"); + return m_sink->baseVolume(); } double AudioSink::fade() { - return getProperties("Fade"); + return m_sink->fade(); } int AudioSink::volume() { - return static_cast(getProperties("Volume") * 100); + return static_cast(m_sink->volume() * 100); } QString AudioSink::description() { - QVariantList value = getPropertiesByFreeDesktop("ActivePort"); - if (value.size() >= 2) - return value[1].toString(); - - return getProperties("Description"); + return m_sink->activePort().description; } QString AudioSink::name() { - QVariantList value = getPropertiesByFreeDesktop("ActivePort"); - if (value.size() >= 2) - return value[0].toString(); - - return getProperties("Name"); + return m_sink->activePort().name; } -int AudioSink::cardId() +uint AudioSink::cardId() { - return getProperties("Card"); + return m_sink->card(); } -void AudioSink::onPropertyChanged(const QDBusMessage &msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != propertiesInterface) - return; - - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - if (changedProps.contains("Volume")) - Q_EMIT volumeChanged(static_cast(changedProps.value("Volume").toDouble() * 100)); - - if (changedProps.contains("Mute")) - Q_EMIT muteChanged(changedProps.value("Mute").toBool()); -} - -template -T AudioSink::getProperties(const QString &propName) -{ - QDBusInterface dbusInter(serviceName, m_devicePath, interfaceName + QString(".Sink"), QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - QByteArray ba = propName.toLatin1(); - const char *prop = ba.data(); - return dbusInter.property(prop).value(); - } - - return T(); -} - -QDBusMessage AudioSink::callMethod(const QString &methodName, const QList &argument) -{ - QDBusInterface dbusInter(serviceName, m_devicePath, interfaceName + QString(".Sink"), QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); - reply.waitForFinished(); - return reply.reply(); - } - - return QDBusMessage(); -} - -static QVariantList argToString(const QDBusArgument &busArg) -{ - QVariantList out; - QString busSig = busArg.currentSignature(); - bool doIterate = false; - QDBusArgument::ElementType elementType = busArg.currentType(); - - switch (elementType) { - case QDBusArgument::BasicType: - case QDBusArgument::VariantType: { - QVariant value = busArg.asVariant(); - switch (value.type()) { - case QVariant::Bool: - out << value.toBool(); - break; - case QVariant::Int: - out << value.toInt(); - break; - case QVariant::String: - out << value.toString(); - break; - case QVariant::UInt: - out << value.toUInt(); - break; - case QVariant::ULongLong: - out << value.toULongLong(); - break; - case QMetaType::UChar: - out << value.toUInt(); - break; - default: - out << QVariant(); - break; - } - out += busArg.asVariant().toString(); - break; - } - case QDBusArgument::StructureType: - busArg.beginStructure(); - doIterate = true; - break; - case QDBusArgument::ArrayType: - busArg.beginArray(); - doIterate = true; - break; - case QDBusArgument::MapType: - busArg.beginMap(); - doIterate = true; - break; - case QDBusArgument::UnknownType: - default: - out << QVariant(); - return out; - } - - if (doIterate && !busArg.atEnd()) { - while (!busArg.atEnd()) { - out << argToString(busArg); - if (out.isEmpty()) - break; - } - } - - return out; -} - -QVariantList AudioSink::getPropertiesByFreeDesktop(const QString &propName) -{ - QDBusInterface dbusInter(serviceName, m_devicePath, "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList("Get", { interfaceName + ".Sink", propName }); - reply.waitForFinished(); - QVariantList lists = reply.reply().arguments(); - for (QVariantList::ConstIterator it = lists.begin(); it != lists.end(); ++it) { - QVariant arg = (*it); - const QVariant v = qvariant_cast(arg).variant(); - return argToString(v.value()); - } - } - - return QVariantList(); -} - -AudioPorts::AudioPorts(int cardId, QString cardName) +AudioPorts::AudioPorts(uint cardId, QString cardName) : m_cardId(cardId) , m_cardName(cardName) + , m_direction(0) , m_isCheck(false) , m_isHeadPhone(false) { @@ -533,7 +338,7 @@ AudioPorts::~AudioPorts() { } -int AudioPorts::cardId() const +uint AudioPorts::cardId() const { return m_cardId; } diff --git a/frame/model/volumemodel.h b/frame/model/volumemodel.h index e698c59fc..8903cea23 100644 --- a/frame/model/volumemodel.h +++ b/frame/model/volumemodel.h @@ -3,6 +3,12 @@ #include +#include +#include + +using DBusAudio = com::deepin::daemon::Audio; +using DBusSink = com::deepin::daemon::audio::Sink; + class QDBusMessage; class AudioSink; class AudioPorts; @@ -11,12 +17,6 @@ class VolumeModel : public QObject { Q_OBJECT -Q_SIGNALS: - void defaultSinkChanged(AudioSink *); - void volumeChanged(int); - void muteChanged(bool); - void checkPortChanged(); - public: explicit VolumeModel(QObject *parent); ~VolumeModel(); @@ -35,25 +35,26 @@ public: bool isMute(); bool existActiveOutputDevice(); +Q_SIGNALS: + void defaultSinkChanged(AudioSink *); + void volumeChanged(int); + void muteChanged(bool); + void checkPortChanged(); + private Q_SLOTS: - void onPropertyChanged(const QDBusMessage& msg); + void onDefaultSinkChanged(const QDBusObjectPath & value); private: - void initService(); void reloadSinks(); void reloadPorts(); void clearSinks(); void clearPorts(); - void updateDefaultSink(AudioSink *audioSink); - -private: - QDBusMessage callMethod(const QString &methodName, const QList &argument); - template - T properties(const QString &propName); private: QList m_sinks; QList m_ports; + + DBusAudio *m_audio; }; class AudioSink : public QObject @@ -74,7 +75,7 @@ public: void setFade(double value); void setMute(bool mute); void setPort(QString name); - void setVolume(double value, bool isPlay); + void setVolume(int value, bool isPlay); bool isMute(); bool supportBalance(); @@ -85,24 +86,17 @@ public: int volume(); QString description(); QString name(); - int cardId(); - -private Q_SLOTS: - void onPropertyChanged(const QDBusMessage& msg); + uint cardId(); protected: - explicit AudioSink(QString path, QObject *parent = nullptr); + explicit AudioSink(QString path, bool isDefault, QObject *parent = nullptr); ~AudioSink(); - -private: - QDBusMessage callMethod(const QString &methodName, const QList &argument); - template - T getProperties(const QString &propName); - - QList getPropertiesByFreeDesktop(const QString &propName); + void setDefault(bool isDefaultSink); private: QString m_devicePath; + DBusSink *m_sink; + bool m_isDefault; }; class AudioPorts : public QObject @@ -112,7 +106,7 @@ class AudioPorts : public QObject friend class VolumeModel; public: - int cardId() const; + uint cardId() const; QString cardName() const; QString name() const; QString description() const; @@ -121,7 +115,7 @@ public: bool isHeadPhone() const; protected: - AudioPorts(int cardId, QString cardName); + AudioPorts(uint cardId, QString cardName); ~AudioPorts(); void setName(const QString &name); void setDescription(const QString &desc); @@ -129,7 +123,7 @@ protected: void setIsChecked(bool isChecked); private: - int m_cardId; + uint m_cardId; QString m_cardName; QString m_portName; QString m_description; diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index f8b719ef7..c406a2c4d 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -234,6 +234,17 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) return; } + if (!needLoad(interface)) { + // 对于一些固定的插件是不需要加载的,例如在特效模式下,只需要加载电源插件,其他的是无需加载的 + for (const QPair &pair : m_pluginLoadMap.keys()) { + if (pair.first == pluginFile) + m_pluginLoadMap.remove(pair); + } + pluginLoader->unload(); + pluginLoader->deleteLater(); + return; + } + if (interface->pluginName() == "multitasking") { if (Utils::IS_WAYLAND_DISPLAY || Dtk::Core::DSysInfo::deepinType() == Dtk::Core::DSysInfo::DeepinServer) { for (auto &pair : m_pluginLoadMap.keys()) { diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index 66e8cd9c8..80e39a745 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -51,6 +51,9 @@ public: signals: void pluginLoaderFinished(); +protected: + virtual bool needLoad(PluginsItemInterface *) { return true; } + protected: QMap> &pluginsMap(); QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; diff --git a/frame/window/components/brightnessmonitorwidget.cpp b/frame/window/components/brightnessmonitorwidget.cpp index ee0358876..ac707795a 100644 --- a/frame/window/components/brightnessmonitorwidget.cpp +++ b/frame/window/components/brightnessmonitorwidget.cpp @@ -1,9 +1,30 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "brightnessmonitorwidget.h" #include "brightnessmodel.h" #include "customslider.h" #include "settingdelegate.h" #include +#include #include #include @@ -21,7 +42,7 @@ BrightnessMonitorWidget::BrightnessMonitorWidget(BrightnessModel *model, QWidget : QWidget(parent) , m_sliderWidget(new QWidget(this)) , m_sliderLayout(new QVBoxLayout(m_sliderWidget)) - , m_descriptionLabel(new QLabel(tr("Output Device"), this)) + , m_descriptionLabel(new QLabel(tr("Collaboration"), this)) , m_deviceList(new DListView(this)) , m_brightModel(model) , m_model(new QStandardItemModel(this)) @@ -92,15 +113,17 @@ void BrightnessMonitorWidget::initConnection() // 更新滚动条的内容 onBrightChanged(monitor); } else { - QDBusInterface controlcenter("com.deepin.dde.ControlCenter", "/com/deepin/dde/ControlCenter", - "com.deepin.dde.ControlCenter", QDBusConnection::sessionBus()); - controlcenter.call("ShowModule", "display"); + DDBusSender().service("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .method("ShowModule").arg(QString("display")).call(); hide(); } }); for (QPair container : m_sliderContainers) { SliderContainer *slider = container.second; + slider->slider()->setValue(container.first->brihtness()); connect(slider->slider(), &CustomSlider::valueChanged, this, [ = ](int value) { m_brightModel->setBrightness(container.first, value); }); @@ -112,16 +135,7 @@ void BrightnessMonitorWidget::initConnection() void BrightnessMonitorWidget::reloadMonitor() { m_model->clear(); - QList monitots = m_brightModel->monitors(); - for (BrightMonitor *monitor : monitots) { - DStandardItem *item = new DStandardItem; - item->setIcon(QIcon(":/icons/resources/laptop.svg")); - item->setText(monitor->name()); - item->setFlags(Qt::NoItemFlags); - item->setData(QVariant::fromValue(monitor), itemDataRole); - m_model->appendRow(item); - onBrightChanged(monitor); - } + // 跨端协同列表,后续会新增该功能 // 显示设置 DStandardItem *settingItem = new DStandardItem; settingItem->setIcon(QIcon("")); diff --git a/frame/window/components/brightnessmonitorwidget.h b/frame/window/components/brightnessmonitorwidget.h index d63c131eb..6e1c7d92b 100644 --- a/frame/window/components/brightnessmonitorwidget.h +++ b/frame/window/components/brightnessmonitorwidget.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef BRIGHTNESSMONITORWIDGET_H #define BRIGHTNESSMONITORWIDGET_H diff --git a/frame/window/components/brightnesswidget.cpp b/frame/window/components/brightnesswidget.cpp index 978f9d962..8275657a2 100644 --- a/frame/window/components/brightnesswidget.cpp +++ b/frame/window/components/brightnesswidget.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "brightnesswidget.h" #include "customslider.h" #include "brightnessmodel.h" @@ -13,7 +33,6 @@ BrightnessWidget::BrightnessWidget(QWidget *parent) { initUi(); initConenction(); - onUpdateBright(); } BrightnessWidget::~BrightnessWidget() @@ -57,14 +76,24 @@ void BrightnessWidget::initConenction() if (icon == DSlider::SliderIcons::RightIcon) Q_EMIT rightIconClicked(); }); - connect(m_slider, &CustomSlider::valueChanged, this, [ this ](int value) { + connect(m_slider, &CustomSlider::valueChanged, this, [ this ](int value) { + BrightMonitor *monitor = m_model->primaryMonitor(); + if (monitor) + m_model->setBrightness(monitor, value); }); connect(m_model, &BrightnessModel::brightnessChanged, this, &BrightnessWidget::onUpdateBright); + + BrightMonitor *monitor = m_model->primaryMonitor(); + if (monitor) + onUpdateBright(monitor); } -void BrightnessWidget::onUpdateBright() +void BrightnessWidget::onUpdateBright(BrightMonitor *monitor) { - + if (!monitor->isPrimary()) + return; + // 此处只显示主屏的亮度 + m_slider->setValue(monitor->brihtness()); } diff --git a/frame/window/components/brightnesswidget.h b/frame/window/components/brightnesswidget.h index 7988f486f..4d381acd6 100644 --- a/frame/window/components/brightnesswidget.h +++ b/frame/window/components/brightnesswidget.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef BRIGHTNESSWIDGET_H #define BRIGHTNESSWIDGET_H @@ -27,7 +47,7 @@ protected: void hideEvent(QHideEvent *event) override; private Q_SLOTS: - void onUpdateBright(); + void onUpdateBright(BrightMonitor *monitor); private: void initUi(); diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index ce95fc966..5c82eef69 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -1,6 +1,27 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "datetimedisplayer.h" #include +#include #include #include @@ -9,6 +30,11 @@ DWIDGET_USE_NAMESPACE #define DATETIMESIZE 40 +#define ITEMSPACE 8 + +static QMap dateFormat{{ 0,"yyyy/M/d" }, { 1,"yyyy-M-d" }, { 2,"yyyy.M.d" }, { 3,"yyyy/MM/dd" }, + { 4,"yyyy-MM-dd" }, { 5,"yyyy.MM.dd" }, { 6,"yy/M/d" }, { 7,"yy-M-d" }, { 8,"yy.M.d" }}; +static QMap timeFormat{{0, "h:mm"}, {1, "hh:mm"}}; DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) : QWidget (parent) @@ -17,15 +43,12 @@ DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) , m_timeFont(DFontSizeManager::instance()->t6()) , m_dateFont(DFontSizeManager::instance()->t10()) { - initUi(); - setShortDateFormat(m_timedateInter->shortDateFormat()); - setShortTimeFormat(m_timedateInter->shortTimeFormat()); - connect(m_timedateInter, &Timedate::ShortDateFormatChanged, this, &DateTimeDisplayer::setShortDateFormat); - connect(m_timedateInter, &Timedate::ShortTimeFormatChanged, this, &DateTimeDisplayer::setShortTimeFormat); + // 日期格式变化的时候,需要重绘 + connect(m_timedateInter, &Timedate::ShortDateFormatChanged, this, [ this ] { update(); }); + // 时间格式变化的时候,需要重绘 + connect(m_timedateInter, &Timedate::ShortTimeFormatChanged, this, [ this ] { update(); }); // 连接日期时间修改信号,更新日期时间插件的布局 - connect(m_timedateInter, &Timedate::TimeUpdate, this, [ this ] { - update(); - }); + connect(m_timedateInter, &Timedate::TimeUpdate, this, [ this ] { update(); }); } DateTimeDisplayer::~DateTimeDisplayer() @@ -39,6 +62,7 @@ void DateTimeDisplayer::setPositon(Dock::Position position) m_position = position; setCurrentPolicy(); + update(); } void DateTimeDisplayer::setCurrentPolicy() @@ -57,20 +81,25 @@ void DateTimeDisplayer::setCurrentPolicy() } } -void DateTimeDisplayer::initUi() -{ - QHBoxLayout *layout = new QHBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(0); -} - QSize DateTimeDisplayer::suitableSize() { DateTimeInfo info = dateTimeInfo(); - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - return QSize(info.m_dateRect.right(), height()); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + int width = info.m_timeRect.width() + info.m_dateRect.width() + 16; + return QSize(width, height()); + } - return QSize(width(), info.m_dateRect.bottom()); + return QSize(width(), info.m_timeRect.height() + info.m_dateRect.height()); +} + +void DateTimeDisplayer::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event); + + DDBusSender().service("com.deepin.Calendar") + .path("/com/deepin/Calendar") + .interface("com.deepin.Calendar") + .method("RaiseWindow").call(); } DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo() @@ -78,35 +107,67 @@ DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo() DateTimeInfo info; const QDateTime current = QDateTime::currentDateTime(); - const Dock::Position position = qApp->property(PROP_POSITION).value(); - info.m_timeRect = rect(); info.m_dateRect = rect(); - QString format = m_shortTimeFormat; + QString format = getTimeFormat(); if (!m_timedateInter->use24HourFormat()) { - if (position == Dock::Top || position == Dock::Bottom) + if (m_position == Dock::Top || m_position == Dock::Bottom) format = format.append(" AP"); else format = format.append("\nAP"); } info.m_time = current.toString(format); - info.m_date = current.toString(m_shortDateFormat); - int timeWidth = QFontMetrics(m_timeFont).boundingRect(info.m_time).width() + 12 * 2; - int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; + info.m_date = current.toString(getDateFormat()); - if (position == Dock::Top || position == Dock::Bottom) { - info.m_timeRect = QRect(10, 0, timeWidth, height()); - int right = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2; - info.m_dateRect = QRect(right, 0, dateWidth, height()); + if (m_position == Dock::Top || m_position == Dock::Bottom) { + int timeWidth = QFontMetrics(m_timeFont).boundingRect(info.m_time).width() + 10; + int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; + info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height()); + int dateX = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2 - ITEMSPACE; + // 如果时间的X坐标小于日期的X坐标,需要手动设置坐标在日期坐标的右侧 + if (dateX < info.m_timeRect.right()) + dateX = info.m_timeRect.right(); + info.m_dateRect = QRect(dateX, 0, dateWidth, height()); } else { - info.m_timeRect = QRect(0, 0, timeWidth, DATETIMESIZE / 2); - info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, dateWidth, DATETIMESIZE / 2); + int textWidth = rect().width(); + info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2); + info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2); } return info; } +QString DateTimeDisplayer::getDateFormat() const +{ + int type = m_timedateInter->shortDateFormat(); + QString shortDateFormat = "yyyy-MM-dd"; + if (dateFormat.contains(type)) + shortDateFormat = dateFormat.value(type); + // 如果是左右方向,则不显示年份 + if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) { + static QStringList yearStrList{"yyyy/", "yyyy-", "yyyy.", "yy/", "yy-", "yy."}; + for (int i = 0; i < yearStrList.size() ; i++) { + const QString &yearStr = yearStrList[i]; + if (shortDateFormat.contains(yearStr)) { + shortDateFormat = shortDateFormat.remove(yearStr); + break; + } + } + } + + return shortDateFormat; +} + +QString DateTimeDisplayer::getTimeFormat() const +{ + int type = m_timedateInter->shortTimeFormat(); + if (timeFormat.contains(type)) + return timeFormat[type]; + + return QString("hh:mm"); +} + void DateTimeDisplayer::paintEvent(QPaintEvent *e) { Q_UNUSED(e); @@ -117,37 +178,14 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e) painter.setRenderHint(QPainter::Antialiasing); painter.setPen(QPen(palette().brightText(), 1)); - painter.drawText(info.m_timeRect, Qt::AlignLeft | Qt::AlignVCenter, info.m_time); - + int timeTextFlag = Qt::AlignCenter; + int dateTextFlag = Qt::AlignCenter; + if (m_position == Dock::Top || m_position == Dock::Bottom) { + timeTextFlag = Qt::AlignLeft | Qt::AlignVCenter; + dateTextFlag = Qt::AlignRight | Qt::AlignVCenter; + } + painter.setFont(m_timeFont); + painter.drawText(info.m_timeRect, timeTextFlag, info.m_time); painter.setFont(m_dateFont); - painter.drawText(info.m_dateRect, Qt::AlignLeft | Qt::AlignVCenter, info.m_date); -} - -void DateTimeDisplayer::setShortDateFormat(int type) -{ - switch (type) { - case 0: m_shortDateFormat = "yyyy/M/d"; break; - case 1: m_shortDateFormat = "yyyy-M-d"; break; - case 2: m_shortDateFormat = "yyyy.M.d"; break; - case 3: m_shortDateFormat = "yyyy/MM/dd"; break; - case 4: m_shortDateFormat = "yyyy-MM-dd"; break; - case 5: m_shortDateFormat = "yyyy.MM.dd"; break; - case 6: m_shortDateFormat = "yy/M/d"; break; - case 7: m_shortDateFormat = "yy-M-d"; break; - case 8: m_shortDateFormat = "yy.M.d"; break; - default: m_shortDateFormat = "yyyy-MM-dd"; break; - } - - update(); -} - -void DateTimeDisplayer::setShortTimeFormat(int type) -{ - switch (type) { - case 0: m_shortTimeFormat = "h:mm"; break; - case 1: m_shortTimeFormat = "hh:mm"; break; - default: m_shortTimeFormat = "hh:mm"; break; - } - - update(); + painter.drawText(info.m_dateRect, dateTextFlag, info.m_date); } diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index dbb8b1a9f..9dcea0a30 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef DATETIMEDISPLAYER_H #define DATETIMEDISPLAYER_H @@ -25,27 +45,25 @@ private: public: explicit DateTimeDisplayer(QWidget *parent = nullptr); ~DateTimeDisplayer() override; - void setPositon(Dock::Position position); - QSize suitableSize(); + void setPositon(Dock::Position position); + QSize suitableSize(); - private: - void initUi(); - void setCurrentPolicy(); - DateTimeInfo dateTimeInfo(); +protected: + void mouseReleaseEvent(QMouseEvent *event) override; + void paintEvent(QPaintEvent *e) override; - void paintEvent(QPaintEvent *e) override; +private: + void setCurrentPolicy(); + DateTimeInfo dateTimeInfo(); - private Q_SLOTS: - void setShortDateFormat(int type); - void setShortTimeFormat(int type); + QString getDateFormat() const; + QString getTimeFormat() const; - private: - Timedate *m_timedateInter; - QString m_shortDateFormat; - QString m_shortTimeFormat; - Dock::Position m_position; - mutable QFont m_timeFont; - mutable QFont m_dateFont; +private: + Timedate *m_timedateInter; + Dock::Position m_position; + mutable QFont m_timeFont; + mutable QFont m_dateFont; }; #endif // DATETIMEDISPLAYER_H diff --git a/frame/window/components/mediawidget.cpp b/frame/window/components/mediawidget.cpp index 436920f93..ae2fe112b 100644 --- a/frame/window/components/mediawidget.cpp +++ b/frame/window/components/mediawidget.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "mediawidget.h" #include diff --git a/frame/window/components/mediawidget.h b/frame/window/components/mediawidget.h index 6a727e7b4..d5d870287 100644 --- a/frame/window/components/mediawidget.h +++ b/frame/window/components/mediawidget.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef MEDIAWIDGET_H #define MEDIAWIDGET_H diff --git a/frame/window/components/settingdelegate.cpp b/frame/window/components/settingdelegate.cpp index 0827d4fab..b2c0d3511 100644 --- a/frame/window/components/settingdelegate.cpp +++ b/frame/window/components/settingdelegate.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "settingdelegate.h" #include diff --git a/frame/window/components/settingdelegate.h b/frame/window/components/settingdelegate.h index 40d70f680..b55f83371 100644 --- a/frame/window/components/settingdelegate.h +++ b/frame/window/components/settingdelegate.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef SETTINGDELEGATE_H #define SETTINGDELEGATE_H @@ -12,13 +32,13 @@ class SettingDelegate : public DStyledItemDelegate { Q_OBJECT -Q_SIGNALS: - void selectIndexChanged(const QModelIndex &); - public: explicit SettingDelegate(QAbstractItemView *parent = nullptr); ~SettingDelegate() override; +Q_SIGNALS: + void selectIndexChanged(const QModelIndex &); + protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override; diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp index af3d15e2b..9be4706cc 100644 --- a/frame/window/components/volumedeviceswidget.cpp +++ b/frame/window/components/volumedeviceswidget.cpp @@ -1,4 +1,24 @@ -#include "volumedeviceswidget.h" +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "volumedeviceswidget.h" #include "customslider.h" #include "volumemodel.h" #include "settingdelegate.h" @@ -7,6 +27,7 @@ #include #include #include +#include #include #include @@ -140,9 +161,10 @@ void VolumeDevicesWidget::initConnection() m_deviceList->update(); } else { // 打开控制中心的声音模块 - QDBusInterface controlcenter("com.deepin.dde.ControlCenter", "/com/deepin/dde/ControlCenter", - "com.deepin.dde.ControlCenter", QDBusConnection::sessionBus()); - controlcenter.call("ShowModule", "sound"); + DDBusSender().service("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .method("ShowModule").arg(QString("sound")).call(); hide(); } }); diff --git a/frame/window/components/volumedeviceswidget.h b/frame/window/components/volumedeviceswidget.h index 7ffd55474..e85ae4fe1 100644 --- a/frame/window/components/volumedeviceswidget.h +++ b/frame/window/components/volumedeviceswidget.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef VOLUMEDEVICESWIDGET_H #define VOLUMEDEVICESWIDGET_H diff --git a/frame/window/components/volumewidget.cpp b/frame/window/components/volumewidget.cpp index 4447e3a5a..c36ebe45c 100644 --- a/frame/window/components/volumewidget.cpp +++ b/frame/window/components/volumewidget.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "volumewidget.h" #include "customslider.h" #include "imageutil.h" diff --git a/frame/window/components/volumewidget.h b/frame/window/components/volumewidget.h index 5daa52665..379216efd 100644 --- a/frame/window/components/volumewidget.h +++ b/frame/window/components/volumewidget.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef VOLUMEWIDGET_H #define VOLUMEWIDGET_H diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index ed77791d6..6c9528dbe 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -976,10 +976,10 @@ QPainterPath MainPanelControl::areaPath() return QPainterPath(); QPainterPath path; - int leftWidth = m_fixedAreaWidget->width() + m_fixedSpliter->width() + m_appAreaWidget->width() + 10; + int leftWidth = m_fixedAreaWidget->width() + m_fixedSpliter->width() + m_appAreaWidget->width(); int roundHeight = height(); path.addRoundedRect(QRect(0, 0, leftWidth, roundHeight), 18, 18); - path.addRoundedRect(QRect(leftWidth + 10, 0, m_trayManagerWidget->width(), roundHeight), 18, 18); + path.addRoundedRect(QRect(m_trayManagerWidget->x(), 0, m_trayManagerWidget->width(), roundHeight), 18, 18); return path; } diff --git a/frame/window/pluginchildpage.cpp b/frame/window/pluginchildpage.cpp new file mode 100644 index 000000000..42db178c5 --- /dev/null +++ b/frame/window/pluginchildpage.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "pluginchildpage.h" + +#include +#include +#include + +PluginChildPage::PluginChildPage(QWidget *parent) + : QWidget(parent) + , m_headerWidget(new QWidget(this)) + , m_back(new QLabel(m_headerWidget)) + , m_title(new QLabel(m_headerWidget)) + , m_container(new QWidget(this)) + , m_topWidget(nullptr) + , m_containerLayout(new QVBoxLayout(m_container)) + , m_isBack(false) +{ + initUi(); + m_back->installEventFilter(this); +} + +PluginChildPage::~PluginChildPage() +{ +} + +void PluginChildPage::pushWidget(QWidget *widget) +{ + // 首先将界面其他的窗体移除 + for (int i = m_containerLayout->count() - 1; i >= 0; i--) { + QLayoutItem *item = m_containerLayout->itemAt(i); + item->widget()->removeEventFilter(this); + item->widget()->hide(); + m_containerLayout->removeItem(item); + } + m_topWidget = widget; + widget->installEventFilter(this); + m_containerLayout->addWidget(widget); + widget->show(); + m_isBack = false; + QMetaObject::invokeMethod(this, &PluginChildPage::resetHeight, Qt::QueuedConnection); +} + +void PluginChildPage::setTitle(const QString &text) +{ + m_title->setText(text); +} + +bool PluginChildPage::isBack() +{ + return m_isBack; +} + +void PluginChildPage::initUi() +{ + m_back->setFixedWidth(24); + m_title->setAlignment(Qt::AlignCenter); + QHBoxLayout *headerLayout = new QHBoxLayout(m_headerWidget); + headerLayout->setContentsMargins(11, 12, 24 + 11, 12); + headerLayout->setSpacing(0); + headerLayout->addWidget(m_back); + headerLayout->addWidget(m_title); + m_headerWidget->setFixedHeight(48); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + + mainLayout->addWidget(m_headerWidget); + mainLayout->addWidget(m_container); + m_containerLayout->setContentsMargins(11, 0, 11, 0); + m_containerLayout->setSpacing(0); +} + +bool PluginChildPage::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_back && event->type() == QEvent::MouseButtonRelease) { + m_isBack = true; + Q_EMIT back(); + return true; + } + if (watched == m_topWidget) { + if (event->type() == QEvent::Hide) { + Q_EMIT closeSelf(); + return true; + } + if (event->type() == QEvent::Resize) + resetHeight(); + } + return QWidget::eventFilter(watched, event); +} + +void PluginChildPage::resetHeight() +{ + QMargins m = m_containerLayout->contentsMargins(); + m_container->setFixedHeight(m.top() + m.bottom() + m_topWidget->height()); + setFixedHeight(m_headerWidget->height() + m_container->height()); +} diff --git a/frame/window/pluginchildpage.h b/frame/window/pluginchildpage.h new file mode 100644 index 000000000..b94d87d13 --- /dev/null +++ b/frame/window/pluginchildpage.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef PLUGINCHILDPAGE_H +#define PLUGINCHILDPAGE_H + +#include + +class QLabel; +class QVBoxLayout; + +class PluginChildPage : public QWidget +{ + Q_OBJECT + +public: + explicit PluginChildPage(QWidget *parent); + ~PluginChildPage() override; + void pushWidget(QWidget *widget); + void setTitle(const QString &text); + bool isBack(); + +Q_SIGNALS: + void back(); + void closeSelf(); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + +private: + void initUi(); + void resetHeight(); + +private: + QWidget *m_headerWidget; + QLabel *m_back; + QLabel *m_title; + QWidget *m_container; + QWidget *m_topWidget; + QVBoxLayout *m_containerLayout; + bool m_isBack; +}; + +#endif // PLUGINCHILDPAGE_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 139e4c541..ce26ca5c1 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "quickpluginwindow.h" #include "quicksettingcontroller.h" #include "quicksettingitem.h" @@ -13,9 +33,11 @@ #include #include #include +#include #define ITEMSIZE 22 #define ITEMSPACE 6 +#define ICONSIZE 16 static QStringList fixedPluginKeys{ "network-item-key", "sound-item-key", "power" }; const int itemDataRole = Dtk::UserRole + 1; @@ -23,8 +45,7 @@ const int itemSortRole = Dtk::UserRole + 2; QuickPluginWindow::QuickPluginWindow(QWidget *parent) : QWidget(parent) - , m_listView(new DListView(this)) - , m_model(new QStandardItemModel(this)) + , m_mainLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_position(Dock::Position::Bottom) { initUi(); @@ -32,8 +53,6 @@ QuickPluginWindow::QuickPluginWindow(QWidget *parent) setAcceptDrops(true); setMouseTracking(true); - - this->installEventFilter(this); } QuickPluginWindow::~QuickPluginWindow() @@ -42,28 +61,16 @@ QuickPluginWindow::~QuickPluginWindow() void QuickPluginWindow::initUi() { - m_listView->setModel(m_model); - m_listView->setViewMode(QListView::IconMode); - m_listView->setMovement(QListView::Free); - m_listView->setWordWrap(false); - m_listView->verticalScrollBar()->setVisible(false); - m_listView->horizontalScrollBar()->setVisible(false); - m_listView->setOrientation(QListView::Flow::LeftToRight, false); - m_listView->setGridSize(QSize(ITEMSIZE + 10, ITEMSIZE + 10)); - m_listView->setSpacing(ITEMSPACE); - m_listView->setContentsMargins(0,0,0,0); - m_model->setSortRole(itemSortRole); - - QHBoxLayout *layout = new QHBoxLayout(this); - layout->setContentsMargins(0,0,0,0); - layout->setSpacing(0); - layout->addWidget(m_listView); - + setAcceptDrops(true); + m_mainLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + m_mainLayout->setDirection(QBoxLayout::Direction::RightToLeft); + m_mainLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0); + m_mainLayout->setSpacing(ITEMSPACE); const QList &items = QuickSettingController::instance()->settingItems(); for (QuickSettingItem *settingItem : items) { const QString itemKey = settingItem->itemKey(); if (!fixedPluginKeys.contains(itemKey)) - return; + continue; addPlugin(settingItem); } @@ -75,228 +82,243 @@ void QuickPluginWindow::setPositon(Position position) return; m_position = position; + QuickSettingContainer::setPosition(position); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - m_listView->setOrientation(QListView::Flow::LeftToRight, false); + m_mainLayout->setDirection(QBoxLayout::RightToLeft); else - m_listView->setOrientation(QListView::Flow::TopToBottom, false); + m_mainLayout->setDirection(QBoxLayout::BottomToTop); +} + +int QuickPluginWindow::findActiveTargetIndex(QWidget *widget) +{ + for (int i = 0; i < m_activeSettingItems.size(); i++) { + QuickSettingItem *settingItem = m_activeSettingItems[i]; + if (settingItem->pluginItem()->itemWidget(settingItem->itemKey()) == widget) + return i; + } + return -1; +} + +void QuickPluginWindow::dragPlugin(QuickSettingItem *item) +{ + // 释放插件,一般是从快捷设置面板区域移动到这里的,固定插件不支持拖动 + if (fixedPluginKeys.contains(item->itemKey())) + return; + + QPoint itemPoint = mapFromGlobal(QCursor::pos()); + // 查找移动后的位置,如果移动后的插件找不到,就直接放到最后 + QWidget *targetWidget = childAt(itemPoint); + if (!targetWidget) { + m_activeSettingItems << item; + } else { + // 如果是拖动到固定插件区域,也放到最后 + int targetIndex = findActiveTargetIndex(targetWidget); + if (targetIndex < 0) + m_activeSettingItems << item; + else + m_activeSettingItems.insert(targetIndex, item); + } + //排序插入到当前窗体 + resetPluginDisplay(); + Q_EMIT itemCountChanged(); } void QuickPluginWindow::addPlugin(QuickSettingItem *item) { - // 判断当前的插件是否存在,如果存在,则不插入 - for (int i = 0; i < m_model->rowCount(); i++) { - QStandardItem *myItem = m_model->item(i, 0); - QuickSettingItem *settingItem = myItem->data(itemDataRole).value(); - if (settingItem == item) { - m_model->sort(0); + for (int i = 0; i < m_mainLayout->count(); i++) { + QWidget *widget = m_mainLayout->itemAt(i)->widget(); + if (item == widget) { + resetPluginDisplay(); return; } } - - DStandardItem *standItem = createStandItem(item); - if (!standItem) + QWidget *widget = item->pluginItem()->itemWidget(item->itemKey()); + if (!widget) return; - m_model->appendRow(standItem); - resetSortRole(); - m_model->sort(0); + widget->installEventFilter(this); + if (fixedPluginKeys.contains(item->itemKey())) { + // 新插入的插件如果是固定插件,则将其插入到固定插件列表中,并对其进行排序 + m_fixedSettingItems << item; + qSort(m_fixedSettingItems.begin(), m_fixedSettingItems.end(), [](QuickSettingItem *item1, QuickSettingItem *item2) { + int index1 = fixedPluginKeys.indexOf(item1->itemKey()); + int index2 = fixedPluginKeys.indexOf(item2->itemKey()); + return index1 < index2; + }); + } else { + // 如果是非固定插件,则直接插入到末尾 + m_activeSettingItems << item; + } + resetPluginDisplay(); Q_EMIT itemCountChanged(); } QSize QuickPluginWindow::suitableSize() { if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - return QSize((ITEMSIZE + ITEMSPACE) * m_model->rowCount() + ITEMSPACE, ITEMSIZE); + return QSize((ITEMSPACE + ICONSIZE) * m_mainLayout->count() + ITEMSIZE, ITEMSIZE); - return QSize(ITEMSIZE, (ITEMSIZE + ITEMSPACE) * m_model->rowCount() + ITEMSPACE); + return QSize(ITEMSIZE, (ITEMSIZE + ITEMSPACE) * m_mainLayout->count() + ITEMSPACE); } void QuickPluginWindow::removePlugin(QuickSettingItem *item) { - for (int i = 0; i < m_model->rowCount(); i++) { - QModelIndex index = m_model->index(i, 0); - QuickSettingItem *quickItem = index.data(itemDataRole).value(); - if (quickItem == item) { - m_model->removeRow(i); - break; - } - } - m_model->sort(0); + if (m_fixedSettingItems.contains(item)) + m_fixedSettingItems.removeOne(item); + else if (m_activeSettingItems.contains(item)) + m_activeSettingItems.removeOne(item); + else + return; + resetPluginDisplay(); Q_EMIT itemCountChanged(); } -void QuickPluginWindow::resetSortRole() +QuickSettingItem *QuickPluginWindow::findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems) { - QList> fixedItems; - QList activeItems; - for (int i = 0; i < m_model->rowCount(); i++) { - QModelIndex index = m_model->index(i, 0); - if (!index.data(itemDataRole).canConvert()) - continue; - - QuickSettingItem *settingItem = index.data(itemDataRole).value(); - if (fixedPluginKeys.contains(settingItem->itemKey())) - fixedItems.push_back({ m_model->item(i, 0), fixedPluginKeys.indexOf(settingItem->itemKey()) }); - else - activeItems << m_model->item(i, 0); - } - - for (int i = 0; i < activeItems.size(); i++) { - QStandardItem *item = activeItems[i]; - item->setData(i, itemSortRole); - } - - for (QPair item : fixedItems) - item.first->setData(activeItems.size() + item.second, itemSortRole); -} - -DStandardItem *QuickPluginWindow::createStandItem(QuickSettingItem *item) -{ - const QString itemKey = item->itemKey(); - QWidget *itemWidget = item->pluginItem()->itemWidget(itemKey); - if (!itemWidget) + QWidget *selectWidget = childAt(mousePoint); + if (!selectWidget) return nullptr; - itemWidget->setParent(m_listView); - DStandardItem *standItem = new DStandardItem; - standItem->setFlags(Qt::ItemIsEnabled); - standItem->setBackground(Qt::transparent); - standItem->setData(QVariant::fromValue(item), itemDataRole); - - DViewItemAction *action = new DViewItemAction(Qt::AlignCenter, QSize(ITEMSIZE, ITEMSIZE), QSize(ITEMSIZE, ITEMSIZE), true); - action->setWidget(itemWidget); - connect(action, &DViewItemAction::triggered, this, [ this ] { - QPoint ptCurrent = pos(); - QWidget *callWidget = parentWidget(); - if (callWidget) - ptCurrent = callWidget->mapToGlobal(ptCurrent); - - QuickSettingContainer::popWindow()->show(ptCurrent); - }); - connect(action, &DViewItemAction::destroyed, this, [ itemWidget ] { - itemWidget->setParent(nullptr); - itemWidget->hide(); - }); - - standItem->setActionList(Qt::LeftEdge, { action }); - return standItem; -} - -void QuickPluginWindow::mouseReleaseEvent(QMouseEvent *event) -{ - QMouseEvent *mouseEvent = static_cast(event); - QModelIndex selectedIndex = m_listView->indexAt(mouseEvent->pos()); - if (!selectedIndex.isValid()) - return; - - QuickSettingItem *moveItem = selectedIndex.data(itemDataRole).value(); - if (!moveItem) - return; - - if (fixedPluginKeys.contains(moveItem->itemKey())) { - QPoint currentPoint = pos(); - QWidget *callWidget = parentWidget(); - if (callWidget) - currentPoint = callWidget->mapToGlobal(currentPoint); - - QuickSettingContainer::popWindow()->show(currentPoint); + for (int i = 0; i < settingItems.size(); i++) { + QuickSettingItem *settingItem = settingItems[i]; + QWidget *widget = settingItem->pluginItem()->itemWidget(settingItem->itemKey()); + if (selectWidget == widget) + return settingItem; } + + return nullptr; } void QuickPluginWindow::mousePressEvent(QMouseEvent *event) { - QModelIndex selectedIndex = m_listView->indexAt(event->pos()); - if (!selectedIndex.isValid()) { - QWidget::mousePressEvent(event); + // 查找非固定的图标,然后执行拖动 + QuickSettingItem *quickItem = findQuickSettingItem(event->pos(), m_activeSettingItems); + if (!quickItem) return; + + // 如果不是固定图标,则让其拖动 + startDrag(quickItem); +} + +void QuickPluginWindow::mouseReleaseEvent(QMouseEvent *event) +{ + // 查找固定团图标,然后点击弹出快捷面板 + QuickSettingItem *quickItem = findQuickSettingItem(event->pos(), m_fixedSettingItems); + if (!quickItem) + return; + + // 如果是固定图标,则让其弹出列表 + QPoint currentPoint = pos(); + QWidget *callWidget = parentWidget(); + if (callWidget) { + currentPoint = callWidget->mapToGlobal(currentPoint); + // 如果是向上的方向,则需要减去高度 + if (m_position == Dock::Position::Top) + currentPoint.setY(currentPoint.y() + callWidget->height()); + else if (m_position == Dock::Position::Left) + currentPoint.setX(currentPoint.x() + callWidget->width()); } - QuickSettingItem *moveItem = selectedIndex.data(itemDataRole).value(); - if (!moveItem) { - QWidget::mousePressEvent(event); - return; - } - - if (fixedPluginKeys.contains(moveItem->itemKey())) { - QWidget::mousePressEvent(event); - return; - } - - startDrag(moveItem); + DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); + popWindow->show(currentPoint); } void QuickPluginWindow::startDrag(QuickSettingItem *moveItem) { AppDrag *drag = new AppDrag(this, new QuickDragWidget); - CustomMimeData *mimedata = new CustomMimeData; - mimedata->setData(moveItem); + QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem); drag->setMimeData(mimedata); drag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size())); QPixmap dragPixmap = moveItem->pluginItem()->icon()->pixmap(QSize(ITEMSIZE, ITEMSIZE)); drag->setPixmap(dragPixmap); - drag->setHotSpot(QPoint(dragPixmap.width() / 2, dragPixmap.height() / 2)); + drag->setHotSpot(QPoint(0, 0)); connect(drag->appDragWidget(), &AppDragWidget::requestRemoveItem, this, [ this, moveItem ] { removePlugin(moveItem); }); - connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, [ this, moveItem ](){ - addPlugin(moveItem); - }); - connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, [ this ](QDragMoveEvent *eve){ - QPoint ptCurrent = m_listView->mapFromGlobal(QCursor::pos()); - QModelIndex index = m_listView->indexAt(ptCurrent); - if (!index.isValid()) - return; - - CustomMimeData *data = const_cast(qobject_cast(eve->mimeData())); - if (!data) - return; - - QuickSettingItem *sourceItem = static_cast(data->data()); - if (!sourceItem) - return; - - QuickSettingItem *targetItem = index.data(itemDataRole).value(); - if (!targetItem || fixedPluginKeys.contains(targetItem->itemKey()) || sourceItem == targetItem) - return; - - // recall all sortroles - QList> allItems; - for (int i = 0; i < m_model->rowCount(); i++) { - QModelIndex rowIndex = m_model->index(i, 0); - allItems.push_back({ rowIndex, rowIndex.data(itemDataRole).value() }); - } - auto findIndex = [ allItems ](QuickSettingItem *item) { - for (int i = 0; i < allItems.size(); i++) { - const QPair &rowItem = allItems[i]; - if (rowItem.second == item) - return i; - } - return -1; - }; - int sourceIndex = findIndex(sourceItem); - int targetIndex = findIndex(targetItem); - if (sourceIndex < 0 || targetIndex < 0 || sourceIndex == targetIndex) - return; - - allItems.move(sourceIndex, targetIndex); - - for (int i = 0; i < allItems.size(); i++) { - const QPair &rowItem = allItems[i]; - m_model->setData(rowItem.first, i, itemSortRole); - } - - eve->accept(); + connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, [ this] { + resetPluginDisplay(); + Q_EMIT itemCountChanged(); }); + connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, &QuickPluginWindow::onPluginDragMove); drag->exec(Qt::MoveAction | Qt::CopyAction); } +void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) +{ + QPoint currentPoint = mapFromGlobal(QCursor::pos()); + const QuickPluginMimeData *data = qobject_cast(event->mimeData()); + if (!data) + return; + + QuickSettingItem *sourceItem = data->quickSettingItem(); + if (!sourceItem) + return; + + QWidget *sourceMoveWidget = sourceItem->pluginItem()->itemWidget(sourceItem->itemKey()); + QuickSettingItem *targetItem = findQuickSettingItem(currentPoint, m_activeSettingItems); + // 如果未找到要移动的目标位置,或者移动的目标位置是固定插件,或者原插件和目标插件是同一个插件,则不做任何操作 + if (!sourceMoveWidget || !targetItem || sourceItem == targetItem) + return; + + // 重新对所有的插件进行排序 + QMap allItems; + for (int i = 0; i < m_mainLayout->count(); i++) { + QWidget *childWidget = m_mainLayout->itemAt(i)->widget(); + allItems[childWidget] = i; + } + // 调整列表中的位置 + int sourceIndex = m_activeSettingItems.indexOf(sourceItem); + int targetIndex = m_activeSettingItems.indexOf(targetItem); + if (sourceIndex >= 0) + m_activeSettingItems.move(sourceIndex, targetIndex); + else + m_activeSettingItems.insert(targetIndex, sourceItem); + + event->accept(); +} + +QList QuickPluginWindow::settingItems() +{ + QList items; + for (int i = 0; i < m_mainLayout->count(); i++) { + qInfo() << m_mainLayout->itemAt(i)->widget(); + QuickSettingItem *item = qobject_cast(m_mainLayout->itemAt(i)->widget()); + if (item) + items << item; + } + return items; +} + +void QuickPluginWindow::resetPluginDisplay() +{ + // 先删除所有的widget + for (int i = m_mainLayout->count() - 1; i >= 0; i--) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (layoutItem) { + layoutItem->widget()->setParent(nullptr); + m_mainLayout->removeItem(layoutItem); + } + } + // 将列表中所有的控件按照顺序添加到布局上 + auto addWidget = [ this ](const QList &items) { + for (QuickSettingItem *item : items) { + QWidget *itemWidget = item->pluginItem()->itemWidget(item->itemKey()); + itemWidget->setParent(this); + m_mainLayout->addWidget(itemWidget); + } + }; + + addWidget(m_activeSettingItems); + addWidget(m_fixedSettingItems); +} + void QuickPluginWindow::initConnection() { - connect(QuickSettingController::instance(), &QuickSettingController::pluginInsert, this, [ this ](QuickSettingItem * settingItem) { + connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ](QuickSettingItem * settingItem) { const QString itemKey = settingItem->itemKey(); if (!fixedPluginKeys.contains(itemKey)) return; @@ -304,20 +326,5 @@ void QuickPluginWindow::initConnection() addPlugin(settingItem); }); - connect(QuickSettingController::instance(), &QuickSettingController::pluginRemove, this, [ this ](QuickSettingItem *settingItem) { - removePlugin(settingItem); - }); -} - -int QuickPluginWindow::fixedItemCount() -{ - int count = 0; - for (int i = 0; i < m_model->rowCount(); i++) { - QModelIndex index = m_model->index(i, 0); - QuickSettingItem *item = index.data(itemDataRole).value(); - if (item && fixedPluginKeys.contains(item->itemKey())) - count++; - } - - return count; + connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, &QuickPluginWindow::removePlugin); } diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index dc765c02d..0a520c703 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef QUICKPLUGINWINDOW_H #define QUICKPLUGINWINDOW_H @@ -12,6 +32,7 @@ class QuickSettingContainer; class QStandardItemModel; class QStandardItem; class QMouseEvent; +class QBoxLayout; namespace Dtk { namespace Gui { class DRegionMonitor; } namespace Widget { class DListView; class DStandardItem; } } @@ -22,35 +43,41 @@ class QuickPluginWindow : public QWidget { Q_OBJECT -Q_SIGNALS: - void itemCountChanged(); - public: explicit QuickPluginWindow(QWidget *parent = nullptr); ~QuickPluginWindow() override; void setPositon(Dock::Position position); - void addPlugin(QuickSettingItem *item); + void dragPlugin(QuickSettingItem *item); QSize suitableSize(); +Q_SIGNALS: + void itemCountChanged(); + protected: void mouseReleaseEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override; +private Q_SLOTS: + void addPlugin(QuickSettingItem *item); + void removePlugin(QuickSettingItem *item); + void onPluginDragMove(QDragMoveEvent *event); + private: void initUi(); void initConnection(); - void resetSortRole(); - int fixedItemCount(); - DStandardItem *createStandItem(QuickSettingItem *item); - void removePlugin(QuickSettingItem *item); void startDrag(QuickSettingItem *moveItem); + QList settingItems(); + QuickSettingItem *findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems); + int findActiveTargetIndex(QWidget *widget); + void resetPluginDisplay(); private: - DListView *m_listView; - QStandardItemModel *m_model; + QBoxLayout *m_mainLayout; Dock::Position m_position; + QList m_activeSettingItems; + QList m_fixedSettingItems; }; #endif // QUICKPLUGINWINDOW_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index ce1de0c44..dc6bc14dd 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "quicksettingcontainer.h" #include "quicksettingcontroller.h" #include "pluginsiteminterface.h" @@ -8,6 +28,7 @@ #include "volumewidget.h" #include "volumedeviceswidget.h" #include "brightnessmonitorwidget.h" +#include "pluginchildpage.h" #include #include @@ -27,6 +48,9 @@ static const int QuickItemRole = Dtk::UserRole + 10; #define ITEMSPACE 10 #define COLUMNCOUNT 4 +DockPopupWindow *QuickSettingContainer::m_popWindow = nullptr; +Dock::Position QuickSettingContainer::m_position = Dock::Position::Bottom; + QuickSettingContainer::QuickSettingContainer(QWidget *parent) : QWidget(parent) , m_switchLayout(new QStackedLayout(this)) @@ -40,9 +64,12 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumnWidget->model(), this)) , m_brightSettingWidget(new BrightnessMonitorWidget(m_brihtnessWidget->model(), this)) , m_childPage(new PluginChildPage(this)) + , m_dragPluginPosition(QPoint(0, 0)) { initUi(); initConnection(); + m_childPage->installEventFilter(this); + setMouseTracking(true); } QuickSettingContainer::~QuickSettingContainer() @@ -54,27 +81,53 @@ void QuickSettingContainer::showHomePage() m_switchLayout->setCurrentIndex(0); } -DockPopupWindow *QuickSettingContainer::popWindow() +// 根据位置获取箭头的方向 +static DArrowRectangle::ArrowDirection getDirection(const Dock::Position &position) { - static DockPopupWindow *popView = nullptr; - if (!popView) { - popView = new DockPopupWindow; - popView->setWindowFlag(Qt::Popup); - popView->setShadowBlurRadius(20); - popView->setRadius(18); - popView->setShadowYOffset(2); - popView->setShadowXOffset(0); - popView->setArrowWidth(18); - popView->setArrowHeight(10); - - QuickSettingContainer *container = new QuickSettingContainer(popView); - popView->setContent(container); - } else { - QuickSettingContainer *container = static_cast(popView->getContent()); - container->showHomePage(); + switch (position) { + case Dock::Position::Top: + return DArrowRectangle::ArrowDirection::ArrowTop; + case Dock::Position::Left: + return DArrowRectangle::ArrowDirection::ArrowLeft; + case Dock::Position::Right: + return DArrowRectangle::ArrowDirection::ArrowRight; + default: + return DArrowRectangle::ArrowDirection::ArrowBottom; } - return popView; + return DArrowRectangle::ArrowDirection::ArrowBottom; +} + +DockPopupWindow *QuickSettingContainer::popWindow() +{ + if (m_popWindow) { + QuickSettingContainer *container = static_cast(m_popWindow->getContent()); + container->showHomePage(); + return m_popWindow; + } + + m_popWindow = new DockPopupWindow; + m_popWindow->setWindowFlag(Qt::Popup); + m_popWindow->setShadowBlurRadius(20); + m_popWindow->setRadius(18); + m_popWindow->setShadowYOffset(2); + m_popWindow->setShadowXOffset(0); + m_popWindow->setArrowWidth(18); + m_popWindow->setArrowHeight(10); + m_popWindow->setContent(new QuickSettingContainer(m_popWindow)); + m_popWindow->setArrowDirection(getDirection(m_position)); + return m_popWindow; +} + +void QuickSettingContainer::setPosition(Position position) +{ + if (m_position == position) + return; + + m_position = position; + + if (m_popWindow) + m_popWindow->setArrowDirection(getDirection(m_position)); } void QuickSettingContainer::initQuickItem(QuickSettingItem *quickItem) @@ -147,21 +200,51 @@ void QuickSettingContainer::onPluginRemove(QuickSettingItem *quickItem) void QuickSettingContainer::mousePressEvent(QMouseEvent *event) { if (event->button() != Qt::LeftButton) - return; + return QWidget::mousePressEvent(event); QuickSettingItem *moveItem = qobject_cast(childAt(event->pos())); if (!moveItem || moveItem->pluginItem()->isPrimary()) return QWidget::mousePressEvent(event); - QDrag *drag = new QDrag(this); - CustomMimeData *mimedata = new CustomMimeData; - mimedata->setData(moveItem); - drag->setMimeData(mimedata); - QPixmap dragPixmap = moveItem->dragPixmap(); - drag->setPixmap(dragPixmap); - drag->setHotSpot(QPoint(dragPixmap.width() / 2, dragPixmap.height() / 2)); + m_dragPluginPosition = event->pos(); +} - drag->exec(Qt::MoveAction | Qt::CopyAction); +void QuickSettingContainer::clearDragPoint() +{ + m_dragPluginPosition.setX(0); + m_dragPluginPosition.setY(0); +} + +void QuickSettingContainer::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event); + clearDragPoint(); +} + +void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) +{ + if (m_dragPluginPosition.isNull()) + return; + + QuickSettingItem *moveItem = qobject_cast(childAt(m_dragPluginPosition)); + if (!moveItem) { + clearDragPoint(); + return; + } + + QPoint pointCurrent = event->pos(); + if (qAbs(m_dragPluginPosition.x() - pointCurrent.x()) > 5 + || qAbs(m_dragPluginPosition.y() - pointCurrent.y()) > 5) { + clearDragPoint(); + QDrag *drag = new QDrag(this); + QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem); + drag->setMimeData(mimedata); + QPixmap dragPixmap = moveItem->dragPixmap(); + drag->setPixmap(dragPixmap); + drag->setHotSpot(QPoint(dragPixmap.width() / 2, dragPixmap.height() / 2)); + + drag->exec(Qt::MoveAction | Qt::CopyAction); + } } void QuickSettingContainer::resetItemPosition() @@ -183,9 +266,8 @@ void QuickSettingContainer::resetItemPosition() qSort(primaryQuickItems.begin(), primaryQuickItems.end(), [ = ](QuickSettingItem *item1, QuickSettingItem *item2) { int index1 = existKeys.indexOf(item1->itemKey()); int index2 = existKeys.indexOf(item2->itemKey()); - if (index1 >= 0 || index2 >= 0) { + if (index1 >= 0 || index2 >= 0) return index1 < index2; - } return true; }); int primaryColumnCount = COLUMNCOUNT / 2; @@ -265,8 +347,8 @@ void QuickSettingContainer::initUi() void QuickSettingContainer::initConnection() { - connect(m_pluginLoader, &QuickSettingController::pluginInsert, this, &QuickSettingContainer::onPluginInsert); - connect(m_pluginLoader, &QuickSettingController::pluginRemove, this, &QuickSettingContainer::onPluginRemove); + connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, &QuickSettingContainer::onPluginInsert); + connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); connect(m_playerWidget, &MediaWidget::visibleChanged, this, [ this ] { resizeView(); }); connect(m_volumnWidget, &VolumeWidget::visibleChanged, this, [ this ] { resizeView(); }); connect(m_volumnWidget, &VolumeWidget::rightIconClick, this, [ this ] { @@ -285,7 +367,6 @@ void QuickSettingContainer::initConnection() if (!m_childPage->isBack()) topLevelWidget()->hide(); }); - m_childPage->installEventFilter(this); } void QuickSettingContainer::resizeView() @@ -318,98 +399,3 @@ void QuickSettingContainer::resizeView() setFixedHeight(m_childPage->height()); } } - -/** - * @brief PluginChildPage::PluginChildPage - * @param parent - */ -PluginChildPage::PluginChildPage(QWidget *parent) - : QWidget(parent) - , m_headerWidget(new QWidget(this)) - , m_back(new QLabel(m_headerWidget)) - , m_title(new QLabel(m_headerWidget)) - , m_container(new QWidget(this)) - , m_topWidget(nullptr) - , m_containerLayout(new QVBoxLayout(m_container)) - , m_isBack(false) -{ - initUi(); - m_back->installEventFilter(this); -} - -PluginChildPage::~PluginChildPage() -{ -} - -void PluginChildPage::pushWidget(QWidget *widget) -{ - // 首先将界面其他的窗体移除 - for (int i = m_containerLayout->count() - 1; i >= 0; i--) { - QLayoutItem *item = m_containerLayout->itemAt(i); - item->widget()->removeEventFilter(this); - item->widget()->hide(); - m_containerLayout->removeItem(item); - } - m_topWidget = widget; - widget->installEventFilter(this); - m_containerLayout->addWidget(widget); - widget->show(); - m_isBack = false; - QMetaObject::invokeMethod(this, &PluginChildPage::resetHeight, Qt::QueuedConnection); -} - -void PluginChildPage::setTitle(const QString &text) -{ - m_title->setText(text); -} - -bool PluginChildPage::isBack() -{ - return m_isBack; -} - -void PluginChildPage::initUi() -{ - m_back->setFixedWidth(24); - m_title->setAlignment(Qt::AlignCenter); - QHBoxLayout *headerLayout = new QHBoxLayout(m_headerWidget); - headerLayout->setContentsMargins(11, 12, 24 + 11, 12); - headerLayout->setSpacing(0); - headerLayout->addWidget(m_back); - headerLayout->addWidget(m_title); - m_headerWidget->setFixedHeight(48); - - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(0); - - mainLayout->addWidget(m_headerWidget); - mainLayout->addWidget(m_container); - m_containerLayout->setContentsMargins(11, 0, 11, 0); - m_containerLayout->setSpacing(0); -} - -bool PluginChildPage::eventFilter(QObject *watched, QEvent *event) -{ - if (watched == m_back && event->type() == QEvent::MouseButtonRelease) { - m_isBack = true; - Q_EMIT back(); - return true; - } - if (watched == m_topWidget) { - if (event->type() == QEvent::Hide) { - Q_EMIT closeSelf(); - return true; - } - if (event->type() == QEvent::Resize) - resetHeight(); - } - return QWidget::eventFilter(watched, event); -} - -void PluginChildPage::resetHeight() -{ - QMargins m = m_containerLayout->contentsMargins(); - m_container->setFixedHeight(m.top() + m.bottom() + m_topWidget->height()); - setFixedHeight(m_headerWidget->height() + m_container->height()); -} diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 090d28698..12b74ae2a 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef QUICKSETTINGCONTAINER_H #define QUICKSETTINGCONTAINER_H @@ -31,9 +51,13 @@ class QuickSettingContainer : public QWidget public: static DockPopupWindow *popWindow(); + static void setPosition(Dock::Position position); protected: void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + explicit QuickSettingContainer(QWidget *parent = nullptr); ~QuickSettingContainer() override; void showHomePage(); @@ -57,8 +81,12 @@ private: void initQuickItem(QuickSettingItem *quickItem); // 显示具体的窗体 void showWidget(QWidget *widget, const QString &title); + // 清除移动轨迹 + void clearDragPoint(); private: + static DockPopupWindow *m_popWindow; + static Dock::Position m_position; QStackedLayout *m_switchLayout; QWidget *m_mainWidget; QWidget *m_pluginWidget; @@ -71,52 +99,20 @@ private: VolumeDevicesWidget *m_volumeSettingWidget; BrightnessMonitorWidget *m_brightSettingWidget; PluginChildPage *m_childPage; + QPoint m_dragPluginPosition; }; -class CustomMimeData : public QMimeData +class QuickPluginMimeData : public QMimeData { Q_OBJECT public: - CustomMimeData() : QMimeData(), m_data(nullptr) {} - ~CustomMimeData() {} - void setData(void *data) { m_data = data; } - void *data() { return m_data; } + explicit QuickPluginMimeData(QuickSettingItem *item) : QMimeData(), m_item(item) {} + ~QuickPluginMimeData() {} + QuickSettingItem *quickSettingItem() const { return m_item; } private: - void *m_data; -}; - -class PluginChildPage : public QWidget -{ - Q_OBJECT - -Q_SIGNALS: - void back(); - void closeSelf(); - -public: - explicit PluginChildPage(QWidget *parent); - ~PluginChildPage() override; - void pushWidget(QWidget *widget); - void setTitle(const QString &text); - bool isBack(); - -protected: - bool eventFilter(QObject *watched, QEvent *event) override; - -private: - void initUi(); - void resetHeight(); - -private: - QWidget *m_headerWidget; - QLabel *m_back; - QLabel *m_title; - QWidget *m_container; - QWidget *m_topWidget; - QVBoxLayout *m_containerLayout; - bool m_isBack; + QuickSettingItem *m_item; }; #endif // PLUGINCONTAINER_H diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index ce6e8fdbe..db4f3e230 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "systempluginwindow.h" #include "systemplugincontroller.h" #include "systempluginitem.h" @@ -110,7 +130,6 @@ int SystemPluginWindow::calcIconSize() const if (height() <= 40) return MINICONSIZE; return height() - ICONMARGIN * 2; - break; } case Dock::Position::Left: case Dock::Position::Right: { @@ -153,15 +172,12 @@ FixedPluginController::FixedPluginController(QObject *parent) { } -const QVariant FixedPluginController::getValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &fallback) -{ - if (key == "enable") - return (itemInter->pluginName().compare("shutdown") == 0); - - return AbstractPluginsController::getValue(itemInter, key, fallback); -} - PluginsItem *FixedPluginController::createPluginsItem(PluginsItemInterface * const itemInter, const QString &itemKey, const QString &pluginApi) { return new StretchPluginsItem(itemInter, itemKey, pluginApi); } + +bool FixedPluginController::needLoad(PluginsItemInterface *itemInter) +{ + return (itemInter->pluginName().compare("shutdown") == 0); +} diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 56b68f0ef..27a362f36 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef SYSTEMPLUGINWINDOW_H #define SYSTEMPLUGINWINDOW_H @@ -18,15 +38,15 @@ class SystemPluginWindow : public DBlurEffectWidget { Q_OBJECT -Q_SIGNALS: - void pluginSizeChanged(); - public: explicit SystemPluginWindow(QWidget *parent = nullptr); ~SystemPluginWindow() override; void setPositon(Dock::Position position); QSize suitableSize(); +Q_SIGNALS: + void pluginSizeChanged(); + private: void initUi(); int calcIconSize() const; @@ -49,11 +69,11 @@ class FixedPluginController : public DockPluginsController Q_OBJECT public: - FixedPluginController(QObject *parent); + explicit FixedPluginController(QObject *parent); protected: - const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override; PluginsItem *createPluginsItem(PluginsItemInterface *const itemInter, const QString &itemKey, const QString &pluginApi) override; + bool needLoad(PluginsItemInterface *itemInter) override; }; #endif // SYSTEMPLUGINWINDOW_H diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index 1a3a601a9..276d9f706 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -28,18 +28,22 @@ #include "widgets/expandiconwidget.h" #include "utils.h" +#include + #include #include #include #include #include +#include #include #include -TrayDelegate::TrayDelegate(QObject *parent) +TrayDelegate::TrayDelegate(QListView *view, QObject *parent) : QStyledItemDelegate(parent) , m_position(Dock::Position::Bottom) + , m_listView(view) { } @@ -65,7 +69,7 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem int screenp = 0; static xcb_connection_t *xcb_connection = xcb_connect(qgetenv("DISPLAY"), &screenp); static Display *m_display = XOpenDisplay(nullptr); - trayWidget = new XEmbedTrayItemWidget(winId, xcb_connection, m_display, parent) ; + trayWidget = new XEmbedTrayItemWidget(winId, xcb_connection, m_display, parent); } const TrayModel *model = qobject_cast(index.model()); @@ -74,40 +78,53 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem } else if (type == TrayIconType::SNI) { trayWidget = new SNITrayItemWidget(servicePath, parent); } else if (type == TrayIconType::EXPANDICON) { - ExpandIconWidget *widget = new ExpandIconWidget(parent); - widget->setPositonValue(m_position); - connect(widget, &ExpandIconWidget::trayVisbleChanged, this, [ = ](bool visible) { + ExpandIconWidget *expandWidget = new ExpandIconWidget(parent); + expandWidget->setPositonValue(m_position); + connect(expandWidget, &ExpandIconWidget::trayVisbleChanged, this, [ = ](bool visible) { Q_EMIT visibleChanged(index, visible); }); - connect(this, &TrayDelegate::requestDrag, this, [ = ](bool on) { - if (on) { - widget->setTrayPanelVisible(true); - } else { - // 如果释放鼠标,则判断当前鼠标的位置是否在托盘内部,如果在,则无需隐藏 - QPoint currentPoint = QCursor::pos(); - TrayGridView *view = widget->popupTrayView(); - if (view->geometry().contains(currentPoint)) - widget->setTrayPanelVisible(true); - else - widget->setTrayPanelVisible(false); - } - }); - trayWidget = widget; + connect(this, &TrayDelegate::requestDrag, this, &TrayDelegate::onRequestDrag); + trayWidget = expandWidget; } else if (type == TrayIconType::INDICATOR) { QString indicateName = key; int flagIndex = indicateName.indexOf("indicator:"); if (flagIndex >= 0) indicateName = indicateName.right(indicateName.length() - QString("indicator:").length()); IndicatorTrayItem *indicatorWidget = new IndicatorTrayItem(indicateName, parent); - connect(indicatorWidget, &IndicatorTrayItem::removed, this, [ = ]{ - Q_EMIT removeRow(index); - }); + TrayModel *dataModel = qobject_cast(m_listView->model()); + if (IndicatorTrayItem *sourceIndicatorWidget = dataModel->indicatorWidget(key)) { + const QByteArray pixmapData = sourceIndicatorWidget->pixmapData(); + if (!pixmapData.isEmpty()) + indicatorWidget->setPixmapData(pixmapData); + const QString text = sourceIndicatorWidget->text(); + if (!text.isEmpty()) + indicatorWidget->setText(text); + } trayWidget = indicatorWidget; } + if (trayWidget) + trayWidget->setFixedSize(16, 16); + return trayWidget; } +void TrayDelegate::onRequestDrag(bool on) +{ + ExpandIconWidget *expandwidget = expandWidget(); + if (!expandwidget) + return; + + if (on) { + expandwidget->setTrayPanelVisible(true); + } else { + // 如果释放鼠标,则判断当前鼠标的位置是否在托盘内部,如果在,则无需隐藏 + QPoint currentPoint = QCursor::pos(); + QWidget *view = expandwidget->popupTrayView(); + expandwidget->setTrayPanelVisible(view->geometry().contains(currentPoint)); + } +} + void TrayDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { BaseTrayWidget *widget = static_cast(editor); @@ -128,5 +145,67 @@ void TrayDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewI { Q_UNUSED(index); QRect rect = option.rect; - editor->setGeometry(rect.x() + ITEM_SPACING, rect.y() + ITEM_SPACING, ITEM_SIZE - (2 * ITEM_SPACING), ITEM_SIZE - 2 * ITEM_SPACING); + // 让控件居中显示 + editor->setGeometry(rect.x() + (rect.width() - ICON_SIZE) / 2, + rect.y() + (rect.height() - ICON_SIZE) / 2, + ICON_SIZE, ICON_SIZE); +} + +void TrayDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + if (needDrawBackground()) { + QColor borderColor; + QColor backColor; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { + // 白色主题的情况下 + borderColor = Qt::black; + borderColor.setAlpha(static_cast(255 * 0.05)); + backColor = Qt::white; + backColor.setAlpha(static_cast(255 * 0.4)); + } else { + borderColor = Qt::black; + borderColor.setAlpha(static_cast(255 * 0.2)); + backColor = Qt::black; + backColor.setAlpha(static_cast(255 * 0.4)); + } + painter->save(); + QPainterPath path; + path.addRoundedRect(option.rect, 8, 8); + painter->setRenderHint(QPainter::Antialiasing); + painter->fillPath(path, backColor); + painter->setPen(borderColor); + painter->drawPath(path); + painter->restore(); + } +} + +ExpandIconWidget *TrayDelegate::expandWidget() +{ + if (!m_listView) + return nullptr; + + QAbstractItemModel *dataModel = m_listView->model(); + if (!dataModel) + return nullptr; + + for (int i = 0; i < dataModel->rowCount() - 1; i++) { + QModelIndex index = dataModel->index(i, 0); + ExpandIconWidget *widget = qobject_cast(m_listView->indexWidget(index)); + if (widget) + return widget; + } + + return nullptr; +} + +bool TrayDelegate::needDrawBackground() const +{ + if (!m_listView) + return false; + + TrayModel *dataModel = qobject_cast(m_listView->model()); + if (!dataModel) + return false; + + return dataModel->isIconTray(); } diff --git a/frame/window/tray/tray_delegate.h b/frame/window/tray/tray_delegate.h index 294153029..85125819e 100644 --- a/frame/window/tray/tray_delegate.h +++ b/frame/window/tray/tray_delegate.h @@ -26,31 +26,44 @@ #include #define ITEM_SIZE 30 +// 托盘图标固定16个像素 +#define ICON_SIZE 16 #define ITEM_SPACING 5 struct WinInfo; +class ExpandIconWidget; +class QListView; class TrayDelegate : public QStyledItemDelegate { Q_OBJECT +public: + explicit TrayDelegate(QListView *view, QObject *parent = nullptr); + void setPositon(Dock::Position position); + Q_SIGNALS: void removeRow(const QModelIndex &) const; void visibleChanged(const QModelIndex &, bool) const; void requestDrag(bool) const; -public: - explicit TrayDelegate(QObject *parent = nullptr); - void setPositon(Dock::Position position); +private Q_SLOTS: + void onRequestDrag(bool on); protected: QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; void setEditorData(QWidget *editor, const QModelIndex &index) const override ; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + +private: + ExpandIconWidget *expandWidget(); + bool needDrawBackground() const; private: Dock::Position m_position; + QListView *m_listView; }; #endif // TRAYDELEGATE_H diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index cb5247e7b..f346d04d4 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "tray_gridview.h" #include @@ -23,10 +43,66 @@ TrayGridView::TrayGridView(QWidget *parent) , m_aniStartTime(new QTimer(this)) , m_pressed(false) , m_aniRunning(false) + , m_positon(Dock::Position::Bottom) { initUi(); } +void TrayGridView::setPosition(Dock::Position position) +{ + m_positon = position; +} + +QSize TrayGridView::suitableSize() const +{ + TrayModel *dataModel = qobject_cast(model()); + if (!dataModel) + return QSize(-1, -1); + + if (dataModel->isIconTray()) { + // 如果是托盘图标 + int width = 2; + int height = 0; + int count = dataModel->rowCount(); + if (count > 0) { + int columnCount = qMin(count, 3); + for (int i = 0; i < columnCount; i ++) { + QModelIndex index = dataModel->index(i, 0); + width += visualRect(index).width() + spacing() * 2; // 左右边距加上单元格宽度 + } + int rowCount = count / 3; + if (count % 3 > 0) + rowCount++; + for (int i = 0; i < rowCount; i++) { + QModelIndex index = dataModel->index(i * 3); + height += visualRect(index).height() + spacing() * 2; + } + } else { + width = spacing() * 2 + 30; + height = spacing() * 2 + 30; + } + return QSize(width, height); + } + if (m_positon == Dock::Position::Top || m_positon == Dock::Position::Bottom) { + int length = spacing() + 2; + for (int i = 0; i < dataModel->rowCount(); i++) { + QModelIndex index = dataModel->index(i, 0); + QRect indexRect = visualRect(index); + length += indexRect.width() + spacing(); + } + + return QSize(length, -1); + } + int height = spacing() + 2; + for (int i = 0; i < dataModel->rowCount(); i++) { + QModelIndex index = dataModel->index(i, 0); + QRect indexRect = visualRect(index); + height += indexRect.height() + spacing(); + } + + return QSize(-1, height); +} + void TrayGridView::setDragDistance(int pixel) { m_dragDistance = pixel; @@ -171,6 +247,9 @@ void TrayGridView::mousePressEvent(QMouseEvent *e) void TrayGridView::mouseMoveEvent(QMouseEvent *e) { + if (!m_pressed) + return DListView::mouseMoveEvent(e); + setState(QAbstractItemView::NoState); e->accept(); @@ -181,15 +260,22 @@ void TrayGridView::mouseMoveEvent(QMouseEvent *e) if (!index.isValid()) return DListView::mouseMoveEvent(e); - if (m_pressed && (qAbs(e->pos().x() - m_dragPos.x()) > m_dragDistance || + // 如果当前拖动的位置是托盘展开按钮,则不让其拖动 + TrayIconType iconType = index.data(TrayModel::Role::TypeRole).value(); + if (iconType == TrayIconType::EXPANDICON) + return DListView::mouseMoveEvent(e); + + if ((qAbs(e->pos().x() - m_dragPos.x()) > m_dragDistance || qAbs(e->pos().y() - m_dragPos.y()) > m_dragDistance)) { qDebug() << "start drag"; - beginDrag(Qt::CopyAction | Qt::MoveAction); + if (!beginDrag(Qt::CopyAction | Qt::MoveAction)) + DListView::mouseMoveEvent(e); } } void TrayGridView::mouseReleaseEvent(QMouseEvent *e) { + Q_UNUSED(e); m_pressed = false; } @@ -198,7 +284,7 @@ void TrayGridView::dragEnterEvent(QDragEnterEvent *e) const QModelIndex index = indexAt(e->pos()); if (model()->canDropMimeData(e->mimeData(), e->dropAction(), index.row(), - index.column(), QModelIndex())) + index.column(), index)) e->accept(); else e->ignore(); @@ -219,9 +305,13 @@ void TrayGridView::dragMoveEvent(QDragMoveEvent *e) if (m_aniRunning) return; + QModelIndex index = indexAt(e->pos()); + if (!model()->canDropMimeData(e->mimeData(), e->dropAction(), index.row(), + index.column(), index)) + return; + setState(QAbstractItemView::DraggingState); - QModelIndex index = indexAt(e->pos()); if (index.isValid()) { if (m_dropPos != indexRect(index).center()) { qDebug() << "update drop position: " << index.row(); @@ -233,6 +323,43 @@ void TrayGridView::dragMoveEvent(QDragMoveEvent *e) m_aniStartTime->start(); } +const QModelIndex TrayGridView::getIndexFromPos(QPoint currentPoint) const +{ + QModelIndex index = indexAt(currentPoint); + if (index.isValid()) + return index; + + if (model()->rowCount() == 0) + return index; + + // 如果在第一个之前,则认为拖到了第一个的位置 + QRect indexRect0 = visualRect(model()->index(0, 0)); + if (currentPoint.x() < indexRect0.x() || currentPoint.y() < indexRect0.y()) + return model()->index(0, 0); + + // 如果从指定的位置没有找到索引,则依次从每个index中查找,先横向查找 + for (int i = 1; i < model()->rowCount(); i++) { + QModelIndex lastIndex = model()->index(i - 1, 0); + QModelIndex currentIndex = model()->index(i, 0); + QRect lastIndexRect = visualRect(lastIndex); + QRect indexRect = visualRect(currentIndex); + if (lastIndexRect.x() + lastIndexRect.width() <= currentPoint.x() + && indexRect.x() >= currentPoint.x()) + return currentIndex; + } + // 如果鼠标位置刚好在上下两个索引中间 + for (int i = 0; i < model()->rowCount(); i++) { + QModelIndex currentIndex = model()->index(i, 0); + QRect indexRect = visualRect(currentIndex); + + if (currentPoint.y() >= indexRect.y() - spacing() && currentPoint.y() < indexRect.y() + && currentPoint.x() >= indexRect.x() - spacing() && currentPoint.x() < indexRect.x()) + return currentIndex; + } + + return QModelIndex(); +} + void TrayGridView::dropEvent(QDropEvent *e) { setState(DListView::NoState); @@ -245,39 +372,45 @@ void TrayGridView::dropEvent(QDropEvent *e) e->setDropAction(Qt::CopyAction); e->accept(); - TrayModel *m = qobject_cast(model()); - if (m) { + TrayModel *dataModel = qobject_cast(model()); + if (dataModel) { WinInfo info; info.type = static_cast(e->mimeData()->data("type").toInt()); info.key = static_cast(e->mimeData()->data("key")); info.winId = static_cast(e->mimeData()->data("winId").toInt()); info.servicePath = static_cast(e->mimeData()->data("servicePath")); - m->addRow(info); + QModelIndex targetIndex = getIndexFromPos(e->pos()); + if (targetIndex.isValid() && targetIndex.row() < dataModel->rowCount() - 1) { + // 如果拖动的位置是合法的位置,则让其插入到当前的位置 + dataModel->insertRow(targetIndex.row(), info); + } else { + // 在其他的情况下,让其插入到最后 + dataModel->addRow(info); + } } } else { e->ignore(); + DListView::dropEvent(e); } - - DListView::dropEvent(e); } -void TrayGridView::beginDrag(Qt::DropActions supportedActions) +bool TrayGridView::beginDrag(Qt::DropActions supportedActions) { QModelIndex modelIndex = indexAt(m_dragPos); TrayIconType trayType = modelIndex.data(TrayModel::Role::TypeRole).value(); // 展开图标不能移动 if (trayType == TrayIconType::EXPANDICON) - return; + return false; m_dropPos = indexRect(modelIndex).center(); TrayModel *listModel = qobject_cast(model()); if (!listModel) - return; + return false; BaseTrayWidget *widget = qobject_cast(indexWidget(modelIndex)); if (!widget) - return; + return false; auto pixmap = widget->icon(); @@ -315,7 +448,7 @@ void TrayGridView::beginDrag(Qt::DropActions supportedActions) Q_EMIT dragEntered(); if (dropAct == Qt::IgnoreAction) { QPropertyAnimation *posAni = new QPropertyAnimation(pixLabel, "pos", pixLabel); - connect(posAni, &QPropertyAnimation::finished, [&, listModel, pixLabel] () { + connect(posAni, &QPropertyAnimation::finished, [ &, listModel, pixLabel ] () { pixLabel->hide(); pixLabel->deleteLater(); listModel->setDragKey(QString()); @@ -339,6 +472,8 @@ void TrayGridView::beginDrag(Qt::DropActions supportedActions) Q_EMIT requestRemove(itemKey); } + + return true; } void TrayGridView::initUi() diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h index 0009370a4..fee65b42e 100644 --- a/frame/window/tray/tray_gridview.h +++ b/frame/window/tray/tray_gridview.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef TRAYGRIDVIEW_H #define TRAYGRIDVIEW_H @@ -14,8 +34,10 @@ class TrayGridView : public DListView Q_OBJECT public: - TrayGridView(QWidget *parent = Q_NULLPTR); + explicit TrayGridView(QWidget *parent = Q_NULLPTR); + void setPosition(Dock::Position position); + QSize suitableSize() const; void setDragDistance(int pixel); void setAnimationProperty(const QEasingCurve::Type easing, const int duringTime = 250); void moveAnimation(); @@ -40,11 +62,12 @@ protected: void dragLeaveEvent(QDragLeaveEvent *e) Q_DECL_OVERRIDE; void dragMoveEvent(QDragMoveEvent *e) Q_DECL_OVERRIDE; void dropEvent(QDropEvent *e) Q_DECL_OVERRIDE; - void beginDrag(Qt::DropActions supportedActions); + bool beginDrag(Qt::DropActions supportedActions); private: void initUi(); void createAnimation(const int pos, const bool moveNext, const bool isLastAni); + const QModelIndex getIndexFromPos(QPoint currentPoint) const; private: QEasingCurve::Type m_aniCurveType; @@ -58,6 +81,7 @@ private: QTimer *m_aniStartTime; bool m_pressed; bool m_aniRunning; + Dock::Position m_positon; }; #endif // GRIDVIEW_H diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index b878ffb86..2640eb7d3 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -1,4 +1,24 @@ -#include "tray_model.h" +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "tray_model.h" #include "tray_monitor.h" #include "indicatortrayitem.h" @@ -104,6 +124,16 @@ bool TrayModel::indexDragging(const QModelIndex &index) const || (start >= end && current <= start && current >= end); } +IndicatorTrayItem *TrayModel::indicatorWidget(const QString &indicatorName) const +{ + QString indicatorKey = indicatorName; + indicatorKey = indicatorKey.remove(0, QString("indicator:").length()); + if (m_indicatorMap.contains(indicatorKey)) + return m_indicatorMap.value(indicatorKey)->widget(); + + return nullptr; +} + QMimeData *TrayModel::mimeData(const QModelIndexList &indexes) const { Q_ASSERT(indexes.size() == 1); @@ -132,7 +162,7 @@ QVariant TrayModel::data(const QModelIndex &index, int role) const return QVariant(); int itemIndex = index.row(); - auto info = m_winInfos.at(itemIndex); + const WinInfo &info = m_winInfos[itemIndex]; switch (role) { case Role::TypeRole: @@ -170,7 +200,10 @@ bool TrayModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, in Q_UNUSED(action) Q_UNUSED(row) Q_UNUSED(column) - Q_UNUSED(parent) + + TrayIconType iconType = parent.data(TrayModel::Role::TypeRole).value(); + if (iconType == TrayIconType::EXPANDICON) + return false; return data->formats().contains(TRAY_DRAG_FALG); } @@ -186,7 +219,6 @@ Qt::ItemFlags TrayModel::flags(const QModelIndex &index) const int TrayModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); - return m_winInfos.size(); } @@ -204,7 +236,7 @@ void TrayModel::clear() void TrayModel::onXEmbedTrayAdded(quint32 winId) { - for (auto info : m_winInfos) { + for (const WinInfo &info : m_winInfos) { if (info.winId == winId) return; } @@ -260,7 +292,7 @@ QString TrayModel::fileNameByServiceName(const QString &serviceName) bool TrayModel::isTypeWriting(const QString &servicePath) { const QString appFilePath = fileNameByServiceName(servicePath); - return appFilePath.startsWith("/usr/bin/fcitx"); + return (appFilePath.startsWith("/usr/bin/fcitx") || appFilePath.endsWith("chinime-qim")); } void TrayModel::onSniTrayAdded(const QString &servicePath) @@ -304,7 +336,7 @@ void TrayModel::onSniTrayAdded(const QString &servicePath) void TrayModel::onSniTrayRemoved(const QString &servicePath) { - for (WinInfo info : m_winInfos) { + for (const WinInfo &info : m_winInfos) { if (info.servicePath == servicePath) { int index = m_winInfos.indexOf(info); @@ -356,7 +388,7 @@ void TrayModel::onIndicatorFounded(const QString &indicatorName) void TrayModel::onIndicatorAdded(const QString &indicatorName) { const QString &itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); - for (auto info : m_winInfos) { + for (const WinInfo &info : m_winInfos) { if (info.key == itemKey) return; } @@ -377,7 +409,7 @@ void TrayModel::onIndicatorRemoved(const QString &indicatorName) void TrayModel::removeRow(const QString &itemKey) { - for (auto info : m_winInfos) { + for (const WinInfo &info : m_winInfos) { if (info.key == itemKey) { int index = m_winInfos.indexOf(info); beginRemoveRows(QModelIndex(), index, index); @@ -390,8 +422,8 @@ void TrayModel::removeRow(const QString &itemKey) void TrayModel::addRow(WinInfo info) { - for (auto i : m_winInfos) { - if (i.key == info.key) + for (const WinInfo &winInfo : m_winInfos) { + if (winInfo.key == info.key) return; } @@ -400,10 +432,26 @@ void TrayModel::addRow(WinInfo info) endInsertRows(); } +void TrayModel::insertRow(int index, WinInfo info) +{ + for (int i = 0; i < m_winInfos.size(); i++) { + const WinInfo &wininfo = m_winInfos[i]; + if (wininfo.key == info.key) { + beginResetModel(); + m_winInfos.swap(index, i); + endResetModel(); + return; + } + } + beginInsertRows(QModelIndex(), index, index); + m_winInfos.insert(index, info); + endInsertRows(); +} + bool TrayModel::exist(const QString &itemKey) { - for (auto w : m_winInfos) { - if (w.key == itemKey) + for (const WinInfo &winInfo : m_winInfos) { + if (winInfo.key == itemKey) return true; } diff --git a/frame/window/tray/tray_model.h b/frame/window/tray/tray_model.h index 3a09e5128..893c3f203 100644 --- a/frame/window/tray/tray_model.h +++ b/frame/window/tray/tray_model.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef TRAYMODEL_H #define TRAYMODEL_H @@ -7,6 +27,7 @@ class TrayMonitor; class IndicatorPlugin; +class IndicatorTrayItem; enum TrayIconType { UNKNOW, @@ -23,13 +44,12 @@ struct WinInfo { QString servicePath; bool isTypeWriting; - WinInfo() { - type = UNKNOW; - key = QString(); - winId = 0; - servicePath = QString(); - isTypeWriting = false; - } + WinInfo() : type(UNKNOW) + , key(QString()) + , winId(0) + , servicePath(QString()) + , isTypeWriting(false) {} + bool operator==(const WinInfo &other) { return this->type == other.type && this->key == other.key @@ -67,19 +87,22 @@ public: bool indexDragging(const QModelIndex &index) const; + IndicatorTrayItem *indicatorWidget(const QString &indicatorName) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; bool isIconTray(); void clear(); -public Q_SLOTS: - void removeRow(const QString &itemKey); - void addRow(WinInfo info); - Q_SIGNALS: void requestUpdateIcon(quint32); void requestUpdateWidget(const QList &); +public Q_SLOTS: + void removeRow(const QString &itemKey); + void addRow(WinInfo info); + void insertRow(int index, WinInfo info); + private Q_SLOTS: void onXEmbedTrayAdded(quint32 winId); void onXEmbedTrayRemoved(quint32 winId); diff --git a/frame/window/tray/tray_monitor.cpp b/frame/window/tray/tray_monitor.cpp index 6a45ff5e2..bb92f9dbc 100644 --- a/frame/window/tray/tray_monitor.cpp +++ b/frame/window/tray/tray_monitor.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "tray_monitor.h" TrayMonitor::TrayMonitor(QObject *parent) diff --git a/frame/window/tray/tray_monitor.h b/frame/window/tray/tray_monitor.h index 3a413126c..de2ee566d 100644 --- a/frame/window/tray/tray_monitor.h +++ b/frame/window/tray/tray_monitor.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef TRAYMONITOR_H #define TRAYMONITOR_H @@ -14,12 +34,6 @@ class TrayMonitor : public QObject public: explicit TrayMonitor(QObject *parent = nullptr); -public Q_SLOTS: - void onTrayIconsChanged(); - void onSniItemsChanged(); - - void startLoadIndicators(); - Q_SIGNALS: void requestUpdateIcon(quint32); void xEmbedTrayAdded(quint32); @@ -30,6 +44,12 @@ Q_SIGNALS: void indicatorFounded(const QString &); +public Q_SLOTS: + void onTrayIconsChanged(); + void onSniItemsChanged(); + + void startLoadIndicators(); + private: DBusTrayManager *m_trayInter; StatusNotifierWatcher *m_sniWatcher; diff --git a/frame/window/tray/widgets/basetraywidget.cpp b/frame/window/tray/widgets/basetraywidget.cpp index 9cb0ddccf..f17ebda96 100644 --- a/frame/window/tray/widgets/basetraywidget.cpp +++ b/frame/window/tray/widgets/basetraywidget.cpp @@ -1,9 +1,9 @@ /* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. * - * Author: sbw + * Author: donghualin * - * Maintainer: sbw + * Maintainer: donghualin * * 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 @@ -18,7 +18,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - #include "constants.h" #include "basetraywidget.h" @@ -40,7 +39,6 @@ BaseTrayWidget::BaseTrayWidget(QWidget *parent, Qt::WindowFlags f) BaseTrayWidget::~BaseTrayWidget() { - } void BaseTrayWidget::mousePressEvent(QMouseEvent *event) @@ -60,7 +58,6 @@ void BaseTrayWidget::mousePressEvent(QMouseEvent *event) void BaseTrayWidget::mouseReleaseEvent(QMouseEvent *e) { //e->accept(); - // 由于 XWindowTrayWidget 中对 发送鼠标事件到X窗口的函数, 如 sendClick/sendHoverEvent 中 // 使用了 setX11PassMouseEvent, 而每次调用 setX11PassMouseEvent 时都会导致产生 mousePress 和 mouseRelease 事件 // 因此如果直接在这里处理事件会导致一些问题, 所以使用 Timer 来延迟处理 100 毫秒内的最后一个事件 diff --git a/frame/window/tray/widgets/basetraywidget.h b/frame/window/tray/widgets/basetraywidget.h index 6f3124c20..d5e6c38ca 100644 --- a/frame/window/tray/widgets/basetraywidget.h +++ b/frame/window/tray/widgets/basetraywidget.h @@ -1,9 +1,9 @@ /* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. * - * Author: sbw + * Author: donghualin * - * Maintainer: sbw + * Maintainer: donghualin * * 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 @@ -18,7 +18,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - #pragma once #include diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 62bfd857c..2d7670ed3 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "expandiconwidget.h" #include "tray_gridview.h" #include "tray_model.h" @@ -6,7 +26,9 @@ #include #include +#include #include +#include #include @@ -16,17 +38,25 @@ ExpandIconWidget::ExpandIconWidget(QWidget *parent, Qt::WindowFlags f) : BaseTrayWidget(parent, f) , m_regionInter(new DRegionMonitor(this)) , m_position(Dock::Position::Bottom) - , m_trayView(nullptr) + , m_gridParentView(new RoundWidget(nullptr)) + , m_trayView(new TrayGridView(m_gridParentView)) + , m_trayDelegate(new TrayDelegate(m_trayView, m_trayView)) + , m_trayModel(new TrayModel(m_trayView, true, false)) { - connect(m_regionInter, &DRegionMonitor::buttonPress, this, &ExpandIconWidget::onGlobMousePress); + initUi(); + initConnection(); } ExpandIconWidget::~ExpandIconWidget() { + m_gridParentView->deleteLater(); } void ExpandIconWidget::setPositonValue(Dock::Position position) { + if (m_position == position) + return; + m_position = position; } @@ -38,19 +68,17 @@ void ExpandIconWidget::sendClick(uint8_t mouseButton, int x, int y) if (mouseButton != XCB_BUTTON_INDEX_1) return; - TrayGridView *trayIcon = popupTrayView(); - setTrayPanelVisible(!trayIcon->isVisible()); + setTrayPanelVisible(!m_gridParentView->isVisible()); } void ExpandIconWidget::setTrayPanelVisible(bool visible) { - TrayGridView *trayIcon = popupTrayView(); if (visible) { resetPosition(); - trayIcon->show(); + m_gridParentView->show(); m_regionInter->registerRegion(); } else { - trayIcon->hide(); + m_gridParentView->hide(); m_regionInter->unregisterRegion(); } } @@ -98,42 +126,9 @@ const QString ExpandIconWidget::dropIconFile() const return iconFile + ".svg"; } -TrayGridView *ExpandIconWidget::popupTrayView() +QWidget *ExpandIconWidget::popupTrayView() { - if (m_trayView) - return m_trayView; - - m_trayView = new TrayGridView(nullptr); - TrayModel *model = new TrayModel(m_trayView, true, false); - TrayDelegate *trayDelegate = new TrayDelegate(m_trayView); - m_trayView->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup); - m_trayView->setModel(model); - m_trayView->setItemDelegate(trayDelegate); - m_trayView->setSpacing(3); - m_trayView->setDragDistance(5); - - connect(m_trayView, &TrayGridView::rowCountChanged, this, [ this ] { - int count = m_trayView->model()->rowCount(); - if (count > 0) { - int lineCount = (count % 3) != 0 ? (count / 3 + 1) : (count / 3); - // 如果只有一行,则根据实际的数量显示宽度 - int columnCount = qMin(count, 3); - int width = ITEM_SIZE * columnCount + m_trayView->spacing() * 2;; - int height = lineCount * ITEM_SIZE + m_trayView->spacing() * (lineCount - 1) + ITEM_SPACING; - m_trayView->setFixedSize(width, height); - resetPosition(); - } else if (m_trayView->isVisible()) { - m_trayView->hide(); - } - Q_EMIT trayVisbleChanged(count > 0); - }); - - connect(trayDelegate, &TrayDelegate::removeRow, this, [ = ](const QModelIndex &index) { - QAbstractItemModel *abModel = model; - abModel->removeRow(index.row(),index.parent()); - }); - connect(m_trayView, &TrayGridView::requestRemove, model, &TrayModel::removeRow); - return m_trayView; + return m_gridParentView; } void ExpandIconWidget::resetPosition() @@ -141,27 +136,122 @@ void ExpandIconWidget::resetPosition() if (!parentWidget()) return; - TrayGridView *trayView = popupTrayView(); QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); - ptPos.setY(ptPos.y() - trayView->height()); - ptPos.setX(ptPos.x() - trayView->width()); - trayView->move(ptPos); + switch (m_position) { + case Dock::Position::Bottom: { + ptPos.setY(ptPos.y() - m_gridParentView->height()); + ptPos.setX(ptPos.x() - m_gridParentView->width()); + break; + } + case Dock::Position::Top: { + ptPos.setY(ptPos.y() + m_gridParentView->height()); + ptPos.setX(ptPos.x() - m_gridParentView->width()); + break; + } + case Dock::Position::Left: { + ptPos.setX(ptPos.x() + m_gridParentView->width() / 2); + break; + } + case Dock::Position::Right: { + ptPos.setX(ptPos.x() - m_gridParentView->width() / 2); + break; + } + } + m_gridParentView->move(ptPos); +} + +void ExpandIconWidget::initUi() +{ + m_gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); + m_trayView->setModel(m_trayModel); + m_trayView->setItemDelegate(m_trayDelegate); + m_trayView->setSpacing(ITEM_SPACING); + m_trayView->setDragDistance(2); + + QVBoxLayout *layout = new QVBoxLayout(m_gridParentView); + layout->setContentsMargins(ITEM_SPACING, ITEM_SPACING, ITEM_SPACING, ITEM_SPACING); + layout->setSpacing(0); + layout->addWidget(m_trayView); +} + +void ExpandIconWidget::initConnection() +{ + connect(m_trayView, &TrayGridView::rowCountChanged, this, &ExpandIconWidget::onRowCountChanged); + + connect(m_trayDelegate, &TrayDelegate::removeRow, this, [ = ](const QModelIndex &index) { + m_trayView->model()->removeRow(index.row(),index.parent()); + }); + connect(m_trayView, &TrayGridView::requestRemove, m_trayModel, &TrayModel::removeRow); + connect(m_regionInter, &DRegionMonitor::buttonPress, this, &ExpandIconWidget::onGlobMousePress); + + QMetaObject::invokeMethod(this, &ExpandIconWidget::onRowCountChanged, Qt::QueuedConnection); +} + +void ExpandIconWidget::onRowCountChanged() +{ + int count = m_trayModel->rowCount(); + m_trayView->setFixedSize(m_trayView->suitableSize()); + m_gridParentView->setFixedSize(m_trayView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2)); + if (count > 0) + resetPosition(); + else if (m_gridParentView->isVisible()) + m_gridParentView->hide(); + + Q_EMIT trayVisbleChanged(count > 0); } void ExpandIconWidget::onGlobMousePress(const QPoint &mousePos, const int flag) { - if (!isVisible() || !((flag == DRegionMonitor::WatchedFlags::Button_Left) || (flag == DRegionMonitor::WatchedFlags::Button_Right))) + // 如果当前是隐藏,那么在点击任何地方都隐藏 + if (!isVisible()) { + m_gridParentView->hide(); + return; + } + + if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) return; - TrayGridView *trayView = popupTrayView(); QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); const QRect rect = QRect(ptPos, size()); if (rect.contains(mousePos)) return; - const QRect rctView(trayView->pos(), trayView->size()); + const QRect rctView(m_gridParentView->pos(), m_gridParentView->size()); if (rctView.contains(mousePos)) return; - trayView->hide(); + m_gridParentView->hide(); +} + +/** + * @brief 圆角窗体的绘制 + * @param parent + */ +RoundWidget::RoundWidget(QWidget *parent) + : QWidget (parent) + , m_dockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) +{ + setAttribute(Qt::WA_TranslucentBackground); +} + +void RoundWidget::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + QPainterPath path; + path.addRoundedRect(rect(), 18, 18); + painter.setCompositionMode(QPainter::CompositionMode_Xor); + painter.setClipPath(path); + + painter.fillPath(path, maskColor()); +} + +QColor RoundWidget::maskColor() const +{ + QColor color = DGuiApplicationHelper::standardPalette(DGuiApplicationHelper::instance()->themeType()).window().color(); + int maskAlpha(static_cast(255 * m_dockInter->opacity())); + color.setAlpha(maskAlpha); + return color; } diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h index d9316d258..4208ffa20 100644 --- a/frame/window/tray/widgets/expandiconwidget.h +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -1,11 +1,36 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef EXPANDICONWIDGET_H #define EXPANDICONWIDGET_H #include "constants.h" #include "basetraywidget.h" +#include + class TrayGridView; class TrayModel; +class TrayDelegate; + +using DBusDock = com::deepin::dde::daemon::Dock; namespace Dtk { namespace Gui { class DRegionMonitor; } } @@ -13,9 +38,6 @@ class ExpandIconWidget : public BaseTrayWidget { Q_OBJECT -Q_SIGNALS: - void trayVisbleChanged(bool); - public: explicit ExpandIconWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); ~ExpandIconWidget() override; @@ -26,10 +48,14 @@ public: QString itemKeyForConfig() override { return "Expand"; } void updateIcon() override {} QPixmap icon() override; - TrayGridView *popupTrayView(); + QWidget *popupTrayView(); + +Q_SIGNALS: + void trayVisbleChanged(bool); private Q_SLOTS: void onGlobMousePress(const QPoint &mousePos, const int flag); + void onRowCountChanged(); protected: void paintEvent(QPaintEvent *e) override; @@ -37,10 +63,35 @@ protected: void resetPosition(); +private: + void initUi(); + void initConnection(); + private: Dtk::Gui::DRegionMonitor *m_regionInter; Dock::Position m_position; + QWidget *m_gridParentView; TrayGridView *m_trayView; + TrayDelegate *m_trayDelegate; + TrayModel *m_trayModel; +}; + +// 绘制圆角窗体 +class RoundWidget : public QWidget +{ + Q_OBJECT + +public: + explicit RoundWidget(QWidget *parent); + +protected: + void paintEvent(QPaintEvent *event) override; + +private: + QColor maskColor() const; + +private: + DBusDock *m_dockInter; }; #endif // EXPANDICONWIDGET_H diff --git a/frame/window/tray/widgets/indicatorplugin.cpp b/frame/window/tray/widgets/indicatorplugin.cpp index 2ee9793fc..7eea2536d 100644 --- a/frame/window/tray/widgets/indicatorplugin.cpp +++ b/frame/window/tray/widgets/indicatorplugin.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "indicatorplugin.h" #include @@ -148,17 +168,11 @@ void IndicatorPluginPrivate::initDBus(const QString &indicatorName) if (data.contains("text")) { featData("text", data, SLOT(textPropertyChanged(QDBusMessage)), [ = ](QVariant v) { -#ifdef QT_DEBUG // TODO - if (!v.toString().isEmpty()) { -#else if (v.toString().isEmpty()) { -#endif Q_EMIT q->removed(); return; } - else { - Q_EMIT q->delayLoaded(); - } + Q_EMIT q->delayLoaded(); indicatorTrayWidget->setText(v.toString()); updateContent(); }); @@ -170,9 +184,7 @@ void IndicatorPluginPrivate::initDBus(const QString &indicatorName) Q_EMIT q->removed(); return; } - else { - Q_EMIT q->delayLoaded(); - } + Q_EMIT q->delayLoaded(); indicatorTrayWidget->setPixmapData(v.toByteArray()); updateContent(); }); @@ -181,7 +193,7 @@ void IndicatorPluginPrivate::initDBus(const QString &indicatorName) const QJsonObject action = config.value("action").toObject(); if (!action.isEmpty() && indicatorTrayWidget) q->connect(indicatorTrayWidget, &IndicatorTrayItem::clicked, q, [ = ](uint8_t button_index, int x, int y) { - /*std::thread t([=]() -> void { + std::thread t([ = ] ()-> void { auto triggerConfig = action.value("trigger").toObject(); auto dbusService = triggerConfig.value("dbus_service").toString(); auto dbusPath = triggerConfig.value("dbus_path").toString(); @@ -192,14 +204,9 @@ void IndicatorPluginPrivate::initDBus(const QString &indicatorName) QDBusInterface interface(dbusService, dbusPath, dbusInterface, bus); QDBusReply reply = interface.call(methodName, button_index, x, y); - if (!reply.isValid()) { - qDebug() << interface.call(methodName); - } - else { - qDebug() << reply.error(); - } + qDebug() << (reply.isValid() ? reply.error() : interface.call(methodName)); }); - t.detach();*/ + t.detach(); }); }); } diff --git a/frame/window/tray/widgets/indicatorplugin.h b/frame/window/tray/widgets/indicatorplugin.h index 81c1a81b0..3c649f70b 100644 --- a/frame/window/tray/widgets/indicatorplugin.h +++ b/frame/window/tray/widgets/indicatorplugin.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #pragma once #include "indicatortrayitem.h" diff --git a/frame/window/tray/widgets/indicatortrayitem.cpp b/frame/window/tray/widgets/indicatortrayitem.cpp index 6da397fee..b37a9a81c 100644 --- a/frame/window/tray/widgets/indicatortrayitem.cpp +++ b/frame/window/tray/widgets/indicatortrayitem.cpp @@ -20,7 +20,6 @@ */ #include "indicatortrayitem.h" -//#include "util/utils.h" #include #include @@ -39,7 +38,6 @@ IndicatorTrayItem::IndicatorTrayItem(const QString &indicatorName, QWidget *parent, Qt::WindowFlags f) : BaseTrayWidget(parent, f) , m_indicatorName(indicatorName) -// , m_gsettings(Utils::ModuleSettingsPtr("keyboard", QByteArray(), this)) , m_enableClick(true) { setAttribute(Qt::WA_TranslucentBackground); @@ -66,15 +64,6 @@ IndicatorTrayItem::IndicatorTrayItem(const QString &indicatorName, QWidget *pare interface, this, QDBusConnection::ExportScriptableSlots); - - initDBus(m_indicatorName); -// if (m_gsettings) { -// // 显示键盘布局时更新label的状态 -// if (m_gsettings->keys().contains("itemEnable")) -// enableLabel(m_gsettings->get("itemEnable").toBool()); - -// connect(m_gsettings, &QGSettings::changed, this, &IndicatorTrayWidget::onGSettingsChanged); -// } } IndicatorTrayItem::~IndicatorTrayItem() @@ -121,8 +110,19 @@ QPixmap IndicatorTrayItem::icon() return QPixmap(); } +const QByteArray &IndicatorTrayItem::pixmapData() const +{ + return m_pixmapData; +} + +const QString IndicatorTrayItem::text() const +{ + return m_label->text(); +} + void IndicatorTrayItem::setPixmapData(const QByteArray &data) { + m_pixmapData = data; auto rawPixmap = QPixmap::fromImage(QImage::fromData(data)); rawPixmap.setDevicePixelRatio(devicePixelRatioF()); m_label->setPixmap(rawPixmap); @@ -132,127 +132,3 @@ void IndicatorTrayItem::setText(const QString &text) { m_label->setText(text); } - -void IndicatorTrayItem::onGSettingsChanged(const QString &key) -{ - Q_UNUSED(key); - -// if (m_gsettings && m_gsettings->keys().contains("itemEnable")) { -// const bool itemEnable = m_gsettings->get("itemEnable").toBool(); -// enableLabel(itemEnable); - // } -} - -template -void IndicatorTrayItem::featData(const QString &key, - const QJsonObject &data, - const char *propertyChangedSlot, - Func const &callback) -{ - auto dataConfig = data.value(key).toObject(); - auto dbusService = dataConfig.value("dbus_service").toString(); - auto dbusPath = dataConfig.value("dbus_path").toString(); - auto dbusInterface = dataConfig.value("dbus_interface").toString(); - auto isSystemBus = dataConfig.value("system_dbus").toBool(false); - auto bus = isSystemBus ? QDBusConnection::systemBus() : QDBusConnection::sessionBus(); - - QDBusInterface interface(dbusService, dbusPath, dbusInterface, bus, this); - - if (dataConfig.contains("dbus_method")) { - QString methodName = dataConfig.value("dbus_method").toString(); - auto ratio = qApp->devicePixelRatio(); - QDBusReply reply = interface.call(methodName.toStdString().c_str(), ratio); - callback(reply.value()); - } - - qInfo() << dataConfig; - if (dataConfig.contains("dbus_properties")) { - auto propertyName = dataConfig.value("dbus_properties").toString(); - auto propertyNameCStr = propertyName.toStdString(); - //propertyInterfaceNames.insert(key, dbusInterface); - //propertyNames.insert(key, QString::fromStdString(propertyNameCStr)); - QDBusConnection::sessionBus().connect(dbusService, - dbusPath, - "org.freedesktop.DBus.Properties", - "PropertiesChanged", - "sa{sv}as", - this, - propertyChangedSlot); - - // FIXME(sbw): hack for qt dbus property changed signal. - // see: https://bugreports.qt.io/browse/QTBUG-48008 - QDBusConnection::sessionBus().connect(dbusService, - dbusPath, - dbusInterface, - QString("%1Changed").arg(propertyName), - "s", - this, - propertyChangedSlot); - - qInfo() << dbusService << dbusPath << dbusInterface; - qInfo() << propertyName << propertyNameCStr.c_str(); - callback(interface.property(propertyNameCStr.c_str())); - } -} - -void IndicatorTrayItem::initDBus(const QString &indicatorName) -{ - QString filepath = QString("/etc/dde-dock/indicator/%1.json").arg(indicatorName); - QFile confFile(filepath); - if (!confFile.open(QIODevice::ReadOnly)) { - qInfo() << "read indicator config Error"; - } - - QJsonDocument doc = QJsonDocument::fromJson(confFile.readAll()); - confFile.close(); - - QJsonObject config = doc.object(); - - auto delay = config.value("delay").toInt(0); - - QTimer::singleShot(delay, [ = ]() { - QJsonObject data = config.value("data").toObject(); - if (data.contains("text")) { - featData("text", data, SLOT(textPropertyChanged(QDBusMessage)), [ = ](QVariant v) { - if (v.toString().isEmpty()) { - Q_EMIT removed(); - return; - } - Q_EMIT delayLoaded(); - setText(v.toString()); - //updateContent(); - }); - } - - if (data.contains("icon")) { - featData("icon", data, SLOT(iconPropertyChanged(QDBusMessage)), [ = ](QVariant v) { - if (v.toByteArray().isEmpty()) { - Q_EMIT removed(); - return; - } - Q_EMIT delayLoaded(); - setPixmapData(v.toByteArray()); - //updateContent(); - }); - } - - const QJsonObject action = config.value("action").toObject(); - if (!action.isEmpty()) - connect(this, &IndicatorTrayItem::clicked, this, [ = ](uint8_t button_index, int x, int y) { - std::thread t([=]() -> void { - auto triggerConfig = action.value("trigger").toObject(); - auto dbusService = triggerConfig.value("dbus_service").toString(); - auto dbusPath = triggerConfig.value("dbus_path").toString(); - auto dbusInterface = triggerConfig.value("dbus_interface").toString(); - auto methodName = triggerConfig.value("dbus_method").toString(); - auto isSystemBus = triggerConfig.value("system_dbus").toBool(false); - auto bus = isSystemBus ? QDBusConnection::systemBus() : QDBusConnection::sessionBus(); - - QDBusInterface interface(dbusService, dbusPath, dbusInterface, bus); - interface.call(methodName, button_index, x, y); - }); - t.detach(); - }); - }); -} - diff --git a/frame/window/tray/widgets/indicatortrayitem.h b/frame/window/tray/widgets/indicatortrayitem.h index b687c011a..9bf8c1b06 100644 --- a/frame/window/tray/widgets/indicatortrayitem.h +++ b/frame/window/tray/widgets/indicatortrayitem.h @@ -32,10 +32,6 @@ class IndicatorTrayItem: public BaseTrayWidget { Q_OBJECT -Q_SIGNALS: - void removed(); - void delayLoaded(); - public: explicit IndicatorTrayItem(const QString &indicatorName, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); ~IndicatorTrayItem() override; @@ -47,27 +43,20 @@ public: static QString toIndicatorKey(const QString &indicatorName) { return QString("indicator:%1").arg(indicatorName); } static bool isIndicatorKey(const QString &itemKey) { return itemKey.startsWith("indicator:"); } QPixmap icon() override; + const QByteArray &pixmapData() const; + const QString text() const; public Q_SLOTS: Q_SCRIPTABLE void setPixmapData(const QByteArray &data); Q_SCRIPTABLE void setText(const QString &text); -private slots: - void onGSettingsChanged(const QString &key); - -private: - void initDBus(const QString &indicatorName); - template - void featData(const QString &key, const QJsonObject &data, const char *propertyChangedSlot, Func const &callback); - Q_SIGNALS: void clicked(uint8_t, int, int); private: QLabel *m_label; - QString m_indicatorName; -// const QGSettings *m_gsettings; bool m_enableClick; // 置灰时设置为false,不触发click信号 + QByteArray m_pixmapData; }; diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index a62579d8c..f963f7df5 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #include "traymanagerwindow.h" #include "quickpluginwindow.h" #include "tray_gridview.h" @@ -33,7 +53,9 @@ TrayManagerWindow::TrayManagerWindow(QWidget *parent) , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) , m_trayView(new TrayGridView(this)) , m_model(new TrayModel(m_trayView, false, true)) + , m_delegate(new TrayDelegate(m_trayView, m_trayView)) , m_postion(Dock::Position::Bottom) + , m_splitLine(new QLabel(m_appPluginDatetimeWidget)) { initUi(); initConnection(); @@ -52,42 +74,48 @@ void TrayManagerWindow::setPositon(Dock::Position position) return; m_postion = position; + + if (position == Dock::Position::Top || position == Dock::Position::Bottom) + m_trayView->setOrientation(QListView::Flow::LeftToRight, false); + else + m_trayView->setOrientation(QListView::Flow::TopToBottom, false); + QModelIndex index = m_model->index(0, 0); m_trayView->closePersistentEditor(index); TrayDelegate *delegate = static_cast(m_trayView->itemDelegate()); delegate->setPositon(position); m_trayView->openPersistentEditor(index); + m_trayView->setPosition(position); m_quickIconWidget->setPositon(position); m_dateTimeWidget->setPositon(position); m_systemPluginWidget->setPositon(position); - QTimer::singleShot(0, this, [ this ]{ + QMetaObject::invokeMethod(this, [ this ]{ if (showSingleRow()) resetSingleDirection(); else resetMultiDirection(); resetChildWidgetSize(); - }); + }, Qt::QueuedConnection); } int TrayManagerWindow::appDatetimeSize() { - int count = m_trayView->model()->rowCount(); if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) { - QMargins m = m_appDatetimeLayout->contentsMargins(); - int trayWidth = count * ITEM_SIZE + m_trayView->spacing() * (count - 1) + 5; - int topWidth = trayWidth + m_quickIconWidget->suitableSize().width() + m.left() + m.right() + m_appPluginLayout->spacing(); - int spacing = m.left() + m.right() + m_appPluginLayout->spacing(); - if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) - return topWidth + m_appDatetimeLayout->spacing() + m_dateTimeWidget->suitableSize().width() + m_appDatetimeLayout->spacing() + 10; - + // 如果是一行 + if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) { + return m_trayView->suitableSize().width() + m_quickIconWidget->suitableSize().width() + + m_dateTimeWidget->suitableSize().width(); + } + //如果是两行 + int topWidth = m_trayView->suitableSize().width() + m_quickIconWidget->width(); int bottomWidth = m_dateTimeWidget->suitableSize().width(); - return (topWidth > bottomWidth ? topWidth : bottomWidth) + m_appDatetimeLayout->spacing() + spacing + 10; + return qMax(topWidth, bottomWidth); } - int trayHeight = count * ITEM_SIZE + m_trayView->spacing() * (count - 1) + 5; + int trayHeight = m_trayView->suitableSize().height(); int datetimeHeight = m_dateTimeWidget->suitableSize().height(); QMargins m = m_appDatetimeLayout->contentsMargins(); int traypluginHeight = trayHeight + m_quickIconWidget->suitableSize().height() + m.top() + m.bottom() + m_appPluginLayout->spacing(); @@ -124,9 +152,17 @@ void TrayManagerWindow::resizeEvent(QResizeEvent *event) void TrayManagerWindow::initUi() { - TrayDelegate *delegate = new TrayDelegate(m_trayView); m_trayView->setModel(m_model); - m_trayView->setItemDelegate(delegate); + m_trayView->setItemDelegate(m_delegate); + m_trayView->setDragDistance(2); + + m_splitLine->setFixedHeight(1); + QPalette pal; + QColor lineColor(Qt::black); + lineColor.setAlpha(static_cast(255 * 0.2)); + pal.setColor(QPalette::Background, lineColor); + m_splitLine->setAutoFillBackground(true); + m_splitLine->setPalette(pal); WinInfo info; info.type = TrayIconType::EXPANDICON; @@ -139,6 +175,7 @@ void TrayManagerWindow::initUi() m_appPluginDatetimeWidget->setMaskAlpha(uint8_t(0.1 * 255)); m_appPluginDatetimeWidget->installEventFilter(this); + m_appPluginLayout->setContentsMargins(0, 0, 0, 0); m_appPluginLayout->setSpacing(0); m_appPluginWidget->setLayout(m_appPluginLayout); m_appPluginLayout->addWidget(m_trayView); @@ -146,8 +183,9 @@ void TrayManagerWindow::initUi() m_appPluginDatetimeWidget->setLayout(m_appDatetimeLayout); m_appDatetimeLayout->setContentsMargins(0, 0, 0, 0); - m_appDatetimeLayout->setSpacing(3); + m_appDatetimeLayout->setSpacing(0); m_appDatetimeLayout->addWidget(m_appPluginWidget); + m_appDatetimeLayout->addWidget(m_splitLine); m_appDatetimeLayout->addWidget(m_dateTimeWidget); m_systemPluginWidget->setBlurRectXRadius(10); @@ -157,7 +195,7 @@ void TrayManagerWindow::initUi() setLayout(m_mainLayout); m_mainLayout->setContentsMargins(8, 8, 8, 8); - m_mainLayout->setSpacing(10); + m_mainLayout->setSpacing(7); m_mainLayout->addWidget(m_appPluginDatetimeWidget); m_mainLayout->addWidget(m_systemPluginWidget); } @@ -165,8 +203,20 @@ void TrayManagerWindow::initUi() void TrayManagerWindow::initConnection() { connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); - connect(m_trayView, &TrayGridView::rowCountChanged, this, &TrayManagerWindow::sizeChanged); + connect(m_trayView, &TrayGridView::rowCountChanged, this, [ this ] { + if (m_quickIconWidget->x() == 0) { + // 在加载界面的时候,会出现快捷设置区域的图标和左侧的托盘图标挤在一起(具体原因未知),此时需要延时50毫秒重新刷新界面来保证界面布局正常(临时解决方案) + QTimer::singleShot(50, this, [ this ] { + resetChildWidgetSize(); + Q_EMIT sizeChanged(); + }); + } else { + resetChildWidgetSize(); + Q_EMIT sizeChanged(); + } + }); connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, [ this ] { + // 当插件数量发生变化的时候,需要调整尺寸 m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) m_quickIconWidget->setFixedWidth(m_quickIconWidget->suitableSize().width()); @@ -177,6 +227,7 @@ void TrayManagerWindow::initConnection() }); connect(m_systemPluginWidget, &SystemPluginWindow::pluginSizeChanged, this, [ this ] { + // 当系统插件发生变化的时候,同样需要调整尺寸 m_systemPluginWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) m_systemPluginWidget->setFixedWidth(m_systemPluginWidget->suitableSize().width()); @@ -186,18 +237,17 @@ void TrayManagerWindow::initConnection() Q_EMIT sizeChanged(); }); - TrayDelegate *trayDelegate = static_cast(m_trayView->itemDelegate()); - connect(trayDelegate, &TrayDelegate::visibleChanged, this, [ this ](const QModelIndex &index, bool visible) { + connect(m_delegate, &TrayDelegate::visibleChanged, this, [ this ](const QModelIndex &index, bool visible) { m_trayView->setRowHidden(index.row(), !visible); resetChildWidgetSize(); Q_EMIT sizeChanged(); }); - connect(m_trayView, &TrayGridView::dragLeaved, trayDelegate, [ trayDelegate ]{ - Q_EMIT trayDelegate->requestDrag(true); + connect(m_trayView, &TrayGridView::dragLeaved, m_delegate, [ this ]{ + Q_EMIT m_delegate->requestDrag(true); }); - connect(m_trayView, &TrayGridView::dragEntered, trayDelegate, [ trayDelegate ]{ - Q_EMIT trayDelegate->requestDrag(false); + connect(m_trayView, &TrayGridView::dragEntered, m_delegate, [ this ]{ + Q_EMIT m_delegate->requestDrag(false); }); connect(m_model, &TrayModel::requestUpdateWidget, this, [ this ](const QList &idxs) { for (int i = 0; i < idxs.size(); i++) { @@ -235,7 +285,7 @@ void TrayManagerWindow::resetChildWidgetSize() switch (m_postion) { case Dock::Position::Top: case Dock::Position::Bottom: { - int trayWidth = count * ITEM_SIZE + m_trayView->spacing() * (count - 1) + 5; + int trayWidth = m_trayView->suitableSize().width(); QMargins m = m_appPluginLayout->contentsMargins(); m_appPluginDatetimeWidget->setFixedHeight(QWIDGETSIZE_MAX);// 取消固定高度显示 if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) { @@ -243,37 +293,33 @@ void TrayManagerWindow::resetChildWidgetSize() int trayHeight = m_appPluginDatetimeWidget->height() - m.top() - m.bottom(); m_trayView->setFixedSize(trayWidth, trayHeight); m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); + m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), trayHeight); m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), trayHeight); } else { // 多行显示 int trayHeight = m_appPluginDatetimeWidget->height() / 2 - m.top() - m.bottom(); m_trayView->setFixedSize(trayWidth, trayHeight); m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); - m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), m_appPluginDatetimeWidget->height() / 2); + m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), trayHeight); + // 因为是两行,所以对于时间控件的尺寸,只能设置最小值 + m_dateTimeWidget->setMinimumSize(m_dateTimeWidget->suitableSize().width(), m_appPluginDatetimeWidget->height() / 2); } m_appPluginDatetimeWidget->setFixedWidth(appDatetimeSize()); break; } case Dock::Position::Left: case Dock::Position::Right: { - int trayHeight = count * ITEM_SIZE + m_trayView->spacing() * (count - 1) + 5; + int trayHeight = m_trayView->suitableSize().height(); int quickAreaHeight = m_quickIconWidget->suitableSize().height(); QMargins m = m_appPluginLayout->contentsMargins(); m_appPluginDatetimeWidget->setFixedWidth(QWIDGETSIZE_MAX);// 取消固定宽度显示 - if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::TopToBottom) { - // 宽度较小的情况下,显示一列 - int datetimeHeight = m_dateTimeWidget->suitableSize().height(); - int sizeWidth = m_appPluginDatetimeWidget->width() - m.left() - m.right(); - m_trayView->setFixedSize(sizeWidth, trayHeight); - m_quickIconWidget->setFixedSize(sizeWidth, quickAreaHeight); - m_dateTimeWidget->setFixedSize(sizeWidth, datetimeHeight); - } else { - // 显示两列 - int trayWidth = m_appPluginDatetimeWidget->width() / 2 - m.left() - m.right(); - m_trayView->setFixedSize(trayWidth, trayHeight); - m_quickIconWidget->setFixedSize(trayWidth, quickAreaHeight); - m_dateTimeWidget->setFixedSize(m_appPluginDatetimeWidget->width() / 2, m_dateTimeWidget->suitableSize().height()); - } + // 左右方向始终只有一列 + int datetimeHeight = m_dateTimeWidget->suitableSize().height(); + int sizeWidth = m_appPluginDatetimeWidget->width() - m.left() - m.right(); + m_trayView->setFixedSize(sizeWidth, trayHeight); + m_quickIconWidget->setFixedSize(sizeWidth, quickAreaHeight); + m_dateTimeWidget->setFixedSize(sizeWidth, datetimeHeight); + m_appPluginWidget->setFixedSize(sizeWidth, trayHeight + quickAreaHeight); m_appPluginDatetimeWidget->setFixedHeight(appDatetimeSize()); break; } @@ -283,33 +329,19 @@ void TrayManagerWindow::resetChildWidgetSize() void TrayManagerWindow::resetSingleDirection() { switch (m_postion) { - case Dock::Position::Top: { + case Dock::Position::Top: + case Dock::Position::Bottom: { m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); // 应用和时间在一行显示 m_appDatetimeLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_appPluginLayout->setContentsMargins(2, 2, 2, 4); break; } - case Dock::Position::Bottom: { - m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_appDatetimeLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_appPluginLayout->setContentsMargins(2, 4, 2, 2); - break; - } - case Dock::Position::Left: { + case Dock::Position::Left: + case Dock::Position::Right:{ m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_appPluginLayout->setContentsMargins(2, 2, 4, 2); - break; - } - case Dock::Position::Right: { - m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_appPluginLayout->setContentsMargins(4, 2, 2, 2); break; } } @@ -322,28 +354,19 @@ void TrayManagerWindow::resetMultiDirection() m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::BottomToTop); m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_appPluginLayout->setContentsMargins(2, 2, 2, 4); break; } case Dock::Position::Bottom: { m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_appPluginLayout->setContentsMargins(2, 4, 2, 2); - break; - } - case Dock::Position::Left: { - m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_appPluginLayout->setContentsMargins(2, 2, 4, 2); break; } + case Dock::Position::Left: case Dock::Position::Right: { m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_appPluginLayout->setContentsMargins(4, 2, 2, 2); break; } } @@ -363,16 +386,16 @@ void TrayManagerWindow::dragMoveEvent(QDragMoveEvent *e) void TrayManagerWindow::dropEvent(QDropEvent *e) { - CustomMimeData *mimeData = const_cast(qobject_cast(e->mimeData())); + const QuickPluginMimeData *mimeData = qobject_cast(e->mimeData()); if (!mimeData) return; if (e->source() == this) return; - QuickSettingItem *pluginItem = static_cast(mimeData->data()); + QuickSettingItem *pluginItem = static_cast(mimeData->quickSettingItem()); if (pluginItem) - m_quickIconWidget->addPlugin(pluginItem); + m_quickIconWidget->dragPlugin(pluginItem); } void TrayManagerWindow::dragLeaveEvent(QDragLeaveEvent *event) diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 80da2deb6..8892ff0dc 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ #ifndef TRAYMANAGERWINDOW_H #define TRAYMANAGERWINDOW_H @@ -18,6 +38,7 @@ class QuickPluginWindow; class QBoxLayout; class TrayGridView; class TrayModel; +class TrayDelegate; class SystemPluginWindow; class QLabel; class QDropEvent; @@ -66,7 +87,9 @@ private: QBoxLayout *m_mainLayout; TrayGridView *m_trayView; TrayModel *m_model; + TrayDelegate *m_delegate; Dock::Position m_postion; + QLabel *m_splitLine; }; #endif // PLUGINWINDOW_H From fdfe0ba05c8c0c69d012b41d53b8dba5572758c5 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 20 May 2022 11:11:45 +0800 Subject: [PATCH 009/257] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E9=BC=A0=E6=A0=87=E6=94=BE=E5=88=B0=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4=E6=8E=A7=E4=BB=B6=E4=B8=8A=E4=B8=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BD=93=E5=89=8D=E6=97=B6=E9=97=B4=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、增加当前时间的显示 2、实时更新任务栏的时间显示 Log: Influence: 任务栏V23,查看插件区域时间的显示 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: I5cb1eb778c2351555cd736fb62525e130a13e3ff --- frame/window/components/datetimedisplayer.cpp | 219 ++++++++++++++---- frame/window/components/datetimedisplayer.h | 33 ++- 2 files changed, 203 insertions(+), 49 deletions(-) diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index 5c82eef69..2b067992d 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -19,6 +19,8 @@ * along with this program. If not, see . */ #include "datetimedisplayer.h" +#include "tipswidget.h" +#include "dockpopupwindow.h" #include #include @@ -28,6 +30,7 @@ #include DWIDGET_USE_NAMESPACE +DGUI_USE_NAMESPACE #define DATETIMESIZE 40 #define ITEMSPACE 8 @@ -40,15 +43,27 @@ DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) : QWidget (parent) , m_timedateInter(new Timedate("com.deepin.daemon.Timedate", "/com/deepin/daemon/Timedate", QDBusConnection::sessionBus(), this)) , m_position(Dock::Position::Bottom) - , m_timeFont(DFontSizeManager::instance()->t6()) , m_dateFont(DFontSizeManager::instance()->t10()) + , m_tipsWidget(new Dock::TipsWidget(this)) + , m_tipsTimer(new QTimer(this)) + , m_currentSize(0) + , m_oneRow(false) { + m_tipPopupWindow.reset(new DockPopupWindow); // 日期格式变化的时候,需要重绘 - connect(m_timedateInter, &Timedate::ShortDateFormatChanged, this, [ this ] { update(); }); + connect(m_timedateInter, &Timedate::ShortDateFormatChanged, this, &DateTimeDisplayer::onDateTimeFormatChanged); // 时间格式变化的时候,需要重绘 - connect(m_timedateInter, &Timedate::ShortTimeFormatChanged, this, [ this ] { update(); }); + connect(m_timedateInter, &Timedate::ShortTimeFormatChanged, this, &DateTimeDisplayer::onDateTimeFormatChanged); + // 是否使用24小时制发生变化的时候,也需要重绘 + connect(m_timedateInter, &Timedate::Use24HourFormatChanged, this, &DateTimeDisplayer::onDateTimeFormatChanged); // 连接日期时间修改信号,更新日期时间插件的布局 - connect(m_timedateInter, &Timedate::TimeUpdate, this, [ this ] { update(); }); + connect(m_timedateInter, &Timedate::TimeUpdate, this, static_cast(&DateTimeDisplayer::update)); + // 连接定时器和时间显示的tips信号,一秒钟触发一次,显示时间 + connect(m_tipsTimer, &QTimer::timeout, this, &DateTimeDisplayer::onTimeChanged); + m_tipsTimer->setInterval(1000); + m_tipsTimer->start(); + updatePolicy(); + m_tipPopupWindow->hide(); } DateTimeDisplayer::~DateTimeDisplayer() @@ -61,21 +76,41 @@ void DateTimeDisplayer::setPositon(Dock::Position position) return; m_position = position; - setCurrentPolicy(); + updatePolicy(); update(); } -void DateTimeDisplayer::setCurrentPolicy() +void DateTimeDisplayer::setOneRow(bool oneRow) +{ + m_oneRow = oneRow; + update(); +} + +void DateTimeDisplayer::updatePolicy() { switch (m_position) { - case Dock::Position::Top: - case Dock::Position::Bottom: { + case Dock::Position::Top: { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + m_tipPopupWindow->setArrowDirection(DArrowRectangle::ArrowDirection::ArrowTop); + m_tipPopupWindow->setContent(m_tipsWidget); + break; + } + case Dock::Position::Bottom: { + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + m_tipPopupWindow->setArrowDirection(DArrowRectangle::ArrowDirection::ArrowBottom); + m_tipPopupWindow->setContent(m_tipsWidget); + break; + } + case Dock::Position::Left: { + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + m_tipPopupWindow->setArrowDirection(DArrowRectangle::ArrowDirection::ArrowLeft); + m_tipPopupWindow->setContent(m_tipsWidget); break; } - case Dock::Position::Left: case Dock::Position::Right: { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + m_tipPopupWindow->setArrowDirection(DArrowRectangle::ArrowDirection::ArrowRight); + m_tipPopupWindow->setContent(m_tipsWidget); break; } } @@ -102,43 +137,24 @@ void DateTimeDisplayer::mouseReleaseEvent(QMouseEvent *event) .method("RaiseWindow").call(); } -DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo() +QString DateTimeDisplayer::getTimeString() const { - DateTimeInfo info; - const QDateTime current = QDateTime::currentDateTime(); + QString tFormat = QString("hh:mm"); + int type = m_timedateInter->shortTimeFormat(); + if (timeFormat.contains(type)) + tFormat = timeFormat[type]; - info.m_timeRect = rect(); - info.m_dateRect = rect(); - - QString format = getTimeFormat(); if (!m_timedateInter->use24HourFormat()) { if (m_position == Dock::Top || m_position == Dock::Bottom) - format = format.append(" AP"); + tFormat = tFormat.append(" AP"); else - format = format.append("\nAP"); + tFormat = tFormat.append("\nAP"); } - info.m_time = current.toString(format); - info.m_date = current.toString(getDateFormat()); - - if (m_position == Dock::Top || m_position == Dock::Bottom) { - int timeWidth = QFontMetrics(m_timeFont).boundingRect(info.m_time).width() + 10; - int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; - info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height()); - int dateX = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2 - ITEMSPACE; - // 如果时间的X坐标小于日期的X坐标,需要手动设置坐标在日期坐标的右侧 - if (dateX < info.m_timeRect.right()) - dateX = info.m_timeRect.right(); - info.m_dateRect = QRect(dateX, 0, dateWidth, height()); - } else { - int textWidth = rect().width(); - info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2); - info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2); - } - return info; + return QDateTime::currentDateTime().toString(tFormat); } -QString DateTimeDisplayer::getDateFormat() const +QString DateTimeDisplayer::getDateString() const { int type = m_timedateInter->shortDateFormat(); QString shortDateFormat = "yyyy-MM-dd"; @@ -156,16 +172,57 @@ QString DateTimeDisplayer::getDateFormat() const } } - return shortDateFormat; + return QDateTime::currentDateTime().toString(shortDateFormat); } -QString DateTimeDisplayer::getTimeFormat() const +DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo() { - int type = m_timedateInter->shortTimeFormat(); - if (timeFormat.contains(type)) - return timeFormat[type]; + DateTimeInfo info; + info.m_timeRect = rect(); + info.m_dateRect = rect(); - return QString("hh:mm"); + info.m_time = getTimeString(); + info.m_date = getDateString(); + + if (m_position == Dock::Top || m_position == Dock::Bottom) { + int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width() + 3; + int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; + info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height()); + int dateX = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2 - ITEMSPACE; + // 如果时间的X坐标小于日期的X坐标,需要手动设置坐标在日期坐标的右侧 + if (dateX < info.m_timeRect.right()) + dateX = info.m_timeRect.right(); + info.m_dateRect = QRect(dateX, 0, dateWidth, height()); + } else { + int textWidth = rect().width(); + info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2); + info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2); + } + return info; +} + +void DateTimeDisplayer::onTimeChanged() +{ + const QDateTime currentDateTime = QDateTime::currentDateTime(); + + if (m_timedateInter->use24HourFormat()) + m_tipsWidget->setText(currentDateTime.date().toString(Qt::SystemLocaleLongDate) + currentDateTime.toString(" HH:mm:ss")); + else + m_tipsWidget->setText(currentDateTime.date().toString(Qt::SystemLocaleLongDate) + currentDateTime.toString(" hh:mm:ss AP")); + + // 如果时间和日期有一个不等,则实时刷新界面 + if (m_lastDateString != getDateString() || m_lastTimeString != getTimeString()) + update(); +} + +void DateTimeDisplayer::onDateTimeFormatChanged() +{ + int lastSize = m_currentSize; + // 此处需要强制重绘,因为在重绘过程中才会改变m_currentSize信息,方便在后面判断是否需要调整尺寸 + repaint(); + // 如果日期时间的格式发生了变化,需要通知外部来调整日期时间的尺寸 + if (lastSize != m_currentSize) + Q_EMIT sizeChanged(); } void DateTimeDisplayer::paintEvent(QPaintEvent *e) @@ -184,8 +241,82 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e) timeTextFlag = Qt::AlignLeft | Qt::AlignVCenter; dateTextFlag = Qt::AlignRight | Qt::AlignVCenter; } - painter.setFont(m_timeFont); + painter.setFont(timeFont()); painter.drawText(info.m_timeRect, timeTextFlag, info.m_time); painter.setFont(m_dateFont); painter.drawText(info.m_dateRect, dateTextFlag, info.m_date); + + updateLastData(info); +} + +QPoint DateTimeDisplayer::tipsPoint() const +{ + QPoint pointInTopWidget = parentWidget()->mapTo(topLevelWidget(), pos()); + switch (m_position) { + case Dock::Position::Left: { + pointInTopWidget.setX(topLevelWidget()->x() + topLevelWidget()->width()); + pointInTopWidget.setY(pointInTopWidget.y() + height() / 2); + break; + } + case Dock::Position::Top: { + pointInTopWidget.setY(y() + topLevelWidget()->y() + topLevelWidget()->height()); + pointInTopWidget.setX(pointInTopWidget.x() + width() / 2); + break; + } + case Dock::Position::Right: { + pointInTopWidget.setY(pointInTopWidget.y() + height() / 2); + pointInTopWidget.setX(pointInTopWidget.x() - width() / 2); + break; + } + case Dock::Position::Bottom: { + pointInTopWidget.setY(0); + pointInTopWidget.setX(pointInTopWidget.x() + width() / 2); + break; + } + } + return topLevelWidget()->mapToGlobal(pointInTopWidget); +} + +QFont DateTimeDisplayer::timeFont() const +{ + if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) + return DFontSizeManager::instance()->t6(); + + // 如果是上下方向,且当前只有一行,则始终显示小号字体 + if (m_oneRow) + return DFontSizeManager::instance()->t10(); + + static QList dateFontSize = { DFontSizeManager::instance()->t10(), + DFontSizeManager::instance()->t9(), + DFontSizeManager::instance()->t8(), + DFontSizeManager::instance()->t7(), + DFontSizeManager::instance()->t6() }; + +#define MINHEIGHT 16 + // 获取最低高度为16,找到对应的索引值 + int index = qMin(qMax(static_cast((rect().height() - MINHEIGHT) / 3), 0), dateFontSize.size() - 1); + return dateFontSize[index]; +} + +void DateTimeDisplayer::enterEvent(QEvent *event) +{ + Q_UNUSED(event); + m_tipPopupWindow->show(tipsPoint()); +} + +void DateTimeDisplayer::leaveEvent(QEvent *event) +{ + Q_UNUSED(event); + m_tipPopupWindow->hide(); +} + +void DateTimeDisplayer::updateLastData(const DateTimeInfo &info) +{ + m_lastDateString = info.m_date; + m_lastTimeString = info.m_time; + QSize dateTimeSize = suitableSize(); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + m_currentSize = dateTimeSize.width(); + else + m_currentSize = dateTimeSize.height(); } diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index 9dcea0a30..3b1a29e8e 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -28,6 +28,9 @@ #include +namespace Dock { class TipsWidget; } +class DockPopupWindow; + using Timedate = com::deepin::daemon::Timedate; class DateTimeDisplayer : public QWidget @@ -46,24 +49,44 @@ public: explicit DateTimeDisplayer(QWidget *parent = nullptr); ~DateTimeDisplayer() override; void setPositon(Dock::Position position); + void setOneRow(bool oneRow); QSize suitableSize(); +Q_SIGNALS: + void sizeChanged(); // 当日期时间格式发生变化的时候,需要通知外面来更新窗口尺寸 + protected: void mouseReleaseEvent(QMouseEvent *event) override; void paintEvent(QPaintEvent *e) override; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; private: - void setCurrentPolicy(); + void updatePolicy(); DateTimeInfo dateTimeInfo(); + void updateLastData(const DateTimeInfo &info); - QString getDateFormat() const; - QString getTimeFormat() const; + QString getTimeString() const; + QString getDateString() const; + + QPoint tipsPoint() const; + QFont timeFont() const; + +private Q_SLOTS: + void onTimeChanged(); + void onDateTimeFormatChanged(); private: Timedate *m_timedateInter; Dock::Position m_position; - mutable QFont m_timeFont; - mutable QFont m_dateFont; + QFont m_dateFont; + Dock::TipsWidget *m_tipsWidget; + QSharedPointer m_tipPopupWindow; + QTimer *m_tipsTimer; + QString m_lastDateString; + QString m_lastTimeString; + int m_currentSize; + bool m_oneRow; }; #endif // DATETIMEDISPLAYER_H From 75cb4e81606ffda8ee0cd706b9ba4c17e7d09bc8 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 25 May 2022 09:44:29 +0800 Subject: [PATCH 010/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E8=AE=BE=E7=BD=AE=E7=AA=97=E4=BD=93=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E6=96=B9=E5=90=91=E7=9A=84=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.在任务栏方向变化后,重新给DArrowRectangle调用setContent方法确保内容窗体显示正确 2.调整快捷设置面板的部件的高度 3.任务栏左右显示的时候,调整快捷设置插件居中显示 Log: Influence: 任务栏-快捷设置面板位置和尺寸 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: I3a58070b723bc89c26af07a09e1cbb665d79cbe8 --- frame/window/quickpluginwindow.cpp | 79 +++++++++++++++++++------- frame/window/quickpluginwindow.h | 1 + frame/window/quicksettingcontainer.cpp | 40 ++++++------- frame/window/quicksettingcontainer.h | 1 + frame/window/traymanagerwindow.cpp | 4 +- frame/window/traymanagerwindow.h | 9 ++- 6 files changed, 88 insertions(+), 46 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index ce26ca5c1..1661a7691 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -37,7 +37,8 @@ #define ITEMSIZE 22 #define ITEMSPACE 6 -#define ICONSIZE 16 +#define ICONWIDTH 20 +#define ICONHEIGHT 16 static QStringList fixedPluginKeys{ "network-item-key", "sound-item-key", "power" }; const int itemDataRole = Dtk::UserRole + 1; @@ -45,7 +46,7 @@ const int itemSortRole = Dtk::UserRole + 2; QuickPluginWindow::QuickPluginWindow(QWidget *parent) : QWidget(parent) - , m_mainLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) + , m_mainLayout(new QBoxLayout(QBoxLayout::RightToLeft, this)) , m_position(Dock::Position::Bottom) { initUi(); @@ -63,7 +64,7 @@ void QuickPluginWindow::initUi() { setAcceptDrops(true); m_mainLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); - m_mainLayout->setDirection(QBoxLayout::Direction::RightToLeft); + m_mainLayout->setDirection(QBoxLayout::RightToLeft); m_mainLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0); m_mainLayout->setSpacing(ITEMSPACE); const QList &items = QuickSettingController::instance()->settingItems(); @@ -83,10 +84,13 @@ void QuickPluginWindow::setPositon(Position position) m_position = position; QuickSettingContainer::setPosition(position); - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { m_mainLayout->setDirection(QBoxLayout::RightToLeft); - else + m_mainLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + } else { m_mainLayout->setDirection(QBoxLayout::BottomToTop); + m_mainLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter); + } } int QuickPluginWindow::findActiveTargetIndex(QWidget *widget) @@ -136,6 +140,7 @@ void QuickPluginWindow::addPlugin(QuickSettingItem *item) if (!widget) return; + widget->setFixedSize(ICONWIDTH, ICONHEIGHT); widget->installEventFilter(this); if (fixedPluginKeys.contains(item->itemKey())) { // 新插入的插件如果是固定插件,则将其插入到固定插件列表中,并对其进行排序 @@ -156,13 +161,26 @@ void QuickPluginWindow::addPlugin(QuickSettingItem *item) QSize QuickPluginWindow::suitableSize() { if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - return QSize((ITEMSPACE + ICONSIZE) * m_mainLayout->count() + ITEMSIZE, ITEMSIZE); + return QSize((ITEMSPACE + ICONWIDTH) * m_mainLayout->count() + ITEMSPACE, ITEMSIZE); - return QSize(ITEMSIZE, (ITEMSIZE + ITEMSPACE) * m_mainLayout->count() + ITEMSPACE); + int height = 0; + int itemCount = m_mainLayout->count(); + if (itemCount > 0) { + // 每个图标占据的高度 + height += ICONHEIGHT * itemCount; + // 图标间距占据的高度 + height += ITEMSPACE * itemCount; + } + + return QSize(ITEMSIZE, height); } void QuickPluginWindow::removePlugin(QuickSettingItem *item) { + QWidget *widget = item->pluginItem()->itemWidget(item->itemKey()); + if (widget) + widget->setFixedSize(ICONWIDTH, ICONHEIGHT); + if (m_fixedSettingItems.contains(item)) m_fixedSettingItems.removeOne(item); else if (m_activeSettingItems.contains(item)) @@ -201,6 +219,36 @@ void QuickPluginWindow::mousePressEvent(QMouseEvent *event) startDrag(quickItem); } +QPoint QuickPluginWindow::popupPoint() const +{ + if (!parentWidget()) + return pos(); + + QPoint pointCurrent = parentWidget()->mapToGlobal(pos()); + switch (m_position) { + case Dock::Position::Bottom: { + // 在下方的时候,Y坐标设置在顶层窗口的y值,保证下方对齐 + pointCurrent.setY(topLevelWidget()->y()); + break; + } + case Dock::Position::Top: { + // 在上面的时候,Y坐标设置为任务栏的下方,保证上方对齐 + pointCurrent.setY(topLevelWidget()->y() + topLevelWidget()->height()); + break; + } + case Dock::Position::Left: { + // 在左边的时候,X坐标设置在顶层窗口的最右侧,保证左对齐 + pointCurrent.setX(topLevelWidget()->x() + topLevelWidget()->width()); + break; + } + case Dock::Position::Right: { + // 在右边的时候,X坐标设置在顶层窗口的最左侧,保证右对齐 + pointCurrent.setX(topLevelWidget()->x()); + } + } + return pointCurrent; +} + void QuickPluginWindow::mouseReleaseEvent(QMouseEvent *event) { // 查找固定团图标,然后点击弹出快捷面板 @@ -208,20 +256,9 @@ void QuickPluginWindow::mouseReleaseEvent(QMouseEvent *event) if (!quickItem) return; - // 如果是固定图标,则让其弹出列表 - QPoint currentPoint = pos(); - QWidget *callWidget = parentWidget(); - if (callWidget) { - currentPoint = callWidget->mapToGlobal(currentPoint); - // 如果是向上的方向,则需要减去高度 - if (m_position == Dock::Position::Top) - currentPoint.setY(currentPoint.y() + callWidget->height()); - else if (m_position == Dock::Position::Left) - currentPoint.setX(currentPoint.x() + callWidget->width()); - } - + // 弹出快捷设置面板 DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); - popWindow->show(currentPoint); + popWindow->show(popupPoint()); } void QuickPluginWindow::startDrag(QuickSettingItem *moveItem) @@ -312,8 +349,8 @@ void QuickPluginWindow::resetPluginDisplay() } }; - addWidget(m_activeSettingItems); addWidget(m_fixedSettingItems); + addWidget(m_activeSettingItems); } void QuickPluginWindow::initConnection() diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 0a520c703..16633f504 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -72,6 +72,7 @@ private: QuickSettingItem *findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems); int findActiveTargetIndex(QWidget *widget); void resetPluginDisplay(); + QPoint popupPoint() const; private: QBoxLayout *m_mainLayout; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index dc6bc14dd..b2726ffb9 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -44,7 +44,6 @@ static const int QuickItemRole = Dtk::UserRole + 10; #define ITEMWIDTH 70 #define ITEMHEIGHT 60 -#define CTRLHEIGHT 56 #define ITEMSPACE 10 #define COLUMNCOUNT 4 @@ -56,11 +55,12 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_switchLayout(new QStackedLayout(this)) , m_mainWidget(new QWidget(this)) , m_pluginWidget(new QWidget(m_mainWidget)) + , m_componentWidget(new QWidget(m_mainWidget)) , m_mainlayout(new QVBoxLayout(m_mainWidget)) , m_pluginLoader(QuickSettingController::instance()) - , m_playerWidget(new MediaWidget(m_mainWidget)) - , m_volumnWidget(new VolumeWidget(m_mainWidget)) - , m_brihtnessWidget(new BrightnessWidget(m_mainWidget)) + , m_playerWidget(new MediaWidget(m_componentWidget)) + , m_volumnWidget(new VolumeWidget(m_componentWidget)) + , m_brihtnessWidget(new BrightnessWidget(m_componentWidget)) , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumnWidget->model(), this)) , m_brightSettingWidget(new BrightnessMonitorWidget(m_brihtnessWidget->model(), this)) , m_childPage(new PluginChildPage(this)) @@ -114,8 +114,8 @@ DockPopupWindow *QuickSettingContainer::popWindow() m_popWindow->setShadowXOffset(0); m_popWindow->setArrowWidth(18); m_popWindow->setArrowHeight(10); - m_popWindow->setContent(new QuickSettingContainer(m_popWindow)); m_popWindow->setArrowDirection(getDirection(m_position)); + m_popWindow->setContent(new QuickSettingContainer(m_popWindow)); return m_popWindow; } @@ -126,8 +126,13 @@ void QuickSettingContainer::setPosition(Position position) m_position = position; - if (m_popWindow) + if (m_popWindow) { m_popWindow->setArrowDirection(getDirection(m_position)); + // 在任务栏位置发生变化的时候,需要将当前的content获取后,重新调用setContent接口 + // 如果不调用,那么就会出现内容在容器内部的位置错误,界面上的布局会乱 + QWidget *widget = m_popWindow->getContent(); + m_popWindow->setContent(widget); + } } void QuickSettingContainer::initQuickItem(QuickSettingItem *quickItem) @@ -297,31 +302,28 @@ void QuickSettingContainer::initUi() }; // 添加音乐播放插件 - m_playerWidget->setFixedHeight(CTRLHEIGHT); - m_volumnWidget->setFixedHeight(CTRLHEIGHT); - m_brihtnessWidget->setFixedHeight(CTRLHEIGHT); + m_playerWidget->setFixedHeight(ITEMHEIGHT); + m_volumnWidget->setFixedHeight(ITEMHEIGHT); + m_brihtnessWidget->setFixedHeight(ITEMHEIGHT); setWidgetStyle(m_playerWidget); setWidgetStyle(m_volumnWidget); setWidgetStyle(m_brihtnessWidget); - m_mainlayout->setSpacing(0); + m_mainlayout->setSpacing(ITEMSPACE); m_mainlayout->setContentsMargins(0, ITEMSPACE, 0, ITEMSPACE); m_mainlayout->addWidget(m_pluginWidget); - QWidget *ctrlWidget = new QWidget(m_mainWidget); - QVBoxLayout *ctrlLayout = new QVBoxLayout(ctrlWidget); - ctrlLayout->setContentsMargins(ITEMSPACE, ITEMSPACE, ITEMSPACE, ITEMSPACE); + QVBoxLayout *ctrlLayout = new QVBoxLayout(m_componentWidget); + ctrlLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0); + ctrlLayout->setSpacing(ITEMSPACE); - ctrlLayout->addSpacing(ITEMSPACE); ctrlLayout->addWidget(m_playerWidget); - ctrlLayout->setSpacing(ITEMSPACE); ctrlLayout->addWidget(m_volumnWidget); - ctrlLayout->setSpacing(ITEMSPACE); ctrlLayout->addWidget(m_brihtnessWidget); - m_mainlayout->addWidget(ctrlWidget); + m_mainlayout->addWidget(m_componentWidget); // 加载所有的插件 QList pluginItems = m_pluginLoader->settingItems(); for (QuickSettingItem *quickItem: pluginItems) @@ -393,8 +395,8 @@ void QuickSettingContainer::resizeView() if (m_brihtnessWidget->isVisible()) panelCount++; - int topHeight = ((ITEMHEIGHT + ITEMSPACE) * rowCount) + ITEMSPACE; - setFixedHeight(topHeight + (CTRLHEIGHT + ITEMSPACE) * panelCount + ITEMSPACE); + m_componentWidget->setFixedHeight(ITEMHEIGHT * panelCount + ITEMSPACE * (panelCount - 1)); + setFixedHeight(ITEMSPACE * 3 + m_pluginWidget->height() + m_componentWidget->height()); } else if (m_switchLayout->currentWidget() == m_childPage) { setFixedHeight(m_childPage->height()); } diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 12b74ae2a..220cad1d1 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -90,6 +90,7 @@ private: QStackedLayout *m_switchLayout; QWidget *m_mainWidget; QWidget *m_pluginWidget; + QWidget *m_componentWidget; QVBoxLayout *m_mainlayout; QuickSettingController *m_pluginLoader; MediaWidget *m_playerWidget; diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index f963f7df5..acf501f2c 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -259,6 +259,7 @@ void TrayManagerWindow::initConnection() } } }); + connect(m_dateTimeWidget, &DateTimeDisplayer::sizeChanged, this, &TrayManagerWindow::sizeChanged); m_trayView->installEventFilter(this); m_quickIconWidget->installEventFilter(this); @@ -302,7 +303,8 @@ void TrayManagerWindow::resetChildWidgetSize() m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), trayHeight); // 因为是两行,所以对于时间控件的尺寸,只能设置最小值 - m_dateTimeWidget->setMinimumSize(m_dateTimeWidget->suitableSize().width(), m_appPluginDatetimeWidget->height() / 2); + int dateTimeWidth = qMax(m_appPluginWidget->width(), m_dateTimeWidget->suitableSize().width()); + m_dateTimeWidget->setMinimumSize(dateTimeWidth, m_appPluginDatetimeWidget->height() / 2); } m_appPluginDatetimeWidget->setFixedWidth(appDatetimeSize()); break; diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 8892ff0dc..d0bbad211 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -59,6 +59,10 @@ public: protected: void resizeEvent(QResizeEvent *event) override; + void dragEnterEvent(QDragEnterEvent *e) override; + void dragMoveEvent(QDragMoveEvent *e) override; + void dropEvent(QDropEvent *e) override; + void dragLeaveEvent(QDragLeaveEvent *event) override; private: void initUi(); @@ -68,11 +72,6 @@ private: void resetMultiDirection(); void resetSingleDirection(); - void dragEnterEvent(QDragEnterEvent *e) override; - void dragMoveEvent(QDragMoveEvent *e) override; - void dropEvent(QDropEvent *e) override; - void dragLeaveEvent(QDragLeaveEvent *event) override; - bool showSingleRow(); int appDatetimeSize(); From 1172b54b9f55c39511b598e12d977e205ec41125 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 20 May 2022 13:58:51 +0800 Subject: [PATCH 011/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=98?= =?UTF-8?q?=E7=9B=98=E5=8C=BA=E5=9F=9F=E8=B0=83=E6=95=B4=E5=B0=BA=E5=AF=B8?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E6=89=98=E7=9B=98=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E4=B8=8D=E5=B1=85=E4=B8=AD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改delegate类的sizeHint方法的返回值,在主窗体尺寸发生变化的时候,发送delegate的sizeHintChanged信号来保证sizeHint方法能实时调用 Log: Influence: 任务栏上下调整尺寸的时候观察托盘图标的位置变化 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: I86b6bdc0fb991ff0a2674b0fa799add4b536a6bf --- frame/window/tray/tray_delegate.cpp | 62 +++++++++++++++++------------ frame/window/tray/tray_delegate.h | 2 +- frame/window/tray/tray_gridview.cpp | 5 +++ frame/window/tray/tray_gridview.h | 1 + frame/window/traymanagerwindow.cpp | 43 +++++++++++--------- frame/window/traymanagerwindow.h | 1 + 6 files changed, 70 insertions(+), 44 deletions(-) diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index 276d9f706..dd6c65b79 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -138,7 +138,15 @@ QSize TrayDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelInd Q_UNUSED(option); Q_UNUSED(index); - return QSize(ITEM_SIZE, ITEM_SIZE); + // 如果是弹出托盘,则显示正常大小 + if (isPopupTray()) + return QSize(ITEM_SIZE, ITEM_SIZE); + + // 如果是任务栏的托盘,则高度显示为listView的高度或宽度 + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + return QSize(ITEM_SIZE, m_listView->height()); + + return QSize(m_listView->width(), ITEM_SIZE); } void TrayDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const @@ -153,30 +161,34 @@ void TrayDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewI void TrayDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - if (needDrawBackground()) { - QColor borderColor; - QColor backColor; - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - // 白色主题的情况下 - borderColor = Qt::black; - borderColor.setAlpha(static_cast(255 * 0.05)); - backColor = Qt::white; - backColor.setAlpha(static_cast(255 * 0.4)); - } else { - borderColor = Qt::black; - borderColor.setAlpha(static_cast(255 * 0.2)); - backColor = Qt::black; - backColor.setAlpha(static_cast(255 * 0.4)); - } - painter->save(); - QPainterPath path; - path.addRoundedRect(option.rect, 8, 8); - painter->setRenderHint(QPainter::Antialiasing); - painter->fillPath(path, backColor); - painter->setPen(borderColor); - painter->drawPath(path); - painter->restore(); + Q_UNUSED(index); + + if (!isPopupTray()) + return; + + QColor borderColor; + QColor backColor; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { + // 白色主题的情况下 + borderColor = Qt::black; + borderColor.setAlpha(static_cast(255 * 0.05)); + backColor = Qt::white; + backColor.setAlpha(static_cast(255 * 0.4)); + } else { + borderColor = Qt::black; + borderColor.setAlpha(static_cast(255 * 0.2)); + backColor = Qt::black; + backColor.setAlpha(static_cast(255 * 0.4)); } + + painter->save(); + QPainterPath path; + path.addRoundedRect(option.rect, 8, 8); + painter->setRenderHint(QPainter::Antialiasing); + painter->fillPath(path, backColor); + painter->setPen(borderColor); + painter->drawPath(path); + painter->restore(); } ExpandIconWidget *TrayDelegate::expandWidget() @@ -198,7 +210,7 @@ ExpandIconWidget *TrayDelegate::expandWidget() return nullptr; } -bool TrayDelegate::needDrawBackground() const +bool TrayDelegate::isPopupTray() const { if (!m_listView) return false; diff --git a/frame/window/tray/tray_delegate.h b/frame/window/tray/tray_delegate.h index 85125819e..baa843715 100644 --- a/frame/window/tray/tray_delegate.h +++ b/frame/window/tray/tray_delegate.h @@ -59,7 +59,7 @@ protected: private: ExpandIconWidget *expandWidget(); - bool needDrawBackground() const; + bool isPopupTray() const; private: Dock::Position m_position; diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index f346d04d4..8bdfc3ff4 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -53,6 +53,11 @@ void TrayGridView::setPosition(Dock::Position position) m_positon = position; } +Dock::Position TrayGridView::position() const +{ + return m_positon; +} + QSize TrayGridView::suitableSize() const { TrayModel *dataModel = qobject_cast(model()); diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h index fee65b42e..7ae02602b 100644 --- a/frame/window/tray/tray_gridview.h +++ b/frame/window/tray/tray_gridview.h @@ -37,6 +37,7 @@ public: explicit TrayGridView(QWidget *parent = Q_NULLPTR); void setPosition(Dock::Position position); + Dock::Position position() const; QSize suitableSize() const; void setDragDistance(int pixel); void setAnimationProperty(const QEasingCurve::Type easing, const int duringTime = 250); diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index acf501f2c..3bf8321d5 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -91,14 +91,7 @@ void TrayManagerWindow::setPositon(Dock::Position position) m_dateTimeWidget->setPositon(position); m_systemPluginWidget->setPositon(position); - QMetaObject::invokeMethod(this, [ this ]{ - if (showSingleRow()) - resetSingleDirection(); - else - resetMultiDirection(); - - resetChildWidgetSize(); - }, Qt::QueuedConnection); + QMetaObject::invokeMethod(this, &TrayManagerWindow::resetDirection, Qt::QueuedConnection); } int TrayManagerWindow::appDatetimeSize() @@ -142,12 +135,7 @@ void TrayManagerWindow::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); - if (showSingleRow()) - resetSingleDirection(); - else - resetMultiDirection(); - - resetChildWidgetSize(); + resetDirection(); } void TrayManagerWindow::initUi() @@ -267,6 +255,18 @@ void TrayManagerWindow::initConnection() QMetaObject::invokeMethod(this, &TrayManagerWindow::resetChildWidgetSize, Qt::QueuedConnection); } +void TrayManagerWindow::resetDirection() +{ + if (showSingleRow()) + resetSingleDirection(); + else + resetMultiDirection(); + + resetChildWidgetSize(); + // 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示 + Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); +} + bool TrayManagerWindow::showSingleRow() { if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) @@ -298,10 +298,9 @@ void TrayManagerWindow::resetChildWidgetSize() m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), trayHeight); } else { // 多行显示 - int trayHeight = m_appPluginDatetimeWidget->height() / 2 - m.top() - m.bottom(); - m_trayView->setFixedSize(trayWidth, trayHeight); - m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); - m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), trayHeight); + m_trayView->setFixedSize(trayWidth, QWIDGETSIZE_MAX); + m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); + m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); // 因为是两行,所以对于时间控件的尺寸,只能设置最小值 int dateTimeWidth = qMax(m_appPluginWidget->width(), m_dateTimeWidget->suitableSize().width()); m_dateTimeWidget->setMinimumSize(dateTimeWidth, m_appPluginDatetimeWidget->height() / 2); @@ -347,6 +346,8 @@ void TrayManagerWindow::resetSingleDirection() break; } } + m_splitLine->hide(); + m_dateTimeWidget->setOneRow(true); } void TrayManagerWindow::resetMultiDirection() @@ -356,12 +357,16 @@ void TrayManagerWindow::resetMultiDirection() m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::BottomToTop); m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_splitLine->show(); + m_dateTimeWidget->setOneRow(false); break; } case Dock::Position::Bottom: { m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_splitLine->show(); + m_dateTimeWidget->setOneRow(false); break; } case Dock::Position::Left: @@ -369,6 +374,8 @@ void TrayManagerWindow::resetMultiDirection() m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_splitLine->hide(); + m_dateTimeWidget->setOneRow(true); break; } } diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index d0bbad211..3acfb1888 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -68,6 +68,7 @@ private: void initUi(); void initConnection(); + void resetDirection(); void resetChildWidgetSize(); void resetMultiDirection(); void resetSingleDirection(); From 73ad24a68219c6a803dcecbcc0c43057b041228d Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 25 May 2022 10:58:58 +0800 Subject: [PATCH 012/257] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E9=80=82=E9=85=8D=E6=96=B0=E7=9A=84=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F=E6=8F=92=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在homemonitor插件中新增插件新的接口,匹配新的任务栏插件 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: Idd9907d55b839939d52121934bd5c28ea349392c --- .../home_monitor/home_monitor.json | 2 +- .../home_monitor/homemonitorplugin.cpp | 41 +++++++++++++++++++ .../home_monitor/homemonitorplugin.h | 5 +++ .../home_monitor/informationwidget.cpp | 12 ++++-- .../home_monitor/informationwidget.h | 1 + .../plugin-guide/plugins-developer-guide.md | 4 ++ 6 files changed, 60 insertions(+), 5 deletions(-) diff --git a/plugins/plugin-guide/home_monitor/home_monitor.json b/plugins/plugin-guide/home_monitor/home_monitor.json index 86b33bb4a..031bf0ec8 100644 --- a/plugins/plugin-guide/home_monitor/home_monitor.json +++ b/plugins/plugin-guide/home_monitor/home_monitor.json @@ -1,3 +1,3 @@ { - "api": "1.1.1" + "api": "2.0.0" } diff --git a/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp b/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp index 1da95a044..48514a322 100644 --- a/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp +++ b/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp @@ -1,5 +1,7 @@ #include "homemonitorplugin.h" +#include + HomeMonitorPlugin::HomeMonitorPlugin(QObject *parent) : QObject(parent) { @@ -133,3 +135,42 @@ void HomeMonitorPlugin::invokedMenuItem(const QString &itemKey, const QString &m QProcess::startDetached("gparted"); } } + +const QIcon *HomeMonitorPlugin::icon() +{ + static QIcon pixMapIcon; + QPixmap pixmap; + QPainter painter(&pixmap); + painter.begin(&pixmap); + QFont font; + font.setPixelSize(10); + painter.setFont(font); + painter.drawText(QPoint(0, 0), m_pluginWidget->textContent()); + painter.end(); + pixMapIcon.detach(); + pixMapIcon.addPixmap(pixmap); + return &pixMapIcon; +} + +PluginsItemInterface::PluginStatus HomeMonitorPlugin::status() const +{ + return PluginStatus::Active; +} + +bool HomeMonitorPlugin::isPrimary() const +{ + // 如果当前插件是在快捷设置区域最上方显示的大图标且可以展开查看详情的,则返回true + // 否则,返回false + return false; +} + +QString HomeMonitorPlugin::description() const +{ + // 当isPrimary()返回值为true的时候,这个值用于返回在大图标下面的状态信息, + // 例如,如果当前图标是网络图标,下面则显示连接的网络信息,或者如果是其他的图标,下面显示连接的 + // 状态等(开启或者关闭) + if (status() == PluginStatus::Active) + return tr("Enabled"); + + return tr("Disabled"); +} diff --git a/plugins/plugin-guide/home_monitor/homemonitorplugin.h b/plugins/plugin-guide/home_monitor/homemonitorplugin.h index 3ae08f0b6..23b6b0643 100644 --- a/plugins/plugin-guide/home_monitor/homemonitorplugin.h +++ b/plugins/plugin-guide/home_monitor/homemonitorplugin.h @@ -31,6 +31,11 @@ public: const QString itemContextMenu(const QString &itemKey) override; void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; + const QIcon *icon() override; + PluginStatus status() const override; + bool isPrimary() const override; + QString description() const override; + private: InformationWidget *m_pluginWidget; QLabel *m_tipsWidget; diff --git a/plugins/plugin-guide/home_monitor/informationwidget.cpp b/plugins/plugin-guide/home_monitor/informationwidget.cpp index b06fffa32..32c9ab24d 100644 --- a/plugins/plugin-guide/home_monitor/informationwidget.cpp +++ b/plugins/plugin-guide/home_monitor/informationwidget.cpp @@ -33,7 +33,7 @@ InformationWidget::InformationWidget(QWidget *parent) refreshInfo(); } -void InformationWidget::refreshInfo() +const QString InformationWidget::textContent() const { // 获取分区总容量 const double total = m_storageInfo->bytesTotal(); @@ -41,7 +41,11 @@ void InformationWidget::refreshInfo() const double available = m_storageInfo->bytesAvailable(); // 得到可用百分比 const int percent = qRound(available / total * 100); - - // 更新内容 - m_infoLabel->setText(QString("Home:\n%1\%").arg(percent)); + return QString("Home:\n%1\%").arg(percent); +} + +void InformationWidget::refreshInfo() +{ + // 更新内容 + m_infoLabel->setText(textContent()); } diff --git a/plugins/plugin-guide/home_monitor/informationwidget.h b/plugins/plugin-guide/home_monitor/informationwidget.h index 21db1c624..d14ebdc77 100644 --- a/plugins/plugin-guide/home_monitor/informationwidget.h +++ b/plugins/plugin-guide/home_monitor/informationwidget.h @@ -14,6 +14,7 @@ public: explicit InformationWidget(QWidget *parent = nullptr); inline QStorageInfo * storageInfo() { return m_storageInfo; } + const QString textContent() const; private slots: // 用于更新数据的槽函数 diff --git a/plugins/plugin-guide/plugins-developer-guide.md b/plugins/plugin-guide/plugins-developer-guide.md index d93c91136..0fd03d61a 100644 --- a/plugins/plugin-guide/plugins-developer-guide.md +++ b/plugins/plugin-guide/plugins-developer-guide.md @@ -51,6 +51,10 @@ PluginsItemInterface 中定义的接口除了displayMode 和 position(历史 |refreshIcon | 当插件控件的图标需要更新时此接口被调用| |displayMode | 用于插件主动获取 dde-dock 当前的显示模式| |position | 用于插件主动获取 dde-dock 当前的位置| +|icon | 用于返回当前插件在快捷设置面板上的图标,正常状态下显示的图标即可 | +|status | 用于返回当前快捷设置插件的状态,激活状态还是禁用状态 | +|isPrimary | 用于标记当前快捷设置的插件是否为主插件(图标占两个图标位置) | +|description | 用于返回插件的描述(快捷设置面板中isPrimary为true的时候有用) | ### PluginProxyInterface From b1143e91cee479cd4327c46136bf499c0229b3ae Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 25 May 2022 09:42:01 +0800 Subject: [PATCH 013/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=98?= =?UTF-8?q?=E7=9B=98=E5=92=8C=E5=BF=AB=E6=8D=B7=E8=AE=BE=E7=BD=AE=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E8=A1=8C=E6=95=B0=E5=8F=98=E5=8C=96=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=E8=BE=B9=E6=A1=86=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.在单行和多行的时候分别获取圆角区域并显示 2.在任务栏调整大小的时候,圆角大小根据实际情况动态计算生成 Log: 优化界面显示 Influence: 任务栏拖动改变大小,查看单行和多行的显示效果 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I2f595bb8304c23e95672d953bd53d6d74072ed7b --- frame/window/mainpanelcontrol.cpp | 30 +++++++- frame/window/mainpanelcontrol.h | 3 +- frame/window/mainwindow.cpp | 7 +- frame/window/systempluginwindow.cpp | 4 +- frame/window/systempluginwindow.h | 4 +- frame/window/traymanagerwindow.cpp | 115 ++++++++++++++++++++++------ frame/window/traymanagerwindow.h | 11 ++- 7 files changed, 136 insertions(+), 38 deletions(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 6c9528dbe..287724afb 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -59,6 +59,12 @@ #define PLUGIN_MAX_SIZE 40 #define PLUGIN_MIN_SIZE 20 #define DESKTOP_SIZE 10 +// 任务栏圆角最小的时候,任务栏的高度值 +#define MINRADIUSSIZE 46 +// 任务栏圆角最小值和最大值的差值 +#define MAXDIFFVALUE 6 +// 最小圆角值 +#define MINRADIUS 12 DWIDGET_USE_NAMESPACE @@ -352,6 +358,14 @@ void MainPanelControl::resizeEvent(QResizeEvent *event) QWidget::resizeEvent(event); resizeDesktopWidget(); resizeDockIcon(); + resetRadius(); +} + +void MainPanelControl::resetRadius() +{ + int size = ((m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) ? height() : width()); + int radius = qMin(MAXDIFFVALUE, qMax(size - MINRADIUSSIZE, 0)) + MINRADIUS; + qApp->setProperty("EffectBorderRadius", radius); } /**根据任务栏所在位置, 设置应用区域控件的大小 @@ -975,11 +989,19 @@ QPainterPath MainPanelControl::areaPath() if (m_dislayMode == DisplayMode::Efficient) return QPainterPath(); + int radius = qApp->property("EffectBorderRadius").toInt(); QPainterPath path; - int leftWidth = m_fixedAreaWidget->width() + m_fixedSpliter->width() + m_appAreaWidget->width(); - int roundHeight = height(); - path.addRoundedRect(QRect(0, 0, leftWidth, roundHeight), 18, 18); - path.addRoundedRect(QRect(m_trayManagerWidget->x(), 0, m_trayManagerWidget->width(), roundHeight), 18, 18); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + int leftWidth = m_fixedAreaWidget->width() + m_fixedSpliter->width() + m_appAreaWidget->width(); + int roundHeight = height(); + path.addRoundedRect(QRect(0, 0, leftWidth, roundHeight), radius, radius); + path.addRoundedRect(QRect(m_trayManagerWidget->x(), 0, m_trayManagerWidget->width(), roundHeight), radius, radius); + } else { + int roundWidth = width(); + int topHeight = m_fixedAreaWidget->height() + m_fixedSpliter->height() + m_appAreaWidget->height(); + path.addRoundedRect(QRect(0, 0, roundWidth, topHeight), radius, radius); + path.addRoundedRect(QRect(0, m_trayManagerWidget->y(), roundWidth, m_trayManagerWidget->height()), radius, radius); + } return path; } diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 8e420f252..e2cffe906 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -90,7 +90,8 @@ private: void resizeDesktopWidget(); bool checkNeedShowDesktop(); bool appIsOnDock(const QString &appDesktop); - + void resetRadius(); + protected: void dragMoveEvent(QDragMoveEvent *e) override; void dragEnterEvent(QDragEnterEvent *e) override; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index ac6a9a91c..98bd39593 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -253,6 +253,7 @@ void MainWindow::resizeEvent(QResizeEvent *event) // 任务栏大小、位置、模式改变都会触发resize,发射大小改变信号,供依赖项目更新位置 Q_EMIT panelGeometryChanged(); + setMaskPath(m_mainPanel->areaPath()); m_mainPanel->updatePluginsLayout(); m_shadowMaskOptimizeTimer->start(); @@ -380,7 +381,11 @@ void MainWindow::adjustShadowMask() DPlatformTheme *theme = DGuiApplicationHelper::instance()->systemTheme(); radius = theme->windowRadius(radius); } else { - radius = dstyle.pixelMetric(DStyle::PM_TopLevelWindowRadius); + QVariant vRadius = qApp->property("EffectBorderRadius"); + if (vRadius.isNull()) + radius = dstyle.pixelMetric(DStyle::PM_TopLevelWindowRadius); + else + radius = vRadius.toInt(); } } diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index db4f3e230..92a43bcfd 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -32,7 +32,7 @@ #define ICONMARGIN 8 SystemPluginWindow::SystemPluginWindow(QWidget *parent) - : DBlurEffectWidget(parent) + : QWidget(parent) , m_pluginController(new FixedPluginController(this)) , m_listView(new DListView(this)) , m_position(Dock::Position::Bottom) @@ -110,7 +110,7 @@ QSize SystemPluginWindow::suitableSize() void SystemPluginWindow::resizeEvent(QResizeEvent *event) { - DBlurEffectWidget::resizeEvent(event); + QWidget::resizeEvent(event); Q_EMIT pluginSizeChanged(); } diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 27a362f36..b29f4cae6 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -24,7 +24,7 @@ #include "constants.h" #include "dockpluginscontroller.h" -#include +#include class DockPluginsController; class PluginsItem; @@ -34,7 +34,7 @@ namespace Dtk { namespace Widget { class DListView; } } DWIDGET_USE_NAMESPACE -class SystemPluginWindow : public DBlurEffectWidget +class SystemPluginWindow : public QWidget { Q_OBJECT diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 3bf8321d5..0808f6448 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -37,13 +37,21 @@ #include #include #include +#include #define MAXFIXEDSIZE 999999 -#define CRITLCALHEIGHT 56 +#define CRITLCALHEIGHT 42 +#define CONTENTSPACE 7 +// 高度小于等于这个值的时候,间距最小值 +#define MINHIGHT 46 +// 最小值与最大值的差值 +#define MINSPACE 4 +// 当前高度与最小高度差值大于这个值的时候,间距使用最大值 +#define MAXDIFF 3 TrayManagerWindow::TrayManagerWindow(QWidget *parent) : QWidget(parent) - , m_appPluginDatetimeWidget(new DBlurEffectWidget(this)) + , m_appPluginDatetimeWidget(new QWidget(this)) , m_systemPluginWidget(new SystemPluginWindow(this)) , m_appPluginWidget(new QWidget(m_appPluginDatetimeWidget)) , m_quickIconWidget(new QuickPluginWindow(m_appPluginWidget)) @@ -90,8 +98,6 @@ void TrayManagerWindow::setPositon(Dock::Position position) m_quickIconWidget->setPositon(position); m_dateTimeWidget->setPositon(position); m_systemPluginWidget->setPositon(position); - - QMetaObject::invokeMethod(this, &TrayManagerWindow::resetDirection, Qt::QueuedConnection); } int TrayManagerWindow::appDatetimeSize() @@ -100,10 +106,10 @@ int TrayManagerWindow::appDatetimeSize() // 如果是一行 if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) { return m_trayView->suitableSize().width() + m_quickIconWidget->suitableSize().width() - + m_dateTimeWidget->suitableSize().width(); + + m_dateTimeWidget->suitableSize().width() + m_appDatetimeLayout->spacing(); } //如果是两行 - int topWidth = m_trayView->suitableSize().width() + m_quickIconWidget->width(); + int topWidth = m_trayView->suitableSize().width() + m_appDatetimeLayout->spacing() + m_quickIconWidget->width(); int bottomWidth = m_dateTimeWidget->suitableSize().width(); return qMax(topWidth, bottomWidth); } @@ -131,6 +137,37 @@ QSize TrayManagerWindow::suitableSize() m.top() + m.bottom()); } +// 用于返回需要绘制的圆形区域 +QPainterPath TrayManagerWindow::roundedPaths() +{ + int topLevelRadius = qApp->property("EffectBorderRadius").toInt(); + QMargins mainMargin = m_mainLayout->contentsMargins(); + int radius = topLevelRadius - mainMargin.top(); + QPainterPath path; + if ((m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) + && (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight)) { + // 如果是上下方向,且只有一行 + // 计算托盘和快捷插件区域 + QPoint pointPlugin(mainMargin.left(), mainMargin.top()); + QRect rctPlugin(QPoint(mainMargin.left(), mainMargin.top()), m_appPluginWidget->size()); + path.addRoundedRect(rctPlugin, radius, radius); + + // 计算日期时间区域 + QPoint pointDateTime = m_dateTimeWidget->pos(); + pointDateTime = m_dateTimeWidget->parentWidget()->mapTo(this, pointDateTime); + QRect rctDatetime(pointDateTime, m_dateTimeWidget->size()); + path.addRoundedRect(rctDatetime, radius, radius); + // 计算系统插件区域 + path.addRoundedRect(m_systemPluginWidget->geometry(), radius, radius); + } else { + // 添加系统插件区域的位置信息 + path.addRoundedRect(m_appPluginDatetimeWidget->geometry(), radius, radius); + path.addRoundedRect(m_systemPluginWidget->geometry(), radius, radius); + } + + return path; +} + void TrayManagerWindow::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); @@ -147,7 +184,7 @@ void TrayManagerWindow::initUi() m_splitLine->setFixedHeight(1); QPalette pal; QColor lineColor(Qt::black); - lineColor.setAlpha(static_cast(255 * 0.2)); + lineColor.setAlpha(static_cast(255 * 0.1)); pal.setColor(QPalette::Background, lineColor); m_splitLine->setAutoFillBackground(true); m_splitLine->setPalette(pal); @@ -158,11 +195,6 @@ void TrayManagerWindow::initUi() m_trayView->openPersistentEditor(m_model->index(0, 0)); // 左侧的区域,包括应用托盘插件和下方的日期时间区域 - m_appPluginDatetimeWidget->setBlurRectXRadius(10); - m_appPluginDatetimeWidget->setBlurRectYRadius(10); - m_appPluginDatetimeWidget->setMaskAlpha(uint8_t(0.1 * 255)); - m_appPluginDatetimeWidget->installEventFilter(this); - m_appPluginLayout->setContentsMargins(0, 0, 0, 0); m_appPluginLayout->setSpacing(0); m_appPluginWidget->setLayout(m_appPluginLayout); @@ -176,14 +208,10 @@ void TrayManagerWindow::initUi() m_appDatetimeLayout->addWidget(m_splitLine); m_appDatetimeLayout->addWidget(m_dateTimeWidget); - m_systemPluginWidget->setBlurRectXRadius(10); - m_systemPluginWidget->setBlurRectYRadius(10); - m_systemPluginWidget->installEventFilter(this); - m_systemPluginWidget->setMaskAlpha(uint8_t(0.1 * 255)); - setLayout(m_mainLayout); - m_mainLayout->setContentsMargins(8, 8, 8, 8); - m_mainLayout->setSpacing(7); + // 通用情况下,设置边距和间距都为7 + m_mainLayout->setContentsMargins(CONTENTSPACE, CONTENTSPACE, CONTENTSPACE, CONTENTSPACE); + m_mainLayout->setSpacing(CONTENTSPACE); m_mainLayout->addWidget(m_appPluginDatetimeWidget); m_mainLayout->addWidget(m_systemPluginWidget); } @@ -252,7 +280,7 @@ void TrayManagerWindow::initConnection() m_trayView->installEventFilter(this); m_quickIconWidget->installEventFilter(this); installEventFilter(this); - QMetaObject::invokeMethod(this, &TrayManagerWindow::resetChildWidgetSize, Qt::QueuedConnection); + QMetaObject::invokeMethod(this, &TrayManagerWindow::resetDirection, Qt::QueuedConnection); } void TrayManagerWindow::resetDirection() @@ -265,12 +293,13 @@ void TrayManagerWindow::resetDirection() resetChildWidgetSize(); // 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示 Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); + Q_EMIT sizeChanged(); } bool TrayManagerWindow::showSingleRow() { if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) - return height() < CRITLCALHEIGHT; + return topLevelWidget()->height() <= CRITLCALHEIGHT; return true; } @@ -296,14 +325,22 @@ void TrayManagerWindow::resetChildWidgetSize() m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), trayHeight); m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), trayHeight); + m_mainLayout->setContentsMargins(4, 4, 4 ,4); + m_mainLayout->setSpacing(4); + m_appDatetimeLayout->setSpacing(4); } else { // 多行显示 m_trayView->setFixedSize(trayWidth, QWIDGETSIZE_MAX); m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); - m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); + m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), m_appPluginDatetimeWidget->height() / 2 + 4); // 因为是两行,所以对于时间控件的尺寸,只能设置最小值 int dateTimeWidth = qMax(m_appPluginWidget->width(), m_dateTimeWidget->suitableSize().width()); - m_dateTimeWidget->setMinimumSize(dateTimeWidth, m_appPluginDatetimeWidget->height() / 2); + m_dateTimeWidget->setMinimumSize(dateTimeWidth, QWIDGETSIZE_MAX); + + int contentSpace = qMin(MAXDIFF, qMax(height() - MINHIGHT, 0)) + MINSPACE; + m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace); + m_appDatetimeLayout->setSpacing(0); + m_mainLayout->setSpacing(contentSpace); } m_appPluginDatetimeWidget->setFixedWidth(appDatetimeSize()); break; @@ -322,6 +359,11 @@ void TrayManagerWindow::resetChildWidgetSize() m_dateTimeWidget->setFixedSize(sizeWidth, datetimeHeight); m_appPluginWidget->setFixedSize(sizeWidth, trayHeight + quickAreaHeight); m_appPluginDatetimeWidget->setFixedHeight(appDatetimeSize()); + + int contentSpace = qMin(MAXDIFF, qMax(width() - MINHIGHT, 0)) + MINSPACE; + m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace); + m_appDatetimeLayout->setSpacing(0); + m_mainLayout->setSpacing(contentSpace); break; } } @@ -334,24 +376,28 @@ void TrayManagerWindow::resetSingleDirection() case Dock::Position::Bottom: { m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); // 应用和时间在一行显示 + m_appDatetimeLayout->setSpacing(10); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); + m_splitLine->hide(); break; } case Dock::Position::Left: case Dock::Position::Right:{ + m_appDatetimeLayout->setSpacing(0); m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + m_splitLine->show(); break; } } - m_splitLine->hide(); m_dateTimeWidget->setOneRow(true); } void TrayManagerWindow::resetMultiDirection() { + m_appDatetimeLayout->setSpacing(0); switch (m_postion) { case Dock::Position::Top: { m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); @@ -411,3 +457,24 @@ void TrayManagerWindow::dragLeaveEvent(QDragLeaveEvent *event) { event->accept(); } + +void TrayManagerWindow::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + QPainterPath path = roundedPaths(); + QPainter painter(this); + painter.save(); + painter.setRenderHint(QPainter::Antialiasing); + painter.setClipPath(path); + painter.fillRect(rect().adjusted(1, 1, -1, -1), maskColor(102)); + painter.setPen(maskColor(110)); + painter.drawPath(path); + painter.restore(); +} + +QColor TrayManagerWindow::maskColor(uint8_t alpha) const +{ + QColor color = DGuiApplicationHelper::standardPalette(DGuiApplicationHelper::instance()->themeType()).window().color(); + color.setAlpha(alpha); + return color; +} diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 3acfb1888..0b30a6289 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -48,21 +48,22 @@ class TrayManagerWindow : public QWidget { Q_OBJECT -Q_SIGNALS: - void sizeChanged(); - public: explicit TrayManagerWindow(QWidget *parent = nullptr); ~TrayManagerWindow() override; void setPositon(Dock::Position position); QSize suitableSize(); +Q_SIGNALS: + void sizeChanged(); + protected: void resizeEvent(QResizeEvent *event) override; void dragEnterEvent(QDragEnterEvent *e) override; void dragMoveEvent(QDragMoveEvent *e) override; void dropEvent(QDropEvent *e) override; void dragLeaveEvent(QDragLeaveEvent *event) override; + void paintEvent(QPaintEvent *event) override; private: void initUi(); @@ -72,12 +73,14 @@ private: void resetChildWidgetSize(); void resetMultiDirection(); void resetSingleDirection(); + QColor maskColor(uint8_t alpha) const; bool showSingleRow(); int appDatetimeSize(); + QPainterPath roundedPaths(); private: - DBlurEffectWidget *m_appPluginDatetimeWidget; + QWidget *m_appPluginDatetimeWidget; SystemPluginWindow *m_systemPluginWidget; QWidget *m_appPluginWidget; QuickPluginWindow *m_quickIconWidget; From 43efa10cd93c6e75e7ddf4de63cb1ac42d6b324e Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 19 May 2022 17:04:02 +0800 Subject: [PATCH 014/257] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E7=94=B5?= =?UTF-8?q?=E6=BA=90=E6=8C=89=E9=92=AE=E7=9A=84=E5=B0=BA=E5=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化电源按钮的尺寸 Log: Influence: 任务栏-电源按钮 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: I872db293d93b5b16cf96eea3ed76f02c10b73067 --- frame/window/systempluginwindow.cpp | 6 +++--- frame/window/systempluginwindow.h | 2 +- frame/window/traymanagerwindow.cpp | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 92a43bcfd..0eee3497e 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -111,7 +111,7 @@ QSize SystemPluginWindow::suitableSize() void SystemPluginWindow::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); - Q_EMIT pluginSizeChanged(); + Q_EMIT sizeChanged(); } void SystemPluginWindow::initUi() @@ -149,7 +149,7 @@ void SystemPluginWindow::onPluginItemAdded(PluginsItem *pluginItem) return; m_mainLayout->addWidget(pluginItem); - Q_EMIT pluginSizeChanged(); + Q_EMIT sizeChanged(); } void SystemPluginWindow::onPluginItemRemoved(PluginsItem *pluginItem) @@ -158,7 +158,7 @@ void SystemPluginWindow::onPluginItemRemoved(PluginsItem *pluginItem) return; m_mainLayout->removeWidget(pluginItem); - Q_EMIT pluginSizeChanged(); + Q_EMIT sizeChanged(); } void SystemPluginWindow::onPluginItemUpdated(PluginsItem *pluginItem) diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index b29f4cae6..7e3ad955a 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -45,7 +45,7 @@ public: QSize suitableSize(); Q_SIGNALS: - void pluginSizeChanged(); + void sizeChanged(); private: void initUi(); diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 0808f6448..79f361889 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -242,7 +242,7 @@ void TrayManagerWindow::initConnection() Q_EMIT sizeChanged(); }); - connect(m_systemPluginWidget, &SystemPluginWindow::pluginSizeChanged, this, [ this ] { + connect(m_systemPluginWidget, &SystemPluginWindow::sizeChanged, this, [ this ] { // 当系统插件发生变化的时候,同样需要调整尺寸 m_systemPluginWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) @@ -325,6 +325,8 @@ void TrayManagerWindow::resetChildWidgetSize() m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), trayHeight); m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), trayHeight); + // 设置右侧的电源按钮的尺寸 + m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_mainLayout->setContentsMargins(4, 4, 4 ,4); m_mainLayout->setSpacing(4); m_appDatetimeLayout->setSpacing(4); @@ -336,6 +338,7 @@ void TrayManagerWindow::resetChildWidgetSize() // 因为是两行,所以对于时间控件的尺寸,只能设置最小值 int dateTimeWidth = qMax(m_appPluginWidget->width(), m_dateTimeWidget->suitableSize().width()); m_dateTimeWidget->setMinimumSize(dateTimeWidth, QWIDGETSIZE_MAX); + m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize().width(), QWIDGETSIZE_MAX); int contentSpace = qMin(MAXDIFF, qMax(height() - MINHIGHT, 0)) + MINSPACE; m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace); @@ -359,6 +362,7 @@ void TrayManagerWindow::resetChildWidgetSize() m_dateTimeWidget->setFixedSize(sizeWidth, datetimeHeight); m_appPluginWidget->setFixedSize(sizeWidth, trayHeight + quickAreaHeight); m_appPluginDatetimeWidget->setFixedHeight(appDatetimeSize()); + m_systemPluginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPluginWidget->suitableSize().height()); int contentSpace = qMin(MAXDIFF, qMax(width() - MINHIGHT, 0)) + MINSPACE; m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace); From 751fef14be51b6df5b7c7ff24fad13c02d42e0ae Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 25 May 2022 13:09:26 +0800 Subject: [PATCH 015/257] =?UTF-8?q?feat:=20=E7=94=B5=E6=B1=A0=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E9=80=82=E9=85=8D=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加icon接口,外部收到该接口后会进行展示 Log: Influence: 任务栏-快捷设置区域电池插件图标 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: Ibf6f482a54266aaf48c70c0849133da7af49945c --- plugins/power/CMakeLists.txt | 2 +- plugins/power/powerplugin.cpp | 14 ++++++++++++++ plugins/power/powerplugin.h | 1 + plugins/power/powerstatuswidget.cpp | 11 +++++------ plugins/power/powerstatuswidget.h | 5 +++-- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/plugins/power/CMakeLists.txt b/plugins/power/CMakeLists.txt index 3f8f4be3d..aa6c770f1 100644 --- a/plugins/power/CMakeLists.txt +++ b/plugins/power/CMakeLists.txt @@ -17,7 +17,7 @@ pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} power.qrc) -set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../system-trays) +set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../quick-trays) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${Qt5DBus_INCLUDE_DIRS} ${DFrameworkDBus_INCLUDE_DIRS} diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index aa1d67699..ff52702d5 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -185,6 +185,15 @@ void PowerPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } +const QIcon *PowerPlugin::icon() +{ + static QIcon batteryIcon; + const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(); + batteryIcon.detach(); + batteryIcon.addPixmap(pixmap); + return &batteryIcon; +} + void PowerPlugin::updateBatteryVisible() { const bool exist = !m_powerInter->batteryPercentage().isEmpty(); @@ -205,6 +214,11 @@ void PowerPlugin::loadPlugin() m_pluginLoaded = true; m_powerStatusWidget.reset(new PowerStatusWidget); + + connect(m_powerStatusWidget.get(), &PowerStatusWidget::iconChanged, this, [ this ] { + m_proxyInter->itemUpdate(this, POWER_KEY); + }); + m_powerInter = new DBusPower(this); m_systemPowerInter = new SystemPowerInter("com.deepin.system.Power", "/com/deepin/system/Power", QDBusConnection::systemBus(), this); diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index 83855a330..9d4d34dde 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -58,6 +58,7 @@ public: int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; + const QIcon *icon() override; private: void updateBatteryVisible(); diff --git a/plugins/power/powerstatuswidget.cpp b/plugins/power/powerstatuswidget.cpp index 3ce25838e..98927316f 100644 --- a/plugins/power/powerstatuswidget.cpp +++ b/plugins/power/powerstatuswidget.cpp @@ -38,17 +38,16 @@ PowerStatusWidget::PowerStatusWidget(QWidget *parent) { // QIcon::setThemeName("deepin"); - connect(m_powerInter, &DBusPower::BatteryPercentageChanged, this, static_cast(&PowerStatusWidget::update)); - connect(m_powerInter, &DBusPower::BatteryStateChanged, this, static_cast(&PowerStatusWidget::update)); - connect(m_powerInter, &DBusPower::OnBatteryChanged, this, static_cast(&PowerStatusWidget::update)); - connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [ = ] { - refreshIcon(); - }); + connect(m_powerInter, &DBusPower::BatteryPercentageChanged, this, &PowerStatusWidget::refreshIcon); + connect(m_powerInter, &DBusPower::BatteryStateChanged, this, &PowerStatusWidget::refreshIcon); + connect(m_powerInter, &DBusPower::OnBatteryChanged, this, &PowerStatusWidget::refreshIcon); + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &PowerStatusWidget::refreshIcon); } void PowerStatusWidget::refreshIcon() { update(); + Q_EMIT iconChanged(); } void PowerStatusWidget::paintEvent(QPaintEvent *e) diff --git a/plugins/power/powerstatuswidget.h b/plugins/power/powerstatuswidget.h index 5a0895ea1..370e02a23 100644 --- a/plugins/power/powerstatuswidget.h +++ b/plugins/power/powerstatuswidget.h @@ -43,18 +43,19 @@ class PowerStatusWidget : public QWidget public: explicit PowerStatusWidget(QWidget *parent = 0); + QPixmap getBatteryIcon(); +public Q_SLOTS: void refreshIcon(); signals: void requestContextMenu(const QString &itemKey) const; + void iconChanged(); protected: void resizeEvent(QResizeEvent *event); void paintEvent(QPaintEvent *e); -private: - QPixmap getBatteryIcon(); private: DBusPower *m_powerInter; From 5fac561991e9472a05faaa2060f7f6e9d19bbc2d Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 19 May 2022 22:09:08 +0800 Subject: [PATCH 016/257] =?UTF-8?q?feat:=20=E5=85=B3=E6=9C=BA=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E9=80=82=E9=85=8D=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加icon接口,外部收到该接口后会进行展示 Log: Influence: 任务栏-关机插件图标 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: I399153e05fa182ffc431aae0574ff66c813ce198 --- plugins/shutdown/shutdownplugin.cpp | 8 ++++++++ plugins/shutdown/shutdownplugin.h | 1 + plugins/shutdown/shutdownwidget.cpp | 10 ++++++++++ plugins/shutdown/shutdownwidget.h | 1 + 4 files changed, 20 insertions(+) diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index a2000c493..b21783959 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -292,6 +292,14 @@ void ShutdownPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } +const QIcon *ShutdownPlugin::icon() +{ + static QIcon shutdownIcon; + shutdownIcon.detach(); + shutdownIcon.addPixmap(m_shutdownWidget->loadPixmap()); + return &shutdownIcon; +} + void ShutdownPlugin::loadPlugin() { if (m_pluginLoaded) { diff --git a/plugins/shutdown/shutdownplugin.h b/plugins/shutdown/shutdownplugin.h index 046156fad..23061badb 100644 --- a/plugins/shutdown/shutdownplugin.h +++ b/plugins/shutdown/shutdownplugin.h @@ -61,6 +61,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; + const QIcon *icon() override; // 休眠待机配置,保持和sessionshell一致 const QStringList session_ui_configs { diff --git a/plugins/shutdown/shutdownwidget.cpp b/plugins/shutdown/shutdownwidget.cpp index a303df4ea..49f1f9051 100644 --- a/plugins/shutdown/shutdownwidget.cpp +++ b/plugins/shutdown/shutdownwidget.cpp @@ -47,6 +47,16 @@ ShutdownWidget::ShutdownWidget(QWidget *parent) m_icon = QIcon::fromTheme(":/icons/resources/icons/system-shutdown.svg"); } +QPixmap ShutdownWidget::loadPixmap() const +{ + QString iconName = "system-shutdown"; + + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + iconName.append(PLUGIN_MIN_ICON_NAME); + + return loadSvg(iconName, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE)); +} + void ShutdownWidget::paintEvent(QPaintEvent *e) { Q_UNUSED(e); diff --git a/plugins/shutdown/shutdownwidget.h b/plugins/shutdown/shutdownwidget.h index cea9de4e9..574854e71 100644 --- a/plugins/shutdown/shutdownwidget.h +++ b/plugins/shutdown/shutdownwidget.h @@ -33,6 +33,7 @@ class ShutdownWidget : public QWidget public: explicit ShutdownWidget(QWidget *parent = Q_NULLPTR); + QPixmap loadPixmap() const; protected: void paintEvent(QPaintEvent *e) override; From e9db102f260f8b3793eea0fac185ffe691647e4b Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 26 May 2022 18:07:43 +0800 Subject: [PATCH 017/257] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E7=94=B5=E6=BA=90=E6=8C=89=E9=92=AE=E7=9A=84?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整右侧固定区域的插件的展示方式,通过读取插件的图标和文本的方式来自绘实现 Log: Influence: 任务栏右侧电源按钮,调整任务栏尺寸 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: Iee19bd8af12506124bd4ef37805c68671a09651f --- frame/controller/dockpluginscontroller.cpp | 7 +- frame/controller/dockpluginscontroller.h | 3 - frame/item/pluginsitem.cpp | 24 -- frame/item/pluginsitem.h | 15 -- frame/window/mainpanelcontrol.cpp | 8 +- frame/window/systempluginwindow.cpp | 299 ++++++++++++++++----- frame/window/systempluginwindow.h | 69 ++++- frame/window/traymanagerwindow.cpp | 31 ++- 8 files changed, 309 insertions(+), 147 deletions(-) diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index c941c78fa..012a92f5c 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -59,7 +59,7 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con connect(static_cast(item), &TrayPluginItem::trayVisableCountChanged, this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection); } else { - item = createPluginsItem(itemInter, itemKey, pluginApi); + item = new PluginsItem(itemInter, itemKey, pluginApi); } mPluginsMap[itemInter][itemKey] = item; @@ -67,11 +67,6 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con emit pluginItemInserted(item); } -PluginsItem *DockPluginsController::createPluginsItem(PluginsItemInterface *const itemInter, const QString &itemKey, const QString &pluginApi) -{ - return new PluginsItem(itemInter, itemKey, pluginApi); -} - void DockPluginsController::itemUpdate(PluginsItemInterface *const itemInter, const QString &itemKey) { PluginsItem *item = static_cast(pluginItemAt(itemInter, itemKey)); diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index 6765951cf..af759c5de 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -54,9 +54,6 @@ public: void startLoader(); -protected: - virtual PluginsItem *createPluginsItem(PluginsItemInterface *const itemInter, const QString &itemKey, const QString &pluginApi); - signals: void pluginItemInserted(PluginsItem *pluginItem) const; void pluginItemRemoved(PluginsItem *pluginItem) const; diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index 43ec245b3..8c8c37b77 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -325,27 +325,3 @@ PluginsItemInterface *PluginsItem::pluginItem() const { return m_pluginInter; } - -StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter, const QString &itemKey, const QString &plginApi, QWidget *parent) - : PluginsItem (pluginInter, itemKey, plginApi, parent) - , m_nameLabel(new QLabel(this)) -{ - m_nameLabel->setFont(DFontSizeManager::instance()->t10()); - m_nameLabel->setText(pluginInter->pluginDisplayName()); - m_nameLabel->setAlignment(Qt::AlignCenter); - QBoxLayout *mainLayout = static_cast(layout()); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); - mainLayout->addSpacing(10); - mainLayout->addWidget(m_nameLabel); -} - -StretchPluginsItem::~StretchPluginsItem() -{ -} - -void StretchPluginsItem::resizeEvent(QResizeEvent *event) -{ - m_nameLabel->setVisible(height() >= 30); - PluginsItem::resizeEvent(event); -} diff --git a/frame/item/pluginsitem.h b/frame/item/pluginsitem.h index e08a81f4d..0073a689a 100644 --- a/frame/item/pluginsitem.h +++ b/frame/item/pluginsitem.h @@ -91,19 +91,4 @@ private: const QGSettings *m_gsettings; }; -class StretchPluginsItem : public PluginsItem -{ - Q_OBJECT - -public: - StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QString &plginApi, QWidget *parent = nullptr); - ~StretchPluginsItem() override; - -protected: - void resizeEvent(QResizeEvent *event) override; - -private: - QLabel *m_nameLabel; -}; - #endif // PLUGINSITEM_H diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 287724afb..d8470d827 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -1314,11 +1314,11 @@ void MainPanelControl::resizeDesktopWidget() { QSize suitableSize = m_trayManagerWidget->suitableSize(); if (m_position == Position::Right || m_position == Position::Left) { - m_desktopWidget->setFixedSize(width(), DESKTOP_SIZE); - m_trayManagerWidget->setFixedSize(width(), suitableSize.height()); + m_desktopWidget->setFixedSize(QWIDGETSIZE_MAX, DESKTOP_SIZE); + m_trayManagerWidget->setFixedSize(QWIDGETSIZE_MAX, suitableSize.height()); } else { - m_desktopWidget->setFixedSize(DESKTOP_SIZE, height()); - m_trayManagerWidget->setFixedSize(suitableSize.width(), height()); + m_desktopWidget->setFixedSize(DESKTOP_SIZE, QWIDGETSIZE_MAX); + m_trayManagerWidget->setFixedSize(suitableSize.width(), QWIDGETSIZE_MAX); } if (DisplayMode::Fashion == m_dislayMode) diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 0eee3497e..827b6fd2c 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. * * Author: donghualin @@ -25,6 +25,7 @@ #include #include +#include #include #define MAXICONSIZE 48 @@ -39,10 +40,10 @@ SystemPluginWindow::SystemPluginWindow(QWidget *parent) , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) { initUi(); - connect(m_pluginController, &DockPluginsController::pluginItemInserted, this, &SystemPluginWindow::onPluginItemAdded); - connect(m_pluginController, &DockPluginsController::pluginItemRemoved, this, &SystemPluginWindow::onPluginItemRemoved); - connect(m_pluginController, &DockPluginsController::pluginItemUpdated, this, &SystemPluginWindow::onPluginItemUpdated); - QMetaObject::invokeMethod(m_pluginController, &DockPluginsController::startLoader, Qt::QueuedConnection); + connect(m_pluginController, &FixedPluginController::pluginItemInserted, this, &SystemPluginWindow::onPluginItemAdded); + connect(m_pluginController, &FixedPluginController::pluginItemRemoved, this, &SystemPluginWindow::onPluginItemRemoved); + connect(m_pluginController, &FixedPluginController::pluginItemUpdated, this, &SystemPluginWindow::onPluginItemUpdated); + QMetaObject::invokeMethod(m_pluginController, &FixedPluginController::startLoader, Qt::QueuedConnection); } SystemPluginWindow::~SystemPluginWindow() @@ -60,52 +61,43 @@ void SystemPluginWindow::setPositon(Position position) m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); else m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + + QObjectList childObjects = children(); + for (QObject *childObject : childObjects) { + StretchPluginsItem *item = qobject_cast(childObject); + if (!item) + continue; + + item->setPosition(m_position); + } } QSize SystemPluginWindow::suitableSize() { - QMargins m = m_mainLayout->contentsMargins(); - if (m_mainLayout->direction() == QBoxLayout::Direction::LeftToRight) { - int itemSize = height() - m_mainLayout->contentsMargins().top() - m_mainLayout->contentsMargins().bottom(); - int itemWidth = m.left() + m.right(); - for (int i = 0; i < m_mainLayout->count(); i++) { - QWidget *widget = m_mainLayout->itemAt(i)->widget(); - if (!widget) + QObjectList childs = children(); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + int itemWidth = 0; + for (QObject *childObject : childs) { + StretchPluginsItem *childItem = qobject_cast(childObject); + if (!childItem) continue; - PluginsItem *item = qobject_cast(widget); - if (!item) - continue; - - // 如果是横向的,则高度是固定,高宽一致,因此读取高度作为它的尺寸值 - itemWidth += itemSize; - if (i < m_mainLayout->count() - 1) - itemWidth += m_mainLayout->spacing(); + itemWidth += childItem->suitableSize().width(); } - itemWidth += m.right(); - return QSize(itemWidth, height()); + return QSize(itemWidth, QWIDGETSIZE_MAX); } - int itemSize = width() - m_mainLayout->contentsMargins().left() - m_mainLayout->contentsMargins().right(); - int itemHeight = m.top(); - for (int i = 0; i < m_mainLayout->count(); i++) { - QWidget *widget = m_mainLayout->itemAt(i)->widget(); - if (!widget) - continue; - - PluginsItem *item = qobject_cast(widget); + int itemHeight = 0; + for (QObject *childObject : childs) { + StretchPluginsItem *item = qobject_cast(childObject); if (!item) continue; - itemHeight += itemSize; - if (i < m_mainLayout->count() - 1) - itemHeight += m_mainLayout->spacing(); + itemHeight += item->suitableSize().height(); } - itemHeight += m.bottom(); - - return QSize(width(), itemHeight); + return QSize(QWIDGETSIZE_MAX, itemHeight); } void SystemPluginWindow::resizeEvent(QResizeEvent *event) @@ -116,68 +108,239 @@ void SystemPluginWindow::resizeEvent(QResizeEvent *event) void SystemPluginWindow::initUi() { - m_mainLayout->setContentsMargins(8, 8, 8, 8); - m_mainLayout->setSpacing(5); + m_mainLayout->setContentsMargins(0, 0, 0, 0); + m_mainLayout->setSpacing(0); } -int SystemPluginWindow::calcIconSize() const -{ - switch (m_position) { - case Dock::Position::Top: - case Dock::Position::Bottom: { - if (height() >= 56) - return MAXICONSIZE; - if (height() <= 40) - return MINICONSIZE; - return height() - ICONMARGIN * 2; - } - case Dock::Position::Left: - case Dock::Position::Right: { - if (width() >= 56) - return MAXICONSIZE; - if (width() <= 40) - return MINICONSIZE; - return width() - ICONMARGIN * 2; - } - } - return -1; -} - -void SystemPluginWindow::onPluginItemAdded(PluginsItem *pluginItem) +void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem) { if (m_mainLayout->children().contains(pluginItem)) return; + pluginItem->setPosition(m_position); + pluginItem->setParent(this); + pluginItem->show(); m_mainLayout->addWidget(pluginItem); Q_EMIT sizeChanged(); } -void SystemPluginWindow::onPluginItemRemoved(PluginsItem *pluginItem) +void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem) { if (!m_mainLayout->children().contains(pluginItem)) return; + pluginItem->setParent(nullptr); + pluginItem->hide(); m_mainLayout->removeWidget(pluginItem); Q_EMIT sizeChanged(); } -void SystemPluginWindow::onPluginItemUpdated(PluginsItem *pluginItem) +void SystemPluginWindow::onPluginItemUpdated(StretchPluginsItem *pluginItem) { - pluginItem->refreshIcon(); + pluginItem->update(); } // can loader plugins FixedPluginController::FixedPluginController(QObject *parent) - : DockPluginsController(parent) + : AbstractPluginsController(parent) { + setObjectName("FixedPluginController"); } -PluginsItem *FixedPluginController::createPluginsItem(PluginsItemInterface * const itemInter, const QString &itemKey, const QString &pluginApi) +void FixedPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { - return new StretchPluginsItem(itemInter, itemKey, pluginApi); + StretchPluginsItem *item = new StretchPluginsItem(itemInter, itemKey); + m_pluginItems << item; + Q_EMIT pluginItemInserted(item); +} + +void FixedPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) +{ + for (StretchPluginsItem *item : m_pluginItems) { + if (item->pluginInter() == itemInter) { + Q_EMIT pluginItemUpdated(item); + break; + } + } +} + +void FixedPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &) +{ + for (StretchPluginsItem *item : m_pluginItems) { + if (item->pluginInter() == itemInter) { + m_pluginItems.removeOne(item); + Q_EMIT pluginItemRemoved(item); + item->deleteLater(); + break; + } + } } bool FixedPluginController::needLoad(PluginsItemInterface *itemInter) { return (itemInter->pluginName().compare("shutdown") == 0); } + +void FixedPluginController::startLoader() +{ + QString pluginsDir(qApp->applicationDirPath() + "/../plugins"); + QDir dir(pluginsDir); + if (!dir.exists()) + pluginsDir = "/usr/lib/dde-dock/plugins"; + + AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); +} + +#define ICONSIZE 20 +#define ICONTEXTSPACE 6 +#define PLUGIN_ITEM_DRAG_THRESHOLD 20 + +StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter, const QString &itemKey, QWidget *parent) + : DockItem(parent) + , m_pluginInter(pluginInter) + , m_itemKey(itemKey) + , m_position(Dock::Position::Bottom) +{ +} + +StretchPluginsItem::~StretchPluginsItem() +{ +} + +void StretchPluginsItem::setPosition(Position position) +{ + m_position = position; + update(); +} + +QString StretchPluginsItem::itemKey() const +{ + return m_itemKey; +} + +PluginsItemInterface *StretchPluginsItem::pluginInter() const +{ + return m_pluginInter; +} + +void StretchPluginsItem::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + QPainter painter(this); + const QIcon *icon = m_pluginInter->icon(); + + QRect rctPixmap(rect()); + if (needShowText()) { + int textHeight = QFontMetrics(textFont()).height(); + // 文本与图标的间距为6 + int iconTop = (height() - textHeight - ICONSIZE - ICONTEXTSPACE) / 2; + rctPixmap.setX((width() - ICONSIZE) / 2); + rctPixmap.setY(iconTop); + rctPixmap.setWidth(ICONSIZE); + rctPixmap.setHeight(ICONSIZE); + // 先绘制下面的文本 + painter.setFont(textFont()); + painter.drawText(QRect(0, iconTop + ICONSIZE + ICONTEXTSPACE, width(), textHeight), Qt::AlignCenter, m_pluginInter->pluginDisplayName()); + } else { + rctPixmap.setX((width() - ICONSIZE) / 2); + rctPixmap.setY((height() - ICONSIZE) / 2); + rctPixmap.setWidth(ICONSIZE); + rctPixmap.setHeight(ICONSIZE); + } + + // 绘制图标 + if (icon) + painter.drawPixmap(rctPixmap, icon->pixmap(ICONSIZE, ICONSIZE)); +} + +QSize StretchPluginsItem::suitableSize() const +{ + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + int textWidth = QFontMetrics(textFont()).boundingRect(m_pluginInter->pluginDisplayName()).width(); + return QSize(qMax(textWidth, ICONSIZE) + 10 * 2, -1); + } + + int height = 6; // 图标上边距6 + height += ICONSIZE; // 图标尺寸20 + height += ICONTEXTSPACE; // 图标与文字间距6 + height += QFontMetrics(textFont()).height(); // 文本高度 + height += 4; // 下间距4 + return QSize(-1, height); +} + +QFont StretchPluginsItem::textFont() const +{ + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + static QList fonts{ DFontSizeManager::instance()->t9(), + DFontSizeManager::instance()->t8(), + DFontSizeManager::instance()->t7(), + DFontSizeManager::instance()->t6() }; +#define MINHEIGHT 50 + int index = qMin(qMax((height() - MINHEIGHT) / 2, 0), fonts.size() - 1); + return fonts[index]; + } + + return DFontSizeManager::instance()->t10(); +} + +bool StretchPluginsItem::needShowText() const +{ + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + return height() > (ICONSIZE + QFontMetrics(textFont()).height() + ICONTEXTSPACE); + + return true; +} + +const QString StretchPluginsItem::contextMenu() const +{ + return m_pluginInter->itemContextMenu(m_itemKey); +} + +void StretchPluginsItem::mousePressEvent(QMouseEvent *e) +{ + m_hover = false; + update(); + + if (PopupWindow->isVisible()) + hideNonModel(); + + if (e->button() == Qt::LeftButton) + m_mousePressPoint = e->pos(); + + m_popupTipsDelayTimer->stop(); + hideNonModel(); + + if (e->button() == Qt::RightButton + && perfectIconRect().contains(e->pos())) + return showContextMenu(); + + DockItem::mousePressEvent(e); +} + +void StretchPluginsItem::mouseReleaseEvent(QMouseEvent *e) +{ + DockItem::mouseReleaseEvent(e); + + if (e->button() != Qt::LeftButton) + return; + + if (checkAndResetTapHoldGestureState() && e->source() == Qt::MouseEventSynthesizedByQt) + return; + + const QPoint distance = e->pos() - m_mousePressPoint; + if (distance.manhattanLength() < PLUGIN_ITEM_DRAG_THRESHOLD) + mouseClick(); +} + +void StretchPluginsItem::mouseClick() +{ + const QString command = m_pluginInter->itemCommand(m_itemKey); + if (!command.isEmpty()) { + QProcess::startDetached(command); + return; + } + + // request popup applet + if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey)) + showPopupApplet(w); +} diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 7e3ad955a..3252f8081 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -26,8 +26,8 @@ #include -class DockPluginsController; -class PluginsItem; +class FixedPluginController; +class StretchPluginsItem; class QBoxLayout; namespace Dtk { namespace Widget { class DListView; } } @@ -47,33 +47,80 @@ public: Q_SIGNALS: void sizeChanged(); -private: - void initUi(); - int calcIconSize() const; +protected: void resizeEvent(QResizeEvent *event) override; +private: + void initUi(); + private Q_SLOTS: - void onPluginItemAdded(PluginsItem *pluginItem); - void onPluginItemRemoved(PluginsItem *pluginItem); - void onPluginItemUpdated(PluginsItem *pluginItem); + void onPluginItemAdded(StretchPluginsItem *pluginItem); + void onPluginItemRemoved(StretchPluginsItem *pluginItem); + void onPluginItemUpdated(StretchPluginsItem *pluginItem); private: - DockPluginsController *m_pluginController; + FixedPluginController *m_pluginController; DListView *m_listView; Dock::Position m_position; QBoxLayout *m_mainLayout; }; -class FixedPluginController : public DockPluginsController +class FixedPluginController : public AbstractPluginsController { Q_OBJECT public: explicit FixedPluginController(QObject *parent); + void startLoader(); + +Q_SIGNALS: + void pluginItemInserted(StretchPluginsItem *); + void pluginItemRemoved(StretchPluginsItem *); + void pluginItemUpdated(StretchPluginsItem *); protected: - PluginsItem *createPluginsItem(PluginsItemInterface *const itemInter, const QString &itemKey, const QString &pluginApi) override; + void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &) override; + void itemRemoved(PluginsItemInterface * const itemInter, const QString &) override; bool needLoad(PluginsItemInterface *itemInter) override; + + void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} + void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} + void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + +private: + QList m_pluginItems; +}; + +class StretchPluginsItem : public DockItem +{ + Q_OBJECT + +public: + StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + ~StretchPluginsItem() override; + void setPosition(Dock::Position position); + PluginsItemInterface *pluginInter() const; + QString itemKey() const; + QSize suitableSize() const; + +protected: + void paintEvent(QPaintEvent *event) override; + void mousePressEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; + + const QString contextMenu() const override; + +private: + void mouseClick(); + QFont textFont() const; + bool needShowText() const; + +private: + PluginsItemInterface *m_pluginInter; + QString m_itemKey; + Dock::Position m_position; + QPoint m_mousePressPoint; }; #endif // SYSTEMPLUGINWINDOW_H diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 79f361889..b8cc261ba 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -115,12 +115,9 @@ int TrayManagerWindow::appDatetimeSize() } int trayHeight = m_trayView->suitableSize().height(); - int datetimeHeight = m_dateTimeWidget->suitableSize().height(); QMargins m = m_appDatetimeLayout->contentsMargins(); int traypluginHeight = trayHeight + m_quickIconWidget->suitableSize().height() + m.top() + m.bottom() + m_appPluginLayout->spacing(); - if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::TopToBottom) - return traypluginHeight + m_appDatetimeLayout->spacing() + m_dateTimeWidget->suitableSize().height() + 10; - return (traypluginHeight > datetimeHeight ? traypluginHeight : datetimeHeight) + 10; + return traypluginHeight + m_appDatetimeLayout->spacing() + m_dateTimeWidget->suitableSize().height() + 10; } QSize TrayManagerWindow::suitableSize() @@ -129,10 +126,10 @@ QSize TrayManagerWindow::suitableSize() if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) { return QSize(appDatetimeSize() + m_appDatetimeLayout->spacing() + m_systemPluginWidget->suitableSize().width() + m_mainLayout->spacing() + - m.left() + m.right(), height()); + m.left() + m.right(), QWIDGETSIZE_MAX); } - return QSize(width(), appDatetimeSize() + m_appDatetimeLayout->spacing() + + return QSize(QWIDGETSIZE_MAX, appDatetimeSize() + m_appDatetimeLayout->spacing() + m_systemPluginWidget->suitableSize().height() + m_mainLayout->spacing() + m.top() + m.bottom()); } @@ -317,7 +314,6 @@ void TrayManagerWindow::resetChildWidgetSize() case Dock::Position::Bottom: { int trayWidth = m_trayView->suitableSize().width(); QMargins m = m_appPluginLayout->contentsMargins(); - m_appPluginDatetimeWidget->setFixedHeight(QWIDGETSIZE_MAX);// 取消固定高度显示 if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) { // 单行显示 int trayHeight = m_appPluginDatetimeWidget->height() - m.top() - m.bottom(); @@ -326,26 +322,28 @@ void TrayManagerWindow::resetChildWidgetSize() m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), trayHeight); m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), trayHeight); // 设置右侧的电源按钮的尺寸 - m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize().width(), QWIDGETSIZE_MAX); + m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize()); m_mainLayout->setContentsMargins(4, 4, 4 ,4); m_mainLayout->setSpacing(4); m_appDatetimeLayout->setSpacing(4); } else { // 多行显示 - m_trayView->setFixedSize(trayWidth, QWIDGETSIZE_MAX); - m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); + int trayHeight = m_appPluginDatetimeWidget->height() / 2 + 4 - m.top() - m.bottom(); + m_trayView->setFixedSize(trayWidth, trayHeight); + m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), m_appPluginDatetimeWidget->height() / 2 + 4); // 因为是两行,所以对于时间控件的尺寸,只能设置最小值 int dateTimeWidth = qMax(m_appPluginWidget->width(), m_dateTimeWidget->suitableSize().width()); m_dateTimeWidget->setMinimumSize(dateTimeWidth, QWIDGETSIZE_MAX); - m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize().width(), QWIDGETSIZE_MAX); - + m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize()); int contentSpace = qMin(MAXDIFF, qMax(height() - MINHIGHT, 0)) + MINSPACE; m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace); m_appDatetimeLayout->setSpacing(0); m_mainLayout->setSpacing(contentSpace); } - m_appPluginDatetimeWidget->setFixedWidth(appDatetimeSize()); + QMargins margin = m_mainLayout->contentsMargins(); + int appDateHeight = height() - margin.top() - margin.bottom(); + m_appPluginDatetimeWidget->setFixedSize(appDatetimeSize(), appDateHeight); break; } case Dock::Position::Left: @@ -353,7 +351,6 @@ void TrayManagerWindow::resetChildWidgetSize() int trayHeight = m_trayView->suitableSize().height(); int quickAreaHeight = m_quickIconWidget->suitableSize().height(); QMargins m = m_appPluginLayout->contentsMargins(); - m_appPluginDatetimeWidget->setFixedWidth(QWIDGETSIZE_MAX);// 取消固定宽度显示 // 左右方向始终只有一列 int datetimeHeight = m_dateTimeWidget->suitableSize().height(); int sizeWidth = m_appPluginDatetimeWidget->width() - m.left() - m.right(); @@ -361,13 +358,15 @@ void TrayManagerWindow::resetChildWidgetSize() m_quickIconWidget->setFixedSize(sizeWidth, quickAreaHeight); m_dateTimeWidget->setFixedSize(sizeWidth, datetimeHeight); m_appPluginWidget->setFixedSize(sizeWidth, trayHeight + quickAreaHeight); - m_appPluginDatetimeWidget->setFixedHeight(appDatetimeSize()); - m_systemPluginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPluginWidget->suitableSize().height()); + m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize()); int contentSpace = qMin(MAXDIFF, qMax(width() - MINHIGHT, 0)) + MINSPACE; m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace); m_appDatetimeLayout->setSpacing(0); m_mainLayout->setSpacing(contentSpace); + + int appDateWidth = width() - (contentSpace * 2); + m_appPluginDatetimeWidget->setFixedSize(appDateWidth, appDatetimeSize()); break; } } From 7c3db6c9bec09fd275e517056f0bf66228e7dc33 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 27 May 2022 09:27:33 +0800 Subject: [PATCH 018/257] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E8=AE=BE=E7=BD=AE=E5=A3=B0=E9=9F=B3=E3=80=81=E4=BA=AE?= =?UTF-8?q?=E5=BA=A6=E6=BB=9A=E5=8A=A8=E6=9D=A1=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、滚动条样式和设计图保持一致 2、滚动条右侧的图标增加阴影 Log: Influence: 滚动条-快捷设置面板 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: I3b4680c94efeb433d22cd3a1ab5d5745d456c3aa --- frame/item/quicksettingitem.cpp | 20 ++-- frame/util/imageutil.cpp | 36 ++++++ frame/util/imageutil.h | 1 + frame/window/components/brightnesswidget.cpp | 17 ++- frame/window/components/customslider.cpp | 116 ++++++++----------- frame/window/components/customslider.h | 18 ++- frame/window/components/mediawidget.cpp | 28 ++++- frame/window/components/mediawidget.h | 3 + frame/window/components/volumewidget.cpp | 15 ++- 9 files changed, 155 insertions(+), 99 deletions(-) diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 7cf401bb5..55e599896 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -20,6 +20,7 @@ */ #include "quicksettingitem.h" #include "pluginsiteminterface.h" +#include "imageutil.h" #include #include @@ -113,15 +114,8 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) int marginXSpace = xMarginSpace(); int marginYSpace = yMarginSpace(); QRect iconBg(marginXSpace, marginYSpace, BGSIZE, BGSIZE); - painter.save(); - painter.setPen(Qt::NoPen); - painter.setBrush(shadowColor()); - painter.drawEllipse(iconBg); - painter.restore(); - QRect rctIcon(iconBg.x() + (iconBg.width() - ICONWIDTH) / 2, - iconBg.y() + (iconBg.height() - ICONHEIGHT) / 2, - ICONWIDTH, ICONHEIGHT); - painter.drawPixmap(rctIcon, pm); + QPixmap bgPixmap = ImageUtil::getShadowPixmap(pm, shadowColor(), QSize(BGSIZE, BGSIZE)); + painter.drawPixmap(iconBg, bgPixmap); // 绘制文字 painter.setPen(QColor(0, 0, 0)); @@ -148,10 +142,10 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) painter.setPen(pen); int iconLeft = rect().width() - marginXSpace - expandSize.width(); int iconRight = rect().width() - marginXSpace; - painter.drawLine(QPoint(iconLeft, (rctIcon.y() + (rctIcon.height() - expandSize.height()) / 2)), - QPoint(iconRight, (rctIcon.y() + rctIcon.height() / 2))); - painter.drawLine(QPoint(iconRight, (rctIcon.y() + rctIcon.height() / 2)), - QPoint(iconLeft, (rctIcon.y() + (rctIcon.height() + expandSize.height()) / 2))); + painter.drawLine(QPoint(iconLeft, (iconBg.y() + (iconBg.height() - expandSize.height()) / 2)), + QPoint(iconRight, (iconBg.y() + iconBg.height() / 2))); + painter.drawLine(QPoint(iconRight, (iconBg.y() + iconBg.height() / 2)), + QPoint(iconLeft, (iconBg.y() + (iconBg.height() + expandSize.height()) / 2))); } else { // 绘制图标 QRect rctIcon = iconRect(); diff --git a/frame/util/imageutil.cpp b/frame/util/imageutil.cpp index 3cb66e2a5..8558d5480 100644 --- a/frame/util/imageutil.cpp +++ b/frame/util/imageutil.cpp @@ -26,6 +26,9 @@ #include #include #include +#include +#include +#include #include @@ -81,3 +84,36 @@ QCursor* ImageUtil::loadQCursorFromX11Cursor(const char* theme, const char* curs XcursorImagesDestroy(images); return cursor; } + +const QPixmap ImageUtil::getShadowPixmap(const QPixmap &pixmap, const QColor &shadowColor, const QSize &backSize) +{ + // 新建一个bitmap作为遮罩,尺寸为外部指定(backSize) + QBitmap bitmap(backSize); + QPainter painter(&bitmap); + painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + painter.setPen(Qt::NoPen); + // 往bitmap上绘制圆形区域 + QRect rectBackground(0, 0, backSize.width(), backSize.height()); + painter.fillRect(rectBackground, Qt::white); + painter.setBrush(Qt::black); + painter.drawEllipse(0, 0, backSize.width(), backSize.height()); + + // 新建QPixmap,将上述新建的Bitmap作为它的遮罩 + QPixmap newPixmap(backSize); + newPixmap.setMask(bitmap); + QPainter pixPainter(&newPixmap); + pixPainter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + const QSize iconSize = pixmap.size(); + int startX = (backSize.width() - iconSize.width()) / 2; + int startY = (backSize.height() - iconSize.height()) / 2; + // 将传入参数的背景尺寸(backSize)作为背景,通过画笔路径在上面绘制圆形区域 + QRect rectPixmap(startX, startY, iconSize.width(), iconSize.height()); + QPainterPath path; + path.addEllipse(rectBackground); + pixPainter.fillPath(path, shadowColor); + // 将图像绘制到新建的QPixmap的背景区域,并返回新的QPixmap + pixPainter.drawPixmap(rectPixmap, pixmap); + pixPainter.setPen(shadowColor); + pixPainter.drawEllipse(rectBackground); + return newPixmap; +} diff --git a/frame/util/imageutil.h b/frame/util/imageutil.h index 0ed1b3c37..0205e135c 100644 --- a/frame/util/imageutil.h +++ b/frame/util/imageutil.h @@ -35,6 +35,7 @@ public: static const QPixmap loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio); static const QPixmap loadSvg(const QString &iconName, const QSize size, const qreal ratio = qApp->devicePixelRatio()); static QCursor* loadQCursorFromX11Cursor(const char* theme, const char* cursorName, int cursorSize); + static const QPixmap getShadowPixmap(const QPixmap &pixmap, const QColor &shadowColor, const QSize &backSize); }; #endif // IMAGEUTIL_H diff --git a/frame/window/components/brightnesswidget.cpp b/frame/window/components/brightnesswidget.cpp index 8275657a2..8b67a2c46 100644 --- a/frame/window/components/brightnesswidget.cpp +++ b/frame/window/components/brightnesswidget.cpp @@ -22,10 +22,14 @@ #include "customslider.h" #include "brightnessmodel.h" #include "brightnessmonitorwidget.h" +#include "imageutil.h" #include #include +#define BACKSIZE 36 +#define IMAGESIZE 24 + BrightnessWidget::BrightnessWidget(QWidget *parent) : DBlurEffectWidget(parent) , m_slider(new CustomSlider(CustomSlider::SliderType::Normal, this)) @@ -63,11 +67,16 @@ void BrightnessWidget::initUi() layout->addWidget(m_slider); m_slider->setPageStep(1); - m_slider->setIconSize(QSize(24, 24)); + m_slider->setIconSize(QSize(BACKSIZE, BACKSIZE)); - m_slider->setLeftIcon(QIcon(":/icons/resources/brightness.svg")); - m_slider->setRightIcon(QIcon::fromTheme(":/icons/resources/ICON_Device_Laptop.svg")); - m_slider->setTickPosition(QSlider::TicksBelow); + QIcon leftIcon(QPixmap(":/icons/resources/brightness.svg").scaled(IMAGESIZE, IMAGESIZE)); + m_slider->setLeftIcon(leftIcon); + QPixmap rightPixmap = ImageUtil::getShadowPixmap(QPixmap(QString(":/icons/resources/ICON_Device_Laptop.svg")).scaled(24, 24), Qt::lightGray, QSize(36, 36)); + m_slider->setRightIcon(rightPixmap); + + SliderProxy *style = new SliderProxy; + style->setParent(m_slider->qtSlider()); + m_slider->qtSlider()->setStyle(style); } void BrightnessWidget::initConenction() diff --git a/frame/window/components/customslider.cpp b/frame/window/components/customslider.cpp index 80c1b0a2f..d53e3a1ce 100644 --- a/frame/window/components/customslider.cpp +++ b/frame/window/components/customslider.cpp @@ -20,9 +20,11 @@ */ #include "customslider.h" +#include #include #include +#include #include #include @@ -34,7 +36,6 @@ DWIDGET_USE_NAMESPACE CustomSlider::CustomSlider(CustomSlider::SliderType type, QWidget *parent) : DSlider(Qt::Horizontal, parent) - , m_separateValue(0) { setType(type); DSlider::slider()->setTracking(false); @@ -100,79 +101,11 @@ void CustomSlider::setOrientation(Qt::Orientation orientation) Q_UNUSED(orientation) } -void CustomSlider::setSeparateValue(int value) -{ - m_separateValue = value; -} - void CustomSlider::wheelEvent(QWheelEvent *e) { e->ignore(); } -void CustomSlider::paintEvent(QPaintEvent *e) -{ - Q_UNUSED(e) - - if (m_separateValue <= 0) - return; - - QPainter pa(this); - auto dpa = DApplicationHelper::instance()->palette(this); - QPen penLine = QPen(dpa.color(DPalette::ObviousBackground), 2); - - //超过间隔线后需要更换间隔线颜色为活动色 - if (qtSlider()->value() >= m_separateValue ) { - QPalette pe = this->palette(); - QColor brushColor(pe.color(QPalette::Highlight)); - penLine.setColor(brushColor); - } - - int margin = DStyle::pixelMetric(style(), DStyle::PM_FocusBorderSpacing) + DStyle::pixelMetric(style(), DStyle::PM_FocusBorderSpacing); - int offsetSize = style()->pixelMetric(QStyle::PM_SliderLength, nullptr, this) / 2; - int width = this->qtSlider()->width(); - - width -= 2 * offsetSize + margin * 2; - Qt::Orientation orient = this->orientation(); - QSlider::TickPosition tick = m_tickPosition; - QSlider* slider = DSlider::slider(); - qreal percentage = (m_separateValue - slider->minimum()) * 1.0 / (slider->maximum() - slider->minimum()); - - pa.setPen(penLine); - int leftIconwidth = 0; - //获取左边声音图标宽度 - QGridLayout *gridLayout = dynamic_cast(this->layout()); - if (!gridLayout) - return; - QLayoutItem* item = gridLayout->itemAtPosition(1, 0); - if (item) { - leftIconwidth = item->geometry().size().width(); - } - - qreal startX = offsetSize + margin + leftIconwidth + this->contentsMargins().left(); - qreal startY = slider->y() + 10; - //分别绘制滑动条上方矩形和下方矩形,避免与滑动条重叠, - //画笔宽为2个像素,设置绘制时矩形高设为3,可达到高度为5的效果 - if (orient == Qt::Horizontal) { - qreal sliderX = percentage * width; - if (slider->value() >= m_separateValue) { - int num = (sliderX + 2) / 3; - qAbs(3 * num + 1 - sliderX) - qAbs(sliderX - (3 * num - 2)) >= 0 ? num : num++; - sliderX = 3 * num - 2; - } else { - //将分割线左、右的滚动条进行比较获取距离最相近的位置,绘制分割线 - sliderX = (slider->maximum() - m_separateValue) * 1.0 * width / slider->maximum(); - int num = (sliderX + 1) / 3; - qAbs(3 * num - sliderX) - qAbs(sliderX - 3 * (num - 1)) >= 0 ? num : num++; - sliderX = width - (3 * num - 1); - } - if (tick == QSlider::TicksAbove || tick == QSlider::TicksBelow || tick == QSlider::NoTicks) { - pa.drawLine(QPointF(startX + sliderX, startY), QPointF(startX + sliderX, startY + 3)); - pa.drawLine(QPointF(startX + sliderX, startY + 9), QPointF(startX + sliderX, startY + 12)); - } - } -} - SliderContainer::SliderContainer(CustomSlider::SliderType type, QWidget *parent) : QWidget (parent) , m_slider(new CustomSlider(type, this)) @@ -212,3 +145,48 @@ CustomSlider *SliderContainer::slider() { return m_slider; } + +SliderProxy::SliderProxy(QStyle *style) + : QProxyStyle(style) +{ +} + +SliderProxy::~SliderProxy() +{ +} + +void SliderProxy::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const +{ + if (control != ComplexControl::CC_Slider) + return; + + // 绘制之前先保存之前的画笔 + painter->save(); + painter->setRenderHint(QPainter::RenderHint::Antialiasing); + // 获取滑动条和滑块的区域 + const QStyleOptionSlider *sliderOption = static_cast(option); + QRect rectGroove = subControlRect(CC_Slider, sliderOption, SC_SliderGroove, widget); + QRect rectHandle = subControlRect(CC_Slider, sliderOption, SC_SliderHandle, widget); + // 深色背景下,滑块和滑动条白色,浅色背景下,滑块和滑动条黑色 + QBrush brush(DGuiApplicationHelper::DarkType == DGuiApplicationHelper::instance()->themeType() ? Qt::white : Qt::black); + // 此处中绘制圆形滑动条,需要绘制圆角,圆角大小为其高度的一半 + QPainterPath pathGroove; + int radius = rectGroove.height() / 2; + pathGroove.addRoundedRect(rectGroove, radius, radius); + painter->fillPath(pathGroove, brush); + + // 绘制滑块,因为滑块是正圆形,而它本来的区域是一个长方形区域,因此,需要计算当前 + // 区域的正中心区域,将其作为一个正方形区域来绘制圆形滑块 + int handleSize = qMin(rectHandle.width(), rectHandle.height()); + int x = rectHandle.x() + (rectHandle.width() - handleSize) / 2; + int y = rectHandle.y() + (rectHandle.height() - handleSize) / 2; + rectHandle.setX(x); + rectHandle.setY(y); + rectHandle.setWidth(handleSize); + rectHandle.setHeight(handleSize); + + QPainterPath pathHandle; + pathHandle.addEllipse(rectHandle); + painter->fillPath(pathHandle, brush); + painter->restore(); +} diff --git a/frame/window/components/customslider.h b/frame/window/components/customslider.h index 5c8a5ad8f..d4daba0f2 100644 --- a/frame/window/components/customslider.h +++ b/frame/window/components/customslider.h @@ -23,6 +23,7 @@ #define CUSTOMCTRL_H #include +#include #include class QLabel; @@ -52,15 +53,12 @@ public: void setSliderPosition(int Position); void setAnnotations(const QStringList &annotations); void setOrientation(Qt::Orientation orientation); - //当value大于0时,在slider中插入一条分隔线 - void setSeparateValue(int value = 0); protected: void wheelEvent(QWheelEvent *e); - void paintEvent(QPaintEvent *e); + private: QSlider::TickPosition m_tickPosition = QSlider::TicksBelow; - int m_separateValue; }; class SliderContainer : public QWidget @@ -79,4 +77,16 @@ private: QLabel *m_titleLabel; }; +class SliderProxy : public QProxyStyle +{ + Q_OBJECT + +public: + explicit SliderProxy(QStyle *style = nullptr); + ~SliderProxy() override; + +protected: + void drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const override; +}; + #endif // VOLUMESLIDER_H diff --git a/frame/window/components/mediawidget.cpp b/frame/window/components/mediawidget.cpp index ae2fe112b..934845166 100644 --- a/frame/window/components/mediawidget.cpp +++ b/frame/window/components/mediawidget.cpp @@ -18,6 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include "customslider.h" #include "mediawidget.h" #include @@ -151,6 +152,7 @@ void MediaWidget::onUpdateMediaInfo() * @brief 音乐播放的相关按钮 * @param parent */ + MusicButton::MusicButton(QWidget *parent) : QWidget(parent) { @@ -161,14 +163,28 @@ MusicButton::~MusicButton() { } +int MusicButton::getIconHeight() const +{ + switch (m_buttonType) { + case ButtonType::Pause: + return 21; + case ButtonType::Next: + case ButtonType::Playing: + return 18; + } + + return 18; +} + void MusicButton::paintEvent(QPaintEvent *event) { -#define ICONHEIGHT 20 Q_UNUSED(event); + int ctrlHeight = getIconHeight(); + int width = this->width(); int height = this->height(); int startX = 2; - int startY = (height - ICONHEIGHT) / 2; + int startY = (height - ctrlHeight) / 2; QColor color(0, 0, 0); QPainter painter(this); painter.save(); @@ -176,17 +192,17 @@ void MusicButton::paintEvent(QPaintEvent *event) painter.setPen(color); painter.setBrush(color); if (m_buttonType == ButtonType::Pause) { - painter.drawRect(QRect(startX, startY, 6, ICONHEIGHT)); - painter.drawRect(QRect(width - 6 - 2, startY, 6, ICONHEIGHT)); + painter.drawRect(QRect(startX, startY, 6, ctrlHeight)); + painter.drawRect(QRect(width - 6 - 2, startY, 6, ctrlHeight)); } else { QPainterPath trianglePath; trianglePath.moveTo(startX, startY); trianglePath.lineTo(width - 6, height / 2); - trianglePath.lineTo(startX, startY + ICONHEIGHT); + trianglePath.lineTo(startX, startY + ctrlHeight); trianglePath.lineTo(startX, startY); painter.drawPath(trianglePath); if (m_buttonType == ButtonType::Next) - painter.drawRect(width - 6, startY, 2, ICONHEIGHT); + painter.drawRect(width - 6, startY, 2, ctrlHeight); } painter.restore(); } diff --git a/frame/window/components/mediawidget.h b/frame/window/components/mediawidget.h index d5d870287..4d9b59146 100644 --- a/frame/window/components/mediawidget.h +++ b/frame/window/components/mediawidget.h @@ -87,6 +87,9 @@ protected: void paintEvent(QPaintEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; +private: + int getIconHeight() const; + private: ButtonType m_buttonType; }; diff --git a/frame/window/components/volumewidget.cpp b/frame/window/components/volumewidget.cpp index c36ebe45c..7ad92b581 100644 --- a/frame/window/components/volumewidget.cpp +++ b/frame/window/components/volumewidget.cpp @@ -22,6 +22,7 @@ #include "customslider.h" #include "imageutil.h" #include "volumemodel.h" +#include "imageutil.h" #include @@ -41,6 +42,7 @@ DGUI_USE_NAMESPACE #define ICON_SIZE 24 +#define BACKSIZE 36 VolumeWidget::VolumeWidget(QWidget *parent) : DBlurEffectWidget(parent) @@ -65,9 +67,16 @@ void VolumeWidget::initUi() mainLayout->setContentsMargins(20, 0, 20, 0); mainLayout->addWidget(m_volumnCtrl); - m_volumnCtrl->setIconSize(QSize(36, 36)); - m_volumnCtrl->setLeftIcon(QIcon(leftIcon())); - m_volumnCtrl->setRightIcon(QIcon(rightIcon())); + const QString rightIconFile = rightIcon(); + QIcon rIcon = ImageUtil::getShadowPixmap(QPixmap(rightIconFile), Qt::lightGray, QSize(BACKSIZE, BACKSIZE)); + + m_volumnCtrl->setIconSize(QSize(BACKSIZE, BACKSIZE)); + m_volumnCtrl->setLeftIcon(QIcon(QPixmap(leftIcon()))); + m_volumnCtrl->setRightIcon(rIcon); + + SliderProxy *proxy = new SliderProxy; + proxy->setParent(m_volumnCtrl->qtSlider()); + m_volumnCtrl->qtSlider()->setStyle(proxy); bool existActiveOutputDevice = m_volumeController->existActiveOutputDevice(); setEnabled(existActiveOutputDevice); From 9a81886b6a14a28c75d0fc7b1cd8fdc3bec052c8 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 27 May 2022 15:09:15 +0800 Subject: [PATCH 019/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=B6?= =?UTF-8?q?=E5=B0=9A=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=97=A0=E6=B3=95=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=94=B5=E6=BA=90=E6=8C=89=E9=92=AE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:电源按钮只会加载一次,在时尚模式下已经加载过,导致在高效模式下没有加载到任务栏的controller中 解决方案:将加载电源按钮的controller用一个单例的代理类来实现,FixedPluginController和DockPluginsController同时引用这个类来加载同一个插件 Log: 解决时尚模式下无法显示电源按钮的问题 Influence: 任务栏-查看高效模式下电源插件是否加载 Bug: https://pms.uniontech.com/bug-view-132733.html Change-Id: I80d0cb9c87e6e1a478410f53a35ccfce344677ea --- frame/controller/dockpluginscontroller.cpp | 41 ++----- frame/controller/dockpluginscontroller.h | 5 +- frame/controller/fixedplugincontroller.cpp | 65 +++++++++++ frame/controller/fixedplugincontroller.h | 54 +++++++++ frame/controller/proxyplugincontroller.cpp | 127 +++++++++++++++++++++ frame/controller/proxyplugincontroller.h | 64 +++++++++++ frame/util/abstractpluginscontroller.h | 4 + frame/window/mainpanelcontrol.cpp | 10 ++ frame/window/systempluginwindow.cpp | 53 +-------- frame/window/systempluginwindow.h | 27 ----- 10 files changed, 338 insertions(+), 112 deletions(-) create mode 100644 frame/controller/fixedplugincontroller.cpp create mode 100644 frame/controller/fixedplugincontroller.h create mode 100644 frame/controller/proxyplugincontroller.cpp create mode 100644 frame/controller/proxyplugincontroller.h diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index 012a92f5c..9959290fe 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -20,6 +20,7 @@ */ #include "dockpluginscontroller.h" +#include "proxyplugincontroller.h" #include "pluginsiteminterface.h" #include "traypluginitem.h" @@ -31,6 +32,13 @@ DockPluginsController::DockPluginsController(QObject *parent) : AbstractPluginsController(parent) { setObjectName("DockPlugin"); + + ProxyPluginController::instance()->addProxyInterface(this); +} + +DockPluginsController::~DockPluginsController() +{ + ProxyPluginController::instance()->removeProxyInterface(this); } void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, const QString &itemKey) @@ -43,10 +51,10 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con return; // 取 plugin api - QPluginLoader *pluginLoader = qobject_cast(mPluginsMap[itemInter].value("pluginloader")); - if (!pluginLoader) { + QPluginLoader *pluginLoader = ProxyPluginController::instance()->pluginLoader(itemInter); + if (!pluginLoader) return; - } + const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); const QString &pluginApi = meta.value("api").toString(); @@ -135,30 +143,5 @@ void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const void DockPluginsController::startLoader() { - loadLocalPlugins(); - loadSystemPlugins(); -} - -void DockPluginsController::loadLocalPlugins() -{ - QString pluginsDir(QString("%1/.local/lib/dde-dock/plugins/").arg(QDir::homePath())); - - if (!QDir(pluginsDir).exists()) { - return; - } - - qDebug() << "using dock local plugins dir:" << pluginsDir; - - AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); -} - -void DockPluginsController::loadSystemPlugins() -{ - QString pluginsDir(qApp->applicationDirPath() + "/../plugins"); -#ifndef QT_DEBUG - pluginsDir = "/usr/lib/dde-dock/plugins"; -#endif - qDebug() << "using dock plugins dir:" << pluginsDir; - - AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); + ProxyPluginController::instance()->startLoader(); } diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index af759c5de..7a948e516 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -43,6 +43,7 @@ class DockPluginsController : public AbstractPluginsController public: explicit DockPluginsController(QObject *parent = nullptr); + ~DockPluginsController() override; // implements PluginProxyInterface void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; @@ -59,10 +60,6 @@ signals: void pluginItemRemoved(PluginsItem *pluginItem) const; void pluginItemUpdated(PluginsItem *pluginItem) const; void trayVisableCountChanged(const int &count) const; - -private: - void loadLocalPlugins(); - void loadSystemPlugins(); }; #endif // DOCKPLUGINSCONTROLLER_H diff --git a/frame/controller/fixedplugincontroller.cpp b/frame/controller/fixedplugincontroller.cpp new file mode 100644 index 000000000..049fa9bec --- /dev/null +++ b/frame/controller/fixedplugincontroller.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "fixedplugincontroller.h" +#include "utils.h" +#include "proxyplugincontroller.h" +#include "systempluginwindow.h" + +FixedPluginController::FixedPluginController(QObject *parent) + : AbstractPluginsController(parent) +{ + setObjectName("FixedPluginController"); + ProxyPluginController::instance()->addProxyInterface(this, QStringList("shutdown")); +} + +FixedPluginController::~FixedPluginController() +{ + ProxyPluginController::instance()->removeProxyInterface(this); +} + +void FixedPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + StretchPluginsItem *item = new StretchPluginsItem(itemInter, itemKey); + m_pluginItems << item; + Q_EMIT pluginItemInserted(item); +} + +void FixedPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) +{ + for (StretchPluginsItem *item : m_pluginItems) { + if (item->pluginInter() == itemInter) { + Q_EMIT pluginItemUpdated(item); + break; + } + } +} + +void FixedPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &) +{ + for (StretchPluginsItem *item : m_pluginItems) { + if (item->pluginInter() == itemInter) { + m_pluginItems.removeOne(item); + Q_EMIT pluginItemRemoved(item); + item->deleteLater(); + break; + } + } +} diff --git a/frame/controller/fixedplugincontroller.h b/frame/controller/fixedplugincontroller.h new file mode 100644 index 000000000..5b81be541 --- /dev/null +++ b/frame/controller/fixedplugincontroller.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef FIXEDPLUGINCONTROLLER_H +#define FIXEDPLUGINCONTROLLER_H + +#include "abstractpluginscontroller.h" + +class StretchPluginsItem; + +class FixedPluginController : public AbstractPluginsController +{ + Q_OBJECT + +public: + explicit FixedPluginController(QObject *parent = nullptr); + ~FixedPluginController() override; + +Q_SIGNALS: + void pluginItemInserted(StretchPluginsItem *); + void pluginItemRemoved(StretchPluginsItem *); + void pluginItemUpdated(StretchPluginsItem *); + +protected: + void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &) override; + void itemRemoved(PluginsItemInterface * const itemInter, const QString &) override; + + void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} + void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} + void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + +private: + QList m_pluginItems; +}; + +#endif // FIXEDPLUGINCONTROLLER_H diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp new file mode 100644 index 000000000..289a2eee9 --- /dev/null +++ b/frame/controller/proxyplugincontroller.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "proxyplugincontroller.h" +#include "pluginsiteminterface.h" + +QMap ProxyPluginController::m_instances = {}; + +// 该方法用来设置所有的需要加载的插件的路径信息 +static QMap> getPluginPaths() +{ + QList pluginPaths; + pluginPaths << QStringList{ QString("%1/.local/lib/dde-dock/plugins/").arg(QDir::homePath()) } + << QStringList{ QString(qApp->applicationDirPath() + "/../plugins"), + QString("/usr/lib/dde-dock/plugins") }; + QMap> plugins; + plugins[FIXEDSYSTEMPLUGIN] = pluginPaths; + return plugins; +} + +// 该方法根据当前加载插件的类型来生成对应的单例的类 +ProxyPluginController *ProxyPluginController::instance(int instanceKey) +{ + static QMap> pluginLoadInfos = getPluginPaths(); + + if (m_instances.contains(instanceKey)) + return m_instances.value(instanceKey); + + // 生成单例类,获取加载插件的路径信息 + ProxyPluginController *controller = new ProxyPluginController(); + controller->m_dirs = (pluginLoadInfos.contains(instanceKey) ? pluginLoadInfos[instanceKey] : QList()); + m_instances[instanceKey] = controller; + return controller; +} + +// 新增要使用的控制器,第二个参数表示当前控制器需要加载的插件名称,为空表示加载所有插件 +void ProxyPluginController::addProxyInterface(AbstractPluginsController *interface, const QStringList &pluginNames) +{ + if (!m_interfaces.contains(interface)) + m_interfaces[interface] = pluginNames; +} + +void ProxyPluginController::removeProxyInterface(AbstractPluginsController *interface) +{ + if (m_interfaces.contains(interface)) + m_interfaces.remove(interface); +} + +ProxyPluginController::ProxyPluginController(QObject *parent) + : AbstractPluginsController(parent) +{ +} + +QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const itemInter) +{ + QMap > &plugin = pluginsMap(); + if (plugin.contains(itemInter)) + return qobject_cast(plugin[itemInter].value("pluginloader")); + + return nullptr; +} + +void ProxyPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + // 只有当前的controll设置的过滤名称包含当前插件的名称或者过滤名称为空,才新增当前插件 + QList pluginKeys = m_interfaces.keys(); + for (AbstractPluginsController *interface: pluginKeys) { + const QStringList &filterNames = m_interfaces[interface]; + if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName())) + interface->itemAdded(itemInter, itemKey); + } +} + +void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + QList pluginKeys = m_interfaces.keys(); + for (AbstractPluginsController *interface: pluginKeys) { + const QStringList &filterNames = m_interfaces[interface]; + if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName())) + interface->itemUpdate(itemInter, itemKey); + } +} + +void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + QList pluginKeys = m_interfaces.keys(); + for (AbstractPluginsController *interface: pluginKeys) { + const QStringList &filterNames = m_interfaces[interface]; + if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName())) + interface->itemRemoved(itemInter, itemKey); + } +} + +void ProxyPluginController::startLoader() +{ + QDir dir; + for (const QStringList &pluginPaths : m_dirs) { + QString loadPath; + for (const QString &pluginPath : pluginPaths) { + if (!dir.exists(pluginPath)) + continue; + + loadPath = pluginPath; + break; + } + + if (!loadPath.isEmpty()) + AbstractPluginsController::startLoader(new PluginLoader(loadPath, this)); + } +} diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h new file mode 100644 index 000000000..5e9f1042e --- /dev/null +++ b/frame/controller/proxyplugincontroller.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef PROXYPLUGINCONTROLLER_H +#define PROXYPLUGINCONTROLLER_H + +#include "abstractpluginscontroller.h" + +class PluginsItemInterface; +// 加载的插件的类型 +#define FIXEDSYSTEMPLUGIN 1 + +// 该类是一个底层用来加载系统插件的类,DockPluginsController和 +// FixedPluginController类都是通过这个类来加载系统插件的 +// 该类做成一个单例,因为理论上一个插件只允许被加载一次,但是对于电源插件来说, +// 电源插件在高效模式和特效模式下都需要显示,因此,此类用于加载插件,然后分发到不同的 +// 上层控制器中 +class ProxyPluginController : public AbstractPluginsController +{ + Q_OBJECT + +public: + static ProxyPluginController *instance(int instanceKey = FIXEDSYSTEMPLUGIN); + void addProxyInterface(AbstractPluginsController *interface, const QStringList &pluginNames = QStringList()); + void removeProxyInterface(AbstractPluginsController *interface); + void startLoader(); + QPluginLoader *pluginLoader(PluginsItemInterface * const itemInter); + +protected: + explicit ProxyPluginController(QObject *parent = nullptr); + ~ProxyPluginController() override {} + + void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; + + void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} + void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} + void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + +private: + static QMap m_instances; + QMap m_interfaces; + QList m_dirs; +}; + +#endif // PROXYPLUGINCONTROLLER_H diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index 80e39a745..84c8e2c2e 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -48,6 +48,10 @@ public: const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override; void removeValue(PluginsItemInterface * const itemInter, const QStringList &keyList) override; + void itemAdded(PluginsItemInterface * const, const QString &) override {} + void itemUpdate(PluginsItemInterface * const, const QString &) override {} + void itemRemoved(PluginsItemInterface * const, const QString &) override {} + signals: void pluginLoaderFinished(); diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index d8470d827..116f1cad4 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -275,6 +275,8 @@ void MainPanelControl::addTrayAreaItem(int index, QWidget *wdg) { m_tray = static_cast(wdg); m_trayAreaLayout->insertWidget(index, wdg); + if (m_tray) + m_tray->installEventFilter(this); } /**往插件区域添加应用,保存回收站插件指针对象 @@ -670,6 +672,14 @@ void MainPanelControl::dragMoveEvent(QDragMoveEvent *e) bool MainPanelControl::eventFilter(QObject *watched, QEvent *event) { + // 在从时尚模式切换到高效模式的时候, + // m_tray子部件会调整高度,此时会触发m_tray调整尺寸 + // 但是子部件的模式变化函数在FashionTrayItem部件中的 + // NormalContainer部件尺寸变化完成之前就已经结束,导致 + // NormalContainer没有更新自己的尺寸,引起插件区域拥挤 + if (m_tray && watched == m_tray && event->type() == QEvent::Resize) + m_tray->pluginItem()->displayModeChanged(m_dislayMode); + // 更新应用区域大小和任务栏图标大小 if (watched == m_appAreaSonWidget) { switch (event->type()) { diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 827b6fd2c..80c951032 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -22,6 +22,7 @@ #include "systemplugincontroller.h" #include "systempluginitem.h" #include "dockpluginscontroller.h" +#include "fixedplugincontroller.h" #include #include @@ -43,7 +44,6 @@ SystemPluginWindow::SystemPluginWindow(QWidget *parent) connect(m_pluginController, &FixedPluginController::pluginItemInserted, this, &SystemPluginWindow::onPluginItemAdded); connect(m_pluginController, &FixedPluginController::pluginItemRemoved, this, &SystemPluginWindow::onPluginItemRemoved); connect(m_pluginController, &FixedPluginController::pluginItemUpdated, this, &SystemPluginWindow::onPluginItemUpdated); - QMetaObject::invokeMethod(m_pluginController, &FixedPluginController::startLoader, Qt::QueuedConnection); } SystemPluginWindow::~SystemPluginWindow() @@ -140,57 +140,6 @@ void SystemPluginWindow::onPluginItemUpdated(StretchPluginsItem *pluginItem) pluginItem->update(); } -// can loader plugins -FixedPluginController::FixedPluginController(QObject *parent) - : AbstractPluginsController(parent) -{ - setObjectName("FixedPluginController"); -} - -void FixedPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - StretchPluginsItem *item = new StretchPluginsItem(itemInter, itemKey); - m_pluginItems << item; - Q_EMIT pluginItemInserted(item); -} - -void FixedPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) -{ - for (StretchPluginsItem *item : m_pluginItems) { - if (item->pluginInter() == itemInter) { - Q_EMIT pluginItemUpdated(item); - break; - } - } -} - -void FixedPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &) -{ - for (StretchPluginsItem *item : m_pluginItems) { - if (item->pluginInter() == itemInter) { - m_pluginItems.removeOne(item); - Q_EMIT pluginItemRemoved(item); - item->deleteLater(); - break; - } - } -} - -bool FixedPluginController::needLoad(PluginsItemInterface *itemInter) -{ - return (itemInter->pluginName().compare("shutdown") == 0); -} - -void FixedPluginController::startLoader() -{ - QString pluginsDir(qApp->applicationDirPath() + "/../plugins"); - QDir dir(pluginsDir); - if (!dir.exists()) - pluginsDir = "/usr/lib/dde-dock/plugins"; - - AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); -} - #define ICONSIZE 20 #define ICONTEXTSPACE 6 #define PLUGIN_ITEM_DRAG_THRESHOLD 20 diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 3252f8081..31642cde8 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -65,33 +65,6 @@ private: QBoxLayout *m_mainLayout; }; -class FixedPluginController : public AbstractPluginsController -{ - Q_OBJECT - -public: - explicit FixedPluginController(QObject *parent); - void startLoader(); - -Q_SIGNALS: - void pluginItemInserted(StretchPluginsItem *); - void pluginItemRemoved(StretchPluginsItem *); - void pluginItemUpdated(StretchPluginsItem *); - -protected: - void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemUpdate(PluginsItemInterface * const itemInter, const QString &) override; - void itemRemoved(PluginsItemInterface * const itemInter, const QString &) override; - bool needLoad(PluginsItemInterface *itemInter) override; - - void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} - void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} - void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} - -private: - QList m_pluginItems; -}; - class StretchPluginsItem : public DockItem { Q_OBJECT From 4f7704ad6f1be8474dcfca0ce0709f8f8c187aef Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 27 May 2022 17:34:02 +0800 Subject: [PATCH 020/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=97=A0=E6=B3=95=E5=94=A4?= =?UTF-8?q?=E9=86=92=E4=BB=BB=E5=8A=A1=E6=A0=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:隐藏模式下会持续发送sizeChanged信号,导致频繁触发隐藏任务栏的函数 修改:接受到sizeChanged信号后,让其显示正常尺寸即可 Log: Influence: 任务栏-隐藏模式-鼠标唤醒 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I1b813d2a3f1d1d96d9e162d4f19cc2579ee26f98 --- frame/util/multiscreenworker.cpp | 102 ++++++++++++++++++---------- frame/util/multiscreenworker.h | 3 + frame/window/mainpanelcontrol.cpp | 71 +++++++++++++------ frame/window/mainpanelcontrol.h | 9 ++- frame/window/systempluginwindow.cpp | 6 -- frame/window/systempluginwindow.h | 3 - frame/window/traymanagerwindow.cpp | 41 +++++------ frame/window/traymanagerwindow.h | 4 +- 8 files changed, 147 insertions(+), 92 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 43651ff9f..3c779bec6 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -124,8 +124,8 @@ QRect MultiScreenWorker::dockRect(const QString &screenName, const Position &pos { if (hideMode == HideMode::KeepShowing || (hideMode == HideMode::SmartHide && m_hideState == HideState::Show)) return getDockShowGeometry(screenName, pos, displayMode); - else - return getDockHideGeometry(screenName, pos, displayMode); + + return getDockHideGeometry(screenName, pos, displayMode); } /** @@ -236,7 +236,18 @@ void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString void MultiScreenWorker::showAniFinished() { - const QRect rect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); + QRect rect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); + if (m_displayMode == Dock::DisplayMode::Fashion + && (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)) { + // 特效模式下且在上下位置,需要先设置高度,因为trayManager + // 里面需要根据顶层窗口的高度来设置显示一行还是两行, + // 此时trayManager的长度就会发送变化,返回的建议值才是正确的尺寸值 + parent()->setFixedHeight(rect.height()); + // 调用更新布局接口来调整trayManager窗口的尺寸 + parent()->panel()->updatePluginsLayout(); + // 重新获取窗口尺寸 + rect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); + } parent()->setFixedSize(rect.size()); parent()->setGeometry(rect); @@ -883,6 +894,19 @@ void MultiScreenWorker::onRequestDelayShowDock() } } +void MultiScreenWorker::onChildSizeChanged() +{ + // 如果当前为隐藏,则无需再次设置其尺寸 + if (parent()->height() == 0) + return; + + QSize dockSize = dockRect(m_ds.current(), position(), HideMode::KeepShowing, displayMode()).size(); + parent()->setFixedSize(dockSize); + parent()->panel()->setFixedSize(dockSize); + parent()->panel()->move(0, 0); + parent()->panel()->update(); +} + MainWindow *MultiScreenWorker::parent() { return static_cast(m_parent); @@ -892,6 +916,7 @@ void MultiScreenWorker::initMembers() { m_monitorUpdateTimer->setInterval(100); m_monitorUpdateTimer->setSingleShot(true); + parent()->panel()->setDockScreen(&m_ds); m_delayWakeTimer->setSingleShot(true); @@ -907,7 +932,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(parent()->panel(), &MainPanelControl::sizeChanged, this, &MultiScreenWorker::onChildSizeChanged); connect(m_launcherInter, static_cast(&DBusLuncher::VisibleChanged), this, [ = ](bool value) { setStates(LauncherDisplay, value); }); @@ -1508,38 +1533,38 @@ QRect MultiScreenWorker::getDockShowGeometry(const QString &screenName, const Po QRect screenRect = s->handle()->geometry(); switch (pos) { - case Position::Top: - parent()->panel()->setScreenSize(static_cast(screenRect.width())); - - rect.setX((static_cast(screenRect.width() / ratio) - parent()->panel()->suitableSize(ratio).width()) / 2); + case Position::Top: { + QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); + rect.setX((static_cast(screenRect.width() / ratio) - panelSize.width()) / 2); rect.setY(static_cast((screenRect.y() + margin) / ratio)); - rect.setWidth(parent()->panel()->suitableSize(ratio).width()); + rect.setWidth(panelSize.width()); rect.setHeight(dockSize); + } break; - case Position::Bottom: + case Position::Bottom: { // 先用设置屏幕尺寸,理论上不应该在此处设置,因为这是在一个get方法里面,后续改成直接获取,在其他地方设置 - parent()->panel()->setScreenSize(static_cast(screenRect.width())); - - rect.setX((static_cast(screenRect.width() / ratio) - parent()->panel()->suitableSize(ratio).width()) / 2); + QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); + rect.setX((static_cast(screenRect.width() / ratio) - panelSize.width()) / 2); rect.setY(static_cast(screenRect.y() + screenRect.height() / ratio - margin - dockSize)); - rect.setWidth(parent()->panel()->suitableSize(ratio).width()); + rect.setWidth(panelSize.width()); rect.setHeight(dockSize); + } break; - case Position::Left: - parent()->panel()->setScreenSize(static_cast(screenRect.height())); - + case Position::Left: { + QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); rect.setX(static_cast(screenRect.x() + margin)); - rect.setY((static_cast(screenRect.height() / ratio) - parent()->panel()->suitableSize(ratio).height()) / 2); + rect.setY((static_cast(screenRect.height() / ratio) - panelSize.height()) / 2); rect.setWidth(dockSize); - rect.setHeight(parent()->panel()->suitableSize(ratio).height()); + rect.setHeight(panelSize.height()); + } break; - case Position::Right: - parent()->panel()->setScreenSize(static_cast(screenRect.height())); - + case Position::Right: { + QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); rect.setX(static_cast(screenRect.x() + screenRect.width() / ratio - margin - dockSize)); - rect.setY((static_cast(screenRect.height() / ratio) - parent()->panel()->suitableSize(ratio).height()) / 2); + rect.setY((static_cast(screenRect.height() / ratio) - panelSize.height()) / 2); rect.setWidth(dockSize); - rect.setHeight(parent()->panel()->suitableSize(ratio).height()); + rect.setHeight(panelSize.height()); + } break; } } @@ -1568,29 +1593,36 @@ QRect MultiScreenWorker::getDockHideGeometry(const QString &screenName, const Po QRect screenRect = s->handle()->geometry(); switch (pos) { - case Position::Top: - rect.setX(static_cast(screenRect.x() + margin)); + case Position::Top: { + QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); + rect.setX(static_cast((screenRect.width() / ratio - panelSize.width()) / 2)); rect.setY(static_cast(screenRect.y() + margin)); - rect.setWidth(static_cast(screenRect.width() / ratio - 2 * margin)); + rect.setWidth(panelSize.width()); rect.setHeight(0); + } break; - case Position::Bottom: - rect.setX(static_cast(screenRect.x() + margin)); + case Position::Bottom: { + QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); + rect.setX(static_cast((screenRect.width() / ratio - panelSize.width()) / 2)); rect.setY(static_cast(screenRect.y() + screenRect.height() / ratio - margin)); - rect.setWidth(static_cast(screenRect.width() / ratio - 2 * margin)); + rect.setWidth(panelSize.width()); rect.setHeight(0); + } break; - case Position::Left: + case Position::Left: { + QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); rect.setX(static_cast(screenRect.x() + margin)); - rect.setY(static_cast(screenRect.y() + margin)); + rect.setY(static_cast(static_cast((screenRect.height() / ratio - panelSize.height()) / 2))); rect.setWidth(0); - rect.setHeight(static_cast(screenRect.height() / ratio - 2 * margin)); + rect.setHeight(panelSize.height()); + } break; case Position::Right: + QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); rect.setX(static_cast(screenRect.x() + screenRect.width() / ratio - margin)); - rect.setY(static_cast(screenRect.y() + margin)); + rect.setY(static_cast(static_cast((screenRect.height() / ratio - panelSize.height()) / 2))); rect.setWidth(0); - rect.setHeight(static_cast(screenRect.height() / ratio - 2 * margin)); + rect.setHeight(panelSize.height()); break; } } diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index abebf10b4..719e29e44 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -211,6 +211,9 @@ private slots: void onDelayAutoHideChanged(); + // 子部件尺寸发生变化 + void onChildSizeChanged(); + private: MainWindow *parent(); // 初始化数据信息 diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 116f1cad4..b37c61b9b 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -32,6 +32,8 @@ #include "desktop_widget.h" #include "imageutil.h" #include "traymanagerwindow.h" +#include "multiscreenworker.h" +#include "displaymanager.h" #include #include @@ -90,8 +92,8 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_appDragWidget(nullptr) , m_dislayMode(Efficient) , m_tray(nullptr) - , m_screenSize(-1) , m_trashItem(nullptr) + , m_dockScreen(nullptr) { initUI(); updateMainPanelLayout(); @@ -992,6 +994,12 @@ void MainPanelControl::updatePluginsLayout() } } } + m_trayManagerWidget->updateLayout(); +} + +void MainPanelControl::setDockScreen(DockScreen *dockScreen) +{ + m_dockScreen = dockScreen; } QPainterPath MainPanelControl::areaPath() @@ -1015,14 +1023,9 @@ QPainterPath MainPanelControl::areaPath() return path; } -void MainPanelControl::setScreenSize(int size) +QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const { - m_screenSize = size; -} - -QSize MainPanelControl::suitableSize(double deviceRatio) -{ - if (m_screenSize <= 0) + if (screenSize <= 0) return QSize(-1, -1); double ratio = deviceRatio; @@ -1032,22 +1035,23 @@ QSize MainPanelControl::suitableSize(double deviceRatio) if (m_dislayMode == DisplayMode::Efficient) { // 如果是高效模式 if (m_position == Position::Top || m_position == Position::Bottom) - return QSize(static_cast(m_screenSize / ratio), height()); + return QSize(static_cast(screenSize / ratio), height()); - return QSize(width(), static_cast(m_screenSize / ratio)); + return QSize(width(), static_cast(screenSize / ratio)); } + QSize traySuitableSize = m_trayManagerWidget->suitableSize(); // 如果是特效模式 - int totalLength = static_cast(m_screenSize / ratio); + int totalLength = static_cast(screenSize / ratio); // 减去右侧托盘和快捷设置还有插件区域的尺寸 - totalLength -= (((m_position == Position::Top || m_position == Position::Bottom) ? m_trayManagerWidget->width() : m_trayManagerWidget->height()) / ratio); + totalLength -= (((m_position == Position::Top || m_position == Position::Bottom) ? traySuitableSize.width() : traySuitableSize.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((m_trayManagerWidget->width() + 20) / ratio)), height()); + return QSize((static_cast((traySuitableSize.width() + 20) / ratio)), height()); - return QSize(width(), static_cast((m_trayManagerWidget->height() + 20) / ratio)); + return QSize(width(), static_cast((traySuitableSize.height() + 20) / ratio)); } int yu = (totalLength % iconCount); @@ -1056,13 +1060,13 @@ QSize MainPanelControl::suitableSize(double deviceRatio) if (m_position == Position::Top || m_position == Position::Bottom) { iconSize = iconSize < height() ? iconSize : height(); - return QSize(iconSize * iconCount + static_cast((m_fixedSpliter->width() + m_trayManagerWidget->width() + 20) / ratio), + return QSize(iconSize * iconCount + static_cast((m_fixedSpliter->width() + traySuitableSize.width() + 20) / ratio), static_cast(height() / ratio)); } iconSize = iconSize < width() ? iconSize : width(); - return QSize(width(), iconSize * iconCount + static_cast((m_fixedSpliter->height() + m_trayManagerWidget->height() + 20) / ratio)); + return QSize(width(), iconSize * iconCount + static_cast((m_fixedSpliter->height() + traySuitableSize.height() + 20) / ratio)); } void MainPanelControl::itemUpdated(DockItem *item) @@ -1090,6 +1094,24 @@ void MainPanelControl::paintEvent(QPaintEvent *event) painter.fillRect(m_traySpliter->geometry(), color); } +// 获取当前屏幕的高或者宽(任务栏上下的时候获取宽,左右获取高) +int MainPanelControl::getScreenSize() const +{ + QScreen *currentScreen = qApp->primaryScreen(); + if (m_dockScreen) { + DisplayManager *displayManager = DisplayManager::instance(); + QScreen *screen = displayManager->screen(m_dockScreen->current()); + if (screen) + currentScreen = screen; + } + + QRect screenRect = currentScreen->handle()->geometry(); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + return screenRect.width(); + + return screenRect.height(); +} + /**重新计算任务栏上应用图标、插件图标的大小,并设置 * @brief MainPanelControl::resizeDockIcon */ @@ -1100,7 +1122,7 @@ void MainPanelControl::resizeDockIcon() int iconCount = 0; // 总宽度 if (m_dislayMode == DisplayMode::Fashion) { - int totalLength = m_screenSize; + int totalLength = getScreenSize(); // 减去右侧托盘和插件区域的宽度 totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? m_trayManagerWidget->width() : m_trayManagerWidget->height(); @@ -1322,13 +1344,22 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) */ void MainPanelControl::resizeDesktopWidget() { - QSize suitableSize = m_trayManagerWidget->suitableSize(); if (m_position == Position::Right || m_position == Position::Left) { m_desktopWidget->setFixedSize(QWIDGETSIZE_MAX, DESKTOP_SIZE); - m_trayManagerWidget->setFixedSize(QWIDGETSIZE_MAX, suitableSize.height()); + m_trayManagerWidget->setFixedWidth(QWIDGETSIZE_MAX); + m_trayManagerWidget->updateLayout(); + QSize suitableSize = m_trayManagerWidget->suitableSize(); + m_trayManagerWidget->setFixedHeight(suitableSize.height()); } else { m_desktopWidget->setFixedSize(DESKTOP_SIZE, QWIDGETSIZE_MAX); - m_trayManagerWidget->setFixedSize(suitableSize.width(), QWIDGETSIZE_MAX); + // 在调整尺寸过程中,先设置高度,然后更新布局,因为更新布局的时候,里面的 + // Layout需要根据高度来调整布局的部件间距和边距,此时返回的尺寸会有所变化 + // 等布局更新后,再获取返回的尺寸来设置右侧的宽度 + // 如果是左右位置,原理一样 + m_trayManagerWidget->setFixedHeight(QWIDGETSIZE_MAX); + m_trayManagerWidget->updateLayout(); + QSize suitableSize = m_trayManagerWidget->suitableSize(); + m_trayManagerWidget->setFixedWidth(suitableSize.width()); } if (DisplayMode::Fashion == m_dislayMode) diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index e2cffe906..3e06cb6dc 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -39,6 +39,7 @@ class PlaceholderItem; class AppDragWidget; class DesktopWidget; class TrayManagerWindow; +class DockScreen; class MainPanelControl : public QWidget { @@ -50,9 +51,10 @@ public: void setDisplayMode(DisplayMode dislayMode); void resizeDockIcon(); void updatePluginsLayout(); + + void setDockScreen(DockScreen *dockScreen); QPainterPath areaPath(); - void setScreenSize(int size); - QSize suitableSize(double deviceRatio); + QSize suitableSize(int screenSize, double deviceRatio) const; public slots: void insertItem(const int index, DockItem *item); @@ -80,6 +82,7 @@ private: void removeTrayAreaItem(QWidget *wdg); void addPluginAreaItem(int index, QWidget *wdg); void removePluginAreaItem(QWidget *wdg); + int getScreenSize() const; // 拖拽相关 void startDrag(DockItem *); @@ -129,9 +132,9 @@ private: QPoint m_mousePressPos; TrayPluginItem *m_tray; int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置 - int m_screenSize; PluginsItem *m_trashItem; // 垃圾箱插件(需要特殊处理一下) + DockScreen *m_dockScreen; }; #endif // MAINPANELCONTROL_H diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 80c951032..e9bfcf30d 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -100,12 +100,6 @@ QSize SystemPluginWindow::suitableSize() return QSize(QWIDGETSIZE_MAX, itemHeight); } -void SystemPluginWindow::resizeEvent(QResizeEvent *event) -{ - QWidget::resizeEvent(event); - Q_EMIT sizeChanged(); -} - void SystemPluginWindow::initUi() { m_mainLayout->setContentsMargins(0, 0, 0, 0); diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 31642cde8..2c7314337 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -47,9 +47,6 @@ public: Q_SIGNALS: void sizeChanged(); -protected: - void resizeEvent(QResizeEvent *event) override; - private: void initUi(); diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index b8cc261ba..095660452 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -76,6 +76,22 @@ TrayManagerWindow::~TrayManagerWindow() { } +void TrayManagerWindow::updateLayout() +{ + bool showSingle = true; + if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) + showSingle = (topLevelWidget()->height() <= CRITLCALHEIGHT); + + if (showSingle) + resetSingleDirection(); + else + resetMultiDirection(); + + resetChildWidgetSize(); + // 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示 + Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); +} + void TrayManagerWindow::setPositon(Dock::Position position) { if (m_postion == position) @@ -169,7 +185,7 @@ void TrayManagerWindow::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); - resetDirection(); + updateLayout(); } void TrayManagerWindow::initUi() @@ -277,28 +293,7 @@ void TrayManagerWindow::initConnection() m_trayView->installEventFilter(this); m_quickIconWidget->installEventFilter(this); installEventFilter(this); - QMetaObject::invokeMethod(this, &TrayManagerWindow::resetDirection, Qt::QueuedConnection); -} - -void TrayManagerWindow::resetDirection() -{ - if (showSingleRow()) - resetSingleDirection(); - else - resetMultiDirection(); - - resetChildWidgetSize(); - // 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示 - Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); - Q_EMIT sizeChanged(); -} - -bool TrayManagerWindow::showSingleRow() -{ - if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) - return topLevelWidget()->height() <= CRITLCALHEIGHT; - - return true; + QMetaObject::invokeMethod(this, &TrayManagerWindow::sizeChanged, Qt::QueuedConnection); } void TrayManagerWindow::resetChildWidgetSize() diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 0b30a6289..554acd4f7 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -51,6 +51,8 @@ class TrayManagerWindow : public QWidget public: explicit TrayManagerWindow(QWidget *parent = nullptr); ~TrayManagerWindow() override; + + void updateLayout(); void setPositon(Dock::Position position); QSize suitableSize(); @@ -69,13 +71,11 @@ private: void initUi(); void initConnection(); - void resetDirection(); void resetChildWidgetSize(); void resetMultiDirection(); void resetSingleDirection(); QColor maskColor(uint8_t alpha) const; - bool showSingleRow(); int appDatetimeSize(); QPainterPath roundedPaths(); From 6f2d8b6da650af90c230fbea80d526a210ef7592 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 27 May 2022 20:41:09 +0800 Subject: [PATCH 021/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=97=A0=E6=B3=95=E6=89=93=E5=BC=80=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=AD=E5=BF=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 控制中心的ShowPage参数做了调整,此处根据需要修改后即可打开 Log: Influence: 任务栏-右键-任务栏设置,观察控制中心是否正常打开 Bug: https://pms.uniontech.com/bug-view-134291.html Change-Id: I5dc69119c2dc7ce051fa672d08261e94b6b36fc7 --- frame/util/menuworker.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index 4c797c7ed..085c7937b 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -163,8 +163,7 @@ void MenuWorker::onDockSettingsTriggered() .path("/com/deepin/dde/ControlCenter") .interface("com.deepin.dde.ControlCenter") .method("ShowPage") - .arg(QString("personalization")) - .arg(QString("Dock")) + .arg(QString("personalization/dock")) .call(); } From 752bf51379218835571991f3fe3d7c2ad68c6bf9 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 30 May 2022 13:50:09 +0800 Subject: [PATCH 022/257] =?UTF-8?q?refactor:=20=E9=87=8D=E7=BD=AE=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E8=AE=BE=E7=BD=AE=E9=9D=A2=E6=9D=BF=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 快捷设置面板中用QGridLayout的方式将所有的插件进行重新布局 Log: 重置快捷设置面板所有插件的布局 Influence: 任务栏-快捷设置面板 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: I747c30b541a81b1d7c3e5378d842b272427bb963 --- frame/controller/quicksettingcontroller.cpp | 27 +++++++ frame/controller/quicksettingcontroller.h | 3 + frame/window/quicksettingcontainer.cpp | 86 +++++++-------------- frame/window/quicksettingcontainer.h | 4 +- 4 files changed, 62 insertions(+), 58 deletions(-) diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 71150e1fa..383ed9ca4 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -20,6 +20,7 @@ */ #include "quicksettingcontroller.h" #include "quicksettingitem.h" +#include "pluginsiteminterface.h" QuickSettingController::QuickSettingController(QObject *parent) : AbstractPluginsController(parent) @@ -32,6 +33,31 @@ QuickSettingController::~QuickSettingController() { } +void QuickSettingController::sortPlugins() +{ + QList primarySettingItems; + QList quickItems; + for (QuickSettingItem *item : m_quickSettingItems) { + if (item->pluginItem()->isPrimary()) + primarySettingItems << item; + else + quickItems << item; + } + + static QStringList existKeys = {"network-item-key", "sound-item-key", "VPN", "PROJECTSCREEN"}; + qSort(primarySettingItems.begin(), primarySettingItems.end(), [ = ](QuickSettingItem *item1, QuickSettingItem *item2) { + int index1 = existKeys.indexOf(item1->itemKey()); + int index2 = existKeys.indexOf(item2->itemKey()); + if (index1 >= 0 || index2 >= 0) + return index1 < index2; + + return true; + }); + + m_quickSettingItems.clear(); + m_quickSettingItems << primarySettingItems << quickItems; +} + void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { QList::iterator findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(), @@ -45,6 +71,7 @@ void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, c QuickSettingItem *quickItem = new QuickSettingItem(itemInter, itemKey); m_quickSettingItems << quickItem; + sortPlugins(); emit pluginInserted(quickItem); } diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 10bc312b1..0525c6be9 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -50,6 +50,9 @@ protected: void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} +private: + void sortPlugins(); + private: QList m_quickSettingItems; }; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index b2726ffb9..a4473c6c8 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -55,6 +55,7 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_switchLayout(new QStackedLayout(this)) , m_mainWidget(new QWidget(this)) , m_pluginWidget(new QWidget(m_mainWidget)) + , m_pluginLayout(new QGridLayout(m_pluginWidget)) , m_componentWidget(new QWidget(m_mainWidget)) , m_mainlayout(new QVBoxLayout(m_mainWidget)) , m_pluginLoader(QuickSettingController::instance()) @@ -137,11 +138,6 @@ void QuickSettingContainer::setPosition(Position position) void QuickSettingContainer::initQuickItem(QuickSettingItem *quickItem) { - int pluginWidth = ITEMWIDTH; - if (quickItem->pluginItem()->isPrimary()) - pluginWidth = ITEMWIDTH * 2 + ITEMSPACE; - - quickItem->setFixedSize(pluginWidth, ITEMHEIGHT); quickItem->setParent(m_pluginWidget); quickItem->setMouseTracking(true); quickItem->installEventFilter(this); @@ -179,26 +175,19 @@ void QuickSettingContainer::showWidget(QWidget *widget, const QString &title) void QuickSettingContainer::onPluginInsert(QuickSettingItem *quickItem) { initQuickItem(quickItem); - resetItemPosition(); + updateItemLayout(); resizeView(); } void QuickSettingContainer::onPluginRemove(QuickSettingItem *quickItem) { - QObjectList childrens = m_pluginWidget->children(); - for (QObject *child : childrens) { - if (child != quickItem) - continue; + disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); + quickItem->setParent(nullptr); + quickItem->removeEventFilter(this); + quickItem->setMouseTracking(false); - disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); - quickItem->setParent(nullptr); - quickItem->removeEventFilter(this); - quickItem->setMouseTracking(false); - quickItem->hide(); - break; - } //调整子控件的位置 - resetItemPosition(); + updateItemLayout(); resizeView(); } @@ -252,44 +241,23 @@ void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) } } -void QuickSettingContainer::resetItemPosition() +void QuickSettingContainer::updateItemLayout() { - QObjectList childrens = m_pluginWidget->children(); - QList primaryQuickItems; - QList quickItems; - for (QObject *child : childrens) { - QuickSettingItem *quickItem = qobject_cast(child); - if (!quickItem || quickItem->isHidden()) - continue; + // 清空之前的控件,重新添加 + while (m_pluginLayout->count() > 0) + m_pluginLayout->takeAt(0); - if (quickItem->pluginItem()->isPrimary()) - primaryQuickItems << quickItem; - else - quickItems << quickItem; - } - static QStringList existKeys = {"network-item-key", "sound-item-key", "VPN", "PROJECTSCREEN"}; - qSort(primaryQuickItems.begin(), primaryQuickItems.end(), [ = ](QuickSettingItem *item1, QuickSettingItem *item2) { - int index1 = existKeys.indexOf(item1->itemKey()); - int index2 = existKeys.indexOf(item2->itemKey()); - if (index1 >= 0 || index2 >= 0) - return index1 < index2; - return true; - }); - int primaryColumnCount = COLUMNCOUNT / 2; - for (int i = 0; i < primaryQuickItems.size(); i++) { - QuickSettingItem *quickitem = primaryQuickItems[i]; - QPoint ptItem(ITEMSPACE + (ITEMWIDTH + ITEMSPACE) * 2 * (i % primaryColumnCount), - (ITEMHEIGHT + ITEMSPACE) * (static_cast(i / primaryColumnCount))); - quickitem->move(ptItem); - } - int startCount = primaryQuickItems.size() * 2; - for (int i = 0; i < quickItems.size(); i++) { - QuickSettingItem *qsi = quickItems[i]; - int columnIndex = (startCount + i) % COLUMNCOUNT; - int rowIndex = (startCount + i) / COLUMNCOUNT; - int x = (ITEMWIDTH + ITEMSPACE) * columnIndex + ITEMSPACE; - int y = (ITEMHEIGHT + ITEMSPACE) * rowIndex; - qsi->move(x, y); + int row = 0; + int column = 0; + QList quickSettings = m_pluginLoader->settingItems(); + for (QuickSettingItem *item : quickSettings) { + int usedColumn = item->pluginItem()->isPrimary() ? 2 : 1; + m_pluginLayout->addWidget(item, row, column, 1, usedColumn); + column += usedColumn; + if (column >= COLUMNCOUNT) { + row++; + column = 0; + } } } @@ -311,12 +279,16 @@ void QuickSettingContainer::initUi() setWidgetStyle(m_brihtnessWidget); m_mainlayout->setSpacing(ITEMSPACE); - m_mainlayout->setContentsMargins(0, ITEMSPACE, 0, ITEMSPACE); + m_mainlayout->setContentsMargins(ITEMSPACE, ITEMSPACE, ITEMSPACE, ITEMSPACE); + m_pluginLayout->setContentsMargins(0, 0, 0, 0); + m_pluginLayout->setSpacing(ITEMSPACE); + + m_pluginWidget->setLayout(m_pluginLayout); m_mainlayout->addWidget(m_pluginWidget); QVBoxLayout *ctrlLayout = new QVBoxLayout(m_componentWidget); - ctrlLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0); + ctrlLayout->setContentsMargins(0, 0, 0, 0); ctrlLayout->setSpacing(ITEMSPACE); ctrlLayout->addWidget(m_playerWidget); @@ -340,7 +312,7 @@ void QuickSettingContainer::initUi() QMetaObject::invokeMethod(this, [ = ] { if (pluginItems.size() > 0) - resetItemPosition(); + updateItemLayout(); // 设置当前窗口的大小 resizeView(); setFixedWidth(ITEMWIDTH * 4 + (ITEMSPACE * 5)); diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 220cad1d1..f17beb7ca 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -42,6 +42,7 @@ class VolumeDevicesWidget; class BrightnessMonitorWidget; class QLabel; class PluginChildPage; +class QGridLayout; DWIDGET_USE_NAMESPACE @@ -76,7 +77,7 @@ private: // 调整尺寸 void resizeView(); // 调整控件位置 - void resetItemPosition(); + void updateItemLayout(); // 初始化控件项目 void initQuickItem(QuickSettingItem *quickItem); // 显示具体的窗体 @@ -90,6 +91,7 @@ private: QStackedLayout *m_switchLayout; QWidget *m_mainWidget; QWidget *m_pluginWidget; + QGridLayout *m_pluginLayout; QWidget *m_componentWidget; QVBoxLayout *m_mainlayout; QuickSettingController *m_pluginLoader; From 0bdc1eb1a2003e3805f84925d7be7d521cac215f Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 30 May 2022 20:29:53 +0800 Subject: [PATCH 023/257] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=88=A0=E9=99=A4=E6=8C=87?= =?UTF-8?q?=E9=92=88=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去掉插件的指针接口,同时插件根据任务栏图标类别返回不同类型的图标,修改所有已实现的插件接口 Log: Influence: 任务栏-查看快捷设置图标、快捷区域可点击的图标、系统电源图标是否显示正常 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: I9ffc42189471bb6183f264b366434d9be77275a4 --- frame/item/components/appdragwidget.cpp | 2 +- frame/item/components/appdragwidget.h | 4 +- frame/item/quicksettingitem.cpp | 4 +- frame/util/abstractpluginscontroller.h | 4 +- frame/window/quickpluginwindow.cpp | 266 +++++++++++++----- frame/window/quickpluginwindow.h | 43 ++- frame/window/quicksettingcontainer.cpp | 2 +- frame/window/quicksettingcontainer.h | 6 +- frame/window/systempluginwindow.cpp | 5 +- frame/window/traymanagerwindow.cpp | 2 +- interfaces/pluginproxyinterface.h | 9 + interfaces/pluginsiteminterface.h | 10 +- .../home_monitor/homemonitorplugin.cpp | 7 +- .../home_monitor/homemonitorplugin.h | 2 +- .../plugin-guide/plugins-developer-guide.md | 5 +- plugins/power/CMakeLists.txt | 2 +- plugins/power/powerplugin.cpp | 5 +- plugins/power/powerplugin.h | 2 +- plugins/shutdown/shutdownplugin.cpp | 6 +- plugins/shutdown/shutdownplugin.h | 2 +- 20 files changed, 279 insertions(+), 109 deletions(-) diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index e01993e33..1d32f4892 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -462,7 +462,7 @@ void QuickDragWidget::dropEvent(QDropEvent *event) else hide(); - Q_EMIT requestDropItem(); + Q_EMIT requestDropItem(event); } } diff --git a/frame/item/components/appdragwidget.h b/frame/item/components/appdragwidget.h index b799e71f1..666b78700 100644 --- a/frame/item/components/appdragwidget.h +++ b/frame/item/components/appdragwidget.h @@ -150,8 +150,8 @@ class QuickDragWidget : public AppDragWidget Q_OBJECT Q_SIGNALS: - void requestDropItem(); - void requestDragMove(QDragMoveEvent *event); + void requestDropItem(QDropEvent *); + void requestDragMove(QDragMoveEvent *); public: explicit QuickDragWidget(QWidget *parent = Q_NULLPTR); diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 55e599896..b0dd92d99 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -64,7 +64,7 @@ DockItem::ItemType QuickSettingItem::itemType() const const QPixmap QuickSettingItem::dragPixmap() { - QPixmap pm = m_pluginInter->icon()->pixmap(ICONWIDTH, ICONHEIGHT); + QPixmap pm = m_pluginInter->icon(DockPart::QuickPanel).pixmap(ICONWIDTH, ICONHEIGHT); QPainter pa(&pm); pa.setPen(foregroundColor()); @@ -105,7 +105,7 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) // 绘制背景色 painter.fillRect(rect(), backgroundColor()); // 让图标填上前景色 - QPixmap pm = m_pluginInter->icon()->pixmap(ICONWIDTH, ICONHEIGHT); + QPixmap pm = m_pluginInter->icon(DockPart::QuickPanel).pixmap(ICONWIDTH, ICONHEIGHT); QPainter pa(&pm); pa.setCompositionMode(QPainter::CompositionMode_SourceIn); pa.fillRect(pm.rect(), painter.pen().brush()); diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index 84c8e2c2e..b914fd10b 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -40,7 +40,7 @@ class AbstractPluginsController : public QObject, PluginProxyInterface Q_OBJECT public: - explicit AbstractPluginsController(QObject *parent = 0); + explicit AbstractPluginsController(QObject *parent = Q_NULLPTR); ~ AbstractPluginsController() override; // implements PluginProxyInterface @@ -52,6 +52,8 @@ public: void itemUpdate(PluginsItemInterface * const, const QString &) override {} void itemRemoved(PluginsItemInterface * const, const QString &) override {} + void updateDockInfo(const DockPart &) override {} + signals: void pluginLoaderFinished(); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 1661a7691..e7b2acf18 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. * * Author: donghualin @@ -37,10 +37,11 @@ #define ITEMSIZE 22 #define ITEMSPACE 6 -#define ICONWIDTH 20 +#define ICONWIDTH 18 #define ICONHEIGHT 16 -static QStringList fixedPluginKeys{ "network-item-key", "sound-item-key", "power" }; +static QStringList fixedPluginNames{ "network", "sound", "power" }; + const int itemDataRole = Dtk::UserRole + 1; const int itemSortRole = Dtk::UserRole + 2; @@ -69,8 +70,8 @@ void QuickPluginWindow::initUi() m_mainLayout->setSpacing(ITEMSPACE); const QList &items = QuickSettingController::instance()->settingItems(); for (QuickSettingItem *settingItem : items) { - const QString itemKey = settingItem->itemKey(); - if (!fixedPluginKeys.contains(itemKey)) + const QString pluginName = settingItem->pluginItem()->pluginName(); + if (!fixedPluginNames.contains(pluginName)) continue; addPlugin(settingItem); @@ -93,25 +94,26 @@ void QuickPluginWindow::setPositon(Position position) } } -int QuickPluginWindow::findActiveTargetIndex(QWidget *widget) +int QuickPluginWindow::findActiveTargetIndex(QuickDockItem *widget) { for (int i = 0; i < m_activeSettingItems.size(); i++) { - QuickSettingItem *settingItem = m_activeSettingItems[i]; - if (settingItem->pluginItem()->itemWidget(settingItem->itemKey()) == widget) + PluginsItemInterface *settingItem = m_activeSettingItems[i]; + if (widget->pluginItem() == settingItem) return i; } + return -1; } -void QuickPluginWindow::dragPlugin(QuickSettingItem *item) +void QuickPluginWindow::dragPlugin(PluginsItemInterface *item) { // 释放插件,一般是从快捷设置面板区域移动到这里的,固定插件不支持拖动 - if (fixedPluginKeys.contains(item->itemKey())) + if (fixedPluginNames.contains(item->pluginName())) return; QPoint itemPoint = mapFromGlobal(QCursor::pos()); // 查找移动后的位置,如果移动后的插件找不到,就直接放到最后 - QWidget *targetWidget = childAt(itemPoint); + QuickDockItem *targetWidget = qobject_cast(childAt(itemPoint)); if (!targetWidget) { m_activeSettingItems << item; } else { @@ -122,6 +124,7 @@ void QuickPluginWindow::dragPlugin(QuickSettingItem *item) else m_activeSettingItems.insert(targetIndex, item); } + //排序插入到当前窗体 resetPluginDisplay(); Q_EMIT itemCountChanged(); @@ -130,29 +133,30 @@ void QuickPluginWindow::dragPlugin(QuickSettingItem *item) void QuickPluginWindow::addPlugin(QuickSettingItem *item) { for (int i = 0; i < m_mainLayout->count(); i++) { - QWidget *widget = m_mainLayout->itemAt(i)->widget(); - if (item == widget) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); + if (!dockItem) + continue; + + if (item->pluginItem() == dockItem->pluginItem()) { resetPluginDisplay(); return; } } - QWidget *widget = item->pluginItem()->itemWidget(item->itemKey()); - if (!widget) - return; - - widget->setFixedSize(ICONWIDTH, ICONHEIGHT); - widget->installEventFilter(this); - if (fixedPluginKeys.contains(item->itemKey())) { + if (fixedPluginNames.contains(item->pluginItem()->pluginName())) { // 新插入的插件如果是固定插件,则将其插入到固定插件列表中,并对其进行排序 - m_fixedSettingItems << item; - qSort(m_fixedSettingItems.begin(), m_fixedSettingItems.end(), [](QuickSettingItem *item1, QuickSettingItem *item2) { - int index1 = fixedPluginKeys.indexOf(item1->itemKey()); - int index2 = fixedPluginKeys.indexOf(item2->itemKey()); + m_fixedSettingItems << item->pluginItem(); + qSort(m_fixedSettingItems.begin(), m_fixedSettingItems.end(), [](PluginsItemInterface *item1, PluginsItemInterface *item2) { + int index1 = fixedPluginNames.indexOf(item1->pluginName()); + int index2 = fixedPluginNames.indexOf(item2->pluginName()); return index1 < index2; }); } else { // 如果是非固定插件,则直接插入到末尾 - m_activeSettingItems << item; + m_activeSettingItems << item->pluginItem(); } resetPluginDisplay(); Q_EMIT itemCountChanged(); @@ -175,12 +179,8 @@ QSize QuickPluginWindow::suitableSize() return QSize(ITEMSIZE, height); } -void QuickPluginWindow::removePlugin(QuickSettingItem *item) +void QuickPluginWindow::removePlugin(PluginsItemInterface *item) { - QWidget *widget = item->pluginItem()->itemWidget(item->itemKey()); - if (widget) - widget->setFixedSize(ICONWIDTH, ICONHEIGHT); - if (m_fixedSettingItems.contains(item)) m_fixedSettingItems.removeOne(item); else if (m_activeSettingItems.contains(item)) @@ -192,16 +192,15 @@ void QuickPluginWindow::removePlugin(QuickSettingItem *item) Q_EMIT itemCountChanged(); } -QuickSettingItem *QuickPluginWindow::findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems) +PluginsItemInterface *QuickPluginWindow::findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems) { - QWidget *selectWidget = childAt(mousePoint); + QuickDockItem *selectWidget = qobject_cast(childAt(mousePoint)); if (!selectWidget) return nullptr; for (int i = 0; i < settingItems.size(); i++) { - QuickSettingItem *settingItem = settingItems[i]; - QWidget *widget = settingItem->pluginItem()->itemWidget(settingItem->itemKey()); - if (selectWidget == widget) + PluginsItemInterface *settingItem = settingItems[i]; + if (selectWidget->pluginItem() == settingItem) return settingItem; } @@ -211,7 +210,7 @@ QuickSettingItem *QuickPluginWindow::findQuickSettingItem(const QPoint &mousePoi void QuickPluginWindow::mousePressEvent(QMouseEvent *event) { // 查找非固定的图标,然后执行拖动 - QuickSettingItem *quickItem = findQuickSettingItem(event->pos(), m_activeSettingItems); + PluginsItemInterface *quickItem = findQuickSettingItem(event->pos(), m_activeSettingItems); if (!quickItem) return; @@ -249,11 +248,11 @@ QPoint QuickPluginWindow::popupPoint() const return pointCurrent; } -void QuickPluginWindow::mouseReleaseEvent(QMouseEvent *event) +void QuickPluginWindow::onFixedClick() { // 查找固定团图标,然后点击弹出快捷面板 - QuickSettingItem *quickItem = findQuickSettingItem(event->pos(), m_fixedSettingItems); - if (!quickItem) + QuickDockItem *dockItem = qobject_cast(sender()); + if (!dockItem || !fixedPluginNames.contains(dockItem->pluginItem()->pluginName())) return; // 弹出快捷设置面板 @@ -261,13 +260,13 @@ void QuickPluginWindow::mouseReleaseEvent(QMouseEvent *event) popWindow->show(popupPoint()); } -void QuickPluginWindow::startDrag(QuickSettingItem *moveItem) +void QuickPluginWindow::startDrag(PluginsItemInterface *moveItem) { AppDrag *drag = new AppDrag(this, new QuickDragWidget); QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem); drag->setMimeData(mimedata); drag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size())); - QPixmap dragPixmap = moveItem->pluginItem()->icon()->pixmap(QSize(ITEMSIZE, ITEMSIZE)); + QPixmap dragPixmap = moveItem->icon(DockPart::QuickPanel).pixmap(QSize(ITEMSIZE, ITEMSIZE)); drag->setPixmap(dragPixmap); drag->setHotSpot(QPoint(0, 0)); @@ -275,15 +274,95 @@ void QuickPluginWindow::startDrag(QuickSettingItem *moveItem) removePlugin(moveItem); }); - connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, [ this] { - resetPluginDisplay(); - Q_EMIT itemCountChanged(); - }); + connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, &QuickPluginWindow::onPluginDropItem); connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, &QuickPluginWindow::onPluginDragMove); drag->exec(Qt::MoveAction | Qt::CopyAction); } +QuickDockItem *QuickPluginWindow::getDockItemByPlugin(PluginsItemInterface *item) +{ + if (!item) + return nullptr; + + for (int i = 0; i < m_mainLayout->count(); i++) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); + if (!dockItem) + continue; + + if (dockItem->pluginItem() == item) + return dockItem; + } + + return nullptr; +} + +int QuickPluginWindow::getDropIndex(QPoint point) +{ + QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(point, m_activeSettingItems)); + if (targetItem) + return m_activeSettingItems.indexOf(targetItem->pluginItem()); + + // 上下方向从右向左排列 + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + for (int i = 0; i < m_mainLayout->count() - 1; i++) { + QLayoutItem *layoutBefore = m_mainLayout->itemAt(i); + QLayoutItem *layoutItem = m_mainLayout->itemAt(i + 1); + if (!layoutBefore || !layoutItem) + continue; + + QuickDockItem *dockBeforeItem = qobject_cast(layoutBefore->widget()); + QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); + if (dockItem->pluginItem()->isPrimary()) + continue; + + if (dockBeforeItem->geometry().x() > point.x() && dockItem->geometry().right() < point.x()) + return i; + } + } + for (int i = 0; i < m_mainLayout->count() - 1; i++) { + QLayoutItem *layoutBefore = m_mainLayout->itemAt(i); + QLayoutItem *layoutItem = m_mainLayout->itemAt(i + 1); + if (!layoutBefore || !layoutItem) + continue; + + QuickDockItem *dockBeforeItem = qobject_cast(layoutBefore->widget()); + if (dockBeforeItem->pluginItem()->isPrimary()) + break; + + QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); + + // 从上向下排列 + if (dockBeforeItem->geometry().bottom() < point.y() && dockItem->geometry().top() > point.y()) + return i; + } + // 如果都没有找到,直接插入到最后 + return -1; +} + +void QuickPluginWindow::onPluginDropItem(QDropEvent *event) +{ + const QuickPluginMimeData *data = qobject_cast(event->mimeData()); + if (!data) + return; + + // 获取当前鼠标在任务栏快捷图标区域的位置 + QPoint currentPoint = mapFromGlobal(QCursor::pos()); + // 获取区域图标插入的位置 + int dropIndex = getDropIndex(currentPoint); + if (dropIndex >= 0) + m_activeSettingItems.insert(dropIndex, data->pluginItemInterface()); + else + m_activeSettingItems << data->pluginItemInterface(); + + resetPluginDisplay(); + Q_EMIT itemCountChanged(); +} + void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) { QPoint currentPoint = mapFromGlobal(QCursor::pos()); @@ -291,14 +370,15 @@ void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) if (!data) return; - QuickSettingItem *sourceItem = data->quickSettingItem(); + // 查找移动的 + PluginsItemInterface *sourceItem = data->pluginItemInterface(); if (!sourceItem) return; - QWidget *sourceMoveWidget = sourceItem->pluginItem()->itemWidget(sourceItem->itemKey()); - QuickSettingItem *targetItem = findQuickSettingItem(currentPoint, m_activeSettingItems); + QuickDockItem *sourceMoveWidget = getDockItemByPlugin(sourceItem); + QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(currentPoint, m_activeSettingItems)); // 如果未找到要移动的目标位置,或者移动的目标位置是固定插件,或者原插件和目标插件是同一个插件,则不做任何操作 - if (!sourceMoveWidget || !targetItem || sourceItem == targetItem) + if (!sourceMoveWidget || !targetItem || sourceMoveWidget == targetItem) return; // 重新对所有的插件进行排序 @@ -309,7 +389,7 @@ void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) } // 调整列表中的位置 int sourceIndex = m_activeSettingItems.indexOf(sourceItem); - int targetIndex = m_activeSettingItems.indexOf(targetItem); + int targetIndex = m_activeSettingItems.indexOf(targetItem->pluginItem()); if (sourceIndex >= 0) m_activeSettingItems.move(sourceIndex, targetIndex); else @@ -318,32 +398,34 @@ void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) event->accept(); } -QList QuickPluginWindow::settingItems() -{ - QList items; - for (int i = 0; i < m_mainLayout->count(); i++) { - qInfo() << m_mainLayout->itemAt(i)->widget(); - QuickSettingItem *item = qobject_cast(m_mainLayout->itemAt(i)->widget()); - if (item) - items << item; - } - return items; -} - void QuickPluginWindow::resetPluginDisplay() { // 先删除所有的widget + QMap pluginItems; for (int i = m_mainLayout->count() - 1; i >= 0; i--) { QLayoutItem *layoutItem = m_mainLayout->itemAt(i); - if (layoutItem) { - layoutItem->widget()->setParent(nullptr); - m_mainLayout->removeItem(layoutItem); - } + if (!layoutItem) + continue; + + QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); + if (!dockItem) + continue; + + dockItem->setParent(nullptr); + m_mainLayout->removeItem(layoutItem); + pluginItems[dockItem->pluginItem()] = dockItem; } // 将列表中所有的控件按照顺序添加到布局上 - auto addWidget = [ this ](const QList &items) { - for (QuickSettingItem *item : items) { - QWidget *itemWidget = item->pluginItem()->itemWidget(item->itemKey()); + auto addWidget = [ = ](const QList &items) { + for (PluginsItemInterface *item : items) { + QuickDockItem *itemWidget = nullptr; + if (pluginItems.contains(item)) { + itemWidget = pluginItems[item]; + } else { + itemWidget = new QuickDockItem(item, this); + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + } + connect(itemWidget, &QuickDockItem::clicked, this, &QuickPluginWindow::onFixedClick); itemWidget->setParent(this); m_mainLayout->addWidget(itemWidget); } @@ -356,12 +438,52 @@ void QuickPluginWindow::resetPluginDisplay() void QuickPluginWindow::initConnection() { connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ](QuickSettingItem * settingItem) { - const QString itemKey = settingItem->itemKey(); - if (!fixedPluginKeys.contains(itemKey)) + const QString pluginName = settingItem->pluginItem()->pluginName(); + if (!fixedPluginNames.contains(pluginName)) return; addPlugin(settingItem); }); - connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, &QuickPluginWindow::removePlugin); + connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ this ] (QuickSettingItem *settingItem){ + removePlugin(settingItem->pluginItem()); + }); +} + +/** + * @brief QuickDockItem::QuickDockItem + * @param pluginItem + * @param parent + */ +QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, QWidget *parent) + : QWidget(parent) + , m_pluginItem(pluginItem) +{ +} + +QuickDockItem::~QuickDockItem() +{ +} + +PluginsItemInterface *QuickDockItem::pluginItem() +{ + return m_pluginItem; +} + +void QuickDockItem::paintEvent(QPaintEvent *event) +{ + if (!m_pluginItem) + return QWidget::paintEvent(event); + + QPixmap pixmap = m_pluginItem->icon(DockPart::QuickPanel).pixmap(ICONHEIGHT, ICONHEIGHT); + QRect pixmapRect = QRect((rect().width() - ICONHEIGHT) / 2, (rect().height() - ICONHEIGHT) / 2, + ICONHEIGHT, ICONHEIGHT); + QPainter painter(this); + painter.drawPixmap(pixmapRect, pixmap); +} + +void QuickDockItem::mouseReleaseEvent(QMouseEvent *event) +{ + Q_EMIT clicked(); + QWidget::mouseReleaseEvent(event); } diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 16633f504..34a015267 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -33,6 +33,7 @@ class QStandardItemModel; class QStandardItem; class QMouseEvent; class QBoxLayout; +class QuickDockItem; namespace Dtk { namespace Gui { class DRegionMonitor; } namespace Widget { class DListView; class DStandardItem; } } @@ -48,7 +49,7 @@ public: ~QuickPluginWindow() override; void setPositon(Dock::Position position); - void dragPlugin(QuickSettingItem *item); + void dragPlugin(PluginsItemInterface *item); QSize suitableSize(); @@ -56,29 +57,53 @@ Q_SIGNALS: void itemCountChanged(); protected: - void mouseReleaseEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override; private Q_SLOTS: void addPlugin(QuickSettingItem *item); - void removePlugin(QuickSettingItem *item); + void removePlugin(PluginsItemInterface *item); + void onPluginDropItem(QDropEvent *event); void onPluginDragMove(QDragMoveEvent *event); + void onFixedClick(); private: void initUi(); void initConnection(); - void startDrag(QuickSettingItem *moveItem); - QList settingItems(); - QuickSettingItem *findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems); - int findActiveTargetIndex(QWidget *widget); + void startDrag(PluginsItemInterface *moveItem); + PluginsItemInterface *findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems); + int findActiveTargetIndex(QuickDockItem *widget); + int getDropIndex(QPoint point); void resetPluginDisplay(); QPoint popupPoint() const; + QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); private: QBoxLayout *m_mainLayout; Dock::Position m_position; - QList m_activeSettingItems; - QList m_fixedSettingItems; + QList m_activeSettingItems; + QList m_fixedSettingItems; +}; + +// 用于在任务栏上显示的插件 +class QuickDockItem : public QWidget +{ + Q_OBJECT + +public: + explicit QuickDockItem(PluginsItemInterface *pluginItem, QWidget *parent = nullptr); + ~QuickDockItem(); + + PluginsItemInterface *pluginItem(); + +Q_SIGNALS: + void clicked(); + +protected: + void paintEvent(QPaintEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private: + PluginsItemInterface *m_pluginItem; }; #endif // QUICKPLUGINWINDOW_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index a4473c6c8..c2c9153dd 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -231,7 +231,7 @@ void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) || qAbs(m_dragPluginPosition.y() - pointCurrent.y()) > 5) { clearDragPoint(); QDrag *drag = new QDrag(this); - QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem); + QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem->pluginItem()); drag->setMimeData(mimedata); QPixmap dragPixmap = moveItem->dragPixmap(); drag->setPixmap(dragPixmap); diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index f17beb7ca..070f66c49 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -110,12 +110,12 @@ class QuickPluginMimeData : public QMimeData Q_OBJECT public: - explicit QuickPluginMimeData(QuickSettingItem *item) : QMimeData(), m_item(item) {} + explicit QuickPluginMimeData(PluginsItemInterface *item) : QMimeData(), m_item(item) {} ~QuickPluginMimeData() {} - QuickSettingItem *quickSettingItem() const { return m_item; } + PluginsItemInterface *pluginItemInterface() const { return m_item; } private: - QuickSettingItem *m_item; + PluginsItemInterface *m_item; }; #endif // PLUGINCONTAINER_H diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index e9bfcf30d..8839a18c1 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -170,7 +170,7 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); - const QIcon *icon = m_pluginInter->icon(); + QIcon icon = m_pluginInter->icon(DockPart::SystemPanel); QRect rctPixmap(rect()); if (needShowText()) { @@ -192,8 +192,7 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) } // 绘制图标 - if (icon) - painter.drawPixmap(rctPixmap, icon->pixmap(ICONSIZE, ICONSIZE)); + painter.drawPixmap(rctPixmap, icon.pixmap(ICONSIZE, ICONSIZE)); } QSize StretchPluginsItem::suitableSize() const diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 095660452..fa14c1d9c 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -446,7 +446,7 @@ void TrayManagerWindow::dropEvent(QDropEvent *e) if (e->source() == this) return; - QuickSettingItem *pluginItem = static_cast(mimeData->quickSettingItem()); + PluginsItemInterface *pluginItem = static_cast(mimeData->pluginItemInterface()); if (pluginItem) m_quickIconWidget->dragPlugin(pluginItem); } diff --git a/interfaces/pluginproxyinterface.h b/interfaces/pluginproxyinterface.h index 8d59c1409..bf29dc740 100644 --- a/interfaces/pluginproxyinterface.h +++ b/interfaces/pluginproxyinterface.h @@ -27,6 +27,8 @@ #include class PluginsItemInterface; +enum class DockPart; + class PluginProxyInterface { public: @@ -57,6 +59,13 @@ public: /// \param itemKey /// virtual void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) = 0; + + /// + /// update display or information + /// + /// + virtual void updateDockInfo(const DockPart &) = 0; + /// /// \brief requestContextMenu /// request show context menu diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 9c12f0016..e061bb03b 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -27,11 +27,19 @@ #include #include +// 任务栏的部件位置 +enum class DockPart { + QuickShow = 0, // 快捷插件显示区域 + QuickPanel, // 快捷面板区域 + SystemPanel // 系统插件显示区域 +}; + /// /// \brief The PluginsItemInterface class /// the dock plugins item interface, all dock plugins should /// inheirt this class and override all pure virtual function. /// + class PluginsItemInterface { public: @@ -253,7 +261,7 @@ public: /// the icon display on plugin panel /// /// - virtual const QIcon *icon() { return nullptr; } + virtual QIcon icon(const DockPart &) { return QIcon(); } /// /// the plugin status diff --git a/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp b/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp index 48514a322..0400a7ce3 100644 --- a/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp +++ b/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp @@ -136,9 +136,9 @@ void HomeMonitorPlugin::invokedMenuItem(const QString &itemKey, const QString &m } } -const QIcon *HomeMonitorPlugin::icon() +QIcon HomeMonitorPlugin::icon(const DockPart &) { - static QIcon pixMapIcon; + QIcon pixMapIcon; QPixmap pixmap; QPainter painter(&pixmap); painter.begin(&pixmap); @@ -147,9 +147,8 @@ const QIcon *HomeMonitorPlugin::icon() painter.setFont(font); painter.drawText(QPoint(0, 0), m_pluginWidget->textContent()); painter.end(); - pixMapIcon.detach(); pixMapIcon.addPixmap(pixmap); - return &pixMapIcon; + return pixMapIcon; } PluginsItemInterface::PluginStatus HomeMonitorPlugin::status() const diff --git a/plugins/plugin-guide/home_monitor/homemonitorplugin.h b/plugins/plugin-guide/home_monitor/homemonitorplugin.h index 23b6b0643..1fab8bcd5 100644 --- a/plugins/plugin-guide/home_monitor/homemonitorplugin.h +++ b/plugins/plugin-guide/home_monitor/homemonitorplugin.h @@ -31,7 +31,7 @@ public: const QString itemContextMenu(const QString &itemKey) override; void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; - const QIcon *icon() override; + QIcon icon(const DockPart &) override; PluginStatus status() const override; bool isPrimary() const override; QString description() const override; diff --git a/plugins/plugin-guide/plugins-developer-guide.md b/plugins/plugin-guide/plugins-developer-guide.md index 0fd03d61a..80c841828 100644 --- a/plugins/plugin-guide/plugins-developer-guide.md +++ b/plugins/plugin-guide/plugins-developer-guide.md @@ -27,6 +27,8 @@ dde-dock 插件是根据 Qt 插件标准所开发的共享库文件(`so`),通 PluginsItemInterface 中定义的接口除了displayMode 和 position(历史遗留),从插件的角度来看都是被动的,只能等待被任务栏的插件机制调用。 +另外定义了DockPart枚举,用于表示返回图标的位置,分别有快捷插件显示区域,快捷图标区域和系统插件显示区域,主要用于区域插件在不同的位置的显示。 + |名称|简介| |-|-| |pluginName | 返回插件名称,用于在 dde-dock 内部管理插件时使用 `必须实现`| @@ -51,7 +53,7 @@ PluginsItemInterface 中定义的接口除了displayMode 和 position(历史 |refreshIcon | 当插件控件的图标需要更新时此接口被调用| |displayMode | 用于插件主动获取 dde-dock 当前的显示模式| |position | 用于插件主动获取 dde-dock 当前的位置| -|icon | 用于返回当前插件在快捷设置面板上的图标,正常状态下显示的图标即可 | +|icon | 用于返回当前插件在快捷设置面板、快捷设置图标区域,系统插件显示区域等的图标,正常状态下显示的图标即可 | |status | 用于返回当前快捷设置插件的状态,激活状态还是禁用状态 | |isPrimary | 用于标记当前快捷设置的插件是否为主插件(图标占两个图标位置) | |description | 用于返回插件的描述(快捷设置面板中isPrimary为true的时候有用) | @@ -65,6 +67,7 @@ PluginsItemInterface 中定义的接口除了displayMode 和 position(历史 |itemAdded | 向 dde-dock 添加新的主控件(一个插件可以添加多个主控件它们之间使用`ItemKey`区分)| |itemUpdate | 通知 dde-dock 有主控件需要更新| |itemRemoved | 从 dde-dock 移除主控件| +|updateDockInfo | 当插件图标发生变化的时候,响应该函数 | |requestWindowAutoHide | 设置 dde-dock 是否允许隐藏,通常被用在任务栏被设置为智能隐藏或始终隐藏而插件又需要让 dde-dock 保持显示状态来显示一些重要信息的场景下| |requestRefreshWindowVisible | 通知 dde-dock 更新隐藏状态| |requestSetAppletVisible | 通知 dde-dock 显示或隐藏插件的弹出面板(鼠标左键点击后弹出的控件)| diff --git a/plugins/power/CMakeLists.txt b/plugins/power/CMakeLists.txt index aa6c770f1..78dafea75 100644 --- a/plugins/power/CMakeLists.txt +++ b/plugins/power/CMakeLists.txt @@ -32,4 +32,4 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE ${QGSettings_LIBRARIES} ) -install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/system-trays) +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/quick-trays) diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index ff52702d5..ff6ef5d60 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -185,13 +185,14 @@ void PowerPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -const QIcon *PowerPlugin::icon() +QIcon PowerPlugin::icon(const DockPart &dockPart) { + Q_UNUSED(dockPart); static QIcon batteryIcon; const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(); batteryIcon.detach(); batteryIcon.addPixmap(pixmap); - return &batteryIcon; + return batteryIcon; } void PowerPlugin::updateBatteryVisible() diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index 9d4d34dde..cab3ece65 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -58,7 +58,7 @@ public: int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; - const QIcon *icon() override; + QIcon icon(const DockPart &dockPart) override; private: void updateBatteryVisible(); diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index b21783959..9a6b75d9c 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -292,12 +292,14 @@ void ShutdownPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -const QIcon *ShutdownPlugin::icon() +QIcon ShutdownPlugin::icon(const DockPart &dockPart) { + Q_UNUSED(dockPart); + static QIcon shutdownIcon; shutdownIcon.detach(); shutdownIcon.addPixmap(m_shutdownWidget->loadPixmap()); - return &shutdownIcon; + return shutdownIcon; } void ShutdownPlugin::loadPlugin() diff --git a/plugins/shutdown/shutdownplugin.h b/plugins/shutdown/shutdownplugin.h index 23061badb..1f5c65d1d 100644 --- a/plugins/shutdown/shutdownplugin.h +++ b/plugins/shutdown/shutdownplugin.h @@ -61,7 +61,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; - const QIcon *icon() override; + QIcon icon(const DockPart &dockPart) override; // 休眠待机配置,保持和sessionshell一致 const QStringList session_ui_configs { From 2461310ba26a23e2f9471e6402d48d1444954ebe Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 1 Jun 2022 10:16:06 +0800 Subject: [PATCH 024/257] =?UTF-8?q?feat:=20=E8=BD=AC=E6=B5=8B=E4=BF=AE?= =?UTF-8?q?=E6=94=B9changlog=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改changelog版本号 Log: 修改changelog版本号 Influence: 无 Task: https://pms.uniontech.com/task-view-140999.html Change-Id: Ieb705cdd7373020935f7317473f6639ab2d2c24c --- debian/changelog | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 0ea673e69..08420a5b8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +dde-dock (6.0.0.0) unstable; urgency=low + + * release Tag 6.0.0.0 + + -- donghualin Wed, 1 June 2022 10:11:29 +0800 + dde-dock (3.0.12-1) unstable; urgency=low * Autobuild Tag 3.0.12 @@ -134,4 +140,4 @@ dde-dock (0.0~git20150824-1) unstable; urgency=low * Initial release - -- Deepin Packages Builder Mon, 24 Aug 2015 19:03:01 +0800 + -- Deepin Packages Builder Mon, 24 Aug 2015 19:03:01 +0000 From 461ece4bd73391c982ac48572ab2c3ed8706036b Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 1 Jun 2022 15:11:45 +0800 Subject: [PATCH 025/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=9C=A8=E7=89=B9=E6=95=88=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E4=B8=8B=E7=9A=84UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、在特效模式下,固定区域、应用区域和托盘区域的分割线是不可见的,因此在绘制颜色的时候判断其是否可见 2、调整关机按钮同时显示文字的最小高度 3、特效模式下任务栏中间扣出来的部分透明 Log: Influence: 任务栏-特效模式,查看左侧的线条是否可见 Bug: https://pms.uniontech.com/bug-view-134527.html Bug: https://pms.uniontech.com/bug-view-134489.html Change-Id: I4ee89702fb409293b8652d6aa71c50a2dd18a7ee --- frame/window/mainpanelcontrol.cpp | 11 ++++++++--- frame/window/mainwindow.cpp | 14 +++++--------- frame/window/mainwindow.h | 1 - frame/window/systempluginwindow.cpp | 3 ++- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index b37c61b9b..68e72bd63 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -1089,9 +1089,14 @@ void MainPanelControl::paintEvent(QPaintEvent *event) painter.setOpacity(0.1); } - painter.fillRect(m_fixedSpliter->geometry(), color); - painter.fillRect(m_appSpliter->geometry(), color); - painter.fillRect(m_traySpliter->geometry(), color); + if (m_fixedSpliter->isVisible()) + painter.fillRect(m_fixedSpliter->geometry(), color); + + if (m_appSpliter->isVisible()) + painter.fillRect(m_appSpliter->geometry(), color); + + if (m_traySpliter->isVisible()) + painter.fillRect(m_traySpliter->geometry(), color); } // 获取当前屏幕的高或者宽(任务栏上下的时候获取宽,左右获取高) diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 98bd39593..9f895ef1a 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -117,8 +117,8 @@ MainWindow::MainWindow(QWidget *parent) DPlatformWindowHandle::enableDXcbForWindow(this, true); m_platformWindowHandle.setEnableBlurWindow(true); m_platformWindowHandle.setTranslucentBackground(true); - m_platformWindowHandle.setShadowOffset(QPoint(0, 5)); - m_platformWindowHandle.setShadowColor(QColor(0, 0, 0, 0.3 * 255)); + m_platformWindowHandle.setShadowOffset(QPoint(0, 0)); + m_platformWindowHandle.setShadowColor(Qt::transparent); m_mainPanel->setDisplayMode(m_multiScreenWorker->displayMode()); @@ -260,11 +260,6 @@ void MainWindow::resizeEvent(QResizeEvent *event) return DBlurEffectWidget::resizeEvent(event); } -void MainWindow::dragEnterEvent(QDragEnterEvent *e) -{ - QWidget::dragEnterEvent(e); -} - void MainWindow::initMember() { //INFO 这里要大于动画的300ms,否则可能动画过程中这个定时器就被触发了 @@ -411,11 +406,12 @@ void MainWindow::onDbusNameOwnerChanged(const QString &name, const QString &oldO */ void MainWindow::setEffectEnabled(const bool enabled) { + Q_UNUSED(enabled); + setMaskColor(AutoColor); setMaskAlpha(m_multiScreenWorker->opacity()); - - m_platformWindowHandle.setBorderWidth(enabled ? 1 : 0); + m_platformWindowHandle.setBorderWidth(0); } /** diff --git a/frame/window/mainwindow.h b/frame/window/mainwindow.h index 32b440eb7..ea8856ed6 100644 --- a/frame/window/mainwindow.h +++ b/frame/window/mainwindow.h @@ -179,7 +179,6 @@ private: void mousePressEvent(QMouseEvent *e) override; void keyPressEvent(QKeyEvent *e) override; void enterEvent(QEvent *e) override; - void dragEnterEvent(QDragEnterEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void moveEvent(QMoveEvent *event) override; void resizeEvent(QResizeEvent *event) override; diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 8839a18c1..e32ffaac6 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -227,8 +227,9 @@ QFont StretchPluginsItem::textFont() const bool StretchPluginsItem::needShowText() const { + // 任务栏在上方或者下方显示的时候,根据设计图,只有在当前区域高度大于50的时候才同时显示文本和图标 if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - return height() > (ICONSIZE + QFontMetrics(textFont()).height() + ICONTEXTSPACE); + return height() >= 50; return true; } From e714c7e44e435d327597db6890c0814ab96cb6ca Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 1 Jun 2022 21:33:50 +0800 Subject: [PATCH 026/257] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=AF=B9?= =?UTF-8?q?=E8=80=81=E6=8F=92=E4=BB=B6=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 所有插件的api版本都改成2.0.0,PluginProxyInterface新增的接口放到最后的位置,保证老插件在加载的时候能调用到正确的函数 Log: 修改老插件的兼容性问题 Influence: 任务栏加载老插件 Bug: https://pms.uniontech.com/bug-view-132961.html Change-Id: I0c2714db6a21f2d246126ce2d9cec96e8c706d80 --- debian/changelog | 6 ++++++ interfaces/constants.h | 2 +- interfaces/pluginproxyinterface.h | 12 ++++++------ plugins/airplane-mode/airplanemode.json | 2 +- plugins/bluetooth/bluetooth.json | 2 +- plugins/datetime/datetime.json | 2 +- plugins/disk-mount/disk-mount.json | 2 +- plugins/keyboard-layout/keyboard.json | 2 +- plugins/multitasking/multitasking.json | 2 +- plugins/onboard/onboard.json | 2 +- plugins/overlay-warning/overlay-warning.json | 2 +- plugins/power/power.json | 2 +- plugins/show-desktop/show-desktop.json | 2 +- plugins/shutdown/shutdown.json | 2 +- plugins/sound/sound.json | 2 +- plugins/trash/trash.json | 2 +- plugins/tray/tray.json | 2 +- 17 files changed, 27 insertions(+), 21 deletions(-) diff --git a/debian/changelog b/debian/changelog index 08420a5b8..a99107e6b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +dde-dock (6.0.0.1) unstable; urgency=low + + * release Tag 6.0.0.1 + + -- donghualin Wed, 1 June 2022 21:34:29 +0800 + dde-dock (6.0.0.0) unstable; urgency=low * release Tag 6.0.0.0 diff --git a/interfaces/constants.h b/interfaces/constants.h index dc4bd9a35..3c79060b9 100644 --- a/interfaces/constants.h +++ b/interfaces/constants.h @@ -27,7 +27,7 @@ namespace Dock { #define DOCK_PLUGIN_MIME "dock/plugin" -#define DOCK_PLUGIN_API_VERSION "1.2.3" +#define DOCK_PLUGIN_API_VERSION "2.0.0" #define PROP_DISPLAY_MODE "DisplayMode" diff --git a/interfaces/pluginproxyinterface.h b/interfaces/pluginproxyinterface.h index bf29dc740..037928d2d 100644 --- a/interfaces/pluginproxyinterface.h +++ b/interfaces/pluginproxyinterface.h @@ -60,12 +60,6 @@ public: /// virtual void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) = 0; - /// - /// update display or information - /// - /// - virtual void updateDockInfo(const DockPart &) = 0; - /// /// \brief requestContextMenu /// request show context menu @@ -102,6 +96,12 @@ public: /// SeeAlse: saveValue /// virtual void removeValue(PluginsItemInterface *const itemInter, const QStringList &keyList) = 0; + + /// + /// update display or information + /// + /// + virtual void updateDockInfo(const DockPart &) = 0; }; #endif // PLUGINPROXYINTERFACE_H diff --git a/plugins/airplane-mode/airplanemode.json b/plugins/airplane-mode/airplanemode.json index cbfdea8e9..cc6819b7a 100644 --- a/plugins/airplane-mode/airplanemode.json +++ b/plugins/airplane-mode/airplanemode.json @@ -1,4 +1,4 @@ { - "api": "1.1.1", + "api": "2.0.0", "depends-daemon-dbus-service": "" } diff --git a/plugins/bluetooth/bluetooth.json b/plugins/bluetooth/bluetooth.json index 5b1e078b2..71ae6746f 100644 --- a/plugins/bluetooth/bluetooth.json +++ b/plugins/bluetooth/bluetooth.json @@ -1,4 +1,4 @@ { - "api": "1.1.1", + "api": "2.0.0", "depends-daemon-dbus-service": "com.deepin.daemon.Bluetooth" } diff --git a/plugins/datetime/datetime.json b/plugins/datetime/datetime.json index 0404bcb19..8c50d97e4 100644 --- a/plugins/datetime/datetime.json +++ b/plugins/datetime/datetime.json @@ -1,4 +1,4 @@ { - "api": "1.2.3", + "api": "2.0.0", "depends-daemon-dbus-service": "com.deepin.daemon.Timedate" } diff --git a/plugins/disk-mount/disk-mount.json b/plugins/disk-mount/disk-mount.json index ad498eeb3..bec81f0da 100644 --- a/plugins/disk-mount/disk-mount.json +++ b/plugins/disk-mount/disk-mount.json @@ -1,3 +1,3 @@ { - "api": "1.1.1" + "api": "2.0.0" } diff --git a/plugins/keyboard-layout/keyboard.json b/plugins/keyboard-layout/keyboard.json index ad498eeb3..bec81f0da 100644 --- a/plugins/keyboard-layout/keyboard.json +++ b/plugins/keyboard-layout/keyboard.json @@ -1,3 +1,3 @@ { - "api": "1.1.1" + "api": "2.0.0" } diff --git a/plugins/multitasking/multitasking.json b/plugins/multitasking/multitasking.json index fdabbaaaa..bec81f0da 100644 --- a/plugins/multitasking/multitasking.json +++ b/plugins/multitasking/multitasking.json @@ -1,3 +1,3 @@ { - "api": "1.2.2" + "api": "2.0.0" } diff --git a/plugins/onboard/onboard.json b/plugins/onboard/onboard.json index ad498eeb3..bec81f0da 100644 --- a/plugins/onboard/onboard.json +++ b/plugins/onboard/onboard.json @@ -1,3 +1,3 @@ { - "api": "1.1.1" + "api": "2.0.0" } diff --git a/plugins/overlay-warning/overlay-warning.json b/plugins/overlay-warning/overlay-warning.json index ad498eeb3..bec81f0da 100644 --- a/plugins/overlay-warning/overlay-warning.json +++ b/plugins/overlay-warning/overlay-warning.json @@ -1,3 +1,3 @@ { - "api": "1.1.1" + "api": "2.0.0" } diff --git a/plugins/power/power.json b/plugins/power/power.json index c302e98e7..388147fa0 100644 --- a/plugins/power/power.json +++ b/plugins/power/power.json @@ -1,4 +1,4 @@ { - "api": "1.1.1", + "api": "2.0.0", "depends-daemon-dbus-service": "com.deepin.daemon.Power" } diff --git a/plugins/show-desktop/show-desktop.json b/plugins/show-desktop/show-desktop.json index fdabbaaaa..bec81f0da 100644 --- a/plugins/show-desktop/show-desktop.json +++ b/plugins/show-desktop/show-desktop.json @@ -1,3 +1,3 @@ { - "api": "1.2.2" + "api": "2.0.0" } diff --git a/plugins/shutdown/shutdown.json b/plugins/shutdown/shutdown.json index ad498eeb3..bec81f0da 100644 --- a/plugins/shutdown/shutdown.json +++ b/plugins/shutdown/shutdown.json @@ -1,3 +1,3 @@ { - "api": "1.1.1" + "api": "2.0.0" } diff --git a/plugins/sound/sound.json b/plugins/sound/sound.json index c5f05e5a5..2d486b2fa 100644 --- a/plugins/sound/sound.json +++ b/plugins/sound/sound.json @@ -1,4 +1,4 @@ { - "api": "1.1.1", + "api": "2.0.0", "depends-daemon-dbus-service": "com.deepin.daemon.Audio" } diff --git a/plugins/trash/trash.json b/plugins/trash/trash.json index ad498eeb3..bec81f0da 100644 --- a/plugins/trash/trash.json +++ b/plugins/trash/trash.json @@ -1,3 +1,3 @@ { - "api": "1.1.1" + "api": "2.0.0" } diff --git a/plugins/tray/tray.json b/plugins/tray/tray.json index 40c82cea6..bf27feb16 100644 --- a/plugins/tray/tray.json +++ b/plugins/tray/tray.json @@ -1,4 +1,4 @@ { - "api": "1.1.1", + "api": "2.0.0", "depends-daemon-dbus-service": "com.deepin.dde.TrayManager" } From a81c3faf4bf92573ba9eae875265235b1ecccf4d Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 6 Jun 2022 15:01:54 +0800 Subject: [PATCH 027/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9C=A8?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E9=9A=90=E8=97=8F=E6=A8=A1=E5=BC=8F=E4=B8=8B?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=98=BE=E7=A4=BA=E6=A8=A1=E5=BC=8F=E5=90=8E?= =?UTF-8?q?=E5=B0=BA=E5=AF=B8=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 切换模式后,应该立即设置主窗体的显示模式值,后续在调整任务栏尺寸的时候,保证获取到的尺寸始终是正确的 Log: Influence: 任务栏-智能隐藏,启动后调整任务栏显示模式,观察尺寸是否发生变化 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I04c897fb81126a8d6b21ad4bc950834604629d3a --- frame/util/multiscreenworker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 3c779bec6..9945832d9 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -392,6 +392,7 @@ void MultiScreenWorker::onDisplayModeChanged(const DisplayMode &displayMode) qInfo() << "display mode change:" << displayMode; m_displayMode = displayMode; + parent()->panel()->setDisplayMode(m_displayMode); DockItem::setDockDisplayMode(displayMode); qApp->setProperty(PROP_DISPLAY_MODE, QVariant::fromValue(displayMode)); @@ -408,7 +409,6 @@ void MultiScreenWorker::onDisplayModeChanged(const DisplayMode &displayMode) parent()->panel()->setFixedSize(rect.size()); parent()->panel()->move(0, 0); - parent()->panel()->setDisplayMode(m_displayMode); emit displayModeChanegd(); emit requestUpdateFrontendGeometry(); From f25258ca20cea6a5cddb6845fab2a10a91f84ae9 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 9 Jun 2022 17:17:27 +0000 Subject: [PATCH 028/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=93=9D?= =?UTF-8?q?=E7=89=99=E6=8F=92=E4=BB=B6=E6=97=A0=E6=B3=95=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 控制中心接口名称已调整,此处修改接口名称 Log: Influence: 任务栏-蓝牙-右键-蓝牙设置,查看是否能打开控制中心 Bug: https://pms.uniontech.com/bug-view-133829.html Change-Id: I4954868fe561a03d6faa51a5ad5e9f496a15e233 --- plugins/bluetooth/bluetoothitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/bluetooth/bluetoothitem.cpp b/plugins/bluetooth/bluetoothitem.cpp index 6eefe3559..65c8ba5d3 100644 --- a/plugins/bluetooth/bluetoothitem.cpp +++ b/plugins/bluetooth/bluetoothitem.cpp @@ -121,7 +121,7 @@ void BluetoothItem::invokeMenuItem(const QString menuId, const bool checked) .service("com.deepin.dde.ControlCenter") .interface("com.deepin.dde.ControlCenter") .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowModule")) + .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); } From 8bd51673bca36e2f90a2e9755eade389862c398e Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 9 Jun 2022 13:16:49 +0800 Subject: [PATCH 029/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=97=A0=E6=B3=95=E5=93=8D=E5=BA=94=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=8A=B6=E6=80=81=E5=8F=98=E5=8C=96=E5=BC=95=E8=B5=B7?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E5=8F=98=E5=8C=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当快捷设置区域的图标发生变化的时候,外部插件需要响应对应的图标变化接口,修改插件区域图标 Log: Influence: 快捷设置区域-查看图标变化 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: I19be98ec53145d45db3ee7023c4a0d4012e68a93 --- frame/controller/quicksettingcontroller.cpp | 5 +++++ frame/controller/quicksettingcontroller.h | 2 ++ frame/item/quicksettingitem.cpp | 17 +++++++---------- frame/item/quicksettingitem.h | 1 - frame/util/abstractpluginscontroller.h | 2 +- frame/window/quickpluginwindow.cpp | 14 ++++++++++++++ frame/window/quickpluginwindow.h | 2 ++ frame/window/quicksettingcontainer.cpp | 3 +++ interfaces/pluginproxyinterface.h | 2 +- 9 files changed, 35 insertions(+), 13 deletions(-) diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 383ed9ca4..a5bdb523f 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -103,6 +103,11 @@ void QuickSettingController::itemRemoved(PluginsItemInterface * const itemInter, } } +void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) +{ + Q_EMIT pluginUpdated(itemInter, part); +} + QuickSettingController *QuickSettingController::instance() { static QuickSettingController instance; diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 0525c6be9..859aacbd8 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -36,6 +36,7 @@ public: Q_SIGNALS: void pluginInserted(QuickSettingItem *); void pluginRemoved(QuickSettingItem *); + void pluginUpdated(PluginsItemInterface *, const DockPart &); protected: void startLoader(); @@ -49,6 +50,7 @@ protected: void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; private: void sortPlugins(); diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index b0dd92d99..16a08f0ee 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -36,7 +36,10 @@ #define BGWIDTH 128 #define BGSIZE 36 +#define MARGINLEFTSPACE 10 #define OPENICONSIZE 12 +#define MARGINRIGHTSPACE 12 + static QSize expandSize = QSize(6, 10); QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) @@ -111,9 +114,8 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) pa.fillRect(pm.rect(), painter.pen().brush()); if (m_pluginInter->isPrimary()) { // 如果是主图标,则显示阴影背景 - int marginXSpace = xMarginSpace(); int marginYSpace = yMarginSpace(); - QRect iconBg(marginXSpace, marginYSpace, BGSIZE, BGSIZE); + QRect iconBg(MARGINLEFTSPACE, marginYSpace, BGSIZE, BGSIZE); QPixmap bgPixmap = ImageUtil::getShadowPixmap(pm, shadowColor(), QSize(BGSIZE, BGSIZE)); painter.drawPixmap(iconBg, bgPixmap); // 绘制文字 @@ -140,8 +142,8 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) pen.setColor(QColor(0, 0, 0)); pen.setWidth(2); painter.setPen(pen); - int iconLeft = rect().width() - marginXSpace - expandSize.width(); - int iconRight = rect().width() - marginXSpace; + int iconLeft = rect().width() - MARGINRIGHTSPACE - expandSize.width(); + int iconRight = rect().width() - MARGINRIGHTSPACE; painter.drawLine(QPoint(iconLeft, (iconBg.y() + (iconBg.height() - expandSize.height()) / 2)), QPoint(iconRight, (iconBg.y() + iconBg.height() / 2))); painter.drawLine(QPoint(iconRight, (iconBg.y() + iconBg.height() / 2)), @@ -203,7 +205,7 @@ void QuickSettingItem::mouseReleaseEvent(QMouseEvent *event) // 如果是鼠标的按下事件 if (m_pluginInter->isPrimary()) { QMouseEvent *mouseEvent = static_cast(event); - QRect rctExpand(rect().width() - xMarginSpace() - expandSize.width(), + QRect rctExpand(rect().width() - MARGINRIGHTSPACE - expandSize.width(), (rect().height() - expandSize.height()) / 2, expandSize.width(), expandSize.height()); if (rctExpand.contains(mapFromGlobal(mouseEvent->globalPos()))) @@ -218,11 +220,6 @@ void QuickSettingItem::mouseReleaseEvent(QMouseEvent *event) } } -int QuickSettingItem::xMarginSpace() -{ - return (rect().width() - BGWIDTH) / 2; -} - int QuickSettingItem::yMarginSpace() { return (rect().height() - BGSIZE) / 2; diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 1d1eb47c4..07321b9bf 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -53,7 +53,6 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override; private: - int xMarginSpace(); int yMarginSpace(); private: diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index b914fd10b..d0cd93c84 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -52,7 +52,7 @@ public: void itemUpdate(PluginsItemInterface * const, const QString &) override {} void itemRemoved(PluginsItemInterface * const, const QString &) override {} - void updateDockInfo(const DockPart &) override {} + void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {} signals: void pluginLoaderFinished(); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index e7b2acf18..4bf10fad9 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -260,6 +260,17 @@ void QuickPluginWindow::onFixedClick() popWindow->show(popupPoint()); } +void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart) +{ + //update plugin status + if (dockPart != DockPart::QuickShow) + return; + + QuickDockItem *dockItem = getDockItemByPlugin(itemInter); + if (dockItem) + dockItem->update(); +} + void QuickPluginWindow::startDrag(PluginsItemInterface *moveItem) { AppDrag *drag = new AppDrag(this, new QuickDragWidget); @@ -448,6 +459,8 @@ void QuickPluginWindow::initConnection() connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ this ] (QuickSettingItem *settingItem){ removePlugin(settingItem->pluginItem()); }); + + connect(QuickSettingController::instance(), &QuickSettingController::pluginUpdated, this, &QuickPluginWindow::onUpdatePlugin); } /** @@ -478,6 +491,7 @@ void QuickDockItem::paintEvent(QPaintEvent *event) QPixmap pixmap = m_pluginItem->icon(DockPart::QuickPanel).pixmap(ICONHEIGHT, ICONHEIGHT); QRect pixmapRect = QRect((rect().width() - ICONHEIGHT) / 2, (rect().height() - ICONHEIGHT) / 2, ICONHEIGHT, ICONHEIGHT); + QPainter painter(this); painter.drawPixmap(pixmapRect, pixmap); } diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 34a015267..db7bbf70a 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -34,6 +34,7 @@ class QStandardItem; class QMouseEvent; class QBoxLayout; class QuickDockItem; +enum class DockPart; namespace Dtk { namespace Gui { class DRegionMonitor; } namespace Widget { class DListView; class DStandardItem; } } @@ -65,6 +66,7 @@ private Q_SLOTS: void onPluginDropItem(QDropEvent *event); void onPluginDragMove(QDragMoveEvent *event); void onFixedClick(); + void onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart); private: void initUi(); diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index c2c9153dd..fcacc4ff6 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -283,6 +283,9 @@ void QuickSettingContainer::initUi() m_pluginLayout->setContentsMargins(0, 0, 0, 0); m_pluginLayout->setSpacing(ITEMSPACE); + m_pluginLayout->setAlignment(Qt::AlignLeft); + for (int i = 0; i < COLUMNCOUNT; i++) + m_pluginLayout->setColumnMinimumWidth(i, ITEMWIDTH); m_pluginWidget->setLayout(m_pluginLayout); m_mainlayout->addWidget(m_pluginWidget); diff --git a/interfaces/pluginproxyinterface.h b/interfaces/pluginproxyinterface.h index 037928d2d..6854a78a2 100644 --- a/interfaces/pluginproxyinterface.h +++ b/interfaces/pluginproxyinterface.h @@ -101,7 +101,7 @@ public: /// update display or information /// /// - virtual void updateDockInfo(const DockPart &) = 0; + virtual void updateDockInfo(PluginsItemInterface *const itemInter, const DockPart &) = 0; }; #endif // PLUGINPROXYINTERFACE_H From 396f8153be38e0d2d6f73cf146d67cee510cccc6 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 8 Jun 2022 17:53:31 +0000 Subject: [PATCH 030/257] =?UTF-8?q?chore:=20=E5=B0=86=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=9A=84=E7=BA=AF=E8=99=9A=E6=8E=A5=E5=8F=A3=E6=94=B9=E6=88=90?= =?UTF-8?q?=E9=9D=9E=E7=BA=AF=E8=99=9A=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 保证单元测试正常编译通过 Log: Influence: 单元测试和其他任务栏插件的调用 Task: https://pms.uniontech.com/task-view-110309.html Change-Id: Ib4f3780ef14233136fe8680cc8f0bcd64a7e0861 --- interfaces/pluginproxyinterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/pluginproxyinterface.h b/interfaces/pluginproxyinterface.h index 6854a78a2..cf9112c94 100644 --- a/interfaces/pluginproxyinterface.h +++ b/interfaces/pluginproxyinterface.h @@ -101,7 +101,7 @@ public: /// update display or information /// /// - virtual void updateDockInfo(PluginsItemInterface *const itemInter, const DockPart &) = 0; + virtual void updateDockInfo(PluginsItemInterface *const, const DockPart &) {} }; #endif // PLUGINPROXYINTERFACE_H From 322623427da6664d4d6a5f9e76cd6206af4d8736 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 10 Jun 2022 16:18:15 +0000 Subject: [PATCH 031/257] =?UTF-8?q?feat:=20=E9=AB=98=E6=95=88=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E5=8A=A0=E8=BD=BD=E5=BF=AB=E6=8D=B7=E6=8F=92?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高效模式下增加读取快捷插件并显示 Log: 高效模式显示快捷插件 Influence: 高效模式显示快捷设置插件 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: I308e963b4816737b3f596bc9d4b93db06851f447 --- frame/controller/dockitemmanager.cpp | 6 - frame/controller/dockitemmanager.h | 1 - frame/controller/dockpluginscontroller.cpp | 15 +- frame/controller/dockpluginscontroller.h | 2 - frame/controller/fixedplugincontroller.cpp | 22 +- frame/controller/fixedplugincontroller.h | 2 + frame/controller/proxyplugincontroller.cpp | 196 ++++++++++++++---- frame/controller/proxyplugincontroller.h | 50 ++++- frame/controller/quicksettingcontroller.cpp | 15 +- frame/controller/quicksettingcontroller.h | 1 - frame/dbus/dbusdockadaptors.cpp | 2 +- frame/main.cpp | 8 +- frame/util/abstractpluginscontroller.h | 8 +- frame/window/mainwindow.cpp | 10 +- frame/window/mainwindow.h | 2 +- plugins/shutdown/shutdown.json | 3 +- plugins/tray/CMakeLists.txt | 3 +- .../system-trays/systemtrayscontroller.cpp | 45 ++-- .../tray/system-trays/systemtrayscontroller.h | 8 +- plugins/tray/trayplugin.cpp | 1 - 20 files changed, 288 insertions(+), 112 deletions(-) diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index af8589882..df5879c16 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -107,12 +107,6 @@ bool DockItemManager::appIsOnDock(const QString &appDesktop) const return m_appInter->IsOnDock(appDesktop); } -void DockItemManager::startLoadPlugins() const -{ - int delay = Utils::SettingValue("com.deepin.dde.dock", "/com/deepin/dde/dock/", "delay-plugins-time", 0).toInt(); - QTimer::singleShot(delay, m_pluginsInter, &DockPluginsController::startLoader); -} - void DockItemManager::refreshItemsIcon() { for (auto item : m_itemList) { diff --git a/frame/controller/dockitemmanager.h b/frame/controller/dockitemmanager.h index 2358f4ca3..2548728c2 100644 --- a/frame/controller/dockitemmanager.h +++ b/frame/controller/dockitemmanager.h @@ -47,7 +47,6 @@ public: const QList > itemList() const; const QList pluginList() const; bool appIsOnDock(const QString &appDesktop) const; - void startLoadPlugins() const; signals: void itemInserted(const int index, DockItem *item) const; diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index 9959290fe..623e7a34e 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -33,12 +33,12 @@ DockPluginsController::DockPluginsController(QObject *parent) { setObjectName("DockPlugin"); - ProxyPluginController::instance()->addProxyInterface(this); + ProxyPluginController::instance(PluginType::FixedSystemPlugin)->addProxyInterface(this); } DockPluginsController::~DockPluginsController() { - ProxyPluginController::instance()->removeProxyInterface(this); + ProxyPluginController::instance(PluginType::FixedSystemPlugin)->removeProxyInterface(this); } void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, const QString &itemKey) @@ -51,7 +51,11 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con return; // 取 plugin api - QPluginLoader *pluginLoader = ProxyPluginController::instance()->pluginLoader(itemInter); + ProxyPluginController *proxyController = ProxyPluginController::instance(itemInter); + if (!proxyController) + return; + + QPluginLoader *pluginLoader = proxyController->pluginLoader(itemInter); if (!pluginLoader) return; @@ -140,8 +144,3 @@ void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const item->hidePopup(); } } - -void DockPluginsController::startLoader() -{ - ProxyPluginController::instance()->startLoader(); -} diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index 7a948e516..7c740ab4b 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -53,8 +53,6 @@ public: void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; - void startLoader(); - signals: void pluginItemInserted(PluginsItem *pluginItem) const; void pluginItemRemoved(PluginsItem *pluginItem) const; diff --git a/frame/controller/fixedplugincontroller.cpp b/frame/controller/fixedplugincontroller.cpp index 049fa9bec..5e4b5545a 100644 --- a/frame/controller/fixedplugincontroller.cpp +++ b/frame/controller/fixedplugincontroller.cpp @@ -27,12 +27,12 @@ FixedPluginController::FixedPluginController(QObject *parent) : AbstractPluginsController(parent) { setObjectName("FixedPluginController"); - ProxyPluginController::instance()->addProxyInterface(this, QStringList("shutdown")); + ProxyPluginController::instance(PluginType::FixedSystemPlugin)->addProxyInterface(this); } FixedPluginController::~FixedPluginController() { - ProxyPluginController::instance()->removeProxyInterface(this); + ProxyPluginController::instance(PluginType::FixedSystemPlugin)->removeProxyInterface(this); } void FixedPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) @@ -63,3 +63,21 @@ void FixedPluginController::itemRemoved(PluginsItemInterface * const itemInter, } } } + +bool FixedPluginController::needLoad(PluginsItemInterface *itemInter) +{ + ProxyPluginController *controller = ProxyPluginController::instance(itemInter); + if (!controller) + return false; + + QPluginLoader *pluginLoader = controller->pluginLoader(itemInter); + if (!pluginLoader) + return false; + + // isFixed配置表示该插件在时尚模式下,显示在最右侧的图标,例如关机图标 + QJsonObject json = pluginLoader->metaData().value("MetaData").toObject(); + if (json.contains("fixed")) + return json.value("fixed").toBool(); + + return false; +} diff --git a/frame/controller/fixedplugincontroller.h b/frame/controller/fixedplugincontroller.h index 5b81be541..11ea4c227 100644 --- a/frame/controller/fixedplugincontroller.h +++ b/frame/controller/fixedplugincontroller.h @@ -47,6 +47,8 @@ protected: void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + bool needLoad(PluginsItemInterface *itemInter) override; + private: QList m_pluginItems; }; diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index 289a2eee9..d2b1e4cc8 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -21,51 +21,92 @@ #include "proxyplugincontroller.h" #include "pluginsiteminterface.h" -QMap ProxyPluginController::m_instances = {}; - // 该方法用来设置所有的需要加载的插件的路径信息 -static QMap> getPluginPaths() +static QMap> getPluginPaths() { + // 添加系统目录 QList pluginPaths; pluginPaths << QStringList{ QString("%1/.local/lib/dde-dock/plugins/").arg(QDir::homePath()) } << QStringList{ QString(qApp->applicationDirPath() + "/../plugins"), QString("/usr/lib/dde-dock/plugins") }; - QMap> plugins; - plugins[FIXEDSYSTEMPLUGIN] = pluginPaths; + QMap> plugins; + plugins[PluginType::FixedSystemPlugin] = pluginPaths; + + // 添加快捷插件目录 + pluginPaths.clear(); + pluginPaths << QStringList{ QString(qApp->applicationDirPath() + "/../plugins/quick-trays"), + QString("/usr/lib/dde-dock/plugins/quick-trays") }; + plugins[PluginType::QuickPlugin] = pluginPaths; + + // 添加系统插件目录 + pluginPaths.clear(); + pluginPaths << QStringList { QString(qApp->applicationDirPath() + "/../plugins/system-trays"), + QString("/usr/lib/dde-dock/plugins/system-trays") }; + plugins[PluginType::SystemTrays] = pluginPaths; + return plugins; } // 该方法根据当前加载插件的类型来生成对应的单例的类 -ProxyPluginController *ProxyPluginController::instance(int instanceKey) +ProxyPluginController *ProxyPluginController::instance(PluginType instanceKey) { - static QMap> pluginLoadInfos = getPluginPaths(); - - if (m_instances.contains(instanceKey)) - return m_instances.value(instanceKey); + // 此处将这些单例对象存储到了qApp里面,而没有存储到本地的静态变量是因为这个对象会在dock进程和tray插件中同时调用, + // 如果存储到内存的临时变量中,他们就是不同的内存地址,获取到的变量就是多个,这样就会导致相同的插件加载多次, + // 而qApp是dock和插件共用的,因此将对象存储到这里是保证能获取到相同的指针对象 + QMap proxyInstances = qApp->property("proxyController").value>(); + if (proxyInstances.contains(instanceKey)) + return proxyInstances.value(instanceKey); // 生成单例类,获取加载插件的路径信息 + static QMap> pluginLoadInfos = getPluginPaths(); ProxyPluginController *controller = new ProxyPluginController(); controller->m_dirs = (pluginLoadInfos.contains(instanceKey) ? pluginLoadInfos[instanceKey] : QList()); - m_instances[instanceKey] = controller; + proxyInstances[instanceKey] = controller; + qApp->setProperty("proxyController", QVariant::fromValue(proxyInstances)); return controller; } +ProxyPluginController *ProxyPluginController::instance(PluginsItemInterface *itemInter) +{ + // 根据插件指针获取对应的代理对象,因为在监听者里可能存在同时加载多个不同目录的插件,用到的就是多实例, + // 添加插件的时候,不知道当前插件是属于哪个实例,因此在此处添加获取对应插件的实例,方便监听者拿到正确的实例 + QVariant proxyProperty = qApp->property("proxyController"); + if (!proxyProperty.canConvert>()) + return nullptr; + + QMap proxyControllers = proxyProperty.value>(); + for (ProxyPluginController *proxyController : proxyControllers) { + const QList &pluginItems = proxyController->m_pluginsItems; + for (PluginsItemInterface *interPair : pluginItems) { + if (interPair == itemInter) + return proxyController; + } + } + + return nullptr; +} + // 新增要使用的控制器,第二个参数表示当前控制器需要加载的插件名称,为空表示加载所有插件 -void ProxyPluginController::addProxyInterface(AbstractPluginsController *interface, const QStringList &pluginNames) +void ProxyPluginController::addProxyInterface(AbstractPluginsController *interface) { if (!m_interfaces.contains(interface)) - m_interfaces[interface] = pluginNames; + m_interfaces << interface; } void ProxyPluginController::removeProxyInterface(AbstractPluginsController *interface) { - if (m_interfaces.contains(interface)) - m_interfaces.remove(interface); + Q_ASSERT(m_interfaces.contains(interface)); + m_interfaces.removeOne(interface); } ProxyPluginController::ProxyPluginController(QObject *parent) : AbstractPluginsController(parent) { + // 只有在非安全模式下才加载插件,安全模式会在等退出安全模式后通过接受事件的方式来加载插件 + if (!qApp->property("safeMode").toBool()) + QMetaObject::invokeMethod(this, &ProxyPluginController::startLoader, Qt::QueuedConnection); + + qApp->installEventFilter(this); } QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const itemInter) @@ -77,51 +118,130 @@ QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const return nullptr; } +QList ProxyPluginController::pluginsItems() const +{ + return m_pluginsItems; +} + +QString ProxyPluginController::itemKey(PluginsItemInterface *itemInter) const +{ + if (m_pluginsItemKeys.contains(itemInter)) + return m_pluginsItemKeys.value(itemInter); + + return QString(); +} + void ProxyPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { - // 只有当前的controll设置的过滤名称包含当前插件的名称或者过滤名称为空,才新增当前插件 - QList pluginKeys = m_interfaces.keys(); - for (AbstractPluginsController *interface: pluginKeys) { - const QStringList &filterNames = m_interfaces[interface]; - if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName())) - interface->itemAdded(itemInter, itemKey); - } + m_pluginsItems << itemInter; + m_pluginsItemKeys[itemInter] = itemKey; + + // 获取需要加载当前插件的监听者,然后将当前插件添加到监听者 + QList validController = getValidController(itemInter); + for (AbstractPluginsController *interface : validController) + interface->itemAdded(itemInter, itemKey); + } void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) { - QList pluginKeys = m_interfaces.keys(); - for (AbstractPluginsController *interface: pluginKeys) { - const QStringList &filterNames = m_interfaces[interface]; - if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName())) - interface->itemUpdate(itemInter, itemKey); - } + QList validController = getValidController(itemInter); + for (AbstractPluginsController *interface : validController) + interface->itemUpdate(itemInter, itemKey); } void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) { - QList pluginKeys = m_interfaces.keys(); - for (AbstractPluginsController *interface: pluginKeys) { - const QStringList &filterNames = m_interfaces[interface]; - if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName())) - interface->itemRemoved(itemInter, itemKey); + if (m_pluginsItems.contains(itemInter)) + m_pluginsItems.removeOne(itemInter); + + if (m_pluginsItemKeys.contains(itemInter)) + m_pluginsItemKeys.remove(itemInter); + + QList validController = getValidController(itemInter); + for (AbstractPluginsController *interface : validController) + interface->itemRemoved(itemInter, itemKey); +} + +void ProxyPluginController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) +{ + QList validController = getValidController(itemInter); + for (AbstractPluginsController *interface : validController) + interface->requestWindowAutoHide(itemInter, itemKey, autoHide); +} + +void ProxyPluginController::requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + QList validController = getValidController(itemInter); + for (AbstractPluginsController *interface : validController) + interface->requestRefreshWindowVisible(itemInter, itemKey); +} + +void ProxyPluginController::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) +{ + QList validController = getValidController(itemInter); + for (AbstractPluginsController *interface : validController) + interface->requestSetAppletVisible(itemInter, itemKey, visible); +} + +void ProxyPluginController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) +{ + QList validController = getValidController(itemInter); + for (AbstractPluginsController *interface : validController) + interface->updateDockInfo(itemInter, part); +} + +bool ProxyPluginController::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == qApp && event->type() == PluginLoadEvent::eventType()) { + // 如果收到的是重新加载插件的消息(一般是在退出安全模式后),则直接加载插件即可 + startLoader(); } + + return QObject::eventFilter(watched, event); +} + +QList ProxyPluginController::getValidController(PluginsItemInterface *itemInter) const +{ + QList validController; + for (AbstractPluginsController *interface : m_interfaces) { + if (!interface->needLoad(itemInter)) + continue; + + validController << interface; + } + + return validController; } void ProxyPluginController::startLoader() { QDir dir; for (const QStringList &pluginPaths : m_dirs) { - QString loadPath; for (const QString &pluginPath : pluginPaths) { if (!dir.exists(pluginPath)) continue; - loadPath = pluginPath; + AbstractPluginsController::startLoader(new PluginLoader(pluginPath, this)); break; } - - if (!loadPath.isEmpty()) - AbstractPluginsController::startLoader(new PluginLoader(loadPath, this)); } } + +// 注册事件类型 +static QEvent::Type pluginEventType = (QEvent::Type)QEvent::registerEventType(QEvent::User + 1001); + +// 事件处理,当收到该事件的时候,加载插件 +PluginLoadEvent::PluginLoadEvent() + : QEvent(pluginEventType) +{ +} + +PluginLoadEvent::~PluginLoadEvent() +{ +} + +QEvent::Type PluginLoadEvent::eventType() +{ + return pluginEventType; +} diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index 5e9f1042e..bb928e861 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -24,12 +24,16 @@ #include "abstractpluginscontroller.h" class PluginsItemInterface; -// 加载的插件的类型 -#define FIXEDSYSTEMPLUGIN 1 +// 加载的插件的类型(1 根目录下的插件 2 快捷设置插件 3 系统插件) +enum class PluginType { + FixedSystemPlugin = 0, + QuickPlugin, + SystemTrays +}; // 该类是一个底层用来加载系统插件的类,DockPluginsController和 // FixedPluginController类都是通过这个类来加载系统插件的 -// 该类做成一个单例,因为理论上一个插件只允许被加载一次,但是对于电源插件来说, +// 该类做成一个多例,因为理论上一个插件只允许被加载一次,但是对于电源插件来说, // 电源插件在高效模式和特效模式下都需要显示,因此,此类用于加载插件,然后分发到不同的 // 上层控制器中 class ProxyPluginController : public AbstractPluginsController @@ -37,11 +41,13 @@ class ProxyPluginController : public AbstractPluginsController Q_OBJECT public: - static ProxyPluginController *instance(int instanceKey = FIXEDSYSTEMPLUGIN); - void addProxyInterface(AbstractPluginsController *interface, const QStringList &pluginNames = QStringList()); + static ProxyPluginController *instance(PluginType instanceKey); + static ProxyPluginController *instance(PluginsItemInterface *itemInter); + void addProxyInterface(AbstractPluginsController *interface); void removeProxyInterface(AbstractPluginsController *interface); - void startLoader(); QPluginLoader *pluginLoader(PluginsItemInterface * const itemInter); + QList pluginsItems() const; + QString itemKey(PluginsItemInterface *itemInter) const; protected: explicit ProxyPluginController(QObject *parent = nullptr); @@ -51,14 +57,36 @@ protected: void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} - void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} - void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; + void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; + + void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; + + bool eventFilter(QObject *watched, QEvent *event) override; private: - static QMap m_instances; - QMap m_interfaces; + QList getValidController(PluginsItemInterface *itemInter) const; + // 该方法可以由DockPluginsController类类调用,强制加载,因此,在此处给这个类加载了一个友元 + void startLoader(); + +private: + QList m_interfaces; QList m_dirs; + QList m_pluginsItems; + QMap m_pluginsItemKeys; }; +// 该插件用于处理插件的延迟加载,当退出安全模式后,会收到该事件并加载插件 +class PluginLoadEvent : public QEvent +{ +public: + PluginLoadEvent(); + ~PluginLoadEvent() override; + + static Type eventType(); +}; + +Q_DECLARE_METATYPE(PluginType) + #endif // PROXYPLUGINCONTROLLER_H diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index a5bdb523f..7d8d45bd3 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -21,16 +21,18 @@ #include "quicksettingcontroller.h" #include "quicksettingitem.h" #include "pluginsiteminterface.h" +#include "proxyplugincontroller.h" QuickSettingController::QuickSettingController(QObject *parent) : AbstractPluginsController(parent) { - // 异步加载本地插件 - QMetaObject::invokeMethod(this, &QuickSettingController::startLoader, Qt::QueuedConnection); + // 加载本地插件 + ProxyPluginController::instance(PluginType::QuickPlugin)->addProxyInterface(this); } QuickSettingController::~QuickSettingController() { + ProxyPluginController::instance(PluginType::QuickPlugin)->removeProxyInterface(this); } void QuickSettingController::sortPlugins() @@ -113,12 +115,3 @@ QuickSettingController *QuickSettingController::instance() static QuickSettingController instance; return &instance; } - -void QuickSettingController::startLoader() -{ - QString pluginsDir("../plugins/quick-trays"); - if (!QDir(pluginsDir).exists()) - pluginsDir = "/usr/lib/dde-dock/plugins/quick-trays"; - - AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); -} diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 859aacbd8..fdd4a1936 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -39,7 +39,6 @@ Q_SIGNALS: void pluginUpdated(PluginsItemInterface *, const DockPart &); protected: - void startLoader(); explicit QuickSettingController(QObject *parent = Q_NULLPTR); ~QuickSettingController() override; diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index f466575f9..11d5f1ed2 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -86,7 +86,7 @@ void DBusDockAdaptors::callShow() void DBusDockAdaptors::ReloadPlugins() { - return parent()->relaodPlugins(); + return parent()->reloadPlugins(); } QStringList DBusDockAdaptors::GetLoadedPlugins() diff --git a/frame/main.cpp b/frame/main.cpp index 76f0700a6..f8e3530d6 100644 --- a/frame/main.cpp +++ b/frame/main.cpp @@ -218,6 +218,11 @@ int main(int argc, char *argv[]) QDir::setCurrent(QApplication::applicationDirPath()); #endif + // 在qApp中记录当前是否为安全模式,如果为安全模式,则无需加载插件,在退出安全模式下,才正常加载插件 + // 此处设置这个属性必须在MainWindow创建之前,因为在mainWindow中会创建加载插件的代理,会在代理中根据这个属性来判断是否需要加载插件 + bool isSafeMode = IsSaveMode(); + qApp->setProperty("safeMode", isSafeMode); + // 注册任务栏的DBus服务 MainWindow mw; DBusDockAdaptors adaptor(&mw); @@ -236,8 +241,7 @@ int main(int argc, char *argv[]) mw.launch(); // 判断是否进入安全模式,是否带有入参 -x - if (!IsSaveMode() && !parser.isSet(disablePlugOption)) { - DockItemManager::instance()->startLoadPlugins(); + if (!isSafeMode && !parser.isSet(disablePlugOption)) { qApp->setProperty("PLUGINSLOADED", true); } else { mw.sendNotifications(); diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index d0cd93c84..f98e183ce 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -51,15 +51,17 @@ public: void itemAdded(PluginsItemInterface * const, const QString &) override {} void itemUpdate(PluginsItemInterface * const, const QString &) override {} void itemRemoved(PluginsItemInterface * const, const QString &) override {} + void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override {} + void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override {} + void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override {} void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {} + virtual bool needLoad(PluginsItemInterface *) { return true; } + signals: void pluginLoaderFinished(); -protected: - virtual bool needLoad(PluginsItemInterface *) { return true; } - protected: QMap> &pluginsMap(); QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 9f895ef1a..15a94e7db 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -24,6 +24,7 @@ #include "mainpanelcontrol.h" #include "dockitemmanager.h" #include "menuworker.h" +#include "proxyplugincontroller.h" #include #include @@ -186,14 +187,19 @@ void MainWindow::callShow() * @brief MainWindow::relaodPlugins * 需要重新加载插件时,此接口会被调用,目前是用于任务栏的安全模式退出时调用 */ -void MainWindow::relaodPlugins() +void MainWindow::reloadPlugins() { if (qApp->property("PLUGINSLOADED").toBool()) { return; } - DockItemManager::instance()->startLoadPlugins(); + // 发送事件,通知代理来加载插件 + PluginLoadEvent event; + QCoreApplication::sendEvent(qApp, &event); + qApp->setProperty("PLUGINSLOADED", true); + // 退出安全模式 + qApp->setProperty("safeMode", false); } /** diff --git a/frame/window/mainwindow.h b/frame/window/mainwindow.h index ea8856ed6..7bd249c72 100644 --- a/frame/window/mainwindow.h +++ b/frame/window/mainwindow.h @@ -172,7 +172,7 @@ public: public slots: void launch(); void callShow(); - void relaodPlugins(); + void reloadPlugins(); private: using QWidget::show; diff --git a/plugins/shutdown/shutdown.json b/plugins/shutdown/shutdown.json index bec81f0da..cdda5b480 100644 --- a/plugins/shutdown/shutdown.json +++ b/plugins/shutdown/shutdown.json @@ -1,3 +1,4 @@ { - "api": "2.0.0" + "api": "2.0.0", + "fixed": true } diff --git a/plugins/tray/CMakeLists.txt b/plugins/tray/CMakeLists.txt index 630151e2e..012e29b75 100644 --- a/plugins/tray/CMakeLists.txt +++ b/plugins/tray/CMakeLists.txt @@ -15,7 +15,8 @@ file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" "../../frame/util/menudialog.h" "../../frame/util/menudialog.cpp" - "../../frame/util/touchsignalmanager.h" "../../frame/util/touchsignalmanager.cpp") + "../../frame/util/touchsignalmanager.h" "../../frame/util/touchsignalmanager.cpp" + "../../frame/controller/proxyplugincontroller.h" "../../frame/controller/proxyplugincontroller.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/tray/system-trays/systemtrayscontroller.cpp b/plugins/tray/system-trays/systemtrayscontroller.cpp index 4f33c682c..e2a2dba06 100644 --- a/plugins/tray/system-trays/systemtrayscontroller.cpp +++ b/plugins/tray/system-trays/systemtrayscontroller.cpp @@ -22,6 +22,7 @@ #include "systemtrayscontroller.h" #include "pluginsiteminterface.h" #include "utils.h" +#include "proxyplugincontroller.h" #include #include @@ -30,6 +31,22 @@ SystemTraysController::SystemTraysController(QObject *parent) : AbstractPluginsController(parent) { setObjectName("SystemTray"); + + // 将当前对象添加进代理对象列表中,代理对象在加载插件成功后,会调用列表中所有对象的itemAdded方法来添加插件 + ProxyPluginController::instance(PluginType::QuickPlugin)->addProxyInterface(this); + ProxyPluginController::instance(PluginType::SystemTrays)->addProxyInterface(this); + + QMetaObject::invokeMethod(this, [ this ] { + // 在加载当前的tray插件之前,所有的插件已经加载,因此此处需要获取代理中已经加载过的插件来加载到当前布局中 + loadPlugins(ProxyPluginController::instance(PluginType::QuickPlugin)); + loadPlugins(ProxyPluginController::instance(PluginType::SystemTrays)); + }, Qt::QueuedConnection); +} + +SystemTraysController::~SystemTraysController() +{ + ProxyPluginController::instance(PluginType::QuickPlugin)->removeProxyInterface(this); + ProxyPluginController::instance(PluginType::SystemTrays)->removeProxyInterface(this); } void SystemTraysController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) @@ -45,8 +62,7 @@ void SystemTraysController::itemAdded(PluginsItemInterface * const itemInter, co connect(item, &SystemTrayItem::itemVisibleChanged, this, [=] (bool visible){ if (visible) { emit pluginItemAdded(itemKey, item); - } - else { + } else { emit pluginItemRemoved(itemKey, item); } }, Qt::QueuedConnection); @@ -124,9 +140,8 @@ int SystemTraysController::systemTrayItemSortKey(const QString &itemKey) { auto inter = pluginInterAt(itemKey); - if (!inter) { + if (!inter) return -1; - } return inter->itemSortKey(itemKey); } @@ -135,9 +150,8 @@ void SystemTraysController::setSystemTrayItemSortKey(const QString &itemKey, con { auto inter = pluginInterAt(itemKey); - if (!inter) { + if (!inter) return; - } inter->setSortKey(itemKey, order); } @@ -146,9 +160,8 @@ const QVariant SystemTraysController::getValueSystemTrayItem(const QString &item { auto inter = pluginInterAt(itemKey); - if (!inter) { + if (!inter) return QVariant(); - } return getValue(inter, key, fallback); } @@ -157,20 +170,16 @@ void SystemTraysController::saveValueSystemTrayItem(const QString &itemKey, cons { auto inter = pluginInterAt(itemKey); - if (!inter) { + if (!inter) return; - } saveValue(inter, key, value); } -void SystemTraysController::startLoader() +void SystemTraysController::loadPlugins(ProxyPluginController *proxyController) { - QString pluginsDir("../plugins/system-trays"); - if (!QDir(pluginsDir).exists()) { - pluginsDir = "/usr/lib/dde-dock/plugins/system-trays"; - } - qDebug() << "using system tray plugins dir:" << pluginsDir; - - AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); + // 加载已有插件,并将其添加到当前的插件中 + const QList &pluginsItems = proxyController->pluginsItems(); + for (PluginsItemInterface *itemInter : pluginsItems) + itemAdded(itemInter, proxyController->itemKey(itemInter)); } diff --git a/plugins/tray/system-trays/systemtrayscontroller.h b/plugins/tray/system-trays/systemtrayscontroller.h index 1b248f9d4..0bd720941 100644 --- a/plugins/tray/system-trays/systemtrayscontroller.h +++ b/plugins/tray/system-trays/systemtrayscontroller.h @@ -34,12 +34,15 @@ #include class PluginsItemInterface; +class ProxyPluginController; + class SystemTraysController : public AbstractPluginsController { Q_OBJECT public: explicit SystemTraysController(QObject *parent = nullptr); + ~SystemTraysController() override; // implements PluginProxyInterface void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; @@ -55,12 +58,13 @@ public: const QVariant getValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant& fallback = QVariant()); void saveValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant &value); - void startLoader(); - signals: void pluginItemAdded(const QString &itemKey, AbstractTrayWidget *pluginItem) const; void pluginItemRemoved(const QString &itemKey, AbstractTrayWidget *pluginItem) const; void pluginItemUpdated(const QString &itemKey, AbstractTrayWidget *pluginItem) const; + +private: + void loadPlugins(ProxyPluginController *proxyController); }; #endif // SYSTEMTRAYSCONTROLLER_H diff --git a/plugins/tray/trayplugin.cpp b/plugins/tray/trayplugin.cpp index 7915ba4f9..1060c963a 100644 --- a/plugins/tray/trayplugin.cpp +++ b/plugins/tray/trayplugin.cpp @@ -112,7 +112,6 @@ void TrayPlugin::init(PluginProxyInterface *proxyInter) // 加载sni,xem,自定义indicator协议以及其他托盘插件 QTimer::singleShot(0, this, &TrayPlugin::loadIndicator); - QTimer::singleShot(0, m_systemTraysController, &SystemTraysController::startLoader); QTimer::singleShot(0, this, &TrayPlugin::initSNI); QTimer::singleShot(0, this, &TrayPlugin::initXEmbed); } From 44b92d90f5184127b243a0aaca32ec988dd43fad Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 14 Jun 2022 10:46:42 +0000 Subject: [PATCH 032/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=85=B3=E6=9C=BA=E6=8C=89=E9=92=AE=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E8=8F=9C=E5=8D=95=E6=97=A0=E6=B3=95=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完善菜单项的点击接口,保证其能正确触发对应的菜单功能 Log: Influence: 任务栏-时尚模式下右键菜单功能 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: Id8d7d767534543d15eda79f77012e21ccdb2527d --- frame/window/systempluginwindow.cpp | 5 +++++ frame/window/systempluginwindow.h | 1 + plugins/shutdown/shutdownplugin.cpp | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index e32ffaac6..fe50095e7 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -239,6 +239,11 @@ const QString StretchPluginsItem::contextMenu() const return m_pluginInter->itemContextMenu(m_itemKey); } +void StretchPluginsItem::invokedMenuItem(const QString &itemId, const bool checked) +{ + m_pluginInter->invokedMenuItem(m_itemKey, itemId, checked); +} + void StretchPluginsItem::mousePressEvent(QMouseEvent *e) { m_hover = false; diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 2c7314337..15d814d36 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -80,6 +80,7 @@ protected: void mouseReleaseEvent(QMouseEvent *e) override; const QString contextMenu() const override; + void invokedMenuItem(const QString &itemId, const bool checked) override; private: void mouseClick(); diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index 9a6b75d9c..4a29c9fb5 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -237,7 +237,7 @@ void ShutdownPlugin::invokedMenuItem(const QString &itemKey, const QString &menu .service("com.deepin.dde.ControlCenter") .interface("com.deepin.dde.ControlCenter") .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowModule")) + .method(QString("ShowPage")) .arg(QString("power")) .call(); } else if (menuId == "Lock") { From 2055820d300a5a367bf5238cf1aa6537aa8661cd Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 14 Jun 2022 13:23:05 +0000 Subject: [PATCH 033/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Ddock=E5=9C=A8?= =?UTF-8?q?=E6=97=B6=E5=B0=9A=E6=A8=A1=E5=BC=8F=E4=B8=8B=E9=98=B2=E5=91=86?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 时尚模式下由于任务栏没有铺满整个屏幕区域,因此在处理任务栏struct的时候,让其选择整个区域 Log: Influence: 任务栏-拖动窗口到最下方的区域 Bug: https://pms.uniontech.com/bug-view-134075.html Change-Id: I4eb3357c01637b6e1cdfc25a0b4f0c5e316ad290 --- frame/util/multiscreenworker.cpp | 35 +++++++++++++++++--------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 9945832d9..526bf25d7 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -762,6 +762,8 @@ void MultiScreenWorker::onRequestNotifyWindowManager() qDebug() << "dock real geometry:" << dockGeometry; qDebug() << "screen width:" << DIS_INS->screenRawWidth() << ", height:" << DIS_INS->screenRawHeight(); + QScreen *curentScreen = DIS_INS->screen(m_ds.current()); + Q_ASSERT(curentScreen); const qreal &ratio = qApp->devicePixelRatio(); if (Utils::IS_WAYLAND_DISPLAY) { QList varList = {0, 0, 0, 0}; @@ -769,26 +771,26 @@ void MultiScreenWorker::onRequestNotifyWindowManager() case Position::Top: varList[0] = 1; varList[1] = dockGeometry.y() + dockGeometry.height() + WINDOWMARGIN * ratio; - varList[2] = dockGeometry.x(); - varList[3] = dockGeometry.x() + dockGeometry.width(); + varList[2] = 0; + varList[3] = curentScreen->availableSize().width(); break; case Position::Bottom: varList[0] = 3; varList[1] = DIS_INS->screenRawHeight() - dockGeometry.y() + WINDOWMARGIN * ratio; - varList[2] = dockGeometry.x(); - varList[3] = dockGeometry.x() + dockGeometry.width(); + varList[2] = 0; + varList[3] = curentScreen->availableSize().width(); break; case Position::Left: varList[0] = 0; varList[1] = dockGeometry.x() + dockGeometry.width() + WINDOWMARGIN * ratio; - varList[2] = dockGeometry.y(); - varList[3] = dockGeometry.y() + dockGeometry.height(); + varList[2] = 0; + varList[3] = curentScreen->availableSize().height(); break; case Position::Right: varList[0] = 2; varList[1] = DIS_INS->screenRawWidth() - dockGeometry.x() + WINDOWMARGIN * ratio; - varList[2] = dockGeometry.y(); - varList[3] = dockGeometry.y() + dockGeometry.height(); + varList[2] = 0; + varList[3] = curentScreen->availableSize().height(); break; } @@ -805,26 +807,26 @@ void MultiScreenWorker::onRequestNotifyWindowManager() case Position::Top: orientation = XcbMisc::OrientationTop; strut = dockGeometry.y() + dockGeometry.height(); - strutStart = dockGeometry.x(); - strutEnd = qMin(dockGeometry.x() + dockGeometry.width(), dockGeometry.right()); + strutStart = 0; + strutEnd = curentScreen->availableSize().width(); break; case Position::Bottom: orientation = XcbMisc::OrientationBottom; strut = DIS_INS->screenRawHeight() - dockGeometry.y(); - strutStart = dockGeometry.x(); - strutEnd = qMin(dockGeometry.x() + dockGeometry.width(), dockGeometry.right()); + strutStart = 0; + strutEnd = curentScreen->availableSize().width(); break; case Position::Left: orientation = XcbMisc::OrientationLeft; strut = dockGeometry.x() + dockGeometry.width(); - strutStart = dockGeometry.y(); - strutEnd = qMin(dockGeometry.y() + dockGeometry.height(), dockGeometry.bottom()); + strutStart = 0; + strutEnd = curentScreen->availableSize().height(); break; case Position::Right: orientation = XcbMisc::OrientationRight; strut = DIS_INS->screenRawWidth() - dockGeometry.x(); - strutStart = dockGeometry.y(); - strutEnd = qMin(dockGeometry.y() + dockGeometry.height(), dockGeometry.bottom()); + strutStart = 0; + strutEnd = curentScreen->availableSize().height(); break; } @@ -902,6 +904,7 @@ void MultiScreenWorker::onChildSizeChanged() QSize dockSize = dockRect(m_ds.current(), position(), HideMode::KeepShowing, displayMode()).size(); parent()->setFixedSize(dockSize); + parent()->setGeometry(dockRect(m_ds.current())); parent()->panel()->setFixedSize(dockSize); parent()->panel()->move(0, 0); parent()->panel()->update(); From 0340166430ace7e228672eac1bb41ed086944ee0 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 14 Jun 2022 12:57:16 +0000 Subject: [PATCH 034/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=97=A0=E6=B3=95=E6=89=93=E5=BC=80=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=AD=E5=BF=83=E5=AF=B9=E5=BA=94=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 控制中心的接口名称从ShowModule换成ShowPage Log: Influence: 任务栏所有需要打开控制中心的地方 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: I20b133c55896d6afbf712f767a6688976f080cf0 --- debian/control | 3 ++- frame/window/components/brightnessmonitorwidget.cpp | 2 +- frame/window/components/volumedeviceswidget.cpp | 2 +- plugins/bluetooth/componments/bluetoothapplet.cpp | 2 +- plugins/datetime/datetimeplugin.cpp | 2 +- plugins/power/powerplugin.cpp | 4 ++-- plugins/sound/sounditem.cpp | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/debian/control b/debian/control index 69391aaab..2edbb43a3 100644 --- a/debian/control +++ b/debian/control @@ -38,7 +38,8 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, dde-daemon (>=5.13.12), startdde (>=5.8.9), lastore-daemon (>=5.2.9), - qtxdg-dev-tools + qtxdg-dev-tools, + dbus-bin Recommends: dde-disk-mount-plugin, dde-dock-onboard-plugin, diff --git a/frame/window/components/brightnessmonitorwidget.cpp b/frame/window/components/brightnessmonitorwidget.cpp index ac707795a..96892c67a 100644 --- a/frame/window/components/brightnessmonitorwidget.cpp +++ b/frame/window/components/brightnessmonitorwidget.cpp @@ -116,7 +116,7 @@ void BrightnessMonitorWidget::initConnection() DDBusSender().service("com.deepin.dde.ControlCenter") .path("/com/deepin/dde/ControlCenter") .interface("com.deepin.dde.ControlCenter") - .method("ShowModule").arg(QString("display")).call(); + .method("ShowPage").arg(QString("display")).call(); hide(); } }); diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp index 9be4706cc..f44a8fe20 100644 --- a/frame/window/components/volumedeviceswidget.cpp +++ b/frame/window/components/volumedeviceswidget.cpp @@ -164,7 +164,7 @@ void VolumeDevicesWidget::initConnection() DDBusSender().service("com.deepin.dde.ControlCenter") .path("/com/deepin/dde/ControlCenter") .interface("com.deepin.dde.ControlCenter") - .method("ShowModule").arg(QString("sound")).call(); + .method("ShowPage").arg(QString("sound")).call(); hide(); } }); diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index b5e9b728a..98ba00522 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -280,7 +280,7 @@ void BluetoothApplet::initConnect() .service("com.deepin.dde.ControlCenter") .interface("com.deepin.dde.ControlCenter") .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowModule")) + .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); }); diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index 93c4e8932..b22df827f 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -194,7 +194,7 @@ void DatetimePlugin::invokedMenuItem(const QString &itemKey, const QString &menu .service("com.deepin.dde.ControlCenter") .interface("com.deepin.dde.ControlCenter") .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowModule")) + .method(QString("ShowPage")) .arg(QString("datetime")) .call(); } else { diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index ff6ef5d60..ec7358888 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -113,7 +113,7 @@ bool PowerPlugin::pluginIsDisable() const QString PowerPlugin::itemCommand(const QString &itemKey) { if (itemKey == POWER_KEY) - return QString("dbus-send --print-reply --dest=com.deepin.dde.ControlCenter /com/deepin/dde/ControlCenter com.deepin.dde.ControlCenter.ShowModule \"string:power\""); + return QString("dbus-send --print-reply --dest=com.deepin.dde.ControlCenter /com/deepin/dde/ControlCenter com.deepin.dde.ControlCenter.ShowPage \"string:power\""); return QString(); } @@ -153,7 +153,7 @@ void PowerPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, .service("com.deepin.dde.ControlCenter") .interface("com.deepin.dde.ControlCenter") .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowModule")) + .method(QString("ShowPage")) .arg(QString("power")) .call(); } diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 9b333c5d3..4690622e6 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -132,7 +132,7 @@ void SoundItem::invokeMenuItem(const QString menuId, const bool checked) .service("com.deepin.dde.ControlCenter") .interface("com.deepin.dde.ControlCenter") .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowModule")) + .method(QString("ShowPage")) .arg(QString("sound")) .call(); } From fc181973cef81c7171574696d27e30ada78adb22 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 15 Jun 2022 13:35:50 +0000 Subject: [PATCH 035/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E5=B1=8F=E5=B9=95=E7=BC=A9=E6=94=BE=E4=B8=8B=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=A8=A1=E7=B3=8A=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加对屏幕缩放的处理,保证图标正常显示 Log: Influence: 将缩放设置为大于1,查看任务栏电源图标、网络等图标的展示情况 Task: https://pms.uniontech.com/task-view-149623.html Change-Id: Ie4be9d0644b5be1f961ee70ee8472cab9dec9377 --- frame/item/quicksettingitem.cpp | 53 +++++++++++++------ frame/item/quicksettingitem.h | 1 + frame/window/quickpluginwindow.cpp | 4 +- frame/window/systempluginwindow.cpp | 9 ++-- .../window/tray/widgets/expandiconwidget.cpp | 13 +++-- frame/window/tray/widgets/expandiconwidget.h | 2 +- plugins/shutdown/shutdownplugin.cpp | 3 +- 7 files changed, 57 insertions(+), 28 deletions(-) diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 16a08f0ee..74f519845 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -38,9 +38,9 @@ #define BGSIZE 36 #define MARGINLEFTSPACE 10 #define OPENICONSIZE 12 -#define MARGINRIGHTSPACE 12 +#define MARGINRIGHTSPACE 9 -static QSize expandSize = QSize(6, 10); +static QSize expandSize = QSize(20, 20); QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) : DockItem(parent) @@ -108,7 +108,18 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) // 绘制背景色 painter.fillRect(rect(), backgroundColor()); // 让图标填上前景色 - QPixmap pm = m_pluginInter->icon(DockPart::QuickPanel).pixmap(ICONWIDTH, ICONHEIGHT); + int pixmapWidth = static_cast(ICONWIDTH * qApp->devicePixelRatio()); + int pixmapHeight = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); + QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) { + QSize size = iconSizes[0]; + if (size.isValid() && !size.isEmpty() && !size.isNull()) { + pixmapWidth = size.width(); + pixmapHeight = size.height(); + } + } + QPixmap pm = icon.pixmap(pixmapWidth, pixmapHeight); QPainter pa(&pm); pa.setCompositionMode(QPainter::CompositionMode_SourceIn); pa.fillRect(pm.rect(), painter.pen().brush()); @@ -116,10 +127,17 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) // 如果是主图标,则显示阴影背景 int marginYSpace = yMarginSpace(); QRect iconBg(MARGINLEFTSPACE, marginYSpace, BGSIZE, BGSIZE); - QPixmap bgPixmap = ImageUtil::getShadowPixmap(pm, shadowColor(), QSize(BGSIZE, BGSIZE)); - painter.drawPixmap(iconBg, bgPixmap); + painter.save(); + painter.setPen(Qt::NoPen); + painter.setBrush(shadowColor()); + painter.drawEllipse(iconBg); + painter.restore(); + QRect rctIcon(iconBg.x() + (iconBg.width() - pixmapWidth) / 2, + iconBg.y() + (iconBg.height() - pixmapHeight) / 2, + pixmapWidth, pixmapHeight); + painter.drawPixmap(rctIcon, pm); // 绘制文字 - painter.setPen(QColor(0, 0, 0)); + painter.setPen(Qt::black); QRect rctPluginName(iconBg.right() + 10, iconBg.top(), BGWIDTH - BGSIZE - OPENICONSIZE - 10 * 2, BGSIZE / 2); QFont font = DFontSizeManager::instance()->t6(); @@ -128,7 +146,6 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) QTextOption textOption; textOption.setAlignment(Qt::AlignLeft | Qt::AlignVCenter); QString displayName = QFontMetrics(font).elidedText(m_pluginInter->pluginDisplayName(), Qt::TextElideMode::ElideRight, rctPluginName.width()); - QFontMetrics fm(font); painter.drawText(rctPluginName, displayName, textOption); // 绘制下方啊的状态文字 QRect rctPluginStatus(rctPluginName.x(), rctPluginName.bottom() + 1, @@ -138,16 +155,12 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) QString description = QFontMetrics(font).elidedText(m_pluginInter->description(), Qt::TextElideMode::ElideRight, rctPluginStatus.width()); painter.drawText(rctPluginStatus, description, textOption); // 绘制右侧的展开按钮 - QPen pen; - pen.setColor(QColor(0, 0, 0)); - pen.setWidth(2); - painter.setPen(pen); - int iconLeft = rect().width() - MARGINRIGHTSPACE - expandSize.width(); + QPixmap expandPixmap = ImageUtil::loadSvg(expandFileName(), expandSize); int iconRight = rect().width() - MARGINRIGHTSPACE; - painter.drawLine(QPoint(iconLeft, (iconBg.y() + (iconBg.height() - expandSize.height()) / 2)), - QPoint(iconRight, (iconBg.y() + iconBg.height() / 2))); - painter.drawLine(QPoint(iconRight, (iconBg.y() + iconBg.height() / 2)), - QPoint(iconLeft, (iconBg.y() + (iconBg.height() + expandSize.height()) / 2))); + QRect rectOfExpand(iconRight - expandSize.width(), + (rctIcon.y() + (rctIcon.height() - expandSize.height()) / 2), + expandSize.width(), expandSize.height()); + painter.drawPixmap(rectOfExpand, expandPixmap); } else { // 绘制图标 QRect rctIcon = iconRect(); @@ -224,3 +237,11 @@ int QuickSettingItem::yMarginSpace() { return (rect().height() - BGSIZE) / 2; } + +QString QuickSettingItem::expandFileName() +{ + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/arrow-right-dark.svg"); + + return QString(":/icons/resources/arrow-right.svg"); +} diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 07321b9bf..99c3e3278 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -54,6 +54,7 @@ protected: private: int yMarginSpace(); + QString expandFileName(); private: PluginsItemInterface *m_pluginInter; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 4bf10fad9..1d2dac253 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #define ITEMSIZE 22 #define ITEMSPACE 6 @@ -488,7 +489,8 @@ void QuickDockItem::paintEvent(QPaintEvent *event) if (!m_pluginItem) return QWidget::paintEvent(event); - QPixmap pixmap = m_pluginItem->icon(DockPart::QuickPanel).pixmap(ICONHEIGHT, ICONHEIGHT); + int pixmapSize = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); + QPixmap pixmap = m_pluginItem->icon(DockPart::QuickPanel).pixmap(pixmapSize, pixmapSize); QRect pixmapRect = QRect((rect().width() - ICONHEIGHT) / 2, (rect().height() - ICONHEIGHT) / 2, ICONHEIGHT, ICONHEIGHT); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index fe50095e7..1a368fcc1 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #define MAXICONSIZE 48 #define MINICONSIZE 24 @@ -192,18 +193,20 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) } // 绘制图标 - painter.drawPixmap(rctPixmap, icon.pixmap(ICONSIZE, ICONSIZE)); + int iconSize = static_cast(ICONSIZE * (qApp->devicePixelRatio())); + painter.drawPixmap(rctPixmap, icon.pixmap(iconSize, iconSize)); } QSize StretchPluginsItem::suitableSize() const { + int iconSize = static_cast(ICONSIZE * (qApp->devicePixelRatio())); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { int textWidth = QFontMetrics(textFont()).boundingRect(m_pluginInter->pluginDisplayName()).width(); - return QSize(qMax(textWidth, ICONSIZE) + 10 * 2, -1); + return QSize(qMax(textWidth, iconSize) + 10 * 2, -1); } int height = 6; // 图标上边距6 - height += ICONSIZE; // 图标尺寸20 + height += iconSize; // 图标尺寸20 height += ICONTEXTSPACE; // 图标与文字间距6 height += QFontMetrics(textFont()).height(); // 文本高度 height += 4; // 下间距4 diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 2d7670ed3..21da2b1bb 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -23,6 +23,7 @@ #include "tray_model.h" #include "tray_delegate.h" #include "dockpopupwindow.h" +#include "imageutil.h" #include #include @@ -88,13 +89,15 @@ QPixmap ExpandIconWidget::icon() return QPixmap(dropIconFile()); } -void ExpandIconWidget::paintEvent(QPaintEvent *e) +void ExpandIconWidget::paintEvent(QPaintEvent *) { - Q_UNUSED(e); - QPainter painter(this); - QPixmap pixmap(dropIconFile()); - painter.drawPixmap(0, 0, pixmap); + QPixmap pixmap = ImageUtil::loadSvg(dropIconFile(), QSize(ICON_SIZE, ICON_SIZE)); + QRect rectOfPixmap(rect().x() + (rect().width() - ICON_SIZE) / 2, + rect().y() + (rect().height() - ICON_SIZE) / 2, + ICON_SIZE, ICON_SIZE); + + painter.drawPixmap(rectOfPixmap, pixmap); } const QString ExpandIconWidget::dropIconFile() const diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h index 4208ffa20..97e5dbe01 100644 --- a/frame/window/tray/widgets/expandiconwidget.h +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -58,7 +58,7 @@ private Q_SLOTS: void onRowCountChanged(); protected: - void paintEvent(QPaintEvent *e) override; + void paintEvent(QPaintEvent *) override; const QString dropIconFile() const; void resetPosition(); diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index 4a29c9fb5..35d9bb1d5 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -296,8 +296,7 @@ QIcon ShutdownPlugin::icon(const DockPart &dockPart) { Q_UNUSED(dockPart); - static QIcon shutdownIcon; - shutdownIcon.detach(); + QIcon shutdownIcon; shutdownIcon.addPixmap(m_shutdownWidget->loadPixmap()); return shutdownIcon; } From 3824e9d9bba62f531802a93deb7306703ec2adf2 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 20 Jun 2022 13:40:16 +0800 Subject: [PATCH 036/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E8=AE=BE=E7=BD=AE=E9=9D=A2=E6=9D=BF=E7=9A=84=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=9C=A8=E9=AB=98=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=A8=A1=E7=B3=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 带背景的圆底图标不再通过自动创建,因为无法控制周边的锯齿,统一在paintEvent函数中进行绘制。修改滑动条统一通过代理来进行绘制 Log: Influence: 屏幕设置高缩放率,任务栏特效模式下,查看快捷面板图标是否正常显示 Bug: https://pms.uniontech.com/task-view-149623.html Change-Id: I825e38a9ae8c5a4252be840193e44393ac129201 --- frame/item/quicksettingitem.cpp | 31 +- frame/item/quicksettingitem.h | 2 - frame/util/imageutil.cpp | 33 --- frame/util/imageutil.h | 1 - .../components/brightnessmonitorwidget.cpp | 23 +- .../components/brightnessmonitorwidget.h | 2 +- frame/window/components/brightnesswidget.cpp | 48 ++- frame/window/components/brightnesswidget.h | 11 +- frame/window/components/customslider.cpp | 192 ------------ frame/window/components/customslider.h | 92 ------ frame/window/components/mediawidget.cpp | 2 +- frame/window/components/slidercontainer.cpp | 273 ++++++++++++++++++ frame/window/components/slidercontainer.h | 110 +++++++ .../window/components/volumedeviceswidget.cpp | 66 ++++- frame/window/components/volumedeviceswidget.h | 8 +- frame/window/components/volumewidget.cpp | 71 ++--- frame/window/components/volumewidget.h | 9 +- frame/window/quicksettingcontainer.cpp | 22 +- frame/window/quicksettingcontainer.h | 4 + 19 files changed, 546 insertions(+), 454 deletions(-) delete mode 100644 frame/window/components/customslider.cpp delete mode 100644 frame/window/components/customslider.h create mode 100644 frame/window/components/slidercontainer.cpp create mode 100644 frame/window/components/slidercontainer.h diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 74f519845..58f36610e 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -106,7 +107,8 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) painter.setClipPath(path); // 绘制背景色 - painter.fillRect(rect(), backgroundColor()); + DPalette dpa = DPaletteHelper::instance()->palette(this); + painter.fillRect(rect(), dpa.brush(DPalette::ColorRole::Mid)); // 让图标填上前景色 int pixmapWidth = static_cast(ICONWIDTH * qApp->devicePixelRatio()); int pixmapHeight = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); @@ -129,7 +131,7 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) QRect iconBg(MARGINLEFTSPACE, marginYSpace, BGSIZE, BGSIZE); painter.save(); painter.setPen(Qt::NoPen); - painter.setBrush(shadowColor()); + painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); painter.drawEllipse(iconBg); painter.restore(); QRect rctIcon(iconBg.x() + (iconBg.width() - pixmapWidth) / 2, @@ -185,32 +187,15 @@ QRect QuickSettingItem::iconRect() QColor QuickSettingItem::foregroundColor() const { + DPalette dpa = DPaletteHelper::instance()->palette(this); // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) - return QColor(0, 129, 255); + return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Deactive) - return QColor(51, 51, 51); + return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); - return QColor(181, 181, 181); -} - -QColor QuickSettingItem::backgroundColor() const -{ - // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 - if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) - return QColor(250, 250, 252); - - return QColor(241, 241, 246); -} - -QColor QuickSettingItem::shadowColor() const -{ - // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 - if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) - return QColor(217, 219, 226); - - return QColor(199, 203, 222); + return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); } void QuickSettingItem::mouseReleaseEvent(QMouseEvent *event) diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 99c3e3278..69b824db3 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -47,8 +47,6 @@ protected: void paintEvent(QPaintEvent *e) override; QRect iconRect(); QColor foregroundColor() const; - QColor backgroundColor() const; - QColor shadowColor() const; void mouseReleaseEvent(QMouseEvent *event) override; diff --git a/frame/util/imageutil.cpp b/frame/util/imageutil.cpp index 8558d5480..a2a3f2014 100644 --- a/frame/util/imageutil.cpp +++ b/frame/util/imageutil.cpp @@ -84,36 +84,3 @@ QCursor* ImageUtil::loadQCursorFromX11Cursor(const char* theme, const char* curs XcursorImagesDestroy(images); return cursor; } - -const QPixmap ImageUtil::getShadowPixmap(const QPixmap &pixmap, const QColor &shadowColor, const QSize &backSize) -{ - // 新建一个bitmap作为遮罩,尺寸为外部指定(backSize) - QBitmap bitmap(backSize); - QPainter painter(&bitmap); - painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - painter.setPen(Qt::NoPen); - // 往bitmap上绘制圆形区域 - QRect rectBackground(0, 0, backSize.width(), backSize.height()); - painter.fillRect(rectBackground, Qt::white); - painter.setBrush(Qt::black); - painter.drawEllipse(0, 0, backSize.width(), backSize.height()); - - // 新建QPixmap,将上述新建的Bitmap作为它的遮罩 - QPixmap newPixmap(backSize); - newPixmap.setMask(bitmap); - QPainter pixPainter(&newPixmap); - pixPainter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - const QSize iconSize = pixmap.size(); - int startX = (backSize.width() - iconSize.width()) / 2; - int startY = (backSize.height() - iconSize.height()) / 2; - // 将传入参数的背景尺寸(backSize)作为背景,通过画笔路径在上面绘制圆形区域 - QRect rectPixmap(startX, startY, iconSize.width(), iconSize.height()); - QPainterPath path; - path.addEllipse(rectBackground); - pixPainter.fillPath(path, shadowColor); - // 将图像绘制到新建的QPixmap的背景区域,并返回新的QPixmap - pixPainter.drawPixmap(rectPixmap, pixmap); - pixPainter.setPen(shadowColor); - pixPainter.drawEllipse(rectBackground); - return newPixmap; -} diff --git a/frame/util/imageutil.h b/frame/util/imageutil.h index 0205e135c..0ed1b3c37 100644 --- a/frame/util/imageutil.h +++ b/frame/util/imageutil.h @@ -35,7 +35,6 @@ public: static const QPixmap loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio); static const QPixmap loadSvg(const QString &iconName, const QSize size, const qreal ratio = qApp->devicePixelRatio()); static QCursor* loadQCursorFromX11Cursor(const char* theme, const char* cursorName, int cursorSize); - static const QPixmap getShadowPixmap(const QPixmap &pixmap, const QColor &shadowColor, const QSize &backSize); }; #endif // IMAGEUTIL_H diff --git a/frame/window/components/brightnessmonitorwidget.cpp b/frame/window/components/brightnessmonitorwidget.cpp index 96892c67a..a37a4c3fa 100644 --- a/frame/window/components/brightnessmonitorwidget.cpp +++ b/frame/window/components/brightnessmonitorwidget.cpp @@ -20,8 +20,9 @@ */ #include "brightnessmonitorwidget.h" #include "brightnessmodel.h" -#include "customslider.h" +#include "slidercontainer.h" #include "settingdelegate.h" +#include "imageutil.h" #include #include @@ -72,14 +73,20 @@ void BrightnessMonitorWidget::initUi() QList monitors = m_brightModel->monitors(); for (BrightMonitor *monitor : monitors) { - SliderContainer *container = new SliderContainer(CustomSlider::Normal, m_sliderWidget); + SliderContainer *container = new SliderContainer(m_sliderWidget); container->setTitle(monitor->name()); - container->slider()->setIconSize(QSize(20, 20)); - container->slider()->setLeftIcon(QIcon(":/icons/resources/brightnesslow")); - container->slider()->setRightIcon(QIcon(":/icons/resources/brightnesshigh")); + QPixmap leftPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesslow", QSize(20, 20)); + QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesshigh", QSize(20, 20)); + container->updateSlider(SliderContainer::IconPosition::LeftIcon, { leftPixmap.size(), QSize(), leftPixmap, 12 }); + container->updateSlider(SliderContainer::IconPosition::RightIcon, { rightPixmap.size(), QSize(), rightPixmap, 12 }); + container->setFixedHeight(50); m_sliderLayout->addWidget(container); + SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); + proxy->setParent(container->slider()); + container->slider()->setStyle(proxy); + m_sliderContainers << qMakePair(monitor, container); } @@ -122,9 +129,9 @@ void BrightnessMonitorWidget::initConnection() }); for (QPair container : m_sliderContainers) { - SliderContainer *slider = container.second; - slider->slider()->setValue(container.first->brihtness()); - connect(slider->slider(), &CustomSlider::valueChanged, this, [ = ](int value) { + SliderContainer *sliderContainer = container.second; + sliderContainer->slider()->setValue(container.first->brihtness()); + connect(sliderContainer->slider(), &QSlider::valueChanged, this, [ this, container ](int value) { m_brightModel->setBrightness(container.first, value); }); } diff --git a/frame/window/components/brightnessmonitorwidget.h b/frame/window/components/brightnessmonitorwidget.h index 6e1c7d92b..7fdbd994a 100644 --- a/frame/window/components/brightnessmonitorwidget.h +++ b/frame/window/components/brightnessmonitorwidget.h @@ -25,7 +25,7 @@ #include class QLabel; -class CustomSlider; +class SliderContainer; class BrightnessModel; class QStandardItemModel; class QVBoxLayout; diff --git a/frame/window/components/brightnesswidget.cpp b/frame/window/components/brightnesswidget.cpp index 8b67a2c46..eda1b707d 100644 --- a/frame/window/components/brightnesswidget.cpp +++ b/frame/window/components/brightnesswidget.cpp @@ -19,33 +19,33 @@ * along with this program. If not, see . */ #include "brightnesswidget.h" -#include "customslider.h" #include "brightnessmodel.h" #include "brightnessmonitorwidget.h" #include "imageutil.h" +#include "slidercontainer.h" #include #include #define BACKSIZE 36 -#define IMAGESIZE 24 +#define IMAGESIZE 18 -BrightnessWidget::BrightnessWidget(QWidget *parent) +BrightnessWidget::BrightnessWidget(BrightnessModel *model, QWidget *parent) : DBlurEffectWidget(parent) - , m_slider(new CustomSlider(CustomSlider::SliderType::Normal, this)) - , m_model(new BrightnessModel(this)) + , m_sliderContainer(new SliderContainer(this)) + , m_model(model) { initUi(); - initConenction(); + initConnection(); } BrightnessWidget::~BrightnessWidget() { } -BrightnessModel *BrightnessWidget::model() +SliderContainer *BrightnessWidget::sliderContainer() { - return m_model; + return m_sliderContainer; } void BrightnessWidget::showEvent(QShowEvent *event) @@ -63,30 +63,22 @@ void BrightnessWidget::hideEvent(QHideEvent *event) void BrightnessWidget::initUi() { QHBoxLayout *layout = new QHBoxLayout(this); - layout->setContentsMargins(20, 0, 20, 0); - layout->addWidget(m_slider); + layout->setContentsMargins(15, 0, 12, 0); + layout->addWidget(m_sliderContainer); - m_slider->setPageStep(1); - m_slider->setIconSize(QSize(BACKSIZE, BACKSIZE)); + QPixmap leftPixmap = ImageUtil::loadSvg(":/icons/resources/brightness.svg", QSize(IMAGESIZE, IMAGESIZE)); + QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/ICON_Device_Laptop.svg", QSize(IMAGESIZE, IMAGESIZE)); + m_sliderContainer->updateSlider(SliderContainer::IconPosition::LeftIcon, { leftPixmap.size(), QSize(), leftPixmap, 10 }); + m_sliderContainer->updateSlider(SliderContainer::IconPosition::RightIcon, { rightPixmap.size(), QSize(BACKSIZE, BACKSIZE), rightPixmap, 12}); - QIcon leftIcon(QPixmap(":/icons/resources/brightness.svg").scaled(IMAGESIZE, IMAGESIZE)); - m_slider->setLeftIcon(leftIcon); - QPixmap rightPixmap = ImageUtil::getShadowPixmap(QPixmap(QString(":/icons/resources/ICON_Device_Laptop.svg")).scaled(24, 24), Qt::lightGray, QSize(36, 36)); - m_slider->setRightIcon(rightPixmap); - - SliderProxy *style = new SliderProxy; - style->setParent(m_slider->qtSlider()); - m_slider->qtSlider()->setStyle(style); + SliderProxyStyle *style = new SliderProxyStyle; + style->setParent(m_sliderContainer->slider()); + m_sliderContainer->slider()->setStyle(style); } -void BrightnessWidget::initConenction() +void BrightnessWidget::initConnection() { - connect(m_slider, &CustomSlider::iconClicked, this, [ this ](DSlider::SliderIcons icon, bool) { - if (icon == DSlider::SliderIcons::RightIcon) - Q_EMIT rightIconClicked(); - }); - - connect(m_slider, &CustomSlider::valueChanged, this, [ this ](int value) { + connect(m_sliderContainer->slider(), &QSlider::valueChanged, this, [ this ](int value) { BrightMonitor *monitor = m_model->primaryMonitor(); if (monitor) m_model->setBrightness(monitor, value); @@ -104,5 +96,5 @@ void BrightnessWidget::onUpdateBright(BrightMonitor *monitor) if (!monitor->isPrimary()) return; // 此处只显示主屏的亮度 - m_slider->setValue(monitor->brihtness()); + m_sliderContainer->slider()->setValue(monitor->brihtness()); } diff --git a/frame/window/components/brightnesswidget.h b/frame/window/components/brightnesswidget.h index 4d381acd6..c8f11a552 100644 --- a/frame/window/components/brightnesswidget.h +++ b/frame/window/components/brightnesswidget.h @@ -25,7 +25,7 @@ DWIDGET_USE_NAMESPACE -class CustomSlider; +class SliderContainer; class BrightnessModel; class BrightMonitor; @@ -34,13 +34,12 @@ class BrightnessWidget : public DBlurEffectWidget Q_OBJECT public: - explicit BrightnessWidget(QWidget *parent = nullptr); + explicit BrightnessWidget(BrightnessModel *model, QWidget *parent = nullptr); ~BrightnessWidget() override; - BrightnessModel *model(); + SliderContainer *sliderContainer(); Q_SIGNALS: void visibleChanged(bool); - void rightIconClicked(); protected: void showEvent(QShowEvent *event) override; @@ -51,10 +50,10 @@ private Q_SLOTS: private: void initUi(); - void initConenction(); + void initConnection(); private: - CustomSlider *m_slider; + SliderContainer *m_sliderContainer; BrightnessModel *m_model; }; diff --git a/frame/window/components/customslider.cpp b/frame/window/components/customslider.cpp deleted file mode 100644 index d53e3a1ce..000000000 --- a/frame/window/components/customslider.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "customslider.h" -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -CustomSlider::CustomSlider(CustomSlider::SliderType type, QWidget *parent) - : DSlider(Qt::Horizontal, parent) -{ - setType(type); - DSlider::slider()->setTracking(false); -} - -CustomSlider::CustomSlider(Qt::Orientation orientation, QWidget *parent) - : DSlider(orientation, parent) -{ - DSlider::slider()->setTracking(false); -} - -void CustomSlider::setType(CustomSlider::SliderType type) -{ - switch (type) { - case Vernier: setProperty("handleType", "Vernier"); break; - case Progress: setProperty("handleType", "None"); break; - default: setProperty("handleType", "Normal"); break; - } -} - -QSlider *CustomSlider::qtSlider() -{ - return DSlider::slider(); -} - -void CustomSlider::setRange(int min, int max) -{ - setMinimum(min); - setMaximum(max); -} - -void CustomSlider::setTickPosition(QSlider::TickPosition tick) -{ - m_tickPosition = tick; -} - -void CustomSlider::setTickInterval(int ti) -{ - DSlider::slider()->setTickInterval(ti); -} - -void CustomSlider::setSliderPosition(int Position) -{ - DSlider::slider()->setSliderPosition(Position); -} - -void CustomSlider::setAnnotations(const QStringList &annotations) -{ - switch (m_tickPosition) { - case QSlider::TicksLeft: - setLeftTicks(annotations); - break; - case QSlider::TicksRight: - setRightTicks(annotations); - break; - default: - break; - } -} - -void CustomSlider::setOrientation(Qt::Orientation orientation) -{ - Q_UNUSED(orientation) -} - -void CustomSlider::wheelEvent(QWheelEvent *e) -{ - e->ignore(); -} - -SliderContainer::SliderContainer(CustomSlider::SliderType type, QWidget *parent) - : QWidget (parent) - , m_slider(new CustomSlider(type, this)) - , m_titleLabel(new QLabel(this)) -{ - QVBoxLayout *mainlayout = new QVBoxLayout(this); - mainlayout->setContentsMargins(0, 0, 0, 0); - mainlayout->setSpacing(5); - mainlayout->addWidget(m_titleLabel); - mainlayout->addWidget(m_slider); -} - -SliderContainer::SliderContainer(Qt::Orientation orientation, QWidget *parent) - : QWidget(parent) - , m_slider(new CustomSlider(orientation, this)) - , m_titleLabel(new QLabel(this)) -{ - QVBoxLayout *mainlayout = new QVBoxLayout(this); - mainlayout->setContentsMargins(0, 1, 0, 0); - mainlayout->setSpacing(1); - - m_titleLabel->setFixedHeight(8); - mainlayout->addWidget(m_titleLabel); - mainlayout->addWidget(m_slider); -} - -SliderContainer::~SliderContainer() -{ -} - -void SliderContainer::setTitle(const QString &title) -{ - m_titleLabel->setText(title); -} - -CustomSlider *SliderContainer::slider() -{ - return m_slider; -} - -SliderProxy::SliderProxy(QStyle *style) - : QProxyStyle(style) -{ -} - -SliderProxy::~SliderProxy() -{ -} - -void SliderProxy::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const -{ - if (control != ComplexControl::CC_Slider) - return; - - // 绘制之前先保存之前的画笔 - painter->save(); - painter->setRenderHint(QPainter::RenderHint::Antialiasing); - // 获取滑动条和滑块的区域 - const QStyleOptionSlider *sliderOption = static_cast(option); - QRect rectGroove = subControlRect(CC_Slider, sliderOption, SC_SliderGroove, widget); - QRect rectHandle = subControlRect(CC_Slider, sliderOption, SC_SliderHandle, widget); - // 深色背景下,滑块和滑动条白色,浅色背景下,滑块和滑动条黑色 - QBrush brush(DGuiApplicationHelper::DarkType == DGuiApplicationHelper::instance()->themeType() ? Qt::white : Qt::black); - // 此处中绘制圆形滑动条,需要绘制圆角,圆角大小为其高度的一半 - QPainterPath pathGroove; - int radius = rectGroove.height() / 2; - pathGroove.addRoundedRect(rectGroove, radius, radius); - painter->fillPath(pathGroove, brush); - - // 绘制滑块,因为滑块是正圆形,而它本来的区域是一个长方形区域,因此,需要计算当前 - // 区域的正中心区域,将其作为一个正方形区域来绘制圆形滑块 - int handleSize = qMin(rectHandle.width(), rectHandle.height()); - int x = rectHandle.x() + (rectHandle.width() - handleSize) / 2; - int y = rectHandle.y() + (rectHandle.height() - handleSize) / 2; - rectHandle.setX(x); - rectHandle.setY(y); - rectHandle.setWidth(handleSize); - rectHandle.setHeight(handleSize); - - QPainterPath pathHandle; - pathHandle.addEllipse(rectHandle); - painter->fillPath(pathHandle, brush); - painter->restore(); -} diff --git a/frame/window/components/customslider.h b/frame/window/components/customslider.h deleted file mode 100644 index d4daba0f2..000000000 --- a/frame/window/components/customslider.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef CUSTOMCTRL_H -#define CUSTOMCTRL_H - -#include -#include -#include - -class QLabel; - -class CustomSlider : public DTK_WIDGET_NAMESPACE::DSlider -{ - Q_OBJECT - -public: - enum SliderType { - Normal, - Vernier, - Progress - }; - -public: - explicit CustomSlider(SliderType type = Normal, QWidget *parent = nullptr); - explicit CustomSlider(Qt::Orientation orientation, QWidget *parent = nullptr); - - inline CustomSlider *slider() const { return const_cast(this); } - QSlider *qtSlider(); - - void setType(SliderType type); - void setRange(int min, int max); - void setTickPosition(QSlider::TickPosition tick); - void setTickInterval(int ti); - void setSliderPosition(int Position); - void setAnnotations(const QStringList &annotations); - void setOrientation(Qt::Orientation orientation); - -protected: - void wheelEvent(QWheelEvent *e); - -private: - QSlider::TickPosition m_tickPosition = QSlider::TicksBelow; -}; - -class SliderContainer : public QWidget -{ - Q_OBJECT - -public: - explicit SliderContainer(CustomSlider::SliderType type = CustomSlider::Normal, QWidget *parent = nullptr); - explicit SliderContainer(Qt::Orientation orientation, QWidget *parent); - ~SliderContainer(); - void setTitle(const QString &title); - CustomSlider *slider(); - -private: - CustomSlider *m_slider; - QLabel *m_titleLabel; -}; - -class SliderProxy : public QProxyStyle -{ - Q_OBJECT - -public: - explicit SliderProxy(QStyle *style = nullptr); - ~SliderProxy() override; - -protected: - void drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const override; -}; - -#endif // VOLUMESLIDER_H diff --git a/frame/window/components/mediawidget.cpp b/frame/window/components/mediawidget.cpp index 934845166..3c7c18d70 100644 --- a/frame/window/components/mediawidget.cpp +++ b/frame/window/components/mediawidget.cpp @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "customslider.h" +#include "brightnessmodel.h" #include "mediawidget.h" #include diff --git a/frame/window/components/slidercontainer.cpp b/frame/window/components/slidercontainer.cpp new file mode 100644 index 000000000..a3a8e22d0 --- /dev/null +++ b/frame/window/components/slidercontainer.cpp @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#include "brightnessmodel.h" +#include "slidercontainer.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +// 用于绘制图标的窗体,此窗体不想让其在外部调用,因此,将其作为一个私有类 +class SliderIconWidget : public QWidget +{ +public: + explicit SliderIconWidget(QWidget *parent) + : QWidget(parent) + , m_iconSize(QSize(24, 24)) + , m_shadowSize(QSize()) + {} + + void updateData(const QIcon &icon, const QSize &iconSize, const QSize &shadowSize) + { + m_icon = icon; + m_iconSize = iconSize; + m_shadowSize = shadowSize; + update(); + } + + void updateIcon(const QIcon &icon) + { + m_icon = icon; + update(); + } + +protected: + void paintEvent(QPaintEvent *e) override; + +private: + QIcon m_icon; + QSize m_iconSize; + QSize m_shadowSize; +}; + +void SliderIconWidget::paintEvent(QPaintEvent *e) +{ + if (m_iconSize.isNull() || m_icon.isNull()) + return QWidget::paintEvent(e); + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + if (m_shadowSize.isValid() && !m_shadowSize.isNull() && !m_shadowSize.isEmpty()) { + // 绘制圆形背景 + painter.setPen(Qt::NoPen); + // 获取阴影部分背景颜色 + DPalette dpa = DPaletteHelper::instance()->palette(this); + painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); + int x = (rect().width() - m_shadowSize.width() ) / 2; + int y = (rect().height() - m_shadowSize.height() ) / 2; + painter.drawEllipse(QRect(x, y, m_shadowSize.width(), m_shadowSize.height())); + } + // 绘制图标 + QPixmap pixmap = m_icon.pixmap(m_iconSize); + int iconWidth = static_cast(m_iconSize.width() / qApp->devicePixelRatio()); + int iconHeight = static_cast(m_iconSize.height() / qApp->devicePixelRatio()); + int x = (rect().width() - iconWidth) / 2; + int y = (rect().height() - iconHeight) / 2; + painter.drawPixmap(x, y, iconWidth, iconHeight, pixmap); +} + +SliderContainer::SliderContainer(QWidget *parent) + : QWidget(parent) + , m_leftIconWidget(new SliderIconWidget(this)) + , m_slider(new QSlider(Qt::Orientation::Horizontal, this)) + , m_titleLabel(new QLabel(this)) + , m_rightIconWidget(new SliderIconWidget(this)) + , m_spaceLeftWidget(new QWidget(this)) + , m_spaceRightWidget(new QWidget(this)) +{ + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + + QHBoxLayout *sliderLayout = new QHBoxLayout(this); + sliderLayout->setContentsMargins(0, 0, 0, 0); + sliderLayout->setSpacing(0); + sliderLayout->addWidget(m_leftIconWidget); + sliderLayout->addWidget(m_spaceLeftWidget); + sliderLayout->addWidget(m_slider); + sliderLayout->addWidget(m_spaceRightWidget); + sliderLayout->addWidget(m_rightIconWidget); + + mainLayout->addWidget(m_titleLabel); + mainLayout->addLayout(sliderLayout); + + m_titleLabel->setVisible(false); + + m_leftIconWidget->installEventFilter(this); + m_slider->installEventFilter(this); + m_rightIconWidget->installEventFilter(this); +} + +SliderContainer::~SliderContainer() +{ +} + +void SliderContainer::setTitle(const QString &text) +{ + m_titleLabel->setText(text); + m_titleLabel->setVisible(!text.isEmpty()); +} + +QSize SliderContainer::getSuitableSize(const QSize &iconSize, const QSize &bgSize) +{ + if (bgSize.isValid() && !bgSize.isNull() && !bgSize.isEmpty()) + return bgSize; + + return iconSize; +} + +void SliderContainer::updateSlider(const SliderContainer::IconPosition &iconPosition, const SliderContainer::SliderData &sliderData) +{ + switch (iconPosition) { + case IconPosition::LeftIcon: { + m_leftIconWidget->setFixedSize(getSuitableSize(sliderData.iconSize, sliderData.shadowSize)); + m_leftIconWidget->updateData(sliderData.icon, sliderData.iconSize, sliderData.shadowSize); + m_spaceLeftWidget->setFixedWidth(sliderData.space); + break; + } + case IconPosition::RightIcon: { + m_rightIconWidget->setFixedSize(getSuitableSize(sliderData.iconSize, sliderData.shadowSize)); + m_rightIconWidget->updateData(sliderData.icon, sliderData.iconSize, sliderData.shadowSize); + m_spaceRightWidget->setFixedWidth(sliderData.space); + break; + } + } +} + +void SliderContainer::setIcon(const SliderContainer::IconPosition &iconPosition, const QIcon &icon) +{ + switch (iconPosition) { + case IconPosition::LeftIcon: { + m_leftIconWidget->updateIcon(icon); + break; + } + case IconPosition::RightIcon: { + m_rightIconWidget->updateIcon(icon); + break; + } + } +} + +QSlider *SliderContainer::slider() +{ + return m_slider; +} + +bool SliderContainer::eventFilter(QObject *watched, QEvent *event) +{ + if (event->type() == QEvent::MouseButtonRelease) { + if (watched == m_leftIconWidget) + Q_EMIT iconClicked(IconPosition::LeftIcon); + else if (watched == m_rightIconWidget) + Q_EMIT iconClicked(IconPosition::RightIcon); + } + + return QWidget::eventFilter(watched, event); +} + +SliderProxyStyle::SliderProxyStyle(StyleType drawSpecial, QStyle *style) + : QProxyStyle(style) + , m_drawSpecial(drawSpecial) +{ +} + +SliderProxyStyle::~SliderProxyStyle() +{ +} + +void SliderProxyStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const +{ + if (control != ComplexControl::CC_Slider) + return; + + // 绘制之前先保存之前的画笔 + painter->save(); + painter->setRenderHint(QPainter::RenderHint::Antialiasing); + // 获取滑动条和滑块的区域 + const QStyleOptionSlider *sliderOption = static_cast(option); + QRect rectGroove = subControlRect(CC_Slider, sliderOption, SC_SliderGroove, widget); + QRect rectHandle = subControlRect(CC_Slider, sliderOption, SC_SliderHandle, widget); + if (m_drawSpecial == RoundHandler) + drawRoundSlider(painter, rectGroove, rectHandle); + else + drawNormalSlider(painter, rectGroove, rectHandle, const_cast(widget)); + + painter->restore(); +} + +// 绘制通用的滑动条 +void SliderProxyStyle::drawNormalSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, QWidget *wigdet) const +{ + DPalette dpa = DPaletteHelper::instance()->palette(wigdet); + QPen penLine = QPen(dpa.color(DPalette::Highlight), 2); + // 绘制上下的竖线,一根竖线的宽度是2,+4个像素刚好保证中间也是间隔2个像素 + for (int i = rectGroove.x(); i < rectGroove.x() + rectGroove.width(); i = i + 4) { + if (i < rectHandle.x()) + painter->setPen(penLine); + else + painter->setPen(QPen(Qt::gray, 2)); + + painter->drawLine(i, rectGroove.y() + 2, i, rectGroove.y() + rectGroove.height() - 2); + } + // 绘制滚动区域 + painter->setBrush(dpa.color(DPalette::Highlight)); + painter->setPen(Qt::NoPen); + QPainterPath path; + path.addRoundedRect(rectHandle, 6, 6); + painter->drawPath(path); +} + +// 绘制设计师定义的那种圆形滑块,黑色的滑条 +void SliderProxyStyle::drawRoundSlider(QPainter *painter, QRect rectGroove, QRect rectHandle) const +{ + // 深色背景下,滑块和滑动条白色,浅色背景下,滑块和滑动条黑色 + QBrush brush(DGuiApplicationHelper::DarkType == DGuiApplicationHelper::instance()->themeType() ? Qt::white : Qt::black); + // 此处中绘制圆形滑动条,需要绘制圆角,圆角大小为其高度的一半 + QPainterPath pathGroove; + int radius = rectGroove.height() / 2; + pathGroove.addRoundedRect(rectGroove, radius, radius); + painter->fillPath(pathGroove, brush); + + // 绘制滑块,因为滑块是正圆形,而它本来的区域是一个长方形区域,因此,需要计算当前 + // 区域的正中心区域,将其作为一个正方形区域来绘制圆形滑块 + int handleSize = qMin(rectHandle.width(), rectHandle.height()); + int x = rectHandle.x() + (rectHandle.width() - handleSize) / 2; + int y = rectHandle.y() + (rectHandle.height() - handleSize) / 2; + rectHandle.setX(x); + rectHandle.setY(y); + rectHandle.setWidth(handleSize); + rectHandle.setHeight(handleSize); + + QPainterPath pathHandle; + pathHandle.addEllipse(rectHandle); + painter->fillPath(pathHandle, brush); +} diff --git a/frame/window/components/slidercontainer.h b/frame/window/components/slidercontainer.h new file mode 100644 index 000000000..805056ea2 --- /dev/null +++ b/frame/window/components/slidercontainer.h @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef SLIDERCONTAINER_H +#define SLIDERCONTAINER_H + +#include + +#include +#include + +class QLabel; +class SliderProxyStyle; +class SliderIconWidget; + +/** + * @brief 滚动条的类的封装,封装这个类的原因,是为了方便设置左右图标,dtk中的对应的DSlider类也有这个功能, + * 但是只能简单的设置左右图标,对于右边图标有阴影的,需要外部提供一个带阴影图标,但是如果由外部来提供, + * 通过QPixmap绘制的带阴影的图标无法消除锯齿(即使通过反走样也不行),因此在此处封装这个类 + */ +class SliderContainer : public QWidget +{ + Q_OBJECT + +public: + enum IconPosition { + LeftIcon = 0, + RightIcon + }; + + struct SliderData { + QSize iconSize; // 图标尺寸 + QSize shadowSize; // 阴影尺寸 + QIcon icon; // 图标 + int space; // 间距 + }; + +public: + explicit SliderContainer(QWidget *parent); + ~SliderContainer() override; + + void setTitle(const QString &text); + void updateSlider(const IconPosition &iconPosition, const SliderData &sliderData); + void setIcon(const IconPosition &iconPosition, const QIcon &icon); + QSlider *slider(); + +Q_SIGNALS: + void iconClicked(const IconPosition &); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + QSize getSuitableSize(const QSize &iconSize, const QSize &bgSize); + +private: + SliderIconWidget *m_leftIconWidget; + QSlider *m_slider; + QLabel *m_titleLabel; + SliderIconWidget *m_rightIconWidget; + QWidget *m_spaceLeftWidget; + QWidget *m_spaceRightWidget; +}; + +/** + * @brief 用来设置滚动条的样式 + * @param drawSpecial: true + */ +class SliderProxyStyle : public QProxyStyle +{ + Q_OBJECT + +public: + enum StyleType { + RoundHandler = 0, // 绘制那种黑色圆底滑动条 + Normal // 绘制那种通用的滑动条 + }; + +public: + explicit SliderProxyStyle(StyleType drawSpecial = RoundHandler, QStyle *style = nullptr); + ~SliderProxyStyle() override; + +protected: + void drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const override; + +private: + void drawNormalSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, QWidget *wigdet) const; + void drawRoundSlider(QPainter *painter, QRect rectGroove, QRect rectHandle) const; + +private: + StyleType m_drawSpecial; +}; + +#endif // VOLUMESLIDER_H diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp index f44a8fe20..efe2d614c 100644 --- a/frame/window/components/volumedeviceswidget.cpp +++ b/frame/window/components/volumedeviceswidget.cpp @@ -19,15 +19,19 @@ * along with this program. If not, see . */ #include "volumedeviceswidget.h" -#include "customslider.h" +#include "brightnessmodel.h" #include "volumemodel.h" #include "settingdelegate.h" +#include "imageutil.h" +#include "slidercontainer.h" #include #include #include #include #include +#include +#include #include #include @@ -43,7 +47,8 @@ DWIDGET_USE_NAMESPACE VolumeDevicesWidget::VolumeDevicesWidget(VolumeModel *model, QWidget *parent) : QWidget(parent) - , m_volumeSlider(new CustomSlider(CustomSlider::Normal, this)) + , m_sliderParent(new QWidget(this)) + , m_sliderContainer(new SliderContainer(m_sliderParent)) , m_descriptionLabel(new QLabel(tr("Output Device"), this)) , m_deviceList(new DListView(this)) , m_volumeModel(model) @@ -54,6 +59,7 @@ VolumeDevicesWidget::VolumeDevicesWidget(VolumeModel *model, QWidget *parent) initUi(); initConnection(); reloadAudioDevices(); + m_sliderParent->installEventFilter(this); QMetaObject::invokeMethod(this, [ this ] { resetVolumeInfo(); @@ -65,17 +71,49 @@ VolumeDevicesWidget::~VolumeDevicesWidget() { } +bool VolumeDevicesWidget::eventFilter(QObject *watcher, QEvent *event) +{ + if ((watcher == m_sliderParent) && (event->type() == QEvent::Paint)) { + QPainter painter(m_sliderParent); + painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿 + painter.setPen(Qt::NoPen); + + DPalette dpa = DPaletteHelper::instance()->palette(m_sliderParent); + painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); + painter.drawRoundedRect(m_sliderParent->rect(), 10, 10); + } + + return QWidget::eventFilter(watcher, event); +} + void VolumeDevicesWidget::initUi() { QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(6); - m_volumeSlider->setIconSize(QSize(36, 36)); - m_volumeSlider->setLeftIcon(QIcon(leftIcon())); - m_volumeSlider->setRightIcon(QIcon(rightIcon())); + m_sliderParent->setFixedHeight(36); - layout->addWidget(m_volumeSlider); + QHBoxLayout *sliderLayout = new QHBoxLayout(m_sliderParent); + sliderLayout->setContentsMargins(11, 0, 11, 0); + sliderLayout->setSpacing(0); + + QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(24, 24)); + m_sliderContainer->updateSlider(SliderContainer::IconPosition::LeftIcon, { leftPixmap.size(), QSize(), leftPixmap, 5 }); + QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(24, 24)); + m_sliderContainer->updateSlider(SliderContainer::IconPosition::RightIcon, { rightPixmap.size(), QSize(), rightPixmap, 7 }); + + SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); + proxy->setParent(m_sliderContainer->slider()); + m_sliderContainer->slider()->setStyle(proxy); + sliderLayout->addWidget(m_sliderContainer); + + QHBoxLayout *topLayout = new QHBoxLayout(this); + topLayout->setContentsMargins(10, 0, 10, 0); + topLayout->setSpacing(0); + topLayout->addWidget(m_sliderParent); + + layout->addLayout(topLayout); layout->addSpacing(4); layout->addWidget(m_descriptionLabel); @@ -119,9 +157,9 @@ void VolumeDevicesWidget::initConnection() { m_audioSink = m_volumeModel->defaultSink(); auto adjustVolumeSlider = [ this ](int volume) { - m_volumeSlider->blockSignals(true); - m_volumeSlider->setValue(volume); - m_volumeSlider->blockSignals(false); + m_sliderContainer->slider()->blockSignals(true); + m_sliderContainer->slider()->setValue(volume); + m_sliderContainer->slider()->blockSignals(false); }; if (m_audioSink) connect(m_audioSink, &AudioSink::volumeChanged, this, adjustVolumeSlider); @@ -137,7 +175,7 @@ void VolumeDevicesWidget::initConnection() m_deviceList->update(); }); - connect(m_volumeSlider, &CustomSlider::valueChanged, this, [ this ](int value) { + connect(m_sliderContainer->slider(), &QSlider::valueChanged, this, [ this ](int value) { AudioSink *defSink = m_volumeModel->defaultSink(); if (!defSink) return; @@ -210,7 +248,7 @@ void VolumeDevicesWidget::resizeHeight() { m_deviceList->adjustSize(); QMargins m = layout()->contentsMargins(); - int height = m.top() + m.bottom() + HEADERHEIGHT + m_volumeSlider->height() + ITEMSPACE + int height = m.top() + m.bottom() + HEADERHEIGHT + m_sliderContainer->height() + ITEMSPACE + m_descriptionLabel->height() + m_deviceList->height(); setFixedHeight(height); @@ -222,7 +260,7 @@ void VolumeDevicesWidget::resetVolumeInfo() if (!defaultSink) return; - m_volumeSlider->blockSignals(true); - m_volumeSlider->setValue(defaultSink->volume()); - m_volumeSlider->blockSignals(false); + m_sliderContainer->slider()->blockSignals(true); + m_sliderContainer->slider()->setValue(defaultSink->volume()); + m_sliderContainer->slider()->blockSignals(false); } diff --git a/frame/window/components/volumedeviceswidget.h b/frame/window/components/volumedeviceswidget.h index e85ae4fe1..f73b3c6f5 100644 --- a/frame/window/components/volumedeviceswidget.h +++ b/frame/window/components/volumedeviceswidget.h @@ -29,7 +29,7 @@ namespace Dtk { namespace Widget { class DListView; } } using namespace Dtk::Widget; -class CustomSlider; +class SliderContainer; class QStandardItemModel; class QLabel; class VolumeModel; @@ -45,6 +45,9 @@ public: explicit VolumeDevicesWidget(VolumeModel *model, QWidget *parent = nullptr); ~VolumeDevicesWidget() override; +protected: + bool eventFilter(QObject *watcher, QEvent *event) override; + private: void initUi(); void reloadAudioDevices(); @@ -58,7 +61,8 @@ private: void resetVolumeInfo(); private: - CustomSlider *m_volumeSlider; + QWidget *m_sliderParent; + SliderContainer *m_sliderContainer; QLabel *m_descriptionLabel; DListView *m_deviceList; VolumeModel *m_volumeModel; diff --git a/frame/window/components/volumewidget.cpp b/frame/window/components/volumewidget.cpp index 7ad92b581..18c3560b1 100644 --- a/frame/window/components/volumewidget.cpp +++ b/frame/window/components/volumewidget.cpp @@ -19,10 +19,11 @@ * along with this program. If not, see . */ #include "volumewidget.h" -#include "customslider.h" +#include "brightnessmodel.h" #include "imageutil.h" #include "volumemodel.h" #include "imageutil.h" +#include "slidercontainer.h" #include @@ -44,11 +45,11 @@ DGUI_USE_NAMESPACE #define ICON_SIZE 24 #define BACKSIZE 36 -VolumeWidget::VolumeWidget(QWidget *parent) +VolumeWidget::VolumeWidget(VolumeModel *model, QWidget *parent) : DBlurEffectWidget(parent) - , m_volumeController(new VolumeModel(this)) - , m_volumnCtrl(new CustomSlider(Qt::Horizontal, this)) - , m_defaultSink(m_volumeController->defaultSink()) + , m_model(model) + , m_sliderContainer(new SliderContainer(this)) + , m_defaultSink(m_model->defaultSink()) { initUi(); initConnection(); @@ -61,38 +62,36 @@ VolumeWidget::~VolumeWidget() void VolumeWidget::initUi() { if (m_defaultSink) - m_volumnCtrl->setValue(m_defaultSink->volume()); + m_sliderContainer->slider()->setValue(m_defaultSink->volume()); QHBoxLayout *mainLayout = new QHBoxLayout(this); - mainLayout->setContentsMargins(20, 0, 20, 0); - mainLayout->addWidget(m_volumnCtrl); + mainLayout->setContentsMargins(17, 0, 12, 0); + mainLayout->addWidget(m_sliderContainer); - const QString rightIconFile = rightIcon(); - QIcon rIcon = ImageUtil::getShadowPixmap(QPixmap(rightIconFile), Qt::lightGray, QSize(BACKSIZE, BACKSIZE)); + QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE)); + QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); + m_sliderContainer->updateSlider(SliderContainer::IconPosition::LeftIcon, { leftPixmap.size(), QSize(), leftPixmap, 12}); + m_sliderContainer->updateSlider(SliderContainer::IconPosition::RightIcon, { rightPixmap.size(), QSize(BACKSIZE, BACKSIZE), rightPixmap, 12}); - m_volumnCtrl->setIconSize(QSize(BACKSIZE, BACKSIZE)); - m_volumnCtrl->setLeftIcon(QIcon(QPixmap(leftIcon()))); - m_volumnCtrl->setRightIcon(rIcon); + SliderProxyStyle *proxy = new SliderProxyStyle; + proxy->setParent(m_sliderContainer->slider()); + m_sliderContainer->slider()->setStyle(proxy); - SliderProxy *proxy = new SliderProxy; - proxy->setParent(m_volumnCtrl->qtSlider()); - m_volumnCtrl->qtSlider()->setStyle(proxy); - - bool existActiveOutputDevice = m_volumeController->existActiveOutputDevice(); + bool existActiveOutputDevice = m_model->existActiveOutputDevice(); setEnabled(existActiveOutputDevice); } void VolumeWidget::initConnection() { auto setCtrlVolumeValue = [this](int volume) { - m_volumnCtrl->blockSignals(true); - m_volumnCtrl->setValue(volume); - m_volumnCtrl->blockSignals(false); + m_sliderContainer->blockSignals(true); + m_sliderContainer->slider()->setValue(volume); + m_sliderContainer->blockSignals(false); }; if (m_defaultSink) connect(m_defaultSink, &AudioSink::volumeChanged, this, setCtrlVolumeValue); - connect(m_volumeController, &VolumeModel::defaultSinkChanged, this, [ this, setCtrlVolumeValue ](AudioSink *sink) { + connect(m_model, &VolumeModel::defaultSinkChanged, this, [ this, setCtrlVolumeValue ](AudioSink *sink) { if (m_defaultSink) disconnect(m_defaultSink); @@ -103,24 +102,24 @@ void VolumeWidget::initConnection() } }); - connect(m_volumnCtrl, &DTK_WIDGET_NAMESPACE::DSlider::valueChanged, this, [ this ](int value) { - AudioSink *sink = m_volumeController->defaultSink(); + connect(m_sliderContainer->slider(), &QSlider::valueChanged, this, [ this ](int value) { + AudioSink *sink = m_model->defaultSink(); if (sink) sink->setVolume(value, true); }); - connect(m_volumeController, &VolumeModel::muteChanged, this, [ this ] { - m_volumnCtrl->setLeftIcon(QIcon(leftIcon())); + connect(m_model, &VolumeModel::muteChanged, this, [ this ] { + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, QIcon(leftIcon())); }); - connect(m_volumnCtrl, &CustomSlider::iconClicked, this, [ this ](DSlider::SliderIcons icon, bool) { + connect(m_sliderContainer, &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition icon) { switch (icon) { - case DSlider::SliderIcons::LeftIcon: { - if (m_volumeController->existActiveOutputDevice()) - m_volumeController->setMute(!m_volumeController->isMute()); + case SliderContainer::IconPosition::LeftIcon: { + if (m_model->existActiveOutputDevice()) + m_model->setMute(!m_model->isMute()); break; } - case DSlider::SliderIcons::RightIcon: { + case SliderContainer::IconPosition::RightIcon: { // 弹出音量选择对话框 Q_EMIT rightIconClick(); break; @@ -129,12 +128,6 @@ void VolumeWidget::initConnection() }); } - -VolumeModel *VolumeWidget::model() -{ - return m_volumeController; -} - void VolumeWidget::showEvent(QShowEvent *event) { DBlurEffectWidget::showEvent(event); @@ -149,8 +142,8 @@ void VolumeWidget::hideEvent(QHideEvent *event) const QString VolumeWidget::leftIcon() { - bool existActiveOutputDevice = m_volumeController->existActiveOutputDevice(); - const bool mute = existActiveOutputDevice ? m_volumeController->isMute() : true; + bool existActiveOutputDevice = m_model->existActiveOutputDevice(); + const bool mute = existActiveOutputDevice ? m_model->isMute() : true; if (mute) return QString(":/icons/resources/audio-volume-muted-dark"); diff --git a/frame/window/components/volumewidget.h b/frame/window/components/volumewidget.h index 379216efd..e20fe344c 100644 --- a/frame/window/components/volumewidget.h +++ b/frame/window/components/volumewidget.h @@ -26,7 +26,7 @@ class VolumeModel; class QDBusMessage; -class CustomSlider; +class SliderContainer; class QLabel; class AudioSink; @@ -37,9 +37,8 @@ class VolumeWidget : public DBlurEffectWidget Q_OBJECT public: - explicit VolumeWidget(QWidget *parent = nullptr); + explicit VolumeWidget(VolumeModel *model, QWidget *parent = nullptr); ~VolumeWidget() override; - VolumeModel *model(); Q_SIGNALS: void visibleChanged(bool); @@ -57,8 +56,8 @@ private: const QString rightIcon(); private: - VolumeModel *m_volumeController; - CustomSlider *m_volumnCtrl; + VolumeModel *m_model; + SliderContainer *m_sliderContainer; AudioSink *m_defaultSink; }; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index fcacc4ff6..195670313 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -19,16 +19,19 @@ * along with this program. If not, see . */ #include "quicksettingcontainer.h" +#include "brightnessmodel.h" #include "quicksettingcontroller.h" #include "pluginsiteminterface.h" #include "quicksettingitem.h" #include "mediawidget.h" #include "dockpopupwindow.h" #include "brightnesswidget.h" +#include "slidercontainer.h" #include "volumewidget.h" #include "volumedeviceswidget.h" #include "brightnessmonitorwidget.h" #include "pluginchildpage.h" +#include "volumemodel.h" #include #include @@ -60,10 +63,12 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_mainlayout(new QVBoxLayout(m_mainWidget)) , m_pluginLoader(QuickSettingController::instance()) , m_playerWidget(new MediaWidget(m_componentWidget)) - , m_volumnWidget(new VolumeWidget(m_componentWidget)) - , m_brihtnessWidget(new BrightnessWidget(m_componentWidget)) - , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumnWidget->model(), this)) - , m_brightSettingWidget(new BrightnessMonitorWidget(m_brihtnessWidget->model(), this)) + , m_volumeModel(new VolumeModel(this)) + , m_brightnessModel(new BrightnessModel(this)) + , m_volumnWidget(new VolumeWidget(m_volumeModel, m_componentWidget)) + , m_brihtnessWidget(new BrightnessWidget(m_brightnessModel, m_componentWidget)) + , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumeModel, this)) + , m_brightSettingWidget(new BrightnessMonitorWidget(m_brightnessModel, this)) , m_childPage(new PluginChildPage(this)) , m_dragPluginPosition(QPoint(0, 0)) { @@ -333,9 +338,12 @@ void QuickSettingContainer::initConnection() resizeView(); }); connect(m_brihtnessWidget, &BrightnessWidget::visibleChanged, this, [ this ] { resizeView(); }); - connect(m_brihtnessWidget, &BrightnessWidget::rightIconClicked, this, [ this ] { - showWidget(m_brightSettingWidget, tr("brightness")); - resizeView(); + connect(m_brihtnessWidget->sliderContainer(), &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &iconPosition) { + if (iconPosition == SliderContainer::RightIcon) { + // 点击右侧的按钮,弹出具体的调节的界面 + showWidget(m_brightSettingWidget, tr("brightness")); + resizeView(); + } }); connect(m_childPage, &PluginChildPage::back, this, [ this ] { m_switchLayout->setCurrentWidget(m_mainWidget); diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 070f66c49..4222933ea 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -33,6 +33,8 @@ class DockItem; class QVBoxLayout; class QuickSettingController; class MediaWidget; +class VolumeModel; +class BrightnessModel; class VolumeWidget; class BrightnessWidget; class QuickSettingItem; @@ -96,6 +98,8 @@ private: QVBoxLayout *m_mainlayout; QuickSettingController *m_pluginLoader; MediaWidget *m_playerWidget; + VolumeModel *m_volumeModel; + BrightnessModel *m_brightnessModel; VolumeWidget *m_volumnWidget; BrightnessWidget *m_brihtnessWidget; From 0a35f5b5e0e99f9f4d765c2795e380540c5ea733 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 15 Jun 2022 15:16:14 +0000 Subject: [PATCH 037/257] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=97=B6?= =?UTF-8?q?=E5=B0=9A=E6=A8=A1=E5=BC=8F=E4=B8=8B=E5=88=86=E5=89=B2=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=8C=BA=E5=9F=9F=E5=92=8C=E6=8F=92=E4=BB=B6=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原来调用的是dtk的setMaskPath方法,现换成Qt的setMask方法,实现更彻底 Log: Influence: 任务栏-时尚模式下查看左右区域的显示 Bug: https://pms.uniontech.com/bug-view-134527.html Change-Id: Ibd5e7db440ae359a59c73e77f5f08951f8571e7a --- frame/window/mainwindow.cpp | 11 +++++++++-- frame/window/mainwindow.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 15a94e7db..21453c119 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -259,7 +259,7 @@ void MainWindow::resizeEvent(QResizeEvent *event) // 任务栏大小、位置、模式改变都会触发resize,发射大小改变信号,供依赖项目更新位置 Q_EMIT panelGeometryChanged(); - setMaskPath(m_mainPanel->areaPath()); + updateMaskArea(); m_mainPanel->updatePluginsLayout(); m_shadowMaskOptimizeTimer->start(); @@ -367,6 +367,13 @@ void MainWindow::resizeDockIcon() m_mainPanel->resizeDockIcon(); } +void MainWindow::updateMaskArea() +{ + QPainterPath path = m_mainPanel->areaPath(); + QPolygon polgon = path.toFillPolygon().toPolygon(); + setMask(polgon); +} + /** * @brief MainWindow::adjustShadowMask 更新任务栏的圆角大小(时尚模式下才有圆角效果) */ @@ -393,7 +400,7 @@ void MainWindow::adjustShadowMask() m_platformWindowHandle.setWindowRadius(radius); m_mainPanel->updatePluginsLayout(); - setMaskPath(m_mainPanel->areaPath()); + updateMaskArea(); } void MainWindow::onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) diff --git a/frame/window/mainwindow.h b/frame/window/mainwindow.h index 7bd249c72..40e4d9a88 100644 --- a/frame/window/mainwindow.h +++ b/frame/window/mainwindow.h @@ -189,6 +189,7 @@ private: void initConnections(); void resizeDockIcon(); + void updateMaskArea(); signals: void panelGeometryChanged(); From 2ee2fe9ecaac133aebdd13e41907181c8bc0250c Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 20 Jun 2022 15:03:35 +0800 Subject: [PATCH 038/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=9B=BE=E6=A0=87=E6=95=B0=E9=87=8F=E8=BF=87?= =?UTF-8?q?=E5=A4=9A=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=E8=B6=85=E5=87=BA?= =?UTF-8?q?=E5=B1=8F=E5=B9=95=E5=8C=BA=E5=9F=9F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.计算当前任务栏的尺寸,和屏幕的尺寸取最小值,将这个最小值作为任务栏的实际尺寸 2.当任务栏插件区域行数发生变化的时候,通知任务栏调整尺寸,保证在任务栏调整位置的时候显示的尺寸始终是正确的 Log: Influence: 1、任务栏图标超过比较多的情况下,查看任务栏是否超出屏幕 2、任务栏从下调整到上方,查看插件区域是否显示异常 Bug: https://pms.uniontech.com/task-view-150049.html Change-Id: Ic3acd480c7f9deda7e8dfce8b7d7858c76a215e8 --- frame/util/multiscreenworker.cpp | 2 +- frame/window/mainpanelcontrol.cpp | 52 +++++++++++++++++------------ frame/window/mainpanelcontrol.h | 6 +++- frame/window/mainwindow.cpp | 2 +- frame/window/systempluginwindow.cpp | 4 +-- frame/window/systempluginwindow.h | 2 +- frame/window/traymanagerwindow.cpp | 22 +++++++----- frame/window/traymanagerwindow.h | 2 +- 8 files changed, 55 insertions(+), 37 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 526bf25d7..cce24dea7 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -935,7 +935,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, &MultiScreenWorker::onChildSizeChanged); + connect(parent()->panel(), &MainPanelControl::requestUpdate, this, &MultiScreenWorker::onChildSizeChanged); connect(m_launcherInter, static_cast(&DBusLuncher::VisibleChanged), this, [ = ](bool value) { setStates(LauncherDisplay, value); }); diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 68e72bd63..04c3d4415 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -96,6 +96,7 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_dockScreen(nullptr) { initUI(); + initConnection(); updateMainPanelLayout(); updateModeChange(); setAcceptDrops(true); @@ -153,20 +154,9 @@ 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); @@ -178,6 +168,11 @@ void MainPanelControl::initUI() m_mainPanelLayout->setAlignment(m_traySpliter, Qt::AlignCenter); } +void MainPanelControl::initConnection() +{ + connect(m_trayManagerWidget, &TrayManagerWindow::requestUpdate, this, &MainPanelControl::onRequestUpdate); +} + /** * @brief MainPanelControl::setDisplayMode 根据任务栏显示模式更新界面显示,如果是时尚模式,没有‘显示桌面'区域,否则就有 * @param dislayMode 任务栏显示模式 @@ -249,7 +244,7 @@ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg) wdg->setMaximumSize(width(),width()); } m_fixedAreaLayout->insertWidget(index, wdg); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); } /**往应用区域添加应用 @@ -265,7 +260,7 @@ void MainPanelControl::addAppAreaItem(int index, QWidget *wdg) wdg->setMaximumSize(width(),width()); } m_appAreaSonLayout->insertWidget(index, wdg); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); } /**往托盘插件区域添加应用 @@ -307,7 +302,7 @@ void MainPanelControl::addPluginAreaItem(int index, QWidget *wdg) void MainPanelControl::removeFixedAreaItem(QWidget *wdg) { m_fixedAreaLayout->removeWidget(wdg); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); } /**移除应用区域某一应用 @@ -317,7 +312,7 @@ void MainPanelControl::removeFixedAreaItem(QWidget *wdg) void MainPanelControl::removeAppAreaItem(QWidget *wdg) { m_appAreaSonLayout->removeWidget(wdg); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); } /**移除托盘插件区域某一应用 @@ -1054,19 +1049,24 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const return QSize(width(), static_cast((traySuitableSize.height() + 20) / ratio)); } - int yu = (totalLength % iconCount); + int redundantLength = (totalLength % iconCount); // icon宽度 = (总宽度-余数)/icon个数 - int iconSize = (totalLength - yu) / iconCount; + int iconSize = (totalLength - redundantLength) / iconCount; if (m_position == Position::Top || m_position == Position::Bottom) { iconSize = iconSize < height() ? iconSize : height(); - return QSize(iconSize * iconCount + static_cast((m_fixedSpliter->width() + traySuitableSize.width() + 20) / ratio), - static_cast(height() / ratio)); + int panelWidth = qMin(iconSize * iconCount + static_cast((m_fixedSpliter->width() + traySuitableSize.width() + 20) / ratio), + static_cast(screenSize / deviceRatio)); + + return QSize(panelWidth, static_cast(height() / ratio)); } iconSize = iconSize < width() ? iconSize : width(); - return QSize(width(), iconSize * iconCount + static_cast((m_fixedSpliter->height() + traySuitableSize.height() + 20) / ratio)); + int panelHeight = qMin(iconSize * iconCount + static_cast((m_fixedSpliter->height() + traySuitableSize.height() + 20) / ratio), + static_cast(screenSize / deviceRatio)); + + return QSize(width(), panelHeight); } void MainPanelControl::itemUpdated(DockItem *item) @@ -1128,8 +1128,9 @@ void MainPanelControl::resizeDockIcon() // 总宽度 if (m_dislayMode == DisplayMode::Fashion) { int totalLength = getScreenSize(); + QSize trayManagerSize = m_trayManagerWidget->suitableSize(); // 减去右侧托盘和插件区域的宽度 - totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? m_trayManagerWidget->width() : m_trayManagerWidget->height(); + totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? trayManagerSize.width() : trayManagerSize.height(); iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count(); @@ -1140,7 +1141,6 @@ void MainPanelControl::resizeDockIcon() 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)) { @@ -1344,6 +1344,14 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) } } +void MainPanelControl::onRequestUpdate() +{ + resizeDesktopWidget(); + // 在插件区域界面发生变化后(新增插件、删除插件、时间长度变化,新增托盘等),会触发当前的信号,此时当前类 + // 的尺寸还未变化,因此在此处发送requestUpdate信号,通知外面来调整任务栏右侧的大小,同时计算整个任务栏的大小 + Q_EMIT requestUpdate(); +} + /**时尚模式没有‘显示桌面’区域 * @brief MainPanelControl::resizeDesktopWidget */ diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 3e06cb6dc..a525ab008 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -64,10 +64,11 @@ public slots: signals: void itemMoved(DockItem *sourceItem, DockItem *targetItem); void itemAdded(const QString &appDesktop, int idx); - void sizeChanged(); + void requestUpdate(); private: void initUI(); + void initConnection(); void updateAppAreaSonWidgetSize(); void updateMainPanelLayout(); void updateDisplayMode(); @@ -95,6 +96,9 @@ private: bool appIsOnDock(const QString &appDesktop); void resetRadius(); +private Q_SLOTS: + void onRequestUpdate(); + protected: void dragMoveEvent(QDragMoveEvent *e) override; void dragEnterEvent(QDragEnterEvent *e) override; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 21453c119..9b2f764a3 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -317,7 +317,7 @@ void MainWindow::initConnections() connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); connect(&m_platformWindowHandle, &DPlatformWindowHandle::frameMarginsChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); connect(&m_platformWindowHandle, &DPlatformWindowHandle::windowRadiusChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); - connect(m_mainPanel, &MainPanelControl::sizeChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); + connect(m_mainPanel, &MainPanelControl::requestUpdate, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &MainWindow::onDbusNameOwnerChanged); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 1a368fcc1..3128375ba 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -116,7 +116,7 @@ void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem) pluginItem->setParent(this); pluginItem->show(); m_mainLayout->addWidget(pluginItem); - Q_EMIT sizeChanged(); + Q_EMIT itemChanged(); } void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem) @@ -127,7 +127,7 @@ void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem) pluginItem->setParent(nullptr); pluginItem->hide(); m_mainLayout->removeWidget(pluginItem); - Q_EMIT sizeChanged(); + Q_EMIT itemChanged(); } void SystemPluginWindow::onPluginItemUpdated(StretchPluginsItem *pluginItem) diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 15d814d36..184b1f46f 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -45,7 +45,7 @@ public: QSize suitableSize(); Q_SIGNALS: - void sizeChanged(); + void itemChanged(); private: void initUi(); diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index fa14c1d9c..74753e397 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -82,6 +82,8 @@ void TrayManagerWindow::updateLayout() if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) showSingle = (topLevelWidget()->height() <= CRITLCALHEIGHT); + QBoxLayout::Direction lastDirection = m_appDatetimeLayout->direction(); + if (showSingle) resetSingleDirection(); else @@ -90,6 +92,10 @@ void TrayManagerWindow::updateLayout() resetChildWidgetSize(); // 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示 Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); + + // 当插件区域从单行变成两行或者两行变成单行的时候,发送该信号,通知外部重新调整区域大小 + if (lastDirection != m_appDatetimeLayout->direction()) + Q_EMIT requestUpdate(); } void TrayManagerWindow::setPositon(Dock::Position position) @@ -237,11 +243,11 @@ void TrayManagerWindow::initConnection() // 在加载界面的时候,会出现快捷设置区域的图标和左侧的托盘图标挤在一起(具体原因未知),此时需要延时50毫秒重新刷新界面来保证界面布局正常(临时解决方案) QTimer::singleShot(50, this, [ this ] { resetChildWidgetSize(); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); }); } else { resetChildWidgetSize(); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); } }); connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, [ this ] { @@ -252,10 +258,10 @@ void TrayManagerWindow::initConnection() else m_quickIconWidget->setFixedHeight(m_quickIconWidget->suitableSize().height()); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); }); - connect(m_systemPluginWidget, &SystemPluginWindow::sizeChanged, this, [ this ] { + connect(m_systemPluginWidget, &SystemPluginWindow::itemChanged, this, [ this ] { // 当系统插件发生变化的时候,同样需要调整尺寸 m_systemPluginWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) @@ -263,13 +269,13 @@ void TrayManagerWindow::initConnection() else m_systemPluginWidget->setFixedHeight(m_systemPluginWidget->suitableSize().height()); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); }); connect(m_delegate, &TrayDelegate::visibleChanged, this, [ this ](const QModelIndex &index, bool visible) { m_trayView->setRowHidden(index.row(), !visible); resetChildWidgetSize(); - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); }); connect(m_trayView, &TrayGridView::dragLeaved, m_delegate, [ this ]{ @@ -288,12 +294,12 @@ void TrayManagerWindow::initConnection() } } }); - connect(m_dateTimeWidget, &DateTimeDisplayer::sizeChanged, this, &TrayManagerWindow::sizeChanged); + connect(m_dateTimeWidget, &DateTimeDisplayer::sizeChanged, this, &TrayManagerWindow::requestUpdate); m_trayView->installEventFilter(this); m_quickIconWidget->installEventFilter(this); installEventFilter(this); - QMetaObject::invokeMethod(this, &TrayManagerWindow::sizeChanged, Qt::QueuedConnection); + QMetaObject::invokeMethod(this, &TrayManagerWindow::requestUpdate, Qt::QueuedConnection); } void TrayManagerWindow::resetChildWidgetSize() diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 554acd4f7..20650a3ed 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -57,7 +57,7 @@ public: QSize suitableSize(); Q_SIGNALS: - void sizeChanged(); + void requestUpdate(); protected: void resizeEvent(QResizeEvent *event) override; From a9987a6c2acfc25b69456071695071577420b629 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 17 Jun 2022 10:54:29 +0800 Subject: [PATCH 039/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=B6?= =?UTF-8?q?=E5=B0=9A=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=97=A0=E6=B3=95=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E7=94=B5=E6=BA=90=E6=8F=92=E4=BB=B6=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:在判断该插件是否可移除之前已经将内存中该插件的数据清除,找不到该插件的信息导致无法移除 修改方案:在判断该插件是否可移除之前不清空该插件的内存,等确定该插件可移除后再清空内存,保证插件获取到的数据始终正确 Log: 修复时尚模式下无法移除电源插件的问题 Influence: 任务栏时尚模式下,打开控制中心-个性化-任务栏-插件区域,去掉电源勾选,查看电源按钮是否消失 Task: https://pms.uniontech.com/task-view-121387.html Change-Id: I0a9f214dab64e6b81b71d8cf50a969979c69c1ac --- frame/controller/dockpluginscontroller.cpp | 5 +++++ frame/controller/dockpluginscontroller.h | 4 +--- frame/controller/proxyplugincontroller.cpp | 17 +++++++++++------ frame/controller/proxyplugincontroller.h | 2 +- frame/util/abstractpluginscontroller.cpp | 2 +- frame/util/abstractpluginscontroller.h | 8 ++++---- frame/window/systempluginwindow.cpp | 18 ++++++++++++++++-- frame/window/systempluginwindow.h | 1 + 8 files changed, 40 insertions(+), 17 deletions(-) diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index 623e7a34e..115964a7f 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -144,3 +144,8 @@ void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const item->hidePopup(); } } + +QMap> &DockPluginsController::pluginsMap() +{ + return ProxyPluginController::instance(PluginType::FixedSystemPlugin)->pluginsMap(); +} diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index 7c740ab4b..6b7e26705 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -38,9 +38,6 @@ class DockPluginsController : public AbstractPluginsController { Q_OBJECT - friend class DockItemController; - friend class DockItemManager; - public: explicit DockPluginsController(QObject *parent = nullptr); ~DockPluginsController() override; @@ -52,6 +49,7 @@ public: void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; + QMap> &pluginsMap(); signals: void pluginItemInserted(PluginsItem *pluginItem) const; diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index d2b1e4cc8..925be4c8c 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -152,13 +152,9 @@ void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, c void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) { - if (m_pluginsItems.contains(itemInter)) - m_pluginsItems.removeOne(itemInter); - - if (m_pluginsItemKeys.contains(itemInter)) - m_pluginsItemKeys.remove(itemInter); - + // 先获取可执行的controller,再移除,因为在判断当前插件是否加载的时候需要用到当前容器中的插件来获取当前代理 QList validController = getValidController(itemInter); + removePluginItem(itemInter); for (AbstractPluginsController *interface : validController) interface->itemRemoved(itemInter, itemKey); } @@ -214,6 +210,15 @@ QList ProxyPluginController::getValidController(Plu return validController; } +void ProxyPluginController::removePluginItem(PluginsItemInterface * const itemInter) +{ + if (m_pluginsItems.contains(itemInter)) + m_pluginsItems.removeOne(itemInter); + + if (m_pluginsItemKeys.contains(itemInter)) + m_pluginsItemKeys.remove(itemInter); +} + void ProxyPluginController::startLoader() { QDir dir; diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index bb928e861..f84f0ddfa 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -67,7 +67,7 @@ protected: private: QList getValidController(PluginsItemInterface *itemInter) const; - // 该方法可以由DockPluginsController类类调用,强制加载,因此,在此处给这个类加载了一个友元 + void removePluginItem(PluginsItemInterface * const itemInter); void startLoader(); private: diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index c406a2c4d..3d42bce2b 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -125,7 +125,7 @@ void AbstractPluginsController::removeValue(PluginsItemInterface *const itemInte m_dockDaemonInter->RemovePluginSettings(itemInter->pluginName(), keyList); } -QMap > &AbstractPluginsController::pluginsMap() +QMap> &AbstractPluginsController::pluginsMap() { return m_pluginsMap; } diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index f98e183ce..f58e5a69e 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -51,19 +51,19 @@ public: void itemAdded(PluginsItemInterface * const, const QString &) override {} void itemUpdate(PluginsItemInterface * const, const QString &) override {} void itemRemoved(PluginsItemInterface * const, const QString &) override {} - void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override {} - void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override {} - void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override {} + void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} + void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} + void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {} virtual bool needLoad(PluginsItemInterface *) { return true; } + QMap> &pluginsMap(); signals: void pluginLoaderFinished(); protected: - QMap> &pluginsMap(); QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; PluginsItemInterface *pluginInterAt(const QString &itemKey); PluginsItemInterface *pluginInterAt(QObject *destItem); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 3128375ba..fed159c50 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -107,9 +107,23 @@ void SystemPluginWindow::initUi() m_mainLayout->setSpacing(0); } +bool SystemPluginWindow::pluginExist(StretchPluginsItem *pluginItem) +{ + for (int i = 0; i < m_mainLayout->count(); i++) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + if (layoutItem->widget() == pluginItem) + return true; + } + + return false; +} + void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem) { - if (m_mainLayout->children().contains(pluginItem)) + if (pluginExist(pluginItem)) return; pluginItem->setPosition(m_position); @@ -121,7 +135,7 @@ void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem) void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem) { - if (!m_mainLayout->children().contains(pluginItem)) + if (!pluginExist(pluginItem)) return; pluginItem->setParent(nullptr); diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 184b1f46f..1c260e5f7 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -49,6 +49,7 @@ Q_SIGNALS: private: void initUi(); + bool pluginExist(StretchPluginsItem *pluginItem); private Q_SLOTS: void onPluginItemAdded(StretchPluginsItem *pluginItem); From 7b31b5e107088c2ac86c60e67807ab2252017da3 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 17 Jun 2022 10:09:12 +0800 Subject: [PATCH 040/257] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=98=B2?= =?UTF-8?q?=E5=91=86=E5=8C=BA=E5=9F=9F=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修复多屏情况下屏幕位置计算错误导致任务栏无法鼠标跟随 2、纠正多屏情况下的防呆区域 Log: 修复防呆区域错误 Influence: 1、任务栏为跟随鼠标,在多屏情况下检测任务栏是否跟随鼠标 2、将窗口拖动到任务栏下方,观察是否可以拖动,正常情况下是无法拖动到下方 Bug: https://pms.uniontech.com/bug-view-134075.html Change-Id: I16b3e24eac5acfca781f7f466b9ebc894153634a --- frame/util/multiscreenworker.cpp | 69 +++++++++++++++++--------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index cce24dea7..b6c02a185 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -763,7 +763,10 @@ void MultiScreenWorker::onRequestNotifyWindowManager() qDebug() << "screen width:" << DIS_INS->screenRawWidth() << ", height:" << DIS_INS->screenRawHeight(); QScreen *curentScreen = DIS_INS->screen(m_ds.current()); - Q_ASSERT(curentScreen); + // 在把显示器都拔掉后,此时获取到的当前屏幕为空,无需继续处理 + if (!curentScreen) + return; + const qreal &ratio = qApp->devicePixelRatio(); if (Utils::IS_WAYLAND_DISPLAY) { QList varList = {0, 0, 0, 0}; @@ -771,26 +774,26 @@ void MultiScreenWorker::onRequestNotifyWindowManager() case Position::Top: varList[0] = 1; varList[1] = dockGeometry.y() + dockGeometry.height() + WINDOWMARGIN * ratio; - varList[2] = 0; - varList[3] = curentScreen->availableSize().width(); + varList[2] = curentScreen->geometry().x(); + varList[3] = curentScreen->geometry().x() + curentScreen->size().width(); break; case Position::Bottom: varList[0] = 3; varList[1] = DIS_INS->screenRawHeight() - dockGeometry.y() + WINDOWMARGIN * ratio; - varList[2] = 0; - varList[3] = curentScreen->availableSize().width(); + varList[2] = curentScreen->geometry().x(); + varList[3] = curentScreen->geometry().x() + curentScreen->size().width(); break; case Position::Left: varList[0] = 0; varList[1] = dockGeometry.x() + dockGeometry.width() + WINDOWMARGIN * ratio; - varList[2] = 0; - varList[3] = curentScreen->availableSize().height(); + varList[2] = curentScreen->geometry().y(); + varList[3] = curentScreen->geometry().y() + curentScreen->size().height(); break; case Position::Right: varList[0] = 2; varList[1] = DIS_INS->screenRawWidth() - dockGeometry.x() + WINDOWMARGIN * ratio; - varList[2] = 0; - varList[3] = curentScreen->availableSize().height(); + varList[2] = dockGeometry.y(); + varList[3] = curentScreen->geometry().y() + curentScreen->size().height(); break; } @@ -807,26 +810,26 @@ void MultiScreenWorker::onRequestNotifyWindowManager() case Position::Top: orientation = XcbMisc::OrientationTop; strut = dockGeometry.y() + dockGeometry.height(); - strutStart = 0; - strutEnd = curentScreen->availableSize().width(); + strutStart = curentScreen->geometry().x(); + strutEnd = curentScreen->geometry().x() + curentScreen->size().width(); break; case Position::Bottom: orientation = XcbMisc::OrientationBottom; strut = DIS_INS->screenRawHeight() - dockGeometry.y(); - strutStart = 0; - strutEnd = curentScreen->availableSize().width(); + strutStart = curentScreen->geometry().x(); + strutEnd = curentScreen->geometry().x() + curentScreen->size().width(); break; case Position::Left: orientation = XcbMisc::OrientationLeft; strut = dockGeometry.x() + dockGeometry.width(); - strutStart = 0; - strutEnd = curentScreen->availableSize().height(); + strutStart = curentScreen->geometry().y(); + strutEnd = curentScreen->geometry().y() + curentScreen->size().height(); break; case Position::Right: orientation = XcbMisc::OrientationRight; strut = DIS_INS->screenRawWidth() - dockGeometry.x(); - strutStart = 0; - strutEnd = curentScreen->availableSize().height(); + strutStart = curentScreen->geometry().y(); + strutEnd = curentScreen->geometry().y() + curentScreen->size().height(); break; } @@ -1538,8 +1541,8 @@ QRect MultiScreenWorker::getDockShowGeometry(const QString &screenName, const Po switch (pos) { case Position::Top: { QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); - rect.setX((static_cast(screenRect.width() / ratio) - panelSize.width()) / 2); - rect.setY(static_cast((screenRect.y() + margin) / ratio)); + rect.setX(screenRect.x() + (static_cast(screenRect.width() / ratio) - panelSize.width()) / 2); + rect.setY(screenRect.y() + static_cast(margin / ratio)); rect.setWidth(panelSize.width()); rect.setHeight(dockSize); } @@ -1547,24 +1550,24 @@ QRect MultiScreenWorker::getDockShowGeometry(const QString &screenName, const Po case Position::Bottom: { // 先用设置屏幕尺寸,理论上不应该在此处设置,因为这是在一个get方法里面,后续改成直接获取,在其他地方设置 QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); - rect.setX((static_cast(screenRect.width() / ratio) - panelSize.width()) / 2); - rect.setY(static_cast(screenRect.y() + screenRect.height() / ratio - margin - dockSize)); + rect.setX(screenRect.x() + (static_cast(screenRect.width() / ratio) - panelSize.width()) / 2); + rect.setY(screenRect.y() + static_cast(screenRect.height() / ratio - margin - dockSize)); rect.setWidth(panelSize.width()); rect.setHeight(dockSize); } break; case Position::Left: { QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); - rect.setX(static_cast(screenRect.x() + margin)); - rect.setY((static_cast(screenRect.height() / ratio) - panelSize.height()) / 2); + rect.setX(screenRect.x() + margin); + rect.setY((screenRect.y() + static_cast(screenRect.height() / ratio) - panelSize.height()) / 2); rect.setWidth(dockSize); rect.setHeight(panelSize.height()); } break; case Position::Right: { QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); - rect.setX(static_cast(screenRect.x() + screenRect.width() / ratio - margin - dockSize)); - rect.setY((static_cast(screenRect.height() / ratio) - panelSize.height()) / 2); + rect.setX(screenRect.x() + static_cast(screenRect.width() / ratio - margin - dockSize)); + rect.setY((screenRect.y() + static_cast(screenRect.height() / ratio) - panelSize.height()) / 2); rect.setWidth(dockSize); rect.setHeight(panelSize.height()); } @@ -1598,32 +1601,32 @@ QRect MultiScreenWorker::getDockHideGeometry(const QString &screenName, const Po switch (pos) { case Position::Top: { QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); - rect.setX(static_cast((screenRect.width() / ratio - panelSize.width()) / 2)); - rect.setY(static_cast(screenRect.y() + margin)); + rect.setX(screenRect.x() + static_cast((screenRect.width() / ratio - panelSize.width()) / 2)); + rect.setY(screenRect.y() + margin); rect.setWidth(panelSize.width()); rect.setHeight(0); } break; case Position::Bottom: { QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); - rect.setX(static_cast((screenRect.width() / ratio - panelSize.width()) / 2)); - rect.setY(static_cast(screenRect.y() + screenRect.height() / ratio - margin)); + rect.setX(screenRect.x() + static_cast((screenRect.width() / ratio - panelSize.width()) / 2)); + rect.setY(screenRect.y() + static_cast(screenRect.height() / ratio - margin)); rect.setWidth(panelSize.width()); rect.setHeight(0); } break; case Position::Left: { QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); - rect.setX(static_cast(screenRect.x() + margin)); - rect.setY(static_cast(static_cast((screenRect.height() / ratio - panelSize.height()) / 2))); + rect.setX(screenRect.x() + margin); + rect.setY(screenRect.y() + static_cast(static_cast((screenRect.height() / ratio - panelSize.height()) / 2))); rect.setWidth(0); rect.setHeight(panelSize.height()); } break; case Position::Right: QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); - rect.setX(static_cast(screenRect.x() + screenRect.width() / ratio - margin)); - rect.setY(static_cast(static_cast((screenRect.height() / ratio - panelSize.height()) / 2))); + rect.setX(screenRect.x() + static_cast(screenRect.width() / ratio - margin)); + rect.setY(screenRect.y() + static_cast(static_cast((screenRect.height() / ratio - panelSize.height()) / 2))); rect.setWidth(0); rect.setHeight(panelSize.height()); break; From 241dd68d3034708a726d79932b8bfc630a7cefe6 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 22 Jun 2022 10:06:16 +0800 Subject: [PATCH 041/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E7=9A=84AM=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加任务栏的AM接口的访问模块 Log: Influence: 任务栏 Task: https://pms.uniontech.com/task-view-133075.html Change-Id: Ic5570bbae6fa4ff3ecc3d529b49200f7bcb1d63c --- debian/rules | 3 +- frame/dbus/dockinterface.cpp | 378 ++++++++++++++++++++++++++++++++++ frame/dbus/dockinterface.h | 342 ++++++++++++++++++++++++++++++ frame/dbus/entryinterface.cpp | 290 ++++++++++++++++++++++++++ frame/dbus/entryinterface.h | 275 +++++++++++++++++++++++++ frame/util/dbusutil.h | 58 ++++++ plugins/tray/CMakeLists.txt | 1 + 7 files changed, 1346 insertions(+), 1 deletion(-) create mode 100644 frame/dbus/dockinterface.cpp create mode 100644 frame/dbus/dockinterface.h create mode 100644 frame/dbus/entryinterface.cpp create mode 100644 frame/dbus/entryinterface.h create mode 100644 frame/util/dbusutil.h diff --git a/debian/rules b/debian/rules index 9fbc0fdc0..a23c49052 100755 --- a/debian/rules +++ b/debian/rules @@ -12,4 +12,5 @@ DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) override_dh_auto_configure: dh_auto_configure -- \ - -DHOST_MULTIARCH="$(DEB_HOST_MULTIARCH)" + -DHOST_MULTIARCH="$(DEB_HOST_MULTIARCH)" \ + -DUSE_AM=YES diff --git a/frame/dbus/dockinterface.cpp b/frame/dbus/dockinterface.cpp new file mode 100644 index 000000000..d02b6fe9c --- /dev/null +++ b/frame/dbus/dockinterface.cpp @@ -0,0 +1,378 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#include "dockinterface.h" + +#ifdef USE_AM +// 因为 types/dockrect.h 文件中定义了DockRect类,而在此处也定义了DockRect, +// 所以在此处先加上DOCKRECT_H宏(types/dockrect.h文件中定义的宏)来禁止包含types/dockrect.h头文件 +// 否则会出现重复定义的错误 +#define DOCKRECT_H +#include + +DockRect::DockRect() + : x(0) + , y(0) + , w(0) + , h(0) +{ +} + +QDebug operator<<(QDebug debug, const DockRect &rect) +{ + debug << QString("DockRect(%1, %2, %3, %4)").arg(rect.x) + .arg(rect.y) + .arg(rect.w) + .arg(rect.h); + + return debug; +} + +DockRect::operator QRect() const +{ + return QRect(x, y, w, h); +} + +QDBusArgument &operator<<(QDBusArgument &arg, const DockRect &rect) +{ + arg.beginStructure(); + arg << rect.x << rect.y << rect.w << rect.h; + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, DockRect &rect) +{ + arg.beginStructure(); + arg >> rect.x >> rect.y >> rect.w >> rect.h; + arg.endStructure(); + + return arg; +} + +void registerDockRectMetaType() +{ + qRegisterMetaType("DockRect"); + qDBusRegisterMetaType(); +} + +/* + * Implementation of interface class __Dock + */ + +class DockPrivate +{ +public: + DockPrivate() = default; + + // begin member variables + int DisplayMode; + QStringList DockedApps; + QList Entries; + DockRect FrontendWindowRect; + int HideMode; + int HideState; + uint HideTimeout; + uint IconSize; + double Opacity; + int Position; + uint ShowTimeout; + uint WindowSize; + uint WindowSizeEfficient; + uint WindowSizeFashion; + +public: + QMap m_processingCalls; + QMap> m_waittingCalls; +}; + +// 窗管中提供的ActiveWindow接口,MinimizeWindow目前还在开发过程中,因此,关于这两个接口暂时使用v23的后端接口 +// 等窗管完成了这几个接口后,删除此处v20的接口,改成v23提供的新接口即可 +using DockInter = com::deepin::dde::daemon::Dock; +/** + * @brief 任务栏的部分DBUS接口是通过窗管获取的,由于AM后端并未提供窗管的相关接口,因此, + * 此处先将窗管的接口集成进来,作为私有类,只提供任务栏接口使用 + */ +class WM : public QDBusAbstractInterface +{ +public: + static inline const char *staticInterfaceName() + { return "com.deepin.wm"; } + +public: + explicit WM(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = Q_NULLPTR); + ~WM(); + +public Q_SLOTS: // METHODS + + inline QDBusPendingReply<> ActivateWindow(uint in0) + { + return m_dockInter->ActivateWindow(in0); + } + + QDBusPendingReply<> MinimizeWindow(uint in0) + { + return m_dockInter->MinimizeWindow(in0); + } + + inline QDBusPendingReply<> CancelPreviewWindow() + { + return asyncCallWithArgumentList(QStringLiteral("CancelPreviewWindow"), QList()); + } + + inline QDBusPendingReply<> PreviewWindow(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("CancelPreviewWindow"), argumentList); + } + +private: + DockInter *m_dockInter; +}; + +WM::WM(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) + , m_dockInter(new DockInter("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) +{ +} + +WM::~WM() +{ +} + +Dde_Dock::Dde_Dock(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) + , d_ptr(new DockPrivate) + , m_wm(new WM("com.deepin.wm", "/com/deepin/wm", QDBusConnection::sessionBus(), this)) +{ + QDBusConnection::sessionBus().connect(this->service(), this->path(), + "org.freedesktop.DBus.Properties", + "PropertiesChanged","sa{sv}as", + this, + SLOT(onPropertyChanged(const QDBusMessage &))); + + if (QMetaType::type("DockRect") == QMetaType::UnknownType) + registerDockRectMetaType(); +} + +Dde_Dock::~Dde_Dock() +{ + qDeleteAll(d_ptr->m_processingCalls.values()); + delete d_ptr; +} + +void Dde_Dock::onPropertyChanged(const QDBusMessage& msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != staticInterfaceName()) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + QStringList keys = changedProps.keys(); + foreach(const QString &prop, keys) { + const QMetaObject* self = metaObject(); + for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) { + QMetaProperty p = self->property(i); + if (p.name() == prop) + Q_EMIT p.notifySignal().invoke(this); + } + } +} + +int Dde_Dock::displayMode() +{ + return qvariant_cast(property("DisplayMode")); +} + +void Dde_Dock::setDisplayMode(int value) +{ + setProperty("DisplayMode", QVariant::fromValue(value)); +} + +QStringList Dde_Dock::dockedApps() +{ + return qvariant_cast(property("DockedApps")); +} + +QList Dde_Dock::entries() +{ + return qvariant_cast>(property("Entries")); +} + +DockRect Dde_Dock::frontendWindowRect() +{ + return qvariant_cast(property("FrontendWindowRect")); +} + +int Dde_Dock::hideMode() +{ + return qvariant_cast(property("HideMode")); +} + +void Dde_Dock::setHideMode(int value) +{ + internalPropSet("HideMode", QVariant::fromValue(value)); +} + +int Dde_Dock::hideState() +{ + return qvariant_cast(property("HideState")); +} + +uint Dde_Dock::hideTimeout() +{ + return qvariant_cast(property("HideTimeout")); +} + +void Dde_Dock::setHideTimeout(uint value) +{ + setProperty("HideTimeout", QVariant::fromValue(value)); +} + +uint Dde_Dock::iconSize() +{ + return qvariant_cast(property("IconSize")); +} + +void Dde_Dock::setIconSize(uint value) +{ + setProperty("IconSize", QVariant::fromValue(value)); +} + +double Dde_Dock::opacity() +{ + return qvariant_cast(property("Opacity")); +} + +void Dde_Dock::setOpacity(double value) +{ + setProperty("Opacity", QVariant::fromValue(value)); +} + +int Dde_Dock::position() +{ + return qvariant_cast(property("Position")); +} + +void Dde_Dock::setPosition(int value) +{ + setProperty("Position", QVariant::fromValue(value)); +} + +uint Dde_Dock::showTimeout() +{ + return qvariant_cast(property("ShowTimeout")); +} + +void Dde_Dock::setShowTimeout(uint value) +{ + setProperty("ShowTimeout", QVariant::fromValue(value)); +} + +uint Dde_Dock::windowSize() +{ + return qvariant_cast(property("WindowSize")); +} + +void Dde_Dock::setWindowSize(uint value) +{ + setProperty("WindowSize", QVariant::fromValue(value)); +} + +uint Dde_Dock::windowSizeEfficient() +{ + return qvariant_cast(property("WindowSizeEfficient")); +} + +void Dde_Dock::setWindowSizeEfficient(uint value) +{ + setProperty("WindowSizeEfficient", QVariant::fromValue(value)); +} + +uint Dde_Dock::windowSizeFashion() +{ + return qvariant_cast(property("WindowSizeFashion")); +} + +void Dde_Dock::setWindowSizeFashion(uint value) +{ + setProperty("WindowSizeFashion", QVariant::fromValue(value)); +} + +QDBusPendingReply<> Dde_Dock::ActivateWindow(uint in0) +{ + return m_wm->ActivateWindow(in0); +} + +QDBusPendingReply<> Dde_Dock::PreviewWindow(uint in0) +{ + return m_wm->PreviewWindow(in0); +} + +QDBusPendingReply<> Dde_Dock::CancelPreviewWindow() +{ + return m_wm->CancelPreviewWindow(); +} + +QDBusPendingReply<> Dde_Dock::MinimizeWindow(uint in0) +{ + return m_wm->MinimizeWindow(in0); +} + +void Dde_Dock::CallQueued(const QString &callName, const QList &args) +{ + if (d_ptr->m_waittingCalls.contains(callName)) { + d_ptr->m_waittingCalls[callName] = args; + return; + } + + if (d_ptr->m_processingCalls.contains(callName)) { + d_ptr->m_waittingCalls.insert(callName, args); + } else { + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(asyncCallWithArgumentList(callName, args)); + connect(watcher, &QDBusPendingCallWatcher::finished, this, &Dde_Dock::onPendingCallFinished); + d_ptr->m_processingCalls.insert(callName, watcher); + } +} + +void Dde_Dock::onPendingCallFinished(QDBusPendingCallWatcher *w) +{ + w->deleteLater(); + const auto callName = d_ptr->m_processingCalls.key(w); + Q_ASSERT(!callName.isEmpty()); + if (callName.isEmpty()) + return; + + d_ptr->m_processingCalls.remove(callName); + if (!d_ptr->m_waittingCalls.contains(callName)) + return; + + const auto args = d_ptr->m_waittingCalls.take(callName); + CallQueued(callName, args); +} + +#endif diff --git a/frame/dbus/dockinterface.h b/frame/dbus/dockinterface.h new file mode 100644 index 000000000..1734bea2c --- /dev/null +++ b/frame/dbus/dockinterface.h @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef DOCK_INTERFACE +#define DOCK_INTERFACE + +#ifdef USE_AM + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface com.deepin.dde.daemon.Dock + */ +class DockPrivate; +class WM; + +struct DockRect +{ +public: + DockRect(); + operator QRect() const; + + friend QDebug operator<<(QDebug debug, const DockRect &rect); + friend const QDBusArgument &operator>>(const QDBusArgument &arg, DockRect &rect); + friend QDBusArgument &operator<<(QDBusArgument &arg, const DockRect &rect); + +private: + int x; + int y; + uint w; + uint h; +}; + +Q_DECLARE_METATYPE(DockRect) + +void registerDockRectMetaType(); + +class Dde_Dock : public QDBusAbstractInterface +{ + Q_OBJECT + +public: + static inline const char *staticInterfaceName() + { return "org.deepin.dde.daemon.Dock1"; } + +public: + explicit Dde_Dock(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~Dde_Dock(); + + Q_PROPERTY(int DisplayMode READ displayMode WRITE setDisplayMode NOTIFY DisplayModeChanged) + int displayMode(); + void setDisplayMode(int value); + + Q_PROPERTY(QStringList DockedApps READ dockedApps NOTIFY DockedAppsChanged) + QStringList dockedApps(); + + Q_PROPERTY(QList Entries READ entries NOTIFY EntriesChanged) + QList entries(); + + Q_PROPERTY(DockRect FrontendWindowRect READ frontendWindowRect NOTIFY FrontendWindowRectChanged) + DockRect frontendWindowRect(); + + Q_PROPERTY(int HideMode READ hideMode WRITE setHideMode NOTIFY HideModeChanged) + int hideMode(); + void setHideMode(int value); + + Q_PROPERTY(int HideState READ hideState NOTIFY HideStateChanged) + int hideState(); + + Q_PROPERTY(uint HideTimeout READ hideTimeout WRITE setHideTimeout NOTIFY HideTimeoutChanged) + uint hideTimeout(); + void setHideTimeout(uint value); + + Q_PROPERTY(uint IconSize READ iconSize WRITE setIconSize NOTIFY IconSizeChanged) + uint iconSize(); + void setIconSize(uint value); + + Q_PROPERTY(double Opacity READ opacity WRITE setOpacity NOTIFY OpacityChanged) + double opacity(); + void setOpacity(double value); + + Q_PROPERTY(int Position READ position WRITE setPosition NOTIFY PositionChanged) + int position(); + void setPosition(int value); + + Q_PROPERTY(uint ShowTimeout READ showTimeout WRITE setShowTimeout NOTIFY ShowTimeoutChanged) + uint showTimeout(); + void setShowTimeout(uint value); + + Q_PROPERTY(uint WindowSize READ windowSize WRITE setWindowSize NOTIFY WindowSizeChanged) + uint windowSize(); + void setWindowSize(uint value); + + Q_PROPERTY(uint WindowSizeEfficient READ windowSizeEfficient WRITE setWindowSizeEfficient NOTIFY WindowSizeEfficientChanged) + uint windowSizeEfficient(); + void setWindowSizeEfficient(uint value); + + Q_PROPERTY(uint WindowSizeFashion READ windowSizeFashion WRITE setWindowSizeFashion NOTIFY WindowSizeFashionChanged) + uint windowSizeFashion(); + void setWindowSizeFashion(uint value); + +public Q_SLOTS: // METHODS + QDBusPendingReply<> ActivateWindow(uint in0); + + QDBusPendingReply<> PreviewWindow(uint in0); + + QDBusPendingReply<> CancelPreviewWindow(); + + QDBusPendingReply<> MinimizeWindow(uint in0); + + inline void ActivateWindowQueued(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + + CallQueued(QStringLiteral("ActivateWindow"), argumentList); + } + + inline QDBusPendingReply<> CloseWindow(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("CloseWindow"), argumentList); + } + + inline void CloseWindowQueued(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + + CallQueued(QStringLiteral("CloseWindow"), argumentList); + } + + inline QDBusPendingReply GetDockedAppsDesktopFiles() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("GetDockedAppsDesktopFiles"), argumentList); + } + + inline QDBusPendingReply GetEntryIDs() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("GetEntryIDs"), argumentList); + } + + inline QDBusPendingReply GetPluginSettings() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("GetPluginSettings"), argumentList); + } + + inline QDBusPendingReply IsDocked(const QString &in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("IsDocked"), argumentList); + } + + inline QDBusPendingReply IsOnDock(const QString &in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("IsOnDock"), argumentList); + } + + inline QDBusPendingReply<> MergePluginSettings(const QString &in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("MergePluginSettings"), argumentList); + } + + inline void MergePluginSettingsQueued(const QString &in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + + CallQueued(QStringLiteral("MergePluginSettings"), argumentList); + } + + inline QDBusPendingReply<> MoveEntry(int in0, int in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("MoveEntry"), argumentList); + } + + inline void MoveEntryQueued(int in0, int in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + + CallQueued(QStringLiteral("MoveEntry"), argumentList); + } + + inline void MoveWindowQueued(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + + CallQueued(QStringLiteral("MoveWindow"), argumentList); + } + + inline QDBusPendingReply QueryWindowIdentifyMethod(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("QueryWindowIdentifyMethod"), argumentList); + } + + inline QDBusPendingReply<> RemovePluginSettings(const QString &in0, const QStringList &in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("RemovePluginSettings"), argumentList); + } + + inline void RemovePluginSettingsQueued(const QString &in0, const QStringList &in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + + CallQueued(QStringLiteral("RemovePluginSettings"), argumentList); + } + + inline QDBusPendingReply RequestDock(const QString &in0, int in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("RequestDock"), argumentList); + } + + inline QDBusPendingReply RequestUndock(const QString &in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("RequestUndock"), argumentList); + } + + inline QDBusPendingReply<> SetFrontendWindowRect(int in0, int in1, uint in2, uint in3) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3); + return asyncCallWithArgumentList(QStringLiteral("SetFrontendWindowRect"), argumentList); + } + + inline void SetFrontendWindowRectQueued(int in0, int in1, uint in2, uint in3) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3); + + CallQueued(QStringLiteral("SetFrontendWindowRect"), argumentList); + } + + inline QDBusPendingReply<> SetPluginSettings(const QString &in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("SetPluginSettings"), argumentList); + } + + inline void SetPluginSettingsQueued(const QString &in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + + CallQueued(QStringLiteral("SetPluginSettings"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void DockAppSettingsSynced(); + void EntryAdded(const QDBusObjectPath &in0, int in1); + void EntryRemoved(const QString &in0); + void PluginSettingsSynced(); + void ServiceRestarted(); + // begin property changed signals + void DisplayModeChanged(int value) const; + void DockedAppsChanged(const QStringList &value) const; + void EntriesChanged(const QList &value) const; + void FrontendWindowRectChanged(DockRect value) const; + void HideModeChanged(int value) const; + void HideStateChanged(int value) const; + void HideTimeoutChanged(uint value) const; + void IconSizeChanged(uint value) const; + void OpacityChanged(double value) const; + void PositionChanged(int value) const; + void ShowTimeoutChanged(uint value) const; + void WindowSizeChanged(uint value) const; + void WindowSizeEfficientChanged(uint value) const; + void WindowSizeFashionChanged(uint value) const; + +public Q_SLOTS: + void CallQueued(const QString &callName, const QList &args); + +private Q_SLOTS: + void onPendingCallFinished(QDBusPendingCallWatcher *w); + void onPropertyChanged(const QDBusMessage& msg); + +private: + DockPrivate *d_ptr; + WM *m_wm; +}; + +namespace org { + namespace deepin { + namespace dde { + namespace daemon { + typedef ::Dde_Dock DdeDock; + } + } + } +} + +#endif // USE_AM + +#endif // DOCK_INTERFACE diff --git a/frame/dbus/entryinterface.cpp b/frame/dbus/entryinterface.cpp new file mode 100644 index 000000000..f2245f921 --- /dev/null +++ b/frame/dbus/entryinterface.cpp @@ -0,0 +1,290 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#include "entryinterface.h" + +/* + * Implementation of interface class __Entry + */ + +#ifdef USE_AM + +void registerWindowListMetaType() +{ + qRegisterMetaType(); + qDBusRegisterMetaType(); +} + +void registerWindowInfoMapMetaType() +{ + registerWindowInfoMetaType(); + + qRegisterMetaType("WindowInfoMap"); + qDBusRegisterMetaType(); +} + +void registerWindowInfoMetaType() +{ + qRegisterMetaType("WindowInfo"); + qDBusRegisterMetaType(); +} + +QDebug operator<<(QDebug argument, const WindowInfo &info) +{ + argument << '(' << info.title << ',' << info.attention << ')'; + + return argument; +} + +QDBusArgument &operator<<(QDBusArgument &argument, const WindowInfo &info) +{ + argument.beginStructure(); + argument << info.title << info.attention; + argument.endStructure(); + + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument &argument, WindowInfo &info) +{ + argument.beginStructure(); + argument >> info.title >> info.attention; + argument.endStructure(); + + return argument; +} + +bool WindowInfo::operator==(const WindowInfo &rhs) const +{ + return attention == rhs.attention && + title == rhs.title; +} + +class EntryPrivate +{ +public: + EntryPrivate() = default; + + // begin member variables + uint CurrentWindow; + QString DesktopFile; + QString Icon; + QString Id; + bool IsActive; + bool IsDocked; + QString Menu; + QString Name; + + WindowInfoMap WindowInfos; + +public: + QMap m_processingCalls; + QMap> m_waittingCalls; +}; + +Dock_Entry::Dock_Entry(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) + , d_ptr(new EntryPrivate) +{ + QDBusConnection::sessionBus().connect(this->service(), this->path(), + "org.freedesktop.DBus.Properties", + "PropertiesChanged","sa{sv}as", + this, + SLOT(onPropertyChanged(const QDBusMessage &))); + + if (QMetaType::type("WindowList") == QMetaType::UnknownType) + registerWindowListMetaType(); + if (QMetaType::type("WindowInfoMap") == QMetaType::UnknownType) + registerWindowInfoMapMetaType(); +} + +Dock_Entry::~Dock_Entry() +{ + qDeleteAll(d_ptr->m_processingCalls.values()); + delete d_ptr; +} + +void Dock_Entry::onPropertyChanged(const QString &propName, const QVariant &value) +{ + if (propName == QStringLiteral("CurrentWindow")) { + const uint &CurrentWindow = qvariant_cast(value); + if (d_ptr->CurrentWindow != CurrentWindow) + { + d_ptr->CurrentWindow = CurrentWindow; + Q_EMIT CurrentWindowChanged(d_ptr->CurrentWindow); + } + return; + } + + if (propName == QStringLiteral("DesktopFile")) { + const QString &DesktopFile = qvariant_cast(value); + if (d_ptr->DesktopFile != DesktopFile) { + d_ptr->DesktopFile = DesktopFile; + Q_EMIT DesktopFileChanged(d_ptr->DesktopFile); + } + return; + } + + if (propName == QStringLiteral("Icon")) { + const QString &Icon = qvariant_cast(value); + if (d_ptr->Icon != Icon) + { + d_ptr->Icon = Icon; + Q_EMIT IconChanged(d_ptr->Icon); + } + return; + } + + if (propName == QStringLiteral("Id")) { + const QString &Id = qvariant_cast(value); + if (d_ptr->Id != Id) { + d_ptr->Id = Id; + Q_EMIT IdChanged(d_ptr->Id); + } + return; + } + + if (propName == QStringLiteral("IsActive")) { + const bool &IsActive = qvariant_cast(value); + if (d_ptr->IsActive != IsActive) { + d_ptr->IsActive = IsActive; + Q_EMIT IsActiveChanged(d_ptr->IsActive); + } + return; + } + + if (propName == QStringLiteral("IsDocked")) { + const bool &IsDocked = qvariant_cast(value); + if (d_ptr->IsDocked != IsDocked) { + d_ptr->IsDocked = IsDocked; + Q_EMIT IsDockedChanged(d_ptr->IsDocked); + } + return; + } + + if (propName == QStringLiteral("Menu")) { + const QString &Menu = qvariant_cast(value); + if (d_ptr->Menu != Menu) { + d_ptr->Menu = Menu; + Q_EMIT MenuChanged(d_ptr->Menu); + } + return; + } + + if (propName == QStringLiteral("Name")) { + const QString &Name = qvariant_cast(value); + if (d_ptr->Name != Name) { + d_ptr->Name = Name; + Q_EMIT NameChanged(d_ptr->Name); + } + return; + } + + if (propName == QStringLiteral("WindowInfos")) { + const WindowInfoMap &WindowInfos = qvariant_cast(value); + if (d_ptr->WindowInfos != WindowInfos) { + d_ptr->WindowInfos = WindowInfos; + Q_EMIT WindowInfosChanged(d_ptr->WindowInfos); + } + return; + } + + qWarning() << "property not handle: " << propName; + return; +} + +uint Dock_Entry::currentWindow() +{ + return qvariant_cast(property("CurrentWindow")); +} + +QString Dock_Entry::desktopFile() +{ + return qvariant_cast(property("DesktopFile")); +} + +QString Dock_Entry::icon() +{ + return qvariant_cast(property("Icon")); +} + +QString Dock_Entry::id() +{ + return qvariant_cast(property("Id")); +} + +bool Dock_Entry::isActive() +{ + return qvariant_cast(property("IsActive")); +} + +bool Dock_Entry::isDocked() +{ + return qvariant_cast(property("IsDocked")); +} + +QString Dock_Entry::menu() +{ + return qvariant_cast(property("Menu")); +} + +QString Dock_Entry::name() +{ + return qvariant_cast(property("Name")); +} + +WindowInfoMap Dock_Entry::windowInfos() +{ + return qvariant_cast(property("WindowInfos")); +} + +void Dock_Entry::CallQueued(const QString &callName, const QList &args) +{ + if (d_ptr->m_waittingCalls.contains(callName)) { + d_ptr->m_waittingCalls[callName] = args; + return; + } + if (d_ptr->m_processingCalls.contains(callName)) { + d_ptr->m_waittingCalls.insert(callName, args); + } else { + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(asyncCallWithArgumentList(callName, args)); + connect(watcher, &QDBusPendingCallWatcher::finished, this, &Dock_Entry::onPendingCallFinished); + d_ptr->m_processingCalls.insert(callName, watcher); + } +} + +void Dock_Entry::onPendingCallFinished(QDBusPendingCallWatcher *w) +{ + w->deleteLater(); + const auto callName = d_ptr->m_processingCalls.key(w); + Q_ASSERT(!callName.isEmpty()); + if (callName.isEmpty()) + return; + + d_ptr->m_processingCalls.remove(callName); + if (!d_ptr->m_waittingCalls.contains(callName)) + return; + + const auto args = d_ptr->m_waittingCalls.take(callName); + CallQueued(callName, args); +} + +#endif diff --git a/frame/dbus/entryinterface.h b/frame/dbus/entryinterface.h new file mode 100644 index 000000000..2e0b84a7f --- /dev/null +++ b/frame/dbus/entryinterface.h @@ -0,0 +1,275 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef DOCK_ENTRY_H +#define DOCK_ENTRY_H + +#ifdef USE_AM + +#define WINDOWLIST_H +#define WINDOWINFOLIST_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef QList WindowList; + +void registerWindowListMetaType(); + +class WindowInfo +{ +public: + friend QDebug operator<<(QDebug argument, const WindowInfo &info); + friend QDBusArgument &operator<<(QDBusArgument &argument, const WindowInfo &info); + friend const QDBusArgument &operator>>(const QDBusArgument &argument, WindowInfo &info); + + bool operator==(const WindowInfo &rhs) const; + +public: + bool attention; + QString title; +}; + +Q_DECLARE_METATYPE(WindowInfo) + +typedef QMap WindowInfoMap; +Q_DECLARE_METATYPE(WindowInfoMap) + +void registerWindowInfoMetaType(); +void registerWindowInfoMapMetaType(); + +/* + * Proxy class for interface com.deepin.dde.daemon.Dock.Entry + */ +class EntryPrivate; + +class Dock_Entry : public QDBusAbstractInterface +{ + Q_OBJECT + +public: + static inline const char *staticInterfaceName() + { return "org.deepin.dde.daemon.Dock1.Entry"; } + +public: + explicit Dock_Entry(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~Dock_Entry(); + + Q_PROPERTY(uint CurrentWindow READ currentWindow NOTIFY CurrentWindowChanged) + uint currentWindow(); + + Q_PROPERTY(QString DesktopFile READ desktopFile NOTIFY DesktopFileChanged) + QString desktopFile(); + + Q_PROPERTY(QString Icon READ icon NOTIFY IconChanged) + QString icon(); + + Q_PROPERTY(QString Id READ id NOTIFY IdChanged) + QString id(); + + Q_PROPERTY(bool IsActive READ isActive NOTIFY IsActiveChanged) + bool isActive(); + + Q_PROPERTY(bool IsDocked READ isDocked NOTIFY IsDockedChanged) + bool isDocked(); + + Q_PROPERTY(QString Menu READ menu NOTIFY MenuChanged) + QString menu(); + + Q_PROPERTY(QString Name READ name NOTIFY NameChanged) + QString name(); + + Q_PROPERTY(WindowInfoMap WindowInfos READ windowInfos NOTIFY WindowInfosChanged) + WindowInfoMap windowInfos(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply<> Activate(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("Activate"), argumentList); + } + + inline void ActivateQueued(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + CallQueued(QStringLiteral("Activate"), argumentList); + } + + inline QDBusPendingReply<> Check() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Check"), argumentList); + } + + inline void CheckQueued() + { + QList argumentList; + CallQueued(QStringLiteral("Check"), argumentList); + } + + inline QDBusPendingReply<> ForceQuit() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("ForceQuit"), argumentList); + } + + inline void ForceQuitQueued() + { + QList argumentList; + CallQueued(QStringLiteral("ForceQuit"), argumentList); + } + + inline QDBusPendingReply GetAllowedCloseWindows() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("GetAllowedCloseWindows"), argumentList); + } + + inline QDBusPendingReply<> HandleDragDrop(uint in0, const QStringList &in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("HandleDragDrop"), argumentList); + } + + inline void HandleDragDropQueued(uint in0, const QStringList &in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + CallQueued(QStringLiteral("HandleDragDrop"), argumentList); + } + + inline QDBusPendingReply<> HandleMenuItem(uint in0, const QString &in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("HandleMenuItem"), argumentList); + } + + inline void HandleMenuItemQueued(uint in0, const QString &in1) + { + QList argumentList; + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + CallQueued(QStringLiteral("HandleMenuItem"), argumentList); + } + + inline QDBusPendingReply<> NewInstance(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("NewInstance"), argumentList); + } + + inline void NewInstanceQueued(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + CallQueued(QStringLiteral("NewInstance"), argumentList); + } + + inline QDBusPendingReply<> PresentWindows() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("PresentWindows"), argumentList); + } + + inline void PresentWindowsQueued() + { + QList argumentList; + CallQueued(QStringLiteral("PresentWindows"), argumentList); + } + + inline QDBusPendingReply<> RequestDock() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("RequestDock"), argumentList); + } + + inline void RequestDockQueued() + { + QList argumentList; + CallQueued(QStringLiteral("RequestDock"), argumentList); + } + + inline QDBusPendingReply<> RequestUndock() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("RequestUndock"), argumentList); + } + + inline void RequestUndockQueued() + { + QList argumentList; + CallQueued(QStringLiteral("RequestUndock"), argumentList); + } + +Q_SIGNALS: // SIGNALS + // begin property changed signals + void IsActiveChanged(bool value) const; + void IsDockedChanged(bool value) const; + void MenuChanged(const QString &value) const; + void IconChanged(const QString &value) const; + void NameChanged(const QString &value) const; + void DesktopFileChanged(const QString &value) const; + void CurrentWindowChanged(uint32_t value) const; + + void WindowInfosChanged(WindowInfoMap value) const; + void IdChanged(const QString &value) const; + +private: + QVariant asyncProperty(const QString &propertyName); + +public Q_SLOTS: + void CallQueued(const QString &callName, const QList &args); + +private Q_SLOTS: + void onPendingCallFinished(QDBusPendingCallWatcher *w); + void onPropertyChanged(const QString &propName, const QVariant &value); + +private: + EntryPrivate *d_ptr; +}; + +namespace org { + namespace deepin { + namespace dde { + namespace daemon { + namespace dock { + typedef ::Dock_Entry DockEntry; + } + } + } + } +} + +#endif // USE_AM + +#endif // DOCK_ENTRY_H diff --git a/frame/util/dbusutil.h b/frame/util/dbusutil.h new file mode 100644 index 000000000..a4d7b3da5 --- /dev/null +++ b/frame/util/dbusutil.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef DBUSUTIL_H +#define DBUSUTIL_H + +#ifdef USE_AM +#include "dockinterface.h" +#include "entryinterface.h" +#else +#include +#include +#endif + +#ifdef USE_AM +using DockInter = org::deepin::dde::daemon::DdeDock; +using DockEntryInter = org::deepin::dde::daemon::dock::DockEntry; +#else +using DockInter = com::deepin::dde::daemon::Dock; +using DockEntryInter = com::deepin::dde::daemon::dock::Entry; +#endif + +inline const QString dockServiceName() +{ +#ifdef USE_AM + return QString("org.deepin.dde.daemon.Dock1"); +#else + return QString("com.deepin.dde.daemon.Dock"); +#endif +} + +inline const QString dockServicePath() +{ +#ifdef USE_AM + return QString("/org/deepin/dde/daemon/Dock1"); +#else + return QString("/com/deepin/dde/daemon/Dock"); +#endif +} + +#endif // DBUSUTIL_H diff --git a/plugins/tray/CMakeLists.txt b/plugins/tray/CMakeLists.txt index 012e29b75..aee5dbd38 100644 --- a/plugins/tray/CMakeLists.txt +++ b/plugins/tray/CMakeLists.txt @@ -12,6 +12,7 @@ file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" "../../frame/dbus/sni/*.h" "../../frame/dbus/sni/*.cpp" "../../frame/dbus/dbusmenu.h" "../../frame/dbus/dbusmenu.cpp" "../../frame/dbus/dbusmenumanager.h" "../../frame/dbus/dbusmenumanager.cpp" + "../../frame/dbus/dockinterface.h" "../../frame/dbus/dockinterface.cpp" "../../widgets/*.h" "../../widgets/*.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" "../../frame/util/menudialog.h" "../../frame/util/menudialog.cpp" From 7091b322397dac1131fd681df4637a52d0a14561 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 21 Jun 2022 17:42:50 +0800 Subject: [PATCH 042/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=A1=8C?= =?UTF-8?q?=E9=9D=A2=E5=BA=94=E7=94=A8=E5=9B=BE=E6=A0=87=E7=9A=84AM?= =?UTF-8?q?=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复DockItemManager和AppItem类中对AM接口的访问 Log: Influence: 任务栏 Task: https://pms.uniontech.com/task-view-133075.html Change-Id: I93a656f5437a24fb2d964b337b793d4759375dc2 --- frame/controller/dockitemmanager.cpp | 20 ++++++++++---------- frame/controller/dockitemmanager.h | 6 ++---- frame/item/appitem.cpp | 2 +- frame/item/appitem.h | 4 +--- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index df5879c16..e31714dd2 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -38,7 +38,7 @@ const QGSettings *DockItemManager::m_dockedSettings = Utils::ModuleSettingsPtr(" DockItemManager::DockItemManager(QObject *parent) : QObject(parent) - , m_appInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) + , m_appInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) , m_pluginsInter(new DockPluginsController(this)) , m_loadFinished(false) { @@ -50,9 +50,9 @@ DockItemManager::DockItemManager(QObject *parent) AppItem *it = new AppItem(m_appSettings, m_activeSettings, m_dockedSettings, entry); manageItem(it); - connect(it, &AppItem::requestActivateWindow, m_appInter, &DBusDock::ActivateWindow, Qt::QueuedConnection); - connect(it, &AppItem::requestPreviewWindow, m_appInter, &DBusDock::PreviewWindow); - connect(it, &AppItem::requestCancelPreview, m_appInter, &DBusDock::CancelPreviewWindow); + connect(it, &AppItem::requestActivateWindow, m_appInter, &DockInter::ActivateWindow, Qt::QueuedConnection); + connect(it, &AppItem::requestPreviewWindow, m_appInter, &DockInter::PreviewWindow); + connect(it, &AppItem::requestCancelPreview, m_appInter, &DockInter::CancelPreviewWindow); connect(this, &DockItemManager::requestUpdateDockItem, it, &AppItem::requestUpdateEntryGeometries); @@ -62,9 +62,9 @@ DockItemManager::DockItemManager(QObject *parent) // 托盘区域和插件区域 由DockPluginsController获取 // 应用信号 - connect(m_appInter, &DBusDock::EntryAdded, this, &DockItemManager::appItemAdded); - connect(m_appInter, &DBusDock::EntryRemoved, this, static_cast(&DockItemManager::appItemRemoved), Qt::QueuedConnection); - connect(m_appInter, &DBusDock::ServiceRestarted, this, &DockItemManager::reloadAppItems); + connect(m_appInter, &DockInter::EntryAdded, this, &DockItemManager::appItemAdded); + connect(m_appInter, &DockInter::EntryRemoved, this, static_cast(&DockItemManager::appItemRemoved), Qt::QueuedConnection); + connect(m_appInter, &DockInter::ServiceRestarted, this, &DockItemManager::reloadAppItems); // 插件信号 connect(m_pluginsInter, &DockPluginsController::pluginItemInserted, this, &DockItemManager::pluginItemInserted, Qt::QueuedConnection); @@ -203,9 +203,9 @@ void DockItemManager::appItemAdded(const QDBusObjectPath &path, const int index) manageItem(item); - connect(item, &AppItem::requestActivateWindow, m_appInter, &DBusDock::ActivateWindow, Qt::QueuedConnection); - connect(item, &AppItem::requestPreviewWindow, m_appInter, &DBusDock::PreviewWindow); - connect(item, &AppItem::requestCancelPreview, m_appInter, &DBusDock::CancelPreviewWindow); + connect(item, &AppItem::requestActivateWindow, m_appInter, &DockInter::ActivateWindow, Qt::QueuedConnection); + connect(item, &AppItem::requestPreviewWindow, m_appInter, &DockInter::PreviewWindow); + connect(item, &AppItem::requestCancelPreview, m_appInter, &DockInter::CancelPreviewWindow); connect(this, &DockItemManager::requestUpdateDockItem, item, &AppItem::requestUpdateEntryGeometries); m_itemList.insert(insertIndex, item); diff --git a/frame/controller/dockitemmanager.h b/frame/controller/dockitemmanager.h index 2548728c2..0887bd9e9 100644 --- a/frame/controller/dockitemmanager.h +++ b/frame/controller/dockitemmanager.h @@ -27,12 +27,10 @@ #include "dockitem.h" #include "appitem.h" #include "placeholderitem.h" - -#include +#include "dbusutil.h" #include -using DBusDock = com::deepin::dde::daemon::Dock; /** * @brief The DockItemManager class * 管理类,管理所有的应用数据,插件数据 @@ -78,7 +76,7 @@ private: void manageItem(DockItem *item); private: - DBusDock *m_appInter; + DockInter *m_appInter; DockPluginsController *m_pluginsInter; static DockItemManager *INSTANCE; diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 8d43562d9..5040480f0 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -55,7 +55,7 @@ AppItem::AppItem(const QGSettings *appSettings, const QGSettings *activeAppSetti , m_activeAppSettings(activeAppSettings) , m_dockedAppSettings(dockedAppSettings) , m_appPreviewTips(nullptr) - , m_itemEntryInter(new DockEntryInter("com.deepin.dde.daemon.Dock", entry.path(), QDBusConnection::sessionBus(), this)) + , m_itemEntryInter(new DockEntryInter(dockServiceName(), entry.path(), QDBusConnection::sessionBus(), this)) , m_swingEffectView(nullptr) , m_itemAnimation(nullptr) , m_wmHelper(DWindowManagerHelper::instance()) diff --git a/frame/item/appitem.h b/frame/item/appitem.h index eb78d0406..69c556b64 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -28,15 +28,13 @@ #include "appdrag.h" #include "dbusclientmanager.h" #include "../widgets/tipswidget.h" +#include "dbusutil.h" #include #include #include #include -#include - -using DockEntryInter = com::deepin::dde::daemon::dock::Entry; class QGSettings; class AppItem : public DockItem From 03d7942b2f037e688e6ed5e03fd8c6ee4d5b63ac Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 22 Jun 2022 11:18:29 +0800 Subject: [PATCH 043/257] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E5=B1=8F?= =?UTF-8?q?=E5=B9=95=E7=AE=A1=E7=90=86=E7=9A=84=E7=9B=B8=E5=85=B3=E7=B1=BB?= =?UTF-8?q?=E4=B8=AD=E5=AF=B9AM=E6=8E=A5=E5=8F=A3=E7=9A=84=E8=AE=BF?= =?UTF-8?q?=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 多屏幕管理类、菜单管理类中改成AM来访问后端接口 Log: Influence: 任务栏 Task: https://pms.uniontech.com/task-view-133075.html Change-Id: I1d7cccbc58b7c5883c4946a2f92510c98e144692 --- frame/util/menuworker.cpp | 5 +- frame/util/menuworker.h | 8 +-- frame/util/multiscreenworker.cpp | 106 +++++++++++++++---------------- frame/util/multiscreenworker.h | 19 +++--- frame/window/mainwindow.cpp | 2 - interfaces/constants.h | 4 ++ 6 files changed, 70 insertions(+), 74 deletions(-) diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index 085c7937b..04f98eda1 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -32,12 +32,11 @@ #define DIS_INS DisplayManager::instance() -MenuWorker::MenuWorker(DBusDock *dockInter,QWidget *parent) - : QObject (parent) +MenuWorker::MenuWorker(DockInter *dockInter,QWidget *parent) + : QObject(parent) , m_dockInter(dockInter) , m_autoHide(true) { - } QMenu *MenuWorker::createMenu(QMenu *settingsMenu) diff --git a/frame/util/menuworker.h b/frame/util/menuworker.h index c7501586e..f128ed518 100644 --- a/frame/util/menuworker.h +++ b/frame/util/menuworker.h @@ -23,10 +23,8 @@ #include #include "constants.h" +#include "dbusutil.h" -#include - -using DBusDock = com::deepin::dde::daemon::Dock; class QMenu; class QGSettings; /** @@ -36,7 +34,7 @@ class MenuWorker : public QObject { Q_OBJECT public: - explicit MenuWorker(DBusDock *dockInter,QWidget *parent = nullptr); + explicit MenuWorker(DockInter *dockInter,QWidget *parent = nullptr); void showDockSettingsMenu(QMenu *menu); @@ -53,7 +51,7 @@ private slots: void onDockSettingsTriggered(); private: - DBusDock *m_dockInter; + DockInter *m_dockInter; bool m_autoHide; }; diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index b6c02a185..936c38b12 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -52,7 +52,7 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *help , m_eventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) , m_extralEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) , m_touchEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) - , m_dockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) + , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) , m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus(), this)) , m_monitorUpdateTimer(new QTimer(this)) , m_delayWakeTimer(new QTimer(this)) @@ -176,30 +176,34 @@ void MultiScreenWorker::updateDaemonDockSize(int dockSize) m_dockInter->setWindowSizeEfficient(uint(dockSize)); } +#ifndef USE_AM void MultiScreenWorker::handleDbusSignal(QDBusMessage msg) { QList arguments = msg.arguments(); // 参数固定长度 if (3 != arguments.count()) return; + // 返回的数据中,这一部分对应的是数据发送方的interfacename,可判断是否是自己需要的服务 QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName == "com.deepin.dde.daemon.Dock") { - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - QStringList keys = changedProps.keys(); - foreach (const QString &prop, keys) { - if (prop == "Position") { - onPositionChanged(static_cast(changedProps.value(prop).toInt())); - } else if (prop == "DisplayMode") { - onDisplayModeChanged(static_cast(changedProps.value(prop).toInt())); - } else if (prop == "HideMode") { - onHideModeChanged(static_cast(changedProps.value(prop).toInt())); - } else if (prop == "HideState") { - onHideStateChanged(static_cast(changedProps.value(prop).toInt())); - } + if (interfaceName != DockInter::staticInterfaceName()) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + QStringList keys = changedProps.keys(); + foreach (const QString &prop, keys) { + if (prop == "Position") { + onPositionChanged(changedProps.value(prop).toInt()); + } else if (prop == "DisplayMode") { + onDisplayModeChanged(changedProps.value(prop).toInt()); + } else if (prop == "HideMode") { + onHideModeChanged(changedProps.value(prop).toInt()); + } else if (prop == "HideState") { + onHideStateChanged(changedProps.value(prop).toInt()); } } } +#endif void MultiScreenWorker::onRegionMonitorChanged(int x, int y, const QString &key) { @@ -354,7 +358,7 @@ void MultiScreenWorker::updateParentGeometry(const QVariant &value) updateParentGeometry(value, m_position); } -void MultiScreenWorker::onPositionChanged(const Position &position) +void MultiScreenWorker::onPositionChanged(int position) { Position lastPos = m_position; if (lastPos == position) @@ -362,7 +366,7 @@ void MultiScreenWorker::onPositionChanged(const Position &position) #ifdef QT_DEBUG qDebug() << "position change from: " << lastPos << " to: " << position; #endif - m_position = position; + m_position = static_cast(position); // 更新鼠标拖拽样式,在类内部设置到qApp单例上去 if ((Top == m_position) || (Bottom == m_position)) { @@ -380,21 +384,21 @@ void MultiScreenWorker::onPositionChanged(const Position &position) emit requestUpdateFrontendGeometry(); } else { // 一直显示的模式才需要显示 - emit requestUpdatePosition(lastPos, position); + emit requestUpdatePosition(lastPos, m_position); } } -void MultiScreenWorker::onDisplayModeChanged(const DisplayMode &displayMode) +void MultiScreenWorker::onDisplayModeChanged(int displayMode) { if (displayMode == m_displayMode) return; qInfo() << "display mode change:" << displayMode; - m_displayMode = displayMode; + m_displayMode = static_cast(displayMode); parent()->panel()->setDisplayMode(m_displayMode); - DockItem::setDockDisplayMode(displayMode); + DockItem::setDockDisplayMode(m_displayMode); qApp->setProperty(PROP_DISPLAY_MODE, QVariant::fromValue(displayMode)); QRect rect; @@ -415,14 +419,14 @@ void MultiScreenWorker::onDisplayModeChanged(const DisplayMode &displayMode) emit requestNotifyWindowManager(); } -void MultiScreenWorker::onHideModeChanged(const HideMode &hideMode) +void MultiScreenWorker::onHideModeChanged(int hideMode) { if (m_hideMode == hideMode) return; qInfo() << "hidemode change:" << hideMode; - m_hideMode = hideMode; + m_hideMode = static_cast(hideMode); if (m_hideMode == HideMode::KeepShowing || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { @@ -435,12 +439,12 @@ void MultiScreenWorker::onHideModeChanged(const HideMode &hideMode) emit requestNotifyWindowManager(); } -void MultiScreenWorker::onHideStateChanged(const Dock::HideState &state) +void MultiScreenWorker::onHideStateChanged(int state) { if (state == Dock::Unknown) return; - m_hideState = state; + m_hideState = static_cast(state); // 检查当前屏幕的当前位置是否允许显示,不允许需要更新显示信息(这里应该在函数外部就处理好,不应该走到这里) @@ -942,22 +946,13 @@ void MultiScreenWorker::initConnection() connect(m_launcherInter, static_cast(&DBusLuncher::VisibleChanged), this, [ = ](bool value) { setStates(LauncherDisplay, value); }); - /** FIXME - * 这里关联的信号有时候收不到是因为 qt-dbus-factory 中的 changed 的信号有时候会发不出来, - * qt-dbus-factory 中的 DBusExtendedAbstractInterface::internalPropGet 在同步调用情况下,会将缓存中的数据写入属性中, - * 导致后面 onPropertyChanged 中的判断认为属性值没变,就没有发出 changed 信号。 - * 建议:前端仅在初始化时主动获取一次 dbus 中的值存储在成员变量中,并建立 changed 信号连接,后面所有用到那个值的地方,均获取成员变量; - * 或去修改 qt-dbus-factory,取消 DBusExtendedAbstractInterface::internalPropGet 中将数据写入属性值, - * 但是 qt-dbus-factory 修改涉及面较广,需要大量测试确认没有问题,再合入。 - */ -#if 0 - // connect(m_dockInter, &DBusDock::PositionChanged, this, &MultiScreenWorker::onPositionChanged); - // connect(m_dockInter, &DBusDock::DisplayModeChanged, this, &MultiScreenWorker::onDisplayModeChanged); - // connect(m_dockInter, &DBusDock::HideModeChanged, this, &MultiScreenWorker::hideModeChanged); - // connect(m_dockInter, &DBusDock::HideStateChanged, this, &MultiScreenWorker::hideStateChanged); +#ifdef USE_AM + connect(m_dockInter, &DockInter::PositionChanged, this, &MultiScreenWorker::onPositionChanged); + connect(m_dockInter, &DockInter::DisplayModeChanged, this, &MultiScreenWorker::onDisplayModeChanged); + connect(m_dockInter, &DockInter::HideModeChanged, this, &MultiScreenWorker::onHideModeChanged); + connect(m_dockInter, &DockInter::HideStateChanged, this, &MultiScreenWorker::onHideStateChanged); #else - QDBusConnection::sessionBus().connect("com.deepin.dde.daemon.Dock", - "/com/deepin/dde/daemon/Dock", + QDBusConnection::sessionBus().connect(dockServiceName(), dockServicePath(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", @@ -986,10 +981,10 @@ void MultiScreenWorker::initUI() parent()->panel()->setFixedSize(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode).size()); parent()->panel()->move(0, 0); - onPositionChanged(static_cast(dockInter()->position())); - onDisplayModeChanged(static_cast(dockInter()->displayMode())); - onHideModeChanged(static_cast(dockInter()->hideMode())); - onHideStateChanged(static_cast(dockInter()->hideState())); + onPositionChanged(dockInter()->position()); + onDisplayModeChanged(dockInter()->displayMode()); + onHideModeChanged(dockInter()->hideMode()); + onHideStateChanged(dockInter()->hideState()); onOpacityChanged(m_dockInter->opacity()); // 初始化透明度 @@ -1330,27 +1325,26 @@ void MultiScreenWorker::resetDockScreen() */ void MultiScreenWorker::checkDaemonDockService() { - auto connectionInit = [ = ](DBusDock * dockInter) { - connect(dockInter, &DBusDock::ServiceRestarted, this, [ = ] { + auto connectionInit = [ = ](DockInter * dockInter) { + connect(dockInter, &DockInter::ServiceRestarted, this, [ = ] { resetDockScreen(); emit requestUpdateFrontendGeometry(); }); - connect(dockInter, &DBusDock::OpacityChanged, this, &MultiScreenWorker::onOpacityChanged); - connect(dockInter, &DBusDock::WindowSizeEfficientChanged, this, &MultiScreenWorker::onWindowSizeChanged); - connect(dockInter, &DBusDock::WindowSizeFashionChanged, this, &MultiScreenWorker::onWindowSizeChanged); + connect(dockInter, &DockInter::OpacityChanged, this, &MultiScreenWorker::onOpacityChanged); + connect(dockInter, &DockInter::WindowSizeEfficientChanged, this, &MultiScreenWorker::onWindowSizeChanged); + connect(dockInter, &DockInter::WindowSizeFashionChanged, this, &MultiScreenWorker::onWindowSizeChanged); }; - const QString serverName = "com.deepin.dde.daemon.Dock"; QDBusConnectionInterface *ifc = QDBusConnection::sessionBus().interface(); - if (!ifc->isServiceRegistered(serverName)) { + if (!ifc->isServiceRegistered(dockServiceName())) { connect(ifc, &QDBusConnectionInterface::serviceOwnerChanged, this, [ = ](const QString & name, const QString & oldOwner, const QString & newOwner) { Q_UNUSED(oldOwner) - if (name == serverName && !newOwner.isEmpty()) { + if (name == dockServiceName() && !newOwner.isEmpty()) { FREE_POINT(m_dockInter); - m_dockInter = new DBusDock(serverName, "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); + m_dockInter = new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this); // connect connectionInit(m_dockInter); @@ -1358,10 +1352,10 @@ void MultiScreenWorker::checkDaemonDockService() reInitDisplayData(); // operation - onPositionChanged(static_cast(dockInter()->position())); - onDisplayModeChanged(static_cast(dockInter()->displayMode())); - onHideModeChanged(static_cast(dockInter()->hideMode())); - onHideStateChanged(static_cast(dockInter()->hideState())); + onPositionChanged(dockInter()->position()); + onDisplayModeChanged(dockInter()->displayMode()); + onHideModeChanged(dockInter()->hideMode()); + onHideStateChanged(dockInter()->hideState()); onOpacityChanged(m_dockInter->opacity()); disconnect(ifc); diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index 719e29e44..af9e38eef 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -26,8 +26,8 @@ #include "utils.h" #include "dockitem.h" #include "xcb_misc.h" +#include "dbusutil.h" -#include #include #include @@ -49,7 +49,7 @@ DGUI_USE_NAMESPACE * 之前测试出的诸多问题都是在切换任务栏位置,切换屏幕,主屏更改,分辨率更改等情况发生后 * 任务栏的鼠标唤醒区域或任务栏的大小没更新或者更新时的大小还是按照原来的屏幕信息计算而来的, */ -using DBusDock = com::deepin::dde::daemon::Dock; + using XEventMonitor = ::com::deepin::api::XEventMonitor; using DBusLuncher = ::com::deepin::dde::Launcher; @@ -132,7 +132,7 @@ public: void initShow(); - DBusDock *dockInter() { return m_dockInter; } + DockInter *dockInter() { return m_dockInter; } inline bool testState(RunState state) { return (m_state & state); } void setStates(RunStates state, bool on = true); @@ -171,7 +171,10 @@ public slots: void onAutoHideChanged(bool autoHide); void updateDaemonDockSize(int dockSize); void onRequestUpdateRegionMonitor(); + +#ifndef USE_AM void handleDbusSignal(QDBusMessage); +#endif private slots: // Region Monitor @@ -190,10 +193,10 @@ private slots: void updateParentGeometry(const QVariant &value); // 任务栏属性变化 - void onPositionChanged(const Position &position); - void onDisplayModeChanged(const DisplayMode &displayMode); - void onHideModeChanged(const HideMode &hideMode); - void onHideStateChanged(const Dock::HideState &state); + void onPositionChanged(int position); + void onDisplayModeChanged(int displayMode); + void onHideModeChanged(int hideMode); + void onHideStateChanged(int state); void onOpacityChanged(const double value); // 通知后端任务栏所在位置 @@ -257,7 +260,7 @@ private: XEventMonitor *m_touchEventInter; // DBus interface - DBusDock *m_dockInter; + DockInter *m_dockInter; DBusLuncher *m_launcherInter; // update monitor info diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 9b2f764a3..cfbaf6301 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -44,8 +44,6 @@ #include #include -#include - #define SNI_WATCHER_SERVICE "org.kde.StatusNotifierWatcher" #define SNI_WATCHER_PATH "/StatusNotifierWatcher" diff --git a/interfaces/constants.h b/interfaces/constants.h index 3c79060b9..669699d73 100644 --- a/interfaces/constants.h +++ b/interfaces/constants.h @@ -64,7 +64,11 @@ enum DisplayMode { enum HideMode { KeepShowing = 0, KeepHidden = 1, +#ifdef USE_AM + SmartHide = 2, +#else SmartHide = 3, +#endif }; #define PROP_POSITION "Position" From 7fc1ec3ae56c90ee5ce792cf61987295490a9213 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 21 Jun 2022 17:43:19 +0800 Subject: [PATCH 044/257] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=99=A8=E4=B8=AD=E5=AF=B9AM=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改插件加载相关的类对AM接口的访问 Log: Influence: 任务栏 Task: https://pms.uniontech.com/task-view-133075.html Change-Id: Ifbf3ce3b8d9fc3098f1a0a5e3ff4a8bc97e68d67 --- frame/controller/dockpluginscontroller.h | 2 -- frame/controller/systemplugincontroller.h | 2 -- frame/item/components/appsnapshot.cpp | 2 +- frame/item/components/appsnapshot.h | 15 ++++++--------- frame/item/components/previewcontainer.h | 2 -- frame/util/abstractpluginscontroller.cpp | 4 ++-- frame/util/abstractpluginscontroller.h | 7 ++----- 7 files changed, 11 insertions(+), 23 deletions(-) diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index 6b7e26705..f6aa22138 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -26,8 +26,6 @@ #include "pluginproxyinterface.h" #include "abstractpluginscontroller.h" -#include - #include #include #include diff --git a/frame/controller/systemplugincontroller.h b/frame/controller/systemplugincontroller.h index 6dbed0580..2fc26d155 100644 --- a/frame/controller/systemplugincontroller.h +++ b/frame/controller/systemplugincontroller.h @@ -26,8 +26,6 @@ #include "abstractpluginscontroller.h" #include "abstractpluginscontroller.h" -#include - #include #include #include diff --git a/frame/item/components/appsnapshot.cpp b/frame/item/components/appsnapshot.cpp index a6e546feb..fa5fcd509 100644 --- a/frame/item/components/appsnapshot.cpp +++ b/frame/item/components/appsnapshot.cpp @@ -65,7 +65,7 @@ AppSnapshot::AppSnapshot(const WId wid, QWidget *parent) , m_waitLeaveTimer(new QTimer(this)) , m_closeBtn2D(new DIconButton(this)) , m_wmHelper(DWindowManagerHelper::instance()) - , m_dockDaemonInter(new DockDaemonInter("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) + , m_dockDaemonInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) { m_closeBtn2D->setFixedSize(SNAP_CLOSE_BTN_WIDTH, SNAP_CLOSE_BTN_WIDTH); m_closeBtn2D->setIconSize(QSize(SNAP_CLOSE_BTN_WIDTH, SNAP_CLOSE_BTN_WIDTH)); diff --git a/frame/item/components/appsnapshot.h b/frame/item/components/appsnapshot.h index 2f7bca737..8282caefe 100644 --- a/frame/item/components/appsnapshot.h +++ b/frame/item/components/appsnapshot.h @@ -22,16 +22,15 @@ #ifndef APPSNAPSHOT_H #define APPSNAPSHOT_H -#include -#include -#include +#include "dbusutil.h" #include #include #include -#include -#include +#include +#include +#include DWIDGET_USE_NAMESPACE DGUI_USE_NAMESPACE @@ -54,8 +53,6 @@ struct SHMInfo; struct _XImage; typedef _XImage XImage; -using DockDaemonInter = com::deepin::dde::daemon::Dock; - namespace Dock { class TipsWidget; } @@ -65,7 +62,7 @@ class AppSnapshot : public QWidget Q_OBJECT public: - explicit AppSnapshot(const WId wid, QWidget *parent = 0); + explicit AppSnapshot(const WId wid, QWidget *parent = Q_NULLPTR); inline WId wid() const { return m_wid; } inline bool attentioned() const { return m_windowInfo.attention; } @@ -120,7 +117,7 @@ private: QTimer *m_waitLeaveTimer; DIconButton *m_closeBtn2D; DWindowManagerHelper *m_wmHelper; - DockDaemonInter *m_dockDaemonInter; + DockInter *m_dockDaemonInter; }; #endif // APPSNAPSHOT_H diff --git a/frame/item/components/previewcontainer.h b/frame/item/components/previewcontainer.h index 1e48cb8b7..7ddd167df 100644 --- a/frame/item/components/previewcontainer.h +++ b/frame/item/components/previewcontainer.h @@ -30,8 +30,6 @@ #include "appsnapshot.h" #include "floatingpreview.h" -#include - #include DWIDGET_USE_NAMESPACE diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index 3d42bce2b..a53d55a77 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -41,13 +41,13 @@ static const QStringList CompatiblePluginApiList { AbstractPluginsController::AbstractPluginsController(QObject *parent) : QObject(parent) , m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()) - , m_dockDaemonInter(new DockDaemonInter("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) + , m_dockDaemonInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) { qApp->installEventFilter(this); refreshPluginSettings(); - connect(m_dockDaemonInter, &DockDaemonInter::PluginSettingsSynced, this, &AbstractPluginsController::refreshPluginSettings, Qt::QueuedConnection); + connect(m_dockDaemonInter, &DockInter::PluginSettingsSynced, this, &AbstractPluginsController::refreshPluginSettings, Qt::QueuedConnection); } AbstractPluginsController::~AbstractPluginsController() diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index f58e5a69e..ebfc303bd 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -24,16 +24,13 @@ #include "pluginproxyinterface.h" #include "pluginloader.h" - -#include +#include "dbusutil.h" #include #include #include #include -using DockDaemonInter = com::deepin::dde::daemon::Dock; - class PluginsItemInterface; class AbstractPluginsController : public QObject, PluginProxyInterface { @@ -83,7 +80,7 @@ private: private: QDBusConnectionInterface *m_dbusDaemonInterface; - DockDaemonInter *m_dockDaemonInter; + DockInter *m_dockDaemonInter; // interface, "pluginloader", PluginLoader指针对象 QMap> m_pluginsMap; From 0aba7ba0dbc196d0960a93668cdf913f66c0d858 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 21 Jun 2022 16:24:39 +0800 Subject: [PATCH 045/257] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=89=98?= =?UTF-8?q?=E7=9B=98=E5=B1=95=E5=BC=80=E5=9B=BE=E6=A0=87=E5=AF=B9AM?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 托盘图标需要通过AM接口来获取透明度,增加该接口对AM服务的访问 Log: Influence: 任务栏 Task: https://pms.uniontech.com/task-view-133075.html Change-Id: If4c981e23254776ea73b45834910899f39913ae8 --- frame/window/tray/widgets/expandiconwidget.cpp | 3 ++- frame/window/tray/widgets/expandiconwidget.h | 7 ++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 21da2b1bb..0c858a142 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -230,9 +230,10 @@ void ExpandIconWidget::onGlobMousePress(const QPoint &mousePos, const int flag) * @brief 圆角窗体的绘制 * @param parent */ + RoundWidget::RoundWidget(QWidget *parent) : QWidget (parent) - , m_dockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) + , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) { setAttribute(Qt::WA_TranslucentBackground); } diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h index 97e5dbe01..3560dae1f 100644 --- a/frame/window/tray/widgets/expandiconwidget.h +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -23,15 +23,12 @@ #include "constants.h" #include "basetraywidget.h" - -#include +#include "dbusutil.h" class TrayGridView; class TrayModel; class TrayDelegate; -using DBusDock = com::deepin::dde::daemon::Dock; - namespace Dtk { namespace Gui { class DRegionMonitor; } } class ExpandIconWidget : public BaseTrayWidget @@ -91,7 +88,7 @@ private: QColor maskColor() const; private: - DBusDock *m_dockInter; + DockInter *m_dockInter; }; #endif // EXPANDICONWIDGET_H From bbfe4ff26c1cf4171c26eea975da29536372cefd Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 21 Jun 2022 12:26:22 +0800 Subject: [PATCH 046/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=8C=BA=E5=9F=9F=E5=AF=B9=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E7=9A=84AM=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 托盘插件对任务栏的增加AM的访问方式 Log: Influence: 任务栏 Task: https://pms.uniontech.com/task-view-133075.html Change-Id: I91a918a4fe5c495b075e5dff7f528a623be8dc89 --- plugins/dcc-dock-plugin/module_widget.cpp | 10 ++++++- plugins/dcc-dock-plugin/module_widget.h | 14 ++++++++-- plugins/onboard/onboardplugin.cpp | 26 ++++++++++++++----- plugins/onboard/onboardplugin.h | 3 --- .../tray/system-trays/systemtrayscontroller.h | 2 -- 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/plugins/dcc-dock-plugin/module_widget.cpp b/plugins/dcc-dock-plugin/module_widget.cpp index 6a07361e2..89c4df202 100644 --- a/plugins/dcc-dock-plugin/module_widget.cpp +++ b/plugins/dcc-dock-plugin/module_widget.cpp @@ -63,6 +63,14 @@ enum Position { Left = 3, }; +#ifdef USE_AM +static const QString serviceName = QString("org.deepin.dde.daemon.Dock1"); +static const QString servicePath = QString("org.deepin.dde.daemon.Dock1"); +#else +static const QString serviceName = QString("com.deepin.dde.daemon.Dock"); +static const QString servicePath = QString("/com/deepin/dde/daemon/Dock"); +#endif + ModuleWidget::ModuleWidget(QWidget *parent) : QScrollArea(parent) , m_modeComboxWidget(new ComboxWidget(this)) @@ -72,7 +80,7 @@ ModuleWidget::ModuleWidget(QWidget *parent) , m_pluginTips(new DTipLabel(tr("Select which icons appear in the Dock"), this)) , m_pluginView(new DListView(this)) , m_pluginModel(new QStandardItemModel(this)) - , m_daemonDockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) + , m_daemonDockInter(new DBusDock(serviceName, servicePath, QDBusConnection::sessionBus(), this)) , m_dockInter(new DBusInter("com.deepin.dde.Dock", "/com/deepin/dde/Dock", QDBusConnection::sessionBus(), this)) , m_dconfigWatcher(new ConfigWatcher("dde.dock.plugin.dconfig", this)) , m_sliderPressed(false) diff --git a/plugins/dcc-dock-plugin/module_widget.h b/plugins/dcc-dock-plugin/module_widget.h index 4708490c6..50fd9103b 100644 --- a/plugins/dcc-dock-plugin/module_widget.h +++ b/plugins/dcc-dock-plugin/module_widget.h @@ -21,12 +21,16 @@ #ifndef MODULE_WIDGET_H #define MODULE_WIDGET_H +#ifdef USE_AM +#include "dockinterface.h" +#else +#include +#endif + #include #include -#include - #include "com_deepin_dde_dock.h" #include "config_watcher.h" @@ -47,7 +51,13 @@ class QStandardItemModel; using namespace dcc::widgets; using namespace dcc_dock_plugin; + +#ifdef USE_AM +using DBusDock = org::deepin::dde::daemon::DdeDock; +#else using DBusDock = com::deepin::dde::daemon::Dock; +#endif + using DBusInter = com::deepin::dde::Dock; class ModuleWidget : public QScrollArea diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index f3b65be41..a3ad2591a 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -21,15 +21,33 @@ #include "onboardplugin.h" #include "../widgets/tipswidget.h" +#ifdef USE_AM +#include "dockinterface.h" +#include "entryinterface.h" +#else +#include +#include +#endif #include #include #define PLUGIN_STATE_KEY "enable" +#ifdef USE_AM +using DBusDock = org::deepin::dde::daemon::DdeDock; +using DockEntryInter = org::deepin::dde::daemon::dock::DockEntry; + +static const QString serviceName = QString("com.deepin.dde.daemon.Dock"); +static const QString servicePath = QString("/com/deepin/dde/daemon/Dock"); +#else using DBusDock = com::deepin::dde::daemon::Dock; using DockEntryInter = com::deepin::dde::daemon::dock::Entry; +static const QString serviceName = QString("org.deepin.dde.daemon.Dock1"); +static const QString servicePath = QString("/org/deepin/dde/daemon/Dock1"); +#endif + using namespace Dock; OnboardPlugin::OnboardPlugin(QObject *parent) : QObject(parent) @@ -139,14 +157,10 @@ void OnboardPlugin::invokedMenuItem(const QString &itemKey, const QString &menuI process->start("onboard-settings"); } - DBusDock DockInter("com.deepin.dde.daemon.Dock", - "/com/deepin/dde/daemon/Dock", - QDBusConnection::sessionBus(), this); + DBusDock DockInter(serviceName, servicePath, QDBusConnection::sessionBus(), this); for (auto entry : DockInter.entries()) { - DockEntryInter AppInter("com.deepin.dde.daemon.Dock", - entry.path(), - QDBusConnection::sessionBus(), this); + DockEntryInter AppInter(serviceName, entry.path(), QDBusConnection::sessionBus(), this); if(AppInter.name() == "Onboard-Settings" && !AppInter.isActive()) { AppInter.Activate(0); break; diff --git a/plugins/onboard/onboardplugin.h b/plugins/onboard/onboardplugin.h index 4e17c483e..a8b005b4c 100644 --- a/plugins/onboard/onboardplugin.h +++ b/plugins/onboard/onboardplugin.h @@ -28,9 +28,6 @@ #include #include -#include -#include - namespace Dock { class TipsWidget; } diff --git a/plugins/tray/system-trays/systemtrayscontroller.h b/plugins/tray/system-trays/systemtrayscontroller.h index 0bd720941..ac546672c 100644 --- a/plugins/tray/system-trays/systemtrayscontroller.h +++ b/plugins/tray/system-trays/systemtrayscontroller.h @@ -26,8 +26,6 @@ #include "pluginproxyinterface.h" #include "util/abstractpluginscontroller.h" -#include - #include #include #include From c717a964555525c4ccaf6d4aaa83383c6dd42370 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 22 Jun 2022 21:23:16 +0800 Subject: [PATCH 047/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=8B=96=E5=8A=A8=E5=88=B0=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E5=B0=BA=E5=AF=B8=E5=90=8E=E5=9B=BE=E6=A0=87=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:在任务栏变到最小尺寸的时候处理了插件区域的尺寸,重新设置了高度为获取到的最大高度引起任务栏高度设置错误 修改方案:在重新设置任务栏尺寸的时候,根据当前任务栏的位置,只处理宽度(任务栏在屏幕上下方向)或高度(任务栏在屏幕左右方向) Log: 优化任务栏拖动处理逻辑 Influence: 任务栏,拖动任务栏高度发生变化 Task: https://pms.uniontech.com/task-view-154167.html Change-Id: I23529000ce32ef9f3ce0a358cb560f6aae5e1eeb --- frame/util/multiscreenworker.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 936c38b12..239dcc0dd 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -910,9 +910,12 @@ void MultiScreenWorker::onChildSizeChanged() return; QSize dockSize = dockRect(m_ds.current(), position(), HideMode::KeepShowing, displayMode()).size(); - parent()->setFixedSize(dockSize); - parent()->setGeometry(dockRect(m_ds.current())); - parent()->panel()->setFixedSize(dockSize); + parent()->move(dockRect(m_ds.current()).topLeft()); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + parent()->setFixedWidth(dockSize.width()); + else + parent()->setFixedHeight(dockSize.height()); + parent()->panel()->move(0, 0); parent()->panel()->update(); } @@ -1313,9 +1316,11 @@ void MultiScreenWorker::resetDockScreen() /** *注意这里要先对parent()进行setFixedSize,在分辨率切换过程中,setGeometry可能会导致其大小未改变 */ - parent()->setFixedSize(dockRect(m_ds.current()).size()); - parent()->setGeometry(dockRect(m_ds.current())); - parent()->panel()->setFixedSize(dockRect(m_ds.current()).size()); + QRect currentRect = dockRect(m_ds.current()); + QSize dockSize = currentRect.size(); + parent()->setFixedSize(dockSize); + parent()->setGeometry(currentRect); + parent()->panel()->setFixedSize(dockSize); parent()->panel()->move(0, 0); } From 1b179edc55d05b969b502f5e2fbdc4b95824a032 Mon Sep 17 00:00:00 2001 From: Fan PengCheng Date: Tue, 21 Jun 2022 16:25:14 +0800 Subject: [PATCH 048/257] chore: update changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update changelog Log: update changelog Influence: 无 Change-Id: I557c15afb78563900287f91346030d3b0a4df8e3 --- debian/changelog | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index a99107e6b..3f292badf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,14 +1,20 @@ +dde-dock (6.0.1) unstable; urgency=low + + * release Tag 6.0.1 + + -- fanpengcheng Tue, 21 Jun 2022 16:24:49 +0800 + dde-dock (6.0.0.1) unstable; urgency=low * release Tag 6.0.0.1 - -- donghualin Wed, 1 June 2022 21:34:29 +0800 + -- donghualin Wed, 1 Jun 2022 21:34:29 +0800 dde-dock (6.0.0.0) unstable; urgency=low * release Tag 6.0.0.0 - -- donghualin Wed, 1 June 2022 10:11:29 +0800 + -- donghualin Wed, 1 Jun 2022 10:11:29 +0800 dde-dock (3.0.12-1) unstable; urgency=low From 82da556471153778a33e6cbf7ac8f8fe97f21235 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 27 Jun 2022 10:17:43 +0000 Subject: [PATCH 049/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=AD=E5=BF=83=E6=97=A0=E6=B3=95=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=8F=92=E4=BB=B6=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:获取以加载插件接口错误,导致无法获取到正确的插件,引起无法移除 修复:获取正确的插件对象指针,保证插件正确移除 Log: Influence: 从控制中心移除任务栏插件,观察任务栏插件是否正常移除 Bug: https://pms.uniontech.com/task-view-121387.html Change-Id: I0bf44d91de74acba277f76c412955f40b0a7efba --- frame/controller/dockpluginscontroller.cpp | 23 +++++++++++++++++----- frame/controller/dockpluginscontroller.h | 3 +++ frame/controller/proxyplugincontroller.cpp | 17 +++++++++++----- frame/controller/proxyplugincontroller.h | 1 + frame/util/multiscreenworker.cpp | 7 +++++-- frame/window/mainpanelcontrol.cpp | 2 +- 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index 115964a7f..e9dd2b6b2 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -81,7 +81,7 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con void DockPluginsController::itemUpdate(PluginsItemInterface *const itemInter, const QString &itemKey) { - PluginsItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + PluginsItem *item = getPluginItem(itemInter, itemKey); if (!item) return; @@ -92,7 +92,7 @@ void DockPluginsController::itemUpdate(PluginsItemInterface *const itemInter, co void DockPluginsController::itemRemoved(PluginsItemInterface *const itemInter, const QString &itemKey) { - PluginsItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + PluginsItem *item = getPluginItem(itemInter, itemKey); if (!item) return; @@ -116,7 +116,7 @@ void DockPluginsController::itemRemoved(PluginsItemInterface *const itemInter, c void DockPluginsController::requestWindowAutoHide(PluginsItemInterface *const itemInter, const QString &itemKey, const bool autoHide) { - PluginsItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + PluginsItem *item = getPluginItem(itemInter, itemKey); if (!item) return; @@ -125,7 +125,7 @@ void DockPluginsController::requestWindowAutoHide(PluginsItemInterface *const it void DockPluginsController::requestRefreshWindowVisible(PluginsItemInterface *const itemInter, const QString &itemKey) { - PluginsItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + PluginsItem *item = getPluginItem(itemInter, itemKey); if (!item) return; @@ -134,7 +134,7 @@ void DockPluginsController::requestRefreshWindowVisible(PluginsItemInterface *co void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const itemInter, const QString &itemKey, const bool visible) { - PluginsItem *item = static_cast(pluginItemAt(itemInter, itemKey)); + PluginsItem *item = getPluginItem(itemInter, itemKey); if (!item) return; @@ -149,3 +149,16 @@ QMap> &DockPluginsController::p { return ProxyPluginController::instance(PluginType::FixedSystemPlugin)->pluginsMap(); } + +PluginsItem *DockPluginsController::getPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) const +{ + ProxyPluginController *proxyController = ProxyPluginController::instance(itemInter); + if (!proxyController) + return nullptr; + + const QMap> &plugins = proxyController->pluginsMap(); + if (plugins.contains(itemInter) && plugins[itemInter].contains(itemKey)) + return static_cast(plugins[itemInter][itemKey]); + + return nullptr; +} diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index f6aa22138..53143c195 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -49,6 +49,9 @@ public: void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; QMap> &pluginsMap(); +private: + PluginsItem *getPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) const; + signals: void pluginItemInserted(PluginsItem *pluginItem) const; void pluginItemRemoved(PluginsItem *pluginItem) const; diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index 925be4c8c..ba281b758 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -133,14 +133,11 @@ QString ProxyPluginController::itemKey(PluginsItemInterface *itemInter) const void ProxyPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { - m_pluginsItems << itemInter; - m_pluginsItemKeys[itemInter] = itemKey; - + addPluginItems(itemInter, itemKey); // 获取需要加载当前插件的监听者,然后将当前插件添加到监听者 QList validController = getValidController(itemInter); for (AbstractPluginsController *interface : validController) interface->itemAdded(itemInter, itemKey); - } void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) @@ -154,9 +151,10 @@ void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, { // 先获取可执行的controller,再移除,因为在判断当前插件是否加载的时候需要用到当前容器中的插件来获取当前代理 QList validController = getValidController(itemInter); - removePluginItem(itemInter); for (AbstractPluginsController *interface : validController) interface->itemRemoved(itemInter, itemKey); + + removePluginItem(itemInter); } void ProxyPluginController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) @@ -210,6 +208,15 @@ QList ProxyPluginController::getValidController(Plu return validController; } +void ProxyPluginController::addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + if (!m_pluginsItems.contains(itemInter)) + m_pluginsItems << itemInter; + + if (!m_pluginsItemKeys.contains(itemInter)) + m_pluginsItemKeys[itemInter] = itemKey; +} + void ProxyPluginController::removePluginItem(PluginsItemInterface * const itemInter) { if (m_pluginsItems.contains(itemInter)) diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index f84f0ddfa..49e3575c1 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -67,6 +67,7 @@ protected: private: QList getValidController(PluginsItemInterface *itemInter) const; + void addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey); void removePluginItem(PluginsItemInterface * const itemInter); void startLoader(); diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 239dcc0dd..2884d5c1d 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -911,10 +911,13 @@ void MultiScreenWorker::onChildSizeChanged() QSize dockSize = dockRect(m_ds.current(), position(), HideMode::KeepShowing, displayMode()).size(); parent()->move(dockRect(m_ds.current()).topLeft()); - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { parent()->setFixedWidth(dockSize.width()); - else + parent()->panel()->setFixedWidth(dockSize.width()); + } else { parent()->setFixedHeight(dockSize.height()); + parent()->panel()->setFixedHeight(dockSize.height()); + } parent()->panel()->move(0, 0); parent()->panel()->update(); diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 04c3d4415..09b8f19f2 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -1054,7 +1054,7 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const int iconSize = (totalLength - redundantLength) / iconCount; if (m_position == Position::Top || m_position == Position::Bottom) { - iconSize = iconSize < height() ? iconSize : height(); + iconSize = qMin(iconSize, height()); int panelWidth = qMin(iconSize * iconCount + static_cast((m_fixedSpliter->width() + traySuitableSize.width() + 20) / ratio), static_cast(screenSize / deviceRatio)); From c3b956d0dc67aa334c179fcb4788b49d63945a08 Mon Sep 17 00:00:00 2001 From: Fan PengCheng Date: Fri, 24 Jun 2022 16:56:04 +0800 Subject: [PATCH 050/257] chore: update changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update changelog Log: update changelog Influence: 无 Change-Id: I7bc1250403060466875d32e2b9e36fd98c8ec063 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 3f292badf..bdf6bb33e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +dde-dock (6.0.2) unstable; urgency=low + + * release 6.0.2 + + -- fanpengcheng Tue, 21 Jun 2022 16:55:39 +0800 + dde-dock (6.0.1) unstable; urgency=low * release Tag 6.0.1 From 5f4429b3f8106355d9ad91e8573effd2ed66a877 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 28 Jun 2022 09:31:40 +0000 Subject: [PATCH 051/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Ddebian?= =?UTF-8?q?=E6=89=93=E5=8C=85=E4=BD=BF=E7=94=A8AM=E5=AE=8F=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:rule中定义的宏只在CMakeLists.txt文件中生效,在c++代码中不生效 解决方案:在CMakeLists.txt文件中直接定义一个宏来判断是否使用AM,这样c++代码中就可以使用CMakeLists.txt文件中的宏 Log: Influence: 任务栏是否使用AM服务 Task: https://pms.uniontech.com/task-view-133075.html Change-Id: Icea6ac1ac4d86dfc4f4aab040deabe99a9d1d83c --- CMakeLists.txt | 2 ++ debian/rules | 3 +-- frame/item/launcheritem.cpp | 8 +++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b46bbdc35..d208ea282 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,8 @@ endif() file(GLOB INTERFACES "interfaces/*.h") +add_compile_definitions(USE_AM) + #因为单元测试需要直接测试源代码,而主程序代码中include的单元使用了相对路径 #单元测试的CMakeLists和主程序的CMakeLists路径不同,编译单元测试时会提示找不到文件 #因此设置搜索路径 diff --git a/debian/rules b/debian/rules index a23c49052..9fbc0fdc0 100755 --- a/debian/rules +++ b/debian/rules @@ -12,5 +12,4 @@ DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) override_dh_auto_configure: dh_auto_configure -- \ - -DHOST_MULTIARCH="$(DEB_HOST_MULTIARCH)" \ - -DUSE_AM=YES + -DHOST_MULTIARCH="$(DEB_HOST_MULTIARCH)" diff --git a/frame/item/launcheritem.cpp b/frame/item/launcheritem.cpp index f482e3ad6..7e53e310f 100644 --- a/frame/item/launcheritem.cpp +++ b/frame/item/launcheritem.cpp @@ -100,11 +100,17 @@ void LauncherItem::mouseReleaseEvent(QMouseEvent *e) if (e->button() != Qt::LeftButton) return; +#ifdef USE_AM + DDBusSender dbusSender = DDBusSender() + .service("org.deepin.dde.Launcher1") + .path("/org/deepin/dde/Launcher1") + .interface("org.deepin.dde.Launcher1"); +#else DDBusSender dbusSender = DDBusSender() .service("com.deepin.dde.Launcher") .path("/com/deepin/dde/Launcher") .interface("com.deepin.dde.Launcher"); - +#endif QDBusPendingReply visibleReply = dbusSender.property("Visible").get(); if (!visibleReply.value()) dbusSender.method("Show").call(); From d6df41f3bee3cd0c553199663afd56d54f88e446 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 29 Jun 2022 15:57:04 +0000 Subject: [PATCH 052/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=8B=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E8=8F=9C=E5=8D=95=E5=B8=A6=E6=9C=89=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E6=A0=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:原来的QMenu类是在头文件中直接定义的,没有指定parent 解决方案:头文件中定义指针,在cpp文件中创建,并指定parent Log: 修复wayland环境下任务栏菜单显示异常 Influence: wayland下查看任务栏图表的右键菜单 Bug: https://pms.uniontech.com/bug-view-140873.html Change-Id: Ib2792a47877040eed1ad1bae611ebfd79e13b38f --- frame/item/dockitem.cpp | 15 +++++++++++---- frame/item/dockitem.h | 5 +++-- frame/window/mainwindow.cpp | 1 + .../window/tray/widgets/systempluginitem.cpp | 15 ++++++++++----- frame/window/tray/widgets/systempluginitem.h | 5 ++--- plugins/trash/trashwidget.h | 1 - plugins/tray/system-trays/systemtrayitem.cpp | 19 +++++++++++++++---- plugins/tray/system-trays/systemtrayitem.h | 6 +++--- 8 files changed, 45 insertions(+), 22 deletions(-) diff --git a/frame/item/dockitem.cpp b/frame/item/dockitem.cpp index ca7894b80..01dcc8ae5 100644 --- a/frame/item/dockitem.cpp +++ b/frame/item/dockitem.cpp @@ -21,11 +21,13 @@ #include "dockitem.h" #include "pluginsitem.h" +#include "utils.h" #include #include #include #include +#include #define PLUGIN_MARGIN 10 #define ITEM_MAXSIZE 100 @@ -40,6 +42,7 @@ DockItem::DockItem(QWidget *parent) , m_popupShown(false) , m_tapAndHold(false) , m_draging(false) + , m_contextMenu(new QMenu(this)) , m_popupTipsDelayTimer(new QTimer(this)) , m_popupAdjustDelayTimer(new QTimer(this)) { @@ -52,6 +55,10 @@ DockItem::DockItem(QWidget *parent) arrowRectangle->setArrowWidth(18); arrowRectangle->setArrowHeight(10); arrowRectangle->setObjectName("apppopup"); + if (Utils::IS_WAYLAND_DISPLAY) { + Qt::WindowFlags flags = arrowRectangle->windowFlags() | Qt::FramelessWindowHint; + arrowRectangle->setWindowFlags(flags); + } PopupWindow = arrowRectangle; connect(qApp, &QApplication::aboutToQuit, PopupWindow, &DockPopupWindow::deleteLater); } @@ -64,7 +71,7 @@ DockItem::DockItem(QWidget *parent) connect(m_popupTipsDelayTimer, &QTimer::timeout, this, &DockItem::showHoverTips); connect(m_popupAdjustDelayTimer, &QTimer::timeout, this, &DockItem::updatePopupPosition, Qt::QueuedConnection); - connect(&m_contextMenu, &QMenu::triggered, this, &DockItem::menuActionClicked); + connect(m_contextMenu, &QMenu::triggered, this, &DockItem::menuActionClicked); grabGesture(Qt::TapAndHoldGesture); @@ -233,7 +240,7 @@ void DockItem::showContextMenu() QJsonObject jsonMenu = jsonDocument.object(); - qDeleteAll(m_contextMenu.actions()); + qDeleteAll(m_contextMenu->actions()); QJsonArray jsonMenuItems = jsonMenu.value("items").toArray(); for (auto item : jsonMenuItems) { @@ -243,13 +250,13 @@ void DockItem::showContextMenu() action->setChecked(itemObj.value("checked").toBool()); action->setData(itemObj.value("itemId").toString()); action->setEnabled(itemObj.value("isActive").toBool()); - m_contextMenu.addAction(action); + m_contextMenu->addAction(action); } hidePopup(); emit requestWindowAutoHide(false); - m_contextMenu.exec(QCursor::pos()); + m_contextMenu->exec(QCursor::pos()); onContextMenuAccepted(); } diff --git a/frame/item/dockitem.h b/frame/item/dockitem.h index b1b7728c8..f7bb5a0b0 100644 --- a/frame/item/dockitem.h +++ b/frame/item/dockitem.h @@ -28,12 +28,13 @@ #include #include #include -#include #include using namespace Dock; +class QMenu; + class DockItem : public QWidget { Q_OBJECT @@ -111,7 +112,7 @@ protected: bool m_popupShown; bool m_tapAndHold; bool m_draging; - QMenu m_contextMenu; + QMenu *m_contextMenu; QPointer m_lastPopupWidget; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index cfbaf6301..8612418d2 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include diff --git a/frame/window/tray/widgets/systempluginitem.cpp b/frame/window/tray/widgets/systempluginitem.cpp index de53d6f2b..bac7752bd 100644 --- a/frame/window/tray/widgets/systempluginitem.cpp +++ b/frame/window/tray/widgets/systempluginitem.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -36,6 +37,7 @@ SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, cons : BaseTrayWidget(parent) , m_popupShown(false) , m_tapAndHold(false) + , m_contextMenu(new QMenu(this)) , m_pluginInter(pluginInter) , m_centralWidget(m_pluginInter->itemWidget(itemKey)) , m_popupTipsDelayTimer(new QTimer(this)) @@ -67,6 +69,10 @@ SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, cons arrowRectangle->setArrowWidth(18); arrowRectangle->setArrowHeight(10); arrowRectangle->setObjectName("systemtraypopup"); + if (Utils::IS_WAYLAND_DISPLAY) { + Qt::WindowFlags flags = arrowRectangle->windowFlags() | Qt::FramelessWindowHint; + arrowRectangle->setWindowFlags(flags); + } PopupWindow = arrowRectangle; connect(qApp, &QApplication::aboutToQuit, PopupWindow, &DockPopupWindow::deleteLater); } @@ -85,7 +91,7 @@ SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, cons connect(m_popupTipsDelayTimer, &QTimer::timeout, this, &SystemPluginItem::showHoverTips); connect(m_popupAdjustDelayTimer, &QTimer::timeout, this, &SystemPluginItem::updatePopupPosition, Qt::QueuedConnection); - connect(&m_contextMenu, &QMenu::triggered, this, &SystemPluginItem::menuActionClicked); + connect(m_contextMenu, &QMenu::triggered, this, &SystemPluginItem::menuActionClicked); if (m_gsettings) connect(m_gsettings, &QGSettings::changed, this, &SystemPluginItem::onGSettingsChanged); @@ -430,14 +436,13 @@ void SystemPluginItem::showContextMenu() if (menuJson.isEmpty()) return; - QJsonDocument jsonDocument = QJsonDocument::fromJson(menuJson.toLocal8Bit().data()); if (jsonDocument.isNull()) return; QJsonObject jsonMenu = jsonDocument.object(); - qDeleteAll(m_contextMenu.actions()); + qDeleteAll(m_contextMenu->actions()); QJsonArray jsonMenuItems = jsonMenu.value("items").toArray(); for (auto item : jsonMenuItems) { @@ -447,13 +452,13 @@ void SystemPluginItem::showContextMenu() action->setChecked(itemObj.value("checked").toBool()); action->setData(itemObj.value("itemId").toString()); action->setEnabled(itemObj.value("isActive").toBool()); - m_contextMenu.addAction(action); + m_contextMenu->addAction(action); } hidePopup(); emit requestWindowAutoHide(false); - m_contextMenu.exec(QCursor::pos()); + m_contextMenu->exec(QCursor::pos()); onContextMenuAccepted(); } diff --git a/frame/window/tray/widgets/systempluginitem.h b/frame/window/tray/widgets/systempluginitem.h index f9a9ca148..7e1fa28ec 100644 --- a/frame/window/tray/widgets/systempluginitem.h +++ b/frame/window/tray/widgets/systempluginitem.h @@ -27,10 +27,9 @@ #include "pluginsiteminterface.h" #include -#include class QGSettings; -class Menu; +class QMenu; class DockPopupWindow; class SystemPluginItem : public BaseTrayWidget @@ -99,7 +98,7 @@ private: private: bool m_popupShown; bool m_tapAndHold; - QMenu m_contextMenu; + QMenu *m_contextMenu; PluginsItemInterface* m_pluginInter; QWidget *m_centralWidget; diff --git a/plugins/trash/trashwidget.h b/plugins/trash/trashwidget.h index f3acbcdfb..87a7c236f 100644 --- a/plugins/trash/trashwidget.h +++ b/plugins/trash/trashwidget.h @@ -31,7 +31,6 @@ #include #include -#include #include #include diff --git a/plugins/tray/system-trays/systemtrayitem.cpp b/plugins/tray/system-trays/systemtrayitem.cpp index 6dc8ff29b..0ed45632d 100644 --- a/plugins/tray/system-trays/systemtrayitem.cpp +++ b/plugins/tray/system-trays/systemtrayitem.cpp @@ -24,6 +24,7 @@ #include #include +#include #include @@ -34,6 +35,7 @@ SystemTrayItem::SystemTrayItem(PluginsItemInterface *const pluginInter, const QS : AbstractTrayWidget(parent) , m_popupShown(false) , m_tapAndHold(false) + , m_contextMenu(new QMenu) // 此处设置parent有问题,会导致当前菜单显示透明,因此设置parent为nullptr,在析构函数中释放 , m_pluginInter(pluginInter) , m_centralWidget(m_pluginInter->itemWidget(itemKey)) , m_popupTipsDelayTimer(new QTimer(this)) @@ -65,10 +67,18 @@ SystemTrayItem::SystemTrayItem(PluginsItemInterface *const pluginInter, const QS arrowRectangle->setArrowWidth(18); arrowRectangle->setArrowHeight(10); arrowRectangle->setObjectName("systemtraypopup"); + if (Utils::IS_WAYLAND_DISPLAY) { + Qt::WindowFlags flags = arrowRectangle->windowFlags() | Qt::FramelessWindowHint; + arrowRectangle->setWindowFlags(flags); + } PopupWindow = arrowRectangle; connect(qApp, &QApplication::aboutToQuit, PopupWindow, &DockPopupWindow::deleteLater); } + if (Utils::IS_WAYLAND_DISPLAY) { + Qt::WindowFlags flags = m_contextMenu->windowFlags() | Qt::FramelessWindowHint; + m_contextMenu->setWindowFlags(flags); + } // 必须初始化父窗口,否则当主题切换之后再设置父窗口的时候palette会更改为主题切换前的palette if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey)) { w->setParent(PopupWindow.data()); @@ -83,7 +93,7 @@ SystemTrayItem::SystemTrayItem(PluginsItemInterface *const pluginInter, const QS connect(m_popupTipsDelayTimer, &QTimer::timeout, this, &SystemTrayItem::showHoverTips); connect(m_popupAdjustDelayTimer, &QTimer::timeout, this, &SystemTrayItem::updatePopupPosition, Qt::QueuedConnection); - connect(&m_contextMenu, &QMenu::triggered, this, &SystemTrayItem::menuActionClicked); + connect(m_contextMenu, &QMenu::triggered, this, &SystemTrayItem::menuActionClicked); if (m_gsettings) connect(m_gsettings, &QGSettings::changed, this, &SystemTrayItem::onGSettingsChanged); @@ -93,6 +103,7 @@ SystemTrayItem::SystemTrayItem(PluginsItemInterface *const pluginInter, const QS SystemTrayItem::~SystemTrayItem() { + m_contextMenu->deleteLater(); if (m_popupShown) popupWindowAccept(); } @@ -435,7 +446,7 @@ void SystemTrayItem::showContextMenu() QJsonObject jsonMenu = jsonDocument.object(); - qDeleteAll(m_contextMenu.actions()); + qDeleteAll(m_contextMenu->actions()); QJsonArray jsonMenuItems = jsonMenu.value("items").toArray(); for (auto item : jsonMenuItems) { @@ -445,13 +456,13 @@ void SystemTrayItem::showContextMenu() action->setChecked(itemObj.value("checked").toBool()); action->setData(itemObj.value("itemId").toString()); action->setEnabled(itemObj.value("isActive").toBool()); - m_contextMenu.addAction(action); + m_contextMenu->addAction(action); } hidePopup(); emit requestWindowAutoHide(false); - m_contextMenu.exec(QCursor::pos()); + m_contextMenu->exec(QCursor::pos()); onContextMenuAccepted(); } diff --git a/plugins/tray/system-trays/systemtrayitem.h b/plugins/tray/system-trays/systemtrayitem.h index 67d54d727..a33504dbb 100644 --- a/plugins/tray/system-trays/systemtrayitem.h +++ b/plugins/tray/system-trays/systemtrayitem.h @@ -28,10 +28,10 @@ #include "pluginsiteminterface.h" #include -#include class QGSettings; -class Menu; +class QMenu; + class SystemTrayItem : public AbstractTrayWidget { Q_OBJECT @@ -97,7 +97,7 @@ private: private: bool m_popupShown; bool m_tapAndHold; - QMenu m_contextMenu; + QMenu *m_contextMenu; PluginsItemInterface* m_pluginInter; QWidget *m_centralWidget; From 399a8d762059dd951c0a79fad0da6b224dda8125 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 29 Jun 2022 17:31:04 +0000 Subject: [PATCH 053/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=9C=A8=E9=AB=98=E7=BC=A9=E6=94=BE=E7=8E=87?= =?UTF-8?q?=E4=B8=8B=E9=98=B2=E5=91=86=E4=BD=8D=E7=BD=AE=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调用当前类内部的接口来获取当前任务栏所在屏幕的尺寸,来设置区域值,这样保证设置的值是正确的 Log: 修复任务栏在高缩放率下防呆位置错误 Influence: 高缩放率下,查看防呆区域 Change-Id: I1a54b23649c22d8e77ea184ecc03a5917fd1a837 --- frame/util/multiscreenworker.cpp | 35 ++++++++++++++------------------ 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 2884d5c1d..c76540799 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -766,11 +766,6 @@ void MultiScreenWorker::onRequestNotifyWindowManager() qDebug() << "dock real geometry:" << dockGeometry; qDebug() << "screen width:" << DIS_INS->screenRawWidth() << ", height:" << DIS_INS->screenRawHeight(); - QScreen *curentScreen = DIS_INS->screen(m_ds.current()); - // 在把显示器都拔掉后,此时获取到的当前屏幕为空,无需继续处理 - if (!curentScreen) - return; - const qreal &ratio = qApp->devicePixelRatio(); if (Utils::IS_WAYLAND_DISPLAY) { QList varList = {0, 0, 0, 0}; @@ -778,26 +773,26 @@ void MultiScreenWorker::onRequestNotifyWindowManager() case Position::Top: varList[0] = 1; varList[1] = dockGeometry.y() + dockGeometry.height() + WINDOWMARGIN * ratio; - varList[2] = curentScreen->geometry().x(); - varList[3] = curentScreen->geometry().x() + curentScreen->size().width(); + varList[2] = dockGeometry.x(); + varList[3] = dockGeometry.x() + dockGeometry.width(); break; case Position::Bottom: varList[0] = 3; varList[1] = DIS_INS->screenRawHeight() - dockGeometry.y() + WINDOWMARGIN * ratio; - varList[2] = curentScreen->geometry().x(); - varList[3] = curentScreen->geometry().x() + curentScreen->size().width(); + varList[2] = dockGeometry.x(); + varList[3] = dockGeometry.x() + dockGeometry.width(); break; case Position::Left: varList[0] = 0; varList[1] = dockGeometry.x() + dockGeometry.width() + WINDOWMARGIN * ratio; - varList[2] = curentScreen->geometry().y(); - varList[3] = curentScreen->geometry().y() + curentScreen->size().height(); + varList[2] = dockGeometry.y(); + varList[3] = dockGeometry.y() + dockGeometry.height(); break; case Position::Right: varList[0] = 2; varList[1] = DIS_INS->screenRawWidth() - dockGeometry.x() + WINDOWMARGIN * ratio; varList[2] = dockGeometry.y(); - varList[3] = curentScreen->geometry().y() + curentScreen->size().height(); + varList[3] = dockGeometry.y() + dockGeometry.height(); break; } @@ -814,26 +809,26 @@ void MultiScreenWorker::onRequestNotifyWindowManager() case Position::Top: orientation = XcbMisc::OrientationTop; strut = dockGeometry.y() + dockGeometry.height(); - strutStart = curentScreen->geometry().x(); - strutEnd = curentScreen->geometry().x() + curentScreen->size().width(); + strutStart = dockGeometry.x(); + strutEnd = dockGeometry.x() + dockGeometry.width(); break; case Position::Bottom: orientation = XcbMisc::OrientationBottom; strut = DIS_INS->screenRawHeight() - dockGeometry.y(); - strutStart = curentScreen->geometry().x(); - strutEnd = curentScreen->geometry().x() + curentScreen->size().width(); + strutStart = dockGeometry.x(); + strutEnd = dockGeometry.x() + dockGeometry.width(); break; case Position::Left: orientation = XcbMisc::OrientationLeft; strut = dockGeometry.x() + dockGeometry.width(); - strutStart = curentScreen->geometry().y(); - strutEnd = curentScreen->geometry().y() + curentScreen->size().height(); + strutStart = dockGeometry.y(); + strutEnd = dockGeometry.y() + dockGeometry.height(); break; case Position::Right: orientation = XcbMisc::OrientationRight; strut = DIS_INS->screenRawWidth() - dockGeometry.x(); - strutStart = curentScreen->geometry().y(); - strutEnd = curentScreen->geometry().y() + curentScreen->size().height(); + strutStart = dockGeometry.y(); + strutEnd = dockGeometry.y() + dockGeometry.height(); break; } From 71a12bb770c5d20483abbca3af277015cd75612e Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 30 Jun 2022 16:02:37 +0800 Subject: [PATCH 054/257] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=90=AF=E5=8A=A8=E6=97=B6=E5=80=99=E7=94=A8?= =?UTF-8?q?ldd=E6=A3=80=E6=B5=8Blibdtk=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v23版本无须检测,删除dtk库的检测,防止在启动的时候出现错误信息 Log: 优化任务栏启动 Influence: 任务栏启动的时候检测是否有ldd报错信息 Task: https://pms.uniontech.com/task-view-157235.html Change-Id: I51e229a46a46c8a745e5db59b4e1902fb74c15f2 --- frame/util/pluginloader.cpp | 108 +----------------------------------- frame/util/pluginloader.h | 4 -- 2 files changed, 1 insertion(+), 111 deletions(-) diff --git a/frame/util/pluginloader.cpp b/frame/util/pluginloader.cpp index 93533b5b3..35a6cd166 100644 --- a/frame/util/pluginloader.cpp +++ b/frame/util/pluginloader.cpp @@ -51,8 +51,6 @@ void PluginLoader::run() const QStringList disable_plugins_list = getDisablePluginList(); - const QString dtkCoreName = dtkCoreFileName(); - QStringList plugins; // 查找可用插件 @@ -72,117 +70,13 @@ void PluginLoader::run() qDebug() << "disable loading plugin:" << file; continue; } - // 判断当前进程加载的dtkcore库是否和当前库加载的dtkcore的库为同一个,如果不同,则无需加载, - // 否则在加载dtkcore的时候会报错(dtkcore内部判断如果加载两次会抛出错误) - QString libUsedDtkCore = libUsedDtkCoreFileName(pluginsDir.absoluteFilePath(file)); - if (!libUsedDtkCore.isEmpty() && libUsedDtkCore != dtkCoreName) - continue; plugins << file; } + for (auto plugin : plugins) { emit pluginFounded(pluginsDir.absoluteFilePath(plugin)); } emit finished(); } - -/** - * @brief 获取当前进程使用的dtkcore库的文件名 - * @return 当前进程使用的dtkCore库的文件名 - */ -QString PluginLoader::dtkCoreFileName() -{ - QFile f("/proc/self/maps"); - if (!f.open(QIODevice::ReadOnly)) - return QString(); - - const QByteArray &data = f.readAll(); - QTextStream ts(data); - while (Q_UNLIKELY(!ts.atEnd())) { - const QString line = ts.readLine(); - const QStringList &maps = line.split(' ', QString::SplitBehavior::SkipEmptyParts); - if (Q_UNLIKELY(maps.size() < 6)) - continue; - - QFileInfo info(maps.value(5)); - QString infoAbPath = info.absoluteFilePath(); - if (info.fileName().contains("dtkcore")) { - infoAbPath = realFileName(infoAbPath); - if (infoAbPath.contains("/")) { - int pathIndex = infoAbPath.lastIndexOf("/"); - infoAbPath = infoAbPath.mid(pathIndex + 1).trimmed(); - } - - f.close(); - return infoAbPath; - } - } - - f.close(); - return QString(); -} - -/** - * @brief 返回某个so库使用的dtkcore库文件名 - * @param 用于获取dtkcore库的so库文件名 - * @return 返回使用的dtkcore库文件名 - */ -QString PluginLoader::libUsedDtkCoreFileName(const QString &fileName) -{ - QString lddCommand = QString("ldd -r %1").arg(fileName); - FILE *fp = popen(lddCommand.toLocal8Bit().data(), "r"); - if (fp) { - char buf[2000] = {0}; - while (fgets(buf, sizeof(buf), fp)) { - QString rowResult = buf; - rowResult = rowResult.trimmed(); - if (rowResult.contains("dtkcore")) { - QStringList coreSplits = rowResult.split("=>"); - if (coreSplits.size() < 2) - continue; - - pclose(fp); - QString dtkCorePath = coreSplits[1]; - - // 删除后面的括号的内容 - int addrIndex = dtkCorePath.indexOf("(0x"); - dtkCorePath = realFileName(dtkCorePath.left(addrIndex).trimmed()); - if (dtkCorePath.contains("/")) { - int pathIndex = dtkCorePath.lastIndexOf("/"); - dtkCorePath = dtkCorePath.mid(pathIndex + 1).trimmed(); - } - - return dtkCorePath; - } - } - pclose(fp); - } - return QString(); -} - -/** - * @brief 返回软连接对应的实际的文件名 - * @param 当前软连接的文件名 - * @return 软连接对应的库的实际的文件名 - */ -QString PluginLoader::realFileName(QString fileName) -{ - QString command = QString("ls %1 -al").arg(fileName); - FILE *fp = popen(command.toLocal8Bit().data(), "r"); - if (fp) { - char buf[2000] = {0}; - if (fgets(buf, sizeof(buf), fp)) { - QString rowInfo = buf; - if (rowInfo.contains("->")) { - pclose(fp); - QStringList fileInfos = rowInfo.split("->"); - QString srcFileName = fileInfos[1]; - srcFileName = srcFileName.trimmed(); - return srcFileName; - } - } - pclose(fp); - } - return fileName; -} diff --git a/frame/util/pluginloader.h b/frame/util/pluginloader.h index 97031772d..00d6dc945 100644 --- a/frame/util/pluginloader.h +++ b/frame/util/pluginloader.h @@ -38,10 +38,6 @@ signals: protected: void run(); - QString dtkCoreFileName(); - QString libUsedDtkCoreFileName(const QString &fileName); - QString realFileName(QString fileName); // 获取软连接的真实文件的路径 - private: QString m_pluginDirPath; }; From 0dfb004ac0c0dcd201970705b873e1f84b92fa9a Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 8 Jul 2022 11:38:45 +0800 Subject: [PATCH 055/257] =?UTF-8?q?feat:=20=E6=9A=82=E6=97=B6=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E4=BD=BF=E7=94=A8AM=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 适配启动器,先暂时取消使用AM宏,保证先正常使用 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-162227.html Change-Id: I9dcf089bf361f932cd82e40bc19892d9a74b70e7 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d208ea282..9f8c914dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,7 @@ endif() file(GLOB INTERFACES "interfaces/*.h") -add_compile_definitions(USE_AM) +#add_compile_definitions(USE_AM) #因为单元测试需要直接测试源代码,而主程序代码中include的单元使用了相对路径 #单元测试的CMakeLists和主程序的CMakeLists路径不同,编译单元测试时会提示找不到文件 From a4172e676320dc5e2418393179e276756e24efb5 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 8 Jul 2022 09:05:54 +0000 Subject: [PATCH 056/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=9C=80?= =?UTF-8?q?=E8=BF=91=E4=BD=BF=E7=94=A8=E5=BA=94=E7=94=A8=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在MainPanelControl面板中增加一块区域,用来存放最近打开应用 Log: 增加最近使用应用功能 Influence: 控制中心最近使用区域开启情况下,时尚模式,打开一个没有驻留在任务栏的应用,查看新打开的应用是否在最近打开应用区域 Task: https://pms.uniontech.com/task-view-158441.html Change-Id: Ibd28d16b08fcacf7ace23158725dd5dd2eae8d37 --- frame/controller/recentapphelper.cpp | 318 +++++++++++++++++++++++++++ frame/controller/recentapphelper.h | 82 +++++++ frame/item/appitem.cpp | 21 ++ frame/item/appitem.h | 5 + frame/item/dockitem.h | 15 +- frame/window/mainpanelcontrol.cpp | 161 +++++++++----- frame/window/mainpanelcontrol.h | 21 +- frame/window/systempluginwindow.h | 2 + 8 files changed, 556 insertions(+), 69 deletions(-) create mode 100644 frame/controller/recentapphelper.cpp create mode 100644 frame/controller/recentapphelper.h diff --git a/frame/controller/recentapphelper.cpp b/frame/controller/recentapphelper.cpp new file mode 100644 index 000000000..e6777a14e --- /dev/null +++ b/frame/controller/recentapphelper.cpp @@ -0,0 +1,318 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#include "recentapphelper.h" +#include "appitem.h" + +#include + +RecentAppHelper::RecentAppHelper(QWidget *appWidget, QWidget *recentWidget, QObject *parent) + : QObject(parent) + , m_appWidget(appWidget) + , m_recentWidget(recentWidget) +{ + m_appWidget->installEventFilter(this); + m_recentWidget->installEventFilter(this); +} + +void RecentAppHelper::setDisplayMode(Dock::DisplayMode displayMode) +{ + m_dislayMode = displayMode; + resetDockItems(); + updateRecentVisible(); +} + +// 当在应用区域调整位置的时候,需要重新设置索引 +void RecentAppHelper::resetAppInfo() +{ + // 获取应用区域和最近打开区域的app图标 + QList appDockItem = dockItems(false); + + // 获取应用区域图标在原来列表中的位置 + QList dockIndex; + for (DockItem *appItem : appDockItem) + dockIndex << m_sequentDockItems.indexOf(appItem); + + // 按照从小到大排序 + std::sort(dockIndex.begin(), dockIndex.end(), [ = ](int index1, int index2) { return index1 < index2; }); + QMap dockItemIndex; + for (int i = 0; i < appDockItem.size(); i++) { + DockItem *item = appDockItem[i]; + dockItemIndex[item] = dockIndex[i]; + } + + // 替换原来的位置 + for (DockItem *appItem : appDockItem) { + int index = -1; + if (dockItemIndex.contains(appItem)) + index = dockItemIndex.value(appItem); + + if (index >= 0) + m_sequentDockItems[index] = appItem; + else + m_sequentDockItems << appItem; + } +} + +void RecentAppHelper::addAppItem(int index, DockItem *dockItem) +{ + if (appInRecent(dockItem)) + addRecentAreaItem(index, dockItem); + else + addAppAreaItem(index, dockItem); + + updateRecentVisible(); + + connect(dockItem, &QWidget::destroyed, this, [ this, dockItem ] { + if (m_sequentDockItems.contains(dockItem)) + m_sequentDockItems.removeOne(dockItem); + }); + + AppItem *appItem = qobject_cast(dockItem); + connect(appItem, &AppItem::isDockChanged, this, &RecentAppHelper::onIsDockChanged); + + // 如果索引值大于0,说明它是插入到固定位置的,否则,则认为它是顺序排列的 + if (index >= 0 && index < m_sequentDockItems.size()) + m_sequentDockItems.insert(index, dockItem); + else + m_sequentDockItems << dockItem; +} + +void RecentAppHelper::removeAppItem(DockItem *appItem) +{ + if (appInRecent(appItem)) + removeRecentAreaItem(appItem); + else + removeAppAreaItem(appItem); +} + +bool RecentAppHelper::recentIsVisible() const +{ + return m_recentWidget->isVisible(); +} + +bool RecentAppHelper::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_appWidget || watched == m_recentWidget) { + switch(event->type()) { + case QEvent::ChildAdded: + case QEvent::ChildRemoved: { + QMetaObject::invokeMethod(this, [ this ] { + /* 这里用异步的方式,因为收到QEvent::ChildAdded信号的时候, + 此时应用还没有插入到Widget中,收到QEvent::ChildRemoved信号的时候, + 此时应用还未从任务栏上移除,通过异步的方式保证同步新增或移除成功后才执行,这样更新的界面才是最准确的 + */ + Q_EMIT requestUpdate(); + }, Qt::QueuedConnection); + } + break; + default: + break; + } + } + + return QObject::eventFilter(watched, event); +} + +void RecentAppHelper::onIsDockChanged() +{ + resetDockItems(); + updateRecentVisible(); +} + +bool RecentAppHelper::appInRecent(DockItem *item) const +{ + // 先判断当前是否为时尚模式,只有时尚模式下才支持最近打开的应用 + if (m_dislayMode != Dock::DisplayMode::Fashion) + return false; + + // TODO 当控制中心不开启最近打开应用的功能的时候,则始终让其显示在应用区域 + + // 只有当应用没有固定到任务栏上才认为它是最新打开的应用 + AppItem *appItem = qobject_cast(item); + return (appItem && !appItem->isDocked()); +} + +void RecentAppHelper::addAppAreaItem(int index, DockItem *wdg) +{ + QBoxLayout *boxLayout = static_cast(m_appWidget->layout()); + boxLayout->insertWidget(index, wdg); +} + +void RecentAppHelper::addRecentAreaItem(int index, DockItem *wdg) +{ + QBoxLayout *recentLayout = static_cast(m_recentWidget->layout()); + recentLayout->insertWidget(index, wdg); +} + +void RecentAppHelper::updateRecentVisible() +{ + bool oldVisible = recentIsVisible(); + + if (m_dislayMode == Dock::DisplayMode::Efficient) { + // 如果是高效模式,不显示最近打开应用区域 + m_recentWidget->setVisible(false); + } else { + QBoxLayout *recentLayout = static_cast(m_recentWidget->layout()); + qInfo() << "recent Widget count:" << recentLayout->count(); + // 如果是特效模式,则判断当前打开应用数量是否为0,为0则不显示,否则显示 + m_recentWidget->setVisible(recentLayout->count() > 0); + } + + bool recentVisible = recentIsVisible(); + if (oldVisible != recentVisible) + Q_EMIT recentVisibleChanged(recentVisible); +} + +void RecentAppHelper::removeRecentAreaItem(DockItem *wdg) +{ + QBoxLayout *recentLayout = static_cast(m_recentWidget->layout()); + recentLayout->removeWidget(wdg); + updateRecentVisible(); +} + +void RecentAppHelper::removeAppAreaItem(DockItem *wdg) +{ + QBoxLayout *boxLayout = static_cast(m_appWidget->layout()); + boxLayout->removeWidget(wdg); +} + +QList RecentAppHelper::dockItemToAppArea() const +{ + QList dockItems; + if (m_dislayMode == Dock::DisplayMode::Efficient) { + // 由特效模式变成高效模式,将所有的最近打开的应用移动到左侧的应用区域 + for (int i = 0; i < m_recentWidget->layout()->count(); i++) { + DockItem *appItem = qobject_cast(m_recentWidget->layout()->itemAt(i)->widget()); + if (!appItem) + continue; + + dockItems << appItem; + } + } else { + // 如果是特效模式下,则查找所有已驻留的应用,将其移动到应用区域 + for (int i = 0; i < m_recentWidget->layout()->count(); i++) { + DockItem *appItem = qobject_cast(m_recentWidget->layout()->itemAt(i)->widget()); + if (!appItem || appInRecent(appItem)) + continue; + + dockItems << appItem; + } + } + + return dockItems; +} + +void RecentAppHelper::resetDockItems() +{ + // 先将所有的最近打开的区域移动到应用区域 + QList recentAppItems = dockItemToAppArea(); + + // 从最近使用应用中移除 + for (DockItem *appItem : recentAppItems) + m_recentWidget->layout()->removeWidget(appItem); + + // 将这些图标添加到应用区域 + QBoxLayout *boxLayout = static_cast(m_appWidget->layout()); + for (DockItem *appItem : recentAppItems) { + int index = getDockItemIndex(appItem, false); + if (index >= 0) + boxLayout->insertWidget(index, appItem); + else + boxLayout->addWidget(appItem); + } + + if (m_dislayMode == Dock::DisplayMode::Fashion) { + // 由高效模式变成特效模式后,将左侧未驻留的应用移动到右侧的最近打开应用中 + QList unDockItems; + for (int i = 0; i < m_appWidget->layout()->count() ; i++) { + DockItem *appItem = qobject_cast(m_appWidget->layout()->itemAt(i)->widget()); + if (!appInRecent(appItem)) + continue; + + unDockItems << appItem; + } + + // 从应用区域中删除未驻留的应用 + for (DockItem *appItem : unDockItems) + m_appWidget->layout()->removeWidget(appItem); + + // 将这些图标添加到最近打开区域 + QBoxLayout *recentLayout = static_cast(m_recentWidget->layout()); + for (DockItem *appItem : unDockItems) { + int index = getDockItemIndex(appItem, true); + if (index >= 0) + recentLayout->insertWidget(index, appItem); + else + recentLayout->addWidget(appItem); + } + } +} + +int RecentAppHelper::getDockItemIndex(DockItem *dockItem, bool isRecent) const +{ + // 当从最近区域移动到应用区域的时候,重新计算插入索引值 + if (!m_sequentDockItems.contains(dockItem)) + return -1; + + QList sequeDockItems = m_sequentDockItems; + if (isRecent) { + // 如果是最近打开区域,需要按照时间从小到大排列(先打开的排在前面) + std::sort(sequeDockItems.begin(), sequeDockItems.end(), [](DockItem *item1, DockItem *item2) { + AppItem *appItem1 = qobject_cast(item1); + AppItem *appItem2 = qobject_cast(item2); + if (!appItem1 || !appItem2) + return false; + + return appItem1->appOpenMSecs() < appItem2->appOpenMSecs(); + }); + } + int index = sequeDockItems.indexOf(dockItem); + // 查找所有在应用区域的图标 + QList dockApps = dockItems(isRecent); + for (int i = index + 1; i < sequeDockItems.size(); i++) { + DockItem *item = sequeDockItems[i]; + if (dockApps.contains(item)) + return dockApps.indexOf(item); + } + + return -1; +} + +QList RecentAppHelper::dockItems(bool isRecent) const +{ + QLayout *layout = nullptr; + if (isRecent) + layout = m_recentWidget->layout(); + else + layout = m_appWidget->layout(); + + QList dockItems; + for (int i = 0; i < layout->count(); i++) { + DockItem *dockItem = qobject_cast(layout->itemAt(i)->widget()); + if (!dockItem) + continue; + + dockItems << dockItem; + } + + return dockItems; +} diff --git a/frame/controller/recentapphelper.h b/frame/controller/recentapphelper.h new file mode 100644 index 000000000..e0d1b0702 --- /dev/null +++ b/frame/controller/recentapphelper.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef RECENTAPPHELPER_H +#define RECENTAPPHELPER_H + +#include "constants.h" + +#include + +class DockItem; +class QWidget; + +/** 用来管理最近打开区域和APP应用区域交互的类 + * @brief The RecentAppManager class + */ + +class RecentAppHelper : public QObject +{ + Q_OBJECT + +public: + explicit RecentAppHelper(QWidget *appWidget, QWidget *recentWidget, QObject *parent = nullptr); + void setDisplayMode(Dock::DisplayMode displayMode); + void resetAppInfo(); + void addAppItem(int index, DockItem *appItem); + void removeAppItem(DockItem *appItem); + bool recentIsVisible() const; + +Q_SIGNALS: + void requestUpdate(); + void recentVisibleChanged(bool); // 最近区域是否可见发生变化的信号 + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + +private: + bool appInRecent(DockItem *item) const; + void addAppAreaItem(int index, DockItem *wdg); + void addRecentAreaItem(int index, DockItem *wdg); + void updateRecentVisible(); + + void removeRecentAreaItem(DockItem *wdg); + void removeAppAreaItem(DockItem *wdg); + + QList dockItemToAppArea() const; + void resetDockItems(); + int getDockItemIndex(DockItem *dockItem, bool isRecent) const; + + QList dockItems(bool isRecent) const; + +private Q_SLOTS: + void onIsDockChanged(); + +private: + QWidget *m_appWidget; + QWidget *m_recentWidget; + + QList m_sequentDockItems; + + Dock::DisplayMode m_dislayMode; +}; + +#endif // RECENTAPPHELPER_H diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 5040480f0..3ddd8529c 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -69,6 +69,7 @@ AppItem::AppItem(const QGSettings *appSettings, const QGSettings *activeAppSetti , m_retryObtainIconTimer(new QTimer(this)) , m_refershIconTimer(new QTimer(this)) , m_themeType(DGuiApplicationHelper::instance()->themeType()) + , m_createMSecs(QDateTime::currentMSecsSinceEpoch()) { QHBoxLayout *centralLayout = new QHBoxLayout; centralLayout->setMargin(0); @@ -94,6 +95,7 @@ AppItem::AppItem(const QGSettings *appSettings, const QGSettings *activeAppSetti connect(m_itemEntryInter, &DockEntryInter::IsActiveChanged, this, static_cast(&AppItem::update)); connect(m_itemEntryInter, &DockEntryInter::WindowInfosChanged, this, &AppItem::updateWindowInfos, Qt::QueuedConnection); connect(m_itemEntryInter, &DockEntryInter::IconChanged, this, &AppItem::refreshIcon); + connect(m_itemEntryInter, &DockEntryInter::IsDockedChanged, this, &AppItem::isDockChanged); connect(m_updateIconGeometryTimer, &QTimer::timeout, this, &AppItem::updateWindowIconGeometries, Qt::QueuedConnection); connect(m_retryObtainIconTimer, &QTimer::timeout, this, &AppItem::refreshIcon, Qt::QueuedConnection); @@ -185,6 +187,21 @@ QString AppItem::accessibleName() return m_itemEntryInter->name(); } +void AppItem::requestDock() +{ + m_itemEntryInter->RequestDock(); +} + +bool AppItem::isDocked() const +{ + return m_itemEntryInter->isDocked(); +} + +qint64 AppItem::appOpenMSecs() const +{ + return m_createMSecs; +} + void AppItem::moveEvent(QMoveEvent *e) { DockItem::moveEvent(e); @@ -564,6 +581,10 @@ QPoint AppItem::appIconPosition() const void AppItem::updateWindowInfos(const WindowInfoMap &info) { + // 如果是打开第一个窗口,则更新窗口时间 + if (m_windowInfos.isEmpty() && !info.isEmpty()) + m_createMSecs = QDateTime::currentMSecsSinceEpoch(); + m_windowInfos = info; if (m_appPreviewTips) m_appPreviewTips->setWindowInfos(m_windowInfos, m_itemEntryInter->GetAllowedCloseWindows().value()); diff --git a/frame/item/appitem.h b/frame/item/appitem.h index 69c556b64..de95780d8 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -56,6 +56,9 @@ public: inline ItemType itemType() const override { return App; } QPixmap appIcon(){ return m_appIcon; } virtual QString accessibleName() override; + void requestDock(); + bool isDocked() const; + qint64 appOpenMSecs() const; signals: void requestActivateWindow(const WId wid) const; @@ -64,6 +67,7 @@ signals: void dragReady(QWidget *dragWidget); void requestUpdateEntryGeometries() const; + void isDockChanged(bool) const; private: void moveEvent(QMoveEvent *e) override; @@ -139,6 +143,7 @@ private: QDate m_curDate; // 保存当前icon的日期来判断是否需要更新日历APP的ICON DGuiApplicationHelper::ColorType m_themeType; + qint64 m_createMSecs; static QPoint MousePressPos; }; diff --git a/frame/item/dockitem.h b/frame/item/dockitem.h index f7bb5a0b0..922a9c38c 100644 --- a/frame/item/dockitem.h +++ b/frame/item/dockitem.h @@ -41,13 +41,14 @@ class DockItem : public QWidget public: enum ItemType { - Launcher, - App, - Plugins, - FixedPlugin, + Launcher, // 启动器 + App, // 任务栏区域的应用 + Plugins, // 插件区域图标 + FixedPlugin, // 固定区域图标,例如多任务试图 Placeholder, - TrayPlugin, - QuickSettingPlugin + TrayPlugin, // 托盘插件 + QuickSettingPlugin, // 快捷设置区域插件 + StretchPlugin // 时尚模式下的固定在最右侧的插件,例如开关机插件 }; public: @@ -57,7 +58,7 @@ public: static void setDockPosition(const Position side); static void setDockDisplayMode(const DisplayMode mode); - inline virtual ItemType itemType() const {return App;} + inline virtual ItemType itemType() const = 0; QSize sizeHint() const override; virtual QString accessibleName(); diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 09b8f19f2..ee40b24e3 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -34,6 +34,7 @@ #include "traymanagerwindow.h" #include "multiscreenworker.h" #include "displaymanager.h" +#include "recentapphelper.h" #include #include @@ -84,16 +85,19 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_trayAreaLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_traySpliter(new QLabel(this)) , m_pluginAreaWidget(new QWidget(this)) + , m_recentAreaWidget(new QWidget(this)) + , m_recentLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_trayManagerWidget(new TrayManagerWindow(this)) , m_pluginLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_desktopWidget(new DesktopWidget(this)) , m_position(Position::Bottom) , m_placeholderItem(nullptr) , m_appDragWidget(nullptr) - , m_dislayMode(Efficient) + , m_displayMode(Efficient) , m_tray(nullptr) , m_trashItem(nullptr) , m_dockScreen(nullptr) + , m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, this)) { initUI(); initConnection(); @@ -107,11 +111,11 @@ MainPanelControl::MainPanelControl(QWidget *parent) m_trayAreaWidget->installEventFilter(this); m_pluginAreaWidget->installEventFilter(this); - //在设置每条线大小前,应该设置fixedsize(0,0) - //应为paintEvent函数会先调用设置背景颜色,大小为随机值 - m_fixedSpliter->setFixedSize(0,0); - m_appSpliter ->setFixedSize(0,0); - m_traySpliter->setFixedSize(0,0); + // 在设置每条线大小前,应该设置fixedsize(0,0) + // 应为paintEvent函数会先调用设置背景颜色,大小为随机值 + m_fixedSpliter->setFixedSize(0, 0); + m_appSpliter ->setFixedSize(0, 0); + m_traySpliter->setFixedSize(0, 0); } void MainPanelControl::initUI() @@ -137,6 +141,14 @@ void MainPanelControl::initUI() m_appSpliter->setObjectName("spliter_app"); m_mainPanelLayout->addWidget(m_appSpliter); + /* 最近打开应用 */ + m_recentAreaWidget->setObjectName("recentarea"); + m_recentAreaWidget->setAccessibleName("recentarea"); + m_recentAreaWidget->setLayout(m_recentLayout); + m_recentLayout->setSpacing(0); + m_recentLayout->setContentsMargins(0, 0, 0, 0); + m_mainPanelLayout->addWidget(m_recentAreaWidget); + /* 托盘区域 */ m_trayAreaWidget->setObjectName("trayarea"); m_trayAreaWidget->setLayout(m_trayAreaLayout); @@ -154,6 +166,7 @@ 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); @@ -171,6 +184,8 @@ void MainPanelControl::initUI() void MainPanelControl::initConnection() { connect(m_trayManagerWidget, &TrayManagerWindow::requestUpdate, this, &MainPanelControl::onRequestUpdate); + connect(m_recentHelper, &RecentAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate); + connect(m_recentHelper, &RecentAppHelper::recentVisibleChanged, this, &MainPanelControl::onRecentVisibleChanged); } /** @@ -179,10 +194,11 @@ void MainPanelControl::initConnection() */ void MainPanelControl::setDisplayMode(DisplayMode dislayMode) { - if (dislayMode == m_dislayMode) + if (dislayMode == m_displayMode) return; - m_dislayMode = dislayMode; + m_displayMode = dislayMode; + m_recentHelper->setDisplayMode(dislayMode); updateDisplayMode(); } @@ -204,6 +220,7 @@ void MainPanelControl::updateMainPanelLayout() m_pluginLayout->setDirection(QBoxLayout::LeftToRight); m_trayAreaLayout->setDirection(QBoxLayout::LeftToRight); m_appAreaSonLayout->setDirection(QBoxLayout::LeftToRight); + m_recentLayout->setDirection(QBoxLayout::LeftToRight); m_trayAreaLayout->setContentsMargins(0, 10, 0, 10); m_pluginLayout->setContentsMargins(10, 0, 10, 0); break; @@ -219,6 +236,7 @@ void MainPanelControl::updateMainPanelLayout() m_pluginLayout->setDirection(QBoxLayout::TopToBottom); m_trayAreaLayout->setDirection(QBoxLayout::TopToBottom); m_appAreaSonLayout->setDirection(QBoxLayout::TopToBottom); + m_recentLayout->setDirection(QBoxLayout::TopToBottom); m_trayAreaLayout->setContentsMargins(10, 0, 10, 0); m_pluginLayout->setContentsMargins(0, 10, 0, 10); break; @@ -247,22 +265,6 @@ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg) Q_EMIT requestUpdate(); } -/**往应用区域添加应用 - * @brief MainPanelControl::addAppAreaItem - * @param index 位置索引,如果为负数则插入到最后,为正则插入到指定位置 - * @param wdg 应用指针对象 - */ -void MainPanelControl::addAppAreaItem(int index, QWidget *wdg) -{ - if(m_position == Position::Top || m_position == Position::Bottom){ - wdg->setMaximumSize(height(),height()); - } else { - wdg->setMaximumSize(width(),width()); - } - m_appAreaSonLayout->insertWidget(index, wdg); - Q_EMIT requestUpdate(); -} - /**往托盘插件区域添加应用 * @brief MainPanelControl::addTrayAreaItem * @param index 位置索引,如果为负数则插入到最后,为正则插入到指定位置 @@ -330,8 +332,8 @@ void MainPanelControl::removeTrayAreaItem(QWidget *wdg) */ void MainPanelControl::removePluginAreaItem(QWidget *wdg) { - //因为日期时间插件大小和其他插件有异,为了方便设置边距,各插件中增加一层布局 - //因此remove插件图标时,需要从多的一层布局中取widget进行判断是否需要移除的插件 + // 因为日期时间插件大小和其他插件有异,为了方便设置边距,各插件中增加一层布局 + // 因此remove插件图标时,需要从多的一层布局中取widget进行判断是否需要移除的插件 // 清空保存的垃圾箱插件指针 PluginsItem *pluginsItem = qobject_cast(wdg); if (pluginsItem && pluginsItem->pluginName() == "trash") @@ -351,9 +353,9 @@ void MainPanelControl::removePluginAreaItem(QWidget *wdg) void MainPanelControl::resizeEvent(QResizeEvent *event) { - //先通过消息循环让各部件调整好size后再计算图标大小 - //避免因为部件size没有调整完导致计算的图标大小不准确 - //然后重复触发m_pluginAreaWidget的reszie事件并重复计算,造成任务栏图标抖动问题 + // 先通过消息循环让各部件调整好size后再计算图标大小 + // 避免因为部件size没有调整完导致计算的图标大小不准确 + // 然后重复触发m_pluginAreaWidget的reszie事件并重复计算,造成任务栏图标抖动问题 QWidget::resizeEvent(event); resizeDesktopWidget(); resizeDockIcon(); @@ -367,21 +369,43 @@ void MainPanelControl::resetRadius() qApp->setProperty("EffectBorderRadius", radius); } +/** 当用户从最近使用区域拖动应用到左侧应用区域的时候,将该应用驻留 + * @brief MainPanelControl::dockRecentApp + * @param dockItem + */ +void MainPanelControl::dockRecentApp(DockItem *dockItem) +{ + // 如果当前不是特效模式,则无需做驻留操作 + if (m_displayMode != Dock::DisplayMode::Fashion) + return; + + AppItem *appItem = qobject_cast(dockItem); + if (!appItem) + return; + + // TODO 如果控制中心设置不开启最近应用,则不让其驻留 + + // 如果控制中心开启了最近应用并且当前应用是未驻留应用,则可以驻留 + if (!appItem->isDocked()) + appItem->requestDock(); +} + /**根据任务栏所在位置, 设置应用区域控件的大小 * @brief MainPanelControl::updateAppAreaSonWidgetSize */ void MainPanelControl::updateAppAreaSonWidgetSize() { if ((m_position == Position::Top) || (m_position == Position::Bottom)) { - m_appAreaSonWidget->setMaximumHeight(this->height()); + m_appAreaSonWidget->setMaximumHeight(height()); m_appAreaSonWidget->setMaximumWidth(m_appAreaWidget->width()); + m_recentAreaWidget->setFixedHeight(height()); } else { - m_appAreaSonWidget->setMaximumWidth(this->width()); + m_appAreaSonWidget->setMaximumWidth(width()); m_appAreaSonWidget->setMaximumHeight(m_appAreaWidget->height()); + m_recentAreaWidget->setFixedWidth(width()); } m_appAreaSonWidget->adjustSize(); - moveAppSonWidget(); } @@ -422,7 +446,7 @@ void MainPanelControl::insertItem(int index, DockItem *item) break; case DockItem::App: case DockItem::Placeholder: - addAppAreaItem(index, item); + m_recentHelper->addAppItem(index, item); break; case DockItem::TrayPlugin: // 此处只会有一个tray系统托盘插件,微信、声音、网络蓝牙等等,都在系统托盘插件中处理的 addTrayAreaItem(index, item); @@ -454,7 +478,7 @@ void MainPanelControl::removeItem(DockItem *item) break; case DockItem::App: case DockItem::Placeholder: - removeAppAreaItem(item); + m_recentHelper->removeAppItem(item); break; case DockItem::TrayPlugin: removeTrayAreaItem(item); @@ -538,6 +562,7 @@ void MainPanelControl::dragLeaveEvent(QDragLeaveEvent *e) removeAppAreaItem(m_placeholderItem); m_placeholderItem->deleteLater(); + m_placeholderItem = nullptr; } } @@ -675,7 +700,7 @@ bool MainPanelControl::eventFilter(QObject *watched, QEvent *event) // NormalContainer部件尺寸变化完成之前就已经结束,导致 // NormalContainer没有更新自己的尺寸,引起插件区域拥挤 if (m_tray && watched == m_tray && event->type() == QEvent::Resize) - m_tray->pluginItem()->displayModeChanged(m_dislayMode); + m_tray->pluginItem()->displayModeChanged(m_displayMode); // 更新应用区域大小和任务栏图标大小 if (watched == m_appAreaSonWidget) { @@ -793,12 +818,17 @@ void MainPanelControl::startDrag(DockItem *dockItem) connect(m_appDragWidget, &AppDragWidget::destroyed, this, [ = ] { m_appDragWidget = nullptr; if (!item.isNull() && qobject_cast(item)->isValid()) { + // 如果是从最近打开区域移动到应用区域的,则需要将其固定 + dockRecentApp(item); if (-1 == m_appAreaSonLayout->indexOf(item) && m_dragIndex != -1) { insertItem(m_dragIndex, item); m_dragIndex = -1; } item->setDraging(false); item->update(); + + // 发送拖拽完成事件 + m_recentHelper->resetAppInfo(); } }); @@ -921,13 +951,12 @@ void MainPanelControl::updateDisplayMode() 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); + m_trayAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); + m_traySpliter->setVisible(m_displayMode == DisplayMode::Efficient); + m_pluginAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); + m_trayManagerWidget->setVisible(m_displayMode != DisplayMode::Efficient); if (m_tray) - m_tray->setVisible(m_dislayMode == DisplayMode::Efficient); + m_tray->setVisible(m_displayMode == DisplayMode::Efficient); } /**把驻留应用和被打开的应用所在窗口移动到指定位置 @@ -936,7 +965,7 @@ void MainPanelControl::updateModeChange() void MainPanelControl::moveAppSonWidget() { QRect rect(QPoint(0, 0), m_appAreaSonWidget->size()); - if (DisplayMode::Efficient == m_dislayMode) { + if (DisplayMode::Efficient == m_displayMode) { switch (m_position) { case Top: case Bottom : @@ -999,22 +1028,29 @@ void MainPanelControl::setDockScreen(DockScreen *dockScreen) QPainterPath MainPanelControl::areaPath() { - if (m_dislayMode == DisplayMode::Efficient) + if (m_displayMode == DisplayMode::Efficient) return QPainterPath(); int radius = qApp->property("EffectBorderRadius").toInt(); QPainterPath path; if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { int leftWidth = m_fixedAreaWidget->width() + m_fixedSpliter->width() + m_appAreaWidget->width(); + if (m_recentLayout->count() > 0) + leftWidth += m_recentAreaWidget->width(); + int roundHeight = height(); path.addRoundedRect(QRect(0, 0, leftWidth, roundHeight), radius, radius); path.addRoundedRect(QRect(m_trayManagerWidget->x(), 0, m_trayManagerWidget->width(), roundHeight), radius, radius); } else { int roundWidth = width(); int topHeight = m_fixedAreaWidget->height() + m_fixedSpliter->height() + m_appAreaWidget->height(); + if (m_recentLayout->count() > 0) + topHeight += m_recentAreaWidget->height(); + path.addRoundedRect(QRect(0, 0, roundWidth, topHeight), radius, radius); path.addRoundedRect(QRect(0, m_trayManagerWidget->y(), roundWidth, m_trayManagerWidget->height()), radius, radius); } + return path; } @@ -1027,7 +1063,7 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const if (ratio <= 0) ratio = qApp->devicePixelRatio(); - if (m_dislayMode == DisplayMode::Efficient) { + if (m_displayMode == DisplayMode::Efficient) { // 如果是高效模式 if (m_position == Position::Top || m_position == Position::Bottom) return QSize(static_cast(screenSize / ratio), height()); @@ -1041,7 +1077,7 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const // 减去右侧托盘和快捷设置还有插件区域的尺寸 totalLength -= (((m_position == Position::Top || m_position == Position::Bottom) ? traySuitableSize.width() : traySuitableSize.height()) / ratio); // 需要参与计算的图标的总数 - int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count(); + int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count(); if (iconCount <= 0) { if (m_position == Position::Top || m_position == Position::Bottom) return QSize((static_cast((traySuitableSize.width() + 20) / ratio)), height()); @@ -1126,13 +1162,14 @@ void MainPanelControl::resizeDockIcon() int tray_item_size = 0; int iconCount = 0; // 总宽度 - if (m_dislayMode == DisplayMode::Fashion) { + if (m_displayMode == DisplayMode::Fashion) { + // 时尚模式 int totalLength = getScreenSize(); QSize trayManagerSize = m_trayManagerWidget->suitableSize(); // 减去右侧托盘和插件区域的宽度 totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? trayManagerSize.width() : trayManagerSize.height(); - iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count(); + iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count(); if (iconCount <= 0) return; @@ -1255,9 +1292,8 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) { int appItemSize = qMin(w, h); - for (int i = 0; i < m_fixedAreaLayout->count(); ++i) { + for (int i = 0; i < m_fixedAreaLayout->count(); ++i) m_fixedAreaLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); - } if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { m_fixedSpliter->setFixedSize(SPLITER_SIZE, int(w * 0.6)); @@ -1269,16 +1305,26 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) m_traySpliter->setFixedSize(int(h * 0.5), SPLITER_SIZE); } - for (int i = 0; i < m_appAreaSonLayout->count(); ++i) { + for (int i = 0; i < m_appAreaSonLayout->count(); ++i) m_appAreaSonLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); + + // 时尚模式下判断是否需要显示最近打开的应用区域 + if (m_displayMode == Dock::DisplayMode::Fashion && m_recentLayout->count() > 0) { + for (int i = 0; i < m_recentLayout->count(); ++i) + m_recentLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); + + // 时尚模式下计算最近打开应用区域的尺寸 + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + m_recentAreaWidget->setFixedWidth(appItemSize * m_recentLayout->count()); + else + m_recentAreaWidget->setFixedHeight(appItemSize * m_recentLayout->count()); } - if (m_tray) { + if (m_tray) m_tray->centralWidget()->setProperty("iconSize", traySize); - } - //因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局 - //因此需要通过多一层布局来获取各插件 + // 因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局 + // 因此需要通过多一层布局来获取各插件 if ((m_position == Position::Top) || (m_position == Position::Bottom)) { // 三方插件 for (int i = 0; i < m_pluginLayout->count(); ++ i) { @@ -1352,6 +1398,11 @@ void MainPanelControl::onRequestUpdate() Q_EMIT requestUpdate(); } +void MainPanelControl::onRecentVisibleChanged(bool visible) +{ + m_appSpliter->setVisible(visible); +} + /**时尚模式没有‘显示桌面’区域 * @brief MainPanelControl::resizeDesktopWidget */ @@ -1375,7 +1426,7 @@ void MainPanelControl::resizeDesktopWidget() m_trayManagerWidget->setFixedWidth(suitableSize.width()); } - if (DisplayMode::Fashion == m_dislayMode) + if (DisplayMode::Fashion == m_displayMode) m_desktopWidget->setFixedSize(0, 0); } diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index a525ab008..b0f6451c4 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -40,10 +40,12 @@ class AppDragWidget; class DesktopWidget; class TrayManagerWindow; class DockScreen; +class RecentAppHelper; class MainPanelControl : public QWidget { Q_OBJECT + public: explicit MainPanelControl(QWidget *parent = nullptr); @@ -77,7 +79,6 @@ private: void addFixedAreaItem(int index, QWidget *wdg); void removeFixedAreaItem(QWidget *wdg); - void addAppAreaItem(int index, QWidget *wdg); void removeAppAreaItem(QWidget *wdg); void addTrayAreaItem(int index, QWidget *wdg); void removeTrayAreaItem(QWidget *wdg); @@ -95,9 +96,11 @@ private: bool checkNeedShowDesktop(); bool appIsOnDock(const QString &appDesktop); void resetRadius(); + void dockRecentApp(DockItem *dockItem); private Q_SLOTS: void onRequestUpdate(); + void onRecentVisibleChanged(bool visible); protected: void dragMoveEvent(QDragMoveEvent *e) override; @@ -114,31 +117,35 @@ private: QBoxLayout *m_mainPanelLayout; QWidget *m_fixedAreaWidget; // 固定区域 - QBoxLayout *m_fixedAreaLayout; // + QBoxLayout *m_fixedAreaLayout; // 固定区域布局 QLabel *m_fixedSpliter; // 固定区域与应用区域间的分割线 QWidget *m_appAreaWidget; // 应用区域 QWidget *m_appAreaSonWidget; // 子应用区域,所在位置根据显示模式手动指定 - QBoxLayout *m_appAreaSonLayout; // + QBoxLayout *m_appAreaSonLayout; // 子应用区域布局 QLabel *m_appSpliter; // 应用区域与托盘区域间的分割线 QWidget *m_trayAreaWidget; // 托盘区域 - QBoxLayout *m_trayAreaLayout; // + QBoxLayout *m_trayAreaLayout; // 托盘区域布局 QLabel *m_traySpliter; // 托盘区域与插件区域间的分割线 QWidget *m_pluginAreaWidget; // 插件区域 + QWidget *m_recentAreaWidget; // 最近打开应用 + QBoxLayout *m_recentLayout; + TrayManagerWindow *m_trayManagerWidget; - QBoxLayout *m_pluginLayout; // + QBoxLayout *m_pluginLayout; // 插件区域布局 DesktopWidget *m_desktopWidget; // 桌面预览区域 Position m_position; QPointer m_placeholderItem; QString m_draggingMimeKey; AppDragWidget *m_appDragWidget; - DisplayMode m_dislayMode; + DisplayMode m_displayMode; QPoint m_mousePressPos; TrayPluginItem *m_tray; - int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置 + int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置 PluginsItem *m_trashItem; // 垃圾箱插件(需要特殊处理一下) DockScreen *m_dockScreen; + RecentAppHelper *m_recentHelper; }; #endif // MAINPANELCONTROL_H diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 1c260e5f7..bb8e5ec13 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -75,6 +75,8 @@ public: QString itemKey() const; QSize suitableSize() const; + inline ItemType itemType() const override { return DockItem::StretchPlugin; } + protected: void paintEvent(QPaintEvent *event) override; void mousePressEvent(QMouseEvent *e) override; From 301e5153195f81adb3c9b37aa3abe5d8689fac93 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 11 Jul 2022 03:18:24 +0000 Subject: [PATCH 057/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E5=8C=BA=E5=9F=9F=E7=9A=84=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 时尚模式下,在最近使用区域右侧增加工具区域的功能,时尚模式切换到高效模式后,高效模式依然显示原来的区域 Log: 时尚模式下增加工具区域 Influence: 时尚模式下,查看最近打开区域右侧是否显示回收站,来回切换时尚模式与高效模式,查看回收站位置是否发生变化 Task: https://pms.uniontech.com/task-view-152867.html Change-Id: Icaf77f09b737ca9473767fa876883ac0fdddb1ad --- frame/controller/dockpluginscontroller.cpp | 5 +- frame/controller/toolapphelper.cpp | 256 +++++++++++++++++++++ frame/controller/toolapphelper.h | 72 ++++++ frame/item/pluginsitem.cpp | 16 +- frame/item/pluginsitem.h | 7 +- frame/item/traypluginitem.cpp | 4 +- frame/item/traypluginitem.h | 2 +- frame/window/mainpanelcontrol.cpp | 197 +++++++++------- frame/window/mainpanelcontrol.h | 9 +- plugins/trash/trash.json | 3 +- 10 files changed, 471 insertions(+), 100 deletions(-) create mode 100644 frame/controller/toolapphelper.cpp create mode 100644 frame/controller/toolapphelper.h diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index e9dd2b6b2..625771be0 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -60,18 +60,17 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con return; const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); - const QString &pluginApi = meta.value("api").toString(); PluginsItem *item = nullptr; if (itemInter->pluginName() == "tray") { - item = new TrayPluginItem(itemInter, itemKey, pluginApi); + item = new TrayPluginItem(itemInter, itemKey, meta); if (item->graphicsEffect()) { item->graphicsEffect()->setEnabled(false); } connect(static_cast(item), &TrayPluginItem::trayVisableCountChanged, this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection); } else { - item = new PluginsItem(itemInter, itemKey, pluginApi); + item = new PluginsItem(itemInter, itemKey, meta); } mPluginsMap[itemInter][itemKey] = item; diff --git a/frame/controller/toolapphelper.cpp b/frame/controller/toolapphelper.cpp new file mode 100644 index 000000000..1b0fc7bc1 --- /dev/null +++ b/frame/controller/toolapphelper.cpp @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#include "toolapphelper.h" +#include "dockitem.h" +#include "pluginsitem.h" + +#include +#include + +ToolAppHelper::ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget, QObject *parent) + : QObject(parent) + , m_pluginAreaWidget(pluginAreaWidget) + , m_toolAreaWidget(toolAreaWidget) + , m_displayMode(DisplayMode::Efficient) + , m_trashItem(nullptr) +{ +} + +void ToolAppHelper::setDisplayMode(DisplayMode displayMode) +{ + m_displayMode = displayMode; + resetPluginItems(); + updateWidgetStatus(); +} + +void ToolAppHelper::addPluginItem(int index, DockItem *dockItem) +{ + if (pluginInTool(dockItem)) + appendToToolArea(index, dockItem); + else + appendToPluginArea(index, dockItem); + + // 将插件指针顺序保存到列表中 + if (index >= 0 && index < m_sequentPluginItems.size()) + m_sequentPluginItems.insert(index, dockItem); + else + m_sequentPluginItems << dockItem; + + // 保存垃圾箱插件指针 + PluginsItem *pluginsItem = qobject_cast(dockItem); + if (pluginsItem && pluginsItem->pluginName() == "trash") + m_trashItem = pluginsItem; + + if (!toolIsVisible()) + updateWidgetStatus(); + + Q_EMIT requestUpdate(); +} + +void ToolAppHelper::removePluginItem(DockItem *dockItem) +{ + if (dockItem == m_trashItem) + m_trashItem = nullptr; + + if (!removePluginArea(dockItem)) + removeToolArea(dockItem); + + if (m_toolAreaWidget->layout()->count() == 0 && toolIsVisible()) + updateWidgetStatus(); + + Q_EMIT requestUpdate(); +} + +PluginsItem *ToolAppHelper::trashPlugin() const +{ + return m_trashItem; +} + +bool ToolAppHelper::toolIsVisible() const +{ + return m_toolAreaWidget->isVisible(); +} + +void ToolAppHelper::appendToPluginArea(int index, DockItem *dockItem) +{ + // 因为日期时间插件和其他插件的大小有异,为了方便设置边距,在插件区域布局再添加一层布局设置边距 + // 因此在处理插件图标时,需要通过两层布局判断是否为需要的插件,例如拖动插件位置等判断 + QBoxLayout *boxLayout = new QBoxLayout(QBoxLayout::LeftToRight, m_pluginAreaWidget); + boxLayout->addWidget(dockItem, 0, Qt::AlignCenter); + QBoxLayout *pluginLayout = static_cast(m_pluginAreaWidget->layout()); + pluginLayout->insertLayout(index, boxLayout, 0); +} + +void ToolAppHelper::appendToToolArea(int index, DockItem *dockItem) +{ + QBoxLayout *boxLayout = static_cast(m_toolAreaWidget->layout()); + if (index >= 0) + boxLayout->insertWidget(index, dockItem); + else + boxLayout->addWidget(dockItem); +} + +bool ToolAppHelper::removePluginArea(DockItem *dockItem) +{ + bool removeResult = false; + QBoxLayout *pluginLayout = static_cast(m_pluginAreaWidget->layout()); + for (int i = 0; i < pluginLayout->count(); ++i) { + QLayoutItem *layoutItem = pluginLayout->itemAt(i); + QLayout *boxLayout = layoutItem->layout(); + if (boxLayout && boxLayout->itemAt(0)->widget() == dockItem) { + boxLayout->removeWidget(dockItem); + pluginLayout->removeItem(layoutItem); + delete layoutItem; + layoutItem = nullptr; + removeResult = true; + } + } + + return removeResult; +} + +bool ToolAppHelper::removeToolArea(DockItem *dockItem) +{ + QBoxLayout *boxLayout = static_cast(m_toolAreaWidget->layout()); + for (int i = 0; i < boxLayout->count(); i++) { + if (boxLayout->itemAt(i)->widget() == dockItem) { + boxLayout->removeWidget(dockItem); + return true; + } + } + + return false; +} + +void ToolAppHelper::resetPluginItems() +{ + if (m_displayMode == DisplayMode::Efficient) { + // 高效模式下, 让工具区域的插件移动到插件区域显示 + QList dockItems = dockItemOnWidget(true); + for (DockItem *dockItem : dockItems) { + // 从工具列表中移除插件, 将这些插件放入到插件区域 + removeToolArea(dockItem); + int index = itemIndex(dockItem, false); + appendToPluginArea(index, dockItem); + } + } else { + // 时尚模式下,将插件区域对应的插件移动到工具区域 + QList dockItems = dockItemOnWidget(false); + for (DockItem *dockItem : dockItems) { + if (!pluginInTool(dockItem)) + continue; + + // 从插件区域中移除相关插件,并将其插入到工具区域中 + removePluginArea(dockItem); + int index = itemIndex(dockItem, true); + appendToToolArea(index, dockItem); + } + } +} + +void ToolAppHelper::updateWidgetStatus() +{ + bool oldVisible = toolIsVisible(); + if (m_displayMode == DisplayMode::Efficient) { + // 高效模式 + m_pluginAreaWidget->setVisible(true); + m_toolAreaWidget->setVisible(false); + } else { + // 时尚模式 + m_pluginAreaWidget->setVisible(false); + m_toolAreaWidget->setVisible(m_toolAreaWidget->layout()->count() > 0); + } + bool visible = toolIsVisible(); + if (oldVisible != visible) + Q_EMIT toolVisibleChanged(visible); +} + +bool ToolAppHelper::pluginInTool(DockItem *dockItem) const +{ + if (m_displayMode != DisplayMode::Fashion) + return false; + + PluginsItem *pluginItem = qobject_cast(dockItem); + if (!pluginItem) + return false; + + QJsonObject metaData = pluginItem->metaData(); + if (metaData.contains("tool")) + return metaData.value("tool").toBool(); + + return false; +} + +/** + * @brief ToolAppHelper::itemIndex 返回该插件在工具区域(isTool == true)或插件区域(isTool == false)的正确位置 + * @param dockItem + * @param isTool + * @return + */ +int ToolAppHelper::itemIndex(DockItem *dockItem, bool isTool) const +{ + int index = m_sequentPluginItems.indexOf(dockItem); + if (index < 0 || index >= m_sequentPluginItems.size() - 1) + return -1; + + QList dockItems = dockItemOnWidget(isTool); + for (int i = index + 1; i < m_sequentPluginItems.size(); i++) { + DockItem *nextItem = m_sequentPluginItems[i]; + if (dockItems.contains(nextItem)) { + // 如果当前包含当前插入的下一个item,则直接返回下一个item的插入位置 + return dockItems.indexOf(nextItem); + } + } + + return -1; +} + +QList ToolAppHelper::dockItemOnWidget(bool isTool) const +{ + QList dockItems; + if (isTool) { + QLayout *layout = m_toolAreaWidget->layout(); + for (int i = 0; i < layout->count(); i++) { + DockItem *dockItem = qobject_cast(layout->itemAt(i)->widget()); + if (!dockItem) + continue; + + dockItems << dockItem; + } + } else { + QBoxLayout *pluginLayout = static_cast(m_pluginAreaWidget->layout()); + for (int i = 0; i < pluginLayout->count(); ++i) { + QLayoutItem *layoutItem = pluginLayout->itemAt(i); + QLayout *boxLayout = layoutItem->layout(); + if (!boxLayout) + continue; + + DockItem *dockItem = qobject_cast(boxLayout->itemAt(0)->widget()); + if (!dockItem) + continue; + + dockItems << dockItem; + } + } + + return dockItems; +} diff --git a/frame/controller/toolapphelper.h b/frame/controller/toolapphelper.h new file mode 100644 index 000000000..8feee7919 --- /dev/null +++ b/frame/controller/toolapphelper.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef TOOLAPPHELPER_H +#define TOOLAPPHELPER_H + +#include "constants.h" + +#include + +class QWidget; +class DockItem; +class PluginsItem; + +using namespace Dock; + +class ToolAppHelper : public QObject +{ + Q_OBJECT + +public: + explicit ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget, QObject *parent = nullptr); + + void setDisplayMode(DisplayMode displayMode); + void addPluginItem(int index, DockItem *dockItem); + void removePluginItem(DockItem *dockItem); + PluginsItem *trashPlugin() const; + bool toolIsVisible() const; + +Q_SIGNALS: + void requestUpdate(); + void toolVisibleChanged(bool); + +private: + void appendToPluginArea(int index, DockItem *dockItem); + void appendToToolArea(int index, DockItem *dockItem); + bool removePluginArea(DockItem *dockItem); + bool removeToolArea(DockItem *dockItem); + + void resetPluginItems(); + void updateWidgetStatus(); + bool pluginInTool(DockItem *dockItem) const; + int itemIndex(DockItem *dockItem, bool isTool) const; + QList dockItemOnWidget(bool isTool) const; + +private: + QWidget *m_pluginAreaWidget; + QWidget *m_toolAreaWidget; + DisplayMode m_displayMode; + PluginsItem *m_trashItem; + QList m_sequentPluginItems; +}; + +#endif // TOOLAPPHELPER_H diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index 8c8c37b77..7a115a808 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -37,11 +37,11 @@ QPoint PluginsItem::MousePressPoint = QPoint(); -PluginsItem::PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QString &plginApi, QWidget *parent) +PluginsItem::PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &jsonData, QWidget *parent) : DockItem(parent) , m_pluginInter(pluginInter) , m_centralWidget(m_pluginInter->itemWidget(itemKey)) - , m_pluginApi(plginApi) + , m_jsonData(jsonData) , m_itemKey(itemKey) , m_dragging(false) , m_gsettings(Utils::ModuleSettingsPtr(pluginInter->pluginName(), QByteArray(), this)) @@ -95,7 +95,7 @@ QString PluginsItem::pluginName() const PluginsItemInterface::PluginSizePolicy PluginsItem::pluginSizePolicy() const { // 插件版本大于 1.2.2 才能使用 PluginsItemInterface::pluginSizePolicy 函数 - if (Utils::comparePluginApi(m_pluginApi, "1.2.2") > 0) { + if (Utils::comparePluginApi(pluginApi(), "1.2.2") > 0) { return m_pluginInter->pluginSizePolicy(); } else { return PluginsItemInterface::System; @@ -308,6 +308,11 @@ bool PluginsItem::checkGSettingsControl() const return m_gsettings ? m_gsettings->keys().contains("control") && m_gsettings->get("control").toBool() : false; } +QString PluginsItem::pluginApi() const +{ + return m_jsonData.value("api").toString(); +} + void PluginsItem::resizeEvent(QResizeEvent *event) { setMaximumSize(m_centralWidget->maximumSize()); @@ -325,3 +330,8 @@ PluginsItemInterface *PluginsItem::pluginItem() const { return m_pluginInter; } + +QJsonObject PluginsItem::metaData() const +{ + return m_jsonData; +} diff --git a/frame/item/pluginsitem.h b/frame/item/pluginsitem.h index 0073a689a..008b6c5e9 100644 --- a/frame/item/pluginsitem.h +++ b/frame/item/pluginsitem.h @@ -31,7 +31,7 @@ class PluginsItem : public DockItem Q_OBJECT public: - explicit PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QString &plginApi, QWidget *parent = nullptr); + explicit PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &jsonData, QWidget *parent = nullptr); ~PluginsItem() override; int itemSortKey() const; @@ -53,6 +53,8 @@ public: PluginsItemInterface *pluginItem() const; + QJsonObject metaData() const; + public slots: void refreshIcon() override; @@ -78,12 +80,13 @@ private: void startDrag(); void mouseClicked(); bool checkGSettingsControl() const; + QString pluginApi() const; private: PluginsItemInterface *const m_pluginInter; QWidget *m_centralWidget; - const QString m_pluginApi; + QJsonObject m_jsonData; const QString m_itemKey; bool m_dragging; diff --git a/frame/item/traypluginitem.cpp b/frame/item/traypluginitem.cpp index 3141c3ae2..a036424bb 100644 --- a/frame/item/traypluginitem.cpp +++ b/frame/item/traypluginitem.cpp @@ -24,8 +24,8 @@ #include -TrayPluginItem::TrayPluginItem(PluginsItemInterface * const pluginInter, const QString &itemKey, const QString &pluginApi, QWidget *parent) - : PluginsItem(pluginInter, itemKey, pluginApi, parent) +TrayPluginItem::TrayPluginItem(PluginsItemInterface * const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent) + : PluginsItem(pluginInter, itemKey, metaData, parent) { centralWidget()->installEventFilter(this); } diff --git a/frame/item/traypluginitem.h b/frame/item/traypluginitem.h index 683a5eff9..596c9f639 100644 --- a/frame/item/traypluginitem.h +++ b/frame/item/traypluginitem.h @@ -29,7 +29,7 @@ class TrayPluginItem : public PluginsItem Q_OBJECT public: - TrayPluginItem(PluginsItemInterface* const pluginInter, const QString &itemKey, const QString &pluginApi, QWidget *parent = nullptr); + TrayPluginItem(PluginsItemInterface* const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent = nullptr); inline ItemType itemType() const override {return ItemType::TrayPlugin;} diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index ee40b24e3..6d0c5f2fb 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -35,6 +35,7 @@ #include "multiscreenworker.h" #include "displaymanager.h" #include "recentapphelper.h" +#include "toolapphelper.h" #include #include @@ -87,6 +88,9 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_pluginAreaWidget(new QWidget(this)) , m_recentAreaWidget(new QWidget(this)) , m_recentLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) + , m_recentSpliter(new QLabel(this)) + , m_toolAreaWidget(new QWidget(this)) + , m_toolLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_toolAreaWidget)) , m_trayManagerWidget(new TrayManagerWindow(this)) , m_pluginLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_desktopWidget(new DesktopWidget(this)) @@ -95,9 +99,9 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_appDragWidget(nullptr) , m_displayMode(Efficient) , m_tray(nullptr) - , m_trashItem(nullptr) , m_dockScreen(nullptr) , m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, this)) + , m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolAreaWidget, this)) { initUI(); initConnection(); @@ -116,6 +120,7 @@ MainPanelControl::MainPanelControl(QWidget *parent) m_fixedSpliter->setFixedSize(0, 0); m_appSpliter ->setFixedSize(0, 0); m_traySpliter->setFixedSize(0, 0); + m_recentSpliter->setFixedSize(0, 0); } void MainPanelControl::initUI() @@ -149,6 +154,17 @@ void MainPanelControl::initUI() m_recentLayout->setContentsMargins(0, 0, 0, 0); m_mainPanelLayout->addWidget(m_recentAreaWidget); + m_recentSpliter->setObjectName("spliter_recent"); + m_mainPanelLayout->addWidget(m_recentSpliter); + + /* 工具应用 */ + m_toolAreaWidget->setObjectName("toolarea"); + m_toolAreaWidget->setAccessibleName("toolarea"); + m_toolAreaWidget->setLayout(m_toolLayout); + m_toolLayout->setSpacing(0); + m_toolLayout->setContentsMargins(0, 0, 0, 0); + m_mainPanelLayout->addWidget(m_toolAreaWidget); + /* 托盘区域 */ m_trayAreaWidget->setObjectName("trayarea"); m_trayAreaWidget->setLayout(m_trayAreaLayout); @@ -179,6 +195,7 @@ void MainPanelControl::initUI() m_mainPanelLayout->setAlignment(m_fixedSpliter, Qt::AlignCenter); m_mainPanelLayout->setAlignment(m_appSpliter, Qt::AlignCenter); m_mainPanelLayout->setAlignment(m_traySpliter, Qt::AlignCenter); + m_mainPanelLayout->setAlignment(m_recentSpliter, Qt::AlignCenter); } void MainPanelControl::initConnection() @@ -186,6 +203,8 @@ void MainPanelControl::initConnection() connect(m_trayManagerWidget, &TrayManagerWindow::requestUpdate, this, &MainPanelControl::onRequestUpdate); connect(m_recentHelper, &RecentAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate); connect(m_recentHelper, &RecentAppHelper::recentVisibleChanged, this, &MainPanelControl::onRecentVisibleChanged); + connect(m_toolHelper, &ToolAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate); + connect(m_toolHelper, &ToolAppHelper::toolVisibleChanged, this, &MainPanelControl::onToolVisibleChanged); } /** @@ -199,6 +218,7 @@ void MainPanelControl::setDisplayMode(DisplayMode dislayMode) m_displayMode = dislayMode; m_recentHelper->setDisplayMode(dislayMode); + m_toolHelper->setDisplayMode(dislayMode); updateDisplayMode(); } @@ -278,25 +298,6 @@ void MainPanelControl::addTrayAreaItem(int index, QWidget *wdg) m_tray->installEventFilter(this); } -/**往插件区域添加应用,保存回收站插件指针对象 - * @brief MainPanelControl::addPluginAreaItem - * @param index 位置索引,如果为负数则插入到最后,为正则插入到指定位置 - * @param wdg 应用指针对象 - */ -void MainPanelControl::addPluginAreaItem(int index, QWidget *wdg) -{ - //因为日期时间插件和其他插件的大小有异,为了方便设置边距,在插件区域布局再添加一层布局设置边距 - //因此在处理插件图标时,需要通过两层布局判断是否为需要的插件,例如拖动插件位置等判断 - QBoxLayout * boxLayout = new QBoxLayout(QBoxLayout::LeftToRight, this); - boxLayout->addWidget(wdg, 0, Qt::AlignCenter); - m_pluginLayout->insertLayout(index, boxLayout, 0); - - // 保存垃圾箱插件指针 - PluginsItem *pluginsItem = qobject_cast(wdg); - if (pluginsItem && pluginsItem->pluginName() == "trash") - m_trashItem = pluginsItem; -} - /**移除固定区域某一应用 * @brief MainPanelControl::removeFixedAreaItem * @param wdg 应用指针对象 @@ -326,31 +327,6 @@ void MainPanelControl::removeTrayAreaItem(QWidget *wdg) m_trayAreaLayout->removeWidget(wdg); } -/**移除插件区域某一应用 - * @brief MainPanelControl::removePluginAreaItem - * @param wdg 应用指针对象 - */ -void MainPanelControl::removePluginAreaItem(QWidget *wdg) -{ - // 因为日期时间插件大小和其他插件有异,为了方便设置边距,各插件中增加一层布局 - // 因此remove插件图标时,需要从多的一层布局中取widget进行判断是否需要移除的插件 - // 清空保存的垃圾箱插件指针 - PluginsItem *pluginsItem = qobject_cast(wdg); - if (pluginsItem && pluginsItem->pluginName() == "trash") - m_trashItem = nullptr; - - for (int i = 0; i < m_pluginLayout->count(); ++i) { - QLayoutItem *layoutItem = m_pluginLayout->itemAt(i); - QLayout *boxLayout = layoutItem->layout(); - if (boxLayout && boxLayout->itemAt(0)->widget() == wdg) { - boxLayout->removeWidget(wdg); - m_pluginLayout->removeItem(layoutItem); - delete layoutItem; - layoutItem = nullptr; - } - } -} - void MainPanelControl::resizeEvent(QResizeEvent *event) { // 先通过消息循环让各部件调整好size后再计算图标大小 @@ -399,10 +375,12 @@ void MainPanelControl::updateAppAreaSonWidgetSize() m_appAreaSonWidget->setMaximumHeight(height()); m_appAreaSonWidget->setMaximumWidth(m_appAreaWidget->width()); m_recentAreaWidget->setFixedHeight(height()); + m_toolAreaWidget->setFixedHeight(height()); } else { m_appAreaSonWidget->setMaximumWidth(width()); m_appAreaSonWidget->setMaximumHeight(m_appAreaWidget->height()); m_recentAreaWidget->setFixedWidth(width()); + m_toolAreaWidget->setFixedWidth(width()); } m_appAreaSonWidget->adjustSize(); @@ -452,7 +430,8 @@ void MainPanelControl::insertItem(int index, DockItem *item) addTrayAreaItem(index, item); break; case DockItem::Plugins: - addPluginAreaItem(index, item); + //addPluginAreaItem(index, item); + m_toolHelper->addPluginItem(index, item); break; default: break; } @@ -484,7 +463,7 @@ void MainPanelControl::removeItem(DockItem *item) removeTrayAreaItem(item); break; case DockItem::Plugins: - removePluginAreaItem(item); + m_toolHelper->removePluginItem(item); break; default: break; } @@ -863,8 +842,10 @@ void MainPanelControl::startDrag(DockItem *dockItem) // isNeedBack 保存是否需要重置垃圾箱的AcceptDrops // 设置垃圾箱插件AcceptDrops false bool isNeedBack = false; - if (item->itemType() == DockItem::Plugins && m_trashItem && dockItem != m_trashItem) { - m_trashItem->centralWidget()->setAcceptDrops(false); + PluginsItem *trashItem = m_toolHelper->trashPlugin(); + + if (item->itemType() == DockItem::Plugins && trashItem && dockItem != trashItem) { + trashItem->centralWidget()->setAcceptDrops(false); isNeedBack = true; } @@ -878,7 +859,7 @@ void MainPanelControl::startDrag(DockItem *dockItem) // isNeedBack是否需要设置垃圾箱插件AcceptDrops true if (isNeedBack) - m_trashItem->centralWidget()->setAcceptDrops(true); + trashItem->centralWidget()->setAcceptDrops(true); } } @@ -955,6 +936,8 @@ void MainPanelControl::updateModeChange() m_traySpliter->setVisible(m_displayMode == DisplayMode::Efficient); m_pluginAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); m_trayManagerWidget->setVisible(m_displayMode != DisplayMode::Efficient); + onRecentVisibleChanged(m_recentHelper->recentIsVisible()); + onToolVisibleChanged(m_toolHelper->toolIsVisible()); if (m_tray) m_tray->setVisible(m_displayMode == DisplayMode::Efficient); } @@ -1038,6 +1021,9 @@ QPainterPath MainPanelControl::areaPath() if (m_recentLayout->count() > 0) leftWidth += m_recentAreaWidget->width(); + if (m_toolLayout->count() > 0) + leftWidth += m_toolAreaWidget->width(); + int roundHeight = height(); path.addRoundedRect(QRect(0, 0, leftWidth, roundHeight), radius, radius); path.addRoundedRect(QRect(m_trayManagerWidget->x(), 0, m_trayManagerWidget->width(), roundHeight), radius, radius); @@ -1047,6 +1033,9 @@ QPainterPath MainPanelControl::areaPath() if (m_recentLayout->count() > 0) topHeight += m_recentAreaWidget->height(); + if (m_toolLayout->count() > 0) + topHeight += m_toolAreaWidget->height(); + path.addRoundedRect(QRect(0, 0, roundWidth, topHeight), radius, radius); path.addRoundedRect(QRect(0, m_trayManagerWidget->y(), roundWidth, m_trayManagerWidget->height()), radius, radius); } @@ -1077,7 +1066,7 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const // 减去右侧托盘和快捷设置还有插件区域的尺寸 totalLength -= (((m_position == Position::Top || m_position == Position::Bottom) ? traySuitableSize.width() : traySuitableSize.height()) / ratio); // 需要参与计算的图标的总数 - int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count(); + int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count() + m_toolLayout->count(); if (iconCount <= 0) { if (m_position == Position::Top || m_position == Position::Bottom) return QSize((static_cast((traySuitableSize.width() + 20) / ratio)), height()); @@ -1091,7 +1080,14 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const if (m_position == Position::Top || m_position == Position::Bottom) { iconSize = qMin(iconSize, height()); - int panelWidth = qMin(iconSize * iconCount + static_cast((m_fixedSpliter->width() + traySuitableSize.width() + 20) / ratio), + int spliterWidth = m_fixedSpliter->isVisible() ? m_fixedSpliter->width() : 0; + if (m_appSpliter->isVisible()) + spliterWidth += m_appSpliter->width(); + + if (m_recentSpliter->isVisible()) + spliterWidth += m_recentSpliter->isVisible(); + + int panelWidth = qMin(iconSize * iconCount + static_cast((spliterWidth + traySuitableSize.width() + 20) / ratio), static_cast(screenSize / deviceRatio)); return QSize(panelWidth, static_cast(height() / ratio)); @@ -1099,7 +1095,14 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const iconSize = iconSize < width() ? iconSize : width(); - int panelHeight = qMin(iconSize * iconCount + static_cast((m_fixedSpliter->height() + traySuitableSize.height() + 20) / ratio), + int spliterHeight = m_fixedSpliter->isVisible() ? m_fixedSpliter->height() : 0; + if (m_appSpliter->isVisible()) + spliterHeight += m_appSpliter->height(); + + if (m_recentSpliter->isVisible()) + spliterHeight += m_recentSpliter->height(); + + int panelHeight = qMin(iconSize * iconCount + static_cast((spliterHeight + traySuitableSize.height() + 20) / ratio), static_cast(screenSize / deviceRatio)); return QSize(width(), panelHeight); @@ -1133,6 +1136,9 @@ void MainPanelControl::paintEvent(QPaintEvent *event) if (m_traySpliter->isVisible()) painter.fillRect(m_traySpliter->geometry(), color); + + if (m_recentSpliter->isVisible()) + painter.fillRect(m_recentSpliter->geometry(), color); } // 获取当前屏幕的高或者宽(任务栏上下的时候获取宽,左右获取高) @@ -1299,25 +1305,39 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) m_fixedSpliter->setFixedSize(SPLITER_SIZE, int(w * 0.6)); m_appSpliter->setFixedSize(SPLITER_SIZE, int(w * 0.6)); m_traySpliter->setFixedSize(SPLITER_SIZE, int(w * 0.5)); + m_recentSpliter->setFixedSize(SPLITER_SIZE, int(w * 0.6)); } else { m_fixedSpliter->setFixedSize(int(h * 0.6), SPLITER_SIZE); m_appSpliter->setFixedSize(int(h * 0.6), SPLITER_SIZE); m_traySpliter->setFixedSize(int(h * 0.5), SPLITER_SIZE); + m_recentSpliter->setFixedSize(int(h * 0.6), SPLITER_SIZE); } for (int i = 0; i < m_appAreaSonLayout->count(); ++i) m_appAreaSonLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); // 时尚模式下判断是否需要显示最近打开的应用区域 - if (m_displayMode == Dock::DisplayMode::Fashion && m_recentLayout->count() > 0) { - for (int i = 0; i < m_recentLayout->count(); ++i) - m_recentLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); + if (m_displayMode == Dock::DisplayMode::Fashion) { + if (m_recentLayout->count() > 0) { + for (int i = 0; i < m_recentLayout->count(); ++i) + m_recentLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); - // 时尚模式下计算最近打开应用区域的尺寸 - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - m_recentAreaWidget->setFixedWidth(appItemSize * m_recentLayout->count()); - else - m_recentAreaWidget->setFixedHeight(appItemSize * m_recentLayout->count()); + // 时尚模式下计算最近打开应用区域的尺寸 + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + m_recentAreaWidget->setFixedWidth(appItemSize * m_recentLayout->count()); + else + m_recentAreaWidget->setFixedHeight(appItemSize * m_recentLayout->count()); + } + + if (m_toolLayout->count() > 0) { + for (int i = 0; i < m_toolLayout->count(); i++) + m_toolLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); + + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + m_toolAreaWidget->setFixedWidth(appItemSize * m_toolLayout->count()); + else + m_toolAreaWidget->setFixedHeight(appItemSize * m_toolLayout->count()); + } } if (m_tray) @@ -1329,32 +1349,34 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) // 三方插件 for (int i = 0; i < m_pluginLayout->count(); ++ i) { QLayout *layout = m_pluginLayout->itemAt(i)->layout(); - if (layout && layout->itemAt(0)) { - PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); - if (pItem) { - if (pItem->sizeHint().height() == -1) { - pItem->setFixedSize(traySize, traySize); - } else if (pItem->sizeHint().height() > height()) { - pItem->resize(pItem->width(), height()); - } - } - } + if (!layout || !layout->itemAt(0)) + continue; + + PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); + if (!pItem) + continue; + + if (pItem->sizeHint().height() == -1) + pItem->setFixedSize(traySize, traySize); + else if (pItem->sizeHint().height() > height()) + pItem->resize(pItem->width(), height()); } } else { // 三方插件 - for (int i = 0; i < m_pluginLayout->count(); ++ i) { + for (int i = 0; i < m_pluginLayout->count(); i++) { QLayout *layout = m_pluginLayout->itemAt(i)->layout(); - if (layout) { - PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); - qInfo() << pItem->pluginItem()->pluginDisplayName(); - if (pItem) { - if (pItem->sizeHint().width() == -1) { - pItem->setFixedSize(traySize, traySize); - } else if (pItem->sizeHint().width() > width()) { - pItem->resize(width(), pItem->height()); - } - } - } + if (!layout || !layout->itemAt(0)) + continue; + + PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); + qInfo() << pItem->pluginItem()->pluginDisplayName(); + if (!pItem) + continue; + + if (pItem->sizeHint().width() == -1) + pItem->setFixedSize(traySize, traySize); + else if (pItem->sizeHint().width() > width()) + pItem->resize(width(), pItem->height()); } } @@ -1376,8 +1398,8 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) m_appAreaSonLayout->setContentsMargins(appLeftAndRightMargin, appTopAndBottomMargin, appLeftAndRightMargin, appTopAndBottomMargin); m_trayAreaLayout->setContentsMargins(trayLeftAndRightMargin, trayTopAndBottomMargin, trayLeftAndRightMargin, trayTopAndBottomMargin); - //因为日期时间插件大小和其他插件大小有异,需要单独设置各插件的边距 - //而不对日期时间插件设置边距 + // 因为日期时间插件大小和其他插件大小有异,需要单独设置各插件的边距 + // 而不对日期时间插件设置边距 for (int i = 0; i < m_pluginLayout->count(); ++ i) { QLayout *layout = m_pluginLayout->itemAt(i)->layout(); if (layout && layout->itemAt(0)) { @@ -1403,6 +1425,11 @@ void MainPanelControl::onRecentVisibleChanged(bool visible) m_appSpliter->setVisible(visible); } +void MainPanelControl::onToolVisibleChanged(bool visible) +{ + m_recentSpliter->setVisible(visible); +} + /**时尚模式没有‘显示桌面’区域 * @brief MainPanelControl::resizeDesktopWidget */ diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index b0f6451c4..e60624f20 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -41,6 +41,7 @@ class DesktopWidget; class TrayManagerWindow; class DockScreen; class RecentAppHelper; +class ToolAppHelper; class MainPanelControl : public QWidget { @@ -82,8 +83,6 @@ private: void removeAppAreaItem(QWidget *wdg); void addTrayAreaItem(int index, QWidget *wdg); void removeTrayAreaItem(QWidget *wdg); - void addPluginAreaItem(int index, QWidget *wdg); - void removePluginAreaItem(QWidget *wdg); int getScreenSize() const; // 拖拽相关 @@ -101,6 +100,7 @@ private: private Q_SLOTS: void onRequestUpdate(); void onRecentVisibleChanged(bool visible); + void onToolVisibleChanged(bool visible); protected: void dragMoveEvent(QDragMoveEvent *e) override; @@ -129,6 +129,9 @@ private: QWidget *m_pluginAreaWidget; // 插件区域 QWidget *m_recentAreaWidget; // 最近打开应用 QBoxLayout *m_recentLayout; + QLabel *m_recentSpliter; // 最近打开应用区域分割线 + QWidget *m_toolAreaWidget; // 工具区域 + QBoxLayout *m_toolLayout; // 工具区域布局 TrayManagerWindow *m_trayManagerWidget; QBoxLayout *m_pluginLayout; // 插件区域布局 @@ -143,9 +146,9 @@ private: TrayPluginItem *m_tray; int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置 - PluginsItem *m_trashItem; // 垃圾箱插件(需要特殊处理一下) DockScreen *m_dockScreen; RecentAppHelper *m_recentHelper; + ToolAppHelper *m_toolHelper; }; #endif // MAINPANELCONTROL_H diff --git a/plugins/trash/trash.json b/plugins/trash/trash.json index bec81f0da..a5a5d1d82 100644 --- a/plugins/trash/trash.json +++ b/plugins/trash/trash.json @@ -1,3 +1,4 @@ { - "api": "2.0.0" + "api": "2.0.0", + "tool": true } From a2b4a11617b40c0756257a13e406d76e973c2581 Mon Sep 17 00:00:00 2001 From: lvpeilong Date: Mon, 11 Jul 2022 14:32:24 +0800 Subject: [PATCH 058/257] feat: recompile recompile Log: recompile Influence: recompile Change-Id: I810ad03852cd5d386f1bc2ec33d193ba1857bf92 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c9af762f8..95721f025 100644 --- a/README.md +++ b/README.md @@ -18,4 +18,4 @@ Any usage issues can ask for help via We encourage you to report issues and contribute changes * [Contribution guide for developers](https://github.com/linuxdeepin/developer-center/wiki/Contribution-Guidelines-for-Developers-en). (English) -* [开发者代码贡献指南](https://github.com/linuxdeepin/developer-center/wiki/Contribution-Guidelines-for-Developers) (中文) +* [开发者代码贡献指南](https://github.com/linuxdeepin/developer-center/wiki/Contribution-Guidelines-for-Developers)(中文) From 16cb90405804a1bb4ff2baa7e27cbb1942047f39 Mon Sep 17 00:00:00 2001 From: zyz Date: Fri, 15 Jul 2022 14:30:03 +0800 Subject: [PATCH 059/257] =?UTF-8?q?feat:=20=E7=82=B9=E5=87=BB=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=97=B6=E9=97=B4=E6=98=BE=E7=A4=BA=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E5=91=BC=E5=87=BA=E5=B0=8F=E7=BB=84=E4=BB=B6=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 点击任务栏时间显示窗口呼出小组件面板。 Log: 点击任务栏时间显示窗口呼出小组件面板。 Influence: 点击任务栏时间窗口小组件是否显示。 Task: https://pms.uniontech.com/task-view-165407.html Change-Id: I6ca10644a6b15338a79240f2d7d3c37127f1f42a --- frame/window/components/datetimedisplayer.cpp | 8 ++++---- plugins/datetime/datetimeplugin.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index 2b067992d..f86f95275 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -131,10 +131,10 @@ void DateTimeDisplayer::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event); - DDBusSender().service("com.deepin.Calendar") - .path("/com/deepin/Calendar") - .interface("com.deepin.Calendar") - .method("RaiseWindow").call(); + DDBusSender().service("org.deepin.dde.Widgets") + .path("/") + .interface("org.deepin.dde.Widgets") + .method("Toggle").call(); } QString DateTimeDisplayer::getTimeString() const diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index b22df827f..ac3711eb6 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -149,7 +149,7 @@ const QString DatetimePlugin::itemCommand(const QString &itemKey) { Q_UNUSED(itemKey); - return "dbus-send --print-reply --dest=com.deepin.Calendar /com/deepin/Calendar com.deepin.Calendar.RaiseWindow"; + return "dbus-send --print-reply --dest=org.deepin.dde.Widgets / org.deepin.dde.Widgets.Toggle"; } const QString DatetimePlugin::itemContextMenu(const QString &itemKey) From 7502b87e06b7ce56e7cfc587941736083d3d0c2f Mon Sep 17 00:00:00 2001 From: zyz Date: Fri, 15 Jul 2022 18:14:29 +0800 Subject: [PATCH 060/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8B=96?= =?UTF-8?q?=E6=8B=BD=E6=89=98=E7=9B=98=E7=AA=97=E5=8F=A3=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E8=87=B3=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=89=98=E7=9B=98=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E7=BB=8F=E5=B8=B8=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复拖拽托盘窗口图标至任务栏托盘区域经常失败的问题。原因:现有实现只在任务栏托盘一小块区域实现,导致拖拽经常不能被捕获,已修改为托盘父窗口区域捕获传递给任务栏托盘区域处理,实现每次拖拽都能捕获。 Log: 修复拖拽托盘窗口图标至任务栏托盘区域经常失败的问题。 Bug: https://pms.uniontech.com/bug-view-147789.html Influence: 拖拽托盘窗口图标至任务栏托盘区域。 Change-Id: I310916160fe1dc0e05b134a45a018c81766fe8cf --- frame/window/tray/tray_gridview.cpp | 11 ++++++++++- frame/window/tray/tray_gridview.h | 2 ++ frame/window/traymanagerwindow.cpp | 20 +++++++++++++------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index 8bdfc3ff4..3f51f99cf 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -365,7 +365,7 @@ const QModelIndex TrayGridView::getIndexFromPos(QPoint currentPoint) const return QModelIndex(); } -void TrayGridView::dropEvent(QDropEvent *e) +void TrayGridView::handleDropEvent(QDropEvent *e) { setState(DListView::NoState); clearDragModelIndex(); @@ -437,6 +437,10 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) drag->setPixmap(pixmap); drag->setHotSpot(pixmap.rect().center() / ratio); QMimeData *data = model()->mimeData(QModelIndexList() << modelIndex); + if (!data) { + return false; + } + data->setImageData(pixmap); drag->setMimeData(data); @@ -513,3 +517,8 @@ void TrayGridView::initUi() connect(m_aniStartTime, &QTimer::timeout, this, &TrayGridView::moveAnimation); } + +void TrayGridView::dropEvent(QDropEvent *e) +{ + handleDropEvent(e); +} diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h index 7ae02602b..e06cb0f30 100644 --- a/frame/window/tray/tray_gridview.h +++ b/frame/window/tray/tray_gridview.h @@ -46,6 +46,8 @@ public: const QRect indexRect(const QModelIndex &index) const; void dropSwap(); + void handleDropEvent(QDropEvent *e); + Q_SIGNALS: void requestRemove(const QString &); void dragLeaved(); diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 74753e397..50b03cc68 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -445,16 +445,22 @@ void TrayManagerWindow::dragMoveEvent(QDragMoveEvent *e) void TrayManagerWindow::dropEvent(QDropEvent *e) { - const QuickPluginMimeData *mimeData = qobject_cast(e->mimeData()); - if (!mimeData) + if (!e || !e->mimeData() || e->source() == this) return; - if (e->source() == this) - return; + if (qobject_cast(e->source())) { + const QuickPluginMimeData *mimeData = qobject_cast(e->mimeData()); + if (!mimeData) + return; - PluginsItemInterface *pluginItem = static_cast(mimeData->pluginItemInterface()); - if (pluginItem) - m_quickIconWidget->dragPlugin(pluginItem); + PluginsItemInterface *pluginItem = static_cast(mimeData->pluginItemInterface()); + if (pluginItem) + m_quickIconWidget->dragPlugin(pluginItem); + } else if (qobject_cast(e->source())) { + // 将trayView中的dropEvent扩大到整个区域(this),这样便于随意拖动到这个区域都可以捕获。 + // m_trayView中有e->accept不会导致事件重复处理。 + m_trayView->handleDropEvent(e); + } } void TrayManagerWindow::dragLeaveEvent(QDragLeaveEvent *event) From 51915b44a14e82d64cf2ee289bbc76cbf59aaa7b Mon Sep 17 00:00:00 2001 From: zyz Date: Wed, 20 Jul 2022 14:42:28 +0800 Subject: [PATCH 061/257] =?UTF-8?q?chore:=20=E4=BC=98=E5=8C=96=E6=9C=89?= =?UTF-8?q?=E5=85=B3slider=E7=AD=89=E7=9B=B8=E5=85=B3=E7=9A=84=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化局部代码。 Log: 优化代码。 Influence: 快捷设置面板slider操作。 Change-Id: I48e9ae9ba55d18133fd66b6327cd5d9c835858c3 --- frame/model/brightnessmodel.cpp | 42 ++-- frame/model/brightnessmodel.h | 25 +-- .../components/brightnessmonitorwidget.cpp | 192 ------------------ .../components/brightnessmonitorwidget.h | 69 ------- frame/window/components/brightnesswidget.cpp | 39 ++-- frame/window/components/brightnesswidget.h | 4 +- frame/window/components/slidercontainer.cpp | 54 +++-- frame/window/components/slidercontainer.h | 15 +- .../window/components/volumedeviceswidget.cpp | 27 +-- frame/window/components/volumewidget.cpp | 24 +-- frame/window/quicksettingcontainer.cpp | 5 +- frame/window/quicksettingcontainer.h | 2 - 12 files changed, 106 insertions(+), 392 deletions(-) delete mode 100644 frame/window/components/brightnessmonitorwidget.cpp delete mode 100644 frame/window/components/brightnessmonitorwidget.h diff --git a/frame/model/brightnessmodel.cpp b/frame/model/brightnessmodel.cpp index 33efb327d..e7c024bce 100644 --- a/frame/model/brightnessmodel.cpp +++ b/frame/model/brightnessmodel.cpp @@ -49,9 +49,6 @@ BrightnessModel::BrightnessModel(QObject *parent) BrightMonitor *monitor = new BrightMonitor(path.path(), this); monitor->setPrimary(primaryScreenName == monitor->name()); m_monitor << monitor; - connect(monitor, &BrightMonitor::brightnessChanged, this, [ = ] { - Q_EMIT brightnessChanged(monitor); - }); } } @@ -77,27 +74,6 @@ BrightMonitor *BrightnessModel::primaryMonitor() const return nullptr; } -void BrightnessModel::setBrightness(BrightMonitor *monitor, int brightness) -{ - setBrightness(monitor->name(), brightness); -} - -void BrightnessModel::setBrightness(QString name, int brightness) -{ - callMethod("SetBrightness", { name, static_cast(brightness *0.01) }); -} - -QDBusMessage BrightnessModel::callMethod(const QString &methodName, const QList &argument) -{ - QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); - reply.waitForFinished(); - return reply.reply(); - } - return QDBusMessage(); -} - void BrightnessModel::primaryScreenChanged(QScreen *screen) { BrightMonitor *defaultMonitor = nullptr; @@ -142,7 +118,7 @@ void BrightMonitor::setPrimary(bool primary) m_isPrimary = primary; } -int BrightMonitor::brihtness() +int BrightMonitor::brightness() { return m_brightness; } @@ -162,6 +138,11 @@ bool BrightMonitor::isPrimary() return m_isPrimary; } +void BrightMonitor::setBrightness(int value) +{ + callMethod("SetBrightness", { m_name, static_cast(value * 0.01) }); +} + void BrightMonitor::onPropertyChanged(const QDBusMessage &msg) { QList arguments = msg.arguments(); @@ -196,3 +177,14 @@ void BrightMonitor::onPropertyChanged(const QDBusMessage &msg) } } +QDBusMessage BrightMonitor::callMethod(const QString &methodName, const QList &argument) +{ + QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); + reply.waitForFinished(); + return reply.reply(); + } + + return QDBusMessage(); +} diff --git a/frame/model/brightnessmodel.h b/frame/model/brightnessmodel.h index e22549cd9..b9c0c022b 100644 --- a/frame/model/brightnessmodel.h +++ b/frame/model/brightnessmodel.h @@ -38,16 +38,10 @@ public: QList monitors(); BrightMonitor *primaryMonitor() const; - void setBrightness(BrightMonitor *monitor, int brightness); - void setBrightness(QString name, int brightness); Q_SIGNALS: - void brightnessChanged(BrightMonitor *); void primaryChanged(BrightMonitor *); -protected: - QDBusMessage callMethod(const QString &methodName, const QList &argument); - protected Q_SLOTS: void primaryScreenChanged(QScreen *screen); @@ -59,7 +53,9 @@ class BrightMonitor : public QObject { Q_OBJECT - friend class BrightnessModel; +public: + explicit BrightMonitor(QString path, QObject *parent); + ~BrightMonitor(); Q_SIGNALS: void brightnessChanged(int); @@ -67,20 +63,19 @@ Q_SIGNALS: void enabledChanged(bool); public: - int brihtness(); + void setPrimary(bool primary); + int brightness(); bool enabled(); QString name(); bool isPrimary(); -protected: - explicit BrightMonitor(QString path, QObject *parent); - ~BrightMonitor(); - - void setPrimary(bool primary); - -protected Q_SLOTS: +public slots: + void setBrightness(int value); void onPropertyChanged(const QDBusMessage &msg); +private: + QDBusMessage callMethod(const QString &methodName, const QList &argument); + private: QString m_path; QString m_name; diff --git a/frame/window/components/brightnessmonitorwidget.cpp b/frame/window/components/brightnessmonitorwidget.cpp deleted file mode 100644 index a37a4c3fa..000000000 --- a/frame/window/components/brightnessmonitorwidget.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "brightnessmonitorwidget.h" -#include "brightnessmodel.h" -#include "slidercontainer.h" -#include "settingdelegate.h" -#include "imageutil.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -#define ITEMSPACE 16 - -BrightnessMonitorWidget::BrightnessMonitorWidget(BrightnessModel *model, QWidget *parent) - : QWidget(parent) - , m_sliderWidget(new QWidget(this)) - , m_sliderLayout(new QVBoxLayout(m_sliderWidget)) - , m_descriptionLabel(new QLabel(tr("Collaboration"), this)) - , m_deviceList(new DListView(this)) - , m_brightModel(model) - , m_model(new QStandardItemModel(this)) - , m_delegate(new SettingDelegate(m_deviceList)) -{ - initUi(); - initConnection(); - reloadMonitor(); - - QMetaObject::invokeMethod(this, [ this ]{ - resetHeight(); - }, Qt::QueuedConnection); -} - -BrightnessMonitorWidget::~BrightnessMonitorWidget() -{ -} - -void BrightnessMonitorWidget::initUi() -{ - QVBoxLayout *layout = new QVBoxLayout(this); - layout->setContentsMargins(10, 12, 10, 12); - layout->setSpacing(6); - - m_sliderLayout->setContentsMargins(0, 0, 0, 0); - m_sliderLayout->setSpacing(5); - - QList monitors = m_brightModel->monitors(); - for (BrightMonitor *monitor : monitors) { - SliderContainer *container = new SliderContainer(m_sliderWidget); - container->setTitle(monitor->name()); - QPixmap leftPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesslow", QSize(20, 20)); - QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesshigh", QSize(20, 20)); - container->updateSlider(SliderContainer::IconPosition::LeftIcon, { leftPixmap.size(), QSize(), leftPixmap, 12 }); - container->updateSlider(SliderContainer::IconPosition::RightIcon, { rightPixmap.size(), QSize(), rightPixmap, 12 }); - - container->setFixedHeight(50); - m_sliderLayout->addWidget(container); - - SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); - proxy->setParent(container->slider()); - container->slider()->setStyle(proxy); - - m_sliderContainers << qMakePair(monitor, container); - } - - layout->addSpacing(ITEMSPACE - layout->spacing()); - layout->addWidget(m_sliderWidget); - layout->addSpacing(4); - layout->addWidget(m_descriptionLabel); - - m_deviceList->setContentsMargins(0, 0, 0, 0); - m_deviceList->setModel(m_model); - m_deviceList->setViewMode(QListView::ListMode); - m_deviceList->setMovement(QListView::Free); - m_deviceList->setItemRadius(12); - m_deviceList->setWordWrap(false); - m_deviceList->verticalScrollBar()->setVisible(false); - m_deviceList->horizontalScrollBar()->setVisible(false); - m_deviceList->setOrientation(QListView::Flow::TopToBottom, false); - layout->addWidget(m_deviceList); - layout->addStretch(); - m_deviceList->setSpacing(10); - - m_deviceList->setItemDelegate(m_delegate); -} - -void BrightnessMonitorWidget::initConnection() -{ - connect(m_delegate, &SettingDelegate::selectIndexChanged, this, [ this ](const QModelIndex &index) { - BrightMonitor *monitor = index.data(itemDataRole).value(); - if (monitor) { - m_deviceList->update(); - // 更新滚动条的内容 - onBrightChanged(monitor); - } else { - DDBusSender().service("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .method("ShowPage").arg(QString("display")).call(); - hide(); - } - }); - - for (QPair container : m_sliderContainers) { - SliderContainer *sliderContainer = container.second; - sliderContainer->slider()->setValue(container.first->brihtness()); - connect(sliderContainer->slider(), &QSlider::valueChanged, this, [ this, container ](int value) { - m_brightModel->setBrightness(container.first, value); - }); - } - - connect(m_brightModel, &BrightnessModel::brightnessChanged, this, &BrightnessMonitorWidget::onBrightChanged); -} - -void BrightnessMonitorWidget::reloadMonitor() -{ - m_model->clear(); - // 跨端协同列表,后续会新增该功能 - // 显示设置 - DStandardItem *settingItem = new DStandardItem; - settingItem->setIcon(QIcon("")); - settingItem->setText(tr("Display settings")); - settingItem->setFlags(Qt::NoItemFlags); - settingItem->setData(false, itemCheckRole); - m_model->appendRow(settingItem); -} - -void BrightnessMonitorWidget::onBrightChanged(BrightMonitor *monitor) -{ - for (QPair container : m_sliderContainers) { - SliderContainer *slider = container.second; - if (container.first == monitor) { - slider->slider()->blockSignals(true); - slider->slider()->setValue(monitor->brihtness()); - slider->slider()->blockSignals(false); - } - } -} - -void BrightnessMonitorWidget::resetHeight() -{ - int viewHeight = 0; - for (int i = 0; i < m_model->rowCount(); i++) { - QRect indexRect = m_deviceList->visualRect(m_model->index(i, 0)); - viewHeight += indexRect.height(); - // 上下间距 - viewHeight += m_deviceList->spacing() * 2; - } - // 设置列表的高度 - m_deviceList->setFixedHeight(viewHeight); - QMargins sliderMargin = m_sliderLayout->contentsMargins(); - int sliderHeight = sliderMargin.top() + sliderMargin.bottom(); - for (QPair container : m_sliderContainers) { - SliderContainer *slider = container.second; - sliderHeight += slider->height(); - } - - m_sliderWidget->setFixedHeight(sliderHeight); - QMargins m = layout()->contentsMargins(); - int space1 = ITEMSPACE - layout()->spacing(); - int space2 = 4; - int height = m.top() + m.bottom() + sliderHeight + space1 - + m_descriptionLabel->height() + space2 + m_deviceList->height(); - setFixedHeight(height); -} diff --git a/frame/window/components/brightnessmonitorwidget.h b/frame/window/components/brightnessmonitorwidget.h deleted file mode 100644 index 7fdbd994a..000000000 --- a/frame/window/components/brightnessmonitorwidget.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef BRIGHTNESSMONITORWIDGET_H -#define BRIGHTNESSMONITORWIDGET_H - -#include -#include - -class QLabel; -class SliderContainer; -class BrightnessModel; -class QStandardItemModel; -class QVBoxLayout; -class SliderContainer; -class BrightMonitor; -class SettingDelegate; - -namespace Dtk { namespace Widget { class DListView; } } - -using namespace Dtk::Widget; - -class BrightnessMonitorWidget : public QWidget -{ - Q_OBJECT - -public: - explicit BrightnessMonitorWidget(BrightnessModel *model, QWidget *parent = nullptr); - ~BrightnessMonitorWidget() override; - -private: - void initUi(); - void initConnection(); - void reloadMonitor(); - - void resetHeight(); - -private Q_SLOTS: - void onBrightChanged(BrightMonitor *monitor); - -private: - QWidget *m_sliderWidget; - QVBoxLayout *m_sliderLayout; - QList> m_sliderContainers; - QLabel *m_descriptionLabel; - DListView *m_deviceList; - BrightnessModel *m_brightModel; - QStandardItemModel *m_model; - SettingDelegate *m_delegate; -}; - -#endif // BRIGHTNESSMONITORWIDGET_H diff --git a/frame/window/components/brightnesswidget.cpp b/frame/window/components/brightnesswidget.cpp index eda1b707d..cd8cff6a8 100644 --- a/frame/window/components/brightnesswidget.cpp +++ b/frame/window/components/brightnesswidget.cpp @@ -20,7 +20,6 @@ */ #include "brightnesswidget.h" #include "brightnessmodel.h" -#include "brightnessmonitorwidget.h" #include "imageutil.h" #include "slidercontainer.h" @@ -51,50 +50,50 @@ SliderContainer *BrightnessWidget::sliderContainer() void BrightnessWidget::showEvent(QShowEvent *event) { DBlurEffectWidget::showEvent(event); + + // 显示的时候更新一下slider的主屏幕亮度值 + updateSliderValue(); Q_EMIT visibleChanged(true); } void BrightnessWidget::hideEvent(QHideEvent *event) { DBlurEffectWidget::hideEvent(event); + Q_EMIT visibleChanged(true); } void BrightnessWidget::initUi() { - QHBoxLayout *layout = new QHBoxLayout(this); - layout->setContentsMargins(15, 0, 12, 0); - layout->addWidget(m_sliderContainer); + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(15, 0, 12, 0); QPixmap leftPixmap = ImageUtil::loadSvg(":/icons/resources/brightness.svg", QSize(IMAGESIZE, IMAGESIZE)); QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/ICON_Device_Laptop.svg", QSize(IMAGESIZE, IMAGESIZE)); - m_sliderContainer->updateSlider(SliderContainer::IconPosition::LeftIcon, { leftPixmap.size(), QSize(), leftPixmap, 10 }); - m_sliderContainer->updateSlider(SliderContainer::IconPosition::RightIcon, { rightPixmap.size(), QSize(BACKSIZE, BACKSIZE), rightPixmap, 12}); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); + m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); SliderProxyStyle *style = new SliderProxyStyle; - style->setParent(m_sliderContainer->slider()); - m_sliderContainer->slider()->setStyle(style); + m_sliderContainer->setSliderProxyStyle(style); + + mainLayout->addWidget(m_sliderContainer); } void BrightnessWidget::initConnection() { - connect(m_sliderContainer->slider(), &QSlider::valueChanged, this, [ this ](int value) { + connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { BrightMonitor *monitor = m_model->primaryMonitor(); if (monitor) - m_model->setBrightness(monitor, value); + monitor->setBrightness(value); }); - connect(m_model, &BrightnessModel::brightnessChanged, this, &BrightnessWidget::onUpdateBright); - - BrightMonitor *monitor = m_model->primaryMonitor(); - if (monitor) - onUpdateBright(monitor); + updateSliderValue(); } -void BrightnessWidget::onUpdateBright(BrightMonitor *monitor) +void BrightnessWidget::updateSliderValue() { - if (!monitor->isPrimary()) - return; - // 此处只显示主屏的亮度 - m_sliderContainer->slider()->setValue(monitor->brihtness()); + BrightMonitor *monitor = m_model->primaryMonitor(); + if (monitor) { + m_sliderContainer->updateSliderValue(monitor->brightness()); + } } diff --git a/frame/window/components/brightnesswidget.h b/frame/window/components/brightnesswidget.h index c8f11a552..c8ca44721 100644 --- a/frame/window/components/brightnesswidget.h +++ b/frame/window/components/brightnesswidget.h @@ -45,12 +45,10 @@ protected: void showEvent(QShowEvent *event) override; void hideEvent(QHideEvent *event) override; -private Q_SLOTS: - void onUpdateBright(BrightMonitor *monitor); - private: void initUi(); void initConnection(); + void updateSliderValue(); private: SliderContainer *m_sliderContainer; diff --git a/frame/window/components/slidercontainer.cpp b/frame/window/components/slidercontainer.cpp index a3a8e22d0..6ce0a95f2 100644 --- a/frame/window/components/slidercontainer.cpp +++ b/frame/window/components/slidercontainer.cpp @@ -23,14 +23,11 @@ #include "slidercontainer.h" #include -#include #include #include #include #include -#include -#include #include #include @@ -125,6 +122,8 @@ SliderContainer::SliderContainer(QWidget *parent) m_leftIconWidget->installEventFilter(this); m_slider->installEventFilter(this); m_rightIconWidget->installEventFilter(this); + + connect(m_slider, &QSlider::valueChanged, this, &SliderContainer::sliderValueChanged); } SliderContainer::~SliderContainer() @@ -145,21 +144,26 @@ QSize SliderContainer::getSuitableSize(const QSize &iconSize, const QSize &bgSiz return iconSize; } -void SliderContainer::updateSlider(const SliderContainer::IconPosition &iconPosition, const SliderContainer::SliderData &sliderData) +void SliderContainer::setIcon(const SliderContainer::IconPosition &iconPosition, const QPixmap &icon, + const QSize &shadowSize, int space) { + if (icon.isNull()) { + return; + } + switch (iconPosition) { - case IconPosition::LeftIcon: { - m_leftIconWidget->setFixedSize(getSuitableSize(sliderData.iconSize, sliderData.shadowSize)); - m_leftIconWidget->updateData(sliderData.icon, sliderData.iconSize, sliderData.shadowSize); - m_spaceLeftWidget->setFixedWidth(sliderData.space); - break; - } - case IconPosition::RightIcon: { - m_rightIconWidget->setFixedSize(getSuitableSize(sliderData.iconSize, sliderData.shadowSize)); - m_rightIconWidget->updateData(sliderData.icon, sliderData.iconSize, sliderData.shadowSize); - m_spaceRightWidget->setFixedWidth(sliderData.space); - break; - } + case IconPosition::LeftIcon: { + m_leftIconWidget->setFixedSize(getSuitableSize(icon.size(), shadowSize)); + m_leftIconWidget->updateData(icon, icon.size(), shadowSize); + m_spaceLeftWidget->setFixedWidth(space); + break; + } + case IconPosition::RightIcon: { + m_rightIconWidget->setFixedSize(getSuitableSize(icon.size(), shadowSize)); + m_rightIconWidget->updateData(icon, icon.size(), shadowSize); + m_spaceRightWidget->setFixedWidth(space); + break; + } } } @@ -177,11 +181,6 @@ void SliderContainer::setIcon(const SliderContainer::IconPosition &iconPosition, } } -QSlider *SliderContainer::slider() -{ - return m_slider; -} - bool SliderContainer::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::MouseButtonRelease) { @@ -194,6 +193,19 @@ bool SliderContainer::eventFilter(QObject *watched, QEvent *event) return QWidget::eventFilter(watched, event); } +void SliderContainer::updateSliderValue(int value) +{ + m_slider->blockSignals(true); + m_slider->setValue(value); + m_slider->blockSignals(false); +} + +void SliderContainer::setSliderProxyStyle(QProxyStyle *proxyStyle) +{ + proxyStyle->setParent(m_slider); + m_slider->setStyle(proxyStyle); +} + SliderProxyStyle::SliderProxyStyle(StyleType drawSpecial, QStyle *style) : QProxyStyle(style) , m_drawSpecial(drawSpecial) diff --git a/frame/window/components/slidercontainer.h b/frame/window/components/slidercontainer.h index 805056ea2..f2f8d76b7 100644 --- a/frame/window/components/slidercontainer.h +++ b/frame/window/components/slidercontainer.h @@ -46,24 +46,21 @@ public: RightIcon }; - struct SliderData { - QSize iconSize; // 图标尺寸 - QSize shadowSize; // 阴影尺寸 - QIcon icon; // 图标 - int space; // 间距 - }; - public: explicit SliderContainer(QWidget *parent); ~SliderContainer() override; void setTitle(const QString &text); - void updateSlider(const IconPosition &iconPosition, const SliderData &sliderData); + void setSliderProxyStyle(QProxyStyle *proxyStyle); void setIcon(const IconPosition &iconPosition, const QIcon &icon); - QSlider *slider(); + void setIcon(const IconPosition &iconPosition, const QPixmap &icon, const QSize &shadowSize, int space); Q_SIGNALS: void iconClicked(const IconPosition &); + void sliderValueChanged(int value); + +public slots: + void updateSliderValue(int value); protected: bool eventFilter(QObject *watched, QEvent *event) override; diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp index efe2d614c..3bb238411 100644 --- a/frame/window/components/volumedeviceswidget.cpp +++ b/frame/window/components/volumedeviceswidget.cpp @@ -99,13 +99,12 @@ void VolumeDevicesWidget::initUi() sliderLayout->setSpacing(0); QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(24, 24)); - m_sliderContainer->updateSlider(SliderContainer::IconPosition::LeftIcon, { leftPixmap.size(), QSize(), leftPixmap, 5 }); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 5); QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(24, 24)); - m_sliderContainer->updateSlider(SliderContainer::IconPosition::RightIcon, { rightPixmap.size(), QSize(), rightPixmap, 7 }); + m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 7); SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); - proxy->setParent(m_sliderContainer->slider()); - m_sliderContainer->slider()->setStyle(proxy); + m_sliderContainer->setSliderProxyStyle(proxy); sliderLayout->addWidget(m_sliderContainer); QHBoxLayout *topLayout = new QHBoxLayout(this); @@ -156,26 +155,22 @@ void VolumeDevicesWidget::reloadAudioDevices() void VolumeDevicesWidget::initConnection() { m_audioSink = m_volumeModel->defaultSink(); - auto adjustVolumeSlider = [ this ](int volume) { - m_sliderContainer->slider()->blockSignals(true); - m_sliderContainer->slider()->setValue(volume); - m_sliderContainer->slider()->blockSignals(false); - }; + if (m_audioSink) - connect(m_audioSink, &AudioSink::volumeChanged, this, adjustVolumeSlider); - connect(m_volumeModel, &VolumeModel::defaultSinkChanged, this, [ this, adjustVolumeSlider ](AudioSink *sink) { + connect(m_audioSink, &AudioSink::volumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); + connect(m_volumeModel, &VolumeModel::defaultSinkChanged, this, [ this ](AudioSink *sink) { if (m_audioSink) disconnect(m_audioSink); m_audioSink = sink; - if (m_audioSink) - connect(m_audioSink, &AudioSink::volumeChanged, this, adjustVolumeSlider); + if (sink) + connect(sink, &AudioSink::volumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); resetVolumeInfo(); m_deviceList->update(); }); - connect(m_sliderContainer->slider(), &QSlider::valueChanged, this, [ this ](int value) { + connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { AudioSink *defSink = m_volumeModel->defaultSink(); if (!defSink) return; @@ -260,7 +255,5 @@ void VolumeDevicesWidget::resetVolumeInfo() if (!defaultSink) return; - m_sliderContainer->slider()->blockSignals(true); - m_sliderContainer->slider()->setValue(defaultSink->volume()); - m_sliderContainer->slider()->blockSignals(false); + m_sliderContainer->updateSliderValue(defaultSink->volume()); } diff --git a/frame/window/components/volumewidget.cpp b/frame/window/components/volumewidget.cpp index 18c3560b1..89532fbe5 100644 --- a/frame/window/components/volumewidget.cpp +++ b/frame/window/components/volumewidget.cpp @@ -62,7 +62,7 @@ VolumeWidget::~VolumeWidget() void VolumeWidget::initUi() { if (m_defaultSink) - m_sliderContainer->slider()->setValue(m_defaultSink->volume()); + m_sliderContainer->updateSliderValue(m_defaultSink->volume()); QHBoxLayout *mainLayout = new QHBoxLayout(this); mainLayout->setContentsMargins(17, 0, 12, 0); @@ -70,12 +70,11 @@ void VolumeWidget::initUi() QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE)); QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); - m_sliderContainer->updateSlider(SliderContainer::IconPosition::LeftIcon, { leftPixmap.size(), QSize(), leftPixmap, 12}); - m_sliderContainer->updateSlider(SliderContainer::IconPosition::RightIcon, { rightPixmap.size(), QSize(BACKSIZE, BACKSIZE), rightPixmap, 12}); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 12); + m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); SliderProxyStyle *proxy = new SliderProxyStyle; - proxy->setParent(m_sliderContainer->slider()); - m_sliderContainer->slider()->setStyle(proxy); + m_sliderContainer->setSliderProxyStyle(proxy); bool existActiveOutputDevice = m_model->existActiveOutputDevice(); setEnabled(existActiveOutputDevice); @@ -83,26 +82,21 @@ void VolumeWidget::initUi() void VolumeWidget::initConnection() { - auto setCtrlVolumeValue = [this](int volume) { - m_sliderContainer->blockSignals(true); - m_sliderContainer->slider()->setValue(volume); - m_sliderContainer->blockSignals(false); - }; if (m_defaultSink) - connect(m_defaultSink, &AudioSink::volumeChanged, this, setCtrlVolumeValue); + connect(m_defaultSink, &AudioSink::volumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); - connect(m_model, &VolumeModel::defaultSinkChanged, this, [ this, setCtrlVolumeValue ](AudioSink *sink) { + connect(m_model, &VolumeModel::defaultSinkChanged, this, [ this ](AudioSink *sink) { if (m_defaultSink) disconnect(m_defaultSink); m_defaultSink = sink; if (sink) { - setCtrlVolumeValue(sink->volume()); - connect(m_defaultSink, &AudioSink::volumeChanged, this, setCtrlVolumeValue); + m_sliderContainer->updateSliderValue(sink->volume()); + connect(sink, &AudioSink::volumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); } }); - connect(m_sliderContainer->slider(), &QSlider::valueChanged, this, [ this ](int value) { + connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { AudioSink *sink = m_model->defaultSink(); if (sink) sink->setVolume(value, true); diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 195670313..53c290e5a 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -29,7 +29,6 @@ #include "slidercontainer.h" #include "volumewidget.h" #include "volumedeviceswidget.h" -#include "brightnessmonitorwidget.h" #include "pluginchildpage.h" #include "volumemodel.h" @@ -68,7 +67,6 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_volumnWidget(new VolumeWidget(m_volumeModel, m_componentWidget)) , m_brihtnessWidget(new BrightnessWidget(m_brightnessModel, m_componentWidget)) , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumeModel, this)) - , m_brightSettingWidget(new BrightnessMonitorWidget(m_brightnessModel, this)) , m_childPage(new PluginChildPage(this)) , m_dragPluginPosition(QPoint(0, 0)) { @@ -313,7 +311,6 @@ void QuickSettingContainer::initUi() m_switchLayout->addWidget(m_childPage); m_volumeSettingWidget->hide(); - m_brightSettingWidget->hide(); setMouseTracking(true); setAcceptDrops(true); @@ -341,7 +338,7 @@ void QuickSettingContainer::initConnection() connect(m_brihtnessWidget->sliderContainer(), &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &iconPosition) { if (iconPosition == SliderContainer::RightIcon) { // 点击右侧的按钮,弹出具体的调节的界面 - showWidget(m_brightSettingWidget, tr("brightness")); + // showWidget(m_brightSettingWidget, tr("brightness")); resizeView(); } }); diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 4222933ea..0ee1a4452 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -41,7 +41,6 @@ class QuickSettingItem; class DockPopupWindow; class QStackedLayout; class VolumeDevicesWidget; -class BrightnessMonitorWidget; class QLabel; class PluginChildPage; class QGridLayout; @@ -104,7 +103,6 @@ private: BrightnessWidget *m_brihtnessWidget; VolumeDevicesWidget *m_volumeSettingWidget; - BrightnessMonitorWidget *m_brightSettingWidget; PluginChildPage *m_childPage; QPoint m_dragPluginPosition; }; From d97ce8c67abc072b09a65b25cd5da92baffe2e2e Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 22 Jul 2022 02:27:43 +0000 Subject: [PATCH 062/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=88=96=E5=85=B6=E4=BB=96=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E6=89=93=E5=BC=80=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E5=8D=A1=E6=AD=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 控制中心的接口已从com.deepin.dde.ControlCenter改成org.deepin.dde.ControlCenter,对应的任务栏的相关接口也要做相应的修改 Log: 优化任务栏打开控制中心的问题 Influence: 任务栏-任务栏设置-打开控制中心,观察打开的时间 Bug: https://pms.uniontech.com/bug-view-149189.html Change-Id: I30f50b9b824ca819884f31ddf1671f40e813486a --- frame/util/menuworker.cpp | 6 +++--- frame/window/components/volumedeviceswidget.cpp | 6 +++--- plugins/airplane-mode/airplanemodeitem.cpp | 6 +++--- plugins/bluetooth/bluetoothitem.cpp | 6 +++--- plugins/bluetooth/componments/bluetoothapplet.cpp | 6 +++--- plugins/datetime/datetimeplugin.cpp | 6 +++--- plugins/keyboard-layout/dbusadaptors.cpp | 6 +++--- plugins/power/powerplugin.cpp | 8 ++++---- plugins/shutdown/shutdownplugin.cpp | 6 +++--- plugins/sound/sounditem.cpp | 6 +++--- 10 files changed, 31 insertions(+), 31 deletions(-) diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index 04f98eda1..ab321ed0a 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -158,9 +158,9 @@ QMenu *MenuWorker::createMenu(QMenu *settingsMenu) void MenuWorker::onDockSettingsTriggered() { - DDBusSender().service("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .interface("com.deepin.dde.ControlCenter") + DDBusSender().service("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") + .interface("org.deepin.dde.ControlCenter") .method("ShowPage") .arg(QString("personalization/dock")) .call(); diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp index 3bb238411..0ec36aff2 100644 --- a/frame/window/components/volumedeviceswidget.cpp +++ b/frame/window/components/volumedeviceswidget.cpp @@ -194,9 +194,9 @@ void VolumeDevicesWidget::initConnection() m_deviceList->update(); } else { // 打开控制中心的声音模块 - DDBusSender().service("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .interface("com.deepin.dde.ControlCenter") + DDBusSender().service("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") + .interface("org.deepin.dde.ControlCenter") .method("ShowPage").arg(QString("sound")).call(); hide(); } diff --git a/plugins/airplane-mode/airplanemodeitem.cpp b/plugins/airplane-mode/airplanemodeitem.cpp index 68c4d61f7..bcbaa206d 100644 --- a/plugins/airplane-mode/airplanemodeitem.cpp +++ b/plugins/airplane-mode/airplanemodeitem.cpp @@ -114,9 +114,9 @@ void AirplaneModeItem::invokeMenuItem(const QString menuId, const bool checked) m_airplaneModeInter->Enable(!m_airplaneModeInter->enabled()); else if (menuId == SETTINGS) DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter") + .interface("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") .method(QString("ShowPage")) .arg(QString("network")) .arg(QString("Airplane Mode")) diff --git a/plugins/bluetooth/bluetoothitem.cpp b/plugins/bluetooth/bluetoothitem.cpp index 65c8ba5d3..a2ca2ac11 100644 --- a/plugins/bluetooth/bluetoothitem.cpp +++ b/plugins/bluetooth/bluetoothitem.cpp @@ -118,9 +118,9 @@ void BluetoothItem::invokeMenuItem(const QString menuId, const bool checked) m_applet->setAdapterPowered(!m_adapterPowered); } else if (menuId == SETTINGS) { DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter") + .interface("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index 98ba00522..9f579e3f3 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -277,9 +277,9 @@ void BluetoothApplet::initConnect() connect(m_settingLabel, &SettingLabel::clicked, this, [ = ] { DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter") + .interface("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index ac3711eb6..c6ddf01af 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -191,9 +191,9 @@ void DatetimePlugin::invokedMenuItem(const QString &itemKey, const QString &menu if (menuId == "open") { DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter") + .interface("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") .method(QString("ShowPage")) .arg(QString("datetime")) .call(); diff --git a/plugins/keyboard-layout/dbusadaptors.cpp b/plugins/keyboard-layout/dbusadaptors.cpp index 250e794bd..0e2f45b97 100644 --- a/plugins/keyboard-layout/dbusadaptors.cpp +++ b/plugins/keyboard-layout/dbusadaptors.cpp @@ -174,9 +174,9 @@ void DBusAdaptors::handleActionTriggered(QAction *action) { if (action == m_addLayoutAction) { DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter") + .interface("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") .method("ShowPage") .arg(QString("keyboard")) .arg(QString("Keyboard Layout/Add Keyboard Layout")) diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index ec7358888..3a9252eaf 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -113,7 +113,7 @@ bool PowerPlugin::pluginIsDisable() const QString PowerPlugin::itemCommand(const QString &itemKey) { if (itemKey == POWER_KEY) - return QString("dbus-send --print-reply --dest=com.deepin.dde.ControlCenter /com/deepin/dde/ControlCenter com.deepin.dde.ControlCenter.ShowPage \"string:power\""); + return QString("dbus-send --print-reply --dest=org.deepin.dde.ControlCenter /org/deepin/dde/ControlCenter org.deepin.dde.ControlCenter.ShowPage \"string:power\""); return QString(); } @@ -150,9 +150,9 @@ void PowerPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, if (menuId == "power") { DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter") + .interface("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") .method(QString("ShowPage")) .arg(QString("power")) .call(); diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index 35d9bb1d5..fc5d5dd7d 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -234,9 +234,9 @@ void ShutdownPlugin::invokedMenuItem(const QString &itemKey, const QString &menu if (menuId == "power") { DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter") + .interface("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") .method(QString("ShowPage")) .arg(QString("power")) .call(); diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 4690622e6..2e878066b 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -129,9 +129,9 @@ void SoundItem::invokeMenuItem(const QString menuId, const bool checked) m_sinkInter->SetMuteQueued(!m_sinkInter->mute()); else if (menuId == SETTINGS) DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter") + .interface("org.deepin.dde.ControlCenter") + .path("/org/deepin/dde/ControlCenter") .method(QString("ShowPage")) .arg(QString("sound")) .call(); From 9aa5dd4639a641df84a5607d96a8af872022f16d Mon Sep 17 00:00:00 2001 From: caixiangrong Date: Mon, 25 Jul 2022 13:11:00 +0800 Subject: [PATCH 063/257] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新版本号为6.0.3 Log: Task: https://pms.uniontech.com/task-view-160471.html Influence: 版本号 Change-Id: I414a87175c1ecab38982f89bc20191b24ac72d69 --- debian/changelog | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/debian/changelog b/debian/changelog index bdf6bb33e..eef53b148 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,21 @@ +dde-dock (6.0.3) unstable; urgency=medium + + [ TagBuilder ] + * fix: 修复debian打包使用AM宏不生效的问题(Task: 133075)(Influence: 任务栏是否使用AM服务) + * fix: 修复wayland环境下任务栏右键菜单带有标题栏的问题(Bug: 140873)(Influence: wayland下查看任务栏图表的右键菜单) + * fix: 修复任务栏在高缩放率下防呆位置错误(Influence: 高缩放率下,查看防呆区域) + * fix: 删除任务栏启动时候用ldd检测libdtk库(Task: 157235)(Influence: 任务栏启动的时候检测是否有ldd报错信息) + * feat: 暂时取消使用AM宏(Task: 162227)(Influence: 无) + * feat: 增加最近使用应用的功能(Task: 158441)(Influence: 控制中心最近使用区域开启情况下,时尚模式,打开一个没有驻留在任务栏的应用,查看新打开的应用是否在最近打开应用区域) + * feat: 增加工具区域的使用(Task: 152867)(Influence: 时尚模式下,查看最近打开区域右侧是否显示回收站,来回切换时尚模式与高效模式,查看回收站位置是否发生变化) + * feat: recompile(Influence: recompile) + * feat: 点击任务栏时间显示窗口呼出小组件面板。(Task: 165407)(Influence: 点击任务栏时间窗口小组件是否显示。) + * fix: 修复拖拽托盘窗口图标至任务栏托盘区域经常失败的问题。(Bug: 147789)(Influence: 拖拽托盘窗口图标至任务栏托盘区域。) + * chore: 优化有关slider等相关的操作代码(Influence: 快捷设置面板slider操作。) + * fix: 修复从任务栏或其他应用打开控制中心卡死的问题(Bug: 149189)(Influence: 任务栏-任务栏设置-打开控制中心,观察打开的时间) + + -- caixiangrong Mon, 25 Jul 2022 13:10:23 +0800 + dde-dock (6.0.2) unstable; urgency=low * release 6.0.2 From a13a4f3b8411fc27cb97ae2c136027c0eac67922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Fri, 29 Jul 2022 11:48:06 +0800 Subject: [PATCH 064/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=98?= =?UTF-8?q?=E7=9B=98=E5=9B=BE=E6=A0=87=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对提示的窗体设置无边框属性,避免在wayland下显示窗口标题 Log: 修复托盘图标提示信息显示异常的问题 Influence: 托盘提示信息显示 Bug: https://pms.uniontech.com/bug-view-150521.html Change-Id: I50c67ebf555b590bd5ecf2554eb845c7a85ef360 --- plugins/tray/snitraywidget.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/tray/snitraywidget.cpp b/plugins/tray/snitraywidget.cpp index 9d5c0315d..8d88b3059 100644 --- a/plugins/tray/snitraywidget.cpp +++ b/plugins/tray/snitraywidget.cpp @@ -21,6 +21,7 @@ #include "snitraywidget.h" #include "util/themeappicon.h" +#include "util/utils.h" #include "../../widgets/tipswidget.h" #include @@ -71,6 +72,10 @@ SNITrayWidget::SNITrayWidget(const QString &sniServicePath, QWidget *parent) arrowRectangle->setArrowWidth(18); arrowRectangle->setArrowHeight(10); arrowRectangle->setObjectName("snitraypopup"); + if (Utils::IS_WAYLAND_DISPLAY) { + Qt::WindowFlags flags = arrowRectangle->windowFlags() | Qt::FramelessWindowHint; + arrowRectangle->setWindowFlags(flags); + } PopupWindow = arrowRectangle; connect(qApp, &QApplication::aboutToQuit, PopupWindow, &DockPopupWindow::deleteLater); } From 2194af2f6b7727054eafa1054b0441cf40037bd5 Mon Sep 17 00:00:00 2001 From: lvpeilong Date: Mon, 1 Aug 2022 17:20:02 +0800 Subject: [PATCH 065/257] =?UTF-8?q?fix:=20=E6=97=B6=E5=B0=9A=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=97=B6=E9=97=B4=E6=97=A5=E6=9C=9Ftips=E6=9C=89wayla?= =?UTF-8?q?nd=E9=BB=98=E8=AE=A4tittle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 时尚模式时间日期tips窗口wayland下未设置无边框属性 Log: 任务栏时尚模式时间日期tips窗口wayland下添加置无边框属性 Bug: https://pms.uniontech.com/bug-view-149173.html Influence: 任务栏时尚模式下时间日期tips是否显示正常 Change-Id: Id35ee366e0ad9f75d0b2f2e48fa12ea5e78a0845 --- frame/window/components/datetimedisplayer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index f86f95275..e751d1ac6 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -21,6 +21,7 @@ #include "datetimedisplayer.h" #include "tipswidget.h" #include "dockpopupwindow.h" +#include "utils.h" #include #include @@ -64,6 +65,9 @@ DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) m_tipsTimer->start(); updatePolicy(); m_tipPopupWindow->hide(); + if (Utils::IS_WAYLAND_DISPLAY) { + m_tipPopupWindow->setWindowFlags(m_tipPopupWindow->windowFlags() | Qt::FramelessWindowHint); + } } DateTimeDisplayer::~DateTimeDisplayer() From f938f66bb56627a9238f1934843304643627efa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Mon, 1 Aug 2022 14:44:03 +0800 Subject: [PATCH 066/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=9A?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=A7=86=E5=9B=BE=E7=95=8C=E9=9D=A2=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E4=BB=BB=E6=84=8F=E5=A4=84=E5=9D=87=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=98=BE=E7=A4=BA=E5=8F=B3=E9=94=AE?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 任务栏错误收到了一次点击事件, 在显示之前判断一下当前的位置是否在任务栏之上即可 Log: 修复多任务视图界面点击任意处均导致任务栏显示右键菜单的问题 Influence: 任务栏右键菜单显示的时机 Bug: https://pms.uniontech.com/bug-view-150507.html Change-Id: Iec1764213ce8ae314a8d2a97537cb05ebf48a694 --- frame/window/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 8612418d2..3f1a55a62 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -209,7 +209,7 @@ void MainWindow::reloadPlugins() void MainWindow::mousePressEvent(QMouseEvent *e) { e->ignore(); - if (e->button() == Qt::RightButton) { + if (e->button() == Qt::RightButton && this->geometry().contains(QCursor::pos())) { QTimer::singleShot(10, this, [this]{ QMenu *menu = new QMenu(this); m_menuWorker->showDockSettingsMenu(menu); From 9c1eb32e242e31468ce01c0f1158f1ea1253df8e Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 12 Aug 2022 08:13:00 +0000 Subject: [PATCH 067/257] =?UTF-8?q?feat:=20=E6=8B=96=E5=8A=A8=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=9B=BE=E6=A0=87=E5=AE=9E=E7=8E=B0=E5=88=86?= =?UTF-8?q?=E5=B1=8F=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 拖动任务栏图标到屏幕中间,如果在左侧,显示左分屏效果,在右侧,显示右分屏效果 Log: 完成任务栏图标分屏效果的功能 Influence: 从任务栏拖动图标到屏幕上方,查看是否有分屏功能 Task: https://pms.uniontech.com/task-view-163465.html Change-Id: I1a7a33646edb6f55972b8e5fa2c5f39ce026fe8e --- CMakeLists.txt | 5 + debian/control | 5 +- frame/CMakeLists.txt | 18 +- frame/dbus/entryinterface.cpp | 18 +- frame/dbus/entryinterface.h | 1 + frame/display/displaymanager.cpp | 11 + frame/display/displaymanager.h | 1 + frame/item/appitem.cpp | 32 +- frame/item/appitem.h | 10 + frame/item/components/appdragwidget.cpp | 413 ++++++++++++------ frame/item/components/appdragwidget.h | 31 +- frame/screenspliter/screenspliter.cpp | 60 +++ frame/screenspliter/screenspliter.h | 71 +++ frame/screenspliter/screenspliter_wayland.cpp | 247 +++++++++++ frame/screenspliter/screenspliter_wayland.h | 103 +++++ frame/screenspliter/screenspliter_xcb.cpp | 240 ++++++++++ frame/screenspliter/screenspliter_xcb.h | 55 +++ frame/window/mainpanelcontrol.cpp | 41 +- frame/window/quickpluginwindow.cpp | 2 +- 19 files changed, 1194 insertions(+), 170 deletions(-) create mode 100644 frame/screenspliter/screenspliter.cpp create mode 100644 frame/screenspliter/screenspliter.h create mode 100644 frame/screenspliter/screenspliter_wayland.cpp create mode 100644 frame/screenspliter/screenspliter_wayland.h create mode 100644 frame/screenspliter/screenspliter_xcb.cpp create mode 100644 frame/screenspliter/screenspliter_xcb.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f8c914dc..e3367c511 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,11 @@ configure_file(dde-dock.pc.in dde-dock.pc @ONLY) project(dde-dock) +set(CMAKE_THREAD_LIBS_INIT "-lpthread") +set(CMAKE_HAVE_THREADS_LIBRARY 1) +set(CMAKE_USE_PTHREADS_INIT 1) +set(CMAKE_PREFER_PTHREAD_FLAG ON) + #set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_CXX_STANDARD 14) set(CMAKE_INCLUDE_CURRENT_DIR ON) diff --git a/debian/control b/debian/control index 2edbb43a3..66aa5d90c 100644 --- a/debian/control +++ b/debian/control @@ -26,7 +26,10 @@ Build-Depends: debhelper (>= 8.0.0), libgtest-dev, libgmock-dev, qttools5-dev, - libxcursor-dev + libxcursor-dev, + libqt5waylandclient5-dev, + qtwayland5-private-dev, + libdwayland-dev Standards-Version: 3.9.8 Homepage: http://www.deepin.org/ diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index 20724aa79..1c6775afd 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -5,8 +5,8 @@ set(BIN_NAME dde-dock) configure_file(environments.h.in environments.h @ONLY) if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fsanitize=address -O2") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -O2") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fsanitize=address -O0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -O0") endif() # Sources files @@ -19,6 +19,8 @@ find_package(Qt5Concurrent REQUIRED) find_package(Qt5X11Extras REQUIRED) find_package(Qt5DBus REQUIRED) find_package(Qt5Svg REQUIRED) +find_package(Qt5WaylandClient REQUIRED) +find_package(Qt5XkbCommonSupport REQUIRED) find_package(DtkWidget REQUIRED) find_package(DtkCMake REQUIRED) find_package(dbusmenu-qt5 REQUIRED) @@ -28,6 +30,9 @@ pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) pkg_check_modules(DtkGUI REQUIRED dtkgui) +set(Wayland_INCLUDE_DIRS /usr/include/DWayland/Client) +set(Wayland_LIBRARIES /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/libDWaylandClient.so) + # driver-manager add_executable(${BIN_NAME} ${SRCS} @@ -45,6 +50,10 @@ target_include_directories(${BIN_NAME} PUBLIC ${DtkGUI_INCLUDE_DIRS} ${Qt5Svg_INCLUDE_DIRS} ${dbusmenu-qt5_INCLUDE_DIRS} + ${Wayland_INCLUDE_DIRS} + ${Qt5WaylandClient_INCLUDE_DIRS} + ${Qt5WaylandClient_PRIVATE_INCLUDE_DIRS} + ${Qt5XkbCommonSupport_PRIVATE_INCLUDE_DIRS} ../interfaces ../widgets accessible @@ -54,6 +63,7 @@ target_include_directories(${BIN_NAME} PUBLIC item item/components model + screenspliter util window window/components @@ -82,6 +92,10 @@ target_link_libraries(${BIN_NAME} PRIVATE ${QGSettings_LIBRARIES} ${DtkGUI_LIBRARIES} ${Qt5Svg_LIBRARIES} + ${Wayland_LIBRARIES} + ${Qt5Wayland_LIBRARIES} + ${Qt5WaylandClient_LIBRARIES} + ${Qt5XkbCommonSupport_LIBRARIES} -lpthread -lm ) diff --git a/frame/dbus/entryinterface.cpp b/frame/dbus/entryinterface.cpp index f2245f921..18443a888 100644 --- a/frame/dbus/entryinterface.cpp +++ b/frame/dbus/entryinterface.cpp @@ -49,7 +49,7 @@ void registerWindowInfoMetaType() QDebug operator<<(QDebug argument, const WindowInfo &info) { - argument << '(' << info.title << ',' << info.attention << ')'; + argument << '(' << info.title << ',' << info.attention << info.uuid << ')'; return argument; } @@ -57,7 +57,7 @@ QDebug operator<<(QDebug argument, const WindowInfo &info) QDBusArgument &operator<<(QDBusArgument &argument, const WindowInfo &info) { argument.beginStructure(); - argument << info.title << info.attention; + argument << info.title << info.attention << info.uuid; argument.endStructure(); return argument; @@ -66,7 +66,7 @@ QDBusArgument &operator<<(QDBusArgument &argument, const WindowInfo &info) const QDBusArgument &operator>>(const QDBusArgument &argument, WindowInfo &info) { argument.beginStructure(); - argument >> info.title >> info.attention; + argument >> info.title >> info.attention >> info.uuid; argument.endStructure(); return argument; @@ -74,14 +74,20 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, WindowInfo &info) bool WindowInfo::operator==(const WindowInfo &rhs) const { - return attention == rhs.attention && - title == rhs.title; + return (attention == rhs.attention && + title == rhs.title && + uuid == rhs.uuid); } class EntryPrivate { public: - EntryPrivate() = default; + EntryPrivate() + : CurrentWindow(0) + , IsActive(false) + , IsDocked(false) + , mode(0) + {} // begin member variables uint CurrentWindow; diff --git a/frame/dbus/entryinterface.h b/frame/dbus/entryinterface.h index 2e0b84a7f..4cce4fef6 100644 --- a/frame/dbus/entryinterface.h +++ b/frame/dbus/entryinterface.h @@ -53,6 +53,7 @@ public: public: bool attention; QString title; + QString uuid; }; Q_DECLARE_METATYPE(WindowInfo) diff --git a/frame/display/displaymanager.cpp b/frame/display/displaymanager.cpp index a5d43c299..e4406fa37 100644 --- a/frame/display/displaymanager.cpp +++ b/frame/display/displaymanager.cpp @@ -69,6 +69,17 @@ QScreen *DisplayManager::screen(const QString &screenName) const return nullptr; } +QScreen *DisplayManager::screenAt(const QPoint &pos) const +{ + for (QScreen *screen : m_screens) { + QRect screenGeometry = screen->geometry(); + if (screenGeometry.contains(pos)) + return screen; + } + + return nullptr; +} + /** * @brief DisplayManager::primary * @return 主屏幕名称 diff --git a/frame/display/displaymanager.h b/frame/display/displaymanager.h index 99673dc15..bc4ebfa6d 100644 --- a/frame/display/displaymanager.h +++ b/frame/display/displaymanager.h @@ -45,6 +45,7 @@ public: QList screens() const; QScreen *screen(const QString &screenName) const; + QScreen *screenAt(const QPoint &pos) const; QString primary() const; int screenRawWidth() const; int screenRawHeight() const; diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 3ddd8529c..875071760 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -25,6 +25,7 @@ #include "xcb_misc.h" #include "appswingeffectbuilder.h" #include "utils.h" +#include "screenspliter.h" #include #include @@ -70,6 +71,7 @@ AppItem::AppItem(const QGSettings *appSettings, const QGSettings *activeAppSetti , m_refershIconTimer(new QTimer(this)) , m_themeType(DGuiApplicationHelper::instance()->themeType()) , m_createMSecs(QDateTime::currentMSecsSinceEpoch()) + , m_screenSpliter(ScreenSpliterFactory::createScreenSpliter(this, m_itemEntryInter)) { QHBoxLayout *centralLayout = new QHBoxLayout; centralLayout->setMargin(0); @@ -103,7 +105,6 @@ AppItem::AppItem(const QGSettings *appSettings, const QGSettings *activeAppSetti connect(this, &AppItem::requestUpdateEntryGeometries, this, &AppItem::updateWindowIconGeometries); updateWindowInfos(m_itemEntryInter->windowInfos()); - refreshIcon(); if (m_appSettings) connect(m_appSettings, &QGSettings::changed, this, &AppItem::onGSettingsChanged); @@ -182,6 +183,31 @@ void AppItem::setDockInfo(Dock::Position dockPosition, const QRect &dockGeometry } } +void AppItem::setDraging(bool drag) +{ + if (drag == isDragging()) + return; + + DockItem::setDraging(drag); + if (!drag) + m_screenSpliter->releaseSplit(); +} + +void AppItem::startSplit(const QRect &rect) +{ + m_screenSpliter->startSplit(rect); +} + +bool AppItem::supportSplitWindow() +{ + return m_screenSpliter->suportSplitScreen(); +} + +bool AppItem::splitWindowOnScreen(ScreenSpliter::SplitDirection direction) +{ + return m_screenSpliter->split(direction); +} + QString AppItem::accessibleName() { return m_itemEntryInter->name(); @@ -636,7 +662,9 @@ void AppItem::refreshIcon() update(); return; - } else if (m_retryTimes > 0) { + } + + if (m_retryTimes > 0) { // reset times m_retryTimes = 0; } diff --git a/frame/item/appitem.h b/frame/item/appitem.h index de95780d8..5709ff6a0 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -36,6 +36,7 @@ #include class QGSettings; +class ScreenSpliter; class AppItem : public DockItem { @@ -52,7 +53,14 @@ public: void undock(); QWidget *appDragWidget(); void setDockInfo(Dock::Position dockPosition, const QRect &dockGeometry); + void setDraging(bool drag) override; + void startSplit(const QRect &rect); + bool supportSplitWindow(); + bool splitWindowOnScreen(ScreenSpliter::SplitDirection direction); +#ifdef USE_AM + int mode() const; +#endif inline ItemType itemType() const override { return App; } QPixmap appIcon(){ return m_appIcon; } virtual QString accessibleName() override; @@ -146,6 +154,8 @@ private: qint64 m_createMSecs; static QPoint MousePressPos; + + ScreenSpliter *m_screenSpliter; }; #endif // APPITEM_H diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index 1d32f4892..9f10cff54 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -22,6 +22,15 @@ #include "../appitem.h" #include "appdragwidget.h" #include "utils.h" +#include "displaymanager.h" + +#include + +#define SPLIT_NONE 0 +#define SPLIT_LEFT 1 +#define SPLIT_RIGHT 2 + +using XEventMonitor = ::com::deepin::api::XEventMonitor; AppDragWidget::AppDragWidget(QWidget *parent) : QGraphicsView(parent) @@ -34,16 +43,11 @@ AppDragWidget::AppDragWidget(QWidget *parent) , m_animGroup(new QParallelAnimationGroup(this)) , m_goBackAnim(new QPropertyAnimation(this, "pos", this)) , m_dockPosition(Dock::Position::Bottom) - , m_removeTips(new TipsWidget(this)) , m_popupWindow(new DockPopupWindow(nullptr)) , m_distanceMultiple(Utils::SettingValue("com.deepin.dde.dock.distancemultiple", "/com/deepin/dde/dock/distancemultiple/", "distance-multiple", 1.5).toDouble()) , m_item(nullptr) + , m_dockScreen(nullptr) { - m_removeTips->setText(tr("Remove")); - m_removeTips->setObjectName("AppRemoveTips"); - m_removeTips->setVisible(false); - m_removeTips->installEventFilter(this); - m_popupWindow->setShadowBlurRadius(20); m_popupWindow->setRadius(18); m_popupWindow->setShadowYOffset(2); @@ -55,11 +59,13 @@ AppDragWidget::AppDragWidget(QWidget *parent) m_scene->addItem(m_object.get()); setScene(m_scene); - setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); setAttribute(Qt::WA_TranslucentBackground); if (Utils::IS_WAYLAND_DISPLAY) { - setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::Window); + setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::Window | Qt::FramelessWindowHint); setAttribute(Qt::WA_NativeWindow); + initWaylandEnv(); + } else { + setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); } viewport()->setAutoFillBackground(false); setFrameShape(QFrame::NoFrame); @@ -71,10 +77,20 @@ AppDragWidget::AppDragWidget(QWidget *parent) initAnimations(); - m_followMouseTimer->setInterval(16); - connect(m_followMouseTimer, &QTimer::timeout, this, &AppDragWidget::onFollowMouse); - m_followMouseTimer->start(); - QTimer::singleShot(0, this, &AppDragWidget::onFollowMouse); + if (!Utils::IS_WAYLAND_DISPLAY) { + m_followMouseTimer->setInterval(16); + connect(m_followMouseTimer, &QTimer::timeout, this, &AppDragWidget::onFollowMouse); + m_followMouseTimer->start(); + QTimer::singleShot(0, this, &AppDragWidget::onFollowMouse); + } +} + +void AppDragWidget::execFinished() +{ + if (!m_bDragDrop) + return; + + dropHandler(QCursor::pos()); } void AppDragWidget::mouseMoveEvent(QMouseEvent *event) @@ -95,11 +111,11 @@ void AppDragWidget::dragEnterEvent(QDragEnterEvent *event) void AppDragWidget::dragMoveEvent(QDragMoveEvent *event) { - Q_UNUSED(event); - showRemoveTips(); - if (isRemoveItem() && m_bDragDrop) { - emit requestRemoveItem(); - } + if (Utils::IS_WAYLAND_DISPLAY) + return QGraphicsView::dragMoveEvent(event); + + if (m_bDragDrop) + moveHandler(QCursor::pos()); } /**获取应用的左上角坐标 @@ -156,18 +172,32 @@ const QPoint AppDragWidget::popupMarkPoint(Dock::Position pos) void AppDragWidget::dropEvent(QDropEvent *event) { + if (Utils::IS_WAYLAND_DISPLAY) + return dropEvent(event); + m_followMouseTimer->stop(); + dropHandler(QCursor::pos()); +} + +void AppDragWidget::hideEvent(QHideEvent *event) +{ + deleteLater(); + if (Utils::IS_WAYLAND_DISPLAY) + QGraphicsView::hideEvent(event); +} + +void AppDragWidget::dropHandler(const QPoint &pos) +{ m_bDragDrop = false; - if (isRemoveAble(QCursor::pos())) { + if (canSplitWindow(pos)) { if (DWindowManagerHelper::instance()->hasComposite()) { showRemoveAnimation(); } else { hide(); } - AppItem *appItem = static_cast((Utils::IS_WAYLAND_DISPLAY && m_item) ? m_item : event->source()); - appItem->undock(); m_popupWindow->setVisible(false); + Q_EMIT requestSplitWindow(splitPosition()); } else { if (DWindowManagerHelper::instance()->hasComposite()) { showGoBackAnimation(); @@ -177,11 +207,26 @@ void AppDragWidget::dropEvent(QDropEvent *event) } } -void AppDragWidget::hideEvent(QHideEvent *event) +void AppDragWidget::moveHandler(const QPoint &pos) { - deleteLater(); - if (Utils::IS_WAYLAND_DISPLAY) - QGraphicsView::hideEvent(event); + if (canSplitWindow(pos)) { + QRect screenGeometry = splitGeometry(pos); + if (screenGeometry.isValid() && screenGeometry != m_lastMouseGeometry) { + qDebug() << "change area:" << screenGeometry; + Q_EMIT requestChangedArea(screenGeometry); + m_lastMouseGeometry = screenGeometry; + } + } +} + +void AppDragWidget::moveCurrent(const QPoint &destPos) +{ + if (DWindowManagerHelper::instance()->hasComposite()) { + move(destPos.x() - width() / 2, destPos.y() - height() / 2); + } else { + // 窗口特效未开启时会隐藏m_object绘制的图标,移动的图标为QDrag绘制的图标 + move(destPos.x(), destPos.y()); + } } void AppDragWidget::setAppPixmap(const QPixmap &pix) @@ -211,7 +256,7 @@ void AppDragWidget::setOriginPos(const QPoint position) void AppDragWidget::setPixmapOpacity(qreal opacity) { - if (isRemoveAble(QCursor::pos())) { + if (canSplitWindow(QCursor::pos())) { m_object->setOpacity(opacity); m_animOpacity->setStartValue(opacity); } else { @@ -220,34 +265,6 @@ void AppDragWidget::setPixmapOpacity(qreal opacity) } } -bool AppDragWidget::isRemoveable(const Position &dockPos, const QRect &doctRect) -{ - const QPoint &p = QCursor::pos(); - switch (dockPos) { - case Dock::Position::Left: - if ((p.x() - doctRect.topRight().x()) > (doctRect.width() * 3)) { - return true; - } - break; - case Dock::Position::Top: - if ((p.y() - doctRect.bottomLeft().y()) > (doctRect.height() * 3)) { - return true; - } - break; - case Dock::Position::Right: - if ((doctRect.topLeft().x() - p.x()) > (doctRect.width() * 3)) { - return true; - } - break; - case Dock::Position::Bottom: - if ((doctRect.topLeft().y() - p.y()) > (doctRect.height() * 3)) { - return true; - } - break; - } - return false; -} - void AppDragWidget::initAnimations() { m_animScale->setDuration(300); @@ -303,79 +320,212 @@ void AppDragWidget::onRemoveAnimationStateChanged(QAbstractAnimation::State newS } } -/**判断图标拖到一定高度(默认任务栏高度的1.5倍)后是否可以移除 - * @brief AppDragWidget::isRemoveAble - * @param curPos 当前鼠标所在位置 - * @return 返回true可移除,false不可移除 +/** 判断应用区域图标是否被拖出任务栏 + * @brief AppDragWidget::canSplitWindow + * @return 返回true应用移出任务栏,false应用在任务栏内 */ -bool AppDragWidget::isRemoveAble(const QPoint &curPos) +bool AppDragWidget::canSplitWindow(const QPoint &pos) const { - const QPoint &p = curPos; switch (m_dockPosition) { case Dock::Position::Left: - if ((p.x() - m_dockGeometry.topRight().x()) > (m_dockGeometry.width() * m_distanceMultiple)) { + if ((pos.x() > m_dockGeometry.topRight().x())) { return true; } break; case Dock::Position::Top: - if ((p.y() - m_dockGeometry.bottomLeft().y()) > (m_dockGeometry.height() * m_distanceMultiple)) { + if ((pos.y() > m_dockGeometry.bottomLeft().y())) { return true; } break; case Dock::Position::Right: - if ((m_dockGeometry.topLeft().x() - p.x()) > (m_dockGeometry.width() * m_distanceMultiple)) { + if ((m_dockGeometry.topLeft().x() > pos.x())) { return true; } break; case Dock::Position::Bottom: - if ((m_dockGeometry.topLeft().y() - p.y()) > (m_dockGeometry.height() * m_distanceMultiple)) { + if ((m_dockGeometry.topLeft().y() > pos.y())) { return true; } break; } + return false; } -/**判断应用区域图标是否被拖出任务栏 - * @brief AppDragWidget::isRemoveItem - * @return 返回true应用移出任务栏,false应用在任务栏内 +/** + * @brief AppDragWidget::splitPosition + * @return 1 左分屏;2 右分屏;5 左上;6 右上;9 左下;10 右下;15全屏。这些值是窗管给的 */ -bool AppDragWidget::isRemoveItem() +ScreenSpliter::SplitDirection AppDragWidget::splitPosition() const { - const QPoint &p = QCursor::pos(); + QPoint pos = QCursor::pos(); + QScreen *currentScreen = DisplayManager::instance()->screenAt(pos); + + if (!currentScreen) + return ScreenSpliter::None; + + int xCenter = currentScreen->geometry().x() + currentScreen->size().width() / 2; + // 1表示左分屏 + if (pos.x() < xCenter) + return ScreenSpliter::Left; + + // 2表示右分屏 + if (pos.x() > xCenter) + return ScreenSpliter::Right; + + return ScreenSpliter::None; +} + +void AppDragWidget::adjustDesktopGeometry(QRect &rect) const +{ + QRect rectGeometry = m_dockGeometry; + rectGeometry.setWidth(rectGeometry.width() * qApp->devicePixelRatio()); + rectGeometry.setHeight(rectGeometry.height() * qApp->devicePixelRatio()); switch (m_dockPosition) { - case Dock::Position::Left: - if ((p.x() > m_dockGeometry.topRight().x())) { - return true; - } - break; - case Dock::Position::Top: - if ((p.y() > m_dockGeometry.bottomLeft().y())) { - return true; - } - break; - case Dock::Position::Right: - if ((m_dockGeometry.topLeft().x() > p.x())) { - return true; - } - break; - case Dock::Position::Bottom: - if ((m_dockGeometry.topLeft().y() > p.y())) { - return true; + case Dock::Position::Left: { + int leftX = (rectGeometry.x() + rectGeometry.width()) * qApp->devicePixelRatio(); + if (rect.x() < leftX) { + rect.setX(leftX); + rect.setWidth(rect.width() - (leftX - rect.x())); } break; } - return false; + case Dock::Position::Top: { + int topY = (rectGeometry.y() + rectGeometry.height()) * qApp->devicePixelRatio(); + if (rect.y() < topY) { + rect.setY(topY); + rect.setHeight(rect.height() - (topY - rect.y())); + } + break; + } + case Dock::Position::Right: { + int rightX = rectGeometry.x() * qApp->devicePixelRatio(); + if (rightX < rect.x() + rect.width() * qApp->devicePixelRatio()) + rect.setWidth(rect.width() - (rect.x() + rect.width() - rightX)); + break; + } + case Dock::Position::Bottom: { + int bottomY = rectGeometry.y() * qApp->devicePixelRatio(); + if (bottomY < rect.y() + rect.height() * qApp->devicePixelRatio()) + rect.setHeight(rect.height() - (rect.y() + rect.height() - bottomY)); + break; + } + } +} + +QRect AppDragWidget::splitGeometry(const QPoint &pos) const +{ + QList screens = DisplayManager::instance()->screens(); + for (QScreen *screen : screens) { + QRect screenGeometry = screen->geometry(); + screenGeometry.setWidth(screenGeometry.width() * qApp->devicePixelRatio()); + screenGeometry.setHeight(screenGeometry.height() * qApp->devicePixelRatio()); + if (!screenGeometry.contains(pos)) + continue; + + // 左右分屏即可 + int centerX = screenGeometry.x() + screenGeometry.width() / 2; + if (pos.x() < centerX) { + // 左分屏 + QRect rectLeft = screenGeometry; + rectLeft.setWidth(screenGeometry.width() / 2); + adjustDesktopGeometry(rectLeft); + return rectLeft; + } + if (pos.x() > centerX) { + // 右分屏 + QRect rectRight = screenGeometry; + rectRight.setLeft(screenGeometry.x() + screenGeometry.width() / 2); + rectRight.setWidth(screenGeometry.width() / 2); + adjustDesktopGeometry(rectRight); + return rectRight; + } + break; + } + return QRect(); +} + +void AppDragWidget::initWaylandEnv() +{ + if (!Utils::IS_WAYLAND_DISPLAY) + return; + + // 由于在wayland环境下无法触发drop事件,导致鼠标无法释放,所以这里暂时用XEventMonitor的方式(具体原因待查) + Dock::Position position = qApp->property(PROP_POSITION).value(); + XEventMonitor *extralEventInter = new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus()); + QList extralRectList; + QList screens = DisplayManager::instance()->screens(); + for (QScreen *screen : screens) { + MonitRect monitorRect; + QRect screenRect = screen->geometry(); + screenRect.setSize(screenRect.size() * screen->devicePixelRatio()); + + switch (position) { + case Top: { + monitorRect.x1 = screenRect.x(); + monitorRect.y1 = screenRect.y(); + monitorRect.x2 = screenRect.x() + screenRect.width(); + monitorRect.y2 = screenRect.y(); + } + break; + case Bottom: { + monitorRect.x1 = screenRect.x(); + monitorRect.y1 = screenRect.y() + screenRect.height(); + monitorRect.x2 = screenRect.x() + screenRect.width(); + monitorRect.y2 = screenRect.y() + screenRect.height(); + } + break; + case Left: { + monitorRect.x1 = screenRect.x(); + monitorRect.y1 = screenRect.y(); + monitorRect.x2 = screenRect.x(); + monitorRect.y2 = screenRect.y() + screenRect.height(); + } + break; + case Right: { + monitorRect.x1 = screenRect.x() + screenRect.width(); + monitorRect.y1 = screenRect.y(); + monitorRect.x2 = screenRect.x() + screenRect.width(); + monitorRect.y2 = screenRect.y() + screenRect.height(); + } + break; + } + + if (!extralRectList.contains(monitorRect)) + extralRectList << monitorRect; + } + + QString key = extralEventInter->RegisterAreas(extralRectList, 1 << 1); + connect(this, &AppDragWidget::destroyed, this, [ key, extralEventInter ] { + extralEventInter->UnregisterArea(key); + delete extralEventInter; + QDrag::cancel(); + }); + + connect(extralEventInter, &XEventMonitor::ButtonRelease, this, &AppDragWidget::onButtonRelease); + connect(extralEventInter, &XEventMonitor::CursorMove,this, &AppDragWidget::onCursorMove); +} + +void AppDragWidget::onButtonRelease(int, int x, int y, const QString &) +{ + if (!m_bDragDrop) + return; + + dropHandler(QPoint(x, y)); + + QDrag::cancel(); +} + +void AppDragWidget::onCursorMove(int x, int y, const QString &) +{ + QPoint pos = QPoint(x, y); + moveCurrent(pos); + moveHandler(pos); } void AppDragWidget::onFollowMouse() { - QPoint destPos = QCursor::pos(); - if (DWindowManagerHelper::instance()->hasComposite()) { - move(destPos.x() - width() / 2, destPos.y() - height() / 2); - } else { - move(destPos.x(), destPos.y()); // 窗口特效未开启时会隐藏m_object绘制的图标,移动的图标为QDrag绘制的图标 - } + moveCurrent(QCursor::pos()); } void AppDragWidget::enterEvent(QEvent *event) @@ -388,50 +538,6 @@ void AppDragWidget::enterEvent(QEvent *event) } } -/**显示移除应用提示窗口 - * @brief AppDragWidget::showRemoveTips - */ -void AppDragWidget::showRemoveTips() -{ - Dock::Position pos = Dock::Position::Bottom; - - DockPopupWindow *popup = m_popupWindow.data(); - if (isRemoveAble(QCursor::pos())) { - QWidget *lastContent = popup->getContent(); - if (lastContent) - lastContent->setVisible(false); - - switch (pos) { - case Top: popup->setArrowDirection(DockPopupWindow::ArrowTop); break; - case Bottom: popup->setArrowDirection(DockPopupWindow::ArrowBottom); break; - case Left: popup->setArrowDirection(DockPopupWindow::ArrowLeft); break; - case Right: popup->setArrowDirection(DockPopupWindow::ArrowRight); break; - } - popup->resize(m_removeTips->sizeHint()); - popup->setContent(m_removeTips); - - const QPoint p = popupMarkPoint(pos); - if (!popup->isVisible()) - QMetaObject::invokeMethod(popup, "show", Qt::QueuedConnection, Q_ARG(QPoint, p), Q_ARG(bool, true)); - else - popup->show(p, true); - - m_object->setOpacity(0.5); - m_animOpacity->setStartValue(0.5); - } else { - m_object->setOpacity(1.0); - m_animOpacity->setStartValue(1.0); - if (popup->isVisible()) - popup->setVisible(false); - } -} - -void AppDragWidget::moveEvent(QMoveEvent *event) -{ - Q_UNUSED(event); - showRemoveTips(); -} - QuickDragWidget::QuickDragWidget(QWidget *parent) : AppDragWidget(parent) { @@ -471,3 +577,36 @@ void QuickDragWidget::dragMoveEvent(QDragMoveEvent *event) AppDragWidget::dragMoveEvent(event); requestDragMove(event); } + +/**判断图标拖到一定高度(默认任务栏高度的1.5倍)后是否可以移除 + * @brief AppDragWidget::isRemoveAble + * @param curPos 当前鼠标所在位置 + * @return 返回true可移除,false不可移除 + */ +bool QuickDragWidget::isRemoveAble(const QPoint &curPos) +{ + const QPoint &p = curPos; + switch (m_dockPosition) { + case Dock::Position::Left: + if ((p.x() - m_dockGeometry.topRight().x()) > (m_dockGeometry.width() * m_distanceMultiple)) { + return true; + } + break; + case Dock::Position::Top: + if ((p.y() - m_dockGeometry.bottomLeft().y()) > (m_dockGeometry.height() * m_distanceMultiple)) { + return true; + } + break; + case Dock::Position::Right: + if ((m_dockGeometry.topLeft().x() - p.x()) > (m_dockGeometry.width() * m_distanceMultiple)) { + return true; + } + break; + case Dock::Position::Bottom: + if ((m_dockGeometry.topLeft().y() - p.y()) > (m_dockGeometry.height() * m_distanceMultiple)) { + return true; + } + break; + } + return false; +} diff --git a/frame/item/components/appdragwidget.h b/frame/item/components/appdragwidget.h index 666b78700..12304a7e6 100644 --- a/frame/item/components/appdragwidget.h +++ b/frame/item/components/appdragwidget.h @@ -23,6 +23,8 @@ #define APPDRAGWIDGET_H #include "constants.h" +#include "screenspliter.h" +#include "utils.h" #include #include @@ -38,6 +40,9 @@ #include "dockpopupwindow.h" #include "dockitem.h" +class QDrag; +class DockScreen; + class AppGraphicsObject : public QGraphicsObject { public: @@ -85,18 +90,18 @@ class AppDragWidget : public QGraphicsView public: explicit AppDragWidget(QWidget *parent = Q_NULLPTR); + void execFinished(); void setAppPixmap(const QPixmap &pix); void setDockInfo(Dock::Position dockPosition, const QRect &dockGeometry); void setOriginPos(const QPoint position); void setPixmapOpacity(qreal opacity); - bool isRemoveAble(const QPoint &curPos); void setItem(DockItem *item) { m_item = item; } - static bool isRemoveable(const Dock::Position &dockPos, const QRect &doctRect); void showRemoveAnimation(); void showGoBackAnimation(); signals: - void requestRemoveItem(); + void requestChangedArea(QRect); + void requestSplitWindow(ScreenSpliter::SplitDirection); protected: void mouseMoveEvent(QMouseEvent *event) override; @@ -104,7 +109,6 @@ protected: void dragMoveEvent(QDragMoveEvent *event) override; void dropEvent(QDropEvent *event) override; void hideEvent(QHideEvent *event) override; - void moveEvent(QMoveEvent *event) override; void enterEvent(QEvent *event) override; private: @@ -113,11 +117,20 @@ private: QAbstractAnimation::State oldState); const QPoint popupMarkPoint(Dock::Position pos); const QPoint topleftPoint() const; - void showRemoveTips(); - bool isRemoveItem(); + bool canSplitWindow(const QPoint &pos) const; + ScreenSpliter::SplitDirection splitPosition() const; + QRect splitGeometry(const QPoint &pos) const; + void initWaylandEnv(); + + void dropHandler(const QPoint &pos); + void moveHandler(const QPoint &pos); + void moveCurrent(const QPoint &destPos); + void adjustDesktopGeometry(QRect &rect) const; private Q_SLOTS: void onFollowMouse(); + void onButtonRelease(int, int x, int y, const QString &); + void onCursorMove(int x, int y, const QString &); protected: QScopedPointer m_object; @@ -133,7 +146,6 @@ protected: QRect m_dockGeometry; QPoint m_originPoint; QSize m_iconSize; - Dock::TipsWidget *m_removeTips; QScopedPointer m_popupWindow; /** * @brief m_distanceMultiple: 倍数 @@ -143,6 +155,8 @@ protected: bool m_bDragDrop = false; // 图标是否被拖拽 DockItem *m_item; + QRect m_lastMouseGeometry; + DockScreen *m_dockScreen; }; class QuickDragWidget : public AppDragWidget @@ -160,6 +174,9 @@ public: protected: void dropEvent(QDropEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; + +private: + bool isRemoveAble(const QPoint &curPos); }; #endif /* APPDRAGWIDGET_H */ diff --git a/frame/screenspliter/screenspliter.cpp b/frame/screenspliter/screenspliter.cpp new file mode 100644 index 000000000..f900d3423 --- /dev/null +++ b/frame/screenspliter/screenspliter.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "screenspliter.h" +#include "appitem.h" +#include "utils.h" +#include "screenspliter_xcb.h" +#include "screenspliter_wayland.h" + +bool ScreenSpliter::releaseSplit() +{ + return true; +} + +ScreenSpliter::ScreenSpliter(AppItem *appItem, DockEntryInter *entryInter, QObject *parent) + : QObject(parent) + , m_appItem(appItem) + , m_entryInter(entryInter) +{ +} + +ScreenSpliter::~ScreenSpliter() +{ + m_appItem = nullptr; +} + +AppItem *ScreenSpliter::appItem() const +{ + return m_appItem; +} + +DockEntryInter *ScreenSpliter::entryInter() const +{ + return m_entryInter; +} + +ScreenSpliter *ScreenSpliterFactory::createScreenSpliter(AppItem *appItem, DockEntryInter *entryInter) +{ + if (Utils::IS_WAYLAND_DISPLAY) + return new ScreenSpliter_Wayland(appItem, entryInter, appItem); + + return new ScreenSpliter_Xcb(appItem, entryInter, appItem); +} diff --git a/frame/screenspliter/screenspliter.h b/frame/screenspliter/screenspliter.h new file mode 100644 index 000000000..7365b6c58 --- /dev/null +++ b/frame/screenspliter/screenspliter.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef SCREENSPLITER_H +#define SCREENSPLITER_H + +#include "dbusutil.h" + +#include + +class AppItem; + +class ScreenSpliter : public QObject +{ + Q_OBJECT + +public: + enum SplitDirection { + None, // 无操作 + Left, // 左分屏 + Right, // 右分屏 + Top, // 上分屏 + Bottom, // 下分屏 + LeftTop, // 左上 + RightTop, // 右上 + LeftBottom, // 左下 + RightBottom, // 右下 + Full // 全屏 + }; + +public: + virtual void startSplit(const QRect &) = 0; // 触发分屏提示效果 + virtual bool split(SplitDirection) = 0; // 开始触发分屏 + virtual bool suportSplitScreen() = 0; // 是否支持分屏 + virtual bool releaseSplit(); // 释放分屏 + +protected: + explicit ScreenSpliter(AppItem *appItem, DockEntryInter *entryInter, QObject *parent = nullptr); + virtual ~ScreenSpliter(); + AppItem *appItem() const; + DockEntryInter *entryInter() const; + +private: + AppItem *m_appItem; + DockEntryInter *m_entryInter; +}; + +class ScreenSpliterFactory +{ +public: + static ScreenSpliter *createScreenSpliter(AppItem *appItem, DockEntryInter *entryInter); +}; + +#endif // SCREENSPLITER_H diff --git a/frame/screenspliter/screenspliter_wayland.cpp b/frame/screenspliter/screenspliter_wayland.cpp new file mode 100644 index 000000000..3be9ea623 --- /dev/null +++ b/frame/screenspliter/screenspliter_wayland.cpp @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "screenspliter_wayland.h" +#include "appitem.h" + +#include +#include +#include +#include +#define private public +#include +#include +#include +#include +#undef private + +#include +#include +#include +#include +#include +#include +#include + +SplitWindowManager *ScreenSpliter_Wayland::m_splitManager = nullptr; + +/** wayland下的分屏功能 + * @brief ScreenSpliter_Wayland::ScreenSpliter_Wayland + * @param parent + */ +ScreenSpliter_Wayland::ScreenSpliter_Wayland(AppItem *appItem, DockEntryInter *entryInter, QObject *parent) + : ScreenSpliter(appItem, entryInter, parent) + , m_checkedNotSupport(false) +{ + if (!m_splitManager) + m_splitManager = new SplitWindowManager; + + connect(m_splitManager, &SplitWindowManager::splitStateChange, this, &ScreenSpliter_Wayland::onSplitStateChange); +} + +ScreenSpliter_Wayland::~ScreenSpliter_Wayland() +{ +} + +void ScreenSpliter_Wayland::startSplit(const QRect &rect) +{ + if (entryInter()->windowInfos().size() == 0) { + // 如果默认打开的子窗口的数量为0,则无需操作,同时记录标记,在打开新的窗口的时候,设置遮罩 + m_splitRect = rect; + entryInter()->Activate(QX11Info::getTimestamp()); + return; + } + + setMaskVisible(rect, true); +} + +void ScreenSpliter_Wayland::setMaskVisible(const QRect &rect, bool visible) +{ + static QWidget *desktopWidget = nullptr; + if (!desktopWidget) { + desktopWidget = new QWidget; + DPalette palette = DGuiApplicationHelper::instance()->applicationPalette(); + QColor backColor = palette.color(QPalette::Highlight); + backColor.setAlpha(255 * 0.3); + palette.setBrush(QPalette::ColorRole::Background, backColor); + desktopWidget->setPalette(palette); + desktopWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); + } + desktopWidget->setVisible(visible); + desktopWidget->setGeometry(rect); + desktopWidget->raise(); +} + +bool ScreenSpliter_Wayland::split(SplitDirection direction) +{ + setMaskVisible(QRect(), false); + const QString windowUuid = splitUuid(); + if (windowUuid.isEmpty()) + return false; + + std::string sUuid = windowUuid.toStdString(); + const char *uuid = sUuid.c_str(); + m_splitManager->requestSplitWindow(uuid, direction); + return true; +} + +QString ScreenSpliter_Wayland::splitUuid() const +{ +#ifdef USE_AM + WindowInfoMap windowsInfo = entryInter()->windowInfos(); + if (windowsInfo.isEmpty()) + return QString(); + + const QString uuid = windowsInfo.values()[0].uuid; + if (windowSupportSplit(uuid)) + return uuid; + +#endif + return QString(); +} + +bool ScreenSpliter_Wayland::windowSupportSplit(const QString &uuid) const +{ + return m_splitManager->canSplit(uuid); +} + +QString ScreenSpliter_Wayland::firstWindowUuid() const +{ +#ifdef USE_AM + WindowInfoMap winInfos = entryInter()->windowInfos(); + if (winInfos.size() == 0) + return QString(); + + return winInfos.begin().value().uuid; +#else + return QString(); +#endif +} + +void ScreenSpliter_Wayland::onSplitStateChange(const char *uuid, int splitable) +{ +#ifdef USE_AM + const QString windowUuid = firstWindowUuid(); + qDebug() << "Split State Changed, window uuid:" << windowUuid << "split uuid:" << uuid << "split value:" << splitable; + if (QString(uuid) != windowUuid) + return; + + if (m_splitRect.isEmpty()) + return; + + if (splitable > 0) { + setMaskVisible(m_splitRect, true); + } else { + // 如果不支持二分屏,则退出当前的窗体,且标记当前不支持二分屏,下次打开的时候不再进行打开窗口来检测 + entryInter()->ForceQuit(); + m_checkedNotSupport = true; + } + m_splitRect = QRect(0, 0, 0, 0); +#endif +} + +bool ScreenSpliter_Wayland::suportSplitScreen() +{ + // 如果之前检测过是否不支持分屏(m_checkedNotSupport默认为false,如果不支持分屏,m_checkedNotSupport就会变为true),则直接返回不支持分屏 + if (m_checkedNotSupport) + return false; + + // 如果存在未打开的窗口,就默认让其认为支持,后续会根据这个来打开一个新的窗口 + if (entryInter()->windowInfos().size() == 0) + return true; + + // 如果存在已经打开的窗口 + m_checkedNotSupport = splitUuid().isEmpty(); + return (!m_checkedNotSupport); +} + +/** + * @brief SplitWindowManager::SplitWindowManager + * @param wayland下的分屏的管理 + */ +SplitWindowManager::SplitWindowManager(QObject *parent) + : QObject(parent) + , m_clientManagement(nullptr) + , m_connectionThread(new QThread(nullptr)) + , m_connectionThreadObject(new ConnectionThread) +{ + connect(m_connectionThreadObject, &ConnectionThread::connected, this, &SplitWindowManager::onConnectionFinished, Qt::QueuedConnection); + + m_connectionThreadObject->moveToThread(m_connectionThread); + m_connectionThread->start(); + m_connectionThreadObject->initConnection(); +} + +SplitWindowManager::~SplitWindowManager() +{ +} + +bool SplitWindowManager::canSplit(const QString &uuid) const +{ + if (!m_clientManagement) + return false; + + const QVector &clientWindowStates = m_clientManagement->getWindowStates(); + qInfo() << "client window states count:" << clientWindowStates.size(); + for (ClientManagement::WindowState windowState : clientWindowStates) { + qDebug() << "window uuid:" << uuid << "window state uuid:" << windowState.uuid + << "active:" << windowState.isActive << "resource name:" << windowState.resourceName; + if (windowState.splitable > 0 && QString(windowState.uuid) == uuid) + return true; + }; + + return false; +} + +static ClientManagement::SplitType convertSplitType(ScreenSpliter::SplitDirection direction) +{ + static QMap direcionMapping = { + { ScreenSpliter::Left, ClientManagement::SplitType::Left }, + { ScreenSpliter::Right, ClientManagement::SplitType::Right}, + { ScreenSpliter::Top, ClientManagement::SplitType::Top }, + { ScreenSpliter::Bottom, ClientManagement::SplitType::Bottom }, + { ScreenSpliter::LeftTop, ClientManagement::SplitType::LeftTop }, + { ScreenSpliter::RightTop, ClientManagement::SplitType::RightTop }, + { ScreenSpliter::LeftBottom, ClientManagement::SplitType::LeftBottom }, + { ScreenSpliter::RightBottom, ClientManagement::SplitType::RightBottom } + }; + + return direcionMapping.value(direction, ClientManagement::SplitType::None); +} + +void SplitWindowManager::requestSplitWindow(const char *uuid, const ScreenSpliter::SplitDirection &direction) +{ + m_clientManagement->requestSplitWindow(uuid, convertSplitType(direction)); +} + +void SplitWindowManager::onConnectionFinished() +{ + EventQueue *eventQueue = new EventQueue(this); + eventQueue->setup(m_connectionThreadObject); + + Registry *registry = new Registry(this); + connect(registry, &Registry::clientManagementAnnounced, this, [ this, registry ](quint32 name, quint32 version) { + m_clientManagement = registry->createClientManagement(name, version, this); + connect(m_clientManagement, &ClientManagement::splitStateChange, this, &SplitWindowManager::splitStateChange); + }); + registry->setEventQueue(eventQueue); + registry->create(m_connectionThreadObject); + registry->setup(); +} diff --git a/frame/screenspliter/screenspliter_wayland.h b/frame/screenspliter/screenspliter_wayland.h new file mode 100644 index 000000000..79ef7c027 --- /dev/null +++ b/frame/screenspliter/screenspliter_wayland.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef SCREENSPLITER_WAYLAND_H +#define SCREENSPLITER_WAYLAND_H + +#include "screenspliter.h" + +#include + +namespace KWayland { +namespace Client { +class Registry; +class DDEShell; +class DDEShellSurface; +class EventQueue; +class Compositor; +class Surface; +class ClientManagement; +class ConnectionThread; +} +} + +class AppItem; +class QWindow; +class QThread; +class SplitWindowManager; + +class WindowInfo; +typedef QMap WindowInfoMap; + +using namespace KWayland::Client; + +class ScreenSpliter_Wayland : public ScreenSpliter +{ + Q_OBJECT + +public: + explicit ScreenSpliter_Wayland(AppItem *appItem, DockEntryInter *entryInter, QObject *parent); + ~ScreenSpliter_Wayland() override; + + void startSplit(const QRect &rect) override; + bool split(SplitDirection direction) override; + bool suportSplitScreen() override; + +private: + void setMaskVisible(const QRect &rect, bool visible); + QString splitUuid() const; + bool windowSupportSplit(const QString &uuid) const; + QString firstWindowUuid() const; + +private Q_SLOTS: + void onSplitStateChange(const char* uuid, int splitable); + +private: + static SplitWindowManager *m_splitManager; + QRect m_splitRect; + bool m_checkedNotSupport; +}; + +class SplitWindowManager : public QObject +{ + Q_OBJECT + + friend class ScreenSpliter_Wayland; + +protected: + explicit SplitWindowManager(QObject *parent = Q_NULLPTR); + ~SplitWindowManager() override; + + bool canSplit(const QString &uuid) const; + void requestSplitWindow(const char *uuid, const ScreenSpliter::SplitDirection &direction); + +Q_SIGNALS: + void splitStateChange(const char *, int); + +private Q_SLOTS: + void onConnectionFinished(); + +private: + ClientManagement *m_clientManagement; + QThread *m_connectionThread; + ConnectionThread *m_connectionThreadObject; +}; + +#endif // SCREENSPLITER_WAYLAND_H diff --git a/frame/screenspliter/screenspliter_xcb.cpp b/frame/screenspliter/screenspliter_xcb.cpp new file mode 100644 index 000000000..3d954691c --- /dev/null +++ b/frame/screenspliter/screenspliter_xcb.cpp @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "screenspliter_xcb.h" +#include "appitem.h" + +#include + +#include +#include +#include + +#define LEFT 1 +#define RIGHT 2 +#define TOP 3 +#define BOTTOM 4 +#define LEFTTOP 5 +#define RIGHTTOP 6 +#define LEFTBOTTOM 9 +#define RIGHTBOTTOM 10 +#define SPLITUNKNOW 0 + +static xcb_atom_t internAtom(const char *name, bool only_if_exist) +{ + if (!name || *name == 0) + return XCB_NONE; + + xcb_connection_t *connection = QX11Info::connection(); + xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, only_if_exist, strlen(name), name); + xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0); + if (!reply) + return XCB_NONE; + + xcb_atom_t atom = reply->atom; + free(reply); + + return atom; +} + +static QByteArray windowProperty(quint32 WId, xcb_atom_t propAtom, xcb_atom_t typeAtom, quint32 len) +{ + xcb_connection_t *conn = QX11Info::connection(); + xcb_get_property_cookie_t cookie = xcb_get_property(conn, false, WId, propAtom, typeAtom, 0, len); + xcb_generic_error_t *err = nullptr; + xcb_get_property_reply_t *reply = xcb_get_property_reply(conn, cookie, &err); + + QByteArray data; + if (reply != nullptr) { + int valueLen = xcb_get_property_value_length(reply); + const char *buf = static_cast(xcb_get_property_value(reply)); + data.append(buf, valueLen); + free(reply); + } + + if (err != nullptr) { + free(err); + } + + return data; +} + +ScreenSpliter_Xcb::ScreenSpliter_Xcb(AppItem *appItem, DockEntryInter *entryInter, QObject *parent) + : ScreenSpliter(appItem, entryInter, parent) + , m_isSplitCreateWindow(false) +{ + connect(entryInter, &DockEntryInter::WindowInfosChanged, + this, &ScreenSpliter_Xcb::onUpdateWindowInfo, Qt::QueuedConnection); +} + +void ScreenSpliter_Xcb::startSplit(const QRect &rect) +{ + if (!openWindow()) { + m_effectRect = rect; + return; + } + showSplitScreenEffect(rect, true); +} + +bool ScreenSpliter_Xcb::split(ScreenSpliter::SplitDirection direction) +{ + showSplitScreenEffect(QRect(), false); + if (!openWindow()) + return false; + + // 如果当前的应用不支持分屏,也无需分屏,检查分屏的时候至少需要一个窗口,因此这里写在打开窗口之后 + quint32 WId = splittingWindowWId(); + if (WId == 0) { + // 如果当前存在主动打开的窗口,那么就关闭当前主动打开的窗口 + if (m_isSplitCreateWindow) { + entryInter()->ForceQuit(); + m_isSplitCreateWindow = false; + } + return false; + } + + xcb_client_message_event_t xev; + + xev.response_type = XCB_CLIENT_MESSAGE; + xev.type = internAtom("_DEEPIN_SPLIT_WINDOW", false); + xev.window = WId; + xev.format = 32; + xev.data.data32[0] = direction_x11(direction); // 1: 左分屏 2: 右分屏 5 左上 6 右上 9 左下 10 右下 15: 全屏 + xev.data.data32[1] = 1; // 1 进入预览 0 不进入预览 + + xcb_send_event(QX11Info::connection(), false, QX11Info::appRootWindow(QX11Info::appScreen()), + SubstructureNotifyMask, (const char *)&xev); + xcb_flush(QX11Info::connection()); + return true; +} + +uint32_t ScreenSpliter_Xcb::direction_x11(ScreenSpliter::SplitDirection direction) +{ + static QMap directionMapping = { + { ScreenSpliter::Left, LEFT }, + { ScreenSpliter::Right, RIGHT }, + { ScreenSpliter::Top, TOP }, + { ScreenSpliter::Bottom, TOP }, + { ScreenSpliter::LeftTop, LEFTTOP }, + { ScreenSpliter::RightTop, RIGHTTOP }, + { ScreenSpliter::LeftBottom, LEFTBOTTOM }, + { ScreenSpliter::RightBottom, RIGHTBOTTOM } + }; + + return directionMapping.value(direction, SPLITUNKNOW); +} + +bool ScreenSpliter_Xcb::openWindow() +{ + // 查看当前应用是否有打开的窗口,如果没有,则先打开一个窗口 + const WindowInfoMap windowlist = entryInter()->windowInfos(); + if (!windowlist.isEmpty()) + return true; + + if (!m_isSplitCreateWindow) { + // 如果当前没有打开窗口,且未执行打开操作 + entryInter()->Activate(QX11Info::getTimestamp()); + m_isSplitCreateWindow = true; + } + + return false; +} + +void ScreenSpliter_Xcb::showSplitScreenEffect(const QRect &rect, bool visible) +{ + quint32 WId = splittingWindowWId(); + if (WId == 0) + return; + + // 触发分屏的效果 + xcb_client_message_event_t xev; + + xev.response_type = XCB_CLIENT_MESSAGE; + xev.type = internAtom("_DEEPIN_SPLIT_OUTLINE", false); + xev.window = WId; + xev.format = 32; + xev.data.data32[0] = visible ? 1 : 0; // 1: 显示 0: 取消 + xev.data.data32[1] = rect.x(); // X坐标 + xev.data.data32[2] = rect.y(); // Y坐标 + xev.data.data32[3] = rect.width(); // width + xev.data.data32[4] = rect.height(); // height + + xcb_send_event(QX11Info::connection(), false, QX11Info::appRootWindow(QX11Info::appScreen()), + SubstructureNotifyMask, (const char *)&xev); + xcb_flush(QX11Info::connection()); +} + +void ScreenSpliter_Xcb::onUpdateWindowInfo(const WindowInfoMap &info) +{ + // 如果打开的是第一个窗口,且这个打开的窗口是通过拖动二分屏的方式打开,且当前是结束拖拽 + // 并且不支持分屏那么这个窗口就需要关闭 + if (!appItem()->isDragging()) { + releaseSplit(); + } else if (!m_effectRect.isEmpty() && info.size() > 0) { + // 只有当需要触发分屏效果的时候,发现当前没有窗口,则记录当前分屏的区域,保存在m_effectRect中 + // 在新增窗口的时候,如果返现m_effectRect有值,则重新触发分屏,并且清空m_effectRect,防止再次打开窗口的时候再次触发分屏效果 + showSplitScreenEffect(m_effectRect, true); + m_effectRect.setRect(0, 0, 0, 0); + } +} + +bool ScreenSpliter_Xcb::suportSplitScreen() +{ + // 如果当前的窗口的数量为0,则不知道它是否支持分屏,则始终让其返回true,然后打开窗口,因为窗口打开后, + // 要过一段事件才能收到信号,等收到信号后才知道它是否支持分屏,在窗口显示后会根据当前是否请求过执行分屏操作 + // 来决定是否执行分屏的操作 + if (entryInter()->windowInfos().size() == 0) + return true; + + return (splittingWindowWId() != 0); +} + +bool ScreenSpliter_Xcb::releaseSplit() +{ + if (!m_isSplitCreateWindow) + return false; + + if (!entryInter()->windowInfos().isEmpty() && splittingWindowWId() == 0) { + // 释放后,如果当前的窗口是通过验证是否支持二分屏的方式来新建的窗口(m_isSplitCreateWindow == true) + // 并且存在打开的窗口(也有可能不存在打开的窗口,打开的窗口最后才出来,时机上不好控制,所以这种情况 + // 在updateWindowInfos函数里面做了处理),并且打开的窗口不支持二分屏,则此时关闭新打开的窗口 + entryInter()->ForceQuit(); + } + + m_isSplitCreateWindow = false; + return true; +} + +quint32 ScreenSpliter_Xcb::splittingWindowWId() +{ + WindowInfoMap windowsInfo = entryInter()->windowInfos(); + if (windowsInfo.size() == 0) + return 0; + + quint32 WId = windowsInfo.keys().first(); + xcb_atom_t propAtom = internAtom("_DEEPIN_NET_SUPPORTED", true); + QByteArray data = windowProperty(WId, propAtom, XCB_ATOM_CARDINAL, 4); + + bool supported = false; + if (const char *cdata = data.constData()) + supported = *(reinterpret_cast(cdata)); + + return supported ? WId : 0; +} diff --git a/frame/screenspliter/screenspliter_xcb.h b/frame/screenspliter/screenspliter_xcb.h new file mode 100644 index 000000000..b8ac69a8b --- /dev/null +++ b/frame/screenspliter/screenspliter_xcb.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef SCREENSPLITER_XCB_H +#define SCREENSPLITER_XCB_H + +#include "screenspliter.h" + +#include + +class WindowInfo; +typedef QMap WindowInfoMap; + +class ScreenSpliter_Xcb : public ScreenSpliter +{ +public: + explicit ScreenSpliter_Xcb(AppItem *appItem, DockEntryInter *entryInter, QObject *parent = nullptr); + + void startSplit(const QRect &rect) override; + bool split(ScreenSpliter::SplitDirection direction) override; + bool suportSplitScreen() override; + bool releaseSplit() override; + +private: + quint32 splittingWindowWId(); + uint32_t direction_x11(ScreenSpliter::SplitDirection direction); + void showSplitScreenEffect(const QRect &rect, bool visible); + bool openWindow(); + +private Q_SLOTS: + void onUpdateWindowInfo(const WindowInfoMap &info); + +private: + bool m_isSplitCreateWindow; + QRect m_effectRect; +}; + +#endif // SCREENSPLITER_XCB_H diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 6d0c5f2fb..4495e7403 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -47,17 +47,16 @@ #include #include #include +#include + #include #include -#define protected public -#include -#undef protected -#include -#include #include #include +#include + #define SPLITER_SIZE 2 #define TRASH_MARGIN 20 #define PLUGIN_MAX_SIZE 40 @@ -794,8 +793,25 @@ void MainPanelControl::startDrag(DockItem *dockItem) m_appDragWidget = appDrag->appDragWidget(); + connect(m_appDragWidget, &AppDragWidget::requestChangedArea, this, [ = ](QRect rect) { + // 在区域改变的时候,出现分屏提示效果 + AppItem *appItem = static_cast(dockItem); + if (appItem->supportSplitWindow()) + appItem->startSplit(rect); + }); + + connect(m_appDragWidget, &AppDragWidget::requestSplitWindow, this, [ = ](ScreenSpliter::SplitDirection dir) { + AppItem *appItem = static_cast(dockItem); + if (appItem->supportSplitWindow()) + appItem->splitWindowOnScreen(dir); + }); + connect(m_appDragWidget, &AppDragWidget::destroyed, this, [ = ] { m_appDragWidget = nullptr; + AppItem *appItem = static_cast(dockItem); + if (appItem->supportSplitWindow()) + return; + if (!item.isNull() && qobject_cast(item)->isValid()) { // 如果是从最近打开区域移动到应用区域的,则需要将其固定 dockRecentApp(item); @@ -811,13 +827,6 @@ void MainPanelControl::startDrag(DockItem *dockItem) } }); - connect(m_appDragWidget, &AppDragWidget::requestRemoveItem, this, [ = ] { - if (-1 != m_appAreaSonLayout->indexOf(item)) { - m_dragIndex = m_appAreaSonLayout->indexOf(item); - removeItem(item); - } - }); - appDrag->appDragWidget()->setOriginPos((m_appAreaSonWidget->mapToGlobal(item->pos()))); appDrag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size())); const QPixmap &dragPix = qobject_cast(item)->appIcon(); @@ -852,6 +861,11 @@ void MainPanelControl::startDrag(DockItem *dockItem) drag->setMimeData(new QMimeData); drag->exec(Qt::MoveAction); + if (item->itemType() == DockItem::App && m_appDragWidget) { + // TODO AppDragWidget中偶尔会出现拖拽结束后没有触发dropEvent的情况,因此exec结束后处理dropEvent中未执行的操作(临时处理方式) + m_appDragWidget->execFinished(); + } + if (item->itemType() != DockItem::App || m_dragIndex == -1) { m_appDragWidget = nullptr; item->setDraging(false); @@ -1368,8 +1382,7 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) if (!layout || !layout->itemAt(0)) continue; - PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); - qInfo() << pItem->pluginItem()->pluginDisplayName(); + PluginsItem *pItem = qobject_cast(layout->itemAt(0)->widget()); if (!pItem) continue; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 1d2dac253..bf11670fa 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -282,7 +282,7 @@ void QuickPluginWindow::startDrag(PluginsItemInterface *moveItem) drag->setPixmap(dragPixmap); drag->setHotSpot(QPoint(0, 0)); - connect(drag->appDragWidget(), &AppDragWidget::requestRemoveItem, this, [ this, moveItem ] { + connect(drag->appDragWidget(), &AppDragWidget::requestSplitWindow, this, [ this, moveItem ] { removePlugin(moveItem); }); From 830e0a7b2fb7bc4f15ed953fa0f4cf7f6bde36b0 Mon Sep 17 00:00:00 2001 From: songwentao Date: Mon, 15 Aug 2022 15:43:07 +0800 Subject: [PATCH 068/257] =?UTF-8?q?feat:=20=E5=BC=80=E5=90=AFAM=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 开启AM宏定义 清除一个未定义的变量,解决编译报错 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-162227.html Change-Id: I5d94d7d6176a2bac663d5bedf07429fdbbd85279 --- CMakeLists.txt | 2 +- frame/dbus/entryinterface.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e3367c511..60e04ce85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ endif() file(GLOB INTERFACES "interfaces/*.h") -#add_compile_definitions(USE_AM) +add_compile_definitions(USE_AM) #因为单元测试需要直接测试源代码,而主程序代码中include的单元使用了相对路径 #单元测试的CMakeLists和主程序的CMakeLists路径不同,编译单元测试时会提示找不到文件 diff --git a/frame/dbus/entryinterface.cpp b/frame/dbus/entryinterface.cpp index 18443a888..8b3242446 100644 --- a/frame/dbus/entryinterface.cpp +++ b/frame/dbus/entryinterface.cpp @@ -86,7 +86,6 @@ public: : CurrentWindow(0) , IsActive(false) , IsDocked(false) - , mode(0) {} // begin member variables From c78f101e84cd23f9d1da06595d278149dccd9fd6 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 16 Aug 2022 10:29:10 +0000 Subject: [PATCH 069/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=97=A0=E6=B3=95=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 由于控制中心适配了v23的接口,所以需要在任务栏增加USE_AM宏的控制,未使用USE_AM宏的调用com.deepin.dde.ControlCenter接口,使用USE_AM宏的使用org.deepin.dde.ControlCenter1接口。 Log: 优化任务栏打开控制中心的问题 Influence: 任务栏-任务栏设置-打开控制中心 任务栏-蓝牙-蓝牙设置 任务栏-日期-日期时间设置 任务栏-电源-电源设置 任务栏-关机-关机设置 任务栏-声音-声音设置 观察是否正常打开控制中心 Bug: https://pms.uniontech.com/bug-view-149189.html Change-Id: I3373fc641c35e7589730a7cd595f2f55929ad2ec --- frame/util/menuworker.cpp | 15 ++++++++++--- .../window/components/volumedeviceswidget.cpp | 13 ++++++++--- plugins/airplane-mode/airplanemodeitem.cpp | 17 +++++++++++--- plugins/bluetooth/bluetoothitem.cpp | 16 +++++++++++--- .../bluetooth/componments/bluetoothapplet.cpp | 17 ++++++++++---- plugins/datetime/datetimeplugin.cpp | 16 +++++++++++--- plugins/keyboard-layout/dbusadaptors.cpp | 17 +++++++++++--- plugins/power/powerplugin.cpp | 22 +++++++++++++++---- plugins/shutdown/shutdownplugin.cpp | 16 +++++++++++--- plugins/sound/sounditem.cpp | 16 +++++++++++--- 10 files changed, 133 insertions(+), 32 deletions(-) diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index ab321ed0a..583775480 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -158,12 +158,21 @@ QMenu *MenuWorker::createMenu(QMenu *settingsMenu) void MenuWorker::onDockSettingsTriggered() { - DDBusSender().service("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") - .interface("org.deepin.dde.ControlCenter") +#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::showDockSettingsMenu(QMenu *menu) diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp index 0ec36aff2..615ce1736 100644 --- a/frame/window/components/volumedeviceswidget.cpp +++ b/frame/window/components/volumedeviceswidget.cpp @@ -194,10 +194,17 @@ void VolumeDevicesWidget::initConnection() m_deviceList->update(); } else { // 打开控制中心的声音模块 - DDBusSender().service("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") - .interface("org.deepin.dde.ControlCenter") +#ifdef USE_AM + DDBusSender().service("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") .method("ShowPage").arg(QString("sound")).call(); +#else + DDBusSender().service("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .method("ShowPage").arg(QString("sound")).call(); +#endif hide(); } }); diff --git a/plugins/airplane-mode/airplanemodeitem.cpp b/plugins/airplane-mode/airplanemodeitem.cpp index bcbaa206d..c78c94370 100644 --- a/plugins/airplane-mode/airplanemodeitem.cpp +++ b/plugins/airplane-mode/airplanemodeitem.cpp @@ -113,14 +113,25 @@ void AirplaneModeItem::invokeMenuItem(const QString menuId, const bool checked) if (menuId == SHIFT) m_airplaneModeInter->Enable(!m_airplaneModeInter->enabled()); else if (menuId == SETTINGS) +#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter") - .interface("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") .method(QString("ShowPage")) .arg(QString("network")) .arg(QString("Airplane Mode")) .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method(QString("ShowPage")) + .arg(QString("network")) + .arg(QString("Airplane Mode")) + .call(); +#endif */ } diff --git a/plugins/bluetooth/bluetoothitem.cpp b/plugins/bluetooth/bluetoothitem.cpp index a2ca2ac11..560fc9921 100644 --- a/plugins/bluetooth/bluetoothitem.cpp +++ b/plugins/bluetooth/bluetoothitem.cpp @@ -117,13 +117,23 @@ void BluetoothItem::invokeMenuItem(const QString menuId, const bool checked) if (menuId == SHIFT) { m_applet->setAdapterPowered(!m_adapterPowered); } else if (menuId == SETTINGS) { +#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter") - .interface("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method(QString("ShowPage")) + .arg(QString("bluetooth")) + .call(); +#endif } } diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index 9f579e3f3..fdc6d871b 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -274,15 +274,24 @@ void BluetoothApplet::initConnect() { connect(m_adaptersManager, &AdaptersManager::adapterIncreased, this, &BluetoothApplet::onAdapterAdded); connect(m_adaptersManager, &AdaptersManager::adapterDecreased, this, &BluetoothApplet::onAdapterRemoved); - connect(m_settingLabel, &SettingLabel::clicked, this, [ = ] { +#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter") - .interface("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method(QString("ShowPage")) + .arg(QString("bluetooth")) + .call(); +#endif }); connect(DApplicationHelper::instance(), &DApplicationHelper::themeTypeChanged, this, &BluetoothApplet::updateIconTheme); connect(m_airPlaneModeInter, &DBusAirplaneMode::EnabledChanged, this, &BluetoothApplet::setAirplaneModeEnabled); diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index c6ddf01af..5b33e482e 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -190,13 +190,23 @@ void DatetimePlugin::invokedMenuItem(const QString &itemKey, const QString &menu Q_UNUSED(checked) if (menuId == "open") { +#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter") - .interface("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") .method(QString("ShowPage")) .arg(QString("datetime")) .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method(QString("ShowPage")) + .arg(QString("datetime")) + .call(); +#endif } else { const bool value = timedateInterface()->property(TIME_FORMAT_KEY).toBool(); timedateInterface()->setProperty(TIME_FORMAT_KEY, !value); diff --git a/plugins/keyboard-layout/dbusadaptors.cpp b/plugins/keyboard-layout/dbusadaptors.cpp index 0e2f45b97..1ecdfc82d 100644 --- a/plugins/keyboard-layout/dbusadaptors.cpp +++ b/plugins/keyboard-layout/dbusadaptors.cpp @@ -173,14 +173,25 @@ void DBusAdaptors::refreshMenuSelection() void DBusAdaptors::handleActionTriggered(QAction *action) { if (action == m_addLayoutAction) { +#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter") - .interface("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") .method("ShowPage") .arg(QString("keyboard")) .arg(QString("Keyboard Layout/Add Keyboard Layout")) .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method("ShowPage") + .arg(QString("keyboard")) + .arg(QString("Keyboard Layout/Add Keyboard Layout")) + .call(); +#endif } const QString layout = action->objectName(); diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index 3a9252eaf..14d138709 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -113,7 +113,11 @@ bool PowerPlugin::pluginIsDisable() const QString PowerPlugin::itemCommand(const QString &itemKey) { if (itemKey == POWER_KEY) - return QString("dbus-send --print-reply --dest=org.deepin.dde.ControlCenter /org/deepin/dde/ControlCenter org.deepin.dde.ControlCenter.ShowPage \"string:power\""); +#ifdef USE_AM + return QString("dbus-send --print-reply --dest=org.deepin.dde.ControlCenter1 /org/deepin/dde/ControlCenter1 org.deepin.dde.ControlCenter1.ShowPage \"string:power\""); +#else + return QString("dbus-send --print-reply --dest=com.deepin.dde.ControlCenter /com/deepin/dde/ControlCenter com.deepin.dde.ControlCenter.ShowPage \"string:power\""); +#endif return QString(); } @@ -149,13 +153,23 @@ void PowerPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, Q_UNUSED(checked) if (menuId == "power") { +#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter") - .interface("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") .method(QString("ShowPage")) .arg(QString("power")) .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method(QString("ShowPage")) + .arg(QString("power")) + .call(); +#endif } } diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index fc5d5dd7d..81dec6047 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -233,13 +233,23 @@ void ShutdownPlugin::invokedMenuItem(const QString &itemKey, const QString &menu QCoreApplication::processEvents(QEventLoop::AllEvents, 200); if (menuId == "power") { +#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter") - .interface("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") .method(QString("ShowPage")) .arg(QString("power")) .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method(QString("ShowPage")) + .arg(QString("power")) + .call(); +#endif } else if (menuId == "Lock") { if (QFile::exists(ICBC_CONF_FILE)) { QDBusMessage send = QDBusMessage::createMethodCall("com.deepin.dde.lockFront", "/com/deepin/dde/lockFront", "com.deepin.dde.lockFront", "SwitchTTYAndShow"); diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 2e878066b..1ac357979 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -128,13 +128,23 @@ void SoundItem::invokeMenuItem(const QString menuId, const bool checked) if (menuId == MUTE) m_sinkInter->SetMuteQueued(!m_sinkInter->mute()); else if (menuId == SETTINGS) +#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter") - .interface("org.deepin.dde.ControlCenter") - .path("/org/deepin/dde/ControlCenter") + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") .method(QString("ShowPage")) .arg(QString("sound")) .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method(QString("ShowPage")) + .arg(QString("sound")) + .call(); +#endif } void SoundItem::resizeEvent(QResizeEvent *e) From 028762a5b6b7e1be59d4e87c73d99786be4bba0e Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 16 Aug 2022 09:39:43 +0000 Subject: [PATCH 070/257] =?UTF-8?q?fix:=20=E6=97=B6=E5=B0=9A=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E6=97=A5=E6=9C=9F=E6=97=B6=E9=97=B4=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=8F=B3=E9=94=AE=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 时尚模式下的日期时间增加右键菜单,并且响应对应的功能 Log: Influence: 任务栏-时尚模式,右键查看日期时间是否存在时间日期菜单 Task: https://pms.uniontech.com/task-view-162235.html Change-Id: I7a7cb951647d8fcba85087e8baec54f41d9f9226 --- frame/window/components/datetimedisplayer.cpp | 67 +++++++++++++++++-- frame/window/components/datetimedisplayer.h | 9 ++- frame/window/quicksettingcontainer.cpp | 3 + frame/window/systempluginwindow.cpp | 1 - frame/window/systempluginwindow.h | 3 +- frame/window/traymanagerwindow.cpp | 2 +- 6 files changed, 77 insertions(+), 8 deletions(-) diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index e751d1ac6..dc8fe195b 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -29,6 +29,7 @@ #include #include #include +#include DWIDGET_USE_NAMESPACE DGUI_USE_NAMESPACE @@ -46,6 +47,7 @@ DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) , m_position(Dock::Position::Bottom) , m_dateFont(DFontSizeManager::instance()->t10()) , m_tipsWidget(new Dock::TipsWidget(this)) + , m_menu(new QMenu(this)) , m_tipsTimer(new QTimer(this)) , m_currentSize(0) , m_oneRow(false) @@ -64,10 +66,10 @@ DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) m_tipsTimer->setInterval(1000); m_tipsTimer->start(); updatePolicy(); - m_tipPopupWindow->hide(); - if (Utils::IS_WAYLAND_DISPLAY) { + createMenuItem(); + if (Utils::IS_WAYLAND_DISPLAY) m_tipPopupWindow->setWindowFlags(m_tipPopupWindow->windowFlags() | Qt::FramelessWindowHint); - } + m_tipPopupWindow->hide(); } DateTimeDisplayer::~DateTimeDisplayer() @@ -131,6 +133,14 @@ QSize DateTimeDisplayer::suitableSize() return QSize(width(), info.m_timeRect.height() + info.m_dateRect.height()); } +void DateTimeDisplayer::mousePressEvent(QMouseEvent *event) +{ + if ((event->button() != Qt::RightButton)) + return QWidget::mousePressEvent(event); + + m_menu->exec(QCursor::pos()); +} + void DateTimeDisplayer::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event); @@ -226,7 +236,7 @@ void DateTimeDisplayer::onDateTimeFormatChanged() repaint(); // 如果日期时间的格式发生了变化,需要通知外部来调整日期时间的尺寸 if (lastSize != m_currentSize) - Q_EMIT sizeChanged(); + Q_EMIT requestUpdate(); } void DateTimeDisplayer::paintEvent(QPaintEvent *e) @@ -302,6 +312,45 @@ QFont DateTimeDisplayer::timeFont() const return dateFontSize[index]; } +void DateTimeDisplayer::createMenuItem() +{ + QAction *timeFormatAction = new QAction(this); + if (m_timedateInter->use24HourFormat()) + timeFormatAction->setText(tr("12-hour time")); + else + timeFormatAction->setText(tr("24-hour time")); + + connect(timeFormatAction, &QAction::triggered, this, [ = ] { + m_timedateInter->setUse24HourFormat(!m_timedateInter->use24HourFormat()); + }); + m_menu->addAction(timeFormatAction); + + if (!QFile::exists(ICBC_CONF_FILE)) { + QAction *timeSettingAction = new QAction(tr("Time settings"), this); + connect(timeSettingAction, &QAction::triggered, this, [ = ] { +#ifdef USE_AM + DDBusSender() + .service("org.deepin.dde.ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") + .method(QString("ShowPage")) + .arg(QString("datetime")) + .call(); +#else + DDBusSender() + .service("com.deepin.dde.ControlCenter") + .interface("com.deepin.dde.ControlCenter") + .path("/com/deepin/dde/ControlCenter") + .method(QString("ShowPage")) + .arg(QString("datetime")) + .call(); +#endif + }); + + m_menu->addAction(timeSettingAction); + } +} + void DateTimeDisplayer::enterEvent(QEvent *event) { Q_UNUSED(event); @@ -314,6 +363,16 @@ 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; diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index 3b1a29e8e..693db0b53 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -29,7 +29,9 @@ #include namespace Dock { class TipsWidget; } + class DockPopupWindow; +class QMenu; using Timedate = com::deepin::daemon::Timedate; @@ -53,13 +55,15 @@ public: QSize suitableSize(); Q_SIGNALS: - void sizeChanged(); // 当日期时间格式发生变化的时候,需要通知外面来更新窗口尺寸 + void requestUpdate(); // 当日期时间格式发生变化的时候,需要通知外面来更新窗口尺寸 protected: + void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void paintEvent(QPaintEvent *e) override; void enterEvent(QEvent *event) override; void leaveEvent(QEvent *event) override; + void resizeEvent(QResizeEvent *event) override; private: void updatePolicy(); @@ -72,6 +76,8 @@ private: QPoint tipsPoint() const; QFont timeFont() const; + void createMenuItem(); + private Q_SLOTS: void onTimeChanged(); void onDateTimeFormatChanged(); @@ -81,6 +87,7 @@ private: Dock::Position m_position; QFont m_dateFont; Dock::TipsWidget *m_tipsWidget; + QMenu *m_menu; QSharedPointer m_tipPopupWindow; QTimer *m_tipsTimer; QString m_lastDateString; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 53c290e5a..133686b0d 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -31,6 +31,7 @@ #include "volumedeviceswidget.h" #include "pluginchildpage.h" #include "volumemodel.h" +#include "utils.h" #include #include @@ -120,6 +121,8 @@ DockPopupWindow *QuickSettingContainer::popWindow() m_popWindow->setArrowHeight(10); m_popWindow->setArrowDirection(getDirection(m_position)); m_popWindow->setContent(new QuickSettingContainer(m_popWindow)); + if (Utils::IS_WAYLAND_DISPLAY) + m_popWindow->setWindowFlags(m_popWindow->windowFlags() | Qt::FramelessWindowHint | Qt::Popup); return m_popWindow; } diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index fed159c50..478b4ccaf 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -21,7 +21,6 @@ #include "systempluginwindow.h" #include "systemplugincontroller.h" #include "systempluginitem.h" -#include "dockpluginscontroller.h" #include "fixedplugincontroller.h" #include diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index bb8e5ec13..a21ba18a4 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -22,13 +22,14 @@ #define SYSTEMPLUGINWINDOW_H #include "constants.h" -#include "dockpluginscontroller.h" +#include "dockitem.h" #include class FixedPluginController; class StretchPluginsItem; class QBoxLayout; +class PluginsItemInterface; namespace Dtk { namespace Widget { class DListView; } } diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 50b03cc68..6a41748fa 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -294,7 +294,7 @@ void TrayManagerWindow::initConnection() } } }); - connect(m_dateTimeWidget, &DateTimeDisplayer::sizeChanged, this, &TrayManagerWindow::requestUpdate); + connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &TrayManagerWindow::requestUpdate); m_trayView->installEventFilter(this); m_quickIconWidget->installEventFilter(this); From 766d6dfcfd3e53929a799d6e08214d6210c1d70b Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 8 Aug 2022 01:25:37 +0000 Subject: [PATCH 071/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E6=9C=80=E8=BF=91=E4=BD=BF=E7=94=A8=E5=8C=BA=E5=9F=9F=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=A9=BB=E7=95=99=E5=90=8E=E5=BA=94=E7=94=A8=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=B2=A1=E6=9C=89=E9=A9=BB=E7=95=99=E5=88=B0=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=8C=BA=E5=9F=9F=E6=9C=80=E6=9C=AB=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在AM端处理移除驻留的时候,将需要移除的应用放到列表的最后面,前端在处理应用app发生变化的时候,从后端获取应用的排序,并按照正确的顺序进行排序 Log: 修复驻留最近使用图标无法添加到末尾的问题 Influence: 任务栏时尚模式下,在最近使用区域移除驻留,观察移除的驻留是否在区域的末尾 Bug: https://pms.uniontech.com/bug-view-147643.html Change-Id: I127aea93d9ff5718aa6bd1989a328b11dbd95a2f --- frame/controller/recentapphelper.cpp | 62 ++++++++++++++++++++-------- frame/controller/recentapphelper.h | 7 +++- frame/item/appitem.cpp | 7 +++- frame/item/appitem.h | 1 + frame/window/mainpanelcontrol.cpp | 7 ++++ frame/window/mainpanelcontrol.h | 1 + 6 files changed, 64 insertions(+), 21 deletions(-) diff --git a/frame/controller/recentapphelper.cpp b/frame/controller/recentapphelper.cpp index e6777a14e..1d7440810 100644 --- a/frame/controller/recentapphelper.cpp +++ b/frame/controller/recentapphelper.cpp @@ -35,9 +35,11 @@ RecentAppHelper::RecentAppHelper(QWidget *appWidget, QWidget *recentWidget, QObj void RecentAppHelper::setDisplayMode(Dock::DisplayMode displayMode) { - m_dislayMode = displayMode; + bool lastVisible = dockAppIsVisible(); + m_displayMode = displayMode; resetDockItems(); updateRecentVisible(); + updateDockAppVisible(lastVisible); } // 当在应用区域调整位置的时候,需要重新设置索引 @@ -74,12 +76,14 @@ void RecentAppHelper::resetAppInfo() void RecentAppHelper::addAppItem(int index, DockItem *dockItem) { - if (appInRecent(dockItem)) + if (appInRecent(dockItem)) { addRecentAreaItem(index, dockItem); - else + updateRecentVisible(); + } else { + bool lastVisible = dockAppIsVisible(); addAppAreaItem(index, dockItem); - - updateRecentVisible(); + updateDockAppVisible(lastVisible); + } connect(dockItem, &QWidget::destroyed, this, [ this, dockItem ] { if (m_sequentDockItems.contains(dockItem)) @@ -96,12 +100,15 @@ void RecentAppHelper::addAppItem(int index, DockItem *dockItem) m_sequentDockItems << dockItem; } -void RecentAppHelper::removeAppItem(DockItem *appItem) +void RecentAppHelper::removeAppItem(DockItem *dockItem) { - if (appInRecent(appItem)) - removeRecentAreaItem(appItem); + if (appInRecent(dockItem)) + removeRecentAreaItem(dockItem); else - removeAppAreaItem(appItem); + removeAppAreaItem(dockItem); + + AppItem *appItem = qobject_cast(dockItem); + disconnect(appItem, &AppItem::isDockChanged, this, &RecentAppHelper::onIsDockChanged); } bool RecentAppHelper::recentIsVisible() const @@ -109,6 +116,12 @@ bool RecentAppHelper::recentIsVisible() const return m_recentWidget->isVisible(); } +bool RecentAppHelper::dockAppIsVisible() const +{ + return (m_displayMode == Dock::DisplayMode::Efficient + || m_appWidget->layout()->count() > 0); +} + bool RecentAppHelper::eventFilter(QObject *watched, QEvent *event) { if (watched == m_appWidget || watched == m_recentWidget) { @@ -134,14 +147,16 @@ bool RecentAppHelper::eventFilter(QObject *watched, QEvent *event) void RecentAppHelper::onIsDockChanged() { + bool lastVisible = dockAppIsVisible(); resetDockItems(); updateRecentVisible(); + updateDockAppVisible(lastVisible); } bool RecentAppHelper::appInRecent(DockItem *item) const { // 先判断当前是否为时尚模式,只有时尚模式下才支持最近打开的应用 - if (m_dislayMode != Dock::DisplayMode::Fashion) + if (m_displayMode != Dock::DisplayMode::Fashion) return false; // TODO 当控制中心不开启最近打开应用的功能的时候,则始终让其显示在应用区域 @@ -165,23 +180,32 @@ void RecentAppHelper::addRecentAreaItem(int index, DockItem *wdg) void RecentAppHelper::updateRecentVisible() { - bool oldVisible = recentIsVisible(); + bool lastRecentVisible = recentIsVisible(); + bool recentVisible = lastRecentVisible; - if (m_dislayMode == Dock::DisplayMode::Efficient) { + if (m_displayMode == Dock::DisplayMode::Efficient) { // 如果是高效模式,不显示最近打开应用区域 m_recentWidget->setVisible(false); + recentVisible = false; } else { QBoxLayout *recentLayout = static_cast(m_recentWidget->layout()); - qInfo() << "recent Widget count:" << recentLayout->count(); + qInfo() << "recent Widget count:" << recentLayout->count() << ", app Widget count" << m_appWidget->layout()->count(); // 如果是特效模式,则判断当前打开应用数量是否为0,为0则不显示,否则显示 - m_recentWidget->setVisible(recentLayout->count() > 0); + recentVisible = (recentLayout->count() > 0); + m_recentWidget->setVisible(recentVisible); } - bool recentVisible = recentIsVisible(); - if (oldVisible != recentVisible) + if (lastRecentVisible != recentVisible) Q_EMIT recentVisibleChanged(recentVisible); } +void RecentAppHelper::updateDockAppVisible(bool lastVisible) +{ + bool visible = dockAppIsVisible(); + if (lastVisible != visible) + Q_EMIT dockAppVisibleChanged(visible); +} + void RecentAppHelper::removeRecentAreaItem(DockItem *wdg) { QBoxLayout *recentLayout = static_cast(m_recentWidget->layout()); @@ -192,13 +216,15 @@ void RecentAppHelper::removeRecentAreaItem(DockItem *wdg) void RecentAppHelper::removeAppAreaItem(DockItem *wdg) { QBoxLayout *boxLayout = static_cast(m_appWidget->layout()); + bool lastVisible = dockAppIsVisible(); boxLayout->removeWidget(wdg); + updateDockAppVisible(lastVisible); } QList RecentAppHelper::dockItemToAppArea() const { QList dockItems; - if (m_dislayMode == Dock::DisplayMode::Efficient) { + if (m_displayMode == Dock::DisplayMode::Efficient) { // 由特效模式变成高效模式,将所有的最近打开的应用移动到左侧的应用区域 for (int i = 0; i < m_recentWidget->layout()->count(); i++) { DockItem *appItem = qobject_cast(m_recentWidget->layout()->itemAt(i)->widget()); @@ -240,7 +266,7 @@ void RecentAppHelper::resetDockItems() boxLayout->addWidget(appItem); } - if (m_dislayMode == Dock::DisplayMode::Fashion) { + if (m_displayMode == Dock::DisplayMode::Fashion) { // 由高效模式变成特效模式后,将左侧未驻留的应用移动到右侧的最近打开应用中 QList unDockItems; for (int i = 0; i < m_appWidget->layout()->count() ; i++) { diff --git a/frame/controller/recentapphelper.h b/frame/controller/recentapphelper.h index e0d1b0702..e515cb256 100644 --- a/frame/controller/recentapphelper.h +++ b/frame/controller/recentapphelper.h @@ -42,12 +42,14 @@ public: void setDisplayMode(Dock::DisplayMode displayMode); void resetAppInfo(); void addAppItem(int index, DockItem *appItem); - void removeAppItem(DockItem *appItem); + void removeAppItem(DockItem *dockItem); bool recentIsVisible() const; + bool dockAppIsVisible() const; Q_SIGNALS: void requestUpdate(); void recentVisibleChanged(bool); // 最近区域是否可见发生变化的信号 + void dockAppVisibleChanged(bool); // 驻留应用区域是否可见发生变化的信号 protected: bool eventFilter(QObject *watched, QEvent *event) override; @@ -57,6 +59,7 @@ private: void addAppAreaItem(int index, DockItem *wdg); void addRecentAreaItem(int index, DockItem *wdg); void updateRecentVisible(); + void updateDockAppVisible(bool lastVisible); void removeRecentAreaItem(DockItem *wdg); void removeAppAreaItem(DockItem *wdg); @@ -76,7 +79,7 @@ private: QList m_sequentDockItems; - Dock::DisplayMode m_dislayMode; + Dock::DisplayMode m_displayMode; }; #endif // RECENTAPPHELPER_H diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 875071760..6958e8c5a 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -228,6 +228,11 @@ qint64 AppItem::appOpenMSecs() const return m_createMSecs; } +void AppItem::updateMSecs() +{ + m_createMSecs = QDateTime::currentMSecsSinceEpoch(); +} + void AppItem::moveEvent(QMoveEvent *e) { DockItem::moveEvent(e); @@ -609,7 +614,7 @@ void AppItem::updateWindowInfos(const WindowInfoMap &info) { // 如果是打开第一个窗口,则更新窗口时间 if (m_windowInfos.isEmpty() && !info.isEmpty()) - m_createMSecs = QDateTime::currentMSecsSinceEpoch(); + updateMSecs(); m_windowInfos = info; if (m_appPreviewTips) diff --git a/frame/item/appitem.h b/frame/item/appitem.h index 5709ff6a0..e9d6b0c3c 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -67,6 +67,7 @@ public: void requestDock(); bool isDocked() const; qint64 appOpenMSecs() const; + void updateMSecs(); signals: void requestActivateWindow(const WId wid) const; diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 4495e7403..d6b367983 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -202,6 +202,7 @@ void MainPanelControl::initConnection() connect(m_trayManagerWidget, &TrayManagerWindow::requestUpdate, this, &MainPanelControl::onRequestUpdate); connect(m_recentHelper, &RecentAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate); connect(m_recentHelper, &RecentAppHelper::recentVisibleChanged, this, &MainPanelControl::onRecentVisibleChanged); + connect(m_recentHelper, &RecentAppHelper::dockAppVisibleChanged, this, &MainPanelControl::onDockAppVisibleChanged); connect(m_toolHelper, &ToolAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate); connect(m_toolHelper, &ToolAppHelper::toolVisibleChanged, this, &MainPanelControl::onToolVisibleChanged); } @@ -951,6 +952,7 @@ void MainPanelControl::updateModeChange() m_pluginAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); m_trayManagerWidget->setVisible(m_displayMode != DisplayMode::Efficient); onRecentVisibleChanged(m_recentHelper->recentIsVisible()); + onDockAppVisibleChanged(m_recentHelper->dockAppIsVisible()); onToolVisibleChanged(m_toolHelper->toolIsVisible()); if (m_tray) m_tray->setVisible(m_displayMode == DisplayMode::Efficient); @@ -1438,6 +1440,11 @@ void MainPanelControl::onRecentVisibleChanged(bool visible) m_appSpliter->setVisible(visible); } +void MainPanelControl::onDockAppVisibleChanged(bool visible) +{ + m_fixedSpliter->setVisible(visible); +} + void MainPanelControl::onToolVisibleChanged(bool visible) { m_recentSpliter->setVisible(visible); diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index e60624f20..c265af2ce 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -100,6 +100,7 @@ private: private Q_SLOTS: void onRequestUpdate(); void onRecentVisibleChanged(bool visible); + void onDockAppVisibleChanged(bool visible); void onToolVisibleChanged(bool visible); protected: From 90a076a0435a12c8a79dcc4265c0386dd26a84aa Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 15 Aug 2022 18:07:14 +0000 Subject: [PATCH 072/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E9=80=82?= =?UTF-8?q?=E9=85=8D=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E4=BD=BF=E7=94=A8=E6=9C=80=E8=BF=91=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加获取是否显示最近使用应用的接口,相应相关的功能 Log: Influence: 开关是否显示最近使用应用,时尚模式下观察最近使用应用是否显示或隐藏 Bug: https://pms.uniontech.com/bug-view-147717.html Change-Id: I5de2f978da6f5911a8c873b903095ef9f7bbd14e --- frame/controller/recentapphelper.cpp | 125 +++++++++++++++++++++------ frame/controller/recentapphelper.h | 21 +++-- frame/dbus/dockinterface.cpp | 5 ++ frame/dbus/dockinterface.h | 12 +++ frame/dbus/entryinterface.cpp | 27 +++--- frame/dbus/entryinterface.h | 7 +- frame/item/appitem.cpp | 12 ++- frame/item/appitem.h | 4 + frame/window/mainpanelcontrol.cpp | 10 ++- frame/window/mainpanelcontrol.h | 2 + 10 files changed, 177 insertions(+), 48 deletions(-) diff --git a/frame/controller/recentapphelper.cpp b/frame/controller/recentapphelper.cpp index 1d7440810..fdeb1ec15 100644 --- a/frame/controller/recentapphelper.cpp +++ b/frame/controller/recentapphelper.cpp @@ -24,10 +24,15 @@ #include -RecentAppHelper::RecentAppHelper(QWidget *appWidget, QWidget *recentWidget, QObject *parent) +#define ENTRY_NONE 0 +#define ENTRY_NORMAL 1 +#define ENTRY_RECENT 2 + +RecentAppHelper::RecentAppHelper(QWidget *appWidget, QWidget *recentWidget, DockInter *dockInter, QObject *parent) : QObject(parent) , m_appWidget(appWidget) , m_recentWidget(recentWidget) + , m_dockInter(dockInter) { m_appWidget->installEventFilter(this); m_recentWidget->installEventFilter(this); @@ -37,7 +42,9 @@ void RecentAppHelper::setDisplayMode(Dock::DisplayMode displayMode) { bool lastVisible = dockAppIsVisible(); m_displayMode = displayMode; +#ifndef USE_AM resetDockItems(); +#endif updateRecentVisible(); updateDockAppVisible(lastVisible); } @@ -45,8 +52,9 @@ void RecentAppHelper::setDisplayMode(Dock::DisplayMode displayMode) // 当在应用区域调整位置的时候,需要重新设置索引 void RecentAppHelper::resetAppInfo() { + #ifndef USE_AM // 获取应用区域和最近打开区域的app图标 - QList appDockItem = dockItems(false); + QList appDockItem = appItems(m_appWidget); // 获取应用区域图标在原来列表中的位置 QList dockIndex; @@ -72,6 +80,7 @@ void RecentAppHelper::resetAppInfo() else m_sequentDockItems << appItem; } +#endif } void RecentAppHelper::addAppItem(int index, DockItem *dockItem) @@ -85,30 +94,35 @@ void RecentAppHelper::addAppItem(int index, DockItem *dockItem) updateDockAppVisible(lastVisible); } + AppItem *appItem = qobject_cast(dockItem); + +#ifdef USE_AM + connect(appItem, &AppItem::modeChanged, this, &RecentAppHelper::onModeChanged); +#else connect(dockItem, &QWidget::destroyed, this, [ this, dockItem ] { if (m_sequentDockItems.contains(dockItem)) m_sequentDockItems.removeOne(dockItem); }); - - AppItem *appItem = qobject_cast(dockItem); - connect(appItem, &AppItem::isDockChanged, this, &RecentAppHelper::onIsDockChanged); + connect(appItem, &AppItem::isDockChanged, this, &RecentAppHelper::onItemChanged); // 如果索引值大于0,说明它是插入到固定位置的,否则,则认为它是顺序排列的 if (index >= 0 && index < m_sequentDockItems.size()) m_sequentDockItems.insert(index, dockItem); else m_sequentDockItems << dockItem; +#endif } void RecentAppHelper::removeAppItem(DockItem *dockItem) { - if (appInRecent(dockItem)) + if (m_recentWidget->children().contains(dockItem)) removeRecentAreaItem(dockItem); else removeAppAreaItem(dockItem); - +#ifndef USE_AM AppItem *appItem = qobject_cast(dockItem); - disconnect(appItem, &AppItem::isDockChanged, this, &RecentAppHelper::onIsDockChanged); + disconnect(appItem, &AppItem::isDockChanged, this, &RecentAppHelper::onItemChanged); +#endif } bool RecentAppHelper::recentIsVisible() const @@ -145,25 +159,55 @@ bool RecentAppHelper::eventFilter(QObject *watched, QEvent *event) return QObject::eventFilter(watched, event); } -void RecentAppHelper::onIsDockChanged() +#ifdef USE_AM +void RecentAppHelper::onModeChanged(int mode) +{ + AppItem *appItem = qobject_cast(sender()); + if (!appItem) + return; + + auto moveItemToWidget = [ = ](QWidget *widget) { + int index = getEntryIndex(appItem, widget); + removeAppItem(appItem); + QBoxLayout *layout = static_cast(widget->layout()); + layout->insertWidget(index, appItem); + }; + + if (mode == ENTRY_NORMAL) { + // 添加到应用区域 + moveItemToWidget(m_appWidget); + } else if (mode == ENTRY_RECENT) { + // 添加到最近打开应用区域 + moveItemToWidget(m_recentWidget); + } + updateRecentVisible(); +} +#else +void RecentAppHelper::onItemChanged() { bool lastVisible = dockAppIsVisible(); resetDockItems(); updateRecentVisible(); updateDockAppVisible(lastVisible); } +#endif bool RecentAppHelper::appInRecent(DockItem *item) const { +#ifdef USE_AM + AppItem *appItem = qobject_cast(item); + if (!appItem) + return false; + + return (appItem->mode() == ENTRY_RECENT); +#else // 先判断当前是否为时尚模式,只有时尚模式下才支持最近打开的应用 if (m_displayMode != Dock::DisplayMode::Fashion) return false; - - // TODO 当控制中心不开启最近打开应用的功能的时候,则始终让其显示在应用区域 - // 只有当应用没有固定到任务栏上才认为它是最新打开的应用 AppItem *appItem = qobject_cast(item); return (appItem && !appItem->isDocked()); +#endif } void RecentAppHelper::addAppAreaItem(int index, DockItem *wdg) @@ -180,7 +224,7 @@ void RecentAppHelper::addRecentAreaItem(int index, DockItem *wdg) void RecentAppHelper::updateRecentVisible() { - bool lastRecentVisible = recentIsVisible(); + bool lastRecentVisible = m_recentWidget->isVisible(); bool recentVisible = lastRecentVisible; if (m_displayMode == Dock::DisplayMode::Efficient) { @@ -190,7 +234,7 @@ void RecentAppHelper::updateRecentVisible() } else { QBoxLayout *recentLayout = static_cast(m_recentWidget->layout()); qInfo() << "recent Widget count:" << recentLayout->count() << ", app Widget count" << m_appWidget->layout()->count(); - // 如果是特效模式,则判断当前打开应用数量是否为0,为0则不显示,否则显示 + // 如果是时尚模式,则判断当前打开应用数量是否为0,为0则不显示,否则显示 recentVisible = (recentLayout->count() > 0); m_recentWidget->setVisible(recentVisible); } @@ -221,6 +265,7 @@ void RecentAppHelper::removeAppAreaItem(DockItem *wdg) updateDockAppVisible(lastVisible); } +#ifndef USE_AM QList RecentAppHelper::dockItemToAppArea() const { QList dockItems; @@ -311,29 +356,59 @@ int RecentAppHelper::getDockItemIndex(DockItem *dockItem, bool isRecent) const return appItem1->appOpenMSecs() < appItem2->appOpenMSecs(); }); } + int index = sequeDockItems.indexOf(dockItem); // 查找所有在应用区域的图标 - QList dockApps = dockItems(isRecent); + QList dockApps = appItems(isRecent ? m_recentWidget : m_appWidget); for (int i = index + 1; i < sequeDockItems.size(); i++) { DockItem *item = sequeDockItems[i]; - if (dockApps.contains(item)) - return dockApps.indexOf(item); + int itemIndex = dockApps.indexOf(static_cast(item)); + if (itemIndex >= 0) + return itemIndex; } return -1; } +#endif -QList RecentAppHelper::dockItems(bool isRecent) const +int RecentAppHelper::getEntryIndex(DockItem *dockItem, QWidget *widget) const { - QLayout *layout = nullptr; - if (isRecent) - layout = m_recentWidget->layout(); - else - layout = m_appWidget->layout(); + AppItem *appItem = qobject_cast(dockItem); + if (!appItem) + return -1; - QList dockItems; + // 查找当前的应用在所有的应用中的排序 + QStringList entryIds = m_dockInter->GetEntryIDs(); + int index = entryIds.indexOf(appItem->appId()); + if (index < 0) + return -1; + + QList filterAppItems = appItems(widget); + // 获取当前在最近应用中的所有的APP,并计算它的位置 + int lastIndex = -1; + // 从后面向前面遍历,找到对应的位置,插入 + for (int i = filterAppItems.size() - 1; i >= 0; i--) { + AppItem *item = filterAppItems[i]; + // 如果所在的索引在要查找的APP索引的后面,说明当前的索引在要查找的索引之后,跳过即可 + // 如果所在索引不在列表中(一般情况下不存在,这里是容错处理),也跳过 + int curIndex = entryIds.indexOf(item->appId()); + if (item == appItem || curIndex < 0 || curIndex >= index) + continue; + + if (lastIndex < curIndex) + lastIndex = curIndex; + } + + return ++lastIndex; +} + +QList RecentAppHelper::appItems(QWidget *widget) const +{ + QLayout *layout = widget->layout(); + + QList dockItems; for (int i = 0; i < layout->count(); i++) { - DockItem *dockItem = qobject_cast(layout->itemAt(i)->widget()); + AppItem *dockItem = qobject_cast(layout->itemAt(i)->widget()); if (!dockItem) continue; diff --git a/frame/controller/recentapphelper.h b/frame/controller/recentapphelper.h index e515cb256..5b69c51af 100644 --- a/frame/controller/recentapphelper.h +++ b/frame/controller/recentapphelper.h @@ -23,10 +23,12 @@ #define RECENTAPPHELPER_H #include "constants.h" +#include "dbusutil.h" #include class DockItem; +class AppItem; class QWidget; /** 用来管理最近打开区域和APP应用区域交互的类 @@ -38,7 +40,7 @@ class RecentAppHelper : public QObject Q_OBJECT public: - explicit RecentAppHelper(QWidget *appWidget, QWidget *recentWidget, QObject *parent = nullptr); + explicit RecentAppHelper(QWidget *appWidget, QWidget *recentWidget, DockInter *dockInter, QObject *parent = nullptr); void setDisplayMode(Dock::DisplayMode displayMode); void resetAppInfo(); void addAppItem(int index, DockItem *appItem); @@ -64,22 +66,29 @@ private: void removeRecentAreaItem(DockItem *wdg); void removeAppAreaItem(DockItem *wdg); +#ifndef USE_AM QList dockItemToAppArea() const; void resetDockItems(); int getDockItemIndex(DockItem *dockItem, bool isRecent) const; +#endif + int getEntryIndex(DockItem *dockItem, QWidget *widget) const; - QList dockItems(bool isRecent) const; + QList appItems(QWidget *widget) const; private Q_SLOTS: - void onIsDockChanged(); - +#ifdef USE_AM + void onModeChanged(int mode); +#else + void onItemChanged(); +#endif private: QWidget *m_appWidget; QWidget *m_recentWidget; - +#ifndef USE_AM QList m_sequentDockItems; - +#endif Dock::DisplayMode m_displayMode; + DockInter *m_dockInter; }; #endif // RECENTAPPHELPER_H diff --git a/frame/dbus/dockinterface.cpp b/frame/dbus/dockinterface.cpp index d02b6fe9c..dfdb7b98b 100644 --- a/frame/dbus/dockinterface.cpp +++ b/frame/dbus/dockinterface.cpp @@ -323,6 +323,11 @@ void Dde_Dock::setWindowSizeFashion(uint value) setProperty("WindowSizeFashion", QVariant::fromValue(value)); } +bool Dde_Dock::showRecent() const +{ + return qvariant_cast(property("ShowRecent")); +} + QDBusPendingReply<> Dde_Dock::ActivateWindow(uint in0) { return m_wm->ActivateWindow(in0); diff --git a/frame/dbus/dockinterface.h b/frame/dbus/dockinterface.h index 1734bea2c..5f04ccd3c 100644 --- a/frame/dbus/dockinterface.h +++ b/frame/dbus/dockinterface.h @@ -125,6 +125,9 @@ public: uint windowSizeFashion(); void setWindowSizeFashion(uint value); + Q_PROPERTY(bool ShowRecent READ showRecent NOTIFY showRecentChanged) + bool showRecent() const; + public Q_SLOTS: // METHODS QDBusPendingReply<> ActivateWindow(uint in0); @@ -263,6 +266,14 @@ public Q_SLOTS: // METHODS return asyncCallWithArgumentList(QStringLiteral("RequestUndock"), argumentList); } + inline void SetShowRecent(bool in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + + CallQueued(QStringLiteral("SetShowRecent"), argumentList); + } + inline QDBusPendingReply<> SetFrontendWindowRect(int in0, int in1, uint in2, uint in3) { QList argumentList; @@ -314,6 +325,7 @@ Q_SIGNALS: // SIGNALS void WindowSizeChanged(uint value) const; void WindowSizeEfficientChanged(uint value) const; void WindowSizeFashionChanged(uint value) const; + void showRecentChanged(bool) const; public Q_SLOTS: void CallQueued(const QString &callName, const QList &args); diff --git a/frame/dbus/entryinterface.cpp b/frame/dbus/entryinterface.cpp index 8b3242446..dd292f4f5 100644 --- a/frame/dbus/entryinterface.cpp +++ b/frame/dbus/entryinterface.cpp @@ -86,6 +86,7 @@ public: : CurrentWindow(0) , IsActive(false) , IsDocked(false) + , mode(0) {} // begin member variables @@ -99,6 +100,7 @@ public: QString Name; WindowInfoMap WindowInfos; + int mode; public: QMap m_processingCalls; @@ -131,8 +133,7 @@ void Dock_Entry::onPropertyChanged(const QString &propName, const QVariant &valu { if (propName == QStringLiteral("CurrentWindow")) { const uint &CurrentWindow = qvariant_cast(value); - if (d_ptr->CurrentWindow != CurrentWindow) - { + if (d_ptr->CurrentWindow != CurrentWindow) { d_ptr->CurrentWindow = CurrentWindow; Q_EMIT CurrentWindowChanged(d_ptr->CurrentWindow); } @@ -158,15 +159,6 @@ void Dock_Entry::onPropertyChanged(const QString &propName, const QVariant &valu return; } - if (propName == QStringLiteral("Id")) { - const QString &Id = qvariant_cast(value); - if (d_ptr->Id != Id) { - d_ptr->Id = Id; - Q_EMIT IdChanged(d_ptr->Id); - } - return; - } - if (propName == QStringLiteral("IsActive")) { const bool &IsActive = qvariant_cast(value); if (d_ptr->IsActive != IsActive) { @@ -212,6 +204,14 @@ void Dock_Entry::onPropertyChanged(const QString &propName, const QVariant &valu return; } + if (propName == QStringLiteral("Mode")) { + const int mode = qvariant_cast(value); + if (d_ptr->mode != mode) { + d_ptr->mode = mode; + Q_EMIT ModeChanged(d_ptr->mode); + } + } + qWarning() << "property not handle: " << propName; return; } @@ -246,6 +246,11 @@ bool Dock_Entry::isDocked() return qvariant_cast(property("IsDocked")); } +int Dock_Entry::mode() const +{ + return qvariant_cast(property("Mode")); +} + QString Dock_Entry::menu() { return qvariant_cast(property("Menu")); diff --git a/frame/dbus/entryinterface.h b/frame/dbus/entryinterface.h index 4cce4fef6..cc9ad3ccf 100644 --- a/frame/dbus/entryinterface.h +++ b/frame/dbus/entryinterface.h @@ -91,7 +91,7 @@ public: Q_PROPERTY(QString Icon READ icon NOTIFY IconChanged) QString icon(); - Q_PROPERTY(QString Id READ id NOTIFY IdChanged) + Q_PROPERTY(QString Id READ id) QString id(); Q_PROPERTY(bool IsActive READ isActive NOTIFY IsActiveChanged) @@ -109,6 +109,9 @@ public: Q_PROPERTY(WindowInfoMap WindowInfos READ windowInfos NOTIFY WindowInfosChanged) WindowInfoMap windowInfos(); + Q_PROPERTY(int Mode READ mode NOTIFY ModeChanged) + int mode() const; + public Q_SLOTS: // METHODS inline QDBusPendingReply<> Activate(uint in0) { @@ -243,7 +246,7 @@ Q_SIGNALS: // SIGNALS void CurrentWindowChanged(uint32_t value) const; void WindowInfosChanged(WindowInfoMap value) const; - void IdChanged(const QString &value) const; + void ModeChanged(int value) const; private: QVariant asyncProperty(const QString &propertyName); diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 6958e8c5a..b02a97e8f 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -97,8 +97,11 @@ AppItem::AppItem(const QGSettings *appSettings, const QGSettings *activeAppSetti connect(m_itemEntryInter, &DockEntryInter::IsActiveChanged, this, static_cast(&AppItem::update)); connect(m_itemEntryInter, &DockEntryInter::WindowInfosChanged, this, &AppItem::updateWindowInfos, Qt::QueuedConnection); connect(m_itemEntryInter, &DockEntryInter::IconChanged, this, &AppItem::refreshIcon); +#ifdef USE_AM + connect(m_itemEntryInter, &DockEntryInter::ModeChanged, this, &AppItem::modeChanged); +#else connect(m_itemEntryInter, &DockEntryInter::IsDockedChanged, this, &AppItem::isDockChanged); - +#endif connect(m_updateIconGeometryTimer, &QTimer::timeout, this, &AppItem::updateWindowIconGeometries, Qt::QueuedConnection); connect(m_retryObtainIconTimer, &QTimer::timeout, this, &AppItem::refreshIcon, Qt::QueuedConnection); @@ -208,6 +211,13 @@ bool AppItem::splitWindowOnScreen(ScreenSpliter::SplitDirection direction) return m_screenSpliter->split(direction); } +#ifdef USE_AM +int AppItem::mode() const +{ + return m_itemEntryInter->mode(); +} +#endif + QString AppItem::accessibleName() { return m_itemEntryInter->name(); diff --git a/frame/item/appitem.h b/frame/item/appitem.h index e9d6b0c3c..0414a3499 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -76,7 +76,11 @@ signals: void dragReady(QWidget *dragWidget); void requestUpdateEntryGeometries() const; +#ifdef USE_AM + void modeChanged(int) const; +#else void isDockChanged(bool) const; +#endif private: void moveEvent(QMoveEvent *e) override; diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index d6b367983..cd7e78da7 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -99,7 +99,8 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_displayMode(Efficient) , m_tray(nullptr) , m_dockScreen(nullptr) - , m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, this)) + , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) + , m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, m_dockInter, this)) , m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolAreaWidget, this)) { initUI(); @@ -359,8 +360,11 @@ void MainPanelControl::dockRecentApp(DockItem *dockItem) if (!appItem) return; - // TODO 如果控制中心设置不开启最近应用,则不让其驻留 - + // 如果控制中心设置不开启最近应用,则不让其驻留 +#ifdef USE_AM + if (!m_dockInter->showRecent()) + return; +#endif // 如果控制中心开启了最近应用并且当前应用是未驻留应用,则可以驻留 if (!appItem->isDocked()) appItem->requestDock(); diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index c265af2ce..35c0bdd9f 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -23,6 +23,7 @@ #define MAINPANELCONTROL_H #include "constants.h" +#include "dbusutil.h" #include @@ -148,6 +149,7 @@ private: int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置 DockScreen *m_dockScreen; + DockInter *m_dockInter; RecentAppHelper *m_recentHelper; ToolAppHelper *m_toolHelper; }; From 56c3019a5c7262732110729ec13bbfd0fd1939b1 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 18 Aug 2022 15:41:46 +0000 Subject: [PATCH 073/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E5=A4=9A=E5=BC=80=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加窗口多开的窗口类,用于绘制应用图标和打开窗口的图标,根据实际情况让其显示到正确的位置 Log: 增加窗口多开的功能 Influence: 控制中心开启多开窗口显示,观察应用打开的窗口是否在对应的位置显示 Task: https://pms.uniontech.com/task-view-170977.html Change-Id: I96371b1304f5373f17dad95893ee656056e5f457 --- frame/controller/dockitemmanager.cpp | 146 ++++++++++++- frame/controller/dockitemmanager.h | 12 ++ frame/controller/multiwindowhelper.cpp | 154 +++++++++++++ frame/controller/multiwindowhelper.h | 58 +++++ frame/dbus/dockinterface.cpp | 5 + frame/dbus/dockinterface.h | 4 + frame/dbus/entryinterface.h | 7 + frame/item/appitem.cpp | 67 ++++-- frame/item/appitem.h | 7 +- frame/item/appmultiitem.cpp | 286 +++++++++++++++++++++++++ frame/item/appmultiitem.h | 74 +++++++ frame/item/dockitem.h | 3 +- frame/window/mainpanelcontrol.cpp | 152 +++++++++---- frame/window/mainpanelcontrol.h | 10 +- 14 files changed, 922 insertions(+), 63 deletions(-) create mode 100644 frame/controller/multiwindowhelper.cpp create mode 100644 frame/controller/multiwindowhelper.h create mode 100644 frame/item/appmultiitem.cpp create mode 100644 frame/item/appmultiitem.h diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index e31714dd2..c773fb16e 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -25,6 +25,7 @@ #include "pluginsitem.h" #include "traypluginitem.h" #include "utils.h" +#include "appmultiitem.h" #include #include @@ -47,16 +48,23 @@ DockItemManager::DockItemManager(QObject *parent) // 应用区域 for (auto entry : m_appInter->entries()) { - AppItem *it = new AppItem(m_appSettings, m_activeSettings, m_dockedSettings, entry); + AppItem *it = new AppItem(m_appInter, m_appSettings, m_activeSettings, m_dockedSettings, entry); manageItem(it); connect(it, &AppItem::requestActivateWindow, m_appInter, &DockInter::ActivateWindow, Qt::QueuedConnection); connect(it, &AppItem::requestPreviewWindow, m_appInter, &DockInter::PreviewWindow); connect(it, &AppItem::requestCancelPreview, m_appInter, &DockInter::CancelPreviewWindow); +#ifdef USE_AM + connect(it, &AppItem::windowCountChanged, this, &DockItemManager::onAppWindowCountChanged); +#endif + connect(this, &DockItemManager::requestUpdateDockItem, it, &AppItem::requestUpdateEntryGeometries); m_itemList.append(it); +#ifdef USE_AM + updateMultiItems(it); +#endif } // 托盘区域和插件区域 由DockPluginsController获取 @@ -65,6 +73,9 @@ DockItemManager::DockItemManager(QObject *parent) connect(m_appInter, &DockInter::EntryAdded, this, &DockItemManager::appItemAdded); connect(m_appInter, &DockInter::EntryRemoved, this, static_cast(&DockItemManager::appItemRemoved), Qt::QueuedConnection); connect(m_appInter, &DockInter::ServiceRestarted, this, &DockItemManager::reloadAppItems); +#ifdef USE_AM + connect(m_appInter, &DockInter::ShowMultiWindowChanged, this, &DockItemManager::onShowMultiWindowChanged); +#endif // 插件信号 connect(m_pluginsInter, &DockPluginsController::pluginItemInserted, this, &DockItemManager::pluginItemInserted, Qt::QueuedConnection); @@ -194,7 +205,7 @@ void DockItemManager::appItemAdded(const QDBusObjectPath &path, const int index) ++insertIndex; } - AppItem *item = new AppItem(m_appSettings, m_activeSettings, m_dockedSettings, path); + AppItem *item = new AppItem(m_appInter, m_appSettings, m_activeSettings, m_dockedSettings, path); if (m_appIDist.contains(item->appId())) { delete item; @@ -206,17 +217,24 @@ void DockItemManager::appItemAdded(const QDBusObjectPath &path, const int index) connect(item, &AppItem::requestActivateWindow, m_appInter, &DockInter::ActivateWindow, Qt::QueuedConnection); connect(item, &AppItem::requestPreviewWindow, m_appInter, &DockInter::PreviewWindow); connect(item, &AppItem::requestCancelPreview, m_appInter, &DockInter::CancelPreviewWindow); +#ifdef USE_AM + connect(item, &AppItem::windowCountChanged, this, &DockItemManager::onAppWindowCountChanged); +#endif connect(this, &DockItemManager::requestUpdateDockItem, item, &AppItem::requestUpdateEntryGeometries); m_itemList.insert(insertIndex, item); m_appIDist.append(item->appId()); - if (index != -1) { - emit itemInserted(insertIndex - 1, item); - return; - } + int itemIndex = insertIndex; + if (index != -1) + itemIndex = insertIndex - 1; - emit itemInserted(insertIndex, item); + // 插入dockItem + emit itemInserted(itemIndex, item); +#ifdef USE_AM + // 向后插入多开窗口 + updateMultiItems(item, true); +#endif } void DockItemManager::appItemRemoved(const QString &appId) @@ -299,9 +317,7 @@ void DockItemManager::pluginItemInserted(PluginsItem *item) m_itemList.insert(insertIndex, item); if(pluginType == DockItem::FixedPlugin) - { insertIndex ++; - } if (!Utils::SettingValue(QString("com.deepin.dde.dock.module.") + item->pluginName(), QByteArray(), "enable", true).toBool()) item->setVisible(false); @@ -345,3 +361,115 @@ void DockItemManager::onPluginLoadFinished() updatePluginsItemOrderKey(); m_loadFinished = true; } + +#ifdef USE_AM +void DockItemManager::onAppWindowCountChanged() +{ + AppItem *appItem = static_cast(sender()); + updateMultiItems(appItem, true); +} + +void DockItemManager::updateMultiItems(AppItem *appItem, bool emitSignal) +{ + // 如果系统设置不开启应用多窗口拆分,则无需之后的操作 + if (!m_appInter->showMultiWindow()) + return; + + // 如果开启了多窗口拆分,则同步窗口和多窗口应用的信息 + const WindowInfoMap &windowInfoMap = appItem->windowsMap(); + QList removeItems; + // 同步当前已经存在的多开窗口的列表,删除不存在的多开窗口 + for (int i = 0; i < m_itemList.size(); i++) { + QPointer dockItem = m_itemList[i]; + AppMultiItem *multiItem = qobject_cast(dockItem.data()); + if (!multiItem || multiItem->appItem() != appItem) + continue; + + // 如果查找到的当前的应用的窗口不需要移除,则继续下一个循环 + if (!needRemoveMultiWindow(multiItem)) + continue; + + removeItems << multiItem; + } + // 从itemList中移除多开窗口 + for (AppMultiItem *dockItem : removeItems) + m_itemList.removeOne(dockItem); + if (emitSignal) { + // 移除发送每个多开窗口的移除信号 + for (AppMultiItem *dockItem : removeItems) + Q_EMIT itemRemoved(dockItem); + } + qDeleteAll(removeItems); + + // 遍历当前APP打开的所有窗口的列表,如果不存在多开窗口的应用,则新增,同时发送信号 + for (auto it = windowInfoMap.begin(); it != windowInfoMap.end(); it++) { + if (multiWindowExist(it.key())) + continue; + + const WindowInfo &windowInfo = it.value(); + // 如果不存在这个窗口对应的多开窗口,则新建一个窗口,同时发送窗口新增的信号 + AppMultiItem *multiItem = new AppMultiItem(appItem, it.key(), windowInfo); + m_itemList << multiItem; + if (emitSignal) + Q_EMIT itemInserted(-1, multiItem); + } +} + +// 检查对应的窗口是否存在多开窗口 +bool DockItemManager::multiWindowExist(quint32 winId) const +{ + for (QPointer dockItem : m_itemList) { + AppMultiItem *multiItem = qobject_cast(dockItem.data()); + if (!multiItem) + continue; + + if (multiItem->winId() == winId) + return true; + } + + return false; +} + +// 检查当前多开窗口是否需要移除 +// 如果当前多开窗口图标对应的窗口在这个窗口所属的APP中所有打开窗口中不存在,那么则认为该多窗口已经被关闭 +bool DockItemManager::needRemoveMultiWindow(AppMultiItem *multiItem) const +{ + // 查找多分窗口对应的窗口在应用所有的打开的窗口中是否存在,只要它对应的窗口存在,就无需删除 + // 只要不存在,就需要删除 + AppItem *appItem = multiItem->appItem(); + const WindowInfoMap &windowInfoMap = appItem->windowsMap(); + for (auto it = windowInfoMap.begin(); it != windowInfoMap.end(); it++) { + if (it.key() == multiItem->winId()) + return false; + } + + return true; +} + +void DockItemManager::onShowMultiWindowChanged() +{ + if (m_appInter->showMultiWindow()) { + // 如果当前设置支持窗口多开,那么就依次对每个APPItem加载多开窗口 + for (const QPointer &dockItem : m_itemList) { + if (dockItem->itemType() != DockItem::ItemType::App) + continue; + + updateMultiItems(static_cast(dockItem.data()), true); + } + } else { + // 如果当前设置不支持窗口多开,则删除所有的多开窗口 + QList multiWindows; + for (const QPointer &dockItem : m_itemList) { + if (dockItem->itemType() != DockItem::AppMultiWindow) + continue; + + multiWindows << dockItem.data(); + } + for (DockItem *multiItem : multiWindows) { + m_itemList.removeOne(multiItem); + Q_EMIT itemRemoved(multiItem); + multiItem->deleteLater(); + } + } +} +#endif diff --git a/frame/controller/dockitemmanager.h b/frame/controller/dockitemmanager.h index 0887bd9e9..961229b47 100644 --- a/frame/controller/dockitemmanager.h +++ b/frame/controller/dockitemmanager.h @@ -31,6 +31,7 @@ #include +class AppMultiItem; /** * @brief The DockItemManager class * 管理类,管理所有的应用数据,插件数据 @@ -64,6 +65,11 @@ public slots: private Q_SLOTS: void onPluginLoadFinished(); +#ifdef USE_AM + void onAppWindowCountChanged(); + void onShowMultiWindowChanged(); +#endif + private: explicit DockItemManager(QObject *parent = nullptr); void appItemAdded(const QDBusObjectPath &path, const int index); @@ -75,6 +81,12 @@ private: void reloadAppItems(); void manageItem(DockItem *item); +#ifdef USE_AM + void updateMultiItems(AppItem *appItem, bool emitSignal = false); + bool multiWindowExist(quint32 winId) const; + bool needRemoveMultiWindow(AppMultiItem *multiItem) const; +#endif + private: DockInter *m_appInter; DockPluginsController *m_pluginsInter; diff --git a/frame/controller/multiwindowhelper.cpp b/frame/controller/multiwindowhelper.cpp new file mode 100644 index 000000000..953389a53 --- /dev/null +++ b/frame/controller/multiwindowhelper.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "multiwindowhelper.h" +#include "appmultiitem.h" +#include "appitem.h" + +MultiWindowHelper::MultiWindowHelper(QWidget *appWidget, QWidget *multiWindowWidget, QObject *parent) + : QObject(parent) + , m_appWidget(appWidget) + , m_multiWindowWidget(multiWindowWidget) + , m_displayMode(Dock::DisplayMode::Efficient) +{ + m_appWidget->installEventFilter(this); + m_multiWindowWidget->installEventFilter(this); +} + +void MultiWindowHelper::setDisplayMode(Dock::DisplayMode displayMode) +{ + if (m_displayMode == displayMode) + return; + + m_displayMode = displayMode; + resetMultiItemPosition(); +} + +void MultiWindowHelper::addMultiWindow(int, AppMultiItem *item) +{ + int index = itemIndex(item); + if (m_displayMode == Dock::DisplayMode::Efficient) { + // 将多开窗口项目插入到对应的APP的后面 + insertChildWidget(m_appWidget, index, item); + } else { + // 将多开窗口插入到工具区域的前面 + insertChildWidget(m_multiWindowWidget, index, item); + } +} + +void MultiWindowHelper::removeMultiWindow(AppMultiItem *item) +{ + if (m_appWidget->children().contains(item)) + m_appWidget->layout()->removeWidget(item); + else + m_multiWindowWidget->layout()->removeWidget(item); +} + +bool MultiWindowHelper::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_appWidget || watched == m_multiWindowWidget) { + switch(event->type()) { + case QEvent::ChildAdded: + case QEvent::ChildRemoved: { + /* 这里用异步的方式,因为收到QEvent::ChildAdded信号的时候, + 此时应用还没有插入到Widget中,收到QEvent::ChildRemoved信号的时候, + 此时应用还未从任务栏上移除,通过异步的方式保证同步新增或移除成功后才执行,这样更新的界面才是最准确的 + */ + QMetaObject::invokeMethod(this, &MultiWindowHelper::requestUpdate, Qt::QueuedConnection); + break; + } + default: + break; + } + } + + return QObject::eventFilter(watched, event); +} + +int MultiWindowHelper::itemIndex(AppMultiItem *item) +{ + if (m_displayMode != Dock::DisplayMode::Efficient) + return -1; + + // 高效模式,查找对应的应用或者这个应用所有的子窗口所在的位置,然后插入到最大的值的后面 + int lastIndex = -1; + for (int i = 0; i < m_appWidget->layout()->count(); i++) { + DockItem *dockItem = qobject_cast(m_appWidget->layout()->itemAt(i)->widget()); + if (!dockItem) + continue; + + if (dockItem != item->appItem()) { + AppMultiItem *multiItem = qobject_cast(dockItem); + if (!multiItem || multiItem->appItem() != item->appItem()) + continue; + } + + lastIndex = i; + } + + if (lastIndex >= 0) + return ++lastIndex; + + return -1; +} + +void MultiWindowHelper::insertChildWidget(QWidget *parentWidget, int index, AppMultiItem *item) +{ + QBoxLayout *layout = static_cast(parentWidget->layout()); + if (index >= 0) + layout->insertWidget(index, item); + else + layout->addWidget(item); +} + +void MultiWindowHelper::resetMultiItemPosition() +{ + QWidget *fromWidget = nullptr; + QWidget *toWidget = nullptr; + + if (m_displayMode == Dock::DisplayMode::Efficient) { + // 从时尚模式变换为高效模式 + fromWidget = m_multiWindowWidget; + toWidget = m_appWidget; + } else { + // 从高效模式变换到时尚模式 + fromWidget = m_appWidget; + toWidget = m_multiWindowWidget; + } + + QList moveWidgetItem; + for (int i = 0; i < fromWidget->layout()->count(); i++) { + AppMultiItem *multiItem = qobject_cast(fromWidget->layout()->itemAt(i)->widget()); + if (!multiItem) + continue; + + moveWidgetItem << multiItem; + } + + QBoxLayout *toLayout = static_cast(toWidget->layout()); + for (AppMultiItem *item : moveWidgetItem) { + fromWidget->layout()->removeWidget(item); + int index = itemIndex(item); + if (index >= 0) + toLayout->insertWidget(index, item); + else + toLayout->addWidget(item); + } +} diff --git a/frame/controller/multiwindowhelper.h b/frame/controller/multiwindowhelper.h new file mode 100644 index 000000000..b13fc8b7e --- /dev/null +++ b/frame/controller/multiwindowhelper.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef MULTIWINDOWHELPER_H +#define MULTIWINDOWHELPER_H + +#include "constants.h" + +#include + +class AppMultiItem; + +class MultiWindowHelper : public QObject +{ + Q_OBJECT + +public: + explicit MultiWindowHelper(QWidget *appWidget, QWidget *multiWindowWidget, QObject *parent = nullptr); + + void setDisplayMode(Dock::DisplayMode displayMode); + void addMultiWindow(int, AppMultiItem *item); + void removeMultiWindow(AppMultiItem *item); + +Q_SIGNALS: + void requestUpdate(); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + +private: + int itemIndex(AppMultiItem *item); + void insertChildWidget(QWidget *parentWidget, int index, AppMultiItem *item); + void resetMultiItemPosition(); + +private: + QWidget *m_appWidget; + QWidget *m_multiWindowWidget; + Dock::DisplayMode m_displayMode; +}; + +#endif // MULTIWINDOWHELPER_H diff --git a/frame/dbus/dockinterface.cpp b/frame/dbus/dockinterface.cpp index dfdb7b98b..f2f222920 100644 --- a/frame/dbus/dockinterface.cpp +++ b/frame/dbus/dockinterface.cpp @@ -328,6 +328,11 @@ bool Dde_Dock::showRecent() const return qvariant_cast(property("ShowRecent")); } +bool Dde_Dock::showMultiWindow() const +{ + return qvariant_cast(property("ShowMultiWindow")); +} + QDBusPendingReply<> Dde_Dock::ActivateWindow(uint in0) { return m_wm->ActivateWindow(in0); diff --git a/frame/dbus/dockinterface.h b/frame/dbus/dockinterface.h index 5f04ccd3c..70aaf9bee 100644 --- a/frame/dbus/dockinterface.h +++ b/frame/dbus/dockinterface.h @@ -128,6 +128,9 @@ public: Q_PROPERTY(bool ShowRecent READ showRecent NOTIFY showRecentChanged) bool showRecent() const; + Q_PROPERTY(bool ShowMultiWindow READ showMultiWindow NOTIFY ShowMultiWindowChanged) + bool showMultiWindow() const; + public Q_SLOTS: // METHODS QDBusPendingReply<> ActivateWindow(uint in0); @@ -326,6 +329,7 @@ Q_SIGNALS: // SIGNALS void WindowSizeEfficientChanged(uint value) const; void WindowSizeFashionChanged(uint value) const; void showRecentChanged(bool) const; + void ShowMultiWindowChanged(bool) const; public Q_SLOTS: void CallQueued(const QString &callName, const QList &args); diff --git a/frame/dbus/entryinterface.h b/frame/dbus/entryinterface.h index cc9ad3ccf..08f81640c 100644 --- a/frame/dbus/entryinterface.h +++ b/frame/dbus/entryinterface.h @@ -145,6 +145,13 @@ public Q_SLOTS: // METHODS return asyncCallWithArgumentList(QStringLiteral("ForceQuit"), argumentList); } + inline QDBusPendingReply<> ActiveWindow(quint32 in0) + { + QList argumentList; + argumentList << in0; + return asyncCallWithArgumentList(QStringLiteral("ActiveWindow"), argumentList); + } + inline void ForceQuitQueued() { QList argumentList; diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index b02a97e8f..f6775bce8 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -50,7 +50,7 @@ DCORE_USE_NAMESPACE QPoint AppItem::MousePressPos; -AppItem::AppItem(const QGSettings *appSettings, const QGSettings *activeAppSettings, const QGSettings *dockedAppSettings, const QDBusObjectPath &entry, QWidget *parent) +AppItem::AppItem(DockInter *dockInter, const QGSettings *appSettings, const QGSettings *activeAppSettings, const QGSettings *dockedAppSettings, const QDBusObjectPath &entry, QWidget *parent) : DockItem(parent) , m_appSettings(appSettings) , m_activeAppSettings(activeAppSettings) @@ -72,6 +72,7 @@ AppItem::AppItem(const QGSettings *appSettings, const QGSettings *activeAppSetti , m_themeType(DGuiApplicationHelper::instance()->themeType()) , m_createMSecs(QDateTime::currentMSecsSinceEpoch()) , m_screenSpliter(ScreenSpliterFactory::createScreenSpliter(this, m_itemEntryInter)) + , m_dockInter(dockInter) { QHBoxLayout *centralLayout = new QHBoxLayout; centralLayout->setMargin(0); @@ -135,6 +136,11 @@ const QString AppItem::appId() const return m_id; } +QString AppItem::name() const +{ + return m_itemEntryInter->name(); +} + bool AppItem::isValid() const { return m_itemEntryInter->isValid() && !m_itemEntryInter->id().isEmpty(); @@ -216,8 +222,14 @@ int AppItem::mode() const { return m_itemEntryInter->mode(); } + #endif +DockEntryInter *AppItem::itemEntryInter() const +{ + return m_itemEntryInter; +} + QString AppItem::accessibleName() { return m_itemEntryInter->name(); @@ -243,6 +255,11 @@ void AppItem::updateMSecs() m_createMSecs = QDateTime::currentMSecsSinceEpoch(); } +const WindowInfoMap &AppItem::windowsMap() const +{ + return m_windowInfos; +} + void AppItem::moveEvent(QMoveEvent *e) { DockItem::moveEvent(e); @@ -281,14 +298,26 @@ void AppItem::paintEvent(QPaintEvent *e) QPainterPath path; path.addRoundedRect(backgroundRect, 8, 8); - if (m_active) { - painter.fillPath(path, QColor(0, 0, 0, 255 * 0.8)); - } else if (!m_windowInfos.isEmpty()) { - if (hasAttention()) - painter.fillPath(path, QColor(241, 138, 46, 255 * .8)); - else - painter.fillPath(path, QColor(0, 0, 0, 255 * 0.3)); + // 在没有开启窗口多开的情况下,显示背景色 +#ifdef USE_AM + if (!m_dockInter->showMultiWindow()) { +#endif + if (m_active) { + QColor color = Qt::black; + color.setAlpha(255 * 0.8); + painter.fillPath(path, color); + } else if (!m_windowInfos.isEmpty()) { + if (hasAttention()) { + painter.fillPath(path, QColor(241, 138, 46, 255 * .8)); + } else { + QColor color = Qt::black; + color.setAlpha(255 * 0.3); + painter.fillPath(path, color); + } + } +#ifdef USE_AM } +#endif } else { if (!m_windowInfos.isEmpty()) { QPoint p; @@ -381,12 +410,21 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e) qDebug() << "app item clicked, name:" << m_itemEntryInter->name() << "id:" << m_itemEntryInter->id() << "my-id:" << m_id << "icon:" << m_itemEntryInter->icon(); - m_itemEntryInter->Activate(QX11Info::getTimestamp()); - - // play launch effect - if (m_windowInfos.isEmpty() && DGuiApplicationHelper::isSpecialEffectsEnvironment()) - playSwingEffect(); +#ifdef USE_AM + if (m_dockInter->showMultiWindow()) { + // 如果开启了多窗口显示,则直接新建一个窗口 + m_itemEntryInter->NewInstance(QX11Info::getTimestamp()); + } else { +#endif + // 如果没有开启新窗口显示,则 + m_itemEntryInter->Activate(QX11Info::getTimestamp()); + // play launch effect + if (m_windowInfos.isEmpty() && DGuiApplicationHelper::isSpecialEffectsEnvironment()) + playSwingEffect(); + } +#ifdef USE_AM } +#endif } void AppItem::mousePressEvent(QMouseEvent *e) @@ -640,6 +678,9 @@ void AppItem::updateWindowInfos(const WindowInfoMap &info) } update(); + + // 通知外面窗体数量发生变化,需要更新多开窗口的信息 + Q_EMIT windowCountChanged(); } void AppItem::refreshIcon() diff --git a/frame/item/appitem.h b/frame/item/appitem.h index 0414a3499..afa9ae9c9 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -43,11 +43,12 @@ class AppItem : public DockItem Q_OBJECT public: - explicit AppItem(const QGSettings *appSettings, const QGSettings *activeAppSettings, const QGSettings *dockedAppSettings, const QDBusObjectPath &entry, QWidget *parent = nullptr); + explicit AppItem(DockInter *dockInter, const QGSettings *appSettings, const QGSettings *activeAppSettings, const QGSettings *dockedAppSettings, const QDBusObjectPath &entry, QWidget *parent = nullptr); ~AppItem() override; void checkEntry() override; const QString appId() const; + QString name() const; bool isValid() const; void updateWindowIconGeometries(); void undock(); @@ -61,6 +62,7 @@ public: #ifdef USE_AM int mode() const; #endif + DockEntryInter *itemEntryInter() const; inline ItemType itemType() const override { return App; } QPixmap appIcon(){ return m_appIcon; } virtual QString accessibleName() override; @@ -68,6 +70,7 @@ public: bool isDocked() const; qint64 appOpenMSecs() const; void updateMSecs(); + const WindowInfoMap &windowsMap() const; signals: void requestActivateWindow(const WId wid) const; @@ -76,6 +79,7 @@ signals: void dragReady(QWidget *dragWidget); void requestUpdateEntryGeometries() const; + void windowCountChanged() const; #ifdef USE_AM void modeChanged(int) const; #else @@ -161,6 +165,7 @@ private: static QPoint MousePressPos; ScreenSpliter *m_screenSpliter; + DockInter *m_dockInter; }; #endif // APPITEM_H diff --git a/frame/item/appmultiitem.cpp b/frame/item/appmultiitem.cpp new file mode 100644 index 000000000..02f89f79b --- /dev/null +++ b/frame/item/appmultiitem.cpp @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "appitem.h" +#include "appmultiitem.h" +#include "imageutil.h" +#include "themeappicon.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +struct SHMInfo { + long shmid; + long width; + long height; + long bytesPerLine; + long format; + + struct Rect { + long x; + long y; + long width; + long height; + } rect; +}; + +AppMultiItem::AppMultiItem(AppItem *appItem, WId winId, const WindowInfo &windowInfo, QWidget *parent) + : DockItem(parent) + , m_appItem(appItem) + , m_windowInfo(windowInfo) + , m_entryInter(appItem->itemEntryInter()) + , m_winId(winId) + , m_menu(new QMenu(this)) +{ + initMenu(); + initConnection(); +} + +AppMultiItem::~AppMultiItem() +{ +} + +QSize AppMultiItem::suitableSize(int size) const +{ + return QSize(size, size); +} + +AppItem *AppMultiItem::appItem() const +{ + return m_appItem; +} + +quint32 AppMultiItem::winId() const +{ + return m_winId; +} + +const WindowInfo &AppMultiItem::windowInfo() const +{ + return m_windowInfo; +} + +DockItem::ItemType AppMultiItem::itemType() const +{ + return DockItem::AppMultiWindow; +} + +bool AppMultiItem::isKWinAvailable() const +{ + if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.kde.KWin"))) { + QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Effects"), QStringLiteral("org.kde.kwin.Effects")); + QDBusReply reply = interface.call(QStringLiteral("isEffectLoaded"), "screenshot"); + + return reply.value(); + } + return false; +} + +QImage AppMultiItem::snapImage() const +{ + // 优先使用窗管进行窗口截图 + if (isKWinAvailable()) { + QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Screenshot"), QStringLiteral("org.kde.kwin.Screenshot")); + + QList args; + args << QVariant::fromValue(m_winId); + args << QVariant::fromValue(quint32(width() - 20)); + args << QVariant::fromValue(quint32(height() - 20)); + + QImage image; + QDBusReply reply = interface.callWithArgumentList(QDBus::Block, QStringLiteral("screenshotForWindowExtend"), args); + if(reply.isValid()){ + const QString tmpFile = reply.value(); + if (QFile::exists(tmpFile)) { + image.load(tmpFile); + qDebug() << "reply: " << tmpFile; + QFile::remove(tmpFile); + } else { + qDebug() << "get current workspace bckground error, file does not exist : " << tmpFile; + } + } else { + qDebug() << "get current workspace bckground error: "<< reply.error().message(); + } + return image; + } + + // get window image from shm(only for deepin app) + SHMInfo *info = getImageDSHM(); + QImage image; + uchar *image_data = 0; + if (info) { + qDebug() << "get Image from dxcbplugin SHM..."; + image_data = (uchar *)shmat(info->shmid, 0, 0); + if ((qint64)image_data != -1) + return QImage(image_data, info->width, info->height, info->bytesPerLine, (QImage::Format)info->format); + + qDebug() << "invalid pointer of shm!"; + image_data = nullptr; + } + + QImage qimage; + XImage *ximage; + if (!image_data || qimage.isNull()) { + ximage = getImageXlib(); + if (!ximage) + return QImage(); + + qimage = QImage((const uchar *)(ximage->data), ximage->width, ximage->height, ximage->bytes_per_line, QImage::Format_RGB32); + } + + return image; +} + +SHMInfo *AppMultiItem::getImageDSHM() const +{ + const auto display = Utils::IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display(); + if (!display) { + qWarning() << "Error: get display failed!"; + return nullptr; + } + + Atom atom_prop = XInternAtom(display, "_DEEPIN_DXCB_SHM_INFO", true); + if (!atom_prop) { + return nullptr; + } + + Atom actual_type_return_deepin_shm; + int actual_format_return_deepin_shm; + unsigned long nitems_return_deepin_shm; + unsigned long bytes_after_return_deepin_shm; + unsigned char *prop_return_deepin_shm; + + XGetWindowProperty(display, m_winId, atom_prop, 0, 32 * 9, false, AnyPropertyType, + &actual_type_return_deepin_shm, &actual_format_return_deepin_shm, &nitems_return_deepin_shm, + &bytes_after_return_deepin_shm, &prop_return_deepin_shm); + + return reinterpret_cast(prop_return_deepin_shm); +} + +XImage *AppMultiItem::getImageXlib() const +{ + const auto display = Utils::IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display(); + if (!display) { + qWarning() << "Error: get display failed!"; + return nullptr; + } + + Window unused_window; + int unused_int; + unsigned unused_uint, w, h; + XGetGeometry(display, m_winId, &unused_window, &unused_int, &unused_int, &w, &h, &unused_uint, &unused_uint); + return XGetImage(display, m_winId, 0, 0, w, h, AllPlanes, ZPixmap); +} + +void AppMultiItem::initMenu() +{ + QAction *actionOpen = new QAction(m_menu); + actionOpen->setText(tr("Open")); + connect(actionOpen, &QAction::triggered, this, &AppMultiItem::onOpen); + m_menu->addAction(actionOpen); +} + +void AppMultiItem::initConnection() +{ + connect(m_entryInter, &DockEntryInter::CurrentWindowChanged, this, &AppMultiItem::onCurrentWindowChanged); +} + +void AppMultiItem::onOpen() +{ +#ifdef USE_AM + m_entryInter->ActiveWindow(m_winId); +#endif +} + +void AppMultiItem::onCurrentWindowChanged(uint32_t value) +{ + if (value != m_winId) + return; + + update(); +} + +void AppMultiItem::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing, true); + painter.setRenderHint(QPainter::SmoothPixmapTransform, true); + + if (m_snapImage.isNull()) { + m_snapImage = snapImage(); + } + + DStyleHelper dstyle(style()); + const int radius = dstyle.pixelMetric(DStyle::PM_FrameRadius); + QRect itemRect = rect(); + itemRect.marginsRemoved(QMargins(6, 6, 6, 6)); + QPixmap pixmapWindowIcon = QPixmap::fromImage(m_snapImage); + QPainterPath path; + path.addRoundedRect(rect(), radius, radius); + painter.fillPath(path, Qt::transparent); + + if (m_entryInter->currentWindow() == m_winId) { + QColor backColor = Qt::black; + backColor.setAlpha(255 * 0.8); + painter.fillPath(path, backColor); + } + + itemRect = m_snapImage.rect(); + int itemWidth = itemRect.width(); + int itemHeight = itemRect.height(); + int x = (rect().width() - itemWidth) / 2; + int y = (rect().height() - itemHeight) / 2; + painter.drawPixmap(QRect(x, y, itemWidth, itemHeight), pixmapWindowIcon); + + QPixmap pixmapAppIcon; + ThemeAppIcon::getIcon(pixmapAppIcon, m_entryInter->icon(), qMin(width(), height()) * 0.8); + if (!pixmapAppIcon.isNull()) { + // 绘制下方的图标,下方的小图标大约为应用图标的三分之一的大小 + //pixmap = pixmap.scaled(pixmap.width() * 0.3, pixmap.height() * 0.3); + QRect rectIcon = rect(); + int iconWidth = rectIcon.width() * 0.3; + int iconHeight = rectIcon.height() * 0.3; + rectIcon.setX((rect().width() - iconWidth) * 0.5); + rectIcon.setY(rect().height() - iconHeight); + rectIcon.setWidth(iconWidth); + rectIcon.setHeight(iconHeight); + painter.drawPixmap(rectIcon, pixmapAppIcon); + } +} + +void AppMultiItem::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { +#ifdef USE_AM + m_entryInter->ActiveWindow(m_winId); +#endif + } else { + QPoint currentPoint = QCursor::pos(); + m_menu->exec(currentPoint); + } +} diff --git a/frame/item/appmultiitem.h b/frame/item/appmultiitem.h new file mode 100644 index 000000000..36e261a89 --- /dev/null +++ b/frame/item/appmultiitem.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef APPMULTIITEM_H +#define APPMULTIITEM_H + +#include "dockitem.h" +#include "dbusutil.h" + +struct SHMInfo; +struct _XImage; +typedef _XImage XImage; +class AppItem; + +class AppMultiItem : public DockItem +{ + Q_OBJECT + + friend class AppItem; + +public: + AppMultiItem(AppItem *appItem, WId winId, const WindowInfo &windowInfo, QWidget *parent = Q_NULLPTR); + ~AppMultiItem() override; + + QSize suitableSize(int size) const; + AppItem *appItem() const; + quint32 winId() const; + const WindowInfo &windowInfo() const; + + ItemType itemType() const override; + +protected: + void paintEvent(QPaintEvent *) override; + void mouseReleaseEvent(QMouseEvent *event) override; + +private: + bool isKWinAvailable() const; + QImage snapImage() const; + SHMInfo *getImageDSHM() const; + XImage *getImageXlib() const; + void initMenu(); + void initConnection(); + +private Q_SLOTS: + void onOpen(); + void onCurrentWindowChanged(uint32_t value); + +private: + AppItem *m_appItem; + WindowInfo m_windowInfo; + DockEntryInter *m_entryInter; + QImage m_snapImage; + WId m_winId; + QMenu *m_menu; +}; + +#endif // APPMULTIITEM_H diff --git a/frame/item/dockitem.h b/frame/item/dockitem.h index 922a9c38c..22b3badf4 100644 --- a/frame/item/dockitem.h +++ b/frame/item/dockitem.h @@ -48,7 +48,8 @@ public: Placeholder, TrayPlugin, // 托盘插件 QuickSettingPlugin, // 快捷设置区域插件 - StretchPlugin // 时尚模式下的固定在最右侧的插件,例如开关机插件 + StretchPlugin, // 时尚模式下的固定在最右侧的插件,例如开关机插件 + AppMultiWindow // APP的多开应用的窗口 }; public: diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index cd7e78da7..b67544204 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -36,6 +36,10 @@ #include "displaymanager.h" #include "recentapphelper.h" #include "toolapphelper.h" +#include "multiwindowhelper.h" +#include "mainwindow.h" +#include "appmultiitem.h" +#include "multiwindowhelper.h" #include #include @@ -89,7 +93,11 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_recentLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_recentSpliter(new QLabel(this)) , m_toolAreaWidget(new QWidget(this)) - , m_toolLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_toolAreaWidget)) + , m_toolAreaLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_toolAreaWidget)) + , m_multiWindowWidget(new QWidget(m_toolAreaWidget)) + , m_multiWindowLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_multiWindowWidget)) + , m_toolSonAreaWidget(new QWidget(m_toolAreaWidget)) + , m_toolSonLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_toolSonAreaWidget)) , m_trayManagerWidget(new TrayManagerWindow(this)) , m_pluginLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_desktopWidget(new DesktopWidget(this)) @@ -102,6 +110,7 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) , m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, m_dockInter, this)) , m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolAreaWidget, this)) + , m_multiHelper(new MultiWindowHelper(m_appAreaSonWidget, m_multiWindowWidget, this)) { initUI(); initConnection(); @@ -158,12 +167,27 @@ void MainPanelControl::initUI() m_mainPanelLayout->addWidget(m_recentSpliter); /* 工具应用 */ - m_toolAreaWidget->setObjectName("toolarea"); - m_toolAreaWidget->setAccessibleName("toolarea"); - m_toolAreaWidget->setLayout(m_toolLayout); - m_toolLayout->setSpacing(0); - m_toolLayout->setContentsMargins(0, 0, 0, 0); + // 包含窗口多开和工具组合 + m_toolAreaWidget->setObjectName("toolArea"); + m_toolAreaWidget->setAccessibleName("toolArea"); + m_toolAreaWidget->setLayout(m_toolAreaLayout); + m_toolAreaLayout->setContentsMargins(0, 0, 0, 0); + m_toolAreaLayout->setSpacing(0); m_mainPanelLayout->addWidget(m_toolAreaWidget); + // 多开窗口区域 + m_multiWindowWidget->setObjectName("multiWindow"); + m_multiWindowWidget->setAccessibleName("multiWindow"); + m_multiWindowWidget->setLayout(m_multiWindowLayout); + m_multiWindowLayout->setContentsMargins(0, 2, 0, 2); + m_multiWindowLayout->setSpacing(0); + m_toolAreaLayout->addWidget(m_multiWindowWidget); + // 工具应用区域-包含打开窗口区域和回收站区域 + m_toolSonAreaWidget->setObjectName("toolsonarea"); + m_toolSonAreaWidget->setAccessibleName("toolsonarea"); + m_toolSonAreaWidget->setLayout(m_toolSonLayout); + m_toolSonLayout->setSpacing(0); + m_toolSonLayout->setContentsMargins(0, 0, 0, 0); + m_toolAreaLayout->addWidget(m_toolSonAreaWidget); /* 托盘区域 */ m_trayAreaWidget->setObjectName("trayarea"); @@ -206,6 +230,7 @@ void MainPanelControl::initConnection() connect(m_recentHelper, &RecentAppHelper::dockAppVisibleChanged, this, &MainPanelControl::onDockAppVisibleChanged); connect(m_toolHelper, &ToolAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate); connect(m_toolHelper, &ToolAppHelper::toolVisibleChanged, this, &MainPanelControl::onToolVisibleChanged); + connect(m_multiHelper, &MultiWindowHelper::requestUpdate, this, &MainPanelControl::requestUpdate); } /** @@ -220,6 +245,7 @@ void MainPanelControl::setDisplayMode(DisplayMode dislayMode) m_displayMode = dislayMode; m_recentHelper->setDisplayMode(dislayMode); m_toolHelper->setDisplayMode(dislayMode); + m_multiHelper->setDisplayMode(dislayMode); updateDisplayMode(); } @@ -244,6 +270,7 @@ void MainPanelControl::updateMainPanelLayout() m_recentLayout->setDirection(QBoxLayout::LeftToRight); m_trayAreaLayout->setContentsMargins(0, 10, 0, 10); m_pluginLayout->setContentsMargins(10, 0, 10, 0); + m_multiWindowLayout->setContentsMargins(0, 2, 0, 2); break; case Position::Right: case Position::Left: @@ -260,6 +287,7 @@ void MainPanelControl::updateMainPanelLayout() m_recentLayout->setDirection(QBoxLayout::TopToBottom); m_trayAreaLayout->setContentsMargins(10, 0, 10, 0); m_pluginLayout->setContentsMargins(0, 10, 0, 10); + m_multiWindowLayout->setContentsMargins(2, 0, 2, 0); break; } @@ -379,12 +407,12 @@ void MainPanelControl::updateAppAreaSonWidgetSize() m_appAreaSonWidget->setMaximumHeight(height()); m_appAreaSonWidget->setMaximumWidth(m_appAreaWidget->width()); m_recentAreaWidget->setFixedHeight(height()); - m_toolAreaWidget->setFixedHeight(height()); + //m_toolAreaWidget->setFixedHeight(height()); } else { m_appAreaSonWidget->setMaximumWidth(width()); m_appAreaSonWidget->setMaximumHeight(m_appAreaWidget->height()); m_recentAreaWidget->setFixedWidth(width()); - m_toolAreaWidget->setFixedWidth(width()); + //m_toolAreaWidget->setFixedWidth(width()); } m_appAreaSonWidget->adjustSize(); @@ -434,10 +462,13 @@ void MainPanelControl::insertItem(int index, DockItem *item) addTrayAreaItem(index, item); break; case DockItem::Plugins: - //addPluginAreaItem(index, item); m_toolHelper->addPluginItem(index, item); break; - default: break; + case DockItem::AppMultiWindow: + m_multiHelper->addMultiWindow(index, static_cast(item)); + break; + default: + break; } // 同removeItem处 注意:不能屏蔽此接口,否则会造成插件插入时无法显示 @@ -469,7 +500,11 @@ void MainPanelControl::removeItem(DockItem *item) case DockItem::Plugins: m_toolHelper->removePluginItem(item); break; - default: break; + case DockItem::AppMultiWindow: + m_multiHelper->removeMultiWindow(static_cast(item)); + break; + default: + break; } item->removeEventFilter(this); @@ -954,7 +989,7 @@ void MainPanelControl::updateModeChange() m_trayAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); m_traySpliter->setVisible(m_displayMode == DisplayMode::Efficient); m_pluginAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); - m_trayManagerWidget->setVisible(m_displayMode != DisplayMode::Efficient); + m_toolAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion); onRecentVisibleChanged(m_recentHelper->recentIsVisible()); onDockAppVisibleChanged(m_recentHelper->dockAppIsVisible()); onToolVisibleChanged(m_toolHelper->toolIsVisible()); @@ -969,20 +1004,11 @@ void MainPanelControl::moveAppSonWidget() { QRect rect(QPoint(0, 0), m_appAreaSonWidget->size()); if (DisplayMode::Efficient == m_displayMode) { - switch (m_position) { - case Top: - case Bottom : - rect.moveTo(m_appAreaWidget->pos()); - break; - case Right: - case Left: - rect.moveTo(m_appAreaWidget->pos()); - break; - } + rect.moveTo(m_appAreaWidget->pos()); } else { switch (m_position) { case Top: - case Bottom : + case Bottom: rect.moveCenter(this->rect().center()); if (rect.right() > m_appAreaWidget->geometry().right()) { rect.moveRight(m_appAreaWidget->geometry().right()); @@ -1041,7 +1067,7 @@ QPainterPath MainPanelControl::areaPath() if (m_recentLayout->count() > 0) leftWidth += m_recentAreaWidget->width(); - if (m_toolLayout->count() > 0) + if (m_toolAreaLayout->count() > 0) leftWidth += m_toolAreaWidget->width(); int roundHeight = height(); @@ -1053,7 +1079,7 @@ QPainterPath MainPanelControl::areaPath() if (m_recentLayout->count() > 0) topHeight += m_recentAreaWidget->height(); - if (m_toolLayout->count() > 0) + if (m_toolAreaLayout->count() > 0) topHeight += m_toolAreaWidget->height(); path.addRoundedRect(QRect(0, 0, roundWidth, topHeight), radius, radius); @@ -1086,7 +1112,7 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const // 减去右侧托盘和快捷设置还有插件区域的尺寸 totalLength -= (((m_position == Position::Top || m_position == Position::Bottom) ? traySuitableSize.width() : traySuitableSize.height()) / ratio); // 需要参与计算的图标的总数 - int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count() + m_toolLayout->count(); + int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count() + m_toolAreaLayout->count(); if (iconCount <= 0) { if (m_position == Position::Top || m_position == Position::Bottom) return QSize((static_cast((traySuitableSize.width() + 20) / ratio)), height()); @@ -1195,7 +1221,12 @@ void MainPanelControl::resizeDockIcon() // 减去右侧托盘和插件区域的宽度 totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? trayManagerSize.width() : trayManagerSize.height(); - iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count(); + iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count(); + if (m_recentAreaWidget->isVisible()) + iconCount += m_recentLayout->count(); + + if (m_toolAreaWidget->isVisible()) + iconCount += m_toolSonLayout->count(); if (iconCount <= 0) return; @@ -1333,11 +1364,11 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) m_recentSpliter->setFixedSize(int(h * 0.6), SPLITER_SIZE); } - for (int i = 0; i < m_appAreaSonLayout->count(); ++i) - m_appAreaSonLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); - // 时尚模式下判断是否需要显示最近打开的应用区域 if (m_displayMode == Dock::DisplayMode::Fashion) { + for (int i = 0; i < m_appAreaSonLayout->count(); ++i) + m_appAreaSonLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); + if (m_recentLayout->count() > 0) { for (int i = 0; i < m_recentLayout->count(); ++i) m_recentLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); @@ -1349,14 +1380,61 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) m_recentAreaWidget->setFixedHeight(appItemSize * m_recentLayout->count()); } - if (m_toolLayout->count() > 0) { - for (int i = 0; i < m_toolLayout->count(); i++) - m_toolLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); + if (m_multiWindowLayout->count() > 0) { + QList multiSizes; + for (int i = 0; i < m_multiWindowLayout->count(); i++) { + // 因为多开窗口的长宽会不一样,因此,需要将当前的尺寸传入 + // 由它自己来计算自己的长宽尺寸 + AppMultiItem *appMultiItem = qobject_cast(m_multiWindowLayout->itemAt(i)->widget()); + if (!appMultiItem) + continue; - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - m_toolAreaWidget->setFixedWidth(appItemSize * m_toolLayout->count()); - else - m_toolAreaWidget->setFixedHeight(appItemSize * m_toolLayout->count()); + QSize size = appMultiItem->suitableSize(appItemSize); + appMultiItem->setFixedSize(size); + multiSizes << size; + } + // 计算多开窗口的尺寸 + int totalSize = 0; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + for (QSize size : multiSizes) + totalSize += size.width(); + + m_multiWindowWidget->setFixedSize(totalSize, appItemSize); + } else { + for (QSize size : multiSizes) + totalSize += size.height(); + + m_multiWindowWidget->setFixedSize(appItemSize, totalSize); + } + } else { + m_multiWindowWidget->setFixedSize(0, 0); + } + if (m_toolSonLayout->count() > 0) { + for (int i = 0; i < m_toolSonLayout->count(); i++) + m_toolSonLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); + + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + m_toolSonAreaWidget->setFixedWidth(appItemSize * m_toolSonLayout->count()); + } else { + m_toolSonAreaWidget->setFixedHeight(appItemSize * m_toolSonLayout->count()); + } + } + + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + m_toolAreaWidget->setFixedWidth(m_multiWindowWidget->width() + m_toolSonAreaWidget->width()); + else + m_toolAreaWidget->setFixedHeight(m_multiWindowWidget->height() + m_toolSonAreaWidget->height()); + } else { + for (int i = 0; i < m_appAreaSonLayout->count(); ++i) { + DockItem *dockItem = qobject_cast(m_appAreaSonLayout->itemAt(i)->widget()); + if (!dockItem) + continue; + if (dockItem->itemType() == DockItem::ItemType::AppMultiWindow) { + AppMultiItem *appMultiItem = qobject_cast(dockItem); + dockItem->setFixedSize(appMultiItem->suitableSize(appItemSize)); + } else { + dockItem->setFixedSize(appItemSize, appItemSize); + } } } diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 35c0bdd9f..ef13a72c9 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -43,6 +43,7 @@ class TrayManagerWindow; class DockScreen; class RecentAppHelper; class ToolAppHelper; +class MultiWindowHelper; class MainPanelControl : public QWidget { @@ -132,8 +133,12 @@ private: QWidget *m_recentAreaWidget; // 最近打开应用 QBoxLayout *m_recentLayout; QLabel *m_recentSpliter; // 最近打开应用区域分割线 - QWidget *m_toolAreaWidget; // 工具区域 - QBoxLayout *m_toolLayout; // 工具区域布局 + QWidget *m_toolAreaWidget; // 工具区域,用来存放多开窗口和回收站等 + QBoxLayout *m_toolAreaLayout; // 工具区域的布局 + QWidget *m_multiWindowWidget; // 多开窗口区域,用来存放多开窗口 + QBoxLayout *m_multiWindowLayout;// 用来存放多开窗口的布局 + QWidget *m_toolSonAreaWidget; // 工具区域,用来存放回收站等工具 + QBoxLayout *m_toolSonLayout; // 工具区域布局 TrayManagerWindow *m_trayManagerWidget; QBoxLayout *m_pluginLayout; // 插件区域布局 @@ -152,6 +157,7 @@ private: DockInter *m_dockInter; RecentAppHelper *m_recentHelper; ToolAppHelper *m_toolHelper; + MultiWindowHelper *m_multiHelper; }; #endif // MAINPANELCONTROL_H From d6f0860fcf3fecba996acb1df75ba4c4a521ba0f Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 29 Jul 2022 06:06:58 +0000 Subject: [PATCH 074/257] =?UTF-8?q?feat:=20=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=8B=96=E5=8A=A8=E5=88=B0=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=A9=BB=E7=95=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 判断鼠标拖动的位置是否在回收站区域,如果在回收站区域,则执行移除驻留的功能 Log: 增加任务栏应用到回收站移除驻留的功能 Influence: 拖动任务栏应用到回收站,观察是否可以移除驻留 Bug: https://pms.uniontech.com/bug-view-147699.html Change-Id: Ib0a17f0f4647827b2c2a0e70d98a86c1b9135c11 --- frame/item/appitem.cpp | 7 ++----- frame/item/appitem.h | 1 - frame/window/mainpanelcontrol.cpp | 29 +++++++++++++++++++++-------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index f6775bce8..d6ca1547b 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -61,7 +61,6 @@ AppItem::AppItem(DockInter *dockInter, const QGSettings *appSettings, const QGSe , m_itemAnimation(nullptr) , m_wmHelper(DWindowManagerHelper::instance()) , m_drag(nullptr) - , m_dragging(false) , m_retryTimes(0) , m_iconValid(true) , m_lastclickTimes(0) @@ -274,10 +273,8 @@ void AppItem::moveEvent(QMoveEvent *e) void AppItem::paintEvent(QPaintEvent *e) { DockItem::paintEvent(e); - if (m_draging) - return; - if (m_dragging || (m_swingEffectView != nullptr && DockDisplayMode != Fashion)) + if (isDragging() || (m_swingEffectView != nullptr && DockDisplayMode != Fashion)) return; QPainter painter(this); @@ -569,7 +566,7 @@ QWidget *AppItem::popupTips() if (checkGSettingsControl()) return nullptr; - if (m_dragging) + if (isDragging()) return nullptr; static TipsWidget appNameTips(topLevelWidget()); diff --git a/frame/item/appitem.h b/frame/item/appitem.h index afa9ae9c9..6495718b6 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -139,7 +139,6 @@ private: QPointer m_drag; - bool m_dragging; bool m_active; int m_retryTimes; bool m_iconValid; diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index b67544204..495e75a67 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -380,8 +380,8 @@ void MainPanelControl::resetRadius() */ void MainPanelControl::dockRecentApp(DockItem *dockItem) { - // 如果当前不是特效模式,则无需做驻留操作 - if (m_displayMode != Dock::DisplayMode::Fashion) + // 如果不是插入或者当前不是特效模式,则无需做驻留操作 + if (m_dragIndex == -1 || m_displayMode != Dock::DisplayMode::Fashion) return; AppItem *appItem = qobject_cast(dockItem); @@ -848,9 +848,6 @@ void MainPanelControl::startDrag(DockItem *dockItem) connect(m_appDragWidget, &AppDragWidget::destroyed, this, [ = ] { m_appDragWidget = nullptr; - AppItem *appItem = static_cast(dockItem); - if (appItem->supportSplitWindow()) - return; if (!item.isNull() && qobject_cast(item)->isValid()) { // 如果是从最近打开区域移动到应用区域的,则需要将其固定 @@ -861,7 +858,6 @@ void MainPanelControl::startDrag(DockItem *dockItem) } item->setDraging(false); item->update(); - // 发送拖拽完成事件 m_recentHelper->resetAppInfo(); } @@ -892,7 +888,6 @@ void MainPanelControl::startDrag(DockItem *dockItem) // 设置垃圾箱插件AcceptDrops false bool isNeedBack = false; PluginsItem *trashItem = m_toolHelper->trashPlugin(); - if (item->itemType() == DockItem::Plugins && trashItem && dockItem != trashItem) { trashItem->centralWidget()->setAcceptDrops(false); isNeedBack = true; @@ -906,7 +901,25 @@ void MainPanelControl::startDrag(DockItem *dockItem) m_appDragWidget->execFinished(); } - if (item->itemType() != DockItem::App || m_dragIndex == -1) { + if (item->itemType() == DockItem::App) { + // 判断是否在回收站区域, 如果在回收站区域,则移除驻留 + PluginsItem *trashItem = m_toolHelper->trashPlugin(); + if (!trashItem) + return; + + QRect trashRect = trashItem->centralWidget()->geometry(); + QPoint pointMouse = trashItem->centralWidget()->mapFromGlobal(QCursor::pos()); + if (trashRect.contains(pointMouse)) { + AppItem *appItem = qobject_cast(dockItem); + if (!appItem) + return; + + // 先让其设置m_dragIndex==-1,避免在后续放到任务栏 + m_dragIndex = -1; + appItem->setDraging(false); + appItem->undock(); + } + } else if (m_dragIndex == -1) { m_appDragWidget = nullptr; item->setDraging(false); item->update(); From fc8294c46c2f113690bf41fe9139f193cc9695cf Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 18 Aug 2022 10:42:52 +0000 Subject: [PATCH 075/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=8B=E5=BA=94=E7=94=A8=E6=89=93=E5=BC=80?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=97=A0=E6=B3=95=E6=98=BE=E7=A4=BA=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wayland环境下,窗管无法提供windowId,原来通过windowID的方式获取截图的方式失效,因此窗管增加了通过窗体的UUID的方式来获取截图的接口,前端通过传入UUID的方式来获取截图 Log: 修复wayland环境下无法显示预览图的问题 Influence: wayland-任务栏打开一个应用窗口,鼠标放入到窗口上,查看预览图 Bug: https://pms.uniontech.com/bug-view-140919.html Change-Id: I3506e8edb8f875ba7c5d7b3d3471ad51a3170f58 --- frame/controller/dockitemmanager.cpp | 3 +- frame/item/appmultiitem.cpp | 129 ++------------------------ frame/item/appmultiitem.h | 7 -- frame/item/components/appsnapshot.cpp | 27 ++---- frame/util/imageutil.cpp | 53 +++++++++++ frame/util/imageutil.h | 3 + 6 files changed, 71 insertions(+), 151 deletions(-) diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index c773fb16e..3742aec42 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -450,7 +450,8 @@ void DockItemManager::onShowMultiWindowChanged() { if (m_appInter->showMultiWindow()) { // 如果当前设置支持窗口多开,那么就依次对每个APPItem加载多开窗口 - for (const QPointer &dockItem : m_itemList) { + for (int i = 0; i < m_itemList.size(); i++) { + const QPointer &dockItem = m_itemList[i]; if (dockItem->itemType() != DockItem::ItemType::App) continue; diff --git a/frame/item/appmultiitem.cpp b/frame/item/appmultiitem.cpp index 02f89f79b..f387912f8 100644 --- a/frame/item/appmultiitem.cpp +++ b/frame/item/appmultiitem.cpp @@ -34,21 +34,6 @@ #include #include -struct SHMInfo { - long shmid; - long width; - long height; - long bytesPerLine; - long format; - - struct Rect { - long x; - long y; - long width; - long height; - } rect; -}; - AppMultiItem::AppMultiItem(AppItem *appItem, WId winId, const WindowInfo &windowInfo, QWidget *parent) : DockItem(parent) , m_appItem(appItem) @@ -90,113 +75,6 @@ DockItem::ItemType AppMultiItem::itemType() const return DockItem::AppMultiWindow; } -bool AppMultiItem::isKWinAvailable() const -{ - if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.kde.KWin"))) { - QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Effects"), QStringLiteral("org.kde.kwin.Effects")); - QDBusReply reply = interface.call(QStringLiteral("isEffectLoaded"), "screenshot"); - - return reply.value(); - } - return false; -} - -QImage AppMultiItem::snapImage() const -{ - // 优先使用窗管进行窗口截图 - if (isKWinAvailable()) { - QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Screenshot"), QStringLiteral("org.kde.kwin.Screenshot")); - - QList args; - args << QVariant::fromValue(m_winId); - args << QVariant::fromValue(quint32(width() - 20)); - args << QVariant::fromValue(quint32(height() - 20)); - - QImage image; - QDBusReply reply = interface.callWithArgumentList(QDBus::Block, QStringLiteral("screenshotForWindowExtend"), args); - if(reply.isValid()){ - const QString tmpFile = reply.value(); - if (QFile::exists(tmpFile)) { - image.load(tmpFile); - qDebug() << "reply: " << tmpFile; - QFile::remove(tmpFile); - } else { - qDebug() << "get current workspace bckground error, file does not exist : " << tmpFile; - } - } else { - qDebug() << "get current workspace bckground error: "<< reply.error().message(); - } - return image; - } - - // get window image from shm(only for deepin app) - SHMInfo *info = getImageDSHM(); - QImage image; - uchar *image_data = 0; - if (info) { - qDebug() << "get Image from dxcbplugin SHM..."; - image_data = (uchar *)shmat(info->shmid, 0, 0); - if ((qint64)image_data != -1) - return QImage(image_data, info->width, info->height, info->bytesPerLine, (QImage::Format)info->format); - - qDebug() << "invalid pointer of shm!"; - image_data = nullptr; - } - - QImage qimage; - XImage *ximage; - if (!image_data || qimage.isNull()) { - ximage = getImageXlib(); - if (!ximage) - return QImage(); - - qimage = QImage((const uchar *)(ximage->data), ximage->width, ximage->height, ximage->bytes_per_line, QImage::Format_RGB32); - } - - return image; -} - -SHMInfo *AppMultiItem::getImageDSHM() const -{ - const auto display = Utils::IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display(); - if (!display) { - qWarning() << "Error: get display failed!"; - return nullptr; - } - - Atom atom_prop = XInternAtom(display, "_DEEPIN_DXCB_SHM_INFO", true); - if (!atom_prop) { - return nullptr; - } - - Atom actual_type_return_deepin_shm; - int actual_format_return_deepin_shm; - unsigned long nitems_return_deepin_shm; - unsigned long bytes_after_return_deepin_shm; - unsigned char *prop_return_deepin_shm; - - XGetWindowProperty(display, m_winId, atom_prop, 0, 32 * 9, false, AnyPropertyType, - &actual_type_return_deepin_shm, &actual_format_return_deepin_shm, &nitems_return_deepin_shm, - &bytes_after_return_deepin_shm, &prop_return_deepin_shm); - - return reinterpret_cast(prop_return_deepin_shm); -} - -XImage *AppMultiItem::getImageXlib() const -{ - const auto display = Utils::IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display(); - if (!display) { - qWarning() << "Error: get display failed!"; - return nullptr; - } - - Window unused_window; - int unused_int; - unsigned unused_uint, w, h; - XGetGeometry(display, m_winId, &unused_window, &unused_int, &unused_int, &w, &h, &unused_uint, &unused_uint); - return XGetImage(display, m_winId, 0, 0, w, h, AllPlanes, ZPixmap); -} - void AppMultiItem::initMenu() { QAction *actionOpen = new QAction(m_menu); @@ -232,7 +110,12 @@ void AppMultiItem::paintEvent(QPaintEvent *) painter.setRenderHint(QPainter::SmoothPixmapTransform, true); if (m_snapImage.isNull()) { - m_snapImage = snapImage(); +#ifdef USE_AM + if (Utils::IS_WAYLAND_DISPLAY) + m_snapImage = ImageUtil::loadWindowThumb(m_windowInfo.uuid, width() - 20, height() - 20); + else +#endif + m_snapImage = ImageUtil::loadWindowThumb(m_winId, width() - 20, height() - 20); } DStyleHelper dstyle(style()); diff --git a/frame/item/appmultiitem.h b/frame/item/appmultiitem.h index 36e261a89..ea9963f0c 100644 --- a/frame/item/appmultiitem.h +++ b/frame/item/appmultiitem.h @@ -24,9 +24,6 @@ #include "dockitem.h" #include "dbusutil.h" -struct SHMInfo; -struct _XImage; -typedef _XImage XImage; class AppItem; class AppMultiItem : public DockItem @@ -51,10 +48,6 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override; private: - bool isKWinAvailable() const; - QImage snapImage() const; - SHMInfo *getImageDSHM() const; - XImage *getImageXlib() const; void initMenu(); void initConnection(); diff --git a/frame/item/components/appsnapshot.cpp b/frame/item/components/appsnapshot.cpp index fa5fcd509..dd598235a 100644 --- a/frame/item/components/appsnapshot.cpp +++ b/frame/item/components/appsnapshot.cpp @@ -23,6 +23,7 @@ #include "previewcontainer.h" #include "../widgets/tipswidget.h" #include "utils.h" +#include "imageutil.h" #include @@ -212,27 +213,13 @@ void AppSnapshot::fetchSnapshot() // 优先使用窗管进行窗口截图 if (isKWinAvailable()) { - QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Screenshot"), QStringLiteral("org.kde.kwin.Screenshot")); - qDebug() << "windowsID:"<< m_wid; +#ifdef USE_AM + if (Utils::IS_WAYLAND_DISPLAY) + m_snapshot = ImageUtil::loadWindowThumb(m_windowInfo.uuid, SNAP_WIDTH, SNAP_HEIGHT); + else +#endif + m_snapshot = ImageUtil::loadWindowThumb(m_wid, SNAP_WIDTH, SNAP_HEIGHT); - QList args; - args << QVariant::fromValue(m_wid); - args << QVariant::fromValue(quint32(SNAP_WIDTH)); - args << QVariant::fromValue(quint32(SNAP_HEIGHT)); - - QDBusReply reply = interface.callWithArgumentList(QDBus::Block,QStringLiteral("screenshotForWindowExtend"), args); - if(reply.isValid()){ - const QString tmpFile = reply.value(); - if (QFile::exists(tmpFile)) { - m_snapshot.load(tmpFile); - qDebug() << "reply: " << tmpFile; - QFile::remove(tmpFile); - } else { - qDebug() << "get current workspace bckground error, file does not exist : " << tmpFile; - } - } else { - qDebug() << "get current workspace bckground error: "<< reply.error().message(); - } m_snapshotSrcRect = m_snapshot.rect(); } else { do { diff --git a/frame/util/imageutil.cpp b/frame/util/imageutil.cpp index a2a3f2014..e3bc0a00c 100644 --- a/frame/util/imageutil.cpp +++ b/frame/util/imageutil.cpp @@ -29,6 +29,9 @@ #include #include #include +#include +#include +#include #include @@ -84,3 +87,53 @@ QCursor* ImageUtil::loadQCursorFromX11Cursor(const char* theme, const char* curs XcursorImagesDestroy(images); return cursor; } + +QImage ImageUtil::loadWindowThumb(const WId &windowId, int width, int height) +{ + QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Screenshot"), QStringLiteral("org.kde.kwin.Screenshot")); + + QList args; + args << QVariant::fromValue(windowId); + args << QVariant::fromValue(quint32(width)); + args << QVariant::fromValue(quint32(height)); + + QDBusReply reply = interface.callWithArgumentList(QDBus::Block, QStringLiteral("screenshotForWindowExtend"), args); + if(reply.isValid()){ + const QString tmpFile = reply.value(); + if (QFile::exists(tmpFile)) { + QImage image(tmpFile); + QFile::remove(tmpFile); + return image; + } + qDebug() << "get current workspace background error, file does not exist : " << tmpFile; + } else { + qDebug() << "get current workspace background error: "<< reply.error().message(); + } + + return QImage(); +} + +QImage ImageUtil::loadWindowThumb(const QString &uuid, int width, int height) +{ + QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Screenshot"), QStringLiteral("org.kde.kwin.Screenshot")); + + QList args; + args << QVariant::fromValue(uuid); + args << QVariant::fromValue(quint32(width)); + args << QVariant::fromValue(quint32(height)); + + QDBusReply reply = interface.callWithArgumentList(QDBus::Block, QStringLiteral("screenshotForWindowExtendUuid"), args); + if(reply.isValid()){ + const QString tmpFile = reply.value(); + if (QFile::exists(tmpFile)) { + QImage image(tmpFile); + QFile::remove(tmpFile); + return image; + } + qDebug() << "get current workspace background error, file does not exist : " << tmpFile; + } else { + qDebug() << "get current workspace background error: "<< reply.error().message(); + } + + return QImage(); +} diff --git a/frame/util/imageutil.h b/frame/util/imageutil.h index 0ed1b3c37..204b10153 100644 --- a/frame/util/imageutil.h +++ b/frame/util/imageutil.h @@ -35,6 +35,9 @@ public: static const QPixmap loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio); static const QPixmap loadSvg(const QString &iconName, const QSize size, const qreal ratio = qApp->devicePixelRatio()); static QCursor* loadQCursorFromX11Cursor(const char* theme, const char* cursorName, int cursorSize); + // 加载窗口的预览图 + static QImage loadWindowThumb(const WId &windowId, int width, int height); // x11下加载,用windowID + static QImage loadWindowThumb(const QString &uuid, int width, int height); // wayland下加载,用uuid }; #endif // IMAGEUTIL_H From 1691e7188c0b80659526f31aa371293b145bd3b5 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 25 Aug 2022 19:31:31 +0000 Subject: [PATCH 076/257] =?UTF-8?q?fix:=20=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=E4=BC=98=E5=8C=96=E8=A7=A3?= =?UTF-8?q?=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原来的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 --- frame/accessible/accessible.h | 1 + frame/dbus/dbusdockadaptors.cpp | 29 +- frame/dbus/dbusdockadaptors.h | 7 +- frame/main.cpp | 33 +- frame/util/dockscreen.cpp | 64 ++ frame/util/dockscreen.h | 50 + frame/util/menuworker.cpp | 37 +- frame/util/menuworker.h | 16 +- frame/util/multiscreenworker.cpp | 939 ++---------------- frame/util/multiscreenworker.h | 109 +- frame/window/components/datetimedisplayer.cpp | 37 +- frame/window/components/datetimedisplayer.h | 7 +- frame/window/components/dragwidget.cpp | 125 +++ frame/window/components/dragwidget.h | 57 ++ frame/window/mainpanelcontrol.cpp | 205 ++-- frame/window/mainpanelcontrol.h | 11 +- frame/window/mainwindow.cpp | 671 ++----------- frame/window/mainwindow.h | 176 +--- frame/window/mainwindowbase.cpp | 606 +++++++++++ frame/window/mainwindowbase.h | 118 +++ frame/window/quickpluginwindow.cpp | 9 +- frame/window/quickpluginwindow.h | 3 +- frame/window/systempluginwindow.cpp | 45 +- frame/window/systempluginwindow.h | 5 +- frame/window/tray/tray_gridview.cpp | 40 +- frame/window/tray/tray_gridview.h | 1 + frame/window/traymainwindow.cpp | 163 +++ frame/window/traymainwindow.h | 66 ++ frame/window/traymanagerwindow.cpp | 170 ++-- frame/window/traymanagerwindow.h | 14 +- frame/window/windowmanager.cpp | 810 +++++++++++++++ frame/window/windowmanager.h | 97 ++ interfaces/constants.h | 7 + 33 files changed, 2711 insertions(+), 2017 deletions(-) create mode 100644 frame/util/dockscreen.cpp create mode 100644 frame/util/dockscreen.h create mode 100644 frame/window/components/dragwidget.cpp create mode 100644 frame/window/components/dragwidget.h create mode 100644 frame/window/mainwindowbase.cpp create mode 100644 frame/window/mainwindowbase.h create mode 100644 frame/window/traymainwindow.cpp create mode 100644 frame/window/traymainwindow.h create mode 100644 frame/window/windowmanager.cpp create mode 100644 frame/window/windowmanager.h diff --git a/frame/accessible/accessible.h b/frame/accessible/accessible.h index 790878bc9..082c78771 100644 --- a/frame/accessible/accessible.h +++ b/frame/accessible/accessible.h @@ -5,6 +5,7 @@ #include "desktop_widget.h" #include "tipswidget.h" #include "dockpopupwindow.h" +#include "dragwidget.h" #include "launcheritem.h" #include "appitem.h" diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index 11d5f1ed2..fe945a10c 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -22,16 +22,19 @@ #include "dbusdockadaptors.h" #include "utils.h" #include "dockitemmanager.h" +#include "windowmanager.h" +#include "proxyplugincontroller.h" #include #include #include -DBusDockAdaptors::DBusDockAdaptors(MainWindow* parent) +DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) : QDBusAbstractAdaptor(parent) , m_gsettings(Utils::SettingsPtr("com.deepin.dde.dock.mainwindow", QByteArray(), this)) + , m_windowManager(parent) { - connect(parent, &MainWindow::panelGeometryChanged, this, [=] { + connect(parent, &WindowManager::panelGeometryChanged, this, [ = ] { emit DBusDockAdaptors::geometryChanged(geometry()); }); @@ -74,19 +77,23 @@ DBusDockAdaptors::~DBusDockAdaptors() } -MainWindow *DBusDockAdaptors::parent() const -{ - return static_cast(QObject::parent()); -} - void DBusDockAdaptors::callShow() { - return parent()->callShow(); + m_windowManager->callShow(); } void DBusDockAdaptors::ReloadPlugins() { - return parent()->reloadPlugins(); + if (qApp->property("PLUGINSLOADED").toBool()) + return; + + // 发送事件,通知代理来加载插件 + PluginLoadEvent event; + QCoreApplication::sendEvent(qApp, &event); + + qApp->setProperty("PLUGINSLOADED", true); + // 退出安全模式 + qApp->setProperty("safeMode", false); } QStringList DBusDockAdaptors::GetLoadedPlugins() @@ -120,7 +127,7 @@ QStringList DBusDockAdaptors::GetLoadedPlugins() void DBusDockAdaptors::resizeDock(int offset, bool dragging) { - parent()->resizeDock(offset, dragging); + m_windowManager->resizeDock(offset, dragging); } // 返回每个插件的识别Key(所以此值应始终不变),供个性化插件根据key去匹配每个插件对应的图标 @@ -181,7 +188,7 @@ void DBusDockAdaptors::setPluginVisible(const QString &pluginName, bool visible) QRect DBusDockAdaptors::geometry() const { - return parent()->geometry(); + return m_windowManager->geometry(); } bool DBusDockAdaptors::showInPrimary() const diff --git a/frame/dbus/dbusdockadaptors.h b/frame/dbus/dbusdockadaptors.h index cc42331e1..2d0575ce9 100644 --- a/frame/dbus/dbusdockadaptors.h +++ b/frame/dbus/dbusdockadaptors.h @@ -30,6 +30,8 @@ * Adaptor class for interface com.deepin.dde.Dock */ class QGSettings; +class WindowManager; + class DBusDockAdaptors: public QDBusAbstractAdaptor { Q_OBJECT @@ -69,11 +71,9 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor Q_PROPERTY(bool showInPrimary READ showInPrimary WRITE setShowInPrimary NOTIFY showInPrimaryChanged) public: - explicit DBusDockAdaptors(MainWindow *parent); + explicit DBusDockAdaptors(WindowManager *parent); virtual ~DBusDockAdaptors(); - MainWindow *parent() const; - public Q_SLOTS: // METHODS void callShow(); void ReloadPlugins(); @@ -103,6 +103,7 @@ private: private: QGSettings *m_gsettings; + WindowManager *m_windowManager; }; #endif //DBUSDOCKADAPTORS diff --git a/frame/main.cpp b/frame/main.cpp index f8e3530d6..8bf7c4583 100644 --- a/frame/main.cpp +++ b/frame/main.cpp @@ -26,6 +26,8 @@ #include "themeappicon.h" #include "dockitemmanager.h" #include "dockapplication.h" +#include "traymainwindow.h" +#include "windowmanager.h" #include #include @@ -221,30 +223,37 @@ int main(int argc, char *argv[]) // 在qApp中记录当前是否为安全模式,如果为安全模式,则无需加载插件,在退出安全模式下,才正常加载插件 // 此处设置这个属性必须在MainWindow创建之前,因为在mainWindow中会创建加载插件的代理,会在代理中根据这个属性来判断是否需要加载插件 bool isSafeMode = IsSaveMode(); - qApp->setProperty("safeMode", isSafeMode); + bool disablePlugin = parser.isSet(disablePlugOption); + qApp->setProperty("safeMode", (isSafeMode || disablePlugin)); + + MultiScreenWorker multiScreenWorker; + + MainWindow mainWindow(&multiScreenWorker); + TrayMainWindow trayMainWindow(&multiScreenWorker); + + WindowManager windowManager(&multiScreenWorker); + + // 保证添加窗口的先后顺序,先添加的窗口显示在左边,后添加的窗口显示在右边 + windowManager.addWindow(&mainWindow); + windowManager.addWindow(&trayMainWindow); // 注册任务栏的DBus服务 - MainWindow mw; - DBusDockAdaptors adaptor(&mw); - - if(Utils::IS_WAYLAND_DISPLAY) { - mw.setAttribute(Qt::WA_NativeWindow); - mw.windowHandle()->setProperty("_d_dwayland_window-type", "dock"); - } + DBusDockAdaptors adaptor(&windowManager); QDBusConnection::sessionBus().registerService("com.deepin.dde.Dock"); - QDBusConnection::sessionBus().registerObject("/com/deepin/dde/Dock", "com.deepin.dde.Dock", &mw); + QDBusConnection::sessionBus().registerObject("/com/deepin/dde/Dock", "com.deepin.dde.Dock", &windowManager); // 当任务栏以-r参数启动时,设置CANSHOW未false,之后调用launch不显示任务栏 qApp->setProperty("CANSHOW", !parser.isSet(runOption)); - mw.launch(); + windowManager.launch(); + mainWindow.setVisible(true); // 判断是否进入安全模式,是否带有入参 -x - if (!isSafeMode && !parser.isSet(disablePlugOption)) { + if (!isSafeMode && !disablePlugin) { qApp->setProperty("PLUGINSLOADED", true); } else { - mw.sendNotifications(); + windowManager.sendNotifications(); } return app.exec(); diff --git a/frame/util/dockscreen.cpp b/frame/util/dockscreen.cpp new file mode 100644 index 000000000..71d4b9641 --- /dev/null +++ b/frame/util/dockscreen.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "dockscreen.h" +#include "displaymanager.h" + +DockScreen::DockScreen() + : m_primary(DisplayManager::instance()->primary()) + , m_currentScreen(m_primary) + , m_lastScreen(m_primary) +{ +} + +DockScreen *DockScreen::instance() +{ + static DockScreen instance; + return &instance; +} + +const QString &DockScreen::current() const +{ + return m_currentScreen; +} + +const QString &DockScreen::last() const +{ + return m_lastScreen; +} + +const QString &DockScreen::primary() const +{ + return m_primary; +} + +void DockScreen::updateDockedScreen(const QString &screenName) +{ + m_lastScreen = m_currentScreen; + m_currentScreen = screenName; +} + +void DockScreen::updatePrimary(const QString &primary) +{ + m_primary = primary; + if (m_currentScreen.isEmpty()) { + updateDockedScreen(primary); + } +} diff --git a/frame/util/dockscreen.h b/frame/util/dockscreen.h new file mode 100644 index 000000000..c9f9b24ab --- /dev/null +++ b/frame/util/dockscreen.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef DOCKSCREEN_H +#define DOCKSCREEN_H + +#include + +/** + * @brief The DockScreen class + * 保存任务栏的屏幕信息 + */ +class DockScreen +{ +public: + static DockScreen *instance(); + + const QString ¤t() const; + const QString &last() const; + const QString &primary() const; + void updateDockedScreen(const QString &screenName); + void updatePrimary(const QString &primary); + +private: + explicit DockScreen(); + +private: + QString m_primary; + QString m_currentScreen; + QString m_lastScreen; +}; + +#endif // DOCKSCREEN_H diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index 583775480..8678b48b4 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -32,14 +32,13 @@ #define DIS_INS DisplayManager::instance() -MenuWorker::MenuWorker(DockInter *dockInter,QWidget *parent) +MenuWorker::MenuWorker(QObject *parent) : QObject(parent) - , m_dockInter(dockInter) - , m_autoHide(true) + , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) { } -QMenu *MenuWorker::createMenu(QMenu *settingsMenu) +void MenuWorker::createMenu(QMenu *settingsMenu) { settingsMenu->setAccessibleName("settingsmenu"); settingsMenu->setTitle("Settings Menu"); @@ -152,8 +151,6 @@ QMenu *MenuWorker::createMenu(QMenu *settingsMenu) } delete menuSettings; - menuSettings = nullptr; - return settingsMenu; } void MenuWorker::onDockSettingsTriggered() @@ -175,31 +172,17 @@ void MenuWorker::onDockSettingsTriggered() #endif } -void MenuWorker::showDockSettingsMenu(QMenu *menu) +void MenuWorker::exec() { // 菜单功能被禁用 - static const QGSettings *setting = Utils::ModuleSettingsPtr("menu", QByteArray(), this); + static const QGSettings *setting = Utils::ModuleSettingsPtr("menu", QByteArray()); if (setting && setting->keys().contains("enable") && !setting->get("enable").toBool()) { return; } - // 菜单将要被打开 - setAutoHide(false); - - menu = createMenu(menu); - menu->exec(QCursor::pos()); - - // 菜单已经关闭 - setAutoHide(true); - delete menu; - menu = nullptr; -} - -void MenuWorker::setAutoHide(const bool autoHide) -{ - if (m_autoHide == autoHide) - return; - - m_autoHide = autoHide; - emit autoHideChanged(m_autoHide); + QMenu menu; + if (Utils::IS_WAYLAND_DISPLAY) + menu.setWindowFlag(Qt::FramelessWindowHint); + createMenu(&menu); + menu.exec(QCursor::pos()); } diff --git a/frame/util/menuworker.h b/frame/util/menuworker.h index f128ed518..f62d47fa7 100644 --- a/frame/util/menuworker.h +++ b/frame/util/menuworker.h @@ -20,11 +20,12 @@ */ #ifndef MENUWORKER_H #define MENUWORKER_H -#include #include "constants.h" #include "dbusutil.h" +#include + class QMenu; class QGSettings; /** @@ -34,25 +35,18 @@ class MenuWorker : public QObject { Q_OBJECT public: - explicit MenuWorker(DockInter *dockInter,QWidget *parent = nullptr); + explicit MenuWorker(QObject *parent = nullptr); - void showDockSettingsMenu(QMenu *menu); - -signals: - void autoHideChanged(const bool autoHide) const; - -public slots: - void setAutoHide(const bool autoHide); + void exec(); private: - QMenu *createMenu(QMenu *settingsMenu); + void createMenu(QMenu *settingsMenu); private slots: void onDockSettingsTriggered(); private: DockInter *m_dockInter; - bool m_autoHide; }; #endif // MENUWORKER_H diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index c76540799..a7170b8b9 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -23,6 +23,12 @@ #include "mainwindow.h" #include "utils.h" #include "displaymanager.h" +#include "traymainwindow.h" +#include "mainwindow.h" +#include "menuworker.h" +#include "windowmanager.h" +#include "dockitemmanager.h" +#include "dockscreen.h" #include #include @@ -33,6 +39,7 @@ #include #include #include +#include #include #include @@ -41,14 +48,13 @@ const QString MonitorsSwitchTime = "monitorsSwitchTime"; const QString OnlyShowPrimary = "onlyShowPrimary"; #define DIS_INS DisplayManager::instance() +#define DOCK_SCREEN DockScreen::instance() // 保证以下数据更新顺序(大环节顺序不要变,内部还有一些小的调整,比如任务栏显示区域更新的时候,里面内容的布局方向可能也要更新...) // Monitor数据->屏幕是否可停靠更新->监视唤醒区域更新,任务栏显示区域更新->拖拽区域更新->通知后端接口,通知窗管 -MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *helper) +MultiScreenWorker::MultiScreenWorker(QObject *parent) : QObject(parent) - , m_parent(parent) - , m_wmHelper(helper) , m_eventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) , m_extralEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) , m_touchEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) @@ -56,45 +62,30 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *help , m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus(), this)) , m_monitorUpdateTimer(new QTimer(this)) , m_delayWakeTimer(new QTimer(this)) - , m_ds(DIS_INS->primary()) + , m_position(Dock::Position::Bottom) + , m_hideMode(Dock::HideMode::KeepShowing) + , m_hideState(Dock::HideState::Show) + , m_displayMode(Dock::DisplayMode::Efficient) , m_state(AutoHide) { - qInfo() << "init dock screen: " << m_ds.current(); - initConnection(); initMembers(); initDockMode(); - initDisplayData(); initUI(); + QMetaObject::invokeMethod(this, &MultiScreenWorker::initDisplayData, Qt::QueuedConnection); } -void MultiScreenWorker::initShow() +MultiScreenWorker::~MultiScreenWorker() { - // 仅在初始化时调用一次 - static bool first = true; - if (!first) - return; - first = false; +} - // 这里是为了在调用时让MainWindow更新界面布局方向 - emit requestUpdateLayout(); - - if (m_hideMode == HideMode::KeepShowing) - displayAnimation(m_ds.current(), AniAction::Show); - else if (m_hideMode == HideMode::KeepHidden) { - QRect rect = getDockShowGeometry(m_ds.current(), m_position, m_displayMode); - parent()->panel()->setFixedSize(rect.size()); - parent()->panel()->move(0, 0); - - rect = getDockHideGeometry(m_ds.current(), m_position, m_displayMode); - parent()->setFixedSize(rect.size()); - parent()->setGeometry(rect); - } else if (m_hideMode == HideMode::SmartHide) { - if (m_hideState == HideState::Show) - displayAnimation(m_ds.current(), AniAction::Show); - else if (m_hideState == HideState::Hide) - displayAnimation(m_ds.current(), AniAction::Hide); - } +void MultiScreenWorker::updateDaemonDockSize(const int &dockSize) +{ + m_dockInter->setWindowSize(uint(dockSize)); + if (m_displayMode == Dock::DisplayMode::Fashion) + m_dockInter->setWindowSizeFashion(uint(dockSize)); + else + m_dockInter->setWindowSizeEfficient(uint(dockSize)); } /** @@ -112,48 +103,7 @@ void MultiScreenWorker::setStates(RunStates state, bool on) m_state &= ~(type); } -/** - * @brief dockRect - * @param screenName 屏幕名 - * @param pos 任务栏位置 - * @param hideMode 模式 - * @param displayMode 状态 - * @return 按照给定的数据计算出任务栏所在位置 - */ -QRect MultiScreenWorker::dockRect(const QString &screenName, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode) -{ - if (hideMode == HideMode::KeepShowing || (hideMode == HideMode::SmartHide && m_hideState == HideState::Show)) - return getDockShowGeometry(screenName, pos, displayMode); - - return getDockHideGeometry(screenName, pos, displayMode); -} - -/** - * @brief dockRect - * @param screenName 屏幕名 - * @return 按照当前屏幕的当前属性给出任务栏所在区域 - */ -QRect MultiScreenWorker::dockRect(const QString &screenName) -{ - return dockRect(screenName, m_position, m_hideMode, m_displayMode); -} - -/** - * @brief realDockRect 给出不计算缩放情况的区域信息(和后端接口保持一致) - * @param screenName 屏幕名 - * @param pos 任务栏位置 - * @param hideMode 模式 - * @param displayMode 状态 - * @return - */ -QRect MultiScreenWorker::dockRectWithoutScale(const QString &screenName, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode) -{ - if (hideMode == HideMode::KeepShowing) - return getDockShowGeometry(screenName, pos, displayMode, true); - return getDockHideGeometry(screenName, pos, displayMode, true); -} - -void MultiScreenWorker::onAutoHideChanged(bool autoHide) +void MultiScreenWorker::onAutoHideChanged(const bool autoHide) { if (testState(AutoHide) != autoHide) setStates(AutoHide, autoHide); @@ -163,19 +113,6 @@ void MultiScreenWorker::onAutoHideChanged(bool autoHide) } } -/** - * @brief updateDaemonDockSize - * @param dockSize 这里的高度是通过qt获取的,不能使用后端的接口数据 - */ -void MultiScreenWorker::updateDaemonDockSize(int dockSize) -{ - m_dockInter->setWindowSize(uint(dockSize)); - if (m_displayMode == DisplayMode::Fashion) - m_dockInter->setWindowSizeFashion(uint(dockSize)); - else - m_dockInter->setWindowSizeEfficient(uint(dockSize)); -} - #ifndef USE_AM void MultiScreenWorker::handleDbusSignal(QDBusMessage msg) { @@ -225,67 +162,23 @@ void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString return; // FIXME:每次都要重置一下,是因为qt中的QScreen类缺少nameChanged信号,后面会给上游提交patch修复 - m_ds.updateDockedScreen(getValidScreen(position())); + DOCK_SCREEN->updateDockedScreen(getValidScreen(position())); // 鼠标移动到任务栏界面之外,停止计时器(延时2秒改变任务栏所在屏幕) m_delayWakeTimer->stop(); if (m_hideMode == HideMode::KeepShowing || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { - displayAnimation(m_ds.current(), AniAction::Show); + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Show); } else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) { - displayAnimation(m_ds.current(), AniAction::Hide); + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Hide); } } -void MultiScreenWorker::showAniFinished() -{ - QRect rect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); - if (m_displayMode == Dock::DisplayMode::Fashion - && (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)) { - // 特效模式下且在上下位置,需要先设置高度,因为trayManager - // 里面需要根据顶层窗口的高度来设置显示一行还是两行, - // 此时trayManager的长度就会发送变化,返回的建议值才是正确的尺寸值 - parent()->setFixedHeight(rect.height()); - // 调用更新布局接口来调整trayManager窗口的尺寸 - parent()->panel()->updatePluginsLayout(); - // 重新获取窗口尺寸 - rect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); - } - - parent()->setFixedSize(rect.size()); - parent()->setGeometry(rect); - - parent()->panel()->setFixedSize(rect.size()); - parent()->panel()->move(0, 0); - - emit requestUpdateFrontendGeometry(); - emit requestNotifyWindowManager(); -} - -void MultiScreenWorker::hideAniFinished() -{ - // 提前更新界面布局 - emit requestUpdateLayout(); - - const QRect rect = dockRect(m_ds.current(), m_position, HideMode::KeepHidden, m_displayMode); - parent()->setFixedSize(rect.size()); - parent()->setGeometry(rect); - parent()->panel()->setFixedSize(rect.size()); - parent()->panel()->move(0, 0); - - DockItem::setDockPosition(m_position); - qApp->setProperty(PROP_POSITION, QVariant::fromValue(m_position)); - - emit requestUpdateFrontendGeometry(); - emit requestNotifyWindowManager(); -} - void MultiScreenWorker::updateDisplay() { //1、屏幕停靠信息, //2、任务栏当前显示在哪个屏幕也需要更新 - //2、监视任务栏唤醒区域信息, //3、任务栏高度或宽度调整的拖拽区域, //4、通知窗管的任务栏显示区域信息, //5、通知后端的任务栏显示区域信息 @@ -293,12 +186,13 @@ void MultiScreenWorker::updateDisplay() qWarning() << "No Screen Can Display."; return; } + // 更新所在屏幕 resetDockScreen(); // 通知后端 - onRequestUpdateFrontendGeometry(); + Q_EMIT requestUpdateFrontendGeometry(); // 通知窗管 - onRequestNotifyWindowManager(); + Q_EMIT requestNotifyWindowManager(); } void MultiScreenWorker::onWindowSizeChanged(uint value) @@ -308,10 +202,10 @@ void MultiScreenWorker::onWindowSizeChanged(uint value) m_monitorUpdateTimer->start(); } -void MultiScreenWorker::primaryScreenChanged() +void MultiScreenWorker::onPrimaryScreenChanged() { // 先更新主屏信息 - m_ds.updatePrimary(DIS_INS->primary()); + DOCK_SCREEN->updatePrimary(DIS_INS->primary()); // 无效值 if (DIS_INS->screenRawHeight() == 0 || DIS_INS->screenRawWidth() == 0) { @@ -323,41 +217,6 @@ void MultiScreenWorker::primaryScreenChanged() m_monitorUpdateTimer->start(); } -void MultiScreenWorker::updateParentGeometry(const QVariant &value, const Position &pos) -{ - Q_ASSERT_X(value.type() == QVariant::Rect, "", "ERROR OCCURED!"); - - const QRect &rect = value.toRect(); - parent()->setFixedSize(rect.size()); - parent()->setGeometry(rect); - - const int panelSize = ((pos == Position::Top || pos == Position::Bottom) ? parent()->panel()->height() : parent()->panel()->width()); - - switch (pos) { - case Position::Top: { - parent()->panel()->move(0, rect.height() - panelSize); - } - break; - case Position::Left: { - parent()->panel()->move(rect.width() - panelSize, 0); - } - break; - case Position::Bottom: - case Position::Right: { - parent()->panel()->move(0, 0); - } - break; - } -} - -void MultiScreenWorker::updateParentGeometry(const QVariant &value) -{ - if (!testState(ShowAnimationStart) && !testState(HideAnimationStart)) - return; - - updateParentGeometry(value, m_position); -} - void MultiScreenWorker::onPositionChanged(int position) { Position lastPos = m_position; @@ -368,18 +227,15 @@ void MultiScreenWorker::onPositionChanged(int position) #endif m_position = static_cast(position); - // 更新鼠标拖拽样式,在类内部设置到qApp单例上去 - if ((Top == m_position) || (Bottom == m_position)) { - parent()->panel()->setCursor(Qt::SizeVerCursor); - } else { - parent()->panel()->setCursor(Qt::SizeHorCursor); - } - if (m_hideMode == HideMode::KeepHidden || (m_hideMode == HideMode::SmartHide && m_hideState == HideState::Hide)) { // 这种情况切换位置,任务栏不需要显示 - displayAnimation(m_ds.current(), lastPos, AniAction::Hide); + // 参数说明 1 当前屏幕名称 2 改变位置之前的位置,因为需要从之前的位置完成隐藏的动画 + // 3 隐藏动画 4 无需考虑当前鼠标是否在任务栏上,这个参数是通过其他方式隐藏唤醒任务栏的时候考虑鼠标是否在任务栏的位置来决定是否做隐藏动画 + // 默认是false,也就是无需考虑 5 当前动画是否为执行位置改变的动画,如果该值为true,那么在动画执行完成后,WindowManager需要给其管理的 + // 子窗口来更新当前的位置的信息 + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), lastPos, Dock::AniAction::Hide, false, true); // 更新当前屏幕信息,下次显示从目标屏幕显示 - m_ds.updateDockedScreen(getValidScreen(m_position)); + DOCK_SCREEN->updateDockedScreen(getValidScreen(m_position)); // 需要更新frontendWindowRect接口数据,否则会造成HideState属性值不变 emit requestUpdateFrontendGeometry(); } else { @@ -396,25 +252,8 @@ void MultiScreenWorker::onDisplayModeChanged(int displayMode) qInfo() << "display mode change:" << displayMode; m_displayMode = static_cast(displayMode); - parent()->panel()->setDisplayMode(m_displayMode); - DockItem::setDockDisplayMode(m_displayMode); - qApp->setProperty(PROP_DISPLAY_MODE, QVariant::fromValue(displayMode)); - - QRect rect; - if (m_hideMode == HideMode::KeepShowing || (m_hideMode == HideMode::SmartHide && m_hideState == HideState::Show)) { - rect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); - } else { - rect = dockRect(m_ds.current(), m_position, HideMode::KeepHidden, m_displayMode); - } - - parent()->setFixedSize(rect.size()); - parent()->move(rect.topLeft()); - - parent()->panel()->setFixedSize(rect.size()); - parent()->panel()->move(0, 0); - - emit displayModeChanegd(); + emit displayModeChanged(m_displayMode); emit requestUpdateFrontendGeometry(); emit requestNotifyWindowManager(); } @@ -430,9 +269,9 @@ void MultiScreenWorker::onHideModeChanged(int hideMode) if (m_hideMode == HideMode::KeepShowing || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { - displayAnimation(m_ds.current(), AniAction::Show); + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Show); } else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) { - displayAnimation(m_ds.current(), AniAction::Hide); + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Hide); } emit requestUpdateFrontendGeometry(); @@ -450,27 +289,27 @@ void MultiScreenWorker::onHideStateChanged(int state) //TODO 这里是否存在屏幕找不到的问题,m_ds的当前屏幕是否可以做成实时同步的,公用一个指针? //TODO 这里真的有必要加以下代码吗,只是隐藏模式的切换,理论上不需要检查屏幕是否允许任务栏停靠 - QScreen *curScreen = DIS_INS->screen(m_ds.current()); + const QString currentScreen = DOCK_SCREEN->current(); + QScreen *curScreen = DIS_INS->screen(currentScreen); if (!DIS_INS->canDock(curScreen, m_position)) { - m_ds.updateDockedScreen(getValidScreen(m_position)); + DOCK_SCREEN->updateDockedScreen(getValidScreen(m_position)); } qInfo() << "hidestate change:" << m_hideMode << m_hideState; if (m_hideMode == HideMode::KeepShowing || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { - displayAnimation(m_ds.current(), AniAction::Show); + Q_EMIT requestPlayAnimation(currentScreen, m_position, Dock::AniAction::Show); } else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) { - // 如果鼠标正在任务栏要显示的区域,就可以不用隐藏(相当于智能隐藏被唤醒一样) - if (getDockShowGeometry(m_ds.current(), m_position, m_displayMode).contains(QCursor::pos())) - return; - displayAnimation(m_ds.current(), AniAction::Hide); + // 最后一个参数,当任务栏的隐藏状态发生变化的时候(从一直显示变成一直隐藏或者智能隐藏),需要考虑鼠标是否在任务栏上,如果在任务栏上,此时无需执行隐藏动画 + Q_EMIT requestPlayAnimation(currentScreen, m_position, Dock::AniAction::Hide, true); } } void MultiScreenWorker::onOpacityChanged(const double value) { - if (int(m_opacity * 100) == int(value * 100)) return; + if (int(m_opacity * 100) == int(value * 100)) + return; m_opacity = value; @@ -659,7 +498,6 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor() break; } - if (!m_touchRectList.contains(monitorRect)) { m_touchRectList << monitorRect; } @@ -671,31 +509,6 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor() m_touchRegisterKey = m_touchEventInter->RegisterAreas(m_touchRectList, flags); } -void MultiScreenWorker::onRequestUpdateFrontendGeometry() -{ - const QRect rect = dockRectWithoutScale(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); - - //!!! 向com.deepin.dde.daemon.Dock的SetFrontendWindowRect接口设置区域时,此区域的高度或宽度不能为0,否则会导致其HideState属性循环切换,造成任务栏循环显示或隐藏 - if (rect.width() == 0 || rect.height() == 0) - return; - -#ifdef QT_DEBUG - qDebug() << rect; -#endif - - m_dockInter->SetFrontendWindowRect(int(rect.x()), int(rect.y()), uint(rect.width()), uint(rect.height())); - emit requestUpdateDockEntry(); -} - -void MultiScreenWorker::onRequestUpdateLayout() -{ - parent()->panel()->setFixedSize(dockRect(m_ds.current(), position(), HideMode::KeepShowing, displayMode()).size()); - parent()->panel()->move(0, 0); - parent()->panel()->setDisplayMode(displayMode()); - parent()->panel()->setPositonValue(position()); - parent()->panel()->update(); -} - /** * @brief 判断屏幕是否为复制模式的依据,第一个屏幕的X和Y值是否和其他的屏幕的X和Y值相等 * 对于复制模式,这两个值肯定是相等的,如果不是复制模式,这两个值肯定不等,目前支持双屏 @@ -717,147 +530,17 @@ bool MultiScreenWorker::isCopyMode() return true; } -/** - * @brief 这里用到xcb去设置任务栏的高度,比较特殊,参考_NET_WM_STRUT_PARTIAL属性 - * 在屏幕旋转后,所有参数以控制中心自定义设置里主屏显示的图示为准(旋转不用特殊处理) - */ -void MultiScreenWorker::onRequestNotifyWindowManager() -{ - static QRect lastRect = QRect(); - static int lastScreenWidth = 0; - static int lastScreenHeight = 0; - - /* 在非主屏或非一直显示状态时,清除任务栏区域,不挤占应用 */ - if ((!DIS_INS->isCopyMode() && m_ds.current() != m_ds.primary()) || m_hideMode != HideMode::KeepShowing) { - lastRect = QRect(); - - if (Utils::IS_WAYLAND_DISPLAY) { - QList varList; - varList.append(0);//dock位置 - varList.append(0);//dock高度/宽度 - varList.append(0);//start值 - varList.append(0);//end值 - if (parent()->windowHandle()->handle()) { - QGuiApplication::platformNativeInterface()->setWindowProperty(parent()->windowHandle()->handle(),"_d_dwayland_dockstrut", varList); - } - } else { - const auto display = QX11Info::display(); - if (!display) { - qWarning() << "QX11Info::display() is " << display; - return; - } - - XcbMisc::instance()->clear_strut_partial(xcb_window_t(parent()->winId())); - } - - return; - } - - QRect dockGeometry = getDockShowGeometry(m_ds.current(), m_position, m_displayMode, true); - if (lastRect == dockGeometry - && lastScreenWidth == DIS_INS->screenRawWidth() - && lastScreenHeight == DIS_INS->screenRawHeight()) { - return; - } - - lastRect = dockGeometry; - lastScreenWidth = DIS_INS->screenRawWidth(); - lastScreenHeight = DIS_INS->screenRawHeight(); - qDebug() << "dock real geometry:" << dockGeometry; - qDebug() << "screen width:" << DIS_INS->screenRawWidth() << ", height:" << DIS_INS->screenRawHeight(); - - const qreal &ratio = qApp->devicePixelRatio(); - if (Utils::IS_WAYLAND_DISPLAY) { - QList varList = {0, 0, 0, 0}; - switch (m_position) { - case Position::Top: - varList[0] = 1; - varList[1] = dockGeometry.y() + dockGeometry.height() + WINDOWMARGIN * ratio; - varList[2] = dockGeometry.x(); - varList[3] = dockGeometry.x() + dockGeometry.width(); - break; - case Position::Bottom: - varList[0] = 3; - varList[1] = DIS_INS->screenRawHeight() - dockGeometry.y() + WINDOWMARGIN * ratio; - varList[2] = dockGeometry.x(); - varList[3] = dockGeometry.x() + dockGeometry.width(); - break; - case Position::Left: - varList[0] = 0; - varList[1] = dockGeometry.x() + dockGeometry.width() + WINDOWMARGIN * ratio; - varList[2] = dockGeometry.y(); - varList[3] = dockGeometry.y() + dockGeometry.height(); - break; - case Position::Right: - varList[0] = 2; - varList[1] = DIS_INS->screenRawWidth() - dockGeometry.x() + WINDOWMARGIN * ratio; - varList[2] = dockGeometry.y(); - varList[3] = dockGeometry.y() + dockGeometry.height(); - break; - } - - if (parent()->windowHandle()->handle()) { - QGuiApplication::platformNativeInterface()->setWindowProperty(parent()->windowHandle()->handle(),"_d_dwayland_dockstrut", varList); - } - } else { - XcbMisc::Orientation orientation = XcbMisc::OrientationTop; - double strut = 0; - double strutStart = 0; - double strutEnd = 0; - - switch (m_position) { - case Position::Top: - orientation = XcbMisc::OrientationTop; - strut = dockGeometry.y() + dockGeometry.height(); - strutStart = dockGeometry.x(); - strutEnd = dockGeometry.x() + dockGeometry.width(); - break; - case Position::Bottom: - orientation = XcbMisc::OrientationBottom; - strut = DIS_INS->screenRawHeight() - dockGeometry.y(); - strutStart = dockGeometry.x(); - strutEnd = dockGeometry.x() + dockGeometry.width(); - break; - case Position::Left: - orientation = XcbMisc::OrientationLeft; - strut = dockGeometry.x() + dockGeometry.width(); - strutStart = dockGeometry.y(); - strutEnd = dockGeometry.y() + dockGeometry.height(); - break; - case Position::Right: - orientation = XcbMisc::OrientationRight; - strut = DIS_INS->screenRawWidth() - dockGeometry.x(); - strutStart = dockGeometry.y(); - strutEnd = dockGeometry.y() + dockGeometry.height(); - break; - } - - qDebug() << "set reserved area to xcb:" << strut << strutStart << strutEnd; - - const auto display = QX11Info::display(); - if (!display) { - qWarning() << "QX11Info::display() is " << display; - return; - } - - XcbMisc::instance()->set_strut_partial(static_cast(parent()->winId()), orientation, - static_cast(strut + WINDOWMARGIN * ratio), // 设置窗口与屏幕边缘距离,需要乘缩放 - static_cast(strutStart), // 设置任务栏起点坐标(上下为x,左右为y) - static_cast(strutEnd)); // 设置任务栏终点坐标(上下为x,左右为y) - } -} - void MultiScreenWorker::onRequestUpdatePosition(const Position &fromPos, const Position &toPos) { qInfo() << "request change pos from: " << fromPos << " to: " << toPos; // 更新要切换到的屏幕 - if (!DIS_INS->canDock(DIS_INS->screen(m_ds.current()), m_position)) - m_ds.updateDockedScreen(getValidScreen(m_position)); + if (!DIS_INS->canDock(DIS_INS->screen(DOCK_SCREEN->current()), m_position)) + DOCK_SCREEN->updateDockedScreen(getValidScreen(m_position)); - qInfo() << "update allow screen: " << m_ds.current(); + qInfo() << "update allow screen: " << DOCK_SCREEN->current(); // 无论什么模式,都先显示 - changeDockPosition(m_ds.last(), m_ds.current(), fromPos, toPos); + changeDockPosition(DOCK_SCREEN->last(), DOCK_SCREEN->current(), fromPos, toPos); } void MultiScreenWorker::onRequestUpdateMonitorInfo() @@ -879,55 +562,28 @@ void MultiScreenWorker::onRequestDelayShowDock() // 复制模式.不需要响应切换屏幕 if (DIS_INS->screens().size() == 2 && DIS_INS->screens().first()->geometry() == DIS_INS->screens().last()->geometry()) { qInfo() << "copy mode or merge mode"; - parent()->setFixedSize(dockRect(m_ds.current()).size()); - parent()->setGeometry(dockRect(m_ds.current())); + Q_EMIT requestUpdateDockGeometry(m_hideMode); return; } - m_ds.updateDockedScreen(m_delayScreen); + DOCK_SCREEN->updateDockedScreen(m_delayScreen); // 检查当前屏幕的当前位置是否允许显示,不允许需要更新显示信息(这里应该在函数外部就处理好,不应该走到这里) // 检查边缘是否允许停靠 QScreen *curScreen = DIS_INS->screen(m_delayScreen); if (curScreen && DIS_INS->canDock(curScreen, m_position)) { if (m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) { - displayAnimation(m_ds.current(), AniAction::Show); + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Hide); } else if (m_hideMode == HideMode::KeepShowing) { - changeDockPosition(m_ds.last(), m_ds.current(), m_position, m_position); + changeDockPosition(DOCK_SCREEN->last(), DOCK_SCREEN->current(), m_position, m_position); } } } -void MultiScreenWorker::onChildSizeChanged() -{ - // 如果当前为隐藏,则无需再次设置其尺寸 - if (parent()->height() == 0) - return; - - QSize dockSize = dockRect(m_ds.current(), position(), HideMode::KeepShowing, displayMode()).size(); - parent()->move(dockRect(m_ds.current()).topLeft()); - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - parent()->setFixedWidth(dockSize.width()); - parent()->panel()->setFixedWidth(dockSize.width()); - } else { - parent()->setFixedHeight(dockSize.height()); - parent()->panel()->setFixedHeight(dockSize.height()); - } - - parent()->panel()->move(0, 0); - parent()->panel()->update(); -} - -MainWindow *MultiScreenWorker::parent() -{ - return static_cast(m_parent); -} - void MultiScreenWorker::initMembers() { m_monitorUpdateTimer->setInterval(100); m_monitorUpdateTimer->setSingleShot(true); - parent()->panel()->setDockScreen(&m_ds); m_delayWakeTimer->setSingleShot(true); @@ -940,10 +596,8 @@ void MultiScreenWorker::initMembers() void MultiScreenWorker::initConnection() { - connect(qApp, &QApplication::primaryScreenChanged, this, &MultiScreenWorker::primaryScreenChanged); - connect(DIS_INS, &DisplayManager::primaryScreenChanged, this, &MultiScreenWorker::primaryScreenChanged); + connect(DIS_INS, &DisplayManager::primaryScreenChanged, this, &MultiScreenWorker::onPrimaryScreenChanged); connect(DIS_INS, &DisplayManager::screenInfoChanged, this, &MultiScreenWorker::requestUpdateMonitorInfo); - connect(parent()->panel(), &MainPanelControl::requestUpdate, this, &MultiScreenWorker::onChildSizeChanged); connect(m_launcherInter, static_cast(&DBusLuncher::VisibleChanged), this, [ = ](bool value) { setStates(LauncherDisplay, value); }); @@ -960,36 +614,21 @@ void MultiScreenWorker::initConnection() this, SLOT(handleDbusSignal(QDBusMessage))); #endif - connect(this, &MultiScreenWorker::requestUpdateFrontendGeometry, this, &MultiScreenWorker::onRequestUpdateFrontendGeometry); connect(this, &MultiScreenWorker::requestUpdatePosition, this, &MultiScreenWorker::onRequestUpdatePosition); - connect(this, &MultiScreenWorker::requestNotifyWindowManager, this, &MultiScreenWorker::onRequestNotifyWindowManager); connect(this, &MultiScreenWorker::requestUpdateMonitorInfo, this, &MultiScreenWorker::onRequestUpdateMonitorInfo); connect(m_delayWakeTimer, &QTimer::timeout, this, &MultiScreenWorker::onRequestDelayShowDock); - // 更新任务栏内容展示方式 - connect(this, &MultiScreenWorker::requestUpdateLayout, this, &MultiScreenWorker::onRequestUpdateLayout); - // 刷新所有显示的内容,布局,方向,大小,位置等 connect(m_monitorUpdateTimer, &QTimer::timeout, this, &MultiScreenWorker::updateDisplay); } void MultiScreenWorker::initUI() { - // 设置界面大小 - parent()->setFixedSize(dockRect(m_ds.current()).size()); - parent()->move(dockRect(m_ds.current()).topLeft()); - parent()->panel()->setFixedSize(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode).size()); - parent()->panel()->move(0, 0); - onPositionChanged(dockInter()->position()); onDisplayModeChanged(dockInter()->displayMode()); onHideModeChanged(dockInter()->hideMode()); - onHideStateChanged(dockInter()->hideState()); onOpacityChanged(m_dockInter->opacity()); - - // 初始化透明度 - QTimer::singleShot(0, this, [ = ] {onOpacityChanged(m_dockInter->opacity());}); } void MultiScreenWorker::initDockMode() @@ -1001,8 +640,6 @@ void MultiScreenWorker::initDockMode() m_displayMode = static_cast(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); @@ -1033,136 +670,6 @@ void MultiScreenWorker::reInitDisplayData() initDisplayData(); } -/** - * @brief MultiScreenWorker::displayAnimation - * 任务栏显示或隐藏过程的动画。 - * @param screen 任务栏要显示的屏幕 - * @param pos 任务栏显示的位置(上:0,右:1,下:2,左:3) - * @param act 显示(隐藏)任务栏 - * @return void - */ -void MultiScreenWorker::displayAnimation(const QString &screen, const Position &pos, AniAction act) -{ - if (!testState(AutoHide) || qApp->property("DRAG_STATE").toBool() - || testState(ChangePositionAnimationStart) - || testState(HideAnimationStart) - || testState(ShowAnimationStart)) - return; - - QRect mainwindowRect = parent()->geometry(); - QRect dockShowRect = getDockShowGeometry(screen, pos, m_displayMode); - QRect dockHideRect = getDockHideGeometry(screen, pos, m_displayMode); - - /** FIXME - * 在高分屏2.75倍缩放的情况下,parent()->geometry()返回的任务栏高度有问题(实际是40,返回是39) - * 在这里增加判断,当返回值在范围(38,42)开区间内,均认为任务栏显示位置正确,直接返回,不执行动画 - * 也就是在实际值基础上下浮动1像素的误差范围 - * 正常屏幕情况下是没有这个问题的 - */ - switch (act) { - case AniAction::Show: - if (pos == Position::Top || pos == Position::Bottom) { - if (qAbs(dockShowRect.height() - mainwindowRect.height()) <= 1 - && mainwindowRect.contains(dockShowRect.center())) { - emit requestNotifyWindowManager(); - return; - } - } else if (pos == Position::Left || pos == Position::Right) { - if (qAbs(dockShowRect.width() - mainwindowRect.width()) <= 1 - && mainwindowRect.contains(dockShowRect.center())) { - emit requestNotifyWindowManager(); - return; - } - } - break; - case AniAction::Hide: - if (dockHideRect == mainwindowRect) { - emit requestNotifyWindowManager(); - return; - } - break; - } - - QVariantAnimation *ani = new QVariantAnimation(this); - ani->setEasingCurve(QEasingCurve::InOutCubic); - -#ifndef DISABLE_SHOW_ANIMATION - const bool composite = m_wmHelper->hasComposite(); // 判断是否开启特效模式 - const int duration = composite ? ANIMATIONTIME : 0; -#else - const int duration = 0; -#endif - ani->setDuration(duration); - - ani->setStartValue(dockHideRect); - ani->setEndValue(dockShowRect); - - switch (act) { - case AniAction::Show: - ani->setDirection(QAbstractAnimation::Forward); - connect(ani, &QVariantAnimation::finished, this, &MultiScreenWorker::showAniFinished); - connect(this, &MultiScreenWorker::requestStopShowAni, ani, &QVariantAnimation::stop); - break; - - case AniAction::Hide: - ani->setDirection(QAbstractAnimation::Backward); // 隐藏时动画反向走 - connect(ani, &QVariantAnimation::finished, this, &MultiScreenWorker::hideAniFinished); - connect(this, &MultiScreenWorker::requestStopHideAni, ani, &QVariantAnimation::stop); - break; - } - - connect(ani, &QVariantAnimation::valueChanged, this, static_cast(&MultiScreenWorker::updateParentGeometry)); - - connect(ani, &QVariantAnimation::stateChanged, this, [ = ](QAbstractAnimation::State newState, QAbstractAnimation::State oldState) { - // 更新动画是否正在进行的信号值 - switch (act) { - case AniAction::Show: - if (newState == QVariantAnimation::Running && oldState == QVariantAnimation::Stopped) { - if (m_hideMode == HideMode::KeepShowing || duration) - setStates(ShowAnimationStart); - else - setStates(DockIsShowing); - } - if (newState == QVariantAnimation::Stopped && oldState == QVariantAnimation::Running) { - if (m_hideMode == HideMode::KeepShowing || duration) - setStates(ShowAnimationStart, false); - else // 如果不是一直显示的状态,则让其延时修改状态,防止在resetDock的时候重复改变其高度引起任务栏闪烁导致无法唤醒 - QTimer::singleShot(ANIMATIONTIME, [ = ] { setStates(DockIsShowing, false); }); - } - break; - case AniAction::Hide: - if (newState == QVariantAnimation::Running && oldState == QVariantAnimation::Stopped) { - setStates(HideAnimationStart); - } - if (newState == QVariantAnimation::Stopped && oldState == QVariantAnimation::Running) { - setStates(HideAnimationStart, false); - } - break; - } - }); - - parent()->panel()->setFixedSize(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode).size()); - parent()->panel()->move(0, 0); - - emit requestStopShowAni(); - emit requestStopHideAni(); - emit requestUpdateLayout(); - - ani->start(QVariantAnimation::DeleteWhenStopped); -} - -/** - * @brief MultiScreenWorker::displayAnimation - * 任务栏显示或隐藏过程的动画。 - * @param screen 任务栏要显示的屏幕 - * @param act 显示(隐藏)任务栏 - * @return void - */ -void MultiScreenWorker::displayAnimation(const QString &screen, AniAction act) -{ - return displayAnimation(screen, m_position, act); -} - /** * @brief changeDockPosition 做一个动画操作 * @param fromScreen 上次任务栏所在的屏幕 @@ -1177,101 +684,13 @@ void MultiScreenWorker::changeDockPosition(QString fromScreen, QString toScreen, return; } + // 该动画放到WindowManager中来实现 // 更新屏幕信息 - m_ds.updateDockedScreen(toScreen); + DOCK_SCREEN->updateDockedScreen(toScreen); // TODO: 考虑切换过快的情况,这里需要停止上一次的动画,可增加信号控制,暂时无需要 qInfo() << "from: " << fromScreen << " to: " << toScreen; - - QSequentialAnimationGroup *group = new QSequentialAnimationGroup(this); - - QVariantAnimation *ani1 = new QVariantAnimation(group); - QVariantAnimation *ani2 = new QVariantAnimation(group); - - // 初始化动画信息 - ani1->setEasingCurve(QEasingCurve::InOutCubic); - ani2->setEasingCurve(QEasingCurve::InOutCubic); - - const bool composite = m_wmHelper->hasComposite(); -#ifndef DISABLE_SHOW_ANIMATION - const int duration = composite ? ANIMATIONTIME : 0; -#else - const int duration = 0; -#endif - - ani1->setDuration(duration); - ani2->setDuration(duration); - - // 隐藏 - ani1->setStartValue(getDockShowGeometry(fromScreen, fromPos, m_displayMode)); - ani1->setEndValue(getDockHideGeometry(fromScreen, fromPos, m_displayMode)); - qDebug() << fromScreen << "hide from :" << getDockShowGeometry(fromScreen, fromPos, m_displayMode); - qDebug() << fromScreen << "hide to :" << getDockHideGeometry(fromScreen, fromPos, m_displayMode); - - // 显示 - ani2->setStartValue(getDockHideGeometry(toScreen, toPos, m_displayMode)); - ani2->setEndValue(getDockShowGeometry(toScreen, toPos, m_displayMode)); - qDebug() << toScreen << "show from :" << getDockHideGeometry(toScreen, toPos, m_displayMode); - qDebug() << toScreen << "show to :" << getDockShowGeometry(toScreen, toPos, m_displayMode); - - group->addAnimation(ani1); - group->addAnimation(ani2); - - // 隐藏时固定一下内容大小 - connect(ani1, &QVariantAnimation::stateChanged, this, [ = ](QAbstractAnimation::State newState, QAbstractAnimation::State oldState) { - if (newState == QVariantAnimation::Running && oldState == QVariantAnimation::Stopped) { - parent()->panel()->setFixedSize(dockRect(fromScreen, fromPos, HideMode::KeepShowing, m_displayMode).size()); - parent()->panel()->move(0, 0); - } - }); - - connect(ani1, &QVariantAnimation::valueChanged, this, [ = ](const QVariant & value) { - updateParentGeometry(value, fromPos); - }); - - // 显示时固定一下内容大小 - connect(ani2, &QVariantAnimation::stateChanged, this, [ = ](QAbstractAnimation::State newState, QAbstractAnimation::State oldState) { - // 位置发生变化时需要更新位置属性,且要在隐藏动画之后,显示动画之前 - DockItem::setDockPosition(m_position); - qApp->setProperty(PROP_POSITION, QVariant::fromValue(m_position)); - - if (newState == QVariantAnimation::Running && oldState == QVariantAnimation::Stopped) { - parent()->panel()->setFixedSize(dockRect(toScreen, toPos, HideMode::KeepShowing, m_displayMode).size()); - parent()->panel()->move(0, 0); - } - }); - - connect(ani2, &QVariantAnimation::valueChanged, this, [ = ](const QVariant & value) { - updateParentGeometry(value, toPos); - }); - - // 如果更改了显示位置,在显示之前应该更新一下界面布局方向 - if (fromPos != toPos) - connect(ani1, &QVariantAnimation::finished, this, [ = ] { - const auto display = QX11Info::display(); - if (!display) { - qWarning() << "QX11Info::display() is " << display; - } else { - // 先清除原先的窗管任务栏区域 - //XcbMisc::instance()->clear_strut_partial(xcb_window_t(parent()->winId())); - } - - // 隐藏后需要通知界面更新布局方向 - emit requestUpdateLayout(); - }); - - connect(group, &QVariantAnimation::finished, this, [ = ] { - setStates(ChangePositionAnimationStart, false); - - // 结束之后需要根据确定需要再隐藏 - emit showAniFinished(); - emit requestUpdateFrontendGeometry(); - emit requestNotifyWindowManager(); - }); - - setStates(ChangePositionAnimationStart); - - group->start(QVariantAnimation::DeleteWhenStopped); + Q_EMIT requestChangeDockPosition(fromScreen, toScreen, fromPos, toPos); } /** @@ -1281,10 +700,10 @@ void MultiScreenWorker::changeDockPosition(QString fromScreen, QString toScreen, QString MultiScreenWorker::getValidScreen(const Position &pos) { //TODO 考虑在主屏幕名变化时自动更新,是不是就不需要手动处理了 - m_ds.updatePrimary(DIS_INS->primary()); + DOCK_SCREEN->updatePrimary(DIS_INS->primary()); - if (DIS_INS->canDock(DIS_INS->screen(m_ds.current()), pos)) - return m_ds.current(); + if (DIS_INS->canDock(DIS_INS->screen(DOCK_SCREEN->current()), pos)) + return DOCK_SCREEN->current(); if (DIS_INS->canDock(qApp->primaryScreen(), pos)) return DIS_INS->primary(); @@ -1305,21 +724,12 @@ void MultiScreenWorker::resetDockScreen() if (testState(ChangePositionAnimationStart) || testState(HideAnimationStart) || testState(ShowAnimationStart) - || testState(DockIsShowing) || testState(DockIsDraging)) return; - m_ds.updateDockedScreen(getValidScreen(position())); + DOCK_SCREEN->updateDockedScreen(getValidScreen(position())); // 更新任务栏自身信息 - /** - *注意这里要先对parent()进行setFixedSize,在分辨率切换过程中,setGeometry可能会导致其大小未改变 - */ - QRect currentRect = dockRect(m_ds.current()); - QSize dockSize = currentRect.size(); - parent()->setFixedSize(dockSize); - parent()->setGeometry(currentRect); - parent()->panel()->setFixedSize(dockSize); - parent()->panel()->move(0, 0); + Q_EMIT requestUpdateDockGeometry(m_hideMode); } /** @@ -1471,180 +881,9 @@ 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((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(screenRect.x() + margin)); - rect.setY(static_cast(screenRect.y() + margin)); - rect.setWidth(static_cast(screenRect.width() / ratio - 2 * margin)); - rect.setHeight(dockSize); - break; - case Position::Bottom: - rect.setX(static_cast(screenRect.x() + margin)); - rect.setY(static_cast(screenRect.y() + screenRect.height() / ratio - margin - dockSize)); - rect.setWidth(static_cast(screenRect.width() / ratio - 2 * margin)); - rect.setHeight(dockSize); - break; - case Position::Left: - rect.setX(static_cast(screenRect.x() + margin)); - rect.setY(static_cast(screenRect.y() + margin)); - rect.setWidth(dockSize); - rect.setHeight(static_cast(screenRect.height() / ratio - 2 * margin)); - break; - case Position::Right: - rect.setX(static_cast(screenRect.x() + screenRect.width() / ratio - margin - dockSize)); - rect.setY(static_cast(screenRect.y() + margin)); - rect.setWidth(dockSize); - rect.setHeight(static_cast(screenRect.height() / ratio - 2 * margin)); - break; - } - } - } - return rect; -} - -/** - * @brief 获取任务栏显示时的参数。目前多屏情况下缩放保持一致,如果后续缩放规则修改,这里需要重新调整 - * - * @param screenName 当前屏幕名字 - * @param pos 任务栏位置 - * @param displaymode 任务栏显示模式 - * @param withoutScale 是否考虑缩放(true:获取的是真实值; false:获取的是前端认为的值(默认)) - * @return QRect 任务栏参数 - */ -QRect MultiScreenWorker::getDockShowGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode, bool withoutScale) -{ - QRect rect; - const double ratio = withoutScale ? 1 : qApp->devicePixelRatio(); - const int margin = static_cast((displaymode == DisplayMode::Fashion ? 10 : 0) * (withoutScale ? qApp->devicePixelRatio() : 1)); - const int dockSize = static_cast((displaymode == DisplayMode::Fashion ? m_dockInter->windowSizeFashion() : m_dockInter->windowSizeEfficient()) * (withoutScale ? qApp->devicePixelRatio() : 1)); - - for (auto s : DIS_INS->screens()) { - if (s->name() == screenName) { - // 拿到当前显示器缩放之前的分辨率 - QRect screenRect = s->handle()->geometry(); - - switch (pos) { - case Position::Top: { - QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); - rect.setX(screenRect.x() + (static_cast(screenRect.width() / ratio) - panelSize.width()) / 2); - rect.setY(screenRect.y() + static_cast(margin / ratio)); - rect.setWidth(panelSize.width()); - rect.setHeight(dockSize); - } - break; - case Position::Bottom: { - // 先用设置屏幕尺寸,理论上不应该在此处设置,因为这是在一个get方法里面,后续改成直接获取,在其他地方设置 - QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); - rect.setX(screenRect.x() + (static_cast(screenRect.width() / ratio) - panelSize.width()) / 2); - rect.setY(screenRect.y() + static_cast(screenRect.height() / ratio - margin - dockSize)); - rect.setWidth(panelSize.width()); - rect.setHeight(dockSize); - } - break; - case Position::Left: { - QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); - rect.setX(screenRect.x() + margin); - rect.setY((screenRect.y() + static_cast(screenRect.height() / ratio) - panelSize.height()) / 2); - rect.setWidth(dockSize); - rect.setHeight(panelSize.height()); - } - break; - case Position::Right: { - QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); - rect.setX(screenRect.x() + static_cast(screenRect.width() / ratio - margin - dockSize)); - rect.setY((screenRect.y() + static_cast(screenRect.height() / ratio) - panelSize.height()) / 2); - rect.setWidth(dockSize); - rect.setHeight(panelSize.height()); - } - break; - } - } - } - return rect; -} - -/** - * @brief 获取任务栏隐藏时的参数。目前多屏情况下缩放保持一致,如果后续缩放规则修改,这里需要重新调整 - * - * @param screenName 当前屏幕名字 - * @param pos 任务栏位置 - * @param displaymode 任务栏显示模式 - * @param withoutScale 是否考虑缩放(true:获取的是真实值; false:获取的是前端认为的值(默认)) - * @return QRect 任务栏参数 - */ -QRect MultiScreenWorker::getDockHideGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode, bool withoutScale) -{ - QRect rect; - const double ratio = withoutScale ? 1 : qApp->devicePixelRatio(); - const int margin = static_cast((displaymode == DisplayMode::Fashion ? 10 : 0) * (withoutScale ? qApp->devicePixelRatio() : 1)); - - for (auto s : DIS_INS->screens()) { - if (s->name() == screenName) { - // 拿到当前显示器缩放之前的分辨率 - QRect screenRect = s->handle()->geometry(); - - switch (pos) { - case Position::Top: { - QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); - rect.setX(screenRect.x() + static_cast((screenRect.width() / ratio - panelSize.width()) / 2)); - rect.setY(screenRect.y() + margin); - rect.setWidth(panelSize.width()); - rect.setHeight(0); - } - break; - case Position::Bottom: { - QSize panelSize = parent()->panel()->suitableSize(screenRect.width(), ratio); - rect.setX(screenRect.x() + static_cast((screenRect.width() / ratio - panelSize.width()) / 2)); - rect.setY(screenRect.y() + static_cast(screenRect.height() / ratio - margin)); - rect.setWidth(panelSize.width()); - rect.setHeight(0); - } - break; - case Position::Left: { - QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); - rect.setX(screenRect.x() + margin); - rect.setY(screenRect.y() + static_cast(static_cast((screenRect.height() / ratio - panelSize.height()) / 2))); - rect.setWidth(0); - rect.setHeight(panelSize.height()); - } - break; - case Position::Right: - QSize panelSize = parent()->panel()->suitableSize(screenRect.height(), ratio); - rect.setX(screenRect.x() + static_cast(screenRect.width() / ratio - margin)); - rect.setY(screenRect.y() + static_cast(static_cast((screenRect.height() / ratio - panelSize.height()) / 2))); - rect.setWidth(0); - rect.setHeight(panelSize.height()); - break; - } - } - } - return rect; -} - -QScreen *MultiScreenWorker::screenByName(const QString &screenName) -{ - foreach (QScreen *screen, qApp->screens()) { - if (screen->name() == screenName) - return screen; - } - return nullptr; -} - bool MultiScreenWorker::onScreenEdge(const QString &screenName, const QPoint &point) { - QScreen *screen = screenByName(screenName); + QScreen *screen = DIS_INS->screen(screenName); if (screen) { const QRect r { screen->geometry() }; const QRect rect { r.topLeft(), r.size() *screen->devicePixelRatio() }; @@ -1730,27 +969,22 @@ void MultiScreenWorker::onTouchRelease(int type, int x, int y, const QString &ke void MultiScreenWorker::onDelayAutoHideChanged() { switch (m_hideMode) { - case HideMode::KeepHidden: - { - // 这时候鼠标如果在任务栏上,就不能隐藏 - if (!parent()->geometry().contains(QCursor::pos())) - displayAnimation(m_ds.current(), AniAction::Hide); - } + case HideMode::KeepHidden: { + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Hide, true); break; + } case HideMode::SmartHide: { if (m_hideState == HideState::Show) - { - displayAnimation(m_ds.current(), AniAction::Show); - } else if (m_hideState == HideState::Hide) { - displayAnimation(m_ds.current(), AniAction::Hide); - } - } - break; - case HideMode::KeepShowing: - displayAnimation(m_ds.current(), AniAction::Show); + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Show); + else if (m_hideState == HideState::Hide) + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Hide); break; } - + case HideMode::KeepShowing: { + Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Show); + break; + } + } } /** @@ -1779,8 +1013,9 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY) * 使用screenAtByScaled获取屏幕名时,实际上获取的不一定是当前屏幕 * 举例:点(100,100)不在(0,0,100,100)的屏幕上 */ - if (onScreenEdge(m_ds.current(), QPoint(eventX, eventY))) { - toScreen = m_ds.current(); + const QString ¤tScreen = DOCK_SCREEN->current(); + if (onScreenEdge(currentScreen, QPoint(eventX, eventY))) { + toScreen = currentScreen; } // 过滤重复坐标 @@ -1791,7 +1026,7 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY) lastPos = QPoint(eventX, eventY); // 任务栏显示状态,但需要切换屏幕 - if (toScreen != m_ds.current()) { + if (toScreen != currentScreen) { if (!m_delayWakeTimer->isActive()) { m_delayScreen = toScreen; m_delayWakeTimer->start(Utils::SettingValue("com.deepin.dde.dock.mainwindow", "/com/deepin/dde/dock/mainwindow/", MonitorsSwitchTime, 2000).toInt()); @@ -1799,8 +1034,7 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY) } else { // 任务栏隐藏状态,但需要显示 if (hideMode() == HideMode::KeepShowing) { - parent()->setFixedSize(dockRect(m_ds.current()).size()); - parent()->setGeometry(dockRect(m_ds.current())); + Q_EMIT requestUpdateDockGeometry(m_hideMode); return; } @@ -1809,11 +1043,8 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY) return; } - const QRect boundRect = parent()->visibleRegion().boundingRect(); - qDebug() << "boundRect:" << boundRect; - if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) - && (boundRect.size().isEmpty())) { - displayAnimation(m_ds.current(), AniAction::Show); + if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide)) { + Q_EMIT requestPlayAnimation(currentScreen, m_position, Dock::AniAction::Show); } } } diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index af9e38eef..f82f77cd0 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -50,6 +50,9 @@ DGUI_USE_NAMESPACE * 任务栏的鼠标唤醒区域或任务栏的大小没更新或者更新时的大小还是按照原来的屏幕信息计算而来的, */ +#define DRAG_AREA_SIZE (5) +#define DOCKSPACE (WINDOWMARGIN * 2) + using XEventMonitor = ::com::deepin::api::XEventMonitor; using DBusLuncher = ::com::deepin::dde::Launcher; @@ -59,46 +62,13 @@ class QWidget; class QTimer; class MainWindow; class QGSettings; - -/** - * @brief The DockScreen class - * 保存任务栏的屏幕信息 - */ -class DockScreen -{ -public: - explicit DockScreen(const QString &primary) - : m_currentScreen(primary) - , m_lastScreen(primary) - , m_primary(primary) - {} - inline const QString ¤t() const {return m_currentScreen;} - inline const QString &last() const {return m_lastScreen;} - inline const QString &primary() const {return m_primary;} - - void updateDockedScreen(const QString &screenName) - { - m_lastScreen = m_currentScreen; - m_currentScreen = screenName; - } - - void updatePrimary(const QString &primary) - { - m_primary = primary; - if (m_currentScreen.isEmpty()) { - updateDockedScreen(primary); - } - } - -private: - QString m_currentScreen; - QString m_lastScreen; - QString m_primary; -}; +class TrayMainWindow; +class MenuWorker; class MultiScreenWorker : public QObject { Q_OBJECT + public: enum Flag { Motion = 1 << 0, @@ -106,11 +76,6 @@ public: Key = 1 << 2 }; - enum AniAction { - Show = 0, - Hide - }; - enum RunState { ShowAnimationStart = 0x1, // 单次显示动画正在运行状态 HideAnimationStart = 0x2, // 单次隐藏动画正在运行状态 @@ -119,8 +84,7 @@ public: MousePress = 0x10, // 当前鼠标是否被按下 TouchPress = 0x20, // 当前触摸屏下是否按下 LauncherDisplay = 0x40, // 启动器是否显示 - DockIsShowing = 0x80, // 任务栏正在显示 - DockIsDraging = 0x100, // 任务栏正在拖拽 + DockIsDraging = 0x80, // 任务栏正在拖拽 // 如果要添加新的状态,可以在上面添加 RunState_Mask = 0xffffffff, @@ -128,48 +92,41 @@ public: typedef QFlags RunStates; - MultiScreenWorker(QWidget *parent, DWindowManagerHelper *helper); - - void initShow(); + explicit MultiScreenWorker(QObject *parent = Q_NULLPTR); + ~MultiScreenWorker() override; DockInter *dockInter() { return m_dockInter; } + void updateDaemonDockSize(const int &dockSize); inline bool testState(RunState state) { return (m_state & state); } void setStates(RunStates state, bool on = true); - inline const QString &lastScreen() { return m_ds.last(); } - inline const QString &deskScreen() { return m_ds.current(); } inline const Position &position() { return m_position; } inline const DisplayMode &displayMode() { return m_displayMode; } inline const HideMode &hideMode() { return m_hideMode; } inline const HideState &hideState() { return m_hideState; } inline quint8 opacity() { return m_opacity * 255; } - QRect dockRect(const QString &screenName, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode); - QRect dockRect(const QString &screenName); - QRect getDockShowMinGeometry(const QString &screenName, bool withoutScale = false); - signals: void opacityChanged(const quint8 value) const; - void displayModeChanegd(); + void displayModeChanged(const Dock::DisplayMode &); // 更新监视区域 void requestUpdateRegionMonitor(); // 更新监听区域 void requestUpdateFrontendGeometry(); //!!! 给后端的区域不能为是或宽度为0的区域,否则会带来HideState死循环切换的bug void requestNotifyWindowManager(); void requestUpdatePosition(const Position &fromPos, const Position &toPos); - void requestUpdateLayout(); // 界面需要根据任务栏更新布局的方向 - void requestUpdateDragArea(); // 更新拖拽区域 void requestUpdateMonitorInfo(); // 屏幕信息发生变化,需要更新任务栏大小,拖拽区域,所在屏幕,监控区域,通知窗管,通知后端, - void requestStopShowAni(); - void requestStopHideAni(); + // 用来通知WindowManager的信号 + void requestUpdateDockGeometry(const Dock::HideMode &hideMode); + void positionChanged(const Dock::Position &position); - void requestUpdateDockEntry(); + void requestPlayAnimation(const QString &screenName, const Position &position, const Dock::AniAction &animation, bool containMouse = false, bool updatePos = false); + void requestChangeDockPosition(const QString &fromScreen, const QString &toScreen, const Position &fromPos, const Position &toPos); public slots: - void onAutoHideChanged(bool autoHide); - void updateDaemonDockSize(int dockSize); + void onAutoHideChanged(const bool autoHide); void onRequestUpdateRegionMonitor(); #ifndef USE_AM @@ -181,16 +138,10 @@ private slots: void onRegionMonitorChanged(int x, int y, const QString &key); void onExtralRegionMonitorChanged(int x, int y, const QString &key); - // Animation - void showAniFinished(); - void hideAniFinished(); - void updateDisplay(); void onWindowSizeChanged(uint value); - void primaryScreenChanged(); - void updateParentGeometry(const QVariant &value, const Position &pos); - void updateParentGeometry(const QVariant &value); + void onPrimaryScreenChanged(); // 任务栏属性变化 void onPositionChanged(int position); @@ -199,11 +150,6 @@ private slots: void onHideStateChanged(int state); void onOpacityChanged(const double value); - // 通知后端任务栏所在位置 - void onRequestUpdateFrontendGeometry(); - - void onRequestUpdateLayout(); - void onRequestNotifyWindowManager(); void onRequestUpdatePosition(const Position &fromPos, const Position &toPos); void onRequestUpdateMonitorInfo(); void onRequestDelayShowDock(); @@ -214,46 +160,33 @@ private slots: void onDelayAutoHideChanged(); - // 子部件尺寸发生变化 - void onChildSizeChanged(); - private: - MainWindow *parent(); // 初始化数据信息 void initMembers(); void initDockMode(); void initConnection(); void initUI(); + void initDisplayData(); void reInitDisplayData(); - void displayAnimation(const QString &screen, const Position &pos, AniAction act); - void displayAnimation(const QString &screen, AniAction act); - void tryToShowDock(int eventX, int eventY); void changeDockPosition(QString fromScreen, QString toScreen, const Position &fromPos, const Position &toPos); - QString getValidScreen(const Position &pos); void resetDockScreen(); void checkDaemonDockService(); void checkXEventMonitorService(); - QRect dockRectWithoutScale(const QString &screenName, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode); + QString getValidScreen(const Position &pos); - QRect getDockShowGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode, bool withoutScale = false); - QRect getDockHideGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode, bool withoutScale = false); bool isCursorOut(int x, int y); - QScreen *screenByName(const QString &screenName); bool onScreenEdge(const QString &screenName, const QPoint &point); const QPoint rawXPosition(const QPoint &scaledPos); static bool isCopyMode(); private: - QWidget *m_parent; - DWindowManagerHelper *m_wmHelper; - // monitor screen XEventMonitor *m_eventInter; XEventMonitor *m_extralEventInter; @@ -267,8 +200,6 @@ private: QTimer *m_monitorUpdateTimer; QTimer *m_delayWakeTimer; // sp3需求,切换屏幕显示延时,默认2秒唤起任务栏 - DockScreen m_ds; // 屏幕名称信息 - // 任务栏属性 double m_opacity; Position m_position; diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index dc8fe195b..88c022944 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -122,10 +122,15 @@ void DateTimeDisplayer::updatePolicy() } } -QSize DateTimeDisplayer::suitableSize() +QSize DateTimeDisplayer::suitableSize() const { - DateTimeInfo info = dateTimeInfo(); - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + return suitableSize(m_position); +} + +QSize DateTimeDisplayer::suitableSize(const Dock::Position &position) const +{ + DateTimeInfo info = dateTimeInfo(position); + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { int width = info.m_timeRect.width() + info.m_dateRect.width() + 16; return QSize(width, height()); } @@ -151,7 +156,7 @@ void DateTimeDisplayer::mouseReleaseEvent(QMouseEvent *event) .method("Toggle").call(); } -QString DateTimeDisplayer::getTimeString() const +QString DateTimeDisplayer::getTimeString(const Dock::Position &position) const { QString tFormat = QString("hh:mm"); int type = m_timedateInter->shortTimeFormat(); @@ -159,7 +164,7 @@ QString DateTimeDisplayer::getTimeString() const tFormat = timeFormat[type]; if (!m_timedateInter->use24HourFormat()) { - if (m_position == Dock::Top || m_position == Dock::Bottom) + if (position == Dock::Top || position == Dock::Bottom) tFormat = tFormat.append(" AP"); else tFormat = tFormat.append("\nAP"); @@ -169,13 +174,18 @@ QString DateTimeDisplayer::getTimeString() const } QString DateTimeDisplayer::getDateString() const +{ + return getDateString(m_position); +} + +QString DateTimeDisplayer::getDateString(const Dock::Position &position) const { int type = m_timedateInter->shortDateFormat(); QString shortDateFormat = "yyyy-MM-dd"; if (dateFormat.contains(type)) shortDateFormat = dateFormat.value(type); // 如果是左右方向,则不显示年份 - if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) { + if (position == Dock::Position::Left || position == Dock::Position::Right) { static QStringList yearStrList{"yyyy/", "yyyy-", "yyyy.", "yy/", "yy-", "yy."}; for (int i = 0; i < yearStrList.size() ; i++) { const QString &yearStr = yearStrList[i]; @@ -189,16 +199,16 @@ QString DateTimeDisplayer::getDateString() const return QDateTime::currentDateTime().toString(shortDateFormat); } -DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo() +DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Position &position) const { DateTimeInfo info; info.m_timeRect = rect(); info.m_dateRect = rect(); - info.m_time = getTimeString(); - info.m_date = getDateString(); + info.m_time = getTimeString(position); + info.m_date = getDateString(position); - if (m_position == Dock::Top || m_position == Dock::Bottom) { + if (position == Dock::Top || position == Dock::Bottom) { int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width() + 3; int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height()); @@ -243,7 +253,7 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e) { Q_UNUSED(e); - DateTimeInfo info = dateTimeInfo(); + DateTimeInfo info = dateTimeInfo(m_position); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); @@ -383,3 +393,8 @@ void DateTimeDisplayer::updateLastData(const DateTimeInfo &info) else m_currentSize = dateTimeSize.height(); } + +QString DateTimeDisplayer::getTimeString() const +{ + return getTimeString(m_position); +} diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index 693db0b53..2c933c07d 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -52,7 +52,8 @@ public: ~DateTimeDisplayer() override; void setPositon(Dock::Position position); void setOneRow(bool oneRow); - QSize suitableSize(); + QSize suitableSize() const; + QSize suitableSize(const Dock::Position &position) const; Q_SIGNALS: void requestUpdate(); // 当日期时间格式发生变化的时候,需要通知外面来更新窗口尺寸 @@ -67,11 +68,13 @@ protected: private: void updatePolicy(); - DateTimeInfo dateTimeInfo(); + DateTimeInfo dateTimeInfo(const Dock::Position &position) const; void updateLastData(const DateTimeInfo &info); QString getTimeString() const; + QString getTimeString(const Dock::Position &position) const; QString getDateString() const; + QString getDateString(const Dock::Position &position) const; QPoint tipsPoint() const; QFont timeFont() const; diff --git a/frame/window/components/dragwidget.cpp b/frame/window/components/dragwidget.cpp new file mode 100644 index 000000000..38aef59c9 --- /dev/null +++ b/frame/window/components/dragwidget.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "dragwidget.h" +#include "utils.h" +#include "constants.h" + +#include +#include + +DragWidget::DragWidget(QWidget *parent) + : QWidget(parent) + , m_dragStatus(false) +{ + setObjectName("DragWidget"); +} + +bool DragWidget::isDraging() const +{ + return m_dragStatus; +} + +void DragWidget::onTouchMove(double scaleX, double scaleY) +{ + Q_UNUSED(scaleX); + Q_UNUSED(scaleY); + + static QPoint lastPos; + QPoint curPos = QCursor::pos(); + if (lastPos == curPos) { + return; + } + lastPos = curPos; + qApp->postEvent(this, new QMouseEvent(QEvent::MouseMove, mapFromGlobal(curPos) + , QPoint(), curPos, Qt::LeftButton, Qt::LeftButton + , Qt::NoModifier, Qt::MouseEventSynthesizedByApplication)); +} + +void DragWidget::mousePressEvent(QMouseEvent *event) +{ + // qt转发的触屏按下信号不进行响应 + if (event->source() == Qt::MouseEventSynthesizedByQt) + return; + + if (event->button() == Qt::LeftButton) { + m_resizePoint = event->globalPos(); + m_dragStatus = true; + this->grabMouse(); + } +} + +void DragWidget::mouseMoveEvent(QMouseEvent *) +{ + if (m_dragStatus) { + QPoint offset = QPoint(QCursor::pos() - m_resizePoint); + emit dragPointOffset(offset); + } +} + +void DragWidget::mouseReleaseEvent(QMouseEvent *) +{ + if (!m_dragStatus) + return; + + m_dragStatus = false; + releaseMouse(); + emit dragFinished(); +} + +void DragWidget::enterEvent(QEvent *) +{ + if (Utils::IS_WAYLAND_DISPLAY) + updateCursor(); + else + QApplication::setOverrideCursor(cursor()); +} + +void DragWidget::leaveEvent(QEvent *) +{ + QApplication::setOverrideCursor(Qt::ArrowCursor); +} + +void DragWidget::updateCursor() +{ + QString theme = Utils::SettingValue("com.deepin.xsettings", "/com/deepin/xsettings/", "gtk-cursor-theme-name", "bloom").toString(); + int cursorSize = Utils::SettingValue("com.deepin.xsettings", "/com/deepin/xsettings/", "gtk-cursor-theme-size", 24).toInt(); + Dock::Position position = static_cast(qApp->property("position").toInt()); + + static QString lastTheme; + static int lastPosition = -1; + static int lastCursorSize = -1; + if (theme != lastTheme || position != lastPosition || cursorSize != lastCursorSize) { + lastTheme = theme; + lastPosition = position; + lastCursorSize = cursorSize; + const char* cursorName = (position == Dock::Position::Bottom || position == Dock::Position::Top) ? "v_double_arrow" : "h_double_arrow"; + QCursor *newCursor = ImageUtil::loadQCursorFromX11Cursor(theme.toStdString().c_str(), cursorName, cursorSize); + if (!newCursor) + return; + + setCursor(*newCursor); + static QCursor *lastCursor = nullptr; + if (lastCursor) + delete lastCursor; + + lastCursor = newCursor; + } +} diff --git a/frame/window/components/dragwidget.h b/frame/window/components/dragwidget.h new file mode 100644 index 000000000..d19f9a2af --- /dev/null +++ b/frame/window/components/dragwidget.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef DRAGWIDGET_H +#define DRAGWIDGET_H + +#include + +class DragWidget : public QWidget +{ + Q_OBJECT + +public: + explicit DragWidget(QWidget *parent = nullptr); + + bool isDraging() const; + +public Q_SLOTS: + void onTouchMove(double scaleX, double scaleY); + +Q_SIGNALS: + void dragPointOffset(QPoint); + void dragFinished(); + +protected: + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *) override; + void mouseReleaseEvent(QMouseEvent *) override; + void enterEvent(QEvent *) override; + void leaveEvent(QEvent *) override; + +private: + void updateCursor(); + +private: + bool m_dragStatus; + QPoint m_resizePoint; +}; + +#endif // DRAGWIDGET_H diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 495e75a67..8548449d1 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -31,7 +31,6 @@ #include "utils.h" #include "desktop_widget.h" #include "imageutil.h" -#include "traymanagerwindow.h" #include "multiscreenworker.h" #include "displaymanager.h" #include "recentapphelper.h" @@ -39,7 +38,7 @@ #include "multiwindowhelper.h" #include "mainwindow.h" #include "appmultiitem.h" -#include "multiwindowhelper.h" +#include "dockscreen.h" #include #include @@ -66,16 +65,10 @@ #define PLUGIN_MAX_SIZE 40 #define PLUGIN_MIN_SIZE 20 #define DESKTOP_SIZE 10 -// 任务栏圆角最小的时候,任务栏的高度值 -#define MINRADIUSSIZE 46 -// 任务栏圆角最小值和最大值的差值 -#define MAXDIFFVALUE 6 -// 最小圆角值 -#define MINRADIUS 12 DWIDGET_USE_NAMESPACE -MainPanelControl::MainPanelControl(QWidget *parent) +MainPanelControl::MainPanelControl(DockInter *dockInter, QWidget *parent) : QWidget(parent) , m_mainPanelLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_fixedAreaWidget(new QWidget(this)) @@ -98,7 +91,6 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_multiWindowLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_multiWindowWidget)) , m_toolSonAreaWidget(new QWidget(m_toolAreaWidget)) , m_toolSonLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_toolSonAreaWidget)) - , m_trayManagerWidget(new TrayManagerWindow(this)) , m_pluginLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_desktopWidget(new DesktopWidget(this)) , m_position(Position::Bottom) @@ -106,10 +98,9 @@ MainPanelControl::MainPanelControl(QWidget *parent) , m_appDragWidget(nullptr) , m_displayMode(Efficient) , m_tray(nullptr) - , m_dockScreen(nullptr) - , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) + , m_dockInter(dockInter) , m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, m_dockInter, this)) - , m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolAreaWidget, this)) + , m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolSonAreaWidget, this)) , m_multiHelper(new MultiWindowHelper(m_appAreaSonWidget, m_multiWindowWidget, this)) { initUI(); @@ -161,6 +152,7 @@ void MainPanelControl::initUI() m_recentAreaWidget->setLayout(m_recentLayout); m_recentLayout->setSpacing(0); m_recentLayout->setContentsMargins(0, 0, 0, 0); + m_recentLayout->setAlignment(Qt::AlignCenter); m_mainPanelLayout->addWidget(m_recentAreaWidget); m_recentSpliter->setObjectName("spliter_recent"); @@ -206,10 +198,6 @@ 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); - /* 桌面预览 */ m_desktopWidget->setObjectName("showdesktoparea"); m_mainPanelLayout->addWidget(m_desktopWidget); @@ -224,7 +212,6 @@ void MainPanelControl::initUI() void MainPanelControl::initConnection() { - connect(m_trayManagerWidget, &TrayManagerWindow::requestUpdate, this, &MainPanelControl::onRequestUpdate); connect(m_recentHelper, &RecentAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate); connect(m_recentHelper, &RecentAppHelper::recentVisibleChanged, this, &MainPanelControl::onRecentVisibleChanged); connect(m_recentHelper, &RecentAppHelper::dockAppVisibleChanged, this, &MainPanelControl::onDockAppVisibleChanged); @@ -261,13 +248,15 @@ 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); m_trayAreaLayout->setDirection(QBoxLayout::LeftToRight); m_appAreaSonLayout->setDirection(QBoxLayout::LeftToRight); m_recentLayout->setDirection(QBoxLayout::LeftToRight); + m_multiWindowLayout->setDirection(QBoxLayout::LeftToRight); + m_toolAreaLayout->setDirection(QBoxLayout::LeftToRight); + m_toolSonLayout->setDirection(QBoxLayout::LeftToRight); m_trayAreaLayout->setContentsMargins(0, 10, 0, 10); m_pluginLayout->setContentsMargins(10, 0, 10, 0); m_multiWindowLayout->setContentsMargins(0, 2, 0, 2); @@ -278,13 +267,15 @@ 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); m_trayAreaLayout->setDirection(QBoxLayout::TopToBottom); m_appAreaSonLayout->setDirection(QBoxLayout::TopToBottom); m_recentLayout->setDirection(QBoxLayout::TopToBottom); + m_multiWindowLayout->setDirection(QBoxLayout::TopToBottom); + m_toolAreaLayout->setDirection(QBoxLayout::TopToBottom); + m_toolSonLayout->setDirection(QBoxLayout::TopToBottom); m_trayAreaLayout->setContentsMargins(10, 0, 10, 0); m_pluginLayout->setContentsMargins(0, 10, 0, 10); m_multiWindowLayout->setContentsMargins(2, 0, 2, 0); @@ -364,14 +355,6 @@ void MainPanelControl::resizeEvent(QResizeEvent *event) QWidget::resizeEvent(event); resizeDesktopWidget(); resizeDockIcon(); - resetRadius(); -} - -void MainPanelControl::resetRadius() -{ - int size = ((m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) ? height() : width()); - int radius = qMin(MAXDIFFVALUE, qMax(size - MINRADIUSSIZE, 0)) + MINRADIUS; - qApp->setProperty("EffectBorderRadius", radius); } /** 当用户从最近使用区域拖动应用到左侧应用区域的时候,将该应用驻留 @@ -407,12 +390,10 @@ void MainPanelControl::updateAppAreaSonWidgetSize() m_appAreaSonWidget->setMaximumHeight(height()); m_appAreaSonWidget->setMaximumWidth(m_appAreaWidget->width()); m_recentAreaWidget->setFixedHeight(height()); - //m_toolAreaWidget->setFixedHeight(height()); } else { m_appAreaSonWidget->setMaximumWidth(width()); m_appAreaSonWidget->setMaximumHeight(m_appAreaWidget->height()); m_recentAreaWidget->setFixedWidth(width()); - //m_toolAreaWidget->setFixedWidth(width()); } m_appAreaSonWidget->adjustSize(); @@ -429,10 +410,7 @@ void MainPanelControl::setPositonValue(Dock::Position position) return; m_position = position; - QMetaObject::invokeMethod(this, [ this ] { - m_trayManagerWidget->setPositon(m_position); - updateMainPanelLayout(); - }, Qt::QueuedConnection); + QMetaObject::invokeMethod(this, &MainPanelControl::updateMainPanelLayout, Qt::QueuedConnection); } /**向任务栏插入各类应用,并将属于同一个应用的窗口合并到同一个应用图标 @@ -903,7 +881,6 @@ void MainPanelControl::startDrag(DockItem *dockItem) if (item->itemType() == DockItem::App) { // 判断是否在回收站区域, 如果在回收站区域,则移除驻留 - PluginsItem *trashItem = m_toolHelper->trashPlugin(); if (!trashItem) return; @@ -1060,49 +1037,9 @@ void MainPanelControl::updatePluginsLayout() } } } - m_trayManagerWidget->updateLayout(); } -void MainPanelControl::setDockScreen(DockScreen *dockScreen) -{ - m_dockScreen = dockScreen; -} - -QPainterPath MainPanelControl::areaPath() -{ - if (m_displayMode == DisplayMode::Efficient) - return QPainterPath(); - - int radius = qApp->property("EffectBorderRadius").toInt(); - QPainterPath path; - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - int leftWidth = m_fixedAreaWidget->width() + m_fixedSpliter->width() + m_appAreaWidget->width(); - if (m_recentLayout->count() > 0) - leftWidth += m_recentAreaWidget->width(); - - if (m_toolAreaLayout->count() > 0) - leftWidth += m_toolAreaWidget->width(); - - int roundHeight = height(); - path.addRoundedRect(QRect(0, 0, leftWidth, roundHeight), radius, radius); - path.addRoundedRect(QRect(m_trayManagerWidget->x(), 0, m_trayManagerWidget->width(), roundHeight), radius, radius); - } else { - int roundWidth = width(); - int topHeight = m_fixedAreaWidget->height() + m_fixedSpliter->height() + m_appAreaWidget->height(); - if (m_recentLayout->count() > 0) - topHeight += m_recentAreaWidget->height(); - - if (m_toolAreaLayout->count() > 0) - topHeight += m_toolAreaWidget->height(); - - path.addRoundedRect(QRect(0, 0, roundWidth, topHeight), radius, radius); - path.addRoundedRect(QRect(0, m_trayManagerWidget->y(), roundWidth, m_trayManagerWidget->height()), radius, radius); - } - - return path; -} - -QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const +QSize MainPanelControl::suitableSize(const Position &position, int screenSize, double deviceRatio) const { if (screenSize <= 0) return QSize(-1, -1); @@ -1111,60 +1048,85 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const if (ratio <= 0) ratio = qApp->devicePixelRatio(); + int dockSize = ((position == Position::Top || position == Position::Bottom) ? height() : width()); + // 如果实际的尺寸超过了任务栏允许的最大尺寸,此时可能是在发生位置变换,这个时候使用接口获取的尺寸即可 + // 如果任务栏在隐藏状态,那么此时获取到的高度为0,此时从后端获取任务栏的实际高度 + HideState hideState = static_cast(qApp->property(PROP_HIDE_STATE).toInt()); + if (dockSize > DOCK_MAX_SIZE || hideState == HideState::Hide) + dockSize = static_cast((m_displayMode == DisplayMode::Efficient ? m_dockInter->windowSizeEfficient() : m_dockInter->windowSizeFashion()) * qApp->devicePixelRatio()); + if (m_displayMode == DisplayMode::Efficient) { // 如果是高效模式 - if (m_position == Position::Top || m_position == Position::Bottom) - return QSize(static_cast(screenSize / ratio), height()); + if (position == Position::Top || position == Position::Bottom) + return QSize(static_cast(screenSize / ratio), dockSize); - return QSize(width(), static_cast(screenSize / ratio)); + return QSize(dockSize, static_cast(screenSize / ratio)); } - QSize traySuitableSize = m_trayManagerWidget->suitableSize(); // 如果是特效模式 int totalLength = static_cast(screenSize / ratio); - // 减去右侧托盘和快捷设置还有插件区域的尺寸 - totalLength -= (((m_position == Position::Top || m_position == Position::Bottom) ? traySuitableSize.width() : traySuitableSize.height()) / ratio); // 需要参与计算的图标的总数 - int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count() + m_toolAreaLayout->count(); - if (iconCount <= 0) { - if (m_position == Position::Top || m_position == Position::Bottom) - return QSize((static_cast((traySuitableSize.width() + 20) / ratio)), height()); + int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count() + m_toolSonLayout->count(); + int multiWindowCount = m_multiWindowLayout->count(); + if (iconCount <= 0 && multiWindowCount <= 0) { + if (position == Position::Top || position == Position::Bottom) + return QSize((static_cast(dockSize / ratio)), dockSize); - return QSize(width(), static_cast((traySuitableSize.height() + 20) / ratio)); + return QSize(dockSize, static_cast(dockSize / ratio)); } - int redundantLength = (totalLength % iconCount); // icon宽度 = (总宽度-余数)/icon个数 - int iconSize = (totalLength - redundantLength) / iconCount; + int iconSize = qMin(((totalLength - redundantLength) / iconCount), dockSize); - if (m_position == Position::Top || m_position == Position::Bottom) { - iconSize = qMin(iconSize, height()); - int spliterWidth = m_fixedSpliter->isVisible() ? m_fixedSpliter->width() : 0; + if (position == Position::Top || position == Position::Bottom) { + int spliterWidth = m_fixedSpliter->isVisible() ? SPLITER_SIZE : 0; if (m_appSpliter->isVisible()) - spliterWidth += m_appSpliter->width(); + spliterWidth += SPLITER_SIZE; if (m_recentSpliter->isVisible()) - spliterWidth += m_recentSpliter->isVisible(); + spliterWidth += SPLITER_SIZE; - int panelWidth = qMin(iconSize * iconCount + static_cast((spliterWidth + traySuitableSize.width() + 20) / ratio), - static_cast(screenSize / deviceRatio)); + int multiSize = 0; + // 计算每个多开窗口的尺寸 + if (multiWindowCount > 0) { + for (int i = 0; i < multiWindowCount; i++) { + AppMultiItem *multiItem = qobject_cast(m_multiWindowLayout->itemAt(i)->widget()); + if (!multiItem) + continue; - return QSize(panelWidth, static_cast(height() / ratio)); + multiSize += multiItem->width(); + } + } + + int panelWidth = qMin(iconSize * iconCount + multiSize + static_cast(spliterWidth / ratio), + static_cast((screenSize - DOCKSPACE) / deviceRatio)); + + return QSize(panelWidth, static_cast(dockSize / ratio)); } - iconSize = iconSize < width() ? iconSize : width(); - - int spliterHeight = m_fixedSpliter->isVisible() ? m_fixedSpliter->height() : 0; + int spliterHeight = m_fixedSpliter->isVisible() ? SPLITER_SIZE : 0; if (m_appSpliter->isVisible()) - spliterHeight += m_appSpliter->height(); + spliterHeight += SPLITER_SIZE; if (m_recentSpliter->isVisible()) - spliterHeight += m_recentSpliter->height(); + spliterHeight += SPLITER_SIZE; - int panelHeight = qMin(iconSize * iconCount + static_cast((spliterHeight + traySuitableSize.height() + 20) / ratio), - static_cast(screenSize / deviceRatio)); + int multiSize = 0; + // 计算每个多开窗口的尺寸 + if (multiWindowCount > 0) { + for (int i = 0; i < multiWindowCount; i++) { + AppMultiItem *multiItem = qobject_cast(m_multiWindowLayout->itemAt(i)->widget()); + if (!multiItem) + continue; - return QSize(width(), panelHeight); + multiSize += multiItem->height(); + } + } + + int panelHeight = qMin(iconSize * iconCount + multiSize + static_cast(spliterHeight / ratio), + static_cast((screenSize - DOCKSPACE)/ deviceRatio)); + + return QSize(dockSize, panelHeight); } void MainPanelControl::itemUpdated(DockItem *item) @@ -1204,12 +1166,10 @@ void MainPanelControl::paintEvent(QPaintEvent *event) int MainPanelControl::getScreenSize() const { QScreen *currentScreen = qApp->primaryScreen(); - if (m_dockScreen) { - DisplayManager *displayManager = DisplayManager::instance(); - QScreen *screen = displayManager->screen(m_dockScreen->current()); - if (screen) - currentScreen = screen; - } + DisplayManager *displayManager = DisplayManager::instance(); + QScreen *screen = displayManager->screen(DockScreen::instance()->current()); + if (screen) + currentScreen = screen; QRect screenRect = currentScreen->handle()->geometry(); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) @@ -1225,15 +1185,11 @@ void MainPanelControl::resizeDockIcon() { int iconSize = 0; int tray_item_size = 0; - int iconCount = 0; // 总宽度 if (m_displayMode == DisplayMode::Fashion) { + int iconCount = 0; // 时尚模式 int totalLength = getScreenSize(); - QSize trayManagerSize = m_trayManagerWidget->suitableSize(); - // 减去右侧托盘和插件区域的宽度 - totalLength -= ((m_position == Position::Top) || (m_position == Position::Bottom)) ? trayManagerSize.width() : trayManagerSize.height(); - iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count(); if (m_recentAreaWidget->isVisible()) iconCount += m_recentLayout->count(); @@ -1251,7 +1207,7 @@ void MainPanelControl::resizeDockIcon() // 计算插件图标的最大或最小值 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 = qMin(tray_item_size, height()); tray_item_size = std::min(tray_item_size, height() - 20); } else { tray_item_size = qMin(tray_item_size,width()); @@ -1356,12 +1312,13 @@ void MainPanelControl::resizeDockIcon() calcuDockIconSize(width(), iconSize, tray_item_size); } } + + Q_EMIT requestUpdate(); } void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) { int appItemSize = qMin(w, h); - for (int i = 0; i < m_fixedAreaLayout->count(); ++i) m_fixedAreaLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); @@ -1552,20 +1509,8 @@ void MainPanelControl::resizeDesktopWidget() { if (m_position == Position::Right || m_position == Position::Left) { m_desktopWidget->setFixedSize(QWIDGETSIZE_MAX, DESKTOP_SIZE); - m_trayManagerWidget->setFixedWidth(QWIDGETSIZE_MAX); - m_trayManagerWidget->updateLayout(); - QSize suitableSize = m_trayManagerWidget->suitableSize(); - m_trayManagerWidget->setFixedHeight(suitableSize.height()); } else { m_desktopWidget->setFixedSize(DESKTOP_SIZE, QWIDGETSIZE_MAX); - // 在调整尺寸过程中,先设置高度,然后更新布局,因为更新布局的时候,里面的 - // Layout需要根据高度来调整布局的部件间距和边距,此时返回的尺寸会有所变化 - // 等布局更新后,再获取返回的尺寸来设置右侧的宽度 - // 如果是左右位置,原理一样 - m_trayManagerWidget->setFixedHeight(QWIDGETSIZE_MAX); - m_trayManagerWidget->updateLayout(); - QSize suitableSize = m_trayManagerWidget->suitableSize(); - m_trayManagerWidget->setFixedWidth(suitableSize.width()); } if (DisplayMode::Fashion == m_displayMode) diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index ef13a72c9..82e32e498 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -39,8 +39,6 @@ class DockItem; class PlaceholderItem; class AppDragWidget; class DesktopWidget; -class TrayManagerWindow; -class DockScreen; class RecentAppHelper; class ToolAppHelper; class MultiWindowHelper; @@ -50,16 +48,14 @@ class MainPanelControl : public QWidget Q_OBJECT public: - explicit MainPanelControl(QWidget *parent = nullptr); + explicit MainPanelControl(DockInter *dockInter, QWidget *parent = nullptr); void setPositonValue(Position position); void setDisplayMode(DisplayMode dislayMode); void resizeDockIcon(); void updatePluginsLayout(); - void setDockScreen(DockScreen *dockScreen); - QPainterPath areaPath(); - QSize suitableSize(int screenSize, double deviceRatio) const; + QSize suitableSize(const Position &position, int screenSize, double deviceRatio) const; public slots: void insertItem(const int index, DockItem *item); @@ -96,7 +92,6 @@ private: void resizeDesktopWidget(); bool checkNeedShowDesktop(); bool appIsOnDock(const QString &appDesktop); - void resetRadius(); void dockRecentApp(DockItem *dockItem); private Q_SLOTS: @@ -140,7 +135,6 @@ private: QWidget *m_toolSonAreaWidget; // 工具区域,用来存放回收站等工具 QBoxLayout *m_toolSonLayout; // 工具区域布局 - TrayManagerWindow *m_trayManagerWidget; QBoxLayout *m_pluginLayout; // 插件区域布局 DesktopWidget *m_desktopWidget; // 桌面预览区域 @@ -153,7 +147,6 @@ private: TrayPluginItem *m_tray; int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置 - DockScreen *m_dockScreen; DockInter *m_dockInter; RecentAppHelper *m_recentHelper; ToolAppHelper *m_toolHelper; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 3f1a55a62..fb4d05462 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -25,6 +25,12 @@ #include "dockitemmanager.h" #include "menuworker.h" #include "proxyplugincontroller.h" +#include "windowmanager.h" +#include "dockscreen.h" +#include "dragwidget.h" +#include "multiscreenworker.h" +#include "constants.h" +#include "displaymanager.h" #include #include @@ -40,321 +46,47 @@ #include #include #include +#include +#include #include #include #include -#define SNI_WATCHER_SERVICE "org.kde.StatusNotifierWatcher" -#define SNI_WATCHER_PATH "/StatusNotifierWatcher" +#define DOCK_SCREEN DockScreen::instance() +#define DIS_INS DisplayManager::instance() -#define MAINWINDOW_MAX_SIZE DOCK_MAX_SIZE -#define MAINWINDOW_MIN_SIZE (40) -#define DRAG_AREA_SIZE (5) - -#define DRAG_STATE_PROP "DRAG_STATE" - -using org::kde::StatusNotifierWatcher; - -// let startdde know that we've already started. -void MainWindow::RegisterDdeSession() +MainWindow::MainWindow(MultiScreenWorker *multiScreenWorker, QWidget *parent) + : MainWindowBase(multiScreenWorker, parent) + , m_mainPanel(new MainPanelControl(multiScreenWorker->dockInter(), this)) + , m_multiScreenWorker(multiScreenWorker) { - QString envName("DDE_SESSION_PROCESS_COOKIE_ID"); - - QByteArray cookie = qgetenv(envName.toUtf8().data()); - qunsetenv(envName.toUtf8().data()); - - if (!cookie.isEmpty()) { - QDBusPendingReply r = DDBusSender() - .interface("com.deepin.SessionManager") - .path("/com/deepin/SessionManager") - .service("com.deepin.SessionManager") - .method("Register") - .arg(QString(cookie)) - .call(); - - qDebug() << Q_FUNC_INFO << r.value(); - } -} - -MainWindow::MainWindow(QWidget *parent) - : DBlurEffectWidget(parent) - , m_mainPanel(new MainPanelControl(this)) - , m_platformWindowHandle(this) - , m_wmHelper(DWindowManagerHelper::instance()) - , m_multiScreenWorker(new MultiScreenWorker(this, m_wmHelper)) - , m_menuWorker(new MenuWorker(m_multiScreenWorker->dockInter(), this)) - , m_shadowMaskOptimizeTimer(new QTimer(this)) - , m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()) - , m_sniWatcher(new StatusNotifierWatcher(SNI_WATCHER_SERVICE, SNI_WATCHER_PATH, QDBusConnection::sessionBus(), this)) - , m_dragWidget(new DragWidget(this)) - , m_launched(false) - , m_updateDragAreaTimer(new QTimer(this)) -{ - setAttribute(Qt::WA_TranslucentBackground); - setAttribute(Qt::WA_X11DoNotAcceptFocus); - - Qt::WindowFlags flags = Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::Window; - //1 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶 - setWindowFlags(windowFlags() | flags | Qt::WindowDoesNotAcceptFocus); - - if (Utils::IS_WAYLAND_DISPLAY) - setWindowFlag(Qt::FramelessWindowHint, false); // 会导致设置圆角为0时无效 - - if (DGuiApplicationHelper::isXWindowPlatform()) { - const auto display = QX11Info::display(); - if (!display) { - qWarning() << "QX11Info::display() is " << display; - } else { - //2 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶 - XcbMisc::instance()->set_window_type(xcb_window_t(this->winId()), XcbMisc::Dock); - } - } - - setMouseTracking(true); - setAcceptDrops(true); - - DPlatformWindowHandle::enableDXcbForWindow(this, true); - m_platformWindowHandle.setEnableBlurWindow(true); - m_platformWindowHandle.setTranslucentBackground(true); - m_platformWindowHandle.setShadowOffset(QPoint(0, 0)); - m_platformWindowHandle.setShadowColor(Qt::transparent); - m_mainPanel->setDisplayMode(m_multiScreenWorker->displayMode()); - initMember(); - initSNIHost(); - initComponents(); initConnections(); - resetDragWindow(); - for (auto item : DockItemManager::instance()->itemList()) m_mainPanel->insertItem(-1, item); - - m_dragWidget->setMouseTracking(true); - m_dragWidget->setFocusPolicy(Qt::NoFocus); - - if (!Utils::IS_WAYLAND_DISPLAY) { - if ((Top == m_multiScreenWorker->position()) || (Bottom == m_multiScreenWorker->position())) { - m_dragWidget->setCursor(Qt::SizeVerCursor); - } else { - m_dragWidget->setCursor(Qt::SizeHorCursor); - } - } -} - -/** - * @brief MainWindow::launch - * 任务栏初次启动时调用此方法,里面是做了一些初始化操作 - */ -void MainWindow::launch() -{ - if (!qApp->property("CANSHOW").toBool()) - return; - - m_launched = true; - m_multiScreenWorker->initShow(); - m_shadowMaskOptimizeTimer->start(); - QTimer::singleShot(0, this, [ this ] { this->setVisible(true); }); -} - -/** - * @brief MainWindow::callShow - * 此方法是被外部进程通过DBus调用的。 - * @note 当任务栏以-r参数启动时,其不会显示界面,需要在外部通过DBus调用此接口之后才会显示界面, - * 这里是以前为了优化任务栏的启动速度做的处理,当任务栏启动时,此时窗管进程可能还未启动完全, - * 部分设置未初始化完等,导致任务栏显示的界面异常,所以留下此接口,被startdde延后调用 - */ -void MainWindow::callShow() -{ - static bool flag = false; - if (flag) { - return; - } - flag = true; - - qApp->setProperty("CANSHOW", true); - - launch(); - - // 预留200ms提供给窗口初始化再通知startdde,不影响启动速度 - QTimer::singleShot(200, this, &MainWindow::RegisterDdeSession); -} - -/** - * @brief MainWindow::relaodPlugins - * 需要重新加载插件时,此接口会被调用,目前是用于任务栏的安全模式退出时调用 - */ -void MainWindow::reloadPlugins() -{ - if (qApp->property("PLUGINSLOADED").toBool()) { - return; - } - - // 发送事件,通知代理来加载插件 - PluginLoadEvent event; - QCoreApplication::sendEvent(qApp, &event); - - qApp->setProperty("PLUGINSLOADED", true); - // 退出安全模式 - qApp->setProperty("safeMode", false); -} - -/** - * @brief MainWindow::mousePressEvent - * @param e - * @note 右键显示任务栏的菜单 - */ -void MainWindow::mousePressEvent(QMouseEvent *e) -{ - e->ignore(); - if (e->button() == Qt::RightButton && this->geometry().contains(QCursor::pos())) { - QTimer::singleShot(10, this, [this]{ - QMenu *menu = new QMenu(this); - m_menuWorker->showDockSettingsMenu(menu); - }); - return; - } -} - -void MainWindow::keyPressEvent(QKeyEvent *e) -{ - switch (e->key()) { -#ifdef QT_DEBUG - case Qt::Key_Escape: qApp->quit(); break; -#endif - default:; - } -} - -void MainWindow::enterEvent(QEvent *e) -{ - QWidget::enterEvent(e); - - if (QApplication::overrideCursor() && QApplication::overrideCursor()->shape() != Qt::ArrowCursor) - QApplication::restoreOverrideCursor(); -} - -void MainWindow::mouseMoveEvent(QMouseEvent *e) -{ - Q_UNUSED(e); - //重写mouseMoveEvent 解决bug12866 leaveEvent事件失效 -} - -void MainWindow::moveEvent(QMoveEvent *event) -{ - Q_UNUSED(event); - - if (!qApp->property(DRAG_STATE_PROP).toBool()) - m_updateDragAreaTimer->start(); } void MainWindow::resizeEvent(QResizeEvent *event) { - if (!qApp->property(DRAG_STATE_PROP).toBool()) - m_updateDragAreaTimer->start(); + MainWindowBase::resizeEvent(event); - // 任务栏大小、位置、模式改变都会触发resize,发射大小改变信号,供依赖项目更新位置 - Q_EMIT panelGeometryChanged(); - - updateMaskArea(); m_mainPanel->updatePluginsLayout(); - m_shadowMaskOptimizeTimer->start(); - - return DBlurEffectWidget::resizeEvent(event); -} - -void MainWindow::initMember() -{ - //INFO 这里要大于动画的300ms,否则可能动画过程中这个定时器就被触发了 - m_updateDragAreaTimer->setInterval(500); - m_updateDragAreaTimer->setSingleShot(true); -} - -/** - * @brief MainWindow::initSNIHost - * @note 将Dock注册到StatusNotifierWatcher服务上 - */ -void MainWindow::initSNIHost() -{ - // registor dock as SNI Host on dbus - QDBusConnection dbusConn = QDBusConnection::sessionBus(); - m_sniHostService = QString("org.kde.StatusNotifierHost-") + QString::number(qApp->applicationPid()); - dbusConn.registerService(m_sniHostService); - dbusConn.registerObject("/StatusNotifierHost", this); - - if (m_sniWatcher->isValid()) { - m_sniWatcher->RegisterStatusNotifierHost(m_sniHostService); - } else { - qDebug() << SNI_WATCHER_SERVICE << "SNI watcher daemon is not exist for now!"; - } -} - -void MainWindow::initComponents() -{ - m_shadowMaskOptimizeTimer->setSingleShot(true); - m_shadowMaskOptimizeTimer->setInterval(100); - - QTimer::singleShot(1, this, &MainWindow::compositeChanged); - - themeTypeChanged(DGuiApplicationHelper::instance()->themeType()); -} - -void MainWindow::compositeChanged() -{ - const bool composite = m_wmHelper->hasComposite(); - setComposite(composite); - - m_shadowMaskOptimizeTimer->start(); + // 任务栏大小、位置、模式改变都会触发resize,发射大小改变信号,供依赖项目更新位置 + Q_EMIT requestUpdate(); } void MainWindow::initConnections() { - connect(m_shadowMaskOptimizeTimer, &QTimer::timeout, this, &MainWindow::adjustShadowMask, Qt::QueuedConnection); - - connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); - connect(&m_platformWindowHandle, &DPlatformWindowHandle::frameMarginsChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); - connect(&m_platformWindowHandle, &DPlatformWindowHandle::windowRadiusChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); - connect(m_mainPanel, &MainPanelControl::requestUpdate, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); - - connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &MainWindow::onDbusNameOwnerChanged); - connect(DockItemManager::instance(), &DockItemManager::itemInserted, m_mainPanel, &MainPanelControl::insertItem, Qt::DirectConnection); connect(DockItemManager::instance(), &DockItemManager::itemRemoved, m_mainPanel, &MainPanelControl::removeItem, Qt::DirectConnection); connect(DockItemManager::instance(), &DockItemManager::itemUpdated, m_mainPanel, &MainPanelControl::itemUpdated, Qt::DirectConnection); connect(DockItemManager::instance(), &DockItemManager::trayVisableCountChanged, this, &MainWindow::resizeDockIcon, Qt::QueuedConnection); - connect(DockItemManager::instance(), &DockItemManager::requestWindowAutoHide, m_menuWorker, &MenuWorker::setAutoHide); connect(m_mainPanel, &MainPanelControl::itemMoved, DockItemManager::instance(), &DockItemManager::itemMoved, Qt::DirectConnection); connect(m_mainPanel, &MainPanelControl::itemAdded, DockItemManager::instance(), &DockItemManager::itemAdded, Qt::DirectConnection); - - // -拖拽任务栏改变高度或宽度------------------------------------------------------------------------------- - connect(m_updateDragAreaTimer, &QTimer::timeout, this, &MainWindow::resetDragWindow); - //TODO 后端考虑删除这块,目前还不能删除,调整任务栏高度的时候,任务栏外部区域有变化 - 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, [ = ] { - 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); // 更新拖拽区域 - // ---------------------------------------------------------------------------------------------------- - - connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &MainWindow::themeTypeChanged); - - connect(m_menuWorker, &MenuWorker::autoHideChanged, m_multiScreenWorker, &MultiScreenWorker::onAutoHideChanged); - - connect(m_multiScreenWorker, &MultiScreenWorker::opacityChanged, this, &MainWindow::setMaskAlpha, Qt::QueuedConnection); - connect(m_multiScreenWorker, &MultiScreenWorker::displayModeChanegd, this, &MainWindow::adjustShadowMask, Qt::QueuedConnection); - - connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateDockEntry, DockItemManager::instance(), &DockItemManager::requestUpdateDockItem); - - // 响应后端触控屏拖拽任务栏高度长按信号 - connect(TouchSignalManager::instance(), &TouchSignalManager::middleTouchPress, this, &MainWindow::touchRequestResizeDock); - connect(TouchSignalManager::instance(), &TouchSignalManager::touchMove, m_dragWidget, &DragWidget::onTouchMove); + connect(m_mainPanel, &MainPanelControl::requestUpdate, this, &MainWindow::requestUpdate); } /** @@ -366,320 +98,77 @@ void MainWindow::resizeDockIcon() m_mainPanel->resizeDockIcon(); } -void MainWindow::updateMaskArea() -{ - QPainterPath path = m_mainPanel->areaPath(); - QPolygon polgon = path.toFillPolygon().toPolygon(); - setMask(polgon); -} - -/** - * @brief MainWindow::adjustShadowMask 更新任务栏的圆角大小(时尚模式下才有圆角效果) - */ -void MainWindow::adjustShadowMask() -{ - if (!m_launched || m_shadowMaskOptimizeTimer->isActive()) - return; - - DStyleHelper dstyle(style()); - int radius = 0; - if (m_wmHelper->hasComposite() && m_multiScreenWorker->displayMode() == DisplayMode::Fashion) { - if (Dtk::Core::DSysInfo::isCommunityEdition()) { // 社区版圆角与专业版不同 - DPlatformTheme *theme = DGuiApplicationHelper::instance()->systemTheme(); - radius = theme->windowRadius(radius); - } else { - QVariant vRadius = qApp->property("EffectBorderRadius"); - if (vRadius.isNull()) - radius = dstyle.pixelMetric(DStyle::PM_TopLevelWindowRadius); - else - radius = vRadius.toInt(); - } - } - - m_platformWindowHandle.setWindowRadius(radius); - m_mainPanel->updatePluginsLayout(); - - updateMaskArea(); -} - -void MainWindow::onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) -{ - Q_UNUSED(oldOwner); - - if (name == SNI_WATCHER_SERVICE && !newOwner.isEmpty()) { - qDebug() << SNI_WATCHER_SERVICE << "SNI watcher daemon started, register dock to watcher as SNI Host"; - m_sniWatcher->RegisterStatusNotifierHost(m_sniHostService); - } -} - -/** - * @brief MainWindow::setEffectEnabled - * @param enabled 根据当前系统是否enabled特效来更新任务栏的外观样式 - */ -void MainWindow::setEffectEnabled(const bool enabled) -{ - Q_UNUSED(enabled); - - setMaskColor(AutoColor); - - setMaskAlpha(m_multiScreenWorker->opacity()); - m_platformWindowHandle.setBorderWidth(0); -} - -/** - * @brief MainWindow::setComposite - * @param hasComposite 系统是否支持混成(也就是特效) - */ -void MainWindow::setComposite(const bool hasComposite) -{ - setEffectEnabled(hasComposite); -} - -/** - * @brief MainWindow::resetDragWindow 更新任务栏的拖拽区域 - * @note 任务栏远离屏幕的一边是支持拖拽的,由一个不可见的widget提拽支持,当任务栏的geometry发生变化的时候,此拖拽区域也需要更新其自身的geometry - */ -void MainWindow::resetDragWindow() -{ - switch (m_multiScreenWorker->position()) { - case Dock::Top: - m_dragWidget->setGeometry(0, height() - DRAG_AREA_SIZE, width(), DRAG_AREA_SIZE); - break; - case Dock::Bottom: - m_dragWidget->setGeometry(0, 0, width(), DRAG_AREA_SIZE); - break; - case Dock::Left: - m_dragWidget->setGeometry(width() - DRAG_AREA_SIZE, 0, DRAG_AREA_SIZE, height()); - break; - case Dock::Right: - m_dragWidget->setGeometry(0, 0, DRAG_AREA_SIZE, height()); - break; - } - - QRect rect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen() - , m_multiScreenWorker->position() - , HideMode::KeepShowing - , m_multiScreenWorker->displayMode()); - - // 这个时候屏幕有可能是隐藏的,不能直接使用this->width()这种去设置任务栏的高度,而应该保证原值 - int dockSize = 0; - if (m_multiScreenWorker->position() == Position::Left - || m_multiScreenWorker->position() == Position::Right) { - dockSize = this->width() == 0 ? rect.width() : this->width(); - } else { - dockSize = this->height() == 0 ? rect.height() : this->height(); - } - - /** FIX ME - * 作用:限制dockSize的值在40~100之间。 - * 问题1:如果dockSize为39,会导致dock的mainwindow高度变成99,显示的内容高度却是39。 - * 问题2:dockSize的值在这里不应该为39,但在高分屏上开启缩放后,拉高任务栏操作会概率出现。 - * 暂时未分析出原因,后面再修改。 - */ - dockSize = qBound(MAINWINDOW_MIN_SIZE, dockSize, MAINWINDOW_MAX_SIZE); - - // 通知窗管和后端更新数据 - m_multiScreenWorker->updateDaemonDockSize(dockSize); // 1.先更新任务栏高度 - m_multiScreenWorker->requestUpdateFrontendGeometry(); // 2.再更新任务栏位置,保证先1再2 - m_multiScreenWorker->requestNotifyWindowManager(); - m_multiScreenWorker->requestUpdateRegionMonitor(); // 界面发生变化,应更新监控区域 - - if ((Top == m_multiScreenWorker->position()) || (Bottom == m_multiScreenWorker->position())) { - m_dragWidget->setCursor(Qt::SizeVerCursor); - } else { - m_dragWidget->setCursor(Qt::SizeHorCursor); - } -} - -void MainWindow::resizeDock(int offset, bool dragging) -{ - qApp->setProperty(DRAG_STATE_PROP, dragging); - - const QRect &rect = m_multiScreenWorker->getDockShowMinGeometry(m_multiScreenWorker->deskScreen()); - QRect newRect; - switch (m_multiScreenWorker->position()) { - 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: { - newRect.setX(rect.x()); - newRect.setY(rect.y() + rect.height() - qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE)); - newRect.setWidth(rect.width()); - newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE)); - } - break; - case Left: { - newRect.setX(rect.x()); - newRect.setY(rect.y()); - 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()); - } - break; - } - - // 更新界面大小 - m_mainPanel->setFixedSize(newRect.size()); - setFixedSize(newRect.size()); - move(newRect.topLeft()); - - if (!dragging) - resetDragWindow(); -} - -/** - * @brief MainWindow::onMainWindowSizeChanged 任务栏拖拽过程中会不听调用此方法更新自身大小 - * @param offset 拖拽时的坐标偏移量 - */ -void MainWindow::onMainWindowSizeChanged(QPoint offset) -{ - const QRect &rect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen() - , m_multiScreenWorker->position() - , HideMode::KeepShowing, - m_multiScreenWorker->displayMode()); - QRect newRect; - switch (m_multiScreenWorker->position()) { - case Top: { - newRect.setX(rect.x()); - newRect.setY(rect.y()); - newRect.setWidth(rect.width()); - newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, rect.height() + offset.y(), MAINWINDOW_MAX_SIZE)); - } - break; - case Bottom: { - newRect.setX(rect.x()); - newRect.setY(rect.y() + rect.height() - qBound(MAINWINDOW_MIN_SIZE, rect.height() - offset.y(), MAINWINDOW_MAX_SIZE)); - newRect.setWidth(rect.width()); - newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, rect.height() - offset.y(), MAINWINDOW_MAX_SIZE)); - } - break; - case Left: { - newRect.setX(rect.x()); - newRect.setY(rect.y()); - newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, rect.width() + offset.x(), MAINWINDOW_MAX_SIZE)); - newRect.setHeight(rect.height()); - } - break; - case Right: { - newRect.setX(rect.x() + rect.width() - qBound(MAINWINDOW_MIN_SIZE, rect.width() - offset.x(), MAINWINDOW_MAX_SIZE)); - newRect.setY(rect.y()); - newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, rect.width() - offset.x(), MAINWINDOW_MAX_SIZE)); - newRect.setHeight(rect.height()); - } - break; - } - - m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, true); - // 更新界面大小 - m_mainPanel->setFixedSize(newRect.size()); - setFixedSize(newRect.size()); - move(newRect.topLeft()); -} - -/** - * @brief MainWindow::themeTypeChanged 系统主题发生变化时,此方法被调用 - * @param themeType 当前系统主题 - */ -void MainWindow::themeTypeChanged(DGuiApplicationHelper::ColorType themeType) -{ - if (m_wmHelper->hasComposite()) { - if (themeType == DGuiApplicationHelper::DarkType) - m_platformWindowHandle.setBorderColor(QColor(0, 0, 0, 255 * 0.3)); - else - m_platformWindowHandle.setBorderColor(QColor(QColor::Invalid)); - } -} - -/** - * @brief MainWindow::touchRequestResizeDock 触屏情况用手指调整任务栏高度或宽度 - */ -void MainWindow::touchRequestResizeDock() -{ - const QPoint touchPos(QCursor::pos()); - QRect dockRect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen() - , m_multiScreenWorker->position() - , HideMode::KeepShowing - , m_multiScreenWorker->displayMode()); - - // 隐藏状态返回 - if (width() == 0 || height() == 0) { - return; - } - - int resizeHeight = Utils::SettingValue("com.deepin.dde.dock.touch", QByteArray(), "resizeHeight", 7).toInt(); - - QRect touchRect; - // 任务栏屏幕 内侧边线 内外resizeHeight距离矩形区域内长按可拖动任务栏高度 - switch (m_multiScreenWorker->position()) { - case Position::Top: - touchRect = QRect(dockRect.x(), dockRect.y() + dockRect.height() - resizeHeight, dockRect.width(), resizeHeight * 2); - break; - case Position::Bottom: - touchRect = QRect(dockRect.x(), dockRect.y() - resizeHeight, dockRect.width(), resizeHeight * 2); - break; - case Position::Left: - touchRect = QRect(dockRect.x() + dockRect.width() - resizeHeight, dockRect.y(), resizeHeight * 2, dockRect.height()); - break; - case Position::Right: - touchRect = QRect(dockRect.x() - resizeHeight, dockRect.y(), resizeHeight * 2, dockRect.height()); - break; - } - - if (!touchRect.contains(touchPos)) { - return; - } - qApp->postEvent(m_dragWidget, new QMouseEvent(QEvent::MouseButtonPress, m_dragWidget->mapFromGlobal(touchPos) - , QPoint(), touchPos, Qt::LeftButton, Qt::NoButton - , Qt::NoModifier, Qt::MouseEventSynthesizedByApplication)); -} - /** * @brief MainWindow::setGeometry * @param rect 设置任务栏的位置和大小,重写此函数时为了及时发出panelGeometryChanged信号,最终供外部DBus调用方使用 */ void MainWindow::setGeometry(const QRect &rect) { - if (rect == this->geometry()) { + if (rect == this->geometry()) return; - } + DBlurEffectWidget::setGeometry(rect); - emit panelGeometryChanged(); + emit requestUpdate(); } -/** - * @brief 当进入安全模式时,通过此方法发送通知告知用户 - */ -void MainWindow::sendNotifications() +MainWindowBase::DockWindowType MainWindow::windowType() const { - QStringList actionButton; - actionButton << "reload" << tr("Exit Safe Mode"); - QVariantMap hints; - hints["x-deepin-action-reload"] = QString("dbus-send,--session,--dest=com.deepin.dde.Dock,--print-reply,/com/deepin/dde/Dock,com.deepin.dde.Dock.ReloadPlugins"); - // 在进入安全模式时,执行此DBUS耗时25S左右,导致任务栏显示阻塞,所以使用线程调用 - QtConcurrent::run(QThreadPool::globalInstance(), [=] { - DDBusSender() - .service("com.deepin.dde.Notification") - .path("/com/deepin/dde/Notification") - .interface("com.deepin.dde.Notification") - .method(QString("Notify")) - .arg(QString("dde-control-center")) // appname - .arg(static_cast(0)) // id - .arg(QString("preferences-system")) // icon - .arg(QString(tr("Dock - Safe Mode"))) // summary - .arg(QString(tr("The Dock is in safe mode, please exit to show it properly"))) // content - .arg(actionButton) // actions - .arg(hints) // hints - .arg(15000) // timeout - .call(); - }); + return DockWindowType::MainWindow; +} + +void MainWindow::setPosition(const Position &position) +{ + MainWindowBase::setPosition(position); + m_mainPanel->setPositonValue(position); + + // 更新鼠标拖拽样式,在类内部设置到qApp单例上去 + if ((Top == position) || (Bottom == position)) + m_mainPanel->setCursor(Qt::SizeVerCursor); + else + m_mainPanel->setCursor(Qt::SizeHorCursor); +} + +void MainWindow::setDisplayMode(const Dock::DisplayMode &displayMode) +{ + m_mainPanel->setDisplayMode(displayMode); + MainWindowBase::setDisplayMode(displayMode); +} + +void MainWindow::updateParentGeometry(const Position &pos, const QRect &rect) +{ + setFixedSize(rect.size()); + setGeometry(rect); + + int panelSize = windowSize(); + QRect panelRect = rect; + switch (pos) { + case Position::Top: + m_mainPanel->move(0, rect.height() - panelSize); + panelRect.setHeight(panelSize); + break; + case Position::Left: + m_mainPanel->move(width() - panelSize, 0); + panelRect.setWidth(panelSize); + break; + case Position::Bottom: + m_mainPanel->move(0, 0); + panelRect.setHeight(panelSize); + break; + case Position::Right: + m_mainPanel->move(0, 0); + panelRect.setWidth(panelSize); + break; + } + m_mainPanel->setFixedSize(panelRect.size()); +} + +QSize MainWindow::suitableSize(const Position &pos, const int &screenSize, const double &deviceRatio) const +{ + return m_mainPanel->suitableSize(pos, screenSize, deviceRatio); +} + +void MainWindow::resetPanelGeometry() +{ + m_mainPanel->setFixedSize(size()); + m_mainPanel->move(0, 0); } diff --git a/frame/window/mainwindow.h b/frame/window/mainwindow.h index 40e4d9a88..2301a0931 100644 --- a/frame/window/mainwindow.h +++ b/frame/window/mainwindow.h @@ -24,17 +24,13 @@ #define MAINWINDOW_H #include "xcb_misc.h" -#include "statusnotifierwatcher_interface.h" -#include "mainpanelcontrol.h" #include "multiscreenworker.h" #include "touchsignalmanager.h" #include "imageutil.h" #include "utils.h" +#include "mainwindowbase.h" #include -#include -#include -#include #include @@ -43,189 +39,41 @@ DWIDGET_USE_NAMESPACE class MainPanelControl; class QTimer; class MenuWorker; -class DragWidget : public QWidget -{ - Q_OBJECT +class QScreen; -private: - bool m_dragStatus; - QPoint m_resizePoint; - -public: - explicit DragWidget(QWidget *parent = nullptr) - : QWidget(parent) - { - setObjectName("DragWidget"); - m_dragStatus = false; - } - -public slots: - void onTouchMove(double scaleX, double scaleY) - { - Q_UNUSED(scaleX); - Q_UNUSED(scaleY); - - static QPoint lastPos; - QPoint curPos = QCursor::pos(); - if (lastPos == curPos) { - return; - } - lastPos = curPos; - qApp->postEvent(this, new QMouseEvent(QEvent::MouseMove, mapFromGlobal(curPos) - , QPoint(), curPos, Qt::LeftButton, Qt::LeftButton - , Qt::NoModifier, Qt::MouseEventSynthesizedByApplication)); - } - -signals: - void dragPointOffset(QPoint); - void dragFinished(); - -private: - void mousePressEvent(QMouseEvent *event) override - { - // qt转发的触屏按下信号不进行响应 - if (event->source() == Qt::MouseEventSynthesizedByQt) { - return; - } - if (event->button() == Qt::LeftButton) { - m_resizePoint = event->globalPos(); - m_dragStatus = true; - this->grabMouse(); - } - } - - void mouseMoveEvent(QMouseEvent *) override - { - if (m_dragStatus) { - QPoint offset = QPoint(QCursor::pos() - m_resizePoint); - emit dragPointOffset(offset); - } - } - - void mouseReleaseEvent(QMouseEvent *) override - { - if (!m_dragStatus) - return; - - m_dragStatus = false; - releaseMouse(); - emit dragFinished(); - } - - void enterEvent(QEvent *) override - { - if (Utils::IS_WAYLAND_DISPLAY) - updateCursor(); - - QApplication::setOverrideCursor(cursor()); - } - - void leaveEvent(QEvent *) override - { - QApplication::setOverrideCursor(Qt::ArrowCursor); - } - - void updateCursor() - { - QString theme = Utils::SettingValue("com.deepin.xsettings", "/com/deepin/xsettings/", "gtk-cursor-theme-name", "bloom").toString(); - int cursorSize = Utils::SettingValue("com.deepin.xsettings", "/com/deepin/xsettings/", "gtk-cursor-theme-size", 24).toInt(); - Position position = static_cast(qApp->property("position").toInt()); - - static QString lastTheme; - static int lastPosition = -1; - static int lastCursorSize = -1; - if (theme != lastTheme || position != lastPosition || cursorSize != lastCursorSize) { - lastTheme = theme; - lastPosition = position; - lastCursorSize = cursorSize; - const char* cursorName = (position == Bottom || position == Top) ? "v_double_arrow" : "h_double_arrow"; - QCursor *newCursor = ImageUtil::loadQCursorFromX11Cursor(theme.toStdString().c_str(), cursorName, cursorSize); - if (!newCursor) - return; - - setCursor(*newCursor); - static QCursor *lastCursor = nullptr; - if (lastCursor) - delete lastCursor; - - lastCursor = newCursor; - } - } -}; - -class MainWindow : public DBlurEffectWidget +class MainWindow : public MainWindowBase { Q_OBJECT public: - explicit MainWindow(QWidget *parent = nullptr); - - void setEffectEnabled(const bool enabled); - void setComposite(const bool hasComposite); + explicit MainWindow(MultiScreenWorker *multiScreenWorker, QWidget *parent = nullptr); void setGeometry(const QRect &rect); - void sendNotifications(); friend class MainPanelControl; - MainPanelControl *panel() {return m_mainPanel;} - -public slots: - void launch(); - void callShow(); - void reloadPlugins(); + // 以下接口是实现基类的接口 + // 用来更新子区域的位置,一般用于在执行动画的过程中,根据当前的位置来更新里面panel的大小 + DockWindowType windowType() const override; + void setPosition(const Dock::Position &position) override; + void setDisplayMode(const Dock::DisplayMode &displayMode) override; + void updateParentGeometry(const Dock::Position &pos, const QRect &rect) override; + QSize suitableSize(const Dock::Position &pos, const int &screenSize, const double &deviceRatio) const override; + void resetPanelGeometry() override; private: using QWidget::show; - void mousePressEvent(QMouseEvent *e) override; - void keyPressEvent(QKeyEvent *e) override; - void enterEvent(QEvent *e) override; - void mouseMoveEvent(QMouseEvent *e) override; - void moveEvent(QMoveEvent *event) override; void resizeEvent(QResizeEvent *event) override; - - void initMember(); - void initSNIHost(); - void initComponents(); void initConnections(); - void resizeDockIcon(); - void updateMaskArea(); - -signals: - void panelGeometryChanged(); - -public slots: - void RegisterDdeSession(); - void resizeDock(int offset, bool dragging); - void resetDragWindow(); // 任务栏调整高度或宽度后需调用此函数 - -private slots: - void compositeChanged(); - void adjustShadowMask(); - - void onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); - void onMainWindowSizeChanged(QPoint offset); - void themeTypeChanged(DGuiApplicationHelper::ColorType themeType); - void touchRequestResizeDock(); private: MainPanelControl *m_mainPanel; // 任务栏 - DPlatformWindowHandle m_platformWindowHandle; - DWindowManagerHelper *m_wmHelper; MultiScreenWorker *m_multiScreenWorker; // 多屏幕管理 - MenuWorker *m_menuWorker; - QTimer *m_shadowMaskOptimizeTimer; - QDBusConnectionInterface *m_dbusDaemonInterface; - org::kde::StatusNotifierWatcher *m_sniWatcher; // DBUS状态通知 - DragWidget *m_dragWidget; QString m_sniHostService; - bool m_launched; QString m_registerKey; QStringList m_registerKeys; - - QTimer *m_updateDragAreaTimer; }; #endif // MAINWINDOW_H diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp new file mode 100644 index 000000000..1ec2c9faf --- /dev/null +++ b/frame/window/mainwindowbase.cpp @@ -0,0 +1,606 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "mainwindowbase.h" +#include "dragwidget.h" +#include "multiscreenworker.h" +#include "dockscreen.h" +#include "touchsignalmanager.h" +#include "displaymanager.h" +#include "menuworker.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#define DRAG_AREA_SIZE (5) + +// 任务栏圆角最小的时候,任务栏的高度值 +#define MIN_RADIUS_WINDOWSIZE 46 +// 任务栏圆角最小值和最大值的差值 +#define MAX_MIN_RADIUS_DIFFVALUE 6 +// 最小圆角值 +#define MIN_RADIUS 12 + +#define DOCK_SCREEN DockScreen::instance() +#define DIS_INS DisplayManager::instance() + +DGUI_USE_NAMESPACE + +MainWindowBase::MainWindowBase(MultiScreenWorker *multiScreenWorker, QWidget *parent) + : DBlurEffectWidget(parent) + , m_displayMode(Dock::DisplayMode::Efficient) + , m_position(Dock::Position::Bottom) + , m_dockInter(multiScreenWorker->dockInter()) + , m_dragWidget(new DragWidget(this)) + , m_multiScreenWorker(multiScreenWorker) + , m_updateDragAreaTimer(new QTimer(this)) + , m_platformWindowHandle(this) + , m_shadowMaskOptimizeTimer(new QTimer(this)) + , m_isShow(false) + , m_borderRadius(0) + , m_order(0) +{ + initUi(); + initAttribute(); + initConnection(); + initMember(); +} + +MainWindowBase::~MainWindowBase() +{ +} + +void MainWindowBase::setOrder(int order) +{ + m_order = order; +} + +int MainWindowBase::order() const +{ + return m_order; +} + +void MainWindowBase::initAttribute() +{ + setAttribute(Qt::WA_TranslucentBackground); + setAttribute(Qt::WA_X11DoNotAcceptFocus); + + Qt::WindowFlags flags = Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::Window; + //1 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶 + setWindowFlags(windowFlags() | flags | Qt::WindowDoesNotAcceptFocus); + + if (Utils::IS_WAYLAND_DISPLAY) { + setWindowFlag(Qt::FramelessWindowHint, false); // 会导致设置圆角为0时无效 + setAttribute(Qt::WA_NativeWindow); + windowHandle()->setProperty("_d_dwayland_window-type", "dock"); + } + + if (DGuiApplicationHelper::isXWindowPlatform()) { + const auto display = QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + } else { + //2 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶 + XcbMisc::instance()->set_window_type(xcb_window_t(this->winId()), XcbMisc::Dock); + } + } + + setMouseTracking(true); + setAcceptDrops(true); + + m_dragWidget->setMouseTracking(true); + m_dragWidget->setFocusPolicy(Qt::NoFocus); + + if ((Dock::Top == m_position) || (Dock::Bottom == m_position)) + m_dragWidget->setCursor(Qt::SizeVerCursor); + else + m_dragWidget->setCursor(Qt::SizeHorCursor); +} + +void MainWindowBase::initConnection() +{ + connect(DWindowManagerHelper::instance(), &DWindowManagerHelper::hasCompositeChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); + connect(m_shadowMaskOptimizeTimer, &QTimer::timeout, this, &MainWindowBase::adjustShadowMask, Qt::QueuedConnection); + + connect(&m_platformWindowHandle, &DPlatformWindowHandle::frameMarginsChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); + connect(&m_platformWindowHandle, &DPlatformWindowHandle::windowRadiusChanged, m_shadowMaskOptimizeTimer, static_cast(&QTimer::start)); + + connect(m_dragWidget, &DragWidget::dragFinished, this, [ = ] { + m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, false); + }); + + // -拖拽任务栏改变高度或宽度------------------------------------------------------------------------------- + connect(m_updateDragAreaTimer, &QTimer::timeout, this, &MainWindowBase::resetDragWindow); + //TODO 后端考虑删除这块,目前还不能删除,调整任务栏高度的时候,任务栏外部区域有变化 + connect(m_updateDragAreaTimer, &QTimer::timeout, m_multiScreenWorker, &MultiScreenWorker::onRequestUpdateRegionMonitor); + + connect(m_dragWidget, &DragWidget::dragPointOffset, this, &MainWindowBase::onMainWindowSizeChanged); + connect(m_dragWidget, &DragWidget::dragFinished, this, &MainWindowBase::resetDragWindow); // 更新拖拽区域 + connect(TouchSignalManager::instance(), &TouchSignalManager::touchMove, m_dragWidget, &DragWidget::onTouchMove); + connect(TouchSignalManager::instance(), &TouchSignalManager::middleTouchPress, this, &MainWindowBase::touchRequestResizeDock); + + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &MainWindowBase::onThemeTypeChanged); + connect(m_multiScreenWorker, &MultiScreenWorker::opacityChanged, this, &MainWindowBase::setMaskAlpha, Qt::QueuedConnection); + + onThemeTypeChanged(DGuiApplicationHelper::instance()->themeType()); + QMetaObject::invokeMethod(this, &MainWindowBase::onCompositeChanged); +} + +void MainWindowBase::initMember() +{ + //INFO 这里要大于动画的300ms,否则可能动画过程中这个定时器就被触发了 + m_updateDragAreaTimer->setInterval(500); + m_updateDragAreaTimer->setSingleShot(true); + m_shadowMaskOptimizeTimer->setSingleShot(true); + m_shadowMaskOptimizeTimer->setInterval(100); +} + +int MainWindowBase::getBorderRadius() const +{ + if (!DWindowManagerHelper::instance()->hasComposite() || m_multiScreenWorker->displayMode() != DisplayMode::Fashion) + return 0; + + if (Dtk::Core::DSysInfo::isCommunityEdition()) { // 社区版圆角与专业版不同 + DPlatformTheme *theme = DGuiApplicationHelper::instance()->systemTheme(); + return theme->windowRadius(0); + } + + int size = ((m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) ? height() : width()); + return qMin(MAX_MIN_RADIUS_DIFFVALUE, qMax(size - MIN_RADIUS_WINDOWSIZE, 0)) + MIN_RADIUS; +} + +/** + * @brief MainWindow::onMainWindowSizeChanged 任务栏拖拽过程中会不停调用此方法更新自身大小 + * @param offset 拖拽时的坐标偏移量 + */ +void MainWindowBase::onMainWindowSizeChanged(QPoint offset) +{ + QScreen *screen = DIS_INS->screen(DOCK_SCREEN->current()); + if (!screen) + return; + + const QRect rect = getDockGeometry(screen, position(), displayMode(), Dock::HideState::Show); + QRect newRect; + switch (m_multiScreenWorker->position()) { + case Top: { + newRect.setX(rect.x()); + newRect.setY(rect.y()); + newRect.setWidth(rect.width()); + newRect.setHeight(qBound(DOCK_MIN_SIZE, rect.height() + offset.y(), DOCK_MAX_SIZE)); + } + break; + case Bottom: { + newRect.setX(rect.x()); + newRect.setY(rect.y() + rect.height() - qBound(DOCK_MIN_SIZE, rect.height() - offset.y(), DOCK_MAX_SIZE)); + newRect.setWidth(rect.width()); + newRect.setHeight(qBound(DOCK_MIN_SIZE, rect.height() - offset.y(), DOCK_MAX_SIZE)); + } + break; + case Left: { + newRect.setX(rect.x()); + newRect.setY(rect.y()); + newRect.setWidth(qBound(DOCK_MIN_SIZE, rect.width() + offset.x(), DOCK_MAX_SIZE)); + newRect.setHeight(rect.height()); + } + break; + case Right: { + newRect.setX(rect.x() + rect.width() - qBound(DOCK_MIN_SIZE, rect.width() - offset.x(), DOCK_MAX_SIZE)); + newRect.setY(rect.y()); + newRect.setWidth(qBound(DOCK_MIN_SIZE, rect.width() - offset.x(), DOCK_MAX_SIZE)); + newRect.setHeight(rect.height()); + } + break; + } + + m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, true); + + setFixedSize(newRect.size()); + move(newRect.topLeft()); + resetPanelGeometry(); + + Q_EMIT requestUpdate(); +} + +void MainWindowBase::updateDragGeometry() +{ + switch (position()) { + case Dock::Top: + m_dragWidget->setGeometry(0, height() - DRAG_AREA_SIZE, width(), DRAG_AREA_SIZE); + break; + case Dock::Bottom: + m_dragWidget->setGeometry(0, 0, width(), 20); + break; + case Dock::Left: + m_dragWidget->setGeometry(width() - DRAG_AREA_SIZE, 0, DRAG_AREA_SIZE, height()); + break; + case Dock::Right: + m_dragWidget->setGeometry(0, 0, DRAG_AREA_SIZE, height()); + break; + } + + m_dragWidget->raise(); + if ((Top == position()) || (Bottom == position())) { + m_dragWidget->setCursor(Qt::SizeVerCursor); + } else { + m_dragWidget->setCursor(Qt::SizeHorCursor); + } +} + +void MainWindowBase::resetDragWindow() +{ + updateDragGeometry(); + QScreen *screen = DIS_INS->screen(DOCK_SCREEN->current()); + if (!screen) + return; + + QRect currentRect = getDockGeometry(screen, position(), displayMode(), Dock::HideState::Show); + + // 这个时候屏幕有可能是隐藏的,不能直接使用this->width()这种去设置任务栏的高度,而应该保证原值 + int dockSize = 0; + if (m_multiScreenWorker->position() == Position::Left + || m_multiScreenWorker->position() == Position::Right) { + dockSize = this->width() == 0 ? currentRect.width() : this->width(); + } else { + dockSize = this->height() == 0 ? currentRect.height() : this->height(); + } + + /** FIX ME + * 作用:限制dockSize的值在40~100之间。 + * 问题1:如果dockSize为39,会导致dock的mainwindow高度变成99,显示的内容高度却是39。 + * 问题2:dockSize的值在这里不应该为39,但在高分屏上开启缩放后,拉高任务栏操作会概率出现。 + * 暂时未分析出原因,后面再修改。 + */ + dockSize = qBound(DOCK_MIN_SIZE, dockSize, DOCK_MAX_SIZE); + + // 通知窗管和后端更新数据 + m_multiScreenWorker->updateDaemonDockSize(dockSize); // 1.先更新任务栏高度 + m_multiScreenWorker->requestUpdateFrontendGeometry(); // 2.再更新任务栏位置,保证先1再2 + m_multiScreenWorker->requestNotifyWindowManager(); + m_multiScreenWorker->requestUpdateRegionMonitor(); // 界面发生变化,应更新监控区域 +} + +void MainWindowBase::touchRequestResizeDock() +{ + const QPoint touchPos(QCursor::pos()); + QRect dockRect = geometry(); + // 隐藏状态返回 + if (width() == 0 || height() == 0) + return; + + int resizeHeight = Utils::SettingValue("com.deepin.dde.dock.touch", QByteArray(), "resizeHeight", 7).toInt(); + + QRect touchRect; + // 任务栏屏幕 内侧边线 内外resizeHeight距离矩形区域内长按可拖动任务栏高度 + switch (position()) { + case Position::Top: + touchRect = QRect(dockRect.x(), dockRect.y() + dockRect.height() - resizeHeight, dockRect.width(), resizeHeight * 2); + break; + case Position::Bottom: + touchRect = QRect(dockRect.x(), dockRect.y() - resizeHeight, dockRect.width(), resizeHeight * 2); + break; + case Position::Left: + touchRect = QRect(dockRect.x() + dockRect.width() - resizeHeight, dockRect.y(), resizeHeight * 2, dockRect.height()); + break; + case Position::Right: + touchRect = QRect(dockRect.x() - resizeHeight, dockRect.y(), resizeHeight * 2, dockRect.height()); + break; + } + + if (!touchRect.contains(touchPos)) + return; + + qApp->postEvent(m_dragWidget, new QMouseEvent(QEvent::MouseButtonPress, m_dragWidget->mapFromGlobal(touchPos) + , QPoint(), touchPos, Qt::LeftButton, Qt::NoButton + , Qt::NoModifier, Qt::MouseEventSynthesizedByApplication)); +} + +void MainWindowBase::adjustShadowMask() +{ + if (!m_isShow || m_shadowMaskOptimizeTimer->isActive()) + return; + + m_platformWindowHandle.setWindowRadius(m_borderRadius); +} + +void MainWindowBase::onCompositeChanged() +{ + setMaskColor(AutoColor); + + setMaskAlpha(m_multiScreenWorker->opacity()); + m_platformWindowHandle.setBorderWidth(0); + + m_shadowMaskOptimizeTimer->start(); +} + +void MainWindowBase::onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType) +{ + if (DWindowManagerHelper::instance()->hasComposite()) { + if (themeType == DGuiApplicationHelper::DarkType) { + QColor color = Qt::black; + color.setAlpha(255 * 0.3); + m_platformWindowHandle.setBorderColor(color); + } else { + m_platformWindowHandle.setBorderColor(QColor(QColor::Invalid)); + } + } +} + +void MainWindowBase::setDisplayMode(const Dock::DisplayMode &displayMode) +{ + m_displayMode = displayMode; + adjustShadowMask(); +} + +void MainWindowBase::setPosition(const Dock::Position &position) +{ + m_position = position; +} + +QRect MainWindowBase::getDockGeometry(QScreen *screen, const Dock::Position &pos, const Dock::DisplayMode &displaymode, const Dock::HideState &hideState, bool withoutScale) const +{ + QList topMainWindows; // 所有的顶层主窗口列表 + QList lessOrderMainWindows; // 所有在当前窗口之前的主窗口 + QWidgetList topWidgets = qApp->topLevelWidgets(); + for (QWidget *widget : topWidgets) { + MainWindowBase *currentWindow = qobject_cast(widget); + if (!currentWindow || !currentWindow->isVisible()) + continue; + + topMainWindows << currentWindow; + if (currentWindow->order() < order()) + lessOrderMainWindows << currentWindow; + } + + if (!topMainWindows.contains(this)) + return QRect(); + + // 对当前窗口前面的所有窗口按照order进行排序 + sort(lessOrderMainWindows.begin(), lessOrderMainWindows.end(), [](MainWindowBase const *window1, MainWindowBase const *window2) { + return window1->order() < window2->order(); + }); + QRect rect; + const double ratio = withoutScale ? 1 : qApp->devicePixelRatio(); + const int margin = static_cast((displaymode == DisplayMode::Fashion ? 10 : 0) * (withoutScale ? qApp->devicePixelRatio() : 1)); + int dockSize = 0; + if (hideState == Dock::HideState::Show) + dockSize = windowSize(); + + // 拿到当前显示器缩放之前的分辨率 + QRect screenRect = screen->handle()->geometry(); + // 计算所有的窗口的总尺寸 + int totalSize = 0; + switch (pos) { + case Dock::Position::Top: + case Dock::Position::Bottom: { + // 计算任务栏的总的尺寸 + int width = 0; + for (MainWindowBase const *mainWindow : topMainWindows) { + QSize windowSize = mainWindow->suitableSize(pos, screenRect.width(), ratio); + totalSize += windowSize.width() + mainWindow->dockSpace(); + if (mainWindow == this) + width = windowSize.width(); + } + + // 计算第一个窗口的X坐标 + int x = screenRect.x() + (static_cast((screenRect.width() / ratio) - totalSize) / 2); + // 计算当前的X坐标 + for (MainWindowBase const *mainWindow : lessOrderMainWindows) { + x += mainWindow->suitableSize(pos, screenRect.width(), ratio).width() + mainWindow->dockSpace(); + } + int y = 0; + if (pos == Dock::Position::Top) + y = (screenRect.y() + static_cast(margin / ratio)); + else + y = (screenRect.y() + static_cast(screenRect.height() / ratio - margin / ratio)) - dockSize; + rect.setX(x); + rect.setY(y); + rect.setWidth(width); + rect.setHeight(dockSize); + break; + } + case Dock::Position::Left: + case Dock::Position::Right: { + int height = 0; + for (MainWindowBase const *mainWindow : topMainWindows) { + QSize windowSize = mainWindow->suitableSize(pos, screenRect.height(), ratio); + totalSize += windowSize.height() + mainWindow->dockSpace(); + if (mainWindow == this) + height = windowSize.height(); + } + int x = 0; + if (pos == Dock::Position::Left) + x = screenRect.x() + static_cast(margin / ratio); + else + x = screenRect.x() + static_cast(screenRect.width() /ratio - margin / ratio) - dockSize; + + int y = screenRect.y() + static_cast(((screenRect.height() / ratio) - totalSize) / 2); + // 计算y坐标 + for (MainWindowBase const *mainWindow : lessOrderMainWindows) + y += mainWindow->suitableSize(pos, screenRect.height(), ratio).height() + mainWindow->dockSpace(); + + rect.setX(x); + rect.setY(y); + rect.setWidth(dockSize); + rect.setHeight(height); + break; + } + } + return rect; +} + +QVariantAnimation *MainWindowBase::createAnimation(QScreen *screen, const Dock::Position &pos, const Dock::AniAction &act) +{ + /** FIXME + * 在高分屏2.75倍缩放的情况下,mainWindowGeometry返回的任务栏高度有问题(实际是40,返回是39) + * 在这里增加判断,当返回值在范围(38,42)开区间内,均认为任务栏显示位置正确,直接返回,不执行动画 + * 也就是在实际值基础上下浮动1像素的误差范围 + * 正常屏幕情况下是没有这个问题的 + */ + QRect mainwindowRect = geometry(); + const QRect dockShowRect = getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Show); + const QRect &dockHideRect = getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Hide); + if (act == Dock::AniAction::Show) { + if (pos == Position::Top || pos == Position::Bottom) { + if (qAbs(dockShowRect.height() - mainwindowRect.height()) <= 1 + && mainwindowRect.contains(dockShowRect.center())) + return nullptr; + } else if (pos == Position::Left || pos == Position::Right) { + if (qAbs(dockShowRect.width() - mainwindowRect.width()) <= 1 + && mainwindowRect.contains(dockShowRect.center())) + return nullptr; + } + } + if (act == Dock::AniAction::Hide && dockHideRect.size() == mainwindowRect.size()) + return nullptr; + + // 开始播放动画 + QVariantAnimation *ani = new QVariantAnimation(nullptr); + ani->setEasingCurve(QEasingCurve::InOutCubic); +#ifndef DISABLE_SHOW_ANIMATION + const bool composite = DWindowManagerHelper::instance()->hasComposite(); // 判断是否开启特效模式 + const int duration = composite ? ANIMATIONTIME : 0; +#else + const int duration = 0; +#endif + ani->setDuration(duration); + + connect(ani, &QVariantAnimation::valueChanged, this, [ = ](const QVariant &value) { + if ((!m_multiScreenWorker->testState(MultiScreenWorker::ShowAnimationStart) + && !m_multiScreenWorker->testState(MultiScreenWorker::HideAnimationStart) + && !m_multiScreenWorker->testState(MultiScreenWorker::ChangePositionAnimationStart)) + || ani->state() != QVariantAnimation::State::Running) + return; + + updateParentGeometry(pos, value.value()); + }); + + switch (act) { + case Dock::AniAction::Show: { + ani->setStartValue(dockHideRect); + ani->setEndValue(dockShowRect); + connect(ani, &QVariantAnimation::finished, this, [ = ]{ + updateParentGeometry(pos, dockShowRect); + }); + break; + } + case Dock::AniAction::Hide: { + ani->setStartValue(dockShowRect); + ani->setEndValue(dockHideRect); + connect(ani, &QVariantAnimation::finished, this, [ = ]{ + updateParentGeometry(pos, dockHideRect); + }); + break; + } + } + + return ani; +} + +Dock::DisplayMode MainWindowBase::displayMode() const +{ + return m_displayMode; +} + +Dock::Position MainWindowBase::position() const +{ + return m_position; +} + +int MainWindowBase::windowSize() const +{ + if (m_displayMode == Dock::DisplayMode::Efficient) + return m_dockInter->windowSizeEfficient(); + + return m_dockInter->windowSizeFashion(); +} + +bool MainWindowBase::isDraging() const +{ + return m_dragWidget->isDraging(); +} + +int MainWindowBase::dockSpace() const +{ + return DOCKSPACE; +} + +void MainWindowBase::initUi() +{ + DPlatformWindowHandle::enableDXcbForWindow(this, true); + m_platformWindowHandle.setEnableBlurWindow(true); + m_platformWindowHandle.setTranslucentBackground(true); + m_platformWindowHandle.setShadowOffset(QPoint(0, 0)); + m_platformWindowHandle.setShadowColor(Qt::transparent); +} + +void MainWindowBase::resizeEvent(QResizeEvent *event) +{ + updateDragGeometry(); + + int borderRadius = getBorderRadius(); + if (borderRadius != m_borderRadius) { + m_borderRadius = borderRadius; + updateRadius(m_borderRadius); + } + + m_shadowMaskOptimizeTimer->start(); +} + +void MainWindowBase::moveEvent(QMoveEvent *) +{ + updateDragGeometry(); +} + +void MainWindowBase::enterEvent(QEvent *e) +{ + QWidget::enterEvent(e); + + if (QApplication::overrideCursor() && QApplication::overrideCursor()->shape() != Qt::ArrowCursor) + QApplication::restoreOverrideCursor(); +} + +void MainWindowBase::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::RightButton && geometry().contains(QCursor::pos())) { + m_multiScreenWorker->onAutoHideChanged(false); + MenuWorker menuWorker; + menuWorker.exec(); + m_multiScreenWorker->onAutoHideChanged(true); + } + + DBlurEffectWidget::mousePressEvent(event); +} + +void MainWindowBase::showEvent(QShowEvent *event) +{ + if (!m_isShow) { + m_isShow = true; + m_shadowMaskOptimizeTimer->start(); + } + + DBlurEffectWidget::showEvent(event); +} diff --git a/frame/window/mainwindowbase.h b/frame/window/mainwindowbase.h new file mode 100644 index 000000000..ff528f49d --- /dev/null +++ b/frame/window/mainwindowbase.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef MAINWINDOWBASE_H +#define MAINWINDOWBASE_H + +#include "constants.h" +#include "dbusutil.h" + +#include +#include +#include + +#include +#include +#include + +class DragWidget; +class MultiScreenWorker; + +DWIDGET_USE_NAMESPACE + +class MainWindowBase : public DBlurEffectWidget +{ + Q_OBJECT + +public: + enum class DockWindowType { + MainWindow, // 主窗口 + TrayWindow // 主窗口之外的其他窗口 + }; + +public: + explicit MainWindowBase(MultiScreenWorker *multiScreenWorker, QWidget *parent = Q_NULLPTR); + virtual ~MainWindowBase(); + + void setOrder(int order); // 窗体展示的顺序,按照左到右和上到下 + int order() const; + + virtual DockWindowType windowType() const = 0; + virtual void setDisplayMode(const Dock::DisplayMode &displayMode); + virtual void setPosition(const Dock::Position &position); + // 用来更新子区域的位置,一般用于在执行动画的过程中,根据当前的位置来更新里面panel的大小 + virtual void updateParentGeometry(const Dock::Position &pos, const QRect &rect) = 0; + virtual QRect getDockGeometry(QScreen *screen, const Dock::Position &pos, const Dock::DisplayMode &displaymode, const Dock::HideState &hideState, bool withoutScale = false) const; + QVariantAnimation *createAnimation(QScreen *screen, const Dock::Position &pos, const Dock::AniAction &act); + virtual void resetPanelGeometry() {} // 重置内部区域,为了让内部区域和当前区域始终保持一致 + virtual int dockSpace() const; // 与后面窗体之间的间隔 + +Q_SIGNALS: + void requestUpdate(); + +protected: + void resizeEvent(QResizeEvent *event) override; + void moveEvent(QMoveEvent *) override; + void enterEvent(QEvent *e) override; + void mousePressEvent(QMouseEvent *event) override; + void showEvent(QShowEvent *event) override; + + Dock::DisplayMode displayMode() const; + Dock::Position position() const; + + int windowSize() const; + + bool isDraging() const; + + virtual void updateRadius(int borderRadius) {} + virtual QSize suitableSize(const Dock::Position &pos, const int &screenSize, const double &deviceRatio) const = 0; + +private: + void initUi(); + void initAttribute(); + void initConnection(); + void initMember(); + void updateDragGeometry(); + + int getBorderRadius() const; + +private Q_SLOTS: + void onMainWindowSizeChanged(QPoint offset); + void resetDragWindow(); + void touchRequestResizeDock(); + void adjustShadowMask(); + void onCompositeChanged(); + void onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType); + +private: + Dock::DisplayMode m_displayMode; + Dock::Position m_position; + DockInter *m_dockInter; + DragWidget *m_dragWidget; + MultiScreenWorker *m_multiScreenWorker; + QTimer *m_updateDragAreaTimer; + DPlatformWindowHandle m_platformWindowHandle; + QTimer *m_shadowMaskOptimizeTimer; + bool m_isShow; + int m_borderRadius; + int m_order; +}; + +#endif // MAINWINDOWBASE_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index bf11670fa..573510990 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -131,6 +131,11 @@ void QuickPluginWindow::dragPlugin(PluginsItemInterface *item) Q_EMIT itemCountChanged(); } +QSize QuickPluginWindow::suitableSize() const +{ + return suitableSize(m_position); +} + void QuickPluginWindow::addPlugin(QuickSettingItem *item) { for (int i = 0; i < m_mainLayout->count(); i++) { @@ -163,9 +168,9 @@ void QuickPluginWindow::addPlugin(QuickSettingItem *item) Q_EMIT itemCountChanged(); } -QSize QuickPluginWindow::suitableSize() +QSize QuickPluginWindow::suitableSize(const Dock::Position &position) const { - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + if (position == Dock::Position::Top || position == Dock::Position::Bottom) return QSize((ITEMSPACE + ICONWIDTH) * m_mainLayout->count() + ITEMSPACE, ITEMSIZE); int height = 0; diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index db7bbf70a..ffad4a3a4 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -52,7 +52,8 @@ public: void setPositon(Dock::Position position); void dragPlugin(PluginsItemInterface *item); - QSize suitableSize(); + QSize suitableSize() const; + QSize suitableSize(const Dock::Position &position) const; Q_SIGNALS: void itemCountChanged(); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 478b4ccaf..d725d0ea7 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -72,17 +72,22 @@ void SystemPluginWindow::setPositon(Position position) } } -QSize SystemPluginWindow::suitableSize() +QSize SystemPluginWindow::suitableSize() const +{ + return suitableSize(m_position); +} + +QSize SystemPluginWindow::suitableSize(const Position &position) const { QObjectList childs = children(); - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { int itemWidth = 0; for (QObject *childObject : childs) { StretchPluginsItem *childItem = qobject_cast(childObject); if (!childItem) continue; - itemWidth += childItem->suitableSize().width(); + itemWidth += childItem->suitableSize(position).width(); } return QSize(itemWidth, QWIDGETSIZE_MAX); @@ -94,7 +99,7 @@ QSize SystemPluginWindow::suitableSize() if (!item) continue; - itemHeight += item->suitableSize().height(); + itemHeight += item->suitableSize(position).height(); } return QSize(QWIDGETSIZE_MAX, itemHeight); @@ -175,6 +180,11 @@ QString StretchPluginsItem::itemKey() const return m_itemKey; } +QSize StretchPluginsItem::suitableSize() const +{ + return suitableSize(m_position); +} + PluginsItemInterface *StretchPluginsItem::pluginInter() const { return m_pluginInter; @@ -210,31 +220,38 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) painter.drawPixmap(rctPixmap, icon.pixmap(iconSize, iconSize)); } -QSize StretchPluginsItem::suitableSize() const +QSize StretchPluginsItem::suitableSize(const Position &position) const { int iconSize = static_cast(ICONSIZE * (qApp->devicePixelRatio())); - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - int textWidth = QFontMetrics(textFont()).boundingRect(m_pluginInter->pluginDisplayName()).width(); + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { + int textWidth = QFontMetrics(textFont(position)).boundingRect(m_pluginInter->pluginDisplayName()).width(); return QSize(qMax(textWidth, iconSize) + 10 * 2, -1); } - int height = 6; // 图标上边距6 - height += iconSize; // 图标尺寸20 - height += ICONTEXTSPACE; // 图标与文字间距6 - height += QFontMetrics(textFont()).height(); // 文本高度 - height += 4; // 下间距4 + int height = 6; // 图标上边距6 + height += iconSize; // 图标尺寸20 + height += ICONTEXTSPACE; // 图标与文字间距6 + height += QFontMetrics(textFont(position)).height(); // 文本高度 + height += 4; // 下间距4 return QSize(-1, height); } QFont StretchPluginsItem::textFont() const { - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + return textFont(m_position); +} + +QFont StretchPluginsItem::textFont(const Position &position) const +{ + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { static QList fonts{ DFontSizeManager::instance()->t9(), DFontSizeManager::instance()->t8(), DFontSizeManager::instance()->t7(), DFontSizeManager::instance()->t6() }; #define MINHEIGHT 50 - int index = qMin(qMax((height() - MINHEIGHT) / 2, 0), fonts.size() - 1); + // 如果当前的实际位置和请求的位置不一致,说明当前正在切换位置,此时将它的宽度作为它的高度(左到下切换的时候,左侧的宽度和下面的高度一致) + int size = (m_position == position ? height() : width()); + int index = qMin(qMax((size - MINHEIGHT) / 2, 0), fonts.size() - 1); return fonts[index]; } diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index a21ba18a4..0e92f0864 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -43,7 +43,8 @@ public: explicit SystemPluginWindow(QWidget *parent = nullptr); ~SystemPluginWindow() override; void setPositon(Dock::Position position); - QSize suitableSize(); + QSize suitableSize() const; + QSize suitableSize(const Dock::Position &position) const; Q_SIGNALS: void itemChanged(); @@ -75,6 +76,7 @@ public: PluginsItemInterface *pluginInter() const; QString itemKey() const; QSize suitableSize() const; + QSize suitableSize(const Dock::Position &position) const; inline ItemType itemType() const override { return DockItem::StretchPlugin; } @@ -89,6 +91,7 @@ protected: private: void mouseClick(); QFont textFont() const; + QFont textFont(const Dock::Position &position) const; bool needShowText() const; private: diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index 3f51f99cf..957b29b97 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -59,6 +59,11 @@ Dock::Position TrayGridView::position() const } QSize TrayGridView::suitableSize() const +{ + return suitableSize(m_positon); +} + +QSize TrayGridView::suitableSize(const Dock::Position &position) const { TrayModel *dataModel = qobject_cast(model()); if (!dataModel) @@ -88,21 +93,38 @@ QSize TrayGridView::suitableSize() const } return QSize(width, height); } - if (m_positon == Dock::Position::Top || m_positon == Dock::Position::Bottom) { + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { int length = spacing() + 2; - for (int i = 0; i < dataModel->rowCount(); i++) { - QModelIndex index = dataModel->index(i, 0); - QRect indexRect = visualRect(index); - length += indexRect.width() + spacing(); + if (m_positon == Dock::Position::Top || m_positon == Dock::Position::Bottom) { + for (int i = 0; i < dataModel->rowCount(); i++) { + QModelIndex index = dataModel->index(i, 0); + QRect indexRect = visualRect(index); + length += indexRect.width() + spacing(); + } + } else { + // 如果是从左右切换过来的,此时还未进入上下位置,则将当前位置的高度作为计算左右位置的宽度 + for (int i = 0; i < dataModel->rowCount(); i++) { + QModelIndex index = dataModel->index(i, 0); + QRect indexRect = visualRect(index); + length += indexRect.height() + spacing(); + } } return QSize(length, -1); } int height = spacing() + 2; - for (int i = 0; i < dataModel->rowCount(); i++) { - QModelIndex index = dataModel->index(i, 0); - QRect indexRect = visualRect(index); - height += indexRect.height() + spacing(); + if (m_positon == Dock::Position::Left || m_positon == Dock::Position::Right) { + for (int i = 0; i < dataModel->rowCount(); i++) { + QModelIndex index = dataModel->index(i, 0); + QRect indexRect = visualRect(index); + height += indexRect.height() + spacing(); + } + } else { + for (int i = 0; i < dataModel->rowCount(); i++) { + QModelIndex index = dataModel->index(i, 0); + QRect indexRect = visualRect(index); + height += indexRect.width() + spacing(); + } } return QSize(-1, height); diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h index e06cb0f30..9a498453d 100644 --- a/frame/window/tray/tray_gridview.h +++ b/frame/window/tray/tray_gridview.h @@ -39,6 +39,7 @@ public: void setPosition(Dock::Position position); Dock::Position position() const; QSize suitableSize() const; + QSize suitableSize(const Dock::Position &position) const; void setDragDistance(int pixel); void setAnimationProperty(const QEasingCurve::Type easing, const int duringTime = 250); void moveAnimation(); diff --git a/frame/window/traymainwindow.cpp b/frame/window/traymainwindow.cpp new file mode 100644 index 000000000..6f8f9d58e --- /dev/null +++ b/frame/window/traymainwindow.cpp @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "traymainwindow.h" +#include "traymanagerwindow.h" +#include "dragwidget.h" +#include "dockscreen.h" +#include "displaymanager.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#define DOCK_SCREEN DockScreen::instance() +#define DIS_INS DisplayManager::instance() + +TrayMainWindow::TrayMainWindow(MultiScreenWorker *multiScreenWorker, QWidget *parent) + : MainWindowBase(multiScreenWorker, parent) + , m_trayManager(new TrayManagerWindow(this)) + , m_multiScreenWorker(multiScreenWorker) +{ + initUI(); + initConnection(); +} + +void TrayMainWindow::setPosition(const Dock::Position &position) +{ + MainWindowBase::setPosition(position); + m_trayManager->setPositon(position); +} + +TrayManagerWindow *TrayMainWindow::trayManagerWindow() const +{ + return m_trayManager; +} + +void TrayMainWindow::setDisplayMode(const Dock::DisplayMode &displayMode) +{ + // 只有在时尚模式下才显示 + setVisible(displayMode == Dock::DisplayMode::Fashion); + MainWindowBase::setDisplayMode(displayMode); +} + +MainWindowBase::DockWindowType TrayMainWindow::windowType() const +{ + return DockWindowType::TrayWindow; +} + +void TrayMainWindow::updateParentGeometry(const Dock::Position &position, const QRect &rect) +{ + QSize trayPanelSize = m_trayManager->suitableSize(position); + // 设置trayManagerWindow的大小和位置 + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { + setFixedSize(trayPanelSize.width(), rect.height()); + move(rect.topLeft()); + } else { + setFixedSize(rect.width(), trayPanelSize.height()); + move(rect.topLeft()); + } + + int panelSize = windowSize(); + QRect panelRect = rect; + switch(position) { + case Dock::Position::Left: + m_trayManager->move(width() - panelSize, 0); + panelRect.setWidth(panelSize); + panelRect.setHeight(trayPanelSize.height()); + break; + case Dock::Position::Top: + m_trayManager->move(0, height() - panelSize); + panelRect.setWidth(trayPanelSize.width()); + panelRect.setHeight(panelSize); + break; + case Dock::Position::Right: { + m_trayManager->move(0, 0); + panelRect.setWidth(panelSize); + panelRect.setHeight(trayPanelSize.height()); + break; + } + case Dock::Position::Bottom: { + m_trayManager->move(0, 0); + panelRect.setWidth(trayPanelSize.width()); + panelRect.setHeight(panelSize); + break; + } + } + + // 在从高效模式切换到时尚模式的时候,需要调用该函数来设置托盘区域的尺寸,在设置尺寸的时候会触发 + // 托盘区域的requestUpdate信号,WindowManager接收到requestUpdate会依次对每个顶层界面设置尺寸,此时又会触发该函数 + // 引起无限循环,因此,在设置尺寸的时候阻塞信号,防止进入死循环 + m_trayManager->blockSignals(true); + m_trayManager->setFixedSize(panelRect.size()); + m_trayManager->blockSignals(false); +} + +QSize TrayMainWindow::suitableSize() const +{ + return m_trayManager->suitableSize(); +} + +void TrayMainWindow::resetPanelGeometry() +{ + m_trayManager->setFixedSize(size()); + m_trayManager->move(0, 0); +} + +int TrayMainWindow::dockSpace() const +{ + return 0; +} + +void TrayMainWindow::updateRadius(int borderRadius) +{ + m_trayManager->updateBorderRadius(borderRadius); +} + +QSize TrayMainWindow::suitableSize(const Dock::Position &pos, const int &, const double &) const +{ + return m_trayManager->suitableSize(pos); +} + +void TrayMainWindow::initUI() +{ + m_trayManager->move(0, 0); +} + +void TrayMainWindow::initConnection() +{ + connect(m_trayManager, &TrayManagerWindow::requestUpdate, this, &TrayMainWindow::onRequestUpdate); +} + +void TrayMainWindow::onRequestUpdate() +{ + // 如果当前是高效模式,则无需发送信号 + if (displayMode() == Dock::DisplayMode::Efficient) + return; + + Q_EMIT requestUpdate(); +} diff --git a/frame/window/traymainwindow.h b/frame/window/traymainwindow.h new file mode 100644 index 000000000..ffd5fb168 --- /dev/null +++ b/frame/window/traymainwindow.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef TRAYMAINWINDOW_H +#define TRAYMAINWINDOW_H + +#include "constants.h" +#include "mainwindowbase.h" + +#include + +class TrayManagerWindow; +class MultiScreenWorker; + +DWIDGET_USE_NAMESPACE + +class TrayMainWindow : public MainWindowBase +{ + Q_OBJECT + +public: + TrayMainWindow(MultiScreenWorker *multiScreenWorker, QWidget *parent = Q_NULLPTR); + void setPosition(const Dock::Position &position) override; + TrayManagerWindow *trayManagerWindow() const; + + void setDisplayMode(const Dock::DisplayMode &displayMode) override; + DockWindowType windowType() const override; + void updateParentGeometry(const Dock::Position &position, const QRect &rect) override; + QSize suitableSize(const Dock::Position &pos, const int &, const double &) const override; + QSize suitableSize() const; + void resetPanelGeometry() override; + +protected: + int dockSpace() const override; + void updateRadius(int borderRadius) override; + +private: + void initUI(); + void initConnection(); + +private Q_SLOTS: + void onRequestUpdate(); + +private: + TrayManagerWindow *m_trayManager; + MultiScreenWorker *m_multiScreenWorker; +}; + +#endif // TRAYMAINWINDOW_H diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 6a41748fa..dbf0b6baf 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -57,34 +57,44 @@ TrayManagerWindow::TrayManagerWindow(QWidget *parent) , m_quickIconWidget(new QuickPluginWindow(m_appPluginWidget)) , m_dateTimeWidget(new DateTimeDisplayer(m_appPluginDatetimeWidget)) , m_appPluginLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) - , m_appDatetimeLayout(new QBoxLayout(QBoxLayout::Direction::TopToBottom, this)) , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) , m_trayView(new TrayGridView(this)) , m_model(new TrayModel(m_trayView, false, true)) , m_delegate(new TrayDelegate(m_trayView, m_trayView)) - , m_postion(Dock::Position::Bottom) + , m_position(Dock::Position::Bottom) , m_splitLine(new QLabel(m_appPluginDatetimeWidget)) + , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) + , m_singleShow(false) + , m_borderRadius(0) { initUi(); initConnection(); setAcceptDrops(true); setMouseTracking(true); + + QMetaObject::invokeMethod(this, &TrayManagerWindow::updateLayout, Qt::QueuedConnection); } TrayManagerWindow::~TrayManagerWindow() { } +void TrayManagerWindow::updateBorderRadius(int borderRadius) +{ + m_borderRadius = borderRadius; + update(); +} + void TrayManagerWindow::updateLayout() { - bool showSingle = true; - if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) - showSingle = (topLevelWidget()->height() <= CRITLCALHEIGHT); + bool lastIsSingle = m_singleShow; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + m_singleShow = (height() <= CRITLCALHEIGHT); + else + m_singleShow = true; - QBoxLayout::Direction lastDirection = m_appDatetimeLayout->direction(); - - if (showSingle) + if (m_singleShow) resetSingleDirection(); else resetMultiDirection(); @@ -94,16 +104,16 @@ void TrayManagerWindow::updateLayout() Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); // 当插件区域从单行变成两行或者两行变成单行的时候,发送该信号,通知外部重新调整区域大小 - if (lastDirection != m_appDatetimeLayout->direction()) + if (lastIsSingle != m_singleShow) Q_EMIT requestUpdate(); } void TrayManagerWindow::setPositon(Dock::Position position) { - if (m_postion == position) + if (m_position == position) return; - m_postion = position; + m_position = position; if (position == Dock::Position::Top || position == Dock::Position::Bottom) m_trayView->setOrientation(QListView::Flow::LeftToRight, false); @@ -120,51 +130,62 @@ void TrayManagerWindow::setPositon(Dock::Position position) m_quickIconWidget->setPositon(position); m_dateTimeWidget->setPositon(position); m_systemPluginWidget->setPositon(position); + + updateLayout(); } -int TrayManagerWindow::appDatetimeSize() +int TrayManagerWindow::appDatetimeSize(const Dock::Position &position) const { - if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) { - // 如果是一行 - if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) { - return m_trayView->suitableSize().width() + m_quickIconWidget->suitableSize().width() - + m_dateTimeWidget->suitableSize().width() + m_appDatetimeLayout->spacing(); + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { + bool showSingle = m_singleShow; + // 正在从左右切换到上下(m_position当前显示的位置,还未切换),此时根据托盘区域的尺寸来决定显示一行还是两行 + if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) { + showSingle = m_dockInter->windowSizeFashion() < CRITLCALHEIGHT; + } + + // 如果是一行或者是在切换位置(从左右切换到上下) + if (showSingle) { + return m_trayView->suitableSize(position).width() + m_quickIconWidget->suitableSize(position).width() + + m_dateTimeWidget->suitableSize(position).width() + 4; } //如果是两行 - int topWidth = m_trayView->suitableSize().width() + m_appDatetimeLayout->spacing() + m_quickIconWidget->width(); - int bottomWidth = m_dateTimeWidget->suitableSize().width(); + int topWidth = m_trayView->suitableSize(position).width() + m_quickIconWidget->suitableSize(position).width(); + int bottomWidth = m_dateTimeWidget->suitableSize(position).width(); return qMax(topWidth, bottomWidth); } - int trayHeight = m_trayView->suitableSize().height(); - QMargins m = m_appDatetimeLayout->contentsMargins(); - int traypluginHeight = trayHeight + m_quickIconWidget->suitableSize().height() + m.top() + m.bottom() + m_appPluginLayout->spacing(); - return traypluginHeight + m_appDatetimeLayout->spacing() + m_dateTimeWidget->suitableSize().height() + 10; + int trayHeight = m_trayView->suitableSize(position).height(); + int traypluginHeight = trayHeight + m_quickIconWidget->suitableSize(position).height() + m_appPluginLayout->spacing(); + return traypluginHeight + m_dateTimeWidget->suitableSize(position).height() + 10; } -QSize TrayManagerWindow::suitableSize() +QSize TrayManagerWindow::suitableSize() const +{ + return suitableSize(m_position); +} + +QSize TrayManagerWindow::suitableSize(const Dock::Position &position) const { QMargins m = m_mainLayout->contentsMargins(); - if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) { - return QSize(appDatetimeSize() + m_appDatetimeLayout->spacing() + - m_systemPluginWidget->suitableSize().width() + m_mainLayout->spacing() + + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { + return QSize(appDatetimeSize(position) + + m_systemPluginWidget->suitableSize(position).width() + m_mainLayout->spacing() + m.left() + m.right(), QWIDGETSIZE_MAX); } - return QSize(QWIDGETSIZE_MAX, appDatetimeSize() + m_appDatetimeLayout->spacing() + - m_systemPluginWidget->suitableSize().height() + m_mainLayout->spacing() + + return QSize(QWIDGETSIZE_MAX, appDatetimeSize(position) + + m_systemPluginWidget->suitableSize(position).height() + m_mainLayout->spacing() + m.top() + m.bottom()); } // 用于返回需要绘制的圆形区域 QPainterPath TrayManagerWindow::roundedPaths() { - int topLevelRadius = qApp->property("EffectBorderRadius").toInt(); QMargins mainMargin = m_mainLayout->contentsMargins(); - int radius = topLevelRadius - mainMargin.top(); + int radius = m_borderRadius - mainMargin.top(); QPainterPath path; - if ((m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) - && (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight)) { + if ((m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + && m_singleShow) { // 如果是上下方向,且只有一行 // 计算托盘和快捷插件区域 QPoint pointPlugin(mainMargin.left(), mainMargin.top()); @@ -220,13 +241,6 @@ void TrayManagerWindow::initUi() m_appPluginLayout->addWidget(m_trayView); m_appPluginLayout->addWidget(m_quickIconWidget); - m_appPluginDatetimeWidget->setLayout(m_appDatetimeLayout); - m_appDatetimeLayout->setContentsMargins(0, 0, 0, 0); - m_appDatetimeLayout->setSpacing(0); - m_appDatetimeLayout->addWidget(m_appPluginWidget); - m_appDatetimeLayout->addWidget(m_splitLine); - m_appDatetimeLayout->addWidget(m_dateTimeWidget); - setLayout(m_mainLayout); // 通用情况下,设置边距和间距都为7 m_mainLayout->setContentsMargins(CONTENTSPACE, CONTENTSPACE, CONTENTSPACE, CONTENTSPACE); @@ -253,7 +267,7 @@ void TrayManagerWindow::initConnection() connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, [ this ] { // 当插件数量发生变化的时候,需要调整尺寸 m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); - if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) m_quickIconWidget->setFixedWidth(m_quickIconWidget->suitableSize().width()); else m_quickIconWidget->setFixedHeight(m_quickIconWidget->suitableSize().height()); @@ -264,7 +278,7 @@ void TrayManagerWindow::initConnection() connect(m_systemPluginWidget, &SystemPluginWindow::itemChanged, this, [ this ] { // 当系统插件发生变化的时候,同样需要调整尺寸 m_systemPluginWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); - if (m_postion == Dock::Position::Top || m_postion == Dock::Position::Bottom) + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) m_systemPluginWidget->setFixedWidth(m_systemPluginWidget->suitableSize().width()); else m_systemPluginWidget->setFixedHeight(m_systemPluginWidget->suitableSize().height()); @@ -310,12 +324,13 @@ void TrayManagerWindow::resetChildWidgetSize() count++; } - switch (m_postion) { + switch (m_position) { case Dock::Position::Top: case Dock::Position::Bottom: { int trayWidth = m_trayView->suitableSize().width(); + int appDateTimeWidth = appDatetimeSize(m_position); QMargins m = m_appPluginLayout->contentsMargins(); - if (m_appDatetimeLayout->direction() == QBoxLayout::Direction::LeftToRight) { + if (m_singleShow) { // 单行显示 int trayHeight = m_appPluginDatetimeWidget->height() - m.top() - m.bottom(); m_trayView->setFixedSize(trayWidth, trayHeight); @@ -324,27 +339,46 @@ void TrayManagerWindow::resetChildWidgetSize() m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), trayHeight); // 设置右侧的电源按钮的尺寸 m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize()); - m_mainLayout->setContentsMargins(4, 4, 4 ,4); - m_mainLayout->setSpacing(4); - m_appDatetimeLayout->setSpacing(4); + // 如果顶层窗体的高度为0,则直接让其间距为0,否则就会出现隐藏模式下,有8个像素的高度依然显示 + int space = topLevelWidget()->height() == 0 ? 0 : 4; + m_mainLayout->setContentsMargins(space, space, space ,space); + m_mainLayout->setSpacing(space); + // 单行显示需要重新设置插件和时间日期的位置,不显示分割线 + m_splitLine->setVisible(false); + m_appPluginWidget->move(0, 0); + m_dateTimeWidget->move(m_appPluginWidget->x() + m_appPluginWidget->width() + 4, m_appPluginWidget->y()); } else { // 多行显示 + m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize()); int trayHeight = m_appPluginDatetimeWidget->height() / 2 + 4 - m.top() - m.bottom(); m_trayView->setFixedSize(trayWidth, trayHeight); - m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), trayHeight); - m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), m_appPluginDatetimeWidget->height() / 2 + 4); + m_appPluginWidget->setFixedSize(trayWidth + m_quickIconWidget->suitableSize().width(), trayHeight); // 因为是两行,所以对于时间控件的尺寸,只能设置最小值 int dateTimeWidth = qMax(m_appPluginWidget->width(), m_dateTimeWidget->suitableSize().width()); - m_dateTimeWidget->setMinimumSize(dateTimeWidth, QWIDGETSIZE_MAX); + 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; m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace); - m_appDatetimeLayout->setSpacing(0); m_mainLayout->setSpacing(contentSpace); + + // 调整插件和日期窗体的位置显示,这里没有用到布局,是因为在调整任务栏位置的时候, + // 随着布局方向的改变,显示有很大的问题 + m_splitLine->setFixedWidth(appDateTimeWidth); + m_splitLine->setVisible(true); + if (m_position == Dock::Position::Bottom) { + m_appPluginWidget->move(0, 0); + m_splitLine->move(0, m_appPluginWidget->y() + m_appPluginWidget->height()); + m_dateTimeWidget->move(0, m_appPluginWidget->y() + m_appPluginWidget->height() + m_splitLine->height()); + } else { + m_dateTimeWidget->move(0, 0); + m_splitLine->move(0, m_dateTimeWidget->y() + m_dateTimeWidget->height()); + m_appPluginWidget->move(0, m_dateTimeWidget->y() + m_dateTimeWidget->height() + m_splitLine->height()); + } } QMargins margin = m_mainLayout->contentsMargins(); int appDateHeight = height() - margin.top() - margin.bottom(); - m_appPluginDatetimeWidget->setFixedSize(appDatetimeSize(), appDateHeight); + m_appPluginDatetimeWidget->setFixedSize(appDateTimeWidth, appDateHeight); break; } case Dock::Position::Left: @@ -361,13 +395,19 @@ 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(width() - MINHIGHT, 0)) + MINSPACE); m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace); - m_appDatetimeLayout->setSpacing(0); m_mainLayout->setSpacing(contentSpace); int appDateWidth = width() - (contentSpace * 2); - m_appPluginDatetimeWidget->setFixedSize(appDateWidth, appDatetimeSize()); + m_appPluginDatetimeWidget->setFixedSize(appDateWidth, appDatetimeSize(m_position)); + + // 调整各个部件的位置 + m_appPluginWidget->move(0, 0); + m_splitLine->setFixedWidth(width()); + m_splitLine->setVisible(true); + m_splitLine->move(0, m_appPluginWidget->y() + m_appPluginWidget->height()); + m_dateTimeWidget->move(0, m_appPluginWidget->y() + m_appPluginWidget->height() + m_splitLine->height()); break; } } @@ -375,22 +415,18 @@ void TrayManagerWindow::resetChildWidgetSize() void TrayManagerWindow::resetSingleDirection() { - switch (m_postion) { + switch (m_position) { case Dock::Position::Top: case Dock::Position::Bottom: { m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); // 应用和时间在一行显示 - m_appDatetimeLayout->setSpacing(10); - m_appDatetimeLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_splitLine->hide(); break; } case Dock::Position::Left: case Dock::Position::Right:{ - m_appDatetimeLayout->setSpacing(0); m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_splitLine->show(); break; @@ -401,19 +437,10 @@ void TrayManagerWindow::resetSingleDirection() void TrayManagerWindow::resetMultiDirection() { - m_appDatetimeLayout->setSpacing(0); - switch (m_postion) { - case Dock::Position::Top: { - m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_appDatetimeLayout->setDirection(QBoxLayout::Direction::BottomToTop); - m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_splitLine->show(); - m_dateTimeWidget->setOneRow(false); - break; - } + switch (m_position) { + case Dock::Position::Top: case Dock::Position::Bottom: { m_appPluginLayout->setDirection(QBoxLayout::Direction::LeftToRight); - m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight); m_splitLine->show(); m_dateTimeWidget->setOneRow(false); @@ -422,7 +449,6 @@ void TrayManagerWindow::resetMultiDirection() case Dock::Position::Left: case Dock::Position::Right: { m_appPluginLayout->setDirection(QBoxLayout::Direction::TopToBottom); - m_appDatetimeLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); m_splitLine->hide(); m_dateTimeWidget->setOneRow(true); diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 20650a3ed..e1ff560e6 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -22,6 +22,7 @@ #define TRAYMANAGERWINDOW_H #include "constants.h" +#include "dbusutil.h" #include @@ -43,6 +44,7 @@ class SystemPluginWindow; class QLabel; class QDropEvent; class DateTimeDisplayer; +class QPainterPath; class TrayManagerWindow : public QWidget { @@ -52,9 +54,11 @@ public: explicit TrayManagerWindow(QWidget *parent = nullptr); ~TrayManagerWindow() override; + void updateBorderRadius(int borderRadius); void updateLayout(); void setPositon(Dock::Position position); - QSize suitableSize(); + QSize suitableSize() const; + QSize suitableSize(const Dock::Position &position) const; Q_SIGNALS: void requestUpdate(); @@ -76,7 +80,7 @@ private: void resetSingleDirection(); QColor maskColor(uint8_t alpha) const; - int appDatetimeSize(); + int appDatetimeSize(const Dock::Position &position) const; QPainterPath roundedPaths(); private: @@ -86,13 +90,15 @@ private: QuickPluginWindow *m_quickIconWidget; DateTimeDisplayer *m_dateTimeWidget; QBoxLayout *m_appPluginLayout; - QBoxLayout *m_appDatetimeLayout; QBoxLayout *m_mainLayout; TrayGridView *m_trayView; TrayModel *m_model; TrayDelegate *m_delegate; - Dock::Position m_postion; + Dock::Position m_position; QLabel *m_splitLine; + DockInter *m_dockInter; + bool m_singleShow; // 用于记录当前日期时间和插件区域是显示一行还是显示多行 + int m_borderRadius; // 圆角的值 }; #endif // PLUGINWINDOW_H diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp new file mode 100644 index 000000000..708179cba --- /dev/null +++ b/frame/window/windowmanager.cpp @@ -0,0 +1,810 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "mainwindow.h" +#include "windowmanager.h" +#include "traymainwindow.h" +#include "multiscreenworker.h" +#include "menuworker.h" +#include "dockitemmanager.h" +#include "dockscreen.h" +#include "displaymanager.h" +#include "proxyplugincontroller.h" + +#include +#include + +#include +#include +#include + +#include +#include + +DGUI_USE_NAMESPACE + +#define SNI_WATCHER_SERVICE "org.kde.StatusNotifierWatcher" +#define SNI_WATCHER_PATH "/StatusNotifierWatcher" + +#define DOCKSCREEN_INS DockScreen::instance() +#define DIS_INS DisplayManager::instance() + +using org::kde::StatusNotifierWatcher; + +WindowManager::WindowManager(MultiScreenWorker *multiScreenWorker, QObject *parent) + : QObject(parent) + , m_multiScreenWorker(multiScreenWorker) + , m_displayMode(Dock::DisplayMode::Efficient) + , m_position(Dock::Position::Bottom) + , m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()) + , m_sniWatcher(new StatusNotifierWatcher(SNI_WATCHER_SERVICE, SNI_WATCHER_PATH, QDBusConnection::sessionBus(), this)) +{ + initSNIHost(); + initConnection(); + initMember(); +} + +WindowManager::~WindowManager() +{ +} + +void WindowManager::addWindow(MainWindowBase *window) +{ + connect(window, &MainWindowBase::requestUpdate, this, &WindowManager::onRequestUpdate); + + window->setPosition(m_multiScreenWorker->position()); + window->setDisplayMode(m_multiScreenWorker->displayMode()); + window->setOrder(m_topWindows.size()); + + m_topWindows << window; +} + +void WindowManager::launch() +{ + if (!qApp->property("CANSHOW").toBool()) + return; + + const QString ¤tScreen = DOCKSCREEN_INS->current(); + if (m_multiScreenWorker->hideMode() == HideMode::KeepShowing) { + onPlayAnimation(currentScreen, m_multiScreenWorker->position(), Dock::AniAction::Show); + } else if (m_multiScreenWorker->hideMode() == HideMode::KeepHidden) { + qApp->setProperty(PROP_HIDE_STATE, HideState::Hide); + onUpdateDockGeometry(HideMode::KeepHidden); + } else if (m_multiScreenWorker->hideMode() == HideMode::SmartHide) { + switch(m_multiScreenWorker->hideState()) { + case HideState::Show: + onPlayAnimation(currentScreen, m_multiScreenWorker->position(), Dock::AniAction::Show); + break; + case HideState::Hide: + onPlayAnimation(currentScreen, m_multiScreenWorker->position(), Dock::AniAction::Hide); + break; + default: + break; + } + + qApp->setProperty(PROP_HIDE_STATE, m_multiScreenWorker->hideState()); + } + + QMetaObject::invokeMethod(this, [ this ] { + for (MainWindowBase *mainWindow : m_topWindows) + mainWindow->setDisplayMode(m_multiScreenWorker->displayMode()); + }, Qt::QueuedConnection); +} + +void WindowManager::sendNotifications() +{ + QStringList actionButton; + actionButton << "reload" << tr("Exit Safe Mode"); + QVariantMap hints; + hints["x-deepin-action-reload"] = QString("dbus-send,--session,--dest=com.deepin.dde.Dock,--print-reply,/com/deepin/dde/Dock,com.deepin.dde.Dock.ReloadPlugins"); + // 在进入安全模式时,执行此DBUS耗时25S左右,导致任务栏显示阻塞,所以使用线程调用 + QtConcurrent::run(QThreadPool::globalInstance(), [ = ] { + DDBusSender() + .service("com.deepin.dde.Notification") + .path("/com/deepin/dde/Notification") + .interface("com.deepin.dde.Notification") + .method(QString("Notify")) + .arg(QString("dde-control-center")) // appname + .arg(static_cast(0)) // id + .arg(QString("preferences-system")) // icon + .arg(QString(tr("Dock - Safe Mode"))) // summary + .arg(QString(tr("The Dock is in safe mode, please exit to show it properly"))) // content + .arg(actionButton) // actions + .arg(hints) // hints + .arg(15000) // timeout + .call(); + }); +} + +/** + * @brief MainWindow::callShow + * 此方法是被外部进程通过DBus调用的。 + * @note 当任务栏以-r参数启动时,其不会显示界面,需要在外部通过DBus调用此接口之后才会显示界面, + * 这里是以前为了优化任务栏的启动速度做的处理,当任务栏启动时,此时窗管进程可能还未启动完全, + * 部分设置未初始化完等,导致任务栏显示的界面异常,所以留下此接口,被startdde延后调用 + */ + +void WindowManager::callShow() +{ + static bool flag = false; + if (flag) { + return; + } + flag = true; + + qApp->setProperty("CANSHOW", true); + + launch(); + + // 预留200ms提供给窗口初始化再通知startdde,不影响启动速度 + QTimer::singleShot(200, this, &WindowManager::RegisterDdeSession); +} + +/** 调整任务栏的大小,这个接口提供给dbus使用,一般是控制中心来调用 + * @brief WindowManager::resizeDock + * @param offset + * @param dragging + */ +void WindowManager::resizeDock(int offset, bool dragging) +{ + QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + if (!screen) + return; + + m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, dragging); + + int dockSize = qBound(DOCK_MIN_SIZE, offset, DOCK_MAX_SIZE); + for (MainWindowBase *mainWindow : m_topWindows) { + QRect windowRect = mainWindow->getDockGeometry(screen, m_multiScreenWorker->position(), m_multiScreenWorker->displayMode(), Dock::HideState::Hide); + QRect newWindowRect; + switch (m_multiScreenWorker->position()) { + case Top: { + newWindowRect.setX(windowRect.x()); + newWindowRect.setY(windowRect.y()); + newWindowRect.setWidth(windowRect.width()); + newWindowRect.setHeight(dockSize); + break; + } + case Bottom: { + newWindowRect.setX(windowRect.x()); + newWindowRect.setY(windowRect.y() + windowRect.height() - dockSize); + newWindowRect.setWidth(windowRect.width()); + newWindowRect.setHeight(dockSize); + break; + } + case Left: { + newWindowRect.setX(windowRect.x()); + newWindowRect.setY(windowRect.y()); + newWindowRect.setWidth(dockSize); + newWindowRect.setHeight(windowRect.height()); + break; + } + case Right: { + newWindowRect.setX(windowRect.x() + windowRect.width() - dockSize); + newWindowRect.setY(windowRect.y()); + newWindowRect.setWidth(dockSize); + newWindowRect.setHeight(windowRect.height()); + break; + } + } + + // 更新界面大小 + mainWindow->blockSignals(true); + mainWindow->setFixedSize(newWindowRect.size()); + mainWindow->resetPanelGeometry(); + mainWindow->move(newWindowRect.topLeft()); + mainWindow->blockSignals(false); + } + + m_multiScreenWorker->updateDaemonDockSize(dockSize); +} + +/** 获取任务栏的实际大小,这个接口用于获取任务栏的尺寸返回给dbus接口 + * @brief WindowManager::geometry + * @return 任务栏的实际尺寸和位置信息 + */ +QRect WindowManager::geometry() const +{ + int x = 0; + int y = 0; + int width = 0; + int height = 0; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + for (int i = 0; i < m_topWindows.size(); i++) { + MainWindowBase *mainWindow = m_topWindows[i]; + if (!mainWindow->isVisible()) + continue; + + QRect windowRect = mainWindow->rect(); + if (i == 0 || x > windowRect.x()) + x = windowRect.x(); + if (i == 0) { + y = windowRect.y(); + height = windowRect.height(); + } + width += windowRect.width() + mainWindow->dockSpace(); + } + + return QRect(x, y, width, height); + } + + for (int i = 0; i < m_topWindows.size(); i++) { + MainWindowBase *mainWindow = m_topWindows[i]; + if (!mainWindow->isVisible()) + continue; + + QRect windowRect = mainWindow->rect(); + if (i == 0 || y > windowRect.y()) + y = windowRect.y(); + + if (i == 0) { + x = windowRect.x(); + width = windowRect.width(); + } + + height += windowRect.height() + mainWindow->dockSpace(); + } + + return QRect(x, y, width, height); +} + +void WindowManager::onUpdateDockGeometry(const Dock::HideMode &hideMode) +{ + Dock::HideState hideState; + if (hideMode == HideMode::KeepShowing || (hideMode == HideMode::SmartHide && m_multiScreenWorker->hideState() == HideState::Show)) + hideState = Dock::HideState::Show; + else + hideState = Dock::HideState::Hide; + + updateMainGeometry(hideState); +} + +void WindowManager::onPositionChanged(const Dock::Position &position) +{ + Position lastPos = m_position; + if (lastPos == position) + return; + + m_position = position; + // 调用设置位置,一会根据需要放到实际的位置 + for (MainWindowBase *mainWindow : m_topWindows) + mainWindow->setPosition(position); + + // 在改变位置后,需要根据当前任务栏是隐藏还是显示,来调整左右两侧区域的大小 + onUpdateDockGeometry(HideMode::KeepHidden); +} + +void WindowManager::onDisplayModeChanged(const Dock::DisplayMode &displayMode) +{ + m_displayMode = displayMode; + + DockItem::setDockDisplayMode(m_displayMode); + qApp->setProperty(PROP_DISPLAY_MODE, QVariant::fromValue(displayMode)); + + for (MainWindowBase *mainWindow : m_topWindows) + mainWindow->setDisplayMode(m_displayMode); + + onUpdateDockGeometry(m_multiScreenWorker->hideMode()); +} + +void WindowManager::onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) +{ + Q_UNUSED(oldOwner); + + if (name == SNI_WATCHER_SERVICE && !newOwner.isEmpty()) { + qDebug() << SNI_WATCHER_SERVICE << "SNI watcher daemon started, register dock to watcher as SNI Host"; + m_sniWatcher->RegisterStatusNotifierHost(m_sniHostService); + } +} + +void WindowManager::showAniFinish() +{ + qApp->setProperty(PROP_HIDE_STATE, HideState::Show); + + // 通知后端更新区域 + onRequestUpdateFrontendGeometry(); + onRequestNotifyWindowManager(); +} + +void WindowManager::hideAniFinish() +{ + DockItem::setDockPosition(m_position); + qApp->setProperty(PROP_POSITION, QVariant::fromValue(m_position)); + qApp->setProperty(PROP_HIDE_STATE, HideState::Hide); + // 通知后端更新区域 + onRequestUpdateFrontendGeometry(); + onRequestNotifyWindowManager(); +} + +/**获取整个任务栏区域的位置和尺寸的信息,用于提供给后端设置位置等信息 + * @brief WindowManager::getDockGeometry + * @param withoutScale + * @return + */ +QRect WindowManager::getDockGeometry(bool withoutScale) const +{ + QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + if (!screen) + return QRect(); + + int x = 0; + int y = 0; + int width = 0; + int height = 0; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + for (int i = 0; i < m_topWindows.size(); i++) { + MainWindowBase *mainWindow = m_topWindows[i]; + if (!mainWindow->isVisible()) + continue; + + QRect windowRect = mainWindow->getDockGeometry(screen, m_position, m_displayMode, Dock::HideState::Show, withoutScale); + if (i == 0 || x > windowRect.x()) + x = windowRect.x(); + + if (i == 0) { + y = windowRect.y(); + height = windowRect.height(); + } + width += windowRect.width() + mainWindow->dockSpace(); + } + } else { + for (int i = 0; i < m_topWindows.size(); i++) { + MainWindowBase *mainWindow = m_topWindows[i]; + if (!mainWindow->isVisible()) + continue; + + QRect windowRect = mainWindow->getDockGeometry(screen, m_position, m_displayMode, Dock::HideState::Show, withoutScale); + if (i == 0 || y > windowRect.y()) + y = windowRect.y(); + + if (i == 0) { + y = windowRect.y(); + width = windowRect.width(); + } + height += windowRect.height() + mainWindow->dockSpace(); + } + } + + return QRect(x, y, width, height); +} + +void WindowManager::RegisterDdeSession() +{ + QString envName("DDE_SESSION_PROCESS_COOKIE_ID"); + + QByteArray cookie = qgetenv(envName.toUtf8().data()); + qunsetenv(envName.toUtf8().data()); + + if (!cookie.isEmpty()) { + QDBusPendingReply r = DDBusSender() + .interface("com.deepin.SessionManager") + .path("/com/deepin/SessionManager") + .service("com.deepin.SessionManager") + .method("Register") + .arg(QString(cookie)) + .call(); + + qDebug() << Q_FUNC_INFO << r.value(); + } +} + +void WindowManager::initConnection() +{ + connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &WindowManager::onDbusNameOwnerChanged); + + connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateDockGeometry, this, &WindowManager::onUpdateDockGeometry); + connect(m_multiScreenWorker, &MultiScreenWorker::positionChanged, this, &WindowManager::onPositionChanged); + connect(m_multiScreenWorker, &MultiScreenWorker::displayModeChanged, this, &WindowManager::onDisplayModeChanged); + connect(m_multiScreenWorker, &MultiScreenWorker::requestPlayAnimation, this, &WindowManager::onPlayAnimation); + connect(m_multiScreenWorker, &MultiScreenWorker::requestChangeDockPosition, this, &WindowManager::onChangeDockPosition); + connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateFrontendGeometry, this, &WindowManager::onRequestUpdateFrontendGeometry); + connect(m_multiScreenWorker, &MultiScreenWorker::requestNotifyWindowManager, this, &WindowManager::onRequestNotifyWindowManager); + connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateFrontendGeometry, DockItemManager::instance(), &DockItemManager::requestUpdateDockItem); + connect(DockItemManager::instance(), &DockItemManager::requestWindowAutoHide, m_multiScreenWorker, &MultiScreenWorker::onAutoHideChanged); +} + +void WindowManager::initSNIHost() +{ + QDBusConnection dbusConn = QDBusConnection::sessionBus(); + m_sniHostService = QString("org.kde.StatusNotifierHost-") + QString::number(qApp->applicationPid()); + dbusConn.registerService(m_sniHostService); + dbusConn.registerObject("/StatusNotifierHost", this); + + if (m_sniWatcher->isValid()) { + m_sniWatcher->RegisterStatusNotifierHost(m_sniHostService); + } else { + qDebug() << SNI_WATCHER_SERVICE << "SNI watcher daemon is not exist for now!"; + } +} + +void WindowManager::initMember() +{ + m_displayMode = m_multiScreenWorker->displayMode(); + m_position = m_multiScreenWorker->position(); +} + +// 更新任务栏的位置和尺寸的信息 +void WindowManager::updateMainGeometry(const Dock::HideState &hideState) +{ + QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + if (!screen) + return; + + for (MainWindowBase *mainWindow : m_topWindows) { + QRect windowRect = mainWindow->getDockGeometry(screen, m_multiScreenWorker->position(), m_multiScreenWorker->displayMode(), hideState); + mainWindow->updateParentGeometry(m_position, windowRect); + } + + // 在切换模式的时候,需要根据实际当前是隐藏还是显示来记录当前任务栏是隐藏还是显示,MainPanelWindow会根据这个状态来决定怎么获取图标的尺寸, + // 如果不加上这一行,那么鼠标在唤醒任务栏的时候,左侧区域会有显示问题 + qApp->setProperty(PROP_HIDE_STATE, hideState); +} + +void WindowManager::onPlayAnimation(const QString &screenName, const Dock::Position &pos, Dock::AniAction act, bool containMouse, bool updatePos) +{ + // 如果containMouse= true,则需要计算鼠标是否包含在任务栏的位置, 如果鼠标在任务栏内部,则无需执行动画,这种情况一般用于执行隐藏模式发生变化的时候 + if (containMouse) { + QRect dockGeometry = getDockGeometry(false); + if (dockGeometry.contains(QCursor::pos())) + return; + } + + if (act == Dock::AniAction::Show) { + for (MainWindowBase *mainWindow : m_topWindows) { + if (mainWindow->windowType() != MainWindowBase::DockWindowType::MainWindow) + continue; + + // 如果请求显示的动画,且当前任务栏已经显示,则不继续执行动画 + if (mainWindow->width() > 0 && mainWindow->height() > 0) + return; + } + } + + QScreen *screen = DIS_INS->screen(screenName); + if (!m_multiScreenWorker->testState(MultiScreenWorker::RunState::AutoHide) || qApp->property("DRAG_STATE").toBool() + || m_multiScreenWorker->testState(MultiScreenWorker::RunState::ChangePositionAnimationStart) + || m_multiScreenWorker->testState(MultiScreenWorker::RunState::HideAnimationStart) + || m_multiScreenWorker->testState(MultiScreenWorker::RunState::ShowAnimationStart) + || !screen) + return; + + QParallelAnimationGroup *group = createAnimationGroup(act, screenName, pos); + if (!group) + return; + + switch (act) { + case Dock::AniAction::Show: + m_multiScreenWorker->setStates(MultiScreenWorker::ShowAnimationStart); + break; + case Dock::AniAction::Hide: + m_multiScreenWorker->setStates(MultiScreenWorker::HideAnimationStart); + } + + connect(group, &QParallelAnimationGroup::finished, this, [ = ] { + switch (act) { + case Dock::AniAction::Show: + showAniFinish(); + if (updatePos) + onPositionChanged(m_multiScreenWorker->position()); + m_multiScreenWorker->setStates(MultiScreenWorker::ShowAnimationStart, false); + break; + case Dock::AniAction::Hide: + hideAniFinish(); + if (updatePos) + onPositionChanged(m_multiScreenWorker->position()); + m_multiScreenWorker->setStates(MultiScreenWorker::HideAnimationStart, false); + break; + } + }); + + group->stop(); + group->start(QVariantAnimation::DeleteWhenStopped); +} + +/**创建动画,在时尚模式先同时创建左区域和右区域的动画 + * @brief WindowManager::createAnimationGroup + * @param aniAction 显示动画还是隐藏动画 + * @param screenName 执行动画的屏幕 + * @param position 执行动画的位置(上下左右) + * @return 要执行的动画组(左右侧区域同时执行的动画组) + */ +QParallelAnimationGroup *WindowManager::createAnimationGroup(const Dock::AniAction &aniAction, const QString &screenName, const Dock::Position &position) const +{ + QScreen *screen = DIS_INS->screen(screenName); + if (!screen) + return nullptr; + + bool stopAnimation = false; + QList animations; + for (MainWindowBase *mainWindow : m_topWindows) { + if (!mainWindow->isVisible()) + continue; + + QVariantAnimation *ani = mainWindow->createAnimation(screen, position, aniAction); + if (!ani) { + stopAnimation = true; + continue; + } + + animations << ani; + } + + if (stopAnimation) { + qDeleteAll(animations.begin(), animations.end()); + return nullptr; + } + + QParallelAnimationGroup *aniGroup = new QParallelAnimationGroup; + for (QVariantAnimation *ani : animations) { + ani->setParent(aniGroup); + aniGroup->addAnimation(ani); + } + + return aniGroup; +} + +void WindowManager::onChangeDockPosition(QString fromScreen, QString toScreen, const Dock::Position &fromPos, const Dock::Position &toPos) +{ + QList animations; + // 获取隐藏的动作 + QParallelAnimationGroup *hideGroup = createAnimationGroup(Dock::AniAction::Hide, fromScreen, fromPos); + if (hideGroup) { + connect(hideGroup, &QParallelAnimationGroup::finished, this, [ = ] { + // 在隐藏动画结束的时候,开始设置位置信息 + onPositionChanged(m_multiScreenWorker->position()); + DockItem::setDockPosition(m_multiScreenWorker->position()); + qApp->setProperty(PROP_POSITION, QVariant::fromValue(m_multiScreenWorker->position())); + }); + animations << hideGroup; + } + // 获取显示的动作 + QParallelAnimationGroup *showGroup = createAnimationGroup(Dock::AniAction::Show, toScreen, toPos); + if (showGroup) + animations << showGroup; + + if (animations.size() == 0) + return; + + m_multiScreenWorker->setStates(MultiScreenWorker::ChangePositionAnimationStart); + + QSequentialAnimationGroup *group = new QSequentialAnimationGroup; + connect(group, &QVariantAnimation::finished, this, [ = ] { + // 结束之后需要根据确定需要再隐藏 + showAniFinish(); + m_multiScreenWorker->setStates(MultiScreenWorker::ChangePositionAnimationStart, false); + }); + + for (QParallelAnimationGroup *ani : animations) { + ani->setParent(group); + group->addAnimation(ani); + } + + group->start(QVariantAnimation::DeleteWhenStopped); +} + +void WindowManager::onRequestUpdateFrontendGeometry() +{ + QRect rect = getDockGeometry(false); + // 向com.deepin.dde.daemon.Dock的SetFrontendWindowRect接口设置区域时,此区域的高度或宽度不能为0,否则会导致其HideState属性循环切换,造成任务栏循环显示或隐藏 + if (rect.width() == 0 || rect.height() == 0) + return; + + DockInter dockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus()); + dockInter.SetFrontendWindowRect(int(rect.x()), int(rect.y()), uint(rect.width()), uint(rect.height())); +} + +void WindowManager::onRequestNotifyWindowManager() +{ + static QRect lastRect = QRect(); + static int lastScreenWidth = 0; + static int lastScreenHeight = 0; + + // 从列表中查找主窗口 + MainWindowBase *mainWindow = nullptr; + for (MainWindowBase *window : m_topWindows) { + if (window->windowType() != MainWindowBase::DockWindowType::MainWindow) + continue; + + mainWindow = window; + break; + } + + if (!mainWindow) + return; + + /* 在非主屏或非一直显示状态时,清除任务栏区域,不挤占应用 */ + if ((!DIS_INS->isCopyMode() && DOCKSCREEN_INS->current() != DOCKSCREEN_INS->primary()) || m_multiScreenWorker->hideMode() != HideMode::KeepShowing) { + lastRect = QRect(); + + if (Utils::IS_WAYLAND_DISPLAY) { + QList varList; + varList.append(0);//dock位置 + varList.append(0);//dock高度/宽度 + varList.append(0);//start值 + varList.append(0);//end值 + + // 此处只需获取左侧主窗口部分即可 + QPlatformWindow *windowHandle = mainWindow->windowHandle()->handle(); + if (windowHandle) + QGuiApplication::platformNativeInterface()->setWindowProperty(windowHandle, "_d_dwayland_dockstrut", varList); + + } else { + const auto display = QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + return; + } + + XcbMisc::instance()->clear_strut_partial(xcb_window_t(mainWindow->winId())); + } + + return; + } + + QRect dockGeometry = getDockGeometry(true); + if (lastRect == dockGeometry + && lastScreenWidth == DIS_INS->screenRawWidth() + && lastScreenHeight == DIS_INS->screenRawHeight()) { + return; + } + + lastRect = dockGeometry; + lastScreenWidth = DIS_INS->screenRawWidth(); + lastScreenHeight = DIS_INS->screenRawHeight(); + qDebug() << "dock real geometry:" << dockGeometry; + qDebug() << "screen width:" << DIS_INS->screenRawWidth() << ", height:" << DIS_INS->screenRawHeight(); + + const qreal &ratio = qApp->devicePixelRatio(); + if (Utils::IS_WAYLAND_DISPLAY) { + QList varList = {0, 0, 0, 0}; + switch (m_position) { + case Position::Top: + varList[0] = 1; + varList[1] = dockGeometry.y() + dockGeometry.height() + WINDOWMARGIN * ratio; + varList[2] = dockGeometry.x(); + varList[3] = dockGeometry.x() + dockGeometry.width(); + break; + case Position::Bottom: + varList[0] = 3; + varList[1] = DIS_INS->screenRawHeight() - dockGeometry.y() + WINDOWMARGIN * ratio; + varList[2] = dockGeometry.x(); + varList[3] = dockGeometry.x() + dockGeometry.width(); + break; + case Position::Left: + varList[0] = 0; + varList[1] = dockGeometry.x() + dockGeometry.width() + WINDOWMARGIN * ratio; + varList[2] = dockGeometry.y(); + varList[3] = dockGeometry.y() + dockGeometry.height(); + break; + case Position::Right: + varList[0] = 2; + varList[1] = DIS_INS->screenRawWidth() - dockGeometry.x() + WINDOWMARGIN * ratio; + varList[2] = dockGeometry.y(); + varList[3] = dockGeometry.y() + dockGeometry.height(); + break; + } + + QPlatformWindow *windowHandle = mainWindow->windowHandle()->handle(); + if (windowHandle) { + QGuiApplication::platformNativeInterface()->setWindowProperty(windowHandle,"_d_dwayland_dockstrut", varList); + } + } else { + XcbMisc::Orientation orientation = XcbMisc::OrientationTop; + double strut = 0; + double strutStart = 0; + double strutEnd = 0; + + switch (m_position) { + case Position::Top: + orientation = XcbMisc::OrientationTop; + strut = dockGeometry.y() + dockGeometry.height(); + strutStart = dockGeometry.x(); + strutEnd = qMin(dockGeometry.x() + dockGeometry.width(), dockGeometry.right()); + break; + case Position::Bottom: + orientation = XcbMisc::OrientationBottom; + strut = DIS_INS->screenRawHeight() - dockGeometry.y(); + strutStart = dockGeometry.x(); + strutEnd = qMin(dockGeometry.x() + dockGeometry.width(), dockGeometry.right()); + break; + case Position::Left: + orientation = XcbMisc::OrientationLeft; + strut = dockGeometry.x() + dockGeometry.width(); + strutStart = dockGeometry.y(); + strutEnd = qMin(dockGeometry.y() + dockGeometry.height(), dockGeometry.bottom()); + break; + case Position::Right: + orientation = XcbMisc::OrientationRight; + strut = DIS_INS->screenRawWidth() - dockGeometry.x(); + strutStart = dockGeometry.y(); + strutEnd = qMin(dockGeometry.y() + dockGeometry.height(), dockGeometry.bottom()); + break; + } + + qDebug() << "set reserved area to xcb:" << strut << strutStart << strutEnd; + + const auto display = QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + return; + } + + XcbMisc::instance()->set_strut_partial(static_cast(mainWindow->winId()), orientation, + static_cast(strut + WINDOWMARGIN * ratio), // 设置窗口与屏幕边缘距离,需要乘缩放 + static_cast(strutStart), // 设置任务栏起点坐标(上下为x,左右为y) + static_cast(strutEnd)); // 设置任务栏终点坐标(上下为x,左右为y) + } +} + +void WindowManager::onRequestUpdate() +{ + // 如果当前正在执行动画,则无需设置 + if (m_multiScreenWorker->testState(MultiScreenWorker::ChangePositionAnimationStart) + || m_multiScreenWorker->testState(MultiScreenWorker::ShowAnimationStart) + || m_multiScreenWorker->testState(MultiScreenWorker::HideAnimationStart)) + return; + + QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + // 查找发送信号的窗口 + MainWindowBase *dragWindow = qobject_cast(sender()); + if (!dragWindow || !screen) + return; + + QRect dragGeometry = dragWindow->geometry(); + for (MainWindowBase *mainWindow : m_topWindows) { + if (!mainWindow->isVisible()) + continue; + + QRect windowShowSize = mainWindow->getDockGeometry(screen, m_multiScreenWorker->position(), + m_multiScreenWorker->displayMode(), Dock::HideState::Show); + switch(m_position) { + case Dock::Position::Top: { + windowShowSize.setHeight(dragGeometry.height()); + break; + } + case Dock::Position::Bottom: { + int bottomY = windowShowSize.y() + windowShowSize.height(); + windowShowSize.setY(bottomY - dragGeometry.height()); + windowShowSize.setHeight(dragGeometry.height()); + break; + } + case Dock::Position::Left: { + windowShowSize.setWidth(dragGeometry.width()); + break; + } + case Dock::Position::Right: { + int righyX = windowShowSize.x() + windowShowSize.width(); + windowShowSize.setX(righyX - dragGeometry.width()); + windowShowSize.setWidth(dragGeometry.width()); + break; + } + } + + mainWindow->blockSignals(true); + mainWindow->raise(); + mainWindow->setFixedSize(windowShowSize.size()); + mainWindow->move(windowShowSize.topLeft()); + mainWindow->resetPanelGeometry(); + mainWindow->blockSignals(false); + } + + // 抛出geometry变化的信号,通知控制中心调整尺寸 + Q_EMIT panelGeometryChanged(); +} diff --git a/frame/window/windowmanager.h b/frame/window/windowmanager.h new file mode 100644 index 000000000..6b33289d5 --- /dev/null +++ b/frame/window/windowmanager.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef WINDOWMANAGER_H +#define WINDOWMANAGER_H + +#include "constants.h" +#include "statusnotifierwatcher_interface.h" + +#include + +namespace Dtk {namespace Gui { class DWindowManagerHelper; }} + +class MainWindowBase; +class MainWindow; +class TrayMainWindow; +class MultiScreenWorker; +class MenuWorker; +class QDBusConnectionInterface; + +using namespace Dtk::Gui; + +class WindowManager : public QObject +{ + Q_OBJECT + +public: + explicit WindowManager(MultiScreenWorker *multiScreenWorker, QObject *parent = nullptr); + ~WindowManager() override; + + void addWindow(MainWindowBase *window); + void launch(); + void sendNotifications(); + void callShow(); + void resizeDock(int offset, bool dragging); + QRect geometry() const; + +Q_SIGNALS: + void panelGeometryChanged(); + +private: + void initConnection(); + void initSNIHost(); + void initMember(); + void updateMainGeometry(const Dock::HideState &hideState); + QParallelAnimationGroup *createAnimationGroup(const Dock::AniAction &aniAction, const QString &screenName, const Dock::Position &position) const; + + void showAniFinish(); + void hideAniFinish(); + QRect getDockGeometry(bool withoutScale = false) const; // 计算左右侧加起来的区域大小 + + void RegisterDdeSession(); + +private Q_SLOTS: + void onRequestUpdate(); // 调整尺寸的时候 + + void onUpdateDockGeometry(const Dock::HideMode &hideMode); + void onPositionChanged(const Dock::Position &position); + void onDisplayModeChanged(const Dock::DisplayMode &displayMode); + + void onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); + + void onPlayAnimation(const QString &screenName, const Dock::Position &pos, Dock::AniAction act, bool containMouse = false, bool updatePos = false); + void onChangeDockPosition(QString fromScreen, QString toScreen, const Dock::Position &fromPos, const Dock::Position &toPos); + void onRequestUpdateFrontendGeometry(); + void onRequestNotifyWindowManager(); + +private: + MultiScreenWorker *m_multiScreenWorker; + QString m_sniHostService; + + Dock::DisplayMode m_displayMode; + Dock::Position m_position; + + QDBusConnectionInterface *m_dbusDaemonInterface; + org::kde::StatusNotifierWatcher *m_sniWatcher; // DBUS状态通知 + QList m_topWindows; +}; + +#endif // WINDOWMANAGER_H diff --git a/interfaces/constants.h b/interfaces/constants.h index 669699d73..407aaff2b 100644 --- a/interfaces/constants.h +++ b/interfaces/constants.h @@ -43,6 +43,8 @@ namespace Dock { // 插件最小尺寸,图标采用深色 #define PLUGIN_MIN_ICON_NAME "-dark" +// dock最小尺寸 +#define DOCK_MIN_SIZE 40 // dock最大尺寸 #define DOCK_MAX_SIZE 100 /// @@ -96,6 +98,11 @@ enum HideState { Hide = 2, }; +enum class AniAction { + Show = 0, + Hide +}; + #define IS_TOUCH_STATE "isTouchState" } From 282e933225c3784aeae0e263f16484743cfff606 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 16 Aug 2022 17:20:51 +0000 Subject: [PATCH 077/257] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=9F=BA=E7=B1=BB=E7=9A=84isPrimary=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除isPrimary()接口,插件继承的时候无需实现该接口,任务栏读取是否主插件的时候从json中读取配置即可 Log: 优化任务栏插件的接口 Influence: 安装网络插件,查看网络插件是否在快捷设置面板中显示两列图标 Task: https://pms.uniontech.com/task-view-121387.html Change-Id: I1d47e6c7b4162f4fdc36bf4879bbd85c0caaff69 --- frame/controller/quicksettingcontroller.cpp | 8 +++++-- frame/item/quicksettingitem.cpp | 15 +++++++++++--- frame/item/quicksettingitem.h | 4 +++- frame/window/quickpluginwindow.cpp | 23 +++++++++++++++++---- frame/window/quickpluginwindow.h | 4 +++- frame/window/quicksettingcontainer.cpp | 6 +++--- interfaces/pluginsiteminterface.h | 6 ------ 7 files changed, 46 insertions(+), 20 deletions(-) diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 7d8d45bd3..e507291b8 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -40,7 +40,7 @@ void QuickSettingController::sortPlugins() QList primarySettingItems; QList quickItems; for (QuickSettingItem *item : m_quickSettingItems) { - if (item->pluginItem()->isPrimary()) + if (item->isPrimary()) primarySettingItems << item; else quickItems << item; @@ -70,7 +70,11 @@ void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, c if (findItemIterator != m_quickSettingItems.end()) return; - QuickSettingItem *quickItem = new QuickSettingItem(itemInter, itemKey); + QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter); + QJsonObject metaData; + if (pluginLoader) + metaData = pluginLoader->metaData().value("MetaData").toObject(); + QuickSettingItem *quickItem = new QuickSettingItem(itemInter, itemKey, metaData); m_quickSettingItems << quickItem; sortPlugins(); diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 58f36610e..2e2e75063 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -43,10 +43,11 @@ static QSize expandSize = QSize(20, 20); -QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) +QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent) : DockItem(parent) , m_pluginInter(pluginInter) , m_itemKey(itemKey) + , m_metaData(metaData) { setAcceptDrops(true); this->installEventFilter(this); @@ -96,6 +97,14 @@ const QString QuickSettingItem::itemKey() const return m_itemKey; } +bool QuickSettingItem::isPrimary() const +{ + if (m_metaData.contains("primary")) + return m_metaData.value("primary").toBool(); + + return false; +} + void QuickSettingItem::paintEvent(QPaintEvent *e) { QWidget::paintEvent(e); @@ -125,7 +134,7 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) QPainter pa(&pm); pa.setCompositionMode(QPainter::CompositionMode_SourceIn); pa.fillRect(pm.rect(), painter.pen().brush()); - if (m_pluginInter->isPrimary()) { + if (isPrimary()) { // 如果是主图标,则显示阴影背景 int marginYSpace = yMarginSpace(); QRect iconBg(MARGINLEFTSPACE, marginYSpace, BGSIZE, BGSIZE); @@ -201,7 +210,7 @@ QColor QuickSettingItem::foregroundColor() const void QuickSettingItem::mouseReleaseEvent(QMouseEvent *event) { // 如果是鼠标的按下事件 - if (m_pluginInter->isPrimary()) { + if (isPrimary()) { QMouseEvent *mouseEvent = static_cast(event); QRect rctExpand(rect().width() - MARGINRIGHTSPACE - expandSize.width(), (rect().height() - expandSize.height()) / 2, diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 69b824db3..08c416395 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -39,9 +39,10 @@ public: ItemType itemType() const override; const QPixmap dragPixmap(); const QString itemKey() const; + bool isPrimary() const; protected: - QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent = nullptr); ~QuickSettingItem() override; void paintEvent(QPaintEvent *e) override; @@ -57,6 +58,7 @@ private: private: PluginsItemInterface *m_pluginInter; QString m_itemKey; + QJsonObject m_metaData; }; #endif // QUICKSETTINGITEM_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 573510990..40604d604 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -24,6 +24,7 @@ #include "pluginsiteminterface.h" #include "quicksettingcontainer.h" #include "appdrag.h" +#include "proxyplugincontroller.h" #include #include @@ -334,7 +335,7 @@ int QuickPluginWindow::getDropIndex(QPoint point) QuickDockItem *dockBeforeItem = qobject_cast(layoutBefore->widget()); QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); - if (dockItem->pluginItem()->isPrimary()) + if (dockItem->isPrimary()) continue; if (dockBeforeItem->geometry().x() > point.x() && dockItem->geometry().right() < point.x()) @@ -348,7 +349,7 @@ int QuickPluginWindow::getDropIndex(QPoint point) continue; QuickDockItem *dockBeforeItem = qobject_cast(layoutBefore->widget()); - if (dockBeforeItem->pluginItem()->isPrimary()) + if (dockBeforeItem->isPrimary()) break; QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); @@ -439,7 +440,12 @@ void QuickPluginWindow::resetPluginDisplay() if (pluginItems.contains(item)) { itemWidget = pluginItems[item]; } else { - itemWidget = new QuickDockItem(item, this); + QJsonObject metaData; + QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(item); + if (pluginLoader) + metaData = pluginLoader->metaData().value("MetaData").toObject(); + + itemWidget = new QuickDockItem(item, metaData, this); itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); } connect(itemWidget, &QuickDockItem::clicked, this, &QuickPluginWindow::onFixedClick); @@ -474,9 +480,10 @@ void QuickPluginWindow::initConnection() * @param pluginItem * @param parent */ -QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, QWidget *parent) +QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, QWidget *parent) : QWidget(parent) , m_pluginItem(pluginItem) + , m_metaData(metaData) { } @@ -489,6 +496,14 @@ PluginsItemInterface *QuickDockItem::pluginItem() return m_pluginItem; } +bool QuickDockItem::isPrimary() const +{ + if (m_metaData.contains("primary")) + return m_metaData.value("primary").toBool(); + + return false; +} + void QuickDockItem::paintEvent(QPaintEvent *event) { if (!m_pluginItem) diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index ffad4a3a4..a873e0882 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -93,10 +93,11 @@ class QuickDockItem : public QWidget Q_OBJECT public: - explicit QuickDockItem(PluginsItemInterface *pluginItem, QWidget *parent = nullptr); + explicit QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, QWidget *parent = nullptr); ~QuickDockItem(); PluginsItemInterface *pluginItem(); + bool isPrimary() const; Q_SIGNALS: void clicked(); @@ -107,6 +108,7 @@ protected: private: PluginsItemInterface *m_pluginItem; + QJsonObject m_metaData; }; #endif // QUICKPLUGINWINDOW_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 133686b0d..0cc5141db 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -203,7 +203,7 @@ void QuickSettingContainer::mousePressEvent(QMouseEvent *event) return QWidget::mousePressEvent(event); QuickSettingItem *moveItem = qobject_cast(childAt(event->pos())); - if (!moveItem || moveItem->pluginItem()->isPrimary()) + if (!moveItem || moveItem->isPrimary()) return QWidget::mousePressEvent(event); m_dragPluginPosition = event->pos(); @@ -257,7 +257,7 @@ void QuickSettingContainer::updateItemLayout() int column = 0; QList quickSettings = m_pluginLoader->settingItems(); for (QuickSettingItem *item : quickSettings) { - int usedColumn = item->pluginItem()->isPrimary() ? 2 : 1; + int usedColumn = item->isPrimary() ? 2 : 1; m_pluginLayout->addWidget(item, row, column, 1, usedColumn); column += usedColumn; if (column >= COLUMNCOUNT) { @@ -361,7 +361,7 @@ void QuickSettingContainer::resizeView() int selfPluginCount = 0; for (QuickSettingItem *item : pluginItems) { // 如果是置顶的插件,则认为它占用两个普通插件的位置 - int increCount = (item->pluginItem()->isPrimary() ? 2 : 1); + int increCount = (item->isPrimary() ? 2 : 1); selfPluginCount += increCount; } int rowCount = selfPluginCount / COLUMNCOUNT; diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index e061bb03b..c296829b6 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -269,12 +269,6 @@ public: /// virtual PluginStatus status() const { return PluginStatus::Deactive; } - /// - /// return is primary plugin,if true, the plugin will display on top - /// the default value is false - /// - virtual bool isPrimary() const { return false; } - /// /// return the detail value, it will display in the center /// From 29647bf7a1b4114ec9818b3d0b249f62467a5a6f Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 19 Aug 2022 11:59:01 +0000 Subject: [PATCH 078/257] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9v20=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=B8=BAv23=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将所有用到的com.deepin相关的接口改成org.deepin相关的接口 Log: Influence: 打开控制中心,鼠标移动唤醒任务栏等操作 Task: https://pms.uniontech.com/task-view-182009.html Change-Id: I3c56dfaa0e95d03fc75468e0a7a5d2ce217a6e63 --- frame/item/components/appdragwidget.cpp | 2 +- frame/item/launcheritem.cpp | 15 +++----- frame/util/dbusutil.h | 38 +++++++++++++++++++ frame/util/menuworker.cpp | 12 +++--- frame/util/multiscreenworker.cpp | 19 +++++----- frame/window/components/datetimedisplayer.cpp | 17 ++------- .../window/components/volumedeviceswidget.cpp | 14 ++----- frame/window/windowmanager.cpp | 12 +++--- plugins/onboard/onboardplugin.cpp | 8 ++-- 9 files changed, 77 insertions(+), 60 deletions(-) diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index 9f10cff54..5ef5e73e7 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -452,7 +452,7 @@ void AppDragWidget::initWaylandEnv() // 由于在wayland环境下无法触发drop事件,导致鼠标无法释放,所以这里暂时用XEventMonitor的方式(具体原因待查) Dock::Position position = qApp->property(PROP_POSITION).value(); - XEventMonitor *extralEventInter = new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus()); + XEventMonitor *extralEventInter = new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus()); QList extralRectList; QList screens = DisplayManager::instance()->screens(); for (QScreen *screen : screens) { diff --git a/frame/item/launcheritem.cpp b/frame/item/launcheritem.cpp index 7e53e310f..2c8195e4f 100644 --- a/frame/item/launcheritem.cpp +++ b/frame/item/launcheritem.cpp @@ -23,6 +23,7 @@ #include "themeappicon.h" #include "utils.h" #include "../widgets/tipswidget.h" +#include "dbusutil.h" #include #include @@ -100,17 +101,11 @@ void LauncherItem::mouseReleaseEvent(QMouseEvent *e) if (e->button() != Qt::LeftButton) return; -#ifdef USE_AM DDBusSender dbusSender = DDBusSender() - .service("org.deepin.dde.Launcher1") - .path("/org/deepin/dde/Launcher1") - .interface("org.deepin.dde.Launcher1"); -#else - DDBusSender dbusSender = DDBusSender() - .service("com.deepin.dde.Launcher") - .path("/com/deepin/dde/Launcher") - .interface("com.deepin.dde.Launcher"); -#endif + .service(launcherService) + .path(launcherPath) + .interface(launcherInterface); + QDBusPendingReply visibleReply = dbusSender.property("Visible").get(); if (!visibleReply.value()) dbusSender.method("Show").call(); diff --git a/frame/util/dbusutil.h b/frame/util/dbusutil.h index a4d7b3da5..b540a3f8c 100644 --- a/frame/util/dbusutil.h +++ b/frame/util/dbusutil.h @@ -32,9 +32,47 @@ #ifdef USE_AM using DockInter = org::deepin::dde::daemon::DdeDock; using DockEntryInter = org::deepin::dde::daemon::dock::DockEntry; + +const QString xEventMonitorService = "org.deepin.api.XEventMonitor1"; +const QString xEventMonitorPath = "/org/deepin/api/XEventMonitor1"; + +const QString launcherService = "org.deepin.dde.Launcher1"; +const QString launcherPath = "/org/deepin/dde/Launcher1"; +const QString launcherInterface = "org.deepin.dde.Launcher1"; + +const QString controllCenterService = "org.deepin.dde.ControlCenter1"; +const QString controllCenterPath = "/org/deepin/dde/ControlCenter1"; +const QString controllCenterInterface = "org.deepin.dde.ControlCenter1"; + +const QString notificationService = "org.deepin.dde.Notification1"; +const QString notificationPath = "/org/deepin/dde/Notification1"; +const QString notificationInterface = "org.deepin.dde.Notification1"; + +const QString sessionManagerService = "org.deepin.SessionManager1"; +const QString sessionManagerPath = "/org/deepin/SessionManager1"; +const QString sessionManagerInterface = "org.deepin.SessionManager1"; #else using DockInter = com::deepin::dde::daemon::Dock; using DockEntryInter = com::deepin::dde::daemon::dock::Entry; + +const QString xEventMonitorService = "com.deepin.api.XEventMonitor"; +const QString xEventMonitorPath = "/com/deepin/api/XEventMonitor"; + +const QString launcherService = "com.deepin.dde.Launcher"; +const QString launcherPath = "/com/deepin/dde/Launcher"; +const QString launcherInterface = "com.deepin.dde.Launcher"; + +const QString controllCenterService = "com.deepin.dde.ControlCenter"; +const QString controllCenterPath = "/com/deepin/dde/ControlCenter"; +const QString controllCenterInterface = "com.deepin.dde.ControlCenter"; + +const QString notificationService = "com.deepin.dde.Notification"; +const QString notificationPath = "/com/deepin/dde/Notification"; +const QString notificationInterface = "com.deepin.dde.Notification"; + +const QString sessionManagerService = "com.deepin.SessionManager"; +const QString sessionManagerPath = "/com/deepin/SessionManager"; +const QString sessionManagerInterface = "com.deepin.SessionManager"; #endif inline const QString dockServiceName() diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index 8678b48b4..a260fabfe 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -156,16 +156,16 @@ void MenuWorker::createMenu(QMenu *settingsMenu) void MenuWorker::onDockSettingsTriggered() { #ifdef USE_AM - DDBusSender().service("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") + DDBusSender().service(controllCenterService) + .path(controllCenterPath) + .interface(controllCenterInterface) .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") + DDBusSender().service(controllCenterService) + .path("controllCenterPath") + .interface(controllCenterInterface) .method("ShowPage") .arg(QString("personalization/dock")) .call(); diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index a7170b8b9..7d2fc4675 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -55,11 +55,11 @@ const QString OnlyShowPrimary = "onlyShowPrimary"; MultiScreenWorker::MultiScreenWorker(QObject *parent) : QObject(parent) - , m_eventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) - , m_extralEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) - , m_touchEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) + , m_eventInter(new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus(), this)) + , m_extralEventInter(new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus(), this)) + , m_touchEventInter(new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus(), this)) , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) - , m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus(), this)) + , m_launcherInter(new DBusLuncher(launcherService, launcherPath, QDBusConnection::sessionBus(), this)) , m_monitorUpdateTimer(new QTimer(this)) , m_delayWakeTimer(new QTimer(this)) , m_position(Dock::Position::Bottom) @@ -856,20 +856,19 @@ void MultiScreenWorker::checkXEventMonitorService() connect(touchEventInter, &XEventMonitor::ButtonRelease, this, &MultiScreenWorker::onTouchRelease); }; - const QString serverName = "com.deepin.api.XEventMonitor"; QDBusConnectionInterface *ifc = QDBusConnection::sessionBus().interface(); - if (!ifc->isServiceRegistered(serverName)) { + if (!ifc->isServiceRegistered(xEventMonitorService)) { connect(ifc, &QDBusConnectionInterface::serviceOwnerChanged, this, [ = ](const QString & name, const QString & oldOwner, const QString & newOwner) { Q_UNUSED(oldOwner) - if (name == serverName && !newOwner.isEmpty()) { + if (name == xEventMonitorService && !newOwner.isEmpty()) { FREE_POINT(m_eventInter); FREE_POINT(m_extralEventInter); FREE_POINT(m_touchEventInter); - m_eventInter = new XEventMonitor(serverName, "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus()); - m_extralEventInter = new XEventMonitor(serverName, "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus()); - m_touchEventInter = new XEventMonitor(serverName, "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus()); + m_eventInter = new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus()); + m_extralEventInter = new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus()); + m_touchEventInter = new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus()); // connect connectionInit(m_eventInter, m_extralEventInter, m_touchEventInter); diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index 88c022944..81fe0538c 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -22,6 +22,7 @@ #include "tipswidget.h" #include "dockpopupwindow.h" #include "utils.h" +#include "dbusutil.h" #include #include @@ -338,23 +339,13 @@ void DateTimeDisplayer::createMenuItem() if (!QFile::exists(ICBC_CONF_FILE)) { QAction *timeSettingAction = new QAction(tr("Time settings"), this); connect(timeSettingAction, &QAction::triggered, this, [ = ] { -#ifdef USE_AM DDBusSender() - .service("org.deepin.dde.ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") + .service(controllCenterService) + .interface(controllCenterPath) + .path(controllCenterInterface) .method(QString("ShowPage")) .arg(QString("datetime")) .call(); -#else - DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowPage")) - .arg(QString("datetime")) - .call(); -#endif }); m_menu->addAction(timeSettingAction); diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp index 615ce1736..009822288 100644 --- a/frame/window/components/volumedeviceswidget.cpp +++ b/frame/window/components/volumedeviceswidget.cpp @@ -24,6 +24,7 @@ #include "settingdelegate.h" #include "imageutil.h" #include "slidercontainer.h" +#include "dbusutil.h" #include #include @@ -194,17 +195,10 @@ void VolumeDevicesWidget::initConnection() m_deviceList->update(); } else { // 打开控制中心的声音模块 -#ifdef USE_AM - DDBusSender().service("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") + DDBusSender().service(controllCenterService) + .path(controllCenterPath) + .interface(controllCenterInterface) .method("ShowPage").arg(QString("sound")).call(); -#else - DDBusSender().service("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .method("ShowPage").arg(QString("sound")).call(); -#endif hide(); } }); diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 708179cba..6fb1fc266 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -117,9 +117,9 @@ void WindowManager::sendNotifications() // 在进入安全模式时,执行此DBUS耗时25S左右,导致任务栏显示阻塞,所以使用线程调用 QtConcurrent::run(QThreadPool::globalInstance(), [ = ] { DDBusSender() - .service("com.deepin.dde.Notification") - .path("/com/deepin/dde/Notification") - .interface("com.deepin.dde.Notification") + .service(notificationService) + .path(notificationPath) + .interface(notificationInterface) .method(QString("Notify")) .arg(QString("dde-control-center")) // appname .arg(static_cast(0)) // id @@ -394,9 +394,9 @@ void WindowManager::RegisterDdeSession() if (!cookie.isEmpty()) { QDBusPendingReply r = DDBusSender() - .interface("com.deepin.SessionManager") - .path("/com/deepin/SessionManager") - .service("com.deepin.SessionManager") + .interface(sessionManagerService) + .path(sessionManagerPath) + .service(sessionManagerInterface) .method("Register") .arg(QString(cookie)) .call(); diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index a3ad2591a..31777e6d8 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -38,14 +38,14 @@ using DBusDock = org::deepin::dde::daemon::DdeDock; using DockEntryInter = org::deepin::dde::daemon::dock::DockEntry; -static const QString serviceName = QString("com.deepin.dde.daemon.Dock"); -static const QString servicePath = QString("/com/deepin/dde/daemon/Dock"); +static const QString serviceName = QString("org.deepin.dde.daemon.Dock1"); +static const QString servicePath = QString("/org/deepin/dde/daemon/Dock1"); #else using DBusDock = com::deepin::dde::daemon::Dock; using DockEntryInter = com::deepin::dde::daemon::dock::Entry; -static const QString serviceName = QString("org.deepin.dde.daemon.Dock1"); -static const QString servicePath = QString("/org/deepin/dde/daemon/Dock1"); +static const QString serviceName = QString("com.deepin.dde.daemon.Dock"); +static const QString servicePath = QString("/com/deepin/dde/daemon/Dock"); #endif using namespace Dock; From c7826edd4664a9cbb2dad30671deeebdf23ef836 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 16 Sep 2022 20:12:52 +0000 Subject: [PATCH 079/257] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=AF=B9libdframeworkdbus-dev=E5=BA=93?= =?UTF-8?q?=E7=9A=84=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、删除项目中对libdframeworkdbus-dev库的依赖,通过使用xml2cpp的工具来自动生成dbus接口文件,在使用到dbus库的项目中包含生成文件的目录 2、修改相关服务中v20的接口(com.deepin...)为v23的接口(org.deepin...) Log: Influence: 打开控制中心,鼠标移动唤醒任务栏、加载插件等,观察相关功能是否正常 Task: https://pms.uniontech.com/task-view-182009.html Change-Id: I960c849d06ed271ebbb9f8e479d9879967523581 --- .gitignore | 3 + CMakeLists.txt | 18 + debian/control | 2 +- frame/CMakeLists.txt | 19 +- frame/dbus/dockinterface.cpp | 50 +- frame/dbus/dockinterface.h | 21 +- frame/dbusinterface/types/arealist.cpp | 59 ++ frame/dbusinterface/types/arealist.h | 53 ++ frame/dbusinterface/types/audioport.cpp | 34 ++ frame/dbusinterface/types/audioport.h | 76 +++ frame/dbusinterface/types/audioportlist.cpp | 32 ++ frame/dbusinterface/types/audioportlist.h | 40 ++ frame/dbusinterface/types/brightnessmap.cpp | 32 ++ frame/dbusinterface/types/brightnessmap.h | 36 ++ frame/dbusinterface/types/dbusimagelist.cpp | 59 ++ frame/dbusinterface/types/dbusimagelist.h | 48 ++ frame/dbusinterface/types/dbustooltip.cpp | 57 ++ frame/dbusinterface/types/dbustooltip.h | 48 ++ frame/dbusinterface/types/dockrect.cpp | 50 ++ frame/dbusinterface/types/dockrect.h | 28 + .../types/keyboardlayoutlist.cpp | 32 ++ .../dbusinterface/types/keyboardlayoutlist.h | 38 ++ frame/dbusinterface/types/resolution.cpp | 76 +++ frame/dbusinterface/types/resolution.h | 65 +++ frame/dbusinterface/types/resolutionlist.cpp | 34 ++ frame/dbusinterface/types/resolutionlist.h | 37 ++ frame/dbusinterface/types/screenrect.cpp | 74 +++ frame/dbusinterface/types/screenrect.h | 55 ++ .../types/touchscreeninfolist.cpp | 59 ++ .../dbusinterface/types/touchscreeninfolist.h | 48 ++ .../types/touchscreeninfolist_v2.cpp | 59 ++ .../types/touchscreeninfolist_v2.h | 49 ++ frame/dbusinterface/types/touchscreenmap.cpp | 28 + frame/dbusinterface/types/touchscreenmap.h | 32 ++ frame/dbusinterface/types/zoneinfo.cpp | 92 +++ frame/dbusinterface/types/zoneinfo.h | 66 +++ .../xml/com.deepin.dde.daemon.Dock.xml | 100 ++++ .../xml/org.deepin.api.XEventMonitor.xml | 63 +++ .../xml/org.deepin.daemon.Audio.Sink.xml | 38 ++ .../xml/org.deepin.daemon.Audio.xml | 46 ++ .../xml/org.deepin.daemon.Display.xml | 83 +++ .../xml/org.deepin.daemon.Gesture.xml | 27 + .../xml/org.deepin.daemon.Timedate.xml | 62 +++ .../xml/org.deepin.dde.Launcher.xml | 21 + .../xml/org.freedesktop.FileManager.xml | 17 + .../xml/org.kde.StatusNotifierItem.xml | 61 ++ frame/display/displaymanager.h | 3 +- frame/item/components/appdragwidget.cpp | 4 +- frame/model/volumemodel.cpp | 4 +- frame/model/volumemodel.h | 10 +- frame/qtdbusextended/DBusExtended | 1 + .../DBusExtendedAbstractInterface | 1 + frame/qtdbusextended/dbusextended.h | 35 ++ .../dbusextendedabstractinterface.cpp | 525 ++++++++++++++++++ .../dbusextendedabstractinterface.h | 103 ++++ .../dbusextendedpendingcallwatcher.cpp | 38 ++ .../dbusextendedpendingcallwatcher_p.h | 67 +++ frame/util/dbusutil.h | 12 +- frame/util/multiscreenworker.h | 8 +- frame/util/touchsignalmanager.h | 6 +- frame/window/components/datetimedisplayer.cpp | 2 +- frame/window/components/datetimedisplayer.h | 6 +- frame/window/mainpanelcontrol.h | 2 - frame/window/tray/dbustraymanager.cpp | 4 +- frame/window/tray/dbustraymanager.h | 8 +- frame/window/tray/widgets/snitrayitemwidget.h | 2 +- frame/window/traymanagerwindow.h | 6 +- plugins/CMakeLists.txt | 1 - plugins/airplane-mode/CMakeLists.txt | 24 +- plugins/airplane-mode/airplanemodeitem.cpp | 4 +- plugins/airplane-mode/airplanemodeitem.h | 4 +- .../xml/org.deepin.daemon.AirplaneMode.xml | 16 + plugins/bluetooth/CMakeLists.txt | 25 +- plugins/bluetooth/bluetooth.json | 2 +- .../bluetooth/componments/adaptersmanager.cpp | 10 +- .../bluetooth/componments/adaptersmanager.h | 4 +- .../componments/bluetoothadapteritem.cpp | 2 +- .../componments/bluetoothadapteritem.h | 4 +- .../bluetooth/componments/bluetoothapplet.cpp | 3 +- .../bluetooth/componments/bluetoothapplet.h | 4 +- .../xml/org.deepin.daemon.AirplaneMode.xml | 16 + .../xml/org.deepin.daemon.Bluetooth.xml | 155 ++++++ plugins/datetime/CMakeLists.txt | 21 +- plugins/datetime/datetime.json | 2 +- plugins/datetime/datetimeplugin.cpp | 10 +- plugins/datetime/datetimewidget.cpp | 2 +- plugins/datetime/datetimewidget.h | 4 +- .../datetime/dbusinterface/types/zoneinfo.cpp | 92 +++ .../datetime/dbusinterface/types/zoneinfo.h | 66 +++ .../xml/org.deepin.daemon.Timedate.xml | 62 +++ plugins/keyboard-layout/CMakeLists.txt | 21 +- plugins/keyboard-layout/dbusadaptors.h | 4 +- .../types/keyboardlayoutlist.cpp | 32 ++ .../dbusinterface/types/keyboardlayoutlist.h | 38 ++ ...org.deepin.daemon.InputDevice.Keyboard.xml | 35 ++ plugins/onboard/CMakeLists.txt | 19 +- .../onboard/dbusinterface/types/arealist.cpp | 59 ++ .../onboard/dbusinterface/types/arealist.h | 53 ++ .../xml/org.deepin.dde.daemon.Dock.Entry.xml | 8 + .../xml/org.deepin.dde.daemon.Dock.xml | 3 + plugins/onboard/onboardplugin.cpp | 22 +- plugins/power/CMakeLists.txt | 19 +- plugins/power/dbus/dbusaccount.cpp | 3 +- plugins/power/dbus/dbusaccount.h | 12 +- plugins/power/dbus/dbuspower.cpp | 4 +- plugins/power/dbus/dbuspower.h | 12 +- .../xml/org.deepin.system.SystemPower.xml | 36 ++ plugins/power/power.json | 2 +- plugins/power/powerplugin.cpp | 2 +- plugins/power/powerplugin.h | 4 +- plugins/shutdown/dbus/dbusaccount.cpp | 2 +- plugins/shutdown/dbus/dbusaccount.h | 12 +- plugins/shutdown/dbus/dbuspowermanager.cpp | 2 +- plugins/shutdown/dbus/dbuspowermanager.h | 6 +- plugins/shutdown/shutdownplugin.cpp | 2 +- plugins/sound/CMakeLists.txt | 22 +- .../sound/dbusinterface/types/audioport.cpp | 34 ++ plugins/sound/dbusinterface/types/audioport.h | 76 +++ .../dbusinterface/types/audioportlist.cpp | 32 ++ .../sound/dbusinterface/types/audioportlist.h | 40 ++ .../xml/org.deepin.daemon.Audio.Sink.xml | 38 ++ .../xml/org.deepin.daemon.Audio.xml | 46 ++ plugins/sound/sound.json | 2 +- plugins/sound/soundapplet.cpp | 6 +- plugins/sound/soundapplet.h | 8 +- plugins/sound/sounditem.h | 4 +- plugins/trash/CMakeLists.txt | 19 +- .../xml/org.freedesktop.FileManager.xml | 17 + plugins/trash/trashwidget.cpp | 2 +- plugins/trash/trashwidget.h | 3 +- plugins/tray/CMakeLists.txt | 62 ++- plugins/tray/dbus/dbustraymanager.cpp | 4 +- plugins/tray/dbus/dbustraymanager.h | 8 +- .../dbusinterface/types/dbusimagelist.cpp | 59 ++ .../tray/dbusinterface/types/dbusimagelist.h | 48 ++ .../tray/dbusinterface/types/dbustooltip.cpp | 57 ++ .../tray/dbusinterface/types/dbustooltip.h | 48 ++ plugins/tray/dbusinterface/types/dockrect.cpp | 50 ++ plugins/tray/dbusinterface/types/dockrect.h | 28 + .../xml/com.deepin.dde.daemon.Dock.xml | 100 ++++ .../xml/org.deepin.daemon.Gesture.xml | 27 + .../xml/org.kde.StatusNotifierItem.xml | 61 ++ .../fashiontray/fashiontraywidgetwrapper.h | 6 +- plugins/tray/snitraywidget.h | 2 +- plugins/tray/tray.json | 2 +- 145 files changed, 4551 insertions(+), 279 deletions(-) create mode 100644 frame/dbusinterface/types/arealist.cpp create mode 100644 frame/dbusinterface/types/arealist.h create mode 100644 frame/dbusinterface/types/audioport.cpp create mode 100644 frame/dbusinterface/types/audioport.h create mode 100644 frame/dbusinterface/types/audioportlist.cpp create mode 100644 frame/dbusinterface/types/audioportlist.h create mode 100644 frame/dbusinterface/types/brightnessmap.cpp create mode 100644 frame/dbusinterface/types/brightnessmap.h create mode 100644 frame/dbusinterface/types/dbusimagelist.cpp create mode 100644 frame/dbusinterface/types/dbusimagelist.h create mode 100644 frame/dbusinterface/types/dbustooltip.cpp create mode 100644 frame/dbusinterface/types/dbustooltip.h create mode 100644 frame/dbusinterface/types/dockrect.cpp create mode 100644 frame/dbusinterface/types/dockrect.h create mode 100644 frame/dbusinterface/types/keyboardlayoutlist.cpp create mode 100644 frame/dbusinterface/types/keyboardlayoutlist.h create mode 100644 frame/dbusinterface/types/resolution.cpp create mode 100644 frame/dbusinterface/types/resolution.h create mode 100644 frame/dbusinterface/types/resolutionlist.cpp create mode 100644 frame/dbusinterface/types/resolutionlist.h create mode 100644 frame/dbusinterface/types/screenrect.cpp create mode 100644 frame/dbusinterface/types/screenrect.h create mode 100644 frame/dbusinterface/types/touchscreeninfolist.cpp create mode 100644 frame/dbusinterface/types/touchscreeninfolist.h create mode 100644 frame/dbusinterface/types/touchscreeninfolist_v2.cpp create mode 100644 frame/dbusinterface/types/touchscreeninfolist_v2.h create mode 100644 frame/dbusinterface/types/touchscreenmap.cpp create mode 100644 frame/dbusinterface/types/touchscreenmap.h create mode 100644 frame/dbusinterface/types/zoneinfo.cpp create mode 100644 frame/dbusinterface/types/zoneinfo.h create mode 100644 frame/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml create mode 100644 frame/dbusinterface/xml/org.deepin.api.XEventMonitor.xml create mode 100644 frame/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml create mode 100644 frame/dbusinterface/xml/org.deepin.daemon.Audio.xml create mode 100644 frame/dbusinterface/xml/org.deepin.daemon.Display.xml create mode 100644 frame/dbusinterface/xml/org.deepin.daemon.Gesture.xml create mode 100644 frame/dbusinterface/xml/org.deepin.daemon.Timedate.xml create mode 100644 frame/dbusinterface/xml/org.deepin.dde.Launcher.xml create mode 100644 frame/dbusinterface/xml/org.freedesktop.FileManager.xml create mode 100644 frame/dbusinterface/xml/org.kde.StatusNotifierItem.xml create mode 100644 frame/qtdbusextended/DBusExtended create mode 100644 frame/qtdbusextended/DBusExtendedAbstractInterface create mode 100644 frame/qtdbusextended/dbusextended.h create mode 100644 frame/qtdbusextended/dbusextendedabstractinterface.cpp create mode 100644 frame/qtdbusextended/dbusextendedabstractinterface.h create mode 100644 frame/qtdbusextended/dbusextendedpendingcallwatcher.cpp create mode 100644 frame/qtdbusextended/dbusextendedpendingcallwatcher_p.h create mode 100644 plugins/airplane-mode/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml create mode 100644 plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml create mode 100644 plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.Bluetooth.xml create mode 100644 plugins/datetime/dbusinterface/types/zoneinfo.cpp create mode 100644 plugins/datetime/dbusinterface/types/zoneinfo.h create mode 100644 plugins/datetime/dbusinterface/xml/org.deepin.daemon.Timedate.xml create mode 100644 plugins/keyboard-layout/dbusinterface/types/keyboardlayoutlist.cpp create mode 100644 plugins/keyboard-layout/dbusinterface/types/keyboardlayoutlist.h create mode 100644 plugins/keyboard-layout/dbusinterface/xml/org.deepin.daemon.InputDevice.Keyboard.xml create mode 100644 plugins/onboard/dbusinterface/types/arealist.cpp create mode 100644 plugins/onboard/dbusinterface/types/arealist.h create mode 100644 plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.Entry.xml create mode 100644 plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.xml create mode 100644 plugins/power/dbusinterface/xml/org.deepin.system.SystemPower.xml create mode 100644 plugins/sound/dbusinterface/types/audioport.cpp create mode 100644 plugins/sound/dbusinterface/types/audioport.h create mode 100644 plugins/sound/dbusinterface/types/audioportlist.cpp create mode 100644 plugins/sound/dbusinterface/types/audioportlist.h create mode 100644 plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml create mode 100644 plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.xml create mode 100644 plugins/trash/dbusinterface/xml/org.freedesktop.FileManager.xml create mode 100644 plugins/tray/dbusinterface/types/dbusimagelist.cpp create mode 100644 plugins/tray/dbusinterface/types/dbusimagelist.h create mode 100644 plugins/tray/dbusinterface/types/dbustooltip.cpp create mode 100644 plugins/tray/dbusinterface/types/dbustooltip.h create mode 100644 plugins/tray/dbusinterface/types/dockrect.cpp create mode 100644 plugins/tray/dbusinterface/types/dockrect.h create mode 100644 plugins/tray/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml create mode 100644 plugins/tray/dbusinterface/xml/org.deepin.daemon.Gesture.xml create mode 100644 plugins/tray/dbusinterface/xml/org.kde.StatusNotifierItem.xml diff --git a/.gitignore b/.gitignore index 75e419f14..92a677700 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ CMakeLists.txt.user* # binary file dde-dock .vscode + +*/dbusinterface/generation_dbus_interface/ +*/*/dbusinterface/generation_dbus_interface/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 60e04ce85..c0a0ad527 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,6 +55,24 @@ if (${EXIT_CODE} EQUAL 0) endif() endif() +function(generation_dbus_interface xmldir outdir) + IF(NOT EXISTS ${outdir}) + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${outdir}) + ENDIF() + file(GLOB_RECURSE allXmls ${xmldir}/*.xml) + foreach(XMLFILE ${allXmls}) + string(FIND ${XMLFILE} "/" INDEX REVERSE) + string(SUBSTRING ${XMLFILE} ${INDEX} -1 classname) + string(REPLACE "/" "" classname ${classname}) + string(REPLACE ".xml" "" classname ${classname}) + string(REPLACE "." "_" classname ${classname}) + string(TOLOWER ${classname} filename) + + execute_process(COMMAND qdbusxml2cpp-fix -c ${classname} -p ${outdir}/${filename} ${XMLFILE} + WORKING_DIRECTORY ${outdir}) + endforeach() +endfunction(generation_dbus_interface) + file(GLOB INTERFACES "interfaces/*.h") add_compile_definitions(USE_AM) diff --git a/debian/control b/debian/control index 66aa5d90c..fa1f3b86e 100644 --- a/debian/control +++ b/debian/control @@ -20,7 +20,6 @@ Build-Depends: debhelper (>= 8.0.0), libdtkcore-dev (>=5.4.14), libdtkcore5-bin (>=5.4.14), libdtkgui-dev (>=5.4.13), - libdframeworkdbus-dev (>=5.4.6), libgsettings-qt-dev, libdbusmenu-qt5-dev, libgtest-dev, @@ -29,6 +28,7 @@ Build-Depends: debhelper (>= 8.0.0), libxcursor-dev, libqt5waylandclient5-dev, qtwayland5-private-dev, + libxdamage-dev, libdwayland-dev Standards-Version: 3.9.8 Homepage: http://www.deepin.org/ diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index 1c6775afd..456d0f599 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -9,8 +9,19 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -O0") endif() +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../widgets/*.h" "../widgets/*.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "../widgets/*.h" + "../widgets/*.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "./qtdbusextended/*.h" + "./qtdbusextended/*.cpp" + "./dbusinterface/types/*.h" + "./dbusinterface/types/*.cpp") # Find the library find_package(PkgConfig REQUIRED) @@ -26,7 +37,6 @@ find_package(DtkCMake REQUIRED) find_package(dbusmenu-qt5 REQUIRED) pkg_check_modules(XCB_EWMH REQUIRED xcb-image xcb-ewmh xcb-composite xtst x11 dbusmenu-qt5 xext xcursor) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) pkg_check_modules(DtkGUI REQUIRED dtkgui) @@ -43,7 +53,6 @@ add_executable(${BIN_NAME} target_include_directories(${BIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${XCB_EWMH_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ${PROJECT_BINARY_DIR} ${QGSettings_INCLUDE_DIRS} @@ -56,6 +65,9 @@ target_include_directories(${BIN_NAME} PUBLIC ${Qt5XkbCommonSupport_PRIVATE_INCLUDE_DIRS} ../interfaces ../widgets + ./dbusinterface/generation_dbus_interface + ./qtdbusextended/ + ./dbusinterface accessible controller dbus @@ -82,7 +94,6 @@ target_include_directories(${BIN_NAME} PUBLIC target_link_libraries(${BIN_NAME} PRIVATE ${XCB_EWMH_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${DtkWidget_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Gui_LIBRARIES} diff --git a/frame/dbus/dockinterface.cpp b/frame/dbus/dockinterface.cpp index f2f222920..8a5ab875f 100644 --- a/frame/dbus/dockinterface.cpp +++ b/frame/dbus/dockinterface.cpp @@ -21,59 +21,13 @@ #include "dockinterface.h" +#include "com_deepin_dde_daemon_dock.h" + #ifdef USE_AM // 因为 types/dockrect.h 文件中定义了DockRect类,而在此处也定义了DockRect, // 所以在此处先加上DOCKRECT_H宏(types/dockrect.h文件中定义的宏)来禁止包含types/dockrect.h头文件 // 否则会出现重复定义的错误 #define DOCKRECT_H -#include - -DockRect::DockRect() - : x(0) - , y(0) - , w(0) - , h(0) -{ -} - -QDebug operator<<(QDebug debug, const DockRect &rect) -{ - debug << QString("DockRect(%1, %2, %3, %4)").arg(rect.x) - .arg(rect.y) - .arg(rect.w) - .arg(rect.h); - - return debug; -} - -DockRect::operator QRect() const -{ - return QRect(x, y, w, h); -} - -QDBusArgument &operator<<(QDBusArgument &arg, const DockRect &rect) -{ - arg.beginStructure(); - arg << rect.x << rect.y << rect.w << rect.h; - arg.endStructure(); - - return arg; -} - -const QDBusArgument &operator>>(const QDBusArgument &arg, DockRect &rect) -{ - arg.beginStructure(); - arg >> rect.x >> rect.y >> rect.w >> rect.h; - arg.endStructure(); - - return arg; -} - -void registerDockRectMetaType() -{ - qRegisterMetaType("DockRect"); - qDBusRegisterMetaType(); -} /* * Implementation of interface class __Dock diff --git a/frame/dbus/dockinterface.h b/frame/dbus/dockinterface.h index 70aaf9bee..21cc0a4fc 100644 --- a/frame/dbus/dockinterface.h +++ b/frame/dbus/dockinterface.h @@ -24,6 +24,8 @@ #ifdef USE_AM +#include "types/dockrect.h" + #include #include #include @@ -39,25 +41,6 @@ class DockPrivate; class WM; -struct DockRect -{ -public: - DockRect(); - operator QRect() const; - - friend QDebug operator<<(QDebug debug, const DockRect &rect); - friend const QDBusArgument &operator>>(const QDBusArgument &arg, DockRect &rect); - friend QDBusArgument &operator<<(QDBusArgument &arg, const DockRect &rect); - -private: - int x; - int y; - uint w; - uint h; -}; - -Q_DECLARE_METATYPE(DockRect) - void registerDockRectMetaType(); class Dde_Dock : public QDBusAbstractInterface diff --git a/frame/dbusinterface/types/arealist.cpp b/frame/dbusinterface/types/arealist.cpp new file mode 100644 index 000000000..e4055ada2 --- /dev/null +++ b/frame/dbusinterface/types/arealist.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * zhaolong + * + * 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 . + */ + +#include "arealist.h" + +bool MonitRect::operator ==(const MonitRect &rect) +{ + return x1 == rect.x1 && y1 == rect.y1 && x2 == rect.x2 && y2 == rect.y2; +} + +QDBusArgument &operator<<(QDBusArgument &arg, const MonitRect &rect) +{ + arg.beginStructure(); + arg << rect.x1 << rect.y1 << rect.x2 << rect.y2; + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, MonitRect &rect) +{ + arg.beginStructure(); + arg >> rect.x1 >> rect.y1 >> rect.x2 >> rect.y2; + arg.endStructure(); + + return arg; +} + +void registerAreaListMetaType() +{ + qRegisterMetaType("MonitRect"); + qDBusRegisterMetaType(); + + qRegisterMetaType("AreaList"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/arealist.h b/frame/dbusinterface/types/arealist.h new file mode 100644 index 000000000..be61f028c --- /dev/null +++ b/frame/dbusinterface/types/arealist.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * zhaolong + * + * 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 . + */ + +#ifndef AREALIST_H +#define AREALIST_H + +#include +#include +#include + +struct MonitRect { + int x1; + int y1; + int x2; + int y2; + + bool operator ==(const MonitRect& rect); +}; + +typedef QList AreaList; + +Q_DECLARE_METATYPE(MonitRect) +Q_DECLARE_METATYPE(AreaList) + +QDBusArgument &operator<<(QDBusArgument &arg, const MonitRect &rect); +const QDBusArgument &operator>>(const QDBusArgument &arg, MonitRect &rect); + +void registerAreaListMetaType(); + +#endif // AREALIST_H diff --git a/frame/dbusinterface/types/audioport.cpp b/frame/dbusinterface/types/audioport.cpp new file mode 100644 index 000000000..6ea641338 --- /dev/null +++ b/frame/dbusinterface/types/audioport.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include + +#include "audioport.h" + +void registerAudioPortMetaType() +{ + qRegisterMetaType("AudioPort"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/audioport.h b/frame/dbusinterface/types/audioport.h new file mode 100644 index 000000000..5b3800759 --- /dev/null +++ b/frame/dbusinterface/types/audioport.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2016 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef AUDIOPORT_H +#define AUDIOPORT_H + +#include +#include +#include +#include + +class AudioPort +{ +public: + QString name; + QString description; + uchar availability; // 0 for Unknown, 1 for Not Available, 2 for Available. + + friend QDebug operator<<(QDebug argument, const AudioPort &port) { + argument << port.description; + + return argument; + } + + friend QDBusArgument &operator<<(QDBusArgument &argument, const AudioPort &port) { + argument.beginStructure(); + argument << port.name << port.description << port.availability; + argument.endStructure(); + + return argument; + } + + friend const QDBusArgument &operator>>(const QDBusArgument &argument, AudioPort &port) { + argument.beginStructure(); + argument >> port.name >> port.description >> port.availability; + argument.endStructure(); + + return argument; + } + + bool operator==(const AudioPort what) const { + return what.name == name && what.description == description && what.availability == availability; + } + + bool operator!=(const AudioPort what) const { + return what.name != name || what.description != description || what.availability != availability; + } +}; + +Q_DECLARE_METATYPE(AudioPort) + +void registerAudioPortMetaType(); + +#endif // AUDIOPORT_H diff --git a/frame/dbusinterface/types/audioportlist.cpp b/frame/dbusinterface/types/audioportlist.cpp new file mode 100644 index 000000000..c6d4ad991 --- /dev/null +++ b/frame/dbusinterface/types/audioportlist.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "audioportlist.h" + +void registerAudioPortListMetaType() +{ + qRegisterMetaType("AudioPortList"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/audioportlist.h b/frame/dbusinterface/types/audioportlist.h new file mode 100644 index 000000000..c48d47d31 --- /dev/null +++ b/frame/dbusinterface/types/audioportlist.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2016 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef AUDIOPORTLIST_H +#define AUDIOPORTLIST_H + +#include +#include + +#include "audioport.h" + +typedef QList AudioPortList; + +Q_DECLARE_METATYPE(AudioPortList) + +void registerAudioPortListMetaType(); + +#endif // AUDIOPORTLIST_H diff --git a/frame/dbusinterface/types/brightnessmap.cpp b/frame/dbusinterface/types/brightnessmap.cpp new file mode 100644 index 000000000..6acab419c --- /dev/null +++ b/frame/dbusinterface/types/brightnessmap.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "brightnessmap.h" + +void registerBrightnessMapMetaType() +{ + qRegisterMetaType("BrightnessMap"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/brightnessmap.h b/frame/dbusinterface/types/brightnessmap.h new file mode 100644 index 000000000..0ba1e9d83 --- /dev/null +++ b/frame/dbusinterface/types/brightnessmap.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef BRIGHTNESSMAP_H +#define BRIGHTNESSMAP_H + +#include +#include + +typedef QMap BrightnessMap; + +void registerBrightnessMapMetaType(); + +#endif // BRIGHTNESSMAP_H diff --git a/frame/dbusinterface/types/dbusimagelist.cpp b/frame/dbusinterface/types/dbusimagelist.cpp new file mode 100644 index 000000000..a317fd279 --- /dev/null +++ b/frame/dbusinterface/types/dbusimagelist.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#include "dbusimagelist.h" + +QDBusArgument &operator<<(QDBusArgument &argument, const DBusImage &image) +{ + argument.beginStructure(); + argument << image.width << image.height << image.pixels; + argument.endStructure(); + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImage &image) +{ + argument.beginStructure(); + argument >> image.width >> image.height >> image.pixels; + argument.endStructure(); + return argument; +} + +void registerDBusImageListMetaType() +{ + qRegisterMetaType("DBusImage"); + qDBusRegisterMetaType(); + + qRegisterMetaType("DBusImageList"); + qDBusRegisterMetaType(); +} + +bool operator ==(const DBusImage &a, const DBusImage &b) +{ + return a.width == b.width + && a.height == b.height + && a.pixels == b.pixels; +} + +bool operator !=(const DBusImage &a, const DBusImage &b) +{ + return !(a == b); +} diff --git a/frame/dbusinterface/types/dbusimagelist.h b/frame/dbusinterface/types/dbusimagelist.h new file mode 100644 index 000000000..cf1aae42a --- /dev/null +++ b/frame/dbusinterface/types/dbusimagelist.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#ifndef DBUSIMAGELIST_H +#define DBUSIMAGELIST_H + +#include +#include +#include + +struct DBusImage +{ + int width; + int height; + QByteArray pixels; +}; +Q_DECLARE_METATYPE(DBusImage) + +typedef QList DBusImageList; +Q_DECLARE_METATYPE(DBusImageList) + +QDBusArgument &operator<<(QDBusArgument&, const DBusImage&); +const QDBusArgument &operator>>(const QDBusArgument&, DBusImage&); + +bool operator ==(const DBusImage&, const DBusImage&); +bool operator !=(const DBusImage&, const DBusImage&); + +void registerDBusImageListMetaType(); + +#endif // DBUSIMAGELIST_H diff --git a/frame/dbusinterface/types/dbustooltip.cpp b/frame/dbusinterface/types/dbustooltip.cpp new file mode 100644 index 000000000..4f3f1766e --- /dev/null +++ b/frame/dbusinterface/types/dbustooltip.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#include "dbustooltip.h" + +QDBusArgument &operator<<(QDBusArgument &argument, const DBusToolTip &tip) +{ + argument.beginStructure(); + argument << tip.iconName << tip.iconPixmap << tip.title << tip.description; + argument.endStructure(); + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument &argument, DBusToolTip &tip) +{ + argument.beginStructure(); + argument >> tip.iconName >> tip.iconPixmap >> tip.title >> tip.description; + argument.endStructure(); + return argument; +} + +bool operator ==(const DBusToolTip &a, const DBusToolTip &b) +{ + return a.iconName == b.iconName + && a.iconPixmap == b.iconPixmap + && a.title == b.title + && a.description == b.description; +} + +bool operator !=(const DBusToolTip &a, const DBusToolTip &b) +{ + return !(a == b); +} + +void registerDBusToolTipMetaType() +{ + qRegisterMetaType("DBusToolTip"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/dbustooltip.h b/frame/dbusinterface/types/dbustooltip.h new file mode 100644 index 000000000..d7b0e1fa8 --- /dev/null +++ b/frame/dbusinterface/types/dbustooltip.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#ifndef DBUSTOOLTIP_H +#define DBUSTOOLTIP_H + +#include "dbusimagelist.h" + +#include +#include +#include + +struct DBusToolTip +{ + QString iconName; + DBusImageList iconPixmap; + QString title; + QString description; +}; +Q_DECLARE_METATYPE(DBusToolTip) + +QDBusArgument &operator<<(QDBusArgument&, const DBusToolTip&); +const QDBusArgument &operator>>(const QDBusArgument&, DBusToolTip&); + +bool operator ==(const DBusToolTip&, const DBusToolTip&); +bool operator !=(const DBusToolTip&, const DBusToolTip&); + +void registerDBusToolTipMetaType(); + +#endif // DBUSTOOLTIP_H diff --git a/frame/dbusinterface/types/dockrect.cpp b/frame/dbusinterface/types/dockrect.cpp new file mode 100644 index 000000000..560714a30 --- /dev/null +++ b/frame/dbusinterface/types/dockrect.cpp @@ -0,0 +1,50 @@ +#include "dockrect.h" +#include + +DockRect::DockRect() + : x(0) + , y(0) + , w(0) + , h(0) +{ + +} + +QDebug operator<<(QDebug debug, const DockRect &rect) +{ + debug << QString("DockRect(%1, %2, %3, %4)").arg(rect.x) + .arg(rect.y) + .arg(rect.w) + .arg(rect.h); + + return debug; +} + +DockRect::operator QRect() const +{ + return QRect(x, y, w, h); +} + +QDBusArgument &operator<<(QDBusArgument &arg, const DockRect &rect) +{ + arg.beginStructure(); + arg << rect.x << rect.y << rect.w << rect.h; + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, DockRect &rect) +{ + arg.beginStructure(); + arg >> rect.x >> rect.y >> rect.w >> rect.h; + arg.endStructure(); + + return arg; +} + +void registerDockRectMetaType() +{ + qRegisterMetaType("DockRect"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/dockrect.h b/frame/dbusinterface/types/dockrect.h new file mode 100644 index 000000000..88ae33ea2 --- /dev/null +++ b/frame/dbusinterface/types/dockrect.h @@ -0,0 +1,28 @@ +#ifndef DOCKRECT_H +#define DOCKRECT_H + +#include +#include + +struct DockRect +{ +public: + DockRect(); + operator QRect() const; + + friend QDebug operator<<(QDebug debug, const DockRect &rect); + friend const QDBusArgument &operator>>(const QDBusArgument &arg, DockRect &rect); + friend QDBusArgument &operator<<(QDBusArgument &arg, const DockRect &rect); + +private: + int x; + int y; + uint w; + uint h; +}; + +Q_DECLARE_METATYPE(DockRect) + +void registerDockRectMetaType(); + +#endif // DOCKRECT_H diff --git a/frame/dbusinterface/types/keyboardlayoutlist.cpp b/frame/dbusinterface/types/keyboardlayoutlist.cpp new file mode 100644 index 000000000..abb2e010c --- /dev/null +++ b/frame/dbusinterface/types/keyboardlayoutlist.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "keyboardlayoutlist.h" + +void registerKeyboardLayoutListMetaType() +{ + qRegisterMetaType("KeyboardLayoutList"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/keyboardlayoutlist.h b/frame/dbusinterface/types/keyboardlayoutlist.h new file mode 100644 index 000000000..046f363fc --- /dev/null +++ b/frame/dbusinterface/types/keyboardlayoutlist.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef KEYBOARDLAYOUTLIST_H +#define KEYBOARDLAYOUTLIST_H + +#include +#include +#include +#include + +typedef QMap KeyboardLayoutList; + +void registerKeyboardLayoutListMetaType(); + +#endif // KEYBOARDLAYOUTLIST_H diff --git a/frame/dbusinterface/types/resolution.cpp b/frame/dbusinterface/types/resolution.cpp new file mode 100644 index 000000000..464fff045 --- /dev/null +++ b/frame/dbusinterface/types/resolution.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "resolution.h" + +#include + +void registerResolutionMetaType() +{ + qRegisterMetaType("Resolution"); + qDBusRegisterMetaType(); +} + +Resolution::Resolution() +{ + +} + +bool Resolution::operator!=(const Resolution &other) const +{ + return m_width != other.m_width || m_height != other.m_height || m_rate != other.m_rate; +} + +bool Resolution::operator==(const Resolution &other) const +{ + return !(other != *this); +} + +QDBusArgument &operator<<(QDBusArgument &arg, const Resolution &value) +{ + arg.beginStructure(); + arg << quint32(value.id()) << quint16(value.width()) << quint16(value.height()) << value.rate(); + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, Resolution &value) +{ + quint32 id; + quint16 w, h; + double rate; + + arg.beginStructure(); + arg >> id >> w >> h >> rate; + arg.endStructure(); + + value.setId(id); + value.setWidth(w); + value.setHeight(h); + value.setRate(rate); + + return arg; +} diff --git a/frame/dbusinterface/types/resolution.h b/frame/dbusinterface/types/resolution.h new file mode 100644 index 000000000..80b69cde2 --- /dev/null +++ b/frame/dbusinterface/types/resolution.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef RESOLUTION_H +#define RESOLUTION_H + +#include + +class Resolution +{ +public: + friend QDBusArgument &operator<<(QDBusArgument &arg, const Resolution &value); + friend const QDBusArgument &operator>>(const QDBusArgument &arg, Resolution &value); + + explicit Resolution(); + + bool operator!=(const Resolution &other) const; + bool operator==(const Resolution &other) const; + + int id() const { return m_id; } + int width() const { return m_width; } + int height() const { return m_height; } + double rate() const { return m_rate; } + +private: + void setId(const int id) { m_id = id; } + void setWidth(const int w) { m_width = w; } + void setHeight(const int h) { m_height = h; } + void setRate(const double rate) { m_rate = rate; } + +private: + int m_id; + int m_width; + int m_height; + double m_rate; +}; + + +Q_DECLARE_METATYPE(Resolution) + +void registerResolutionMetaType(); + +#endif // RESOLUTION_H diff --git a/frame/dbusinterface/types/resolutionlist.cpp b/frame/dbusinterface/types/resolutionlist.cpp new file mode 100644 index 000000000..8d5d4d3e9 --- /dev/null +++ b/frame/dbusinterface/types/resolutionlist.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "resolutionlist.h" + +void registerResolutionListMetaType() +{ + registerResolutionMetaType(); + + qRegisterMetaType("ResolutionList"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/resolutionlist.h b/frame/dbusinterface/types/resolutionlist.h new file mode 100644 index 000000000..926a1dc78 --- /dev/null +++ b/frame/dbusinterface/types/resolutionlist.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef RESOLUTIONLIST_H +#define RESOLUTIONLIST_H + +#include "resolution.h" + +#include + +typedef QList ResolutionList; + +void registerResolutionListMetaType(); + +#endif // RESOLUTIONLIST_H diff --git a/frame/dbusinterface/types/screenrect.cpp b/frame/dbusinterface/types/screenrect.cpp new file mode 100644 index 000000000..f69bca06b --- /dev/null +++ b/frame/dbusinterface/types/screenrect.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "screenrect.h" + +ScreenRect::ScreenRect() + : x(0), + y(0), + w(0), + h(0) +{ + +} + +QDebug operator<<(QDebug debug, const ScreenRect &rect) +{ + debug << QString("ScreenRect(%1, %2, %3, %4)").arg(rect.x) + .arg(rect.y) + .arg(rect.w) + .arg(rect.h); + + return debug; +} + +ScreenRect::operator QRect() const +{ + return QRect(x, y, w, h); +} + +QDBusArgument &operator<<(QDBusArgument &arg, const ScreenRect &rect) +{ + arg.beginStructure(); + arg << rect.x << rect.y << rect.w << rect.h; + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, ScreenRect &rect) +{ + arg.beginStructure(); + arg >> rect.x >> rect.y >> rect.w >> rect.h; + arg.endStructure(); + + return arg; +} + +void registerScreenRectMetaType() +{ + qRegisterMetaType("ScreenRect"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/screenrect.h b/frame/dbusinterface/types/screenrect.h new file mode 100644 index 000000000..08fa3a8d6 --- /dev/null +++ b/frame/dbusinterface/types/screenrect.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef SCREENRECT_H +#define SCREENRECT_H + +#include +#include +#include +#include + +struct ScreenRect +{ +public: + ScreenRect(); + operator QRect() const; + + friend QDebug operator<<(QDebug debug, const ScreenRect &rect); + friend const QDBusArgument &operator>>(const QDBusArgument &arg, ScreenRect &rect); + friend QDBusArgument &operator<<(QDBusArgument &arg, const ScreenRect &rect); + +private: + qint16 x; + qint16 y; + quint16 w; + quint16 h; +}; + +Q_DECLARE_METATYPE(ScreenRect) + +void registerScreenRectMetaType(); + +#endif // SCREENRECT_H diff --git a/frame/dbusinterface/types/touchscreeninfolist.cpp b/frame/dbusinterface/types/touchscreeninfolist.cpp new file mode 100644 index 000000000..8b402d4a7 --- /dev/null +++ b/frame/dbusinterface/types/touchscreeninfolist.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: quezhiyong + * + * Maintainer: quezhiyong + * + * 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 . + */ + +#include "touchscreeninfolist.h" + +QDBusArgument &operator<<(QDBusArgument &arg, const TouchscreenInfo &info) +{ + arg.beginStructure(); + arg << info.id << info.name << info.deviceNode << info.serialNumber; + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, TouchscreenInfo &info) +{ + arg.beginStructure(); + arg >> info.id >> info.name >> info.deviceNode >> info.serialNumber; + arg.endStructure(); + + return arg; +} + +bool TouchscreenInfo::operator==(const TouchscreenInfo &info) +{ + return id == info.id && name == info.name && deviceNode == info.deviceNode && serialNumber == info.serialNumber; +} + +void registerTouchscreenInfoMetaType() +{ + qRegisterMetaType("TouchscreenInfo"); + qDBusRegisterMetaType(); +} + +void registerTouchscreenInfoListMetaType() +{ + registerTouchscreenInfoMetaType(); + + qRegisterMetaType("TouchscreenInfoList"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/touchscreeninfolist.h b/frame/dbusinterface/types/touchscreeninfolist.h new file mode 100644 index 000000000..de4202082 --- /dev/null +++ b/frame/dbusinterface/types/touchscreeninfolist.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: quezhiyong + * + * Maintainer: quezhiyong + * + * 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 . + */ + +#ifndef TOUCHSCREENINFOLIST_H +#define TOUCHSCREENINFOLIST_H + +#include +#include +#include + +struct TouchscreenInfo { + qint32 id; + QString name; + QString deviceNode; + QString serialNumber; + + bool operator ==(const TouchscreenInfo& info); +}; + +typedef QList TouchscreenInfoList; + +Q_DECLARE_METATYPE(TouchscreenInfo) +Q_DECLARE_METATYPE(TouchscreenInfoList) + +QDBusArgument &operator<<(QDBusArgument &arg, const TouchscreenInfo &info); +const QDBusArgument &operator>>(const QDBusArgument &arg, TouchscreenInfo &info); + +void registerTouchscreenInfoListMetaType(); + +#endif // !TOUCHSCREENINFOLIST_H diff --git a/frame/dbusinterface/types/touchscreeninfolist_v2.cpp b/frame/dbusinterface/types/touchscreeninfolist_v2.cpp new file mode 100644 index 000000000..cf9695c22 --- /dev/null +++ b/frame/dbusinterface/types/touchscreeninfolist_v2.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: quezhiyong + * + * Maintainer: quezhiyong + * + * 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 . + */ + +#include "touchscreeninfolist_v2.h" + +QDBusArgument &operator<<(QDBusArgument &arg, const TouchscreenInfo_V2 &info) +{ + arg.beginStructure(); + arg << info.id << info.name << info.deviceNode << info.serialNumber << info.UUID; + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, TouchscreenInfo_V2 &info) +{ + arg.beginStructure(); + arg >> info.id >> info.name >> info.deviceNode >> info.serialNumber >> info.UUID; + arg.endStructure(); + + return arg; +} + +bool TouchscreenInfo_V2::operator==(const TouchscreenInfo_V2 &info) +{ + return id == info.id && name == info.name && deviceNode == info.deviceNode && serialNumber == info.serialNumber && UUID == info.UUID; +} + +void registerTouchscreenInfoV2MetaType() +{ + qRegisterMetaType("TouchscreenInfo_V2"); + qDBusRegisterMetaType(); +} + +void registerTouchscreenInfoList_V2MetaType() +{ + registerTouchscreenInfoV2MetaType(); + + qRegisterMetaType("TouchscreenInfoList_V2"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/touchscreeninfolist_v2.h b/frame/dbusinterface/types/touchscreeninfolist_v2.h new file mode 100644 index 000000000..862319d76 --- /dev/null +++ b/frame/dbusinterface/types/touchscreeninfolist_v2.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: quezhiyong + * + * Maintainer: quezhiyong + * + * 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 . + */ + +#ifndef TOUCHSCREENINFOLISTV2_H +#define TOUCHSCREENINFOLISTV2_H + +#include +#include +#include + +struct TouchscreenInfo_V2 { + qint32 id; + QString name; + QString deviceNode; + QString serialNumber; + QString UUID; + + bool operator ==(const TouchscreenInfo_V2& info); +}; + +typedef QList TouchscreenInfoList_V2; + +Q_DECLARE_METATYPE(TouchscreenInfo_V2) +Q_DECLARE_METATYPE(TouchscreenInfoList_V2) + +QDBusArgument &operator<<(QDBusArgument &arg, const TouchscreenInfo_V2 &info); +const QDBusArgument &operator>>(const QDBusArgument &arg, TouchscreenInfo_V2 &info); + +void registerTouchscreenInfoList_V2MetaType(); + +#endif // !TOUCHSCREENINFOLISTV2_H diff --git a/frame/dbusinterface/types/touchscreenmap.cpp b/frame/dbusinterface/types/touchscreenmap.cpp new file mode 100644 index 000000000..9f43d61b4 --- /dev/null +++ b/frame/dbusinterface/types/touchscreenmap.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: quezhiyong + * + * Maintainer: quezhiyong + * + * 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 . + */ + +#include "touchscreenmap.h" + +void registerTouchscreenMapMetaType() +{ + qRegisterMetaType("TouchscreenMap"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/touchscreenmap.h b/frame/dbusinterface/types/touchscreenmap.h new file mode 100644 index 000000000..fa5db98c2 --- /dev/null +++ b/frame/dbusinterface/types/touchscreenmap.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: quezhiyong + * + * Maintainer: quezhiyong + * + * 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 . + */ + +#ifndef TOUCHSCREENMAP_H +#define TOUCHSCREENMAP_H + +#include +#include + +typedef QMap TouchscreenMap; + +void registerTouchscreenMapMetaType(); + +#endif // TOUCHSCREENMAP_H diff --git a/frame/dbusinterface/types/zoneinfo.cpp b/frame/dbusinterface/types/zoneinfo.cpp new file mode 100644 index 000000000..95b46df3a --- /dev/null +++ b/frame/dbusinterface/types/zoneinfo.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "zoneinfo.h" + +ZoneInfo::ZoneInfo() +{ + +} + +bool ZoneInfo::operator ==(const ZoneInfo &what) const +{ + // TODO: 这里只判断这两个成员应该就可以了 + return m_zoneName == what.m_zoneName && + m_utcOffset == what.m_utcOffset; +} + +QDebug operator<<(QDebug argument, const ZoneInfo & info) +{ + argument << info.m_zoneName << ',' << info.m_zoneCity << ',' << info.m_utcOffset << ','; + argument << info.i2 << ',' << info.i3 << ',' << info.i4 << endl; + + return argument; +} + +QDBusArgument &operator<<(QDBusArgument & argument, const ZoneInfo & info) +{ + argument.beginStructure(); + argument << info.m_zoneName << info.m_zoneCity << info.m_utcOffset; + argument.beginStructure(); + argument << info.i2 << info.i3 << info.i4; + argument.endStructure(); + argument.endStructure(); + + return argument; +} + +QDataStream &operator<<(QDataStream & argument, const ZoneInfo & info) +{ + argument << info.m_zoneName << info.m_zoneCity << info.m_utcOffset; + argument << info.i2 << info.i3 << info.i4; + + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument & argument, ZoneInfo & info) +{ + argument.beginStructure(); + argument >> info.m_zoneName >> info.m_zoneCity >> info.m_utcOffset; + argument.beginStructure(); + argument >> info.i2 >> info.i3 >> info.i4; + argument.endStructure(); + argument.endStructure(); + + return argument; +} + +const QDataStream &operator>>(QDataStream & argument, ZoneInfo & info) +{ + argument >> info.m_zoneName >> info.m_zoneCity >> info.m_utcOffset; + argument >> info.i2 >> info.i3 >> info.i4; + + return argument; +} + +void registerZoneInfoMetaType() +{ + qRegisterMetaType("ZoneInfo"); + qDBusRegisterMetaType(); +} diff --git a/frame/dbusinterface/types/zoneinfo.h b/frame/dbusinterface/types/zoneinfo.h new file mode 100644 index 000000000..ca7249e36 --- /dev/null +++ b/frame/dbusinterface/types/zoneinfo.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef ZONEINFO_H +#define ZONEINFO_H + +#include +#include +#include +#include +#include + +class ZoneInfo +{ +public: + ZoneInfo(); + + friend QDebug operator<<(QDebug argument, const ZoneInfo &info); + friend QDBusArgument &operator<<(QDBusArgument &argument, const ZoneInfo &info); + friend QDataStream &operator<<(QDataStream &argument, const ZoneInfo &info); + friend const QDBusArgument &operator>>(const QDBusArgument &argument, ZoneInfo &info); + friend const QDataStream &operator>>(QDataStream &argument, ZoneInfo &info); + + bool operator==(const ZoneInfo &what) const; + +public: + inline QString getZoneName() const {return m_zoneName;} + inline QString getZoneCity() const {return m_zoneCity;} + inline int getUTCOffset() const {return m_utcOffset;} + +private: + QString m_zoneName; + QString m_zoneCity; + int m_utcOffset; + qint64 i2; + qint64 i3; + int i4; +}; + +Q_DECLARE_METATYPE(ZoneInfo) + +void registerZoneInfoMetaType(); + +#endif // ZONEINFO_H diff --git a/frame/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml b/frame/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml new file mode 100644 index 000000000..ce2cec070 --- /dev/null +++ b/frame/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frame/dbusinterface/xml/org.deepin.api.XEventMonitor.xml b/frame/dbusinterface/xml/org.deepin.api.XEventMonitor.xml new file mode 100644 index 000000000..f19d6af06 --- /dev/null +++ b/frame/dbusinterface/xml/org.deepin.api.XEventMonitor.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml b/frame/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml new file mode 100644 index 000000000..347056803 --- /dev/null +++ b/frame/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + \n + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frame/dbusinterface/xml/org.deepin.daemon.Audio.xml b/frame/dbusinterface/xml/org.deepin.daemon.Audio.xml new file mode 100644 index 000000000..056518152 --- /dev/null +++ b/frame/dbusinterface/xml/org.deepin.daemon.Audio.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frame/dbusinterface/xml/org.deepin.daemon.Display.xml b/frame/dbusinterface/xml/org.deepin.daemon.Display.xml new file mode 100644 index 000000000..7862b7175 --- /dev/null +++ b/frame/dbusinterface/xml/org.deepin.daemon.Display.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frame/dbusinterface/xml/org.deepin.daemon.Gesture.xml b/frame/dbusinterface/xml/org.deepin.daemon.Gesture.xml new file mode 100644 index 000000000..e28032954 --- /dev/null +++ b/frame/dbusinterface/xml/org.deepin.daemon.Gesture.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frame/dbusinterface/xml/org.deepin.daemon.Timedate.xml b/frame/dbusinterface/xml/org.deepin.daemon.Timedate.xml new file mode 100644 index 000000000..935a74c77 --- /dev/null +++ b/frame/dbusinterface/xml/org.deepin.daemon.Timedate.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frame/dbusinterface/xml/org.deepin.dde.Launcher.xml b/frame/dbusinterface/xml/org.deepin.dde.Launcher.xml new file mode 100644 index 000000000..bea11ef51 --- /dev/null +++ b/frame/dbusinterface/xml/org.deepin.dde.Launcher.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/frame/dbusinterface/xml/org.freedesktop.FileManager.xml b/frame/dbusinterface/xml/org.freedesktop.FileManager.xml new file mode 100644 index 000000000..fb67a6c59 --- /dev/null +++ b/frame/dbusinterface/xml/org.freedesktop.FileManager.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/frame/dbusinterface/xml/org.kde.StatusNotifierItem.xml b/frame/dbusinterface/xml/org.kde.StatusNotifierItem.xml new file mode 100644 index 000000000..f1858b46e --- /dev/null +++ b/frame/dbusinterface/xml/org.kde.StatusNotifierItem.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frame/display/displaymanager.h b/frame/display/displaymanager.h index bc4ebfa6d..009394adf 100644 --- a/frame/display/displaymanager.h +++ b/frame/display/displaymanager.h @@ -26,8 +26,7 @@ #include "singleton.h" #include "constants.h" - -#include +#include "org_deepin_daemon_display.h" using DisplayInter = com::deepin::daemon::Display; using namespace Dock; diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index 5ef5e73e7..f98a5f9ed 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -24,13 +24,13 @@ #include "utils.h" #include "displaymanager.h" -#include +#include "org_deepin_api_xeventmonitor.h" #define SPLIT_NONE 0 #define SPLIT_LEFT 1 #define SPLIT_RIGHT 2 -using XEventMonitor = ::com::deepin::api::XEventMonitor; +using XEventMonitor = ::org::deepin::api::XEventMonitor1; AppDragWidget::AppDragWidget(QWidget *parent) : QGraphicsView(parent) diff --git a/frame/model/volumemodel.cpp b/frame/model/volumemodel.cpp index 45f2b2074..45d2845cd 100644 --- a/frame/model/volumemodel.cpp +++ b/frame/model/volumemodel.cpp @@ -11,8 +11,8 @@ * @param parent */ -static const QString serviceName = QString("com.deepin.daemon.Audio"); -static const QString servicePath = QString("/com/deepin/daemon/Audio"); +static const QString serviceName = QString("org.deepin.daemon.Audio1"); +static const QString servicePath = QString("/org/deepin/daemon/Audio1"); VolumeModel::VolumeModel(QObject *parent) : QObject(parent) diff --git a/frame/model/volumemodel.h b/frame/model/volumemodel.h index 8903cea23..ab3b82e92 100644 --- a/frame/model/volumemodel.h +++ b/frame/model/volumemodel.h @@ -1,13 +1,13 @@ #ifndef VOLUMNMODEL_H #define VOLUMNMODEL_H +#include "org_deepin_daemon_audio.h" +#include "org_deepin_daemon_audio_sink.h" + #include -#include -#include - -using DBusAudio = com::deepin::daemon::Audio; -using DBusSink = com::deepin::daemon::audio::Sink; +using DBusAudio = org::deepin::daemon::Audio1; +using DBusSink = org::deepin::daemon::audio1::Sink; class QDBusMessage; class AudioSink; diff --git a/frame/qtdbusextended/DBusExtended b/frame/qtdbusextended/DBusExtended new file mode 100644 index 000000000..719c49b2a --- /dev/null +++ b/frame/qtdbusextended/DBusExtended @@ -0,0 +1 @@ +#include "dbusextended.h" diff --git a/frame/qtdbusextended/DBusExtendedAbstractInterface b/frame/qtdbusextended/DBusExtendedAbstractInterface new file mode 100644 index 000000000..246af8a14 --- /dev/null +++ b/frame/qtdbusextended/DBusExtendedAbstractInterface @@ -0,0 +1 @@ +#include "dbusextendedabstractinterface.h" diff --git a/frame/qtdbusextended/dbusextended.h b/frame/qtdbusextended/dbusextended.h new file mode 100644 index 000000000..6b27aa24b --- /dev/null +++ b/frame/qtdbusextended/dbusextended.h @@ -0,0 +1,35 @@ +// -*- c++ -*- + +/*! + * + * Copyright (C) 2015 Jolla Ltd. + * + * Contact: Valerio Valerio + * Author: Andres Gomez + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef QT_DBUS_EXTENDED_H +#define QT_DBUS_EXTENDED_H + +#if defined(QT_DBUS_EXTENDED_LIBRARY) +# define QT_DBUS_EXTENDED_EXPORT Q_DECL_EXPORT +#else +# define QT_DBUS_EXTENDED_EXPORT Q_DECL_IMPORT +#endif + +#endif /* QT_DBUS_EXTENDED_H */ diff --git a/frame/qtdbusextended/dbusextendedabstractinterface.cpp b/frame/qtdbusextended/dbusextendedabstractinterface.cpp new file mode 100644 index 000000000..54d46f3d3 --- /dev/null +++ b/frame/qtdbusextended/dbusextendedabstractinterface.cpp @@ -0,0 +1,525 @@ +// -*- c++ -*- + +/*! + * + * Copyright (C) 2015 Jolla Ltd. + * + * Contact: Valerio Valerio + * Author: Andres Gomez + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "dbusextendedpendingcallwatcher_p.h" + +#include + +#include +#include +#include +#include +#include + +#include +#include + + +Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusInterface, ("org.freedesktop.DBus")) +Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusPropertiesInterface, ("org.freedesktop.DBus.Properties")) +Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusPropertiesChangedSignal, ("PropertiesChanged")) +Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, propertyChangedSignature, ("propertyChanged(QString,QVariant)")) +Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, propertyInvalidatedSignature, ("propertyInvalidated(QString)")) + + +DBusExtendedAbstractInterface::DBusExtendedAbstractInterface(const QString &service, const QString &path, const char *interface, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, interface, connection, parent) + , m_sync(true) + , m_useCache(false) + , m_getAllPendingCallWatcher(0) + , m_propertiesChangedConnected(false) +{ + const_cast(connection).connect(QString("org.freedesktop.DBus"), QString("/org/freedesktop/DBus"), QString("org.freedesktop.DBus"), QString("NameOwnerChanged"), this, SLOT(onDBusNameOwnerChanged(QString,QString,QString))); +} + +DBusExtendedAbstractInterface::~DBusExtendedAbstractInterface() +{ +} + +void DBusExtendedAbstractInterface::setSync(bool sync) { setSync(sync, true); } + +/* + * Note: After sync is set to false, it will always return a empty value + * if you call the property's get function directly. So you can only get it + * through the changed signal when you get an property, and it's also a good idea + * to save a cache yourself. + */ + +/* + * 注意: 如果设置 sync 为 false 那么在调用属性的 get 函数获取一个属性时会一直返回空值, + * 解决方法是监听属性的 changed 信号并自行保存一份缓存, 让 changed 信号修改这个缓存 + */ +void DBusExtendedAbstractInterface::setSync(bool sync, bool autoStart) +{ + m_sync = sync; + + // init all properties + if (autoStart && !m_sync && !isValid()) + startServiceProcess(); +} + +void DBusExtendedAbstractInterface::getAllProperties() +{ + m_lastExtendedError = QDBusError(); + + if (!isValid()) { + QString errorMessage = QStringLiteral("This Extended DBus interface is not valid yet."); + m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); + qDebug() << Q_FUNC_INFO << errorMessage; + return; + } + + if (!m_sync && m_getAllPendingCallWatcher) { + // Call already in place, not repeating ... + return; + } + + QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("GetAll")); + msg << interface(); + + if (m_sync) { + QDBusMessage reply = connection().call(msg); + + if (reply.type() != QDBusMessage::ReplyMessage) { + m_lastExtendedError = QDBusError(reply); + qWarning() << Q_FUNC_INFO << m_lastExtendedError.message(); + return; + } + + if (reply.signature() != QLatin1String("a{sv}")) { + QString errorMessage = QStringLiteral("Invalid signature \"%1\" in return from call to %2") + .arg(reply.signature(), + QString(*dBusPropertiesInterface())); + qWarning() << Q_FUNC_INFO << errorMessage; + m_lastExtendedError = QDBusError(QDBusError::InvalidSignature, errorMessage); + return; + } + + QVariantMap value = reply.arguments().at(0).toMap(); + onPropertiesChanged(interface(), value, QStringList()); + } else { + QDBusPendingReply async = connection().asyncCall(msg); + m_getAllPendingCallWatcher = new QDBusPendingCallWatcher(async, this); + + connect(m_getAllPendingCallWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher*))); + return; + } +} + +void DBusExtendedAbstractInterface::connectNotify(const QMetaMethod &signal) +{ + if (signal.methodType() == QMetaMethod::Signal + && (signal.methodSignature() == *propertyChangedSignature() + || signal.methodSignature() == *propertyInvalidatedSignature())) { + if (!m_propertiesChangedConnected) { + QStringList argumentMatch; + argumentMatch << interface(); + connection().connect(service(), path(), *dBusPropertiesInterface(), *dBusPropertiesChangedSignal(), + argumentMatch, QString(), + this, SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); + + m_propertiesChangedConnected = true; + return; + } + } else { + QDBusAbstractInterface::connectNotify(signal); + } +} + +void DBusExtendedAbstractInterface::disconnectNotify(const QMetaMethod &signal) +{ + if (signal.methodType() == QMetaMethod::Signal + && (signal.methodSignature() == *propertyChangedSignature() + || signal.methodSignature() == *propertyInvalidatedSignature())) { + if (m_propertiesChangedConnected + && 0 == receivers(propertyChangedSignature()->constData()) + && 0 == receivers(propertyInvalidatedSignature()->constData())) { + QStringList argumentMatch; + argumentMatch << interface(); + connection().disconnect(service(), path(), *dBusPropertiesInterface(), *dBusPropertiesChangedSignal(), + argumentMatch, QString(), + this, SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); + + m_propertiesChangedConnected = false; + return; + } + } else { + QDBusAbstractInterface::disconnectNotify(signal); + } +} + +QVariant DBusExtendedAbstractInterface::internalPropGet(const char *propname, void *propertyPtr) +{ + m_lastExtendedError = QDBusError(); + + if (m_useCache) { + int propertyIndex = metaObject()->indexOfProperty(propname); + QMetaProperty metaProperty = metaObject()->property(propertyIndex); + return QVariant(metaProperty.userType(), propertyPtr); + } + + if (m_sync) { + QVariant ret = property(propname); + + QMetaType::construct(ret.userType(), propertyPtr, ret.constData()); + + return ret; + } else { + if (!isValid()) { + QString errorMessage = QStringLiteral("This Extended DBus interface is not valid yet."); + m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); + qDebug() << Q_FUNC_INFO << errorMessage; + return QVariant(); + } + + int propertyIndex = metaObject()->indexOfProperty(propname); + + if (-1 == propertyIndex) { + QString errorMessage = QStringLiteral("Got unknown property \"%1\" to read") + .arg(QString::fromLatin1(propname)); + m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); + qWarning() << Q_FUNC_INFO << errorMessage; + return QVariant(); + } + + QMetaProperty metaProperty = metaObject()->property(propertyIndex); + + if (!metaProperty.isReadable()) { + QString errorMessage = QStringLiteral("Property \"%1\" is NOT readable") + .arg(QString::fromLatin1(propname)); + m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); + qWarning() << Q_FUNC_INFO << errorMessage; + return QVariant(); + } + + // is this metatype registered? + const char *expectedSignature = ""; + if (int(metaProperty.type()) != QMetaType::QVariant) { + expectedSignature = QDBusMetaType::typeToSignature(metaProperty.userType()); + if (0 == expectedSignature) { + QString errorMessage = + QStringLiteral("Type %1 must be registered with Qt D-Bus " + "before it can be used to read property " + "%2.%3") + .arg(metaProperty.typeName(), + interface(), + propname); + m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); + qWarning() << Q_FUNC_INFO << errorMessage; + return QVariant(); + } + } + + asyncProperty(propname); + return QVariant(metaProperty.userType(), propertyPtr); + } +} + +void DBusExtendedAbstractInterface::internalPropSet(const char *propname, const QVariant &value, void *propertyPtr) +{ + m_lastExtendedError = QDBusError(); + + if (m_sync) { + setProperty(propname, value); + } else { + if (!isValid()) { + QString errorMessage = QStringLiteral("This interface is not yet valid"); + m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); + qDebug() << Q_FUNC_INFO << errorMessage; + return; + } + + int propertyIndex = metaObject()->indexOfProperty(propname); + + if (-1 == propertyIndex) { + QString errorMessage = QStringLiteral("Got unknown property \"%1\" to write") + .arg(QString::fromLatin1(propname)); + m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); + qWarning() << Q_FUNC_INFO << errorMessage; + return; + } + + QMetaProperty metaProperty = metaObject()->property(propertyIndex); + + if (!metaProperty.isWritable()) { + QString errorMessage = QStringLiteral("Property \"%1\" is NOT writable") + .arg(QString::fromLatin1(propname)); + m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); + qWarning() << Q_FUNC_INFO << errorMessage; + return; + } + + QVariant variant = QVariant(metaProperty.type(), propertyPtr); + variant = value; + + asyncSetProperty(propname, variant); + } +} + +QVariant DBusExtendedAbstractInterface::asyncProperty(const QString &propertyName) +{ + QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("Get")); + msg << interface() << propertyName; + QDBusPendingReply async = connection().asyncCall(msg); + DBusExtendedPendingCallWatcher *watcher = new DBusExtendedPendingCallWatcher(async, propertyName, QVariant(), this); + + connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(onAsyncPropertyFinished(QDBusPendingCallWatcher*))); + + return QVariant(); +} + +void DBusExtendedAbstractInterface::asyncSetProperty(const QString &propertyName, const QVariant &value) +{ + QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("Set")); + + msg << interface() << propertyName << QVariant::fromValue(QDBusVariant(value)); + QDBusPendingReply<> async = connection().asyncCall(msg); + DBusExtendedPendingCallWatcher *watcher = new DBusExtendedPendingCallWatcher(async, propertyName, value, this); + + connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(onAsyncSetPropertyFinished(QDBusPendingCallWatcher*))); +} + +void DBusExtendedAbstractInterface::startServiceProcess() +{ + const QString &servName = service(); + + if (isValid()) + { + qWarning() << "Service" << servName << "is already started."; + return; + } + + QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.DBus", "/", *dBusInterface(), QStringLiteral("StartServiceByName")); + msg << servName << quint32(0); + QDBusPendingReply async = connection().asyncCall(msg); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); + + connect(watcher, &QDBusPendingCallWatcher::finished, this, &DBusExtendedAbstractInterface::onStartServiceProcessFinished); +} + +void DBusExtendedAbstractInterface::onStartServiceProcessFinished(QDBusPendingCallWatcher *w) +{ + if (w->isError()) + { + m_lastExtendedError = w->error(); + } else { + m_lastExtendedError = QDBusError(); + } + + QDBusPendingReply reply = *w; + + Q_EMIT serviceStartFinished(reply.value()); + + w->deleteLater(); +} + +void DBusExtendedAbstractInterface::onAsyncPropertyFinished(QDBusPendingCallWatcher *w) +{ + DBusExtendedPendingCallWatcher *watcher = qobject_cast(w); + Q_ASSERT(watcher); + + QDBusPendingReply reply = *watcher; + + if (reply.isError()) { + m_lastExtendedError = reply.error(); + } else { + int propertyIndex = metaObject()->indexOfProperty(watcher->asyncProperty().toLatin1().constData()); + QVariant value = demarshall(interface(), + metaObject()->property(propertyIndex), + reply.value(), + &m_lastExtendedError); + + if (m_lastExtendedError.isValid()) { + Q_EMIT propertyInvalidated(watcher->asyncProperty()); + } else { + Q_EMIT propertyChanged(watcher->asyncProperty(), value); + } + } + + Q_EMIT asyncPropertyFinished(watcher->asyncProperty()); + watcher->deleteLater(); +} + +void DBusExtendedAbstractInterface::onAsyncSetPropertyFinished(QDBusPendingCallWatcher *w) +{ + DBusExtendedPendingCallWatcher *watcher = qobject_cast(w); + Q_ASSERT(watcher); + + QDBusPendingReply<> reply = *watcher; + + if (reply.isError()) { + m_lastExtendedError = reply.error(); + } else { + m_lastExtendedError = QDBusError(); + } + + Q_EMIT asyncSetPropertyFinished(watcher->asyncProperty()); + + // Resetting the property to its previous value after sending the + // finished signal + if (reply.isError()) { + m_lastExtendedError = QDBusError(); + Q_EMIT propertyChanged(watcher->asyncProperty(), watcher->previousValue()); + } + + watcher->deleteLater(); +} + +void DBusExtendedAbstractInterface::onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher *watcher) +{ + m_getAllPendingCallWatcher = 0; + + QDBusPendingReply reply = *watcher; + + if (reply.isError()) { + m_lastExtendedError = reply.error(); + } else { + m_lastExtendedError = QDBusError(); + } + + Q_EMIT asyncGetAllPropertiesFinished(); + + if (!reply.isError()) { + onPropertiesChanged(interface(), reply.value(), QStringList()); + } + + watcher->deleteLater(); +} + +void DBusExtendedAbstractInterface::onPropertiesChanged(const QString& interfaceName, + const QVariantMap& changedProperties, + const QStringList& invalidatedProperties) +{ + if (interfaceName == interface()) { + QVariantMap::const_iterator i = changedProperties.constBegin(); + while (i != changedProperties.constEnd()) { + int propertyIndex = metaObject()->indexOfProperty(i.key().toLatin1().constData()); + + if (-1 == propertyIndex) { + qDebug() << Q_FUNC_INFO << "Got unknown changed property" << i.key(); + } else { + QVariant value = demarshall(interface(), metaObject()->property(propertyIndex), i.value(), &m_lastExtendedError); + + if (m_lastExtendedError.isValid()) { + Q_EMIT propertyInvalidated(i.key()); + } else { + Q_EMIT propertyChanged(i.key(), value); + } + } + + ++i; + } + + QStringList::const_iterator j = invalidatedProperties.constBegin(); + while (j != invalidatedProperties.constEnd()) { + if (-1 == metaObject()->indexOfProperty(j->toLatin1().constData())) { + qDebug() << Q_FUNC_INFO << "Got unknown invalidated property" << *j; + } else { + m_lastExtendedError = QDBusError(); + Q_EMIT propertyInvalidated(*j); + } + + ++j; + } + } +} + +void DBusExtendedAbstractInterface::onDBusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) +{ + if (name == service() && oldOwner.isEmpty()) + { + m_dbusOwner = newOwner; + Q_EMIT serviceValidChanged(true); + } + else if (name == m_dbusOwner && newOwner.isEmpty()) + { + m_dbusOwner.clear(); + Q_EMIT serviceValidChanged(false); + } +} + +QVariant DBusExtendedAbstractInterface::demarshall(const QString &interface, const QMetaProperty &metaProperty, const QVariant &value, QDBusError *error) +{ + Q_ASSERT(metaProperty.isValid()); + Q_ASSERT(error != 0); + + if (value.userType() == metaProperty.userType()) { + // No need demarshalling. Passing back straight away ... + *error = QDBusError(); + return value; + } + + QVariant result = QVariant(metaProperty.userType(), (void*)0); + QString errorMessage; + const char *expectedSignature = QDBusMetaType::typeToSignature(metaProperty.userType()); + + if (value.userType() == qMetaTypeId()) { + // demarshalling a DBus argument ... + QDBusArgument dbusArg = value.value(); + + if (expectedSignature == dbusArg.currentSignature().toLatin1()) { + QDBusMetaType::demarshall(dbusArg, metaProperty.userType(), result.data()); + if (!result.isValid()) { + errorMessage = QStringLiteral("Unexpected failure demarshalling " + "upon PropertiesChanged signal arrival " + "for property `%3.%4' (expected type `%5' (%6))") + .arg(interface, + QString::fromLatin1(metaProperty.name()), + QString::fromLatin1(metaProperty.typeName()), + expectedSignature); + } + } else { + errorMessage = QStringLiteral("Unexpected `user type' (%2) " + "upon PropertiesChanged signal arrival " + "for property `%3.%4' (expected type `%5' (%6))") + .arg(dbusArg.currentSignature(), + interface, + QString::fromLatin1(metaProperty.name()), + QString::fromLatin1(metaProperty.typeName()), + QString::fromLatin1(expectedSignature)); + } + } else { + const char *actualSignature = QDBusMetaType::typeToSignature(value.userType()); + + errorMessage = QStringLiteral("Unexpected `%1' (%2) " + "upon PropertiesChanged signal arrival " + "for property `%3.%4' (expected type `%5' (%6))") + .arg(QString::fromLatin1(value.typeName()), + QString::fromLatin1(actualSignature), + interface, + QString::fromLatin1(metaProperty.name()), + QString::fromLatin1(metaProperty.typeName()), + QString::fromLatin1(expectedSignature)); + } + + if (errorMessage.isEmpty()) { + *error = QDBusError(); + } else { + *error = QDBusMessage::createError(QDBusError::InvalidSignature, errorMessage); + qDebug() << Q_FUNC_INFO << errorMessage; + } + + return result; +} diff --git a/frame/qtdbusextended/dbusextendedabstractinterface.h b/frame/qtdbusextended/dbusextendedabstractinterface.h new file mode 100644 index 000000000..812d0ae29 --- /dev/null +++ b/frame/qtdbusextended/dbusextendedabstractinterface.h @@ -0,0 +1,103 @@ +// -*- c++ -*- + +/*! + * + * Copyright (C) 2015 Jolla Ltd. + * + * Contact: Valerio Valerio + * Author: Andres Gomez + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef DBUSEXTENDEDABSTRACTINTERFACE_H +#define DBUSEXTENDEDABSTRACTINTERFACE_H + +#include + +#include +#include + +class QDBusPendingCallWatcher; +class DBusExtendedPendingCallWatcher; + +class QT_DBUS_EXTENDED_EXPORT DBusExtendedAbstractInterface: public QDBusAbstractInterface +{ + Q_OBJECT + +public: + virtual ~DBusExtendedAbstractInterface(); + + Q_PROPERTY(bool sync READ sync WRITE setSync) + inline bool sync() const { return m_sync; } + void setSync(bool sync); + void setSync(bool sync, bool autoStart); + + Q_PROPERTY(bool useCache READ useCache WRITE setUseCache) + inline bool useCache() const { return m_useCache; } + inline void setUseCache(bool useCache) { m_useCache = useCache; } + + void getAllProperties(); + inline QDBusError lastExtendedError() const { return m_lastExtendedError; } + +public Q_SLOTS: + void startServiceProcess(); + +protected: + DBusExtendedAbstractInterface(const QString &service, + const QString &path, + const char *interface, + const QDBusConnection &connection, + QObject *parent); + + void connectNotify(const QMetaMethod &signal); + void disconnectNotify(const QMetaMethod &signal); + QVariant internalPropGet(const char *propname, void *propertyPtr); + void internalPropSet(const char *propname, const QVariant &value, void *propertyPtr); + +Q_SIGNALS: + void serviceValidChanged(const bool valid) const; + void serviceStartFinished(const quint32 ret) const; + void propertyChanged(const QString &propertyName, const QVariant &value); + void propertyInvalidated(const QString &propertyName); + void asyncPropertyFinished(const QString &propertyName); + void asyncSetPropertyFinished(const QString &propertyName); + void asyncGetAllPropertiesFinished(); + +private Q_SLOTS: + void onPropertiesChanged(const QString& interfaceName, + const QVariantMap& changedProperties, + const QStringList& invalidatedProperties); + void onDBusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); + void onAsyncPropertyFinished(QDBusPendingCallWatcher *w); + void onAsyncSetPropertyFinished(QDBusPendingCallWatcher *w); + void onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher *watcher); + void onStartServiceProcessFinished(QDBusPendingCallWatcher *w); + +private: + QVariant asyncProperty(const QString &propertyName); + void asyncSetProperty(const QString &propertyName, const QVariant &value); + static QVariant demarshall(const QString &interface, const QMetaProperty &metaProperty, const QVariant &value, QDBusError *error); + + bool m_sync; + bool m_useCache; + QDBusPendingCallWatcher *m_getAllPendingCallWatcher; + QDBusError m_lastExtendedError; + QString m_dbusOwner; + bool m_propertiesChangedConnected; +}; + +#endif /* DBUSEXTENDEDABSTRACTINTERFACE_H */ diff --git a/frame/qtdbusextended/dbusextendedpendingcallwatcher.cpp b/frame/qtdbusextended/dbusextendedpendingcallwatcher.cpp new file mode 100644 index 000000000..a8404d935 --- /dev/null +++ b/frame/qtdbusextended/dbusextendedpendingcallwatcher.cpp @@ -0,0 +1,38 @@ +// -*- c++ -*- + +/*! + * + * Copyright (C) 2015 Jolla Ltd. + * + * Contact: Valerio Valerio + * Author: Andres Gomez + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "dbusextendedpendingcallwatcher_p.h" + + +DBusExtendedPendingCallWatcher::DBusExtendedPendingCallWatcher(const QDBusPendingCall &call, const QString &asyncProperty, const QVariant &previousValue, QObject *parent) + : QDBusPendingCallWatcher(call, parent) + , m_asyncProperty(asyncProperty) + , m_previousValue(previousValue) +{ +} + +DBusExtendedPendingCallWatcher::~DBusExtendedPendingCallWatcher() +{ +} diff --git a/frame/qtdbusextended/dbusextendedpendingcallwatcher_p.h b/frame/qtdbusextended/dbusextendedpendingcallwatcher_p.h new file mode 100644 index 000000000..ff7a85da8 --- /dev/null +++ b/frame/qtdbusextended/dbusextendedpendingcallwatcher_p.h @@ -0,0 +1,67 @@ +// -*- c++ -*- + +/*! + * + * Copyright (C) 2015 Jolla Ltd. + * + * Contact: Valerio Valerio + * Author: Andres Gomez + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +// +// W A R N I N G +// ------------- +// +// This file is not part of the public API. This header file may +// change from version to version without notice, or even be +// removed. +// +// We mean it. +// +// + + +#ifndef DBUSEXTENDEDPENDINGCALLWATCHER_P_H +#define DBUSEXTENDEDPENDINGCALLWATCHER_P_H + +#include +#include + +class DBusExtendedPendingCallWatcher: public QDBusPendingCallWatcher +{ + Q_OBJECT + +public: + explicit DBusExtendedPendingCallWatcher(const QDBusPendingCall &call, + const QString &asyncProperty, + const QVariant &previousValue, + QObject *parent = 0); + ~DBusExtendedPendingCallWatcher(); + + Q_PROPERTY(QString AsyncProperty READ asyncProperty) + inline QString asyncProperty() const { return m_asyncProperty; } + + Q_PROPERTY(QVariant PreviousValue READ previousValue) + inline QVariant previousValue() const { return m_previousValue; } + +private: + QString m_asyncProperty; + QVariant m_previousValue; +}; + +#endif /* DBUSEXTENDEDPENDINGCALLWATCHER_P_H */ diff --git a/frame/util/dbusutil.h b/frame/util/dbusutil.h index b540a3f8c..f9c8ff4d3 100644 --- a/frame/util/dbusutil.h +++ b/frame/util/dbusutil.h @@ -44,13 +44,13 @@ const QString controllCenterService = "org.deepin.dde.ControlCenter1"; const QString controllCenterPath = "/org/deepin/dde/ControlCenter1"; const QString controllCenterInterface = "org.deepin.dde.ControlCenter1"; -const QString notificationService = "org.deepin.dde.Notification1"; -const QString notificationPath = "/org/deepin/dde/Notification1"; -const QString notificationInterface = "org.deepin.dde.Notification1"; +const QString notificationService = "com.deepin.dde.Notification"; +const QString notificationPath = "/com/deepin/dde/Notification"; +const QString notificationInterface = "com.deepin.dde.Notification"; -const QString sessionManagerService = "org.deepin.SessionManager1"; -const QString sessionManagerPath = "/org/deepin/SessionManager1"; -const QString sessionManagerInterface = "org.deepin.SessionManager1"; +const QString sessionManagerService = "com.deepin.SessionManager"; +const QString sessionManagerPath = "/com/deepin/SessionManager"; +const QString sessionManagerInterface = "com.deepin.SessionManager"; #else using DockInter = com::deepin::dde::daemon::Dock; using DockEntryInter = com::deepin::dde::daemon::dock::Entry; diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index f82f77cd0..2ae61f496 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -28,8 +28,8 @@ #include "xcb_misc.h" #include "dbusutil.h" -#include -#include +#include "org_deepin_api_xeventmonitor.h" +#include "org_deepin_dde_launcher.h" #include @@ -53,8 +53,8 @@ DGUI_USE_NAMESPACE #define DRAG_AREA_SIZE (5) #define DOCKSPACE (WINDOWMARGIN * 2) -using XEventMonitor = ::com::deepin::api::XEventMonitor; -using DBusLuncher = ::com::deepin::dde::Launcher; +using XEventMonitor = ::org::deepin::api::XEventMonitor1; +using DBusLuncher = ::org::deepin::dde::Launcher1; using namespace Dock; class QVariantAnimation; diff --git a/frame/util/touchsignalmanager.h b/frame/util/touchsignalmanager.h index 599e407f5..3cd09fd7e 100644 --- a/frame/util/touchsignalmanager.h +++ b/frame/util/touchsignalmanager.h @@ -22,11 +22,11 @@ #ifndef TOUCHSIGNALMANAGER_H #define TOUCHSIGNALMANAGER_H +#include "org_deepin_daemon_gesture.h" + #include -#include - -using Gesture = com::deepin::daemon::Gesture; +using Gesture = com::deepin::daemon::Gesture1; class TouchSignalManager : public QObject { diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index 81fe0538c..df5bc4e3f 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -44,7 +44,7 @@ static QMap timeFormat{{0, "h:mm"}, {1, "hh:mm"}}; DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) : QWidget (parent) - , m_timedateInter(new Timedate("com.deepin.daemon.Timedate", "/com/deepin/daemon/Timedate", QDBusConnection::sessionBus(), this)) + , m_timedateInter(new Timedate("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", QDBusConnection::sessionBus(), this)) , m_position(Dock::Position::Bottom) , m_dateFont(DFontSizeManager::instance()->t10()) , m_tipsWidget(new Dock::TipsWidget(this)) diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index 2c933c07d..587da8a11 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -23,17 +23,17 @@ #include "constants.h" +#include "org_deepin_daemon_timedate.h" + #include #include -#include - namespace Dock { class TipsWidget; } class DockPopupWindow; class QMenu; -using Timedate = com::deepin::daemon::Timedate; +using Timedate = org::deepin::daemon::Timedate1; class DateTimeDisplayer : public QWidget { diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 82e32e498..cf4c7cc20 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -27,8 +27,6 @@ #include -#include - using namespace Dock; class QBoxLayout; diff --git a/frame/window/tray/dbustraymanager.cpp b/frame/window/tray/dbustraymanager.cpp index 638174b2f..6610d560d 100644 --- a/frame/window/tray/dbustraymanager.cpp +++ b/frame/window/tray/dbustraymanager.cpp @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager com.deepin.dde.TrayManager.xml + * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager org.deepin.dde.TrayManager.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -16,7 +16,7 @@ */ DBusTrayManager::DBusTrayManager(QObject *parent) - : QDBusAbstractInterface("com.deepin.dde.TrayManager", "/com/deepin/dde/TrayManager", staticInterfaceName(), QDBusConnection::sessionBus(), parent) + : QDBusAbstractInterface("org.deepin.dde.TrayManager1", "/org/deepin/dde/TrayManager1", staticInterfaceName(), QDBusConnection::sessionBus(), parent) { qRegisterMetaType("TrayList"); qDBusRegisterMetaType(); diff --git a/frame/window/tray/dbustraymanager.h b/frame/window/tray/dbustraymanager.h index f587babb8..f47136cb5 100644 --- a/frame/window/tray/dbustraymanager.h +++ b/frame/window/tray/dbustraymanager.h @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager com.deepin.dde.TrayManager.xml + * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager org.deepin.dde.TrayManager.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -23,7 +23,7 @@ typedef QList TrayList; /* - * Proxy class for interface com.deepin.dde.TrayManager + * Proxy class for interface org.deepin.dde.TrayManager1 */ class DBusTrayManager: public QDBusAbstractInterface { @@ -35,7 +35,7 @@ class DBusTrayManager: public QDBusAbstractInterface if (3 != arguments.count()) return; QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName !="com.deepin.dde.TrayManager") + if (interfaceName !="org.deepin.dde.TrayManager1") return; QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); foreach(const QString &prop, changedProps.keys()) { @@ -50,7 +50,7 @@ class DBusTrayManager: public QDBusAbstractInterface } public: static inline const char *staticInterfaceName() - { return "com.deepin.dde.TrayManager"; } + { return "org.deepin.dde.TrayManager1"; } public: explicit DBusTrayManager(QObject *parent = 0); diff --git a/frame/window/tray/widgets/snitrayitemwidget.h b/frame/window/tray/widgets/snitrayitemwidget.h index 6b9488e35..eddcb4732 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.h +++ b/frame/window/tray/widgets/snitrayitemwidget.h @@ -26,7 +26,7 @@ #include "basetraywidget.h" #include "dockpopupwindow.h" -#include +#include "org_kde_statusnotifieritem.h" #include #include diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index e1ff560e6..2e3580849 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -24,16 +24,16 @@ #include "constants.h" #include "dbusutil.h" -#include +#include "org_deepin_daemon_timedate.h" -#include +#include namespace Dtk { namespace Gui { class DRegionMonitor; }; namespace Widget { class DBlurEffectWidget; } } using namespace Dtk::Widget; -using Timedate = com::deepin::daemon::Timedate; +using Timedate = org::deepin::daemon::Timedate1; class QuickPluginWindow; class QBoxLayout; diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 133748410..3bcb30dc3 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -11,5 +11,4 @@ add_subdirectory("overlay-warning") add_subdirectory("show-desktop") add_subdirectory("multitasking") add_subdirectory("bluetooth") -#add_subdirectory("dcc-dock-plugin") add_subdirectory("airplane-mode") diff --git a/plugins/airplane-mode/CMakeLists.txt b/plugins/airplane-mode/CMakeLists.txt index 35df5c525..5a8bab952 100644 --- a/plugins/airplane-mode/CMakeLists.txt +++ b/plugins/airplane-mode/CMakeLists.txt @@ -3,8 +3,19 @@ set(PLUGIN_NAME "airplane-mode") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "../../frame/util/imageutil.h" + "../../frame/util/imageutil.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) @@ -13,28 +24,27 @@ find_package(Qt5DBus REQUIRED) find_package(DtkWidget REQUIRED) pkg_check_modules(XCB_EWMH REQUIRED xcb-ewmh x11 xcursor) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} resources/airplane_mode.qrc) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../system-trays) + target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} ../../interfaces ../../widgets ../../frame ../../frame/util - ) + ../../frame/qtdbusextended + ./dbusinterface/generation_dbus_interface) + target_link_libraries(${PLUGIN_NAME} PRIVATE ${XCB_EWMH_LIBRARIES} ${DtkWidget_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} ${Qt5DBus_LIBRARIES} ${Qt5Widgets_LIBRARIES} - ${Qt5Svg_LIBRARIES} -) + ${Qt5Svg_LIBRARIES}) install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/system-trays) diff --git a/plugins/airplane-mode/airplanemodeitem.cpp b/plugins/airplane-mode/airplanemodeitem.cpp index c78c94370..7147307c3 100644 --- a/plugins/airplane-mode/airplanemodeitem.cpp +++ b/plugins/airplane-mode/airplanemodeitem.cpp @@ -43,8 +43,8 @@ AirplaneModeItem::AirplaneModeItem(QWidget *parent) : QWidget(parent) , m_tipsLabel(new Dock::TipsWidget(this)) , m_applet(new AirplaneModeApplet(this)) - , m_airplaneModeInter(new DBusAirplaneMode("com.deepin.daemon.AirplaneMode", - "/com/deepin/daemon/AirplaneMode", + , m_airplaneModeInter(new DBusAirplaneMode("org.deepin.daemon.AirplaneMode1", + "/org/deepin/daemon/AirplaneMode1", QDBusConnection::systemBus(), this)) { diff --git a/plugins/airplane-mode/airplanemodeitem.h b/plugins/airplane-mode/airplanemodeitem.h index 9147f55f1..8517d475d 100644 --- a/plugins/airplane-mode/airplanemodeitem.h +++ b/plugins/airplane-mode/airplanemodeitem.h @@ -23,11 +23,11 @@ #ifndef AIRPLANEMODEITEM_H #define AIRPLANEMODEITEM_H -#include +#include "org_deepin_daemon_airplanemode.h" #include -using DBusAirplaneMode = com::deepin::daemon::AirplaneMode; +using DBusAirplaneMode = org::deepin::daemon::AirplaneMode1; namespace Dock { class TipsWidget; diff --git a/plugins/airplane-mode/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml b/plugins/airplane-mode/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml new file mode 100644 index 000000000..b558d3014 --- /dev/null +++ b/plugins/airplane-mode/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/bluetooth/CMakeLists.txt b/plugins/bluetooth/CMakeLists.txt index fe091ff8c..3072dd5c2 100644 --- a/plugins/bluetooth/CMakeLists.txt +++ b/plugins/bluetooth/CMakeLists.txt @@ -3,11 +3,23 @@ set(PLUGIN_NAME "bluetooth") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" - "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" - "../../frame/util/statebutton.h" "../../frame/util/statebutton.cpp" - "../../frame/util/horizontalseperator.h" "../../frame/util/horizontalseperator.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "../../frame/util/imageutil.h" + "../../frame/util/imageutil.cpp" + "../../frame/util/statebutton.h" + "../../frame/util/statebutton.cpp" + "../../frame/util/horizontalseperator.h" + "../../frame/util/horizontalseperator.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) @@ -16,23 +28,22 @@ find_package(Qt5DBus REQUIRED) find_package(DtkWidget REQUIRED) pkg_check_modules(XCB_EWMH REQUIRED xcb-ewmh x11 xcursor) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} resources/bluetooth.qrc) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../system-trays) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} ../../interfaces ../../frame + ../../frame/qtdbusextended + ./dbusinterface/generation_dbus_interface componments) target_link_libraries(${PLUGIN_NAME} PRIVATE ${XCB_EWMH_LIBRARIES} ${DtkWidget_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} ${Qt5DBus_LIBRARIES} ${Qt5Widgets_LIBRARIES} diff --git a/plugins/bluetooth/bluetooth.json b/plugins/bluetooth/bluetooth.json index 71ae6746f..8400bab79 100644 --- a/plugins/bluetooth/bluetooth.json +++ b/plugins/bluetooth/bluetooth.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "com.deepin.daemon.Bluetooth" + "depends-daemon-dbus-service": "org.deepin.daemon.Bluetooth1" } diff --git a/plugins/bluetooth/componments/adaptersmanager.cpp b/plugins/bluetooth/componments/adaptersmanager.cpp index 9f3a6f8d3..59b529fcf 100644 --- a/plugins/bluetooth/componments/adaptersmanager.cpp +++ b/plugins/bluetooth/componments/adaptersmanager.cpp @@ -31,8 +31,8 @@ AdaptersManager::AdaptersManager(QObject *parent) : QObject(parent) - , m_bluetoothInter(new DBusBluetooth("com.deepin.daemon.Bluetooth", - "/com/deepin/daemon/Bluetooth", + , m_bluetoothInter(new DBusBluetooth("org.deepin.daemon.Bluetooth1", + "/org/deepin/daemon/Bluetooth1", QDBusConnection::sessionBus(), this)) { @@ -65,9 +65,9 @@ AdaptersManager::AdaptersManager(QObject *parent) }); #endif - QDBusInterface inter("com.deepin.daemon.Bluetooth", - "/com/deepin/daemon/Bluetooth", - "com.deepin.daemon.Bluetooth", + QDBusInterface inter("org.deepin.daemon.Bluetooth1", + "/org/deepin/daemon/Bluetooth1", + "org.deepin.daemon.Bluetooth1", QDBusConnection::sessionBus()); QDBusReply reply = inter.call(QDBus::Block, "GetAdapters"); const QString replyStr = reply.value(); diff --git a/plugins/bluetooth/componments/adaptersmanager.h b/plugins/bluetooth/componments/adaptersmanager.h index 1602ef809..50f96a90b 100644 --- a/plugins/bluetooth/componments/adaptersmanager.h +++ b/plugins/bluetooth/componments/adaptersmanager.h @@ -23,8 +23,8 @@ #ifndef ADAPTERSMANAGER_H #define ADAPTERSMANAGER_H -#include -using DBusBluetooth = com::deepin::daemon::Bluetooth; +#include "org_deepin_daemon_bluetooth.h" +using DBusBluetooth = org::deepin::daemon::Bluetooth1; class Adapter; class Device; diff --git a/plugins/bluetooth/componments/bluetoothadapteritem.cpp b/plugins/bluetooth/componments/bluetoothadapteritem.cpp index da68c422e..77f563160 100644 --- a/plugins/bluetooth/componments/bluetoothadapteritem.cpp +++ b/plugins/bluetooth/componments/bluetoothadapteritem.cpp @@ -150,7 +150,7 @@ BluetoothAdapterItem::BluetoothAdapterItem(Adapter *adapter, QWidget *parent) , m_itemDelegate(new DStyledItemDelegate(m_deviceListview)) , m_deviceModel(new QStandardItemModel(m_deviceListview)) , m_refreshBtn(new RefreshButton(this)) - , m_bluetoothInter(new DBusBluetooth("com.deepin.daemon.Bluetooth", "/com/deepin/daemon/Bluetooth", QDBusConnection::sessionBus(), this)) + , m_bluetoothInter(new DBusBluetooth("org.deepin.daemon.Bluetooth1", "/org/deepin/daemon/Bluetooth1", QDBusConnection::sessionBus(), this)) , m_showUnnamedDevices(false) , m_seperator(new HorizontalSeperator(this)) { diff --git a/plugins/bluetooth/componments/bluetoothadapteritem.h b/plugins/bluetooth/componments/bluetoothadapteritem.h index 628dfe31e..b26408a5b 100644 --- a/plugins/bluetooth/componments/bluetoothadapteritem.h +++ b/plugins/bluetooth/componments/bluetoothadapteritem.h @@ -32,9 +32,9 @@ #include #include -#include +#include "org_deepin_daemon_bluetooth.h" -using DBusBluetooth = com::deepin::daemon::Bluetooth; +using DBusBluetooth = org::deepin::daemon::Bluetooth1; DWIDGET_USE_NAMESPACE diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index fdc6d871b..7d684376c 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -121,13 +121,12 @@ BluetoothApplet::BluetoothApplet(QWidget *parent) , m_mainLayout(new QVBoxLayout(this)) , m_contentLayout(new QVBoxLayout(m_contentWidget)) , m_seperator(new HorizontalSeperator(this)) - , m_airPlaneModeInter(new DBusAirplaneMode("com.deepin.daemon.AirplaneMode", "/com/deepin/daemon/AirplaneMode", QDBusConnection::systemBus(), this)) + , m_airPlaneModeInter(new DBusAirplaneMode("org.deepin.daemon.AirplaneMode1", "/org/deepin/daemon/AirplaneMode1", QDBusConnection::systemBus(), this)) , m_airplaneModeEnable(false) { initUi(); initConnect(); - QScroller::grabGesture(m_scroarea, QScroller::LeftMouseButtonGesture); QScrollerProperties propertiesOne = QScroller::scroller(m_scroarea)->scrollerProperties(); QVariant overshootPolicyOne = QVariant::fromValue(QScrollerProperties::OvershootAlwaysOff); diff --git a/plugins/bluetooth/componments/bluetoothapplet.h b/plugins/bluetooth/componments/bluetoothapplet.h index 8603980b1..442013499 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.h +++ b/plugins/bluetooth/componments/bluetoothapplet.h @@ -29,7 +29,7 @@ #include -#include +#include "org_deepin_daemon_airplanemode.h" class QVBoxLayout; class QHBoxLayout; @@ -48,7 +48,7 @@ DWIDGET_END_NAMESPACE DWIDGET_USE_NAMESPACE -using DBusAirplaneMode = com::deepin::daemon::AirplaneMode; +using DBusAirplaneMode = org::deepin::daemon::AirplaneMode1; class SettingLabel : public QWidget { diff --git a/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml b/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml new file mode 100644 index 000000000..b558d3014 --- /dev/null +++ b/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.Bluetooth.xml b/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.Bluetooth.xml new file mode 100644 index 000000000..289f981c5 --- /dev/null +++ b/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.Bluetooth.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/datetime/CMakeLists.txt b/plugins/datetime/CMakeLists.txt index ee7c614c5..a21a92061 100644 --- a/plugins/datetime/CMakeLists.txt +++ b/plugins/datetime/CMakeLists.txt @@ -3,17 +3,24 @@ set(PLUGIN_NAME "datetime") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "./dbusinterface/*.h" + "./dbusinterface/*.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp" "") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) find_package(Qt5Svg REQUIRED) find_package(Qt5DBus REQUIRED) find_package(DtkWidget REQUIRED) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") @@ -21,15 +28,17 @@ add_library(${PLUGIN_NAME} SHARED ${SRCS} datetime.qrc) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} - ../../interfaces) + ../../interfaces + ../../frame/qtdbusextended + ./dbusinterface/ + ./dbusinterface/generation_dbus_interface) + target_link_libraries(${PLUGIN_NAME} PRIVATE ${Qt5DBus_LIBRARIES} ${DtkWidget_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Svg_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} ) diff --git a/plugins/datetime/datetime.json b/plugins/datetime/datetime.json index 8c50d97e4..783887388 100644 --- a/plugins/datetime/datetime.json +++ b/plugins/datetime/datetime.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "com.deepin.daemon.Timedate" + "depends-daemon-dbus-service": "org.deepin.daemon.Timedate1" } diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index 5b33e482e..99716be84 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -42,7 +42,7 @@ DatetimePlugin::DatetimePlugin(QObject *parent) , m_pluginLoaded(false) { QDBusConnection sessionBus = QDBusConnection::sessionBus(); - sessionBus.connect("com.deepin.daemon.Timedate", "/com/deepin/daemon/Timedate", "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(propertiesChanged())); + sessionBus.connect("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(propertiesChanged())); } PluginsItemInterface::PluginSizePolicy DatetimePlugin::pluginSizePolicy() const @@ -268,11 +268,11 @@ void DatetimePlugin::propertiesChanged() QDBusInterface* DatetimePlugin::timedateInterface() { if (!m_interface) { - if (QDBusConnection::sessionBus().interface()->isServiceRegistered("com.deepin.daemon.Timedate")) { - m_interface = new QDBusInterface("com.deepin.daemon.Timedate", "/com/deepin/daemon/Timedate", "com.deepin.daemon.Timedate", QDBusConnection::sessionBus(), this); + if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.deepin.daemon.Timedate1")) { + m_interface = new QDBusInterface("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", "org.deepin.daemon.Timedate1", QDBusConnection::sessionBus(), this); } else { - const QString path = QString("/com/deepin/daemon/Accounts/User%1").arg(QString::number(getuid())); - QDBusInterface * systemInterface = new QDBusInterface("com.deepin.daemon.Accounts", path, "com.deepin.daemon.Accounts.User", + const QString path = QString("/org/deepin/daemon/Accounts/User%1").arg(QString::number(getuid())); + QDBusInterface * systemInterface = new QDBusInterface("org.deepin.daemon.Accounts1", path, "org.deepin.daemon.Accounts.User", QDBusConnection::systemBus(), this); return systemInterface; } diff --git a/plugins/datetime/datetimewidget.cpp b/plugins/datetime/datetimewidget.cpp index 8923bdd54..8d34940ce 100644 --- a/plugins/datetime/datetimewidget.cpp +++ b/plugins/datetime/datetimewidget.cpp @@ -40,7 +40,7 @@ DatetimeWidget::DatetimeWidget(QWidget *parent) : QWidget(parent) , m_24HourFormat(false) , m_timeOffset(false) - , m_timedateInter(new Timedate("com.deepin.daemon.Timedate", "/com/deepin/daemon/Timedate", QDBusConnection::sessionBus(), this)) + , m_timedateInter(new Timedate("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", QDBusConnection::sessionBus(), this)) , m_shortDateFormat("yyyy-MM-dd") , m_shortTimeFormat("hh:mm") { diff --git a/plugins/datetime/datetimewidget.h b/plugins/datetime/datetimewidget.h index 42cba4942..21a2e60bf 100644 --- a/plugins/datetime/datetimewidget.h +++ b/plugins/datetime/datetimewidget.h @@ -22,11 +22,11 @@ #ifndef DATETIMEWIDGET_H #define DATETIMEWIDGET_H -#include +#include "org_deepin_daemon_timedate.h" #include -using Timedate = com::deepin::daemon::Timedate; +using Timedate = org::deepin::daemon::Timedate1; class DatetimeWidget : public QWidget { diff --git a/plugins/datetime/dbusinterface/types/zoneinfo.cpp b/plugins/datetime/dbusinterface/types/zoneinfo.cpp new file mode 100644 index 000000000..95b46df3a --- /dev/null +++ b/plugins/datetime/dbusinterface/types/zoneinfo.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "zoneinfo.h" + +ZoneInfo::ZoneInfo() +{ + +} + +bool ZoneInfo::operator ==(const ZoneInfo &what) const +{ + // TODO: 这里只判断这两个成员应该就可以了 + return m_zoneName == what.m_zoneName && + m_utcOffset == what.m_utcOffset; +} + +QDebug operator<<(QDebug argument, const ZoneInfo & info) +{ + argument << info.m_zoneName << ',' << info.m_zoneCity << ',' << info.m_utcOffset << ','; + argument << info.i2 << ',' << info.i3 << ',' << info.i4 << endl; + + return argument; +} + +QDBusArgument &operator<<(QDBusArgument & argument, const ZoneInfo & info) +{ + argument.beginStructure(); + argument << info.m_zoneName << info.m_zoneCity << info.m_utcOffset; + argument.beginStructure(); + argument << info.i2 << info.i3 << info.i4; + argument.endStructure(); + argument.endStructure(); + + return argument; +} + +QDataStream &operator<<(QDataStream & argument, const ZoneInfo & info) +{ + argument << info.m_zoneName << info.m_zoneCity << info.m_utcOffset; + argument << info.i2 << info.i3 << info.i4; + + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument & argument, ZoneInfo & info) +{ + argument.beginStructure(); + argument >> info.m_zoneName >> info.m_zoneCity >> info.m_utcOffset; + argument.beginStructure(); + argument >> info.i2 >> info.i3 >> info.i4; + argument.endStructure(); + argument.endStructure(); + + return argument; +} + +const QDataStream &operator>>(QDataStream & argument, ZoneInfo & info) +{ + argument >> info.m_zoneName >> info.m_zoneCity >> info.m_utcOffset; + argument >> info.i2 >> info.i3 >> info.i4; + + return argument; +} + +void registerZoneInfoMetaType() +{ + qRegisterMetaType("ZoneInfo"); + qDBusRegisterMetaType(); +} diff --git a/plugins/datetime/dbusinterface/types/zoneinfo.h b/plugins/datetime/dbusinterface/types/zoneinfo.h new file mode 100644 index 000000000..ca7249e36 --- /dev/null +++ b/plugins/datetime/dbusinterface/types/zoneinfo.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef ZONEINFO_H +#define ZONEINFO_H + +#include +#include +#include +#include +#include + +class ZoneInfo +{ +public: + ZoneInfo(); + + friend QDebug operator<<(QDebug argument, const ZoneInfo &info); + friend QDBusArgument &operator<<(QDBusArgument &argument, const ZoneInfo &info); + friend QDataStream &operator<<(QDataStream &argument, const ZoneInfo &info); + friend const QDBusArgument &operator>>(const QDBusArgument &argument, ZoneInfo &info); + friend const QDataStream &operator>>(QDataStream &argument, ZoneInfo &info); + + bool operator==(const ZoneInfo &what) const; + +public: + inline QString getZoneName() const {return m_zoneName;} + inline QString getZoneCity() const {return m_zoneCity;} + inline int getUTCOffset() const {return m_utcOffset;} + +private: + QString m_zoneName; + QString m_zoneCity; + int m_utcOffset; + qint64 i2; + qint64 i3; + int i4; +}; + +Q_DECLARE_METATYPE(ZoneInfo) + +void registerZoneInfoMetaType(); + +#endif // ZONEINFO_H diff --git a/plugins/datetime/dbusinterface/xml/org.deepin.daemon.Timedate.xml b/plugins/datetime/dbusinterface/xml/org.deepin.daemon.Timedate.xml new file mode 100644 index 000000000..935a74c77 --- /dev/null +++ b/plugins/datetime/dbusinterface/xml/org.deepin.daemon.Timedate.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/keyboard-layout/CMakeLists.txt b/plugins/keyboard-layout/CMakeLists.txt index e25ac6a12..76ed7434f 100644 --- a/plugins/keyboard-layout/CMakeLists.txt +++ b/plugins/keyboard-layout/CMakeLists.txt @@ -3,29 +3,38 @@ set(PLUGIN_NAME "keyboard-layout") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp" + "./dbusinterface/types/*.h" + "./dbusinterface/types/*.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) find_package(Qt5Svg REQUIRED) find_package(DtkWidget REQUIRED) find_package(Qt5DBus REQUIRED) -find_package(DFrameworkdbus REQUIRED) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS}) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} - ../../interfaces) + ../../interfaces + ./dbusinterface + ./dbusinterface/generation_dbus_interface + ../../frame/qtdbusextended) + target_link_libraries(${PLUGIN_NAME} PRIVATE ${DtkWidget_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Svg_LIBRARIES} diff --git a/plugins/keyboard-layout/dbusadaptors.h b/plugins/keyboard-layout/dbusadaptors.h index 355165153..99d345cec 100644 --- a/plugins/keyboard-layout/dbusadaptors.h +++ b/plugins/keyboard-layout/dbusadaptors.h @@ -22,9 +22,9 @@ #include #include -#include +#include "org_deepin_daemon_inputdevice_keyboard.h" -using Keyboard = com::deepin::daemon::inputdevice::Keyboard; +using Keyboard = org::deepin::daemon::inputdevice::Keyboard1; class QGSettings; class DBusAdaptors : public QDBusAbstractAdaptor diff --git a/plugins/keyboard-layout/dbusinterface/types/keyboardlayoutlist.cpp b/plugins/keyboard-layout/dbusinterface/types/keyboardlayoutlist.cpp new file mode 100644 index 000000000..abb2e010c --- /dev/null +++ b/plugins/keyboard-layout/dbusinterface/types/keyboardlayoutlist.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "keyboardlayoutlist.h" + +void registerKeyboardLayoutListMetaType() +{ + qRegisterMetaType("KeyboardLayoutList"); + qDBusRegisterMetaType(); +} diff --git a/plugins/keyboard-layout/dbusinterface/types/keyboardlayoutlist.h b/plugins/keyboard-layout/dbusinterface/types/keyboardlayoutlist.h new file mode 100644 index 000000000..046f363fc --- /dev/null +++ b/plugins/keyboard-layout/dbusinterface/types/keyboardlayoutlist.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef KEYBOARDLAYOUTLIST_H +#define KEYBOARDLAYOUTLIST_H + +#include +#include +#include +#include + +typedef QMap KeyboardLayoutList; + +void registerKeyboardLayoutListMetaType(); + +#endif // KEYBOARDLAYOUTLIST_H diff --git a/plugins/keyboard-layout/dbusinterface/xml/org.deepin.daemon.InputDevice.Keyboard.xml b/plugins/keyboard-layout/dbusinterface/xml/org.deepin.daemon.InputDevice.Keyboard.xml new file mode 100644 index 000000000..d37690b89 --- /dev/null +++ b/plugins/keyboard-layout/dbusinterface/xml/org.deepin.daemon.InputDevice.Keyboard.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/onboard/CMakeLists.txt b/plugins/onboard/CMakeLists.txt index 46b95e2c7..aa3d2eff3 100644 --- a/plugins/onboard/CMakeLists.txt +++ b/plugins/onboard/CMakeLists.txt @@ -3,8 +3,17 @@ set(PLUGIN_NAME "onboard") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) @@ -15,15 +24,17 @@ find_package(DtkWidget REQUIRED) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} onboard.qrc) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../) + target_include_directories(${PLUGIN_NAME} PUBLIC ${Qt5DBus_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} - ../../interfaces) + ../../interfaces + ../../frame/qtdbusextended + ./dbusinterface/generation_dbus_interface) + target_link_libraries(${PLUGIN_NAME} PRIVATE ${Qt5Widgets_LIBRARIES} ${Qt5DBus_LIBRARIES} ${DtkGui_LIBRARIES} ${DtkWidget_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ) install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) diff --git a/plugins/onboard/dbusinterface/types/arealist.cpp b/plugins/onboard/dbusinterface/types/arealist.cpp new file mode 100644 index 000000000..e4055ada2 --- /dev/null +++ b/plugins/onboard/dbusinterface/types/arealist.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * zhaolong + * + * 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 . + */ + +#include "arealist.h" + +bool MonitRect::operator ==(const MonitRect &rect) +{ + return x1 == rect.x1 && y1 == rect.y1 && x2 == rect.x2 && y2 == rect.y2; +} + +QDBusArgument &operator<<(QDBusArgument &arg, const MonitRect &rect) +{ + arg.beginStructure(); + arg << rect.x1 << rect.y1 << rect.x2 << rect.y2; + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, MonitRect &rect) +{ + arg.beginStructure(); + arg >> rect.x1 >> rect.y1 >> rect.x2 >> rect.y2; + arg.endStructure(); + + return arg; +} + +void registerAreaListMetaType() +{ + qRegisterMetaType("MonitRect"); + qDBusRegisterMetaType(); + + qRegisterMetaType("AreaList"); + qDBusRegisterMetaType(); +} diff --git a/plugins/onboard/dbusinterface/types/arealist.h b/plugins/onboard/dbusinterface/types/arealist.h new file mode 100644 index 000000000..be61f028c --- /dev/null +++ b/plugins/onboard/dbusinterface/types/arealist.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * zhaolong + * + * 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 . + */ + +#ifndef AREALIST_H +#define AREALIST_H + +#include +#include +#include + +struct MonitRect { + int x1; + int y1; + int x2; + int y2; + + bool operator ==(const MonitRect& rect); +}; + +typedef QList AreaList; + +Q_DECLARE_METATYPE(MonitRect) +Q_DECLARE_METATYPE(AreaList) + +QDBusArgument &operator<<(QDBusArgument &arg, const MonitRect &rect); +const QDBusArgument &operator>>(const QDBusArgument &arg, MonitRect &rect); + +void registerAreaListMetaType(); + +#endif // AREALIST_H diff --git a/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.Entry.xml b/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.Entry.xml new file mode 100644 index 000000000..89b665e41 --- /dev/null +++ b/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.Entry.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.xml b/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.xml new file mode 100644 index 000000000..08573ed35 --- /dev/null +++ b/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.xml @@ -0,0 +1,3 @@ + + + diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index 31777e6d8..d3c522b67 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -21,32 +21,20 @@ #include "onboardplugin.h" #include "../widgets/tipswidget.h" -#ifdef USE_AM -#include "dockinterface.h" -#include "entryinterface.h" -#else -#include -#include -#endif + +#include "org_deepin_dde_daemon_dock.h" +#include "org_deepin_dde_daemon_dock_entry.h" #include #include #define PLUGIN_STATE_KEY "enable" -#ifdef USE_AM -using DBusDock = org::deepin::dde::daemon::DdeDock; -using DockEntryInter = org::deepin::dde::daemon::dock::DockEntry; +using DBusDock = org::deepin::dde::daemon::Dock1; +using DockEntryInter = org::deepin::dde::daemon::dock1::Entry; static const QString serviceName = QString("org.deepin.dde.daemon.Dock1"); static const QString servicePath = QString("/org/deepin/dde/daemon/Dock1"); -#else -using DBusDock = com::deepin::dde::daemon::Dock; -using DockEntryInter = com::deepin::dde::daemon::dock::Entry; - -static const QString serviceName = QString("com.deepin.dde.daemon.Dock"); -static const QString servicePath = QString("/com/deepin/dde/daemon/Dock"); -#endif using namespace Dock; OnboardPlugin::OnboardPlugin(QObject *parent) diff --git a/plugins/power/CMakeLists.txt b/plugins/power/CMakeLists.txt index 78dafea75..1cd9e364f 100644 --- a/plugins/power/CMakeLists.txt +++ b/plugins/power/CMakeLists.txt @@ -3,8 +3,17 @@ set(PLUGIN_NAME "power") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) @@ -12,7 +21,6 @@ find_package(Qt5Svg REQUIRED) find_package(Qt5DBus REQUIRED) find_package(DtkWidget REQUIRED) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") @@ -20,15 +28,16 @@ add_library(${PLUGIN_NAME} SHARED ${SRCS} power.qrc) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../quick-trays) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${Qt5DBus_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} - ../../interfaces) + ../../interfaces + ../../frame/qtdbusextended + ./dbusinterface/generation_dbus_interface) + target_link_libraries(${PLUGIN_NAME} PRIVATE ${DtkWidget_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Svg_LIBRARIES} ${Qt5DBus_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} ) diff --git a/plugins/power/dbus/dbusaccount.cpp b/plugins/power/dbus/dbusaccount.cpp index 0646685b9..bf0b3173e 100644 --- a/plugins/power/dbus/dbusaccount.cpp +++ b/plugins/power/dbus/dbusaccount.cpp @@ -21,7 +21,7 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount com.deepin.daemon.Accounts.xml + * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount org.deepin.daemon.Accounts.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -46,4 +46,3 @@ DBusAccount::~DBusAccount() { QDBusConnection::systemBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage))); } - diff --git a/plugins/power/dbus/dbusaccount.h b/plugins/power/dbus/dbusaccount.h index 64ac04af6..a722bd55d 100644 --- a/plugins/power/dbus/dbusaccount.h +++ b/plugins/power/dbus/dbusaccount.h @@ -21,7 +21,7 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount com.deepin.daemon.Accounts.xml + * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount org.deepin.daemon.Accounts.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -42,7 +42,7 @@ #include /* - * Proxy class for interface com.deepin.daemon.Accounts + * Proxy class for interface org.deepin.daemon.Accounts1 */ class DBusAccount: public QDBusAbstractInterface { @@ -55,7 +55,7 @@ class DBusAccount: public QDBusAbstractInterface return; } QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != "com.deepin.daemon.Accounts") { + if (interfaceName != "org.deepin.daemon.Accounts1") { return; } QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); @@ -72,11 +72,11 @@ class DBusAccount: public QDBusAbstractInterface } public: static inline const char *staticService() - { return "com.deepin.daemon.Accounts"; } + { return "org.deepin.daemon.Accounts1"; } static inline const char *staticInterfacePath() - { return "/com/deepin/daemon/Accounts"; } + { return "/org/deepin/daemon/Accounts1"; } static inline const char *staticInterfaceName() - { return "com.deepin.daemon.Accounts"; } + { return "org.deepin.daemon.Accounts1"; } public: explicit DBusAccount(QObject *parent = 0); diff --git a/plugins/power/dbus/dbuspower.cpp b/plugins/power/dbus/dbuspower.cpp index 29cdedac3..1c952860c 100644 --- a/plugins/power/dbus/dbuspower.cpp +++ b/plugins/power/dbus/dbuspower.cpp @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusPower -p dbuspower com.deepin.daemon.Power.xml + * Command line was: qdbusxml2cpp -c DBusPower -p dbuspower org.deepin.daemon.Power.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -16,7 +16,7 @@ */ DBusPower::DBusPower(QObject *parent) - : QDBusAbstractInterface("com.deepin.daemon.Power", "/com/deepin/daemon/Power", staticInterfaceName(), QDBusConnection::sessionBus(), parent) + : QDBusAbstractInterface("org.deepin.daemon.Power1", "/org/deepin/daemon/Power1", staticInterfaceName(), QDBusConnection::sessionBus(), parent) { qRegisterMetaType("BatteryStateMap"); qDBusRegisterMetaType(); diff --git a/plugins/power/dbus/dbuspower.h b/plugins/power/dbus/dbuspower.h index 47225849b..646c857c7 100644 --- a/plugins/power/dbus/dbuspower.h +++ b/plugins/power/dbus/dbuspower.h @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusPower -p dbuspower com.deepin.daemon.Power.xml + * Command line was: qdbusxml2cpp -c DBusPower -p dbuspower org.deepin.daemon.Power.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -26,7 +26,7 @@ Q_DECLARE_METATYPE(BatteryPercentageMap) Q_DECLARE_METATYPE(BatteryStateMap) /* - * Proxy class for interface com.deepin.daemon.Power + * Proxy class for interface org.deepin.daemon.Power */ class DBusPower: public QDBusAbstractInterface { @@ -38,7 +38,7 @@ class DBusPower: public QDBusAbstractInterface if (3 != arguments.count()) return; QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName !="com.deepin.daemon.Power") + if (interfaceName !="org.deepin.daemon.Power1") return; QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); foreach(const QString &prop, changedProps.keys()) { @@ -53,7 +53,7 @@ class DBusPower: public QDBusAbstractInterface } public: static inline const char *staticInterfaceName() - { return "com.deepin.daemon.Power"; } + { return "org.deepin.daemon.Power1"; } public: explicit DBusPower(QObject *parent = 0); @@ -80,10 +80,10 @@ void BatteryPercentageChanged(); void BatteryStateChanged(); }; -namespace com { +namespace org { namespace deepin { namespace daemon { - typedef ::DBusPower Power; + typedef ::DBusPower Power1; } } } diff --git a/plugins/power/dbusinterface/xml/org.deepin.system.SystemPower.xml b/plugins/power/dbusinterface/xml/org.deepin.system.SystemPower.xml new file mode 100644 index 000000000..632a4ef0a --- /dev/null +++ b/plugins/power/dbusinterface/xml/org.deepin.system.SystemPower.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/power/power.json b/plugins/power/power.json index 388147fa0..bb030c54e 100644 --- a/plugins/power/power.json +++ b/plugins/power/power.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "com.deepin.daemon.Power" + "depends-daemon-dbus-service": "org.deepin.daemon.Power1" } diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index 14d138709..b5aea7bb4 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -236,7 +236,7 @@ void PowerPlugin::loadPlugin() m_powerInter = new DBusPower(this); - m_systemPowerInter = new SystemPowerInter("com.deepin.system.Power", "/com/deepin/system/Power", QDBusConnection::systemBus(), this); + m_systemPowerInter = new SystemPowerInter("org.deepin.system.Power1", "/org/deepin/system/Power1", QDBusConnection::systemBus(), this); m_systemPowerInter->setSync(true); connect(GSettingsByApp(), &QGSettings::changed, this, &PowerPlugin::onGSettingsChanged); diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index cab3ece65..02911f7ff 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -26,11 +26,11 @@ #include "powerstatuswidget.h" #include "dbus/dbuspower.h" -#include +#include "org_deepin_system_systempower.h" #include -using SystemPowerInter = com::deepin::system::Power; +using SystemPowerInter = org::deepin::system::Power1; namespace Dock { class TipsWidget; } diff --git a/plugins/shutdown/dbus/dbusaccount.cpp b/plugins/shutdown/dbus/dbusaccount.cpp index 0646685b9..523f6231b 100644 --- a/plugins/shutdown/dbus/dbusaccount.cpp +++ b/plugins/shutdown/dbus/dbusaccount.cpp @@ -21,7 +21,7 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount com.deepin.daemon.Accounts.xml + * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount org.deepin.daemon.Accounts.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * diff --git a/plugins/shutdown/dbus/dbusaccount.h b/plugins/shutdown/dbus/dbusaccount.h index 64ac04af6..6eaa00ea2 100644 --- a/plugins/shutdown/dbus/dbusaccount.h +++ b/plugins/shutdown/dbus/dbusaccount.h @@ -21,7 +21,7 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount com.deepin.daemon.Accounts.xml + * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount org.deepin.daemon.Accounts1.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -42,7 +42,7 @@ #include /* - * Proxy class for interface com.deepin.daemon.Accounts + * Proxy class for interface org.deepin.daemon.Accounts */ class DBusAccount: public QDBusAbstractInterface { @@ -55,7 +55,7 @@ class DBusAccount: public QDBusAbstractInterface return; } QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != "com.deepin.daemon.Accounts") { + if (interfaceName != "org.deepin.daemon.Accounts1") { return; } QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); @@ -72,11 +72,11 @@ class DBusAccount: public QDBusAbstractInterface } public: static inline const char *staticService() - { return "com.deepin.daemon.Accounts"; } + { return "org.deepin.daemon.Accounts1"; } static inline const char *staticInterfacePath() - { return "/com/deepin/daemon/Accounts"; } + { return "/org/deepin/daemon/Accounts1"; } static inline const char *staticInterfaceName() - { return "com.deepin.daemon.Accounts"; } + { return "org.deepin.daemon.Accounts1"; } public: explicit DBusAccount(QObject *parent = 0); diff --git a/plugins/shutdown/dbus/dbuspowermanager.cpp b/plugins/shutdown/dbus/dbuspowermanager.cpp index 2cc5e4f79..5617c8812 100644 --- a/plugins/shutdown/dbus/dbuspowermanager.cpp +++ b/plugins/shutdown/dbus/dbuspowermanager.cpp @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c PowerManager -p com_deepin_daemon_powermanager com.deepin.daemon.PowerManager.xml + * Command line was: qdbusxml2cpp -c PowerManager -p com_deepin_daemon_powermanager org.deepin.daemon.PowerManager.xml * * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * diff --git a/plugins/shutdown/dbus/dbuspowermanager.h b/plugins/shutdown/dbus/dbuspowermanager.h index a9c91e723..f70a85f19 100644 --- a/plugins/shutdown/dbus/dbuspowermanager.h +++ b/plugins/shutdown/dbus/dbuspowermanager.h @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c PowerManager -p com_deepin_daemon_powermanager com.deepin.daemon.PowerManager.xml + * Command line was: qdbusxml2cpp -c PowerManager -p com_deepin_daemon_powermanager org.deepin.daemon.PowerManager.xml * * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * @@ -21,14 +21,14 @@ #include /* - * Proxy class for interface com.deepin.daemon.PowerManager + * Proxy class for interface org.deepin.daemon.PowerManager1 */ class DBusPowerManager: public QDBusAbstractInterface { Q_OBJECT public: static inline const char *staticInterfaceName() - { return "com.deepin.daemon.PowerManager"; } + { return "org.deepin.daemon.PowerManager1"; } public: DBusPowerManager(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index 81dec6047..a18263687 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -45,7 +45,7 @@ ShutdownPlugin::ShutdownPlugin(QObject *parent) , m_pluginLoaded(false) , m_shutdownWidget(nullptr) , m_tipsLabel(new TipsWidget) - , m_powerManagerInter(new DBusPowerManager("com.deepin.daemon.PowerManager", "/com/deepin/daemon/PowerManager", QDBusConnection::systemBus(), this)) + , m_powerManagerInter(new DBusPowerManager("org.deepin.daemon.PowerManager1", "/org/deepin/daemon/PowerManager1", QDBusConnection::systemBus(), this)) , m_gsettings(Utils::ModuleSettingsPtr("shutdown", QByteArray(), this)) , m_sessionShellGsettings(Utils::SettingsPtr("com.deepin.dde.session-shell", "/com/deepin/dde/session-shell/", this)) { diff --git a/plugins/sound/CMakeLists.txt b/plugins/sound/CMakeLists.txt index 20f3b3dfc..f101dc90e 100644 --- a/plugins/sound/CMakeLists.txt +++ b/plugins/sound/CMakeLists.txt @@ -3,9 +3,21 @@ set(PLUGIN_NAME "sound") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" - "../../frame/util/horizontalseperator.h" "../../frame/util/horizontalseperator.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "../../frame/util/imageutil.h" + "../../frame/util/imageutil.cpp" + "../../frame/util/horizontalseperator.h" + "../../frame/util/horizontalseperator.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) @@ -14,24 +26,24 @@ find_package(Qt5DBus REQUIRED) find_package(DtkWidget REQUIRED) pkg_check_modules(XCB_EWMH REQUIRED xcb-ewmh x11 xcursor) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} resources/sound.qrc) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../system-trays) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} + ./dbusinterface + ./dbusinterface/generation_dbus_interface ../../interfaces ../../frame ../../frame/accessible + ../../frame/qtdbusextended ) target_link_libraries(${PLUGIN_NAME} PRIVATE ${DtkWidget_LIBRARIES} ${XCB_EWMH_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} ${Qt5DBus_LIBRARIES} ${Qt5Widgets_LIBRARIES} diff --git a/plugins/sound/dbusinterface/types/audioport.cpp b/plugins/sound/dbusinterface/types/audioport.cpp new file mode 100644 index 000000000..6ea641338 --- /dev/null +++ b/plugins/sound/dbusinterface/types/audioport.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include + +#include "audioport.h" + +void registerAudioPortMetaType() +{ + qRegisterMetaType("AudioPort"); + qDBusRegisterMetaType(); +} diff --git a/plugins/sound/dbusinterface/types/audioport.h b/plugins/sound/dbusinterface/types/audioport.h new file mode 100644 index 000000000..5b3800759 --- /dev/null +++ b/plugins/sound/dbusinterface/types/audioport.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2016 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef AUDIOPORT_H +#define AUDIOPORT_H + +#include +#include +#include +#include + +class AudioPort +{ +public: + QString name; + QString description; + uchar availability; // 0 for Unknown, 1 for Not Available, 2 for Available. + + friend QDebug operator<<(QDebug argument, const AudioPort &port) { + argument << port.description; + + return argument; + } + + friend QDBusArgument &operator<<(QDBusArgument &argument, const AudioPort &port) { + argument.beginStructure(); + argument << port.name << port.description << port.availability; + argument.endStructure(); + + return argument; + } + + friend const QDBusArgument &operator>>(const QDBusArgument &argument, AudioPort &port) { + argument.beginStructure(); + argument >> port.name >> port.description >> port.availability; + argument.endStructure(); + + return argument; + } + + bool operator==(const AudioPort what) const { + return what.name == name && what.description == description && what.availability == availability; + } + + bool operator!=(const AudioPort what) const { + return what.name != name || what.description != description || what.availability != availability; + } +}; + +Q_DECLARE_METATYPE(AudioPort) + +void registerAudioPortMetaType(); + +#endif // AUDIOPORT_H diff --git a/plugins/sound/dbusinterface/types/audioportlist.cpp b/plugins/sound/dbusinterface/types/audioportlist.cpp new file mode 100644 index 000000000..c6d4ad991 --- /dev/null +++ b/plugins/sound/dbusinterface/types/audioportlist.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "audioportlist.h" + +void registerAudioPortListMetaType() +{ + qRegisterMetaType("AudioPortList"); + qDBusRegisterMetaType(); +} diff --git a/plugins/sound/dbusinterface/types/audioportlist.h b/plugins/sound/dbusinterface/types/audioportlist.h new file mode 100644 index 000000000..c48d47d31 --- /dev/null +++ b/plugins/sound/dbusinterface/types/audioportlist.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2016 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#ifndef AUDIOPORTLIST_H +#define AUDIOPORTLIST_H + +#include +#include + +#include "audioport.h" + +typedef QList AudioPortList; + +Q_DECLARE_METATYPE(AudioPortList) + +void registerAudioPortListMetaType(); + +#endif // AUDIOPORTLIST_H diff --git a/plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml b/plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml new file mode 100644 index 000000000..347056803 --- /dev/null +++ b/plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + \n + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.xml b/plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.xml new file mode 100644 index 000000000..056518152 --- /dev/null +++ b/plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/sound/sound.json b/plugins/sound/sound.json index 2d486b2fa..181aef926 100644 --- a/plugins/sound/sound.json +++ b/plugins/sound/sound.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "com.deepin.daemon.Audio" + "depends-daemon-dbus-service": "org.deepin.daemon.Audio1" } diff --git a/plugins/sound/soundapplet.cpp b/plugins/sound/soundapplet.cpp index ad22cbd85..c9e78b94e 100644 --- a/plugins/sound/soundapplet.cpp +++ b/plugins/sound/soundapplet.cpp @@ -120,7 +120,7 @@ SoundApplet::SoundApplet(QWidget *parent) , m_deviceLabel(new QLabel(this)) , m_seperator(new HorizontalSeperator(this)) , m_secondSeperator(new HorizontalSeperator(this)) - , m_audioInter(new DBusAudio("com.deepin.daemon.Audio", "/com/deepin/daemon/Audio", QDBusConnection::sessionBus(), this)) + , m_audioInter(new DBusAudio("org.deepin.daemon.Audio1", "/org/deepin/daemon/Audio1", QDBusConnection::sessionBus(), this)) , m_defSinkInter(nullptr) , m_listView(new DListView(this)) , m_model(new QStandardItemModel(m_listView)) @@ -245,7 +245,7 @@ void SoundApplet::initUi() }); connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &SoundApplet::refreshIcon); connect(qApp, &DApplication::iconThemeChanged, this, &SoundApplet::refreshIcon); - QDBusConnection::sessionBus().connect("com.deepin.daemon.Audio", "/com/deepin/daemon/Audio", "org.freedesktop.DBus.Properties" + QDBusConnection::sessionBus().connect("org.deepin.daemon.Audio1", "/org/deepin/daemon/Audio1", "org.freedesktop.DBus.Properties" ,"PropertiesChanged", "sa{sv}as", this, SLOT(haldleDbusSignal(QDBusMessage))); QMetaObject::invokeMethod(this, "onDefaultSinkChanged", Qt::QueuedConnection); @@ -281,7 +281,7 @@ void SoundApplet::onDefaultSinkChanged() } const QDBusObjectPath defSinkPath = m_audioInter->defaultSink(); - m_defSinkInter = new DBusSink("com.deepin.daemon.Audio", defSinkPath.path(), QDBusConnection::sessionBus(), this); + m_defSinkInter = new DBusSink("org.deepin.daemon.Audio1", defSinkPath.path(), QDBusConnection::sessionBus(), this); connect(m_defSinkInter, &DBusSink::VolumeChanged, this, &SoundApplet::onVolumeChanged); connect(m_defSinkInter, &DBusSink::MuteChanged, this, [ = ] { diff --git a/plugins/sound/soundapplet.h b/plugins/sound/soundapplet.h index a82139e00..95aaa8164 100644 --- a/plugins/sound/soundapplet.h +++ b/plugins/sound/soundapplet.h @@ -24,8 +24,8 @@ #include "componments/volumeslider.h" -#include -#include +#include "org_deepin_daemon_audio.h" +#include "org_deepin_daemon_audio_sink.h" #include #include @@ -38,8 +38,8 @@ DWIDGET_USE_NAMESPACE -using DBusAudio = com::deepin::daemon::Audio; -using DBusSink = com::deepin::daemon::audio::Sink; +using DBusAudio = org::deepin::daemon::Audio1; +using DBusSink = org::deepin::daemon::audio1::Sink; class HorizontalSeperator; class QGSettings; diff --git a/plugins/sound/sounditem.h b/plugins/sound/sounditem.h index 701f9ac07..2dd144367 100644 --- a/plugins/sound/sounditem.h +++ b/plugins/sound/sounditem.h @@ -23,14 +23,14 @@ #define SOUNDITEM_H #include "soundapplet.h" -#include +#include "org_deepin_daemon_audio_sink.h" #include #include #define SOUND_KEY "sound-item-key" -using DBusSink = com::deepin::daemon::audio::Sink; +using DBusSink = org::deepin::daemon::audio1::Sink; namespace Dock { class TipsWidget; diff --git a/plugins/trash/CMakeLists.txt b/plugins/trash/CMakeLists.txt index 4e9277316..a08f4c468 100644 --- a/plugins/trash/CMakeLists.txt +++ b/plugins/trash/CMakeLists.txt @@ -3,8 +3,17 @@ set(PLUGIN_NAME "trash") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp") +file(GLOB SRCS "*.h" + "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) @@ -12,20 +21,18 @@ find_package(Qt5Svg REQUIRED) find_package(Qt5DBus REQUIRED) find_package(DtkWidget REQUIRED) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) - add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} resource.qrc) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} - ../../interfaces) + ../../interfaces + ./dbusinterface/generation_dbus_interface + ../../frame/qtdbusextended) target_link_libraries(${PLUGIN_NAME} PRIVATE ${DtkWidget_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5DBus_LIBRARIES} ${Qt5Svg_LIBRARIES} diff --git a/plugins/trash/dbusinterface/xml/org.freedesktop.FileManager.xml b/plugins/trash/dbusinterface/xml/org.freedesktop.FileManager.xml new file mode 100644 index 000000000..fb67a6c59 --- /dev/null +++ b/plugins/trash/dbusinterface/xml/org.freedesktop.FileManager.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/plugins/trash/trashwidget.cpp b/plugins/trash/trashwidget.cpp index 04731016f..6e0e44ae3 100644 --- a/plugins/trash/trashwidget.cpp +++ b/plugins/trash/trashwidget.cpp @@ -239,7 +239,7 @@ void TrashWidget::setDragging(bool state) void TrashWidget::removeApp(const QString &appKey) { - const QString cmd("dbus-send --print-reply --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.UninstallApp string:\"" + appKey + "\""); + const QString cmd("dbus-send --print-reply --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.UninstallApp string:\"" + appKey + "\""); QProcess *proc = new QProcess; proc->start(cmd); diff --git a/plugins/trash/trashwidget.h b/plugins/trash/trashwidget.h index 87a7c236f..b0be99c40 100644 --- a/plugins/trash/trashwidget.h +++ b/plugins/trash/trashwidget.h @@ -29,12 +29,13 @@ #include "popupcontrolwidget.h" +#include "org_freedesktop_filemanager.h" + #include #include #include #include -#include using DBusFileManager1 = org::freedesktop::FileManager1; class TrashWidget : public QWidget diff --git a/plugins/tray/CMakeLists.txt b/plugins/tray/CMakeLists.txt index aee5dbd38..e9ba79466 100644 --- a/plugins/tray/CMakeLists.txt +++ b/plugins/tray/CMakeLists.txt @@ -3,21 +3,46 @@ set(PLUGIN_NAME "tray") project(${PLUGIN_NAME}) +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" - "../../frame/util/themeappicon.h" "../../frame/util/themeappicon.cpp" - "../../frame/util/dockpopupwindow.h" "../../frame/util/dockpopupwindow.cpp" - "../../frame/util/abstractpluginscontroller.h" "../../frame/util/abstractpluginscontroller.cpp" - "../../frame/util/pluginloader.h" "../../frame/util/pluginloader.cpp" - "../../frame/dbus/sni/*.h" "../../frame/dbus/sni/*.cpp" - "../../frame/dbus/dbusmenu.h" "../../frame/dbus/dbusmenu.cpp" - "../../frame/dbus/dbusmenumanager.h" "../../frame/dbus/dbusmenumanager.cpp" - "../../frame/dbus/dockinterface.h" "../../frame/dbus/dockinterface.cpp" - "../../widgets/*.h" "../../widgets/*.cpp" - "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" - "../../frame/util/menudialog.h" "../../frame/util/menudialog.cpp" - "../../frame/util/touchsignalmanager.h" "../../frame/util/touchsignalmanager.cpp" - "../../frame/controller/proxyplugincontroller.h" "../../frame/controller/proxyplugincontroller.cpp") +file(GLOB_RECURSE SRCS "*.h" + "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "../../frame/util/themeappicon.h" + "../../frame/util/themeappicon.cpp" + "../../frame/util/dockpopupwindow.h" + "../../frame/util/dockpopupwindow.cpp" + "../../frame/util/abstractpluginscontroller.h" + "../../frame/util/abstractpluginscontroller.cpp" + "../../frame/util/pluginloader.h" + "../../frame/util/pluginloader.cpp" + "../../frame/dbus/sni/*.h" + "../../frame/dbus/sni/*.cpp" + "../../frame/dbus/dbusmenu.h" + "../../frame/dbus/dbusmenu.cpp" + "../../frame/dbus/dbusmenumanager.h" + "../../frame/dbus/dbusmenumanager.cpp" + "../../frame/dbus/dockinterface.h" + "../../frame/dbus/dockinterface.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "../../frame/util/imageutil.h" + "../../frame/util/imageutil.cpp" + "../../frame/util/menudialog.h" + "../../frame/util/menudialog.cpp" + "../../frame/util/touchsignalmanager.h" + "../../frame/util/touchsignalmanager.cpp" + "../../frame/controller/proxyplugincontroller.h" + "../../frame/controller/proxyplugincontroller.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp" + "./dbusinterface/generation_dbus_interface/*.h" + "./dbusinterface/generation_dbus_interface/*.cpp" + "./dbusinterface/types/*.h" + "./dbusinterface/types/*.cpp" +) find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) @@ -29,7 +54,6 @@ find_package(DtkWidget REQUIRED) find_package(dbusmenu-qt5 REQUIRED) pkg_check_modules(XCB_LIBS REQUIRED xcb-ewmh xcb xcb-image xcb-composite xtst x11 xext xcb-icccm dbusmenu-qt5 xcursor) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") @@ -39,11 +63,14 @@ target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${Qt5DBus_INCLUDE_DIRS} ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ${XCB_LIBS_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} ${dbusmenu-qt5_INCLUDE_DIRS} ../../interfaces - ../../frame ) + ../../frame + ../../frame/qtdbusextended + ./dbusinterface + ./dbusinterface/generation_dbus_interface) + target_link_libraries(${PLUGIN_NAME} PRIVATE ${DtkWidget_LIBRARIES} ${Qt5Widgets_LIBRARIES} @@ -52,7 +79,6 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE ${Qt5Svg_LIBRARIES} ${Qt5Concurrent_LIBRARIES} ${XCB_LIBS_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} pthread ) diff --git a/plugins/tray/dbus/dbustraymanager.cpp b/plugins/tray/dbus/dbustraymanager.cpp index 638174b2f..6610d560d 100644 --- a/plugins/tray/dbus/dbustraymanager.cpp +++ b/plugins/tray/dbus/dbustraymanager.cpp @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager com.deepin.dde.TrayManager.xml + * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager org.deepin.dde.TrayManager.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -16,7 +16,7 @@ */ DBusTrayManager::DBusTrayManager(QObject *parent) - : QDBusAbstractInterface("com.deepin.dde.TrayManager", "/com/deepin/dde/TrayManager", staticInterfaceName(), QDBusConnection::sessionBus(), parent) + : QDBusAbstractInterface("org.deepin.dde.TrayManager1", "/org/deepin/dde/TrayManager1", staticInterfaceName(), QDBusConnection::sessionBus(), parent) { qRegisterMetaType("TrayList"); qDBusRegisterMetaType(); diff --git a/plugins/tray/dbus/dbustraymanager.h b/plugins/tray/dbus/dbustraymanager.h index f587babb8..f47136cb5 100644 --- a/plugins/tray/dbus/dbustraymanager.h +++ b/plugins/tray/dbus/dbustraymanager.h @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager com.deepin.dde.TrayManager.xml + * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager org.deepin.dde.TrayManager.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -23,7 +23,7 @@ typedef QList TrayList; /* - * Proxy class for interface com.deepin.dde.TrayManager + * Proxy class for interface org.deepin.dde.TrayManager1 */ class DBusTrayManager: public QDBusAbstractInterface { @@ -35,7 +35,7 @@ class DBusTrayManager: public QDBusAbstractInterface if (3 != arguments.count()) return; QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName !="com.deepin.dde.TrayManager") + if (interfaceName !="org.deepin.dde.TrayManager1") return; QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); foreach(const QString &prop, changedProps.keys()) { @@ -50,7 +50,7 @@ class DBusTrayManager: public QDBusAbstractInterface } public: static inline const char *staticInterfaceName() - { return "com.deepin.dde.TrayManager"; } + { return "org.deepin.dde.TrayManager1"; } public: explicit DBusTrayManager(QObject *parent = 0); diff --git a/plugins/tray/dbusinterface/types/dbusimagelist.cpp b/plugins/tray/dbusinterface/types/dbusimagelist.cpp new file mode 100644 index 000000000..a317fd279 --- /dev/null +++ b/plugins/tray/dbusinterface/types/dbusimagelist.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#include "dbusimagelist.h" + +QDBusArgument &operator<<(QDBusArgument &argument, const DBusImage &image) +{ + argument.beginStructure(); + argument << image.width << image.height << image.pixels; + argument.endStructure(); + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImage &image) +{ + argument.beginStructure(); + argument >> image.width >> image.height >> image.pixels; + argument.endStructure(); + return argument; +} + +void registerDBusImageListMetaType() +{ + qRegisterMetaType("DBusImage"); + qDBusRegisterMetaType(); + + qRegisterMetaType("DBusImageList"); + qDBusRegisterMetaType(); +} + +bool operator ==(const DBusImage &a, const DBusImage &b) +{ + return a.width == b.width + && a.height == b.height + && a.pixels == b.pixels; +} + +bool operator !=(const DBusImage &a, const DBusImage &b) +{ + return !(a == b); +} diff --git a/plugins/tray/dbusinterface/types/dbusimagelist.h b/plugins/tray/dbusinterface/types/dbusimagelist.h new file mode 100644 index 000000000..cf1aae42a --- /dev/null +++ b/plugins/tray/dbusinterface/types/dbusimagelist.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#ifndef DBUSIMAGELIST_H +#define DBUSIMAGELIST_H + +#include +#include +#include + +struct DBusImage +{ + int width; + int height; + QByteArray pixels; +}; +Q_DECLARE_METATYPE(DBusImage) + +typedef QList DBusImageList; +Q_DECLARE_METATYPE(DBusImageList) + +QDBusArgument &operator<<(QDBusArgument&, const DBusImage&); +const QDBusArgument &operator>>(const QDBusArgument&, DBusImage&); + +bool operator ==(const DBusImage&, const DBusImage&); +bool operator !=(const DBusImage&, const DBusImage&); + +void registerDBusImageListMetaType(); + +#endif // DBUSIMAGELIST_H diff --git a/plugins/tray/dbusinterface/types/dbustooltip.cpp b/plugins/tray/dbusinterface/types/dbustooltip.cpp new file mode 100644 index 000000000..4f3f1766e --- /dev/null +++ b/plugins/tray/dbusinterface/types/dbustooltip.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#include "dbustooltip.h" + +QDBusArgument &operator<<(QDBusArgument &argument, const DBusToolTip &tip) +{ + argument.beginStructure(); + argument << tip.iconName << tip.iconPixmap << tip.title << tip.description; + argument.endStructure(); + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument &argument, DBusToolTip &tip) +{ + argument.beginStructure(); + argument >> tip.iconName >> tip.iconPixmap >> tip.title >> tip.description; + argument.endStructure(); + return argument; +} + +bool operator ==(const DBusToolTip &a, const DBusToolTip &b) +{ + return a.iconName == b.iconName + && a.iconPixmap == b.iconPixmap + && a.title == b.title + && a.description == b.description; +} + +bool operator !=(const DBusToolTip &a, const DBusToolTip &b) +{ + return !(a == b); +} + +void registerDBusToolTipMetaType() +{ + qRegisterMetaType("DBusToolTip"); + qDBusRegisterMetaType(); +} diff --git a/plugins/tray/dbusinterface/types/dbustooltip.h b/plugins/tray/dbusinterface/types/dbustooltip.h new file mode 100644 index 000000000..d7b0e1fa8 --- /dev/null +++ b/plugins/tray/dbusinterface/types/dbustooltip.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd. + * + * Author: listenerri + * + * Maintainer: listenerri + * + * 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 . + */ + +#ifndef DBUSTOOLTIP_H +#define DBUSTOOLTIP_H + +#include "dbusimagelist.h" + +#include +#include +#include + +struct DBusToolTip +{ + QString iconName; + DBusImageList iconPixmap; + QString title; + QString description; +}; +Q_DECLARE_METATYPE(DBusToolTip) + +QDBusArgument &operator<<(QDBusArgument&, const DBusToolTip&); +const QDBusArgument &operator>>(const QDBusArgument&, DBusToolTip&); + +bool operator ==(const DBusToolTip&, const DBusToolTip&); +bool operator !=(const DBusToolTip&, const DBusToolTip&); + +void registerDBusToolTipMetaType(); + +#endif // DBUSTOOLTIP_H diff --git a/plugins/tray/dbusinterface/types/dockrect.cpp b/plugins/tray/dbusinterface/types/dockrect.cpp new file mode 100644 index 000000000..560714a30 --- /dev/null +++ b/plugins/tray/dbusinterface/types/dockrect.cpp @@ -0,0 +1,50 @@ +#include "dockrect.h" +#include + +DockRect::DockRect() + : x(0) + , y(0) + , w(0) + , h(0) +{ + +} + +QDebug operator<<(QDebug debug, const DockRect &rect) +{ + debug << QString("DockRect(%1, %2, %3, %4)").arg(rect.x) + .arg(rect.y) + .arg(rect.w) + .arg(rect.h); + + return debug; +} + +DockRect::operator QRect() const +{ + return QRect(x, y, w, h); +} + +QDBusArgument &operator<<(QDBusArgument &arg, const DockRect &rect) +{ + arg.beginStructure(); + arg << rect.x << rect.y << rect.w << rect.h; + arg.endStructure(); + + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, DockRect &rect) +{ + arg.beginStructure(); + arg >> rect.x >> rect.y >> rect.w >> rect.h; + arg.endStructure(); + + return arg; +} + +void registerDockRectMetaType() +{ + qRegisterMetaType("DockRect"); + qDBusRegisterMetaType(); +} diff --git a/plugins/tray/dbusinterface/types/dockrect.h b/plugins/tray/dbusinterface/types/dockrect.h new file mode 100644 index 000000000..88ae33ea2 --- /dev/null +++ b/plugins/tray/dbusinterface/types/dockrect.h @@ -0,0 +1,28 @@ +#ifndef DOCKRECT_H +#define DOCKRECT_H + +#include +#include + +struct DockRect +{ +public: + DockRect(); + operator QRect() const; + + friend QDebug operator<<(QDebug debug, const DockRect &rect); + friend const QDBusArgument &operator>>(const QDBusArgument &arg, DockRect &rect); + friend QDBusArgument &operator<<(QDBusArgument &arg, const DockRect &rect); + +private: + int x; + int y; + uint w; + uint h; +}; + +Q_DECLARE_METATYPE(DockRect) + +void registerDockRectMetaType(); + +#endif // DOCKRECT_H diff --git a/plugins/tray/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml b/plugins/tray/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml new file mode 100644 index 000000000..ce2cec070 --- /dev/null +++ b/plugins/tray/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/tray/dbusinterface/xml/org.deepin.daemon.Gesture.xml b/plugins/tray/dbusinterface/xml/org.deepin.daemon.Gesture.xml new file mode 100644 index 000000000..e28032954 --- /dev/null +++ b/plugins/tray/dbusinterface/xml/org.deepin.daemon.Gesture.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/tray/dbusinterface/xml/org.kde.StatusNotifierItem.xml b/plugins/tray/dbusinterface/xml/org.kde.StatusNotifierItem.xml new file mode 100644 index 000000000..f1858b46e --- /dev/null +++ b/plugins/tray/dbusinterface/xml/org.kde.StatusNotifierItem.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/tray/fashiontray/fashiontraywidgetwrapper.h b/plugins/tray/fashiontray/fashiontraywidgetwrapper.h index 06bc3ef21..7ea7b2503 100644 --- a/plugins/tray/fashiontray/fashiontraywidgetwrapper.h +++ b/plugins/tray/fashiontray/fashiontraywidgetwrapper.h @@ -24,13 +24,13 @@ #include "../abstracttraywidget.h" +#include "org_deepin_daemon_gesture.h" + #include #include #include -#include - -using Gesture = com::deepin::daemon::Gesture; +using Gesture = com::deepin::daemon::Gesture1; #define TRAY_ITEM_DRAG_MIMEDATA "TrayItemDragDrop" diff --git a/plugins/tray/snitraywidget.h b/plugins/tray/snitraywidget.h index 5a8627dda..65b487fd1 100644 --- a/plugins/tray/snitraywidget.h +++ b/plugins/tray/snitraywidget.h @@ -26,7 +26,7 @@ #include "abstracttraywidget.h" #include "util/dockpopupwindow.h" -#include +#include "org_kde_statusnotifieritem.h" #include #include diff --git a/plugins/tray/tray.json b/plugins/tray/tray.json index bf27feb16..051df050f 100644 --- a/plugins/tray/tray.json +++ b/plugins/tray/tray.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "com.deepin.dde.TrayManager" + "depends-daemon-dbus-service": "org.deepin.dde.TrayManager1" } From 7ac4592ebbedc2ee0411515a04618a9e373ca5f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Fri, 16 Sep 2022 13:10:35 +0800 Subject: [PATCH 080/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=89=98=E7=9B=98=E6=9C=8D=E5=8A=A1=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E7=8A=B6=E6=80=81=E5=BC=82=E5=B8=B8=E6=97=B6?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=8D=A1=E6=AD=BB?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fcitx进程异常时,其statusnotifieritem服务被任务栏调用会导致任务栏卡死 Log: 解决部分情况下任务栏卡死问题 Influence: 托盘服务 Bug: https://pms.uniontech.com/bug-view-121947.html Change-Id: Ia7bc9cf077b3b707677a5fe5388b483600ba0de8 --- .../window/tray/widgets/snitrayitemwidget.cpp | 62 +++++------------ frame/window/tray/widgets/snitrayitemwidget.h | 1 - plugins/tray/snitraywidget.cpp | 66 +++++-------------- plugins/tray/snitraywidget.h | 1 - plugins/tray/trayplugin.cpp | 10 +++ 5 files changed, 44 insertions(+), 96 deletions(-) diff --git a/frame/window/tray/widgets/snitrayitemwidget.cpp b/frame/window/tray/widgets/snitrayitemwidget.cpp index 6bf5b319e..a93215a21 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.cpp +++ b/frame/window/tray/widgets/snitrayitemwidget.cpp @@ -29,6 +29,9 @@ #include #include +#include +#include +#include #include @@ -86,6 +89,7 @@ SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *par setOwnerPID(conn.interface()->servicePid(m_dbusService)); m_sniInter = new StatusNotifierItem(m_dbusService, m_dbusPath, QDBusConnection::sessionBus(), this); + m_sniInter->setSync(false); if (!m_sniInter->isValid()) { qDebug() << "SNI dbus interface is invalid!" << m_dbusService << m_dbusPath << m_sniInter->lastError(); @@ -147,30 +151,11 @@ SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *par connect(m_sniInter, &StatusNotifierItem::NewStatus, [ = ] { onSNIStatusChanged(m_sniInter->status()); }); - - initSNIPropertys(); } QString SNITrayItemWidget::itemKeyForConfig() { - QString key; - - do { - key = m_sniId; - if (!key.isEmpty()) { - break; - } - - key = QDBusInterface(m_dbusService, m_dbusPath, StatusNotifierItem::staticInterfaceName()) - .property("Id").toString(); - if (!key.isEmpty()) { - break; - } - - key = m_sniServicePath; - } while (false); - - return QString("sni:%1").arg(key); + return QString("sni:%1").arg(m_sniId.isEmpty() ? m_sniServicePath : m_sniId); } void SNITrayItemWidget::updateIcon() @@ -181,13 +166,18 @@ void SNITrayItemWidget::updateIcon() void SNITrayItemWidget::sendClick(uint8_t mouseButton, int x, int y) { switch (mouseButton) { - case XCB_BUTTON_INDEX_1: - // left button click invalid - if (LeftClickInvalidIdList.contains(m_sniId)) { - showContextMenu(x, y); - } else { - m_sniInter->Activate(x, y); - } + case XCB_BUTTON_INDEX_1: { + QFuture future = QtConcurrent::run([ = ] { + StatusNotifierItem inter(m_dbusService, m_dbusPath, QDBusConnection::sessionBus()); + QDBusPendingReply<> reply = inter.Activate(x, y); + // try to invoke context menu while calling activate get a error. + // primarily work for apps using libappindicator. + reply.waitForFinished(); + if (reply.isError()) { + showContextMenu(x,y); + } + }); + } break; case XCB_BUTTON_INDEX_2: m_sniInter->SecondaryActivate(x, y); @@ -256,24 +246,6 @@ uint SNITrayItemWidget::servicePID(const QString &servicePath) return conn.interface()->servicePid(serviceName); } -void SNITrayItemWidget::initSNIPropertys() -{ - m_sniAttentionIconName = m_sniInter->attentionIconName(); - m_sniAttentionIconPixmap = m_sniInter->attentionIconPixmap(); - m_sniAttentionMovieName = m_sniInter->attentionMovieName(); - m_sniCategory = m_sniInter->category(); - m_sniIconName = m_sniInter->iconName(); - m_sniIconPixmap = m_sniInter->iconPixmap(); - m_sniIconThemePath = m_sniInter->iconThemePath(); - m_sniId = m_sniInter->id(); - m_sniMenuPath = m_sniInter->menu(); - m_sniOverlayIconName = m_sniInter->overlayIconName(); - m_sniOverlayIconPixmap = m_sniInter->overlayIconPixmap(); - m_sniStatus = m_sniInter->status(); - - m_updateIconTimer->start(); -} - void SNITrayItemWidget::initMenu() { const QString &sniMenuPath = m_sniMenuPath.path(); diff --git a/frame/window/tray/widgets/snitrayitemwidget.h b/frame/window/tray/widgets/snitrayitemwidget.h index eddcb4732..1af8f46c3 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.h +++ b/frame/window/tray/widgets/snitrayitemwidget.h @@ -81,7 +81,6 @@ Q_SIGNALS: void statusChanged(SNITrayItemWidget::ItemStatus status); private Q_SLOTS: - void initSNIPropertys(); void initMenu(); void refreshIcon(); void refreshOverlayIcon(); diff --git a/plugins/tray/snitraywidget.cpp b/plugins/tray/snitraywidget.cpp index 8d88b3059..2500c09c6 100644 --- a/plugins/tray/snitraywidget.cpp +++ b/plugins/tray/snitraywidget.cpp @@ -30,6 +30,9 @@ #include #include +#include +#include +#include #include @@ -39,7 +42,6 @@ DGUI_USE_NAMESPACE const QStringList ItemCategoryList {"ApplicationStatus", "Communications", "SystemServices", "Hardware"}; const QStringList ItemStatusList {"Passive", "Active", "NeedsAttention"}; -const QStringList LeftClickInvalidIdList {"sogou-qimpanel",}; QPointer SNITrayWidget::PopupWindow = nullptr; Dock::Position SNITrayWidget::DockPosition = Dock::Position::Top; using namespace Dock; @@ -93,7 +95,7 @@ SNITrayWidget::SNITrayWidget(const QString &sniServicePath, QWidget *parent) setOwnerPID(conn.interface()->servicePid(m_dbusService)); m_sniInter = new StatusNotifierItem(m_dbusService, m_dbusPath, QDBusConnection::sessionBus(), this); - + m_sniInter->setSync(false); if (!m_sniInter->isValid()) { qDebug() << "SNI dbus interface is invalid!" << m_dbusService << m_dbusPath << m_sniInter->lastError(); return; @@ -154,30 +156,11 @@ SNITrayWidget::SNITrayWidget(const QString &sniServicePath, QWidget *parent) connect(m_sniInter, &StatusNotifierItem::NewStatus, [ = ] { onSNIStatusChanged(m_sniInter->status()); }); - - initSNIPropertys(); } QString SNITrayWidget::itemKeyForConfig() { - QString key; - - do { - key = m_sniId; - if (!key.isEmpty()) { - break; - } - - key = QDBusInterface(m_dbusService, m_dbusPath, StatusNotifierItem::staticInterfaceName()) - .property("Id").toString(); - if (!key.isEmpty()) { - break; - } - - key = m_sniServicePath; - } while (false); - - return QString("sni:%1").arg(key); + return QString("sni:%1").arg(m_sniId.isEmpty() ? m_sniServicePath : m_sniId); } void SNITrayWidget::updateIcon() @@ -188,13 +171,18 @@ void SNITrayWidget::updateIcon() void SNITrayWidget::sendClick(uint8_t mouseButton, int x, int y) { switch (mouseButton) { - case XCB_BUTTON_INDEX_1: - // left button click invalid - if (LeftClickInvalidIdList.contains(m_sniId)) { - showContextMenu(x, y); - } else { - m_sniInter->Activate(x, y); - } + case XCB_BUTTON_INDEX_1: { + QFuture future = QtConcurrent::run([ = ] { + StatusNotifierItem inter(m_dbusService, m_dbusPath, QDBusConnection::sessionBus()); + QDBusPendingReply<> reply = inter.Activate(x, y); + // try to invoke context menu while calling activate get a error. + // primarily work for apps using libappindicator. + reply.waitForFinished(); + if (reply.isError()) { + showContextMenu(x,y); + } + }); + } break; case XCB_BUTTON_INDEX_2: m_sniInter->SecondaryActivate(x, y); @@ -263,26 +251,6 @@ uint SNITrayWidget::servicePID(const QString &servicePath) return conn.interface()->servicePid(serviceName); } -void SNITrayWidget::initSNIPropertys() -{ - m_sniAttentionIconName = m_sniInter->attentionIconName(); - m_sniAttentionIconPixmap = m_sniInter->attentionIconPixmap(); - m_sniAttentionMovieName = m_sniInter->attentionMovieName(); - m_sniCategory = m_sniInter->category(); - m_sniIconName = m_sniInter->iconName(); - m_sniIconPixmap = m_sniInter->iconPixmap(); - m_sniIconThemePath = m_sniInter->iconThemePath(); - m_sniId = m_sniInter->id(); - m_sniMenuPath = m_sniInter->menu(); - m_sniOverlayIconName = m_sniInter->overlayIconName(); - m_sniOverlayIconPixmap = m_sniInter->overlayIconPixmap(); - m_sniStatus = m_sniInter->status(); - - m_updateIconTimer->start(); -// m_updateOverlayIconTimer->start(); -// m_updateAttentionIconTimer->start(); -} - void SNITrayWidget::initMenu() { const QString &sniMenuPath = m_sniMenuPath.path(); diff --git a/plugins/tray/snitraywidget.h b/plugins/tray/snitraywidget.h index 65b487fd1..17517bda4 100644 --- a/plugins/tray/snitraywidget.h +++ b/plugins/tray/snitraywidget.h @@ -79,7 +79,6 @@ Q_SIGNALS: void statusChanged(SNITrayWidget::ItemStatus status); private Q_SLOTS: - void initSNIPropertys(); void initMenu(); void refreshIcon(); void refreshOverlayIcon(); diff --git a/plugins/tray/trayplugin.cpp b/plugins/tray/trayplugin.cpp index 1060c963a..22d737a44 100644 --- a/plugins/tray/trayplugin.cpp +++ b/plugins/tray/trayplugin.cpp @@ -480,12 +480,22 @@ void TrayPlugin::traySNIAdded(const QString &itemKey, const QString &sniServiceP return false; } + // 1、确保服务有效 QDBusInterface sniItemDBus(sniServerName, "/" + list.last()); if (!sniItemDBus.isValid()) { qDebug() << "sni dbus service error : " << sniServerName; return false; } + // 部分服务虽然有效,但是在dbus总线上只能看到服务,其他信息都无法获取,这里通过Ping进行二次确认 + // 参考: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces + + // 2、通过Ping接口确认服务是否正常 + QDBusInterface peerInter(sniServerName, "/" + list.last(), "org.freedesktop.DBus.Peer"); + QDBusReply reply = peerInter.call("Ping"); + if (!reply.isValid()) + return false; + return true; }); From 18fdbcd838d9feda29ddc3e934726abcf1543d97 Mon Sep 17 00:00:00 2001 From: zyz Date: Wed, 27 Jul 2022 20:55:32 +0800 Subject: [PATCH 081/257] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E8=B7=A8=E7=AB=AF=E5=8D=8F=E5=90=8C=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加任务栏跨端协同操作(连接设备,请求协同)功能。 Log: 添加任务栏跨端协同操作功能。 Influence: 任务栏跨端协同功能。 Task: https://pms.uniontech.com/task-view-119639.html Change-Id: I706310ee16bcde899f6106375fbb911b3062ab3f --- frame/model/collaborationdevmodel.cpp | 267 ++++++++++++++++++ frame/model/collaborationdevmodel.h | 119 ++++++++ .../window/components/brightnessadjwidget.cpp | 62 ++++ frame/window/components/brightnessadjwidget.h | 48 ++++ .../components/devcollaborationwidget.cpp | 249 ++++++++++++++++ .../components/devcollaborationwidget.h | 69 +++++ frame/window/components/devitemdelegate.cpp | 179 ++++++++++++ frame/window/components/devitemdelegate.h | 67 +++++ .../components/displaysettingwidget.cpp | 58 ++++ .../window/components/displaysettingwidget.h | 50 ++++ frame/window/quicksettingcontainer.cpp | 4 +- frame/window/quicksettingcontainer.h | 2 + 12 files changed, 1173 insertions(+), 1 deletion(-) create mode 100644 frame/model/collaborationdevmodel.cpp create mode 100644 frame/model/collaborationdevmodel.h create mode 100644 frame/window/components/brightnessadjwidget.cpp create mode 100644 frame/window/components/brightnessadjwidget.h create mode 100644 frame/window/components/devcollaborationwidget.cpp create mode 100644 frame/window/components/devcollaborationwidget.h create mode 100644 frame/window/components/devitemdelegate.cpp create mode 100644 frame/window/components/devitemdelegate.h create mode 100644 frame/window/components/displaysettingwidget.cpp create mode 100644 frame/window/components/displaysettingwidget.h diff --git a/frame/model/collaborationdevmodel.cpp b/frame/model/collaborationdevmodel.cpp new file mode 100644 index 000000000..81be2d560 --- /dev/null +++ b/frame/model/collaborationdevmodel.cpp @@ -0,0 +1,267 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "collaborationdevmodel.h" + +#include +#include +#include +#include +#include +#include + +#include + +DGUI_USE_NAMESPACE +DCORE_USE_NAMESPACE + +static const QString CollaborationService = "com.deepin.Cooperation"; +static const QString CollaborationPath = "/com/deepin/Cooperation"; +static const QString CollaborationInterface = "com.deepin.Cooperation"; +static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties"; + +CollaborationDevModel::CollaborationDevModel(QObject *parent) + : QObject(parent) + , m_timer(new QTimer(this)) + , m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this)) +{ + if (m_colDbusInter->isValid()) { + QList paths = m_colDbusInter->property("Machines").value>(); + for (const QDBusObjectPath& path : paths) { + CollaborationDevice *device = new CollaborationDevice(path.path(), this); + if (device->isValid()) + m_devices[path.path()] = device; + else + device->deleteLater(); + } + } else { + qWarning() << CollaborationService << " is invalid"; + } + + m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); + + connect(m_timer, &QTimer::timeout, this, &CollaborationDevModel::callScanMethod); +} + +void CollaborationDevModel::scanDevice() +{ + callScanMethod(); + m_timer->start(30 * 1000); // 30s +} + +void CollaborationDevModel::stopScanDevice() +{ + if (m_timer->isActive()) + m_timer->stop(); +} + +QList CollaborationDevModel::devices() const +{ + return m_devices.values(); +} + +void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != CollaborationInterface) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Machines")) { + QStringList devPaths = changedProps.value("Machines").toStringList(); + updateDevice(devPaths); + } +} + +void CollaborationDevModel::callScanMethod() +{ + // TODO 该功能目前不可用 + // m_dbusInter->asyncCall("Scan"); +} + +void CollaborationDevModel::updateDevice(const QStringList &devPaths) +{ + if (devPaths.isEmpty()) { + qDeleteAll(m_devices); + m_devices.clear(); + } else { + // 清除已不存在的设备 + QMapIterator it(m_devices); + while (it.hasNext()) { + it.next(); + if (!devPaths.contains(it.key())) { + it.value()->deleteLater(); + m_devices.remove(it.key()); + } + } + + // 添加新增设备 + for (const QString &path : devPaths) { + if (!m_devices.contains(path)) { + CollaborationDevice *device = new CollaborationDevice(path, this); + if (device->isValid()) + m_devices[path] = device; + else + device->deleteLater(); + } + } + } + + emit devicesChanged(); +} + +const CollaborationDevice *CollaborationDevModel::getDevice(const QString &uuid) +{ + QList devices = m_devices.values(); + for (const CollaborationDevice *device : devices) { + if (device->uuid() == uuid) { + return device; + } + } + + return nullptr; +} + +CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent) + : QObject(parent) + , m_path(devPath) + , m_OS(-1) + , m_isPaired(false) + , m_isCooperated(false) + , m_isValid(false) + , m_devDbusInter(new QDBusInterface(CollaborationService, devPath, CollaborationInterface + QString(".Machine"), + QDBusConnection::sessionBus(), this)) +{ + if (m_devDbusInter->isValid()) { + m_name = m_devDbusInter->property("Name").toString(); + m_OS = m_devDbusInter->property("OS").toInt(); + m_isPaired = m_devDbusInter->property("Paired").toBool(); + m_isCooperated = m_devDbusInter->property("Cooperating").toBool(); + m_uuid = m_devDbusInter->property("UUID").toString(); + m_isValid = true; + } else { + qWarning() << "CollaborationDevice devPath:" << devPath << " is invalid and get properties failed"; + } + + m_devDbusInter->connection().connect(CollaborationService, m_path, ColPropertiesInterface, "PropertiesChanged", + this, SLOT(onPropertyChanged(QDBusMessage))); +} + +bool CollaborationDevice::isValid() const +{ + return m_isValid; +} + +QString CollaborationDevice::name() const +{ + return m_name; +} + +QString CollaborationDevice::uuid() const +{ + return m_uuid; +} + +QString CollaborationDevice::deviceIcon() const +{ + switch (m_OS) { + case DeviceType::Android: { + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/ICON_Device_Headphone_dark.svg"); + + return QString(":/icons/resources/ICON_Device_Headphone.svg"); + } + default: { + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/ICON_Device_Laptop_dark.svg"); + + return QString(":/icons/resources/ICON_Device_Laptop.svg"); + } + } +} + +bool CollaborationDevice::isPaired() const +{ + return m_isPaired; +} + +bool CollaborationDevice::isCooperated() const +{ + return m_isCooperated; +} + +void CollaborationDevice::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != QString("%1.Machine").arg(CollaborationInterface)) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Paired")) { + bool isPaired = changedProps.value("Paired").value(); + m_isPaired = isPaired; + if (isPaired) { + // paired 成功之后再去请求cooperate + requestCooperate(); + } else { + Q_EMIT pairedStateChanged(false); + } + } else if (changedProps.contains("Cooperating")) { + m_isCooperated = changedProps.value("Cooperating").value(); + + Q_EMIT pairedStateChanged(m_isCooperated); + } +} + +void CollaborationDevice::requestCooperate() const +{ + callMethod("RequestCooperate"); +} + +void CollaborationDevice::disconnectDevice() const +{ + callMethod("Disconnect"); +} + +void CollaborationDevice::pair() const +{ + callMethod("Pair"); +} + +QDBusMessage CollaborationDevice::callMethod(const QString &methodName) const +{ + if (m_devDbusInter->isValid()) { + QDBusMessage msg = m_devDbusInter->call(methodName); + qInfo() << "CollaborationDevice callMethod:" << methodName << " " << msg.errorMessage(); + return msg; + } + + qWarning() << "CollaborationDevice callMethod: " << methodName << " failed"; + return QDBusMessage(); +} diff --git a/frame/model/collaborationdevmodel.h b/frame/model/collaborationdevmodel.h new file mode 100644 index 000000000..8a2ca1487 --- /dev/null +++ b/frame/model/collaborationdevmodel.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef COLLABORATION_DEV_MODEL_H +#define COLLABORATION_DEV_MODEL_H + +#include +#include + +class QTimer; +class QDBusInterface; +class QDBusMessage; +class CollaborationDevice; + +/*! + * \brief The CollaborationDevModel class + * 协同设备model + */ +class CollaborationDevModel : public QObject +{ + Q_OBJECT +public: + explicit CollaborationDevModel(QObject *parent = nullptr); + +signals: + void devicesChanged(); + +public: + void scanDevice(); + void stopScanDevice(); + QList devices() const; + const CollaborationDevice *getDevice(const QString &uuid); + +private slots: + void onPropertyChanged(const QDBusMessage &msg); + +private: + void callScanMethod(); + void updateDevice(const QStringList &devPaths); + +private: + QTimer *m_timer; // 定时扫描设备 + QDBusInterface *m_colDbusInter; + // machine path : device object + QMap m_devices; + +}; + +/*! + * \brief The CollaborationDevice class + * 协同设备类 + */ +class CollaborationDevice : public QObject +{ + Q_OBJECT +public: + explicit CollaborationDevice(const QString &devPath, QObject *parent = nullptr); + +signals: + void pairedStateChanged(bool); + +public: + bool isValid() const; + void pair() const; + void requestCooperate() const; + void disconnectDevice() const; + + QString name() const; + QString uuid() const; + QString deviceIcon() const; + bool isPaired() const; + bool isCooperated() const; + +private slots: + void onPropertyChanged(const QDBusMessage &msg); + +private: + QDBusMessage callMethod(const QString &methodName) const; + +private: + enum DeviceType { + Other = 0, + UOS, + Linux, + Windows, + MacOS, + Android + }; + + QString m_path; + QString m_name; + QString m_uuid; + int m_OS; + + bool m_isPaired; + bool m_isCooperated; + bool m_isValid; + + QDBusInterface *m_devDbusInter; +}; + +#endif // COLLABORATION_DEV_MODEL_H diff --git a/frame/window/components/brightnessadjwidget.cpp b/frame/window/components/brightnessadjwidget.cpp new file mode 100644 index 000000000..3ae544459 --- /dev/null +++ b/frame/window/components/brightnessadjwidget.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "brightnessadjwidget.h" +#include "brightnessmodel.h" +#include "slidercontainer.h" +#include "imageutil.h" + +#include + +BrightnessAdjWidget::BrightnessAdjWidget(QWidget *parent) + : QWidget(parent) + , m_mainLayout(new QVBoxLayout(this)) + , m_brightnessModel(new BrightnessModel(this)) +{ + m_mainLayout->setSpacing(5); + loadBrightnessItem(); +} + +void BrightnessAdjWidget::loadBrightnessItem() +{ + QList monitors = m_brightnessModel->monitors(); + for (BrightMonitor *monitor : monitors) { + SliderContainer *sliderContainer = new SliderContainer(this); + if (monitors.count() > 1) + sliderContainer->setTitle(monitor->name()); + + QPixmap leftPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesslow", QSize(20, 20)); + QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesshigh", QSize(20, 20)); + sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon,leftPixmap, QSize(), 12); + sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 12); + + sliderContainer->setFixedWidth(310); + sliderContainer->setFixedHeight(monitors.count() > 1 ? 56 : 30); + sliderContainer->updateSliderValue(monitor->brightness()); + + SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); + sliderContainer->setSliderProxyStyle(proxy); + m_mainLayout->addWidget(sliderContainer); + + connect(monitor, &BrightMonitor::brightnessChanged, sliderContainer, &SliderContainer::updateSliderValue); + connect(sliderContainer, &SliderContainer::sliderValueChanged, monitor, &BrightMonitor::setBrightness); + } +} + diff --git a/frame/window/components/brightnessadjwidget.h b/frame/window/components/brightnessadjwidget.h new file mode 100644 index 000000000..74482c7d8 --- /dev/null +++ b/frame/window/components/brightnessadjwidget.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef BRIGHTNESS_ADJUSTMENT_WIDGET_H +#define BRIGHTNESS_ADJUSTMENT_WIDGET_H + +#include + +class QVBoxLayout; +class BrightnessModel; + +/*! + * \brief The BrightnessAdjWidget class + * 显示器亮度调整页面 + */ +class BrightnessAdjWidget : public QWidget +{ + Q_OBJECT +public: + explicit BrightnessAdjWidget(QWidget *parent = nullptr); + +private: + void loadBrightnessItem(); + +private: + QVBoxLayout *m_mainLayout; + BrightnessModel *m_brightnessModel; +}; + + +#endif // BRIGHTNESS_ADJUSTMENT_WIDGET_H diff --git a/frame/window/components/devcollaborationwidget.cpp b/frame/window/components/devcollaborationwidget.cpp new file mode 100644 index 000000000..e9855f322 --- /dev/null +++ b/frame/window/components/devcollaborationwidget.cpp @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "devcollaborationwidget.h" +#include "collaborationdevmodel.h" +#include "devitemdelegate.h" + +#include + +#include +#include +#include +#include +#include + +#define TITLE_HEIGHT 16 +#define ITME_WIDTH 310 +#define ITEM_HEIGHT 36 +#define LISTVIEW_ITEM_SPACE 2 +#define ITME_SPACE 10 +#define PER_DEGREE 14 + +DevCollaborationWidget::DevCollaborationWidget(QWidget *parent) + : QWidget(parent) + , m_deviceModel(new CollaborationDevModel(this)) + , m_deviceListView(new DListView(this)) + , m_viewItemModel(new QStandardItemModel(m_deviceListView)) + , m_refreshTimer(new QTimer(this)) +{ + initUI(); + loadDevice(); + + connect(m_deviceModel, &CollaborationDevModel::devicesChanged, this, &DevCollaborationWidget::loadDevice); + connect(m_deviceListView, &DListView::clicked, this, &DevCollaborationWidget::itemClicked); + connect(m_refreshTimer, &QTimer::timeout, this, &DevCollaborationWidget::refreshViewItem); +} + +void DevCollaborationWidget::showEvent(QShowEvent *event) +{ + m_deviceModel->scanDevice(); + + QWidget::showEvent(event); +} + +void DevCollaborationWidget::hideEvent(QHideEvent *event) +{ + m_deviceModel->stopScanDevice(); + + QWidget::hideEvent(event); +} + +void DevCollaborationWidget::initUI() +{ + m_deviceListView->setModel(m_viewItemModel); + + QLabel *title = new QLabel(tr("Cross-end Collaboration"), this); + title->setFixedHeight(TITLE_HEIGHT); + + QHBoxLayout *hLayout = new QHBoxLayout(); + hLayout->setContentsMargins(10, 0, 0, 0); + hLayout->addWidget(title); + + QVBoxLayout *mainLayout = new QVBoxLayout(); + mainLayout->setMargin(0); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(ITME_SPACE); + mainLayout->addLayout(hLayout); + mainLayout->addWidget(m_deviceListView); + + setLayout(mainLayout); + + m_deviceListView->setContentsMargins(0, 0, 0, 0); + m_deviceListView->setFrameShape(QFrame::NoFrame); + m_deviceListView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + m_deviceListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_deviceListView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + m_deviceListView->setResizeMode(QListView::Adjust); + m_deviceListView->setViewportMargins(0, 0, 0, 0); + m_deviceListView->setSpacing(LISTVIEW_ITEM_SPACE); + m_deviceListView->setEditTriggers(QAbstractItemView::NoEditTriggers); + m_deviceListView->setItemDelegate(new DevItemDelegate(this)); +} + +void DevCollaborationWidget::loadDevice() +{ + if (!m_deviceListView->count()) { + for (CollaborationDevice *device : m_deviceModel->devices()) { + addItem(device); + } + } else { + updateDeviceListView(); + } + + if(!m_deviceListView->count()) { + m_deviceListView->hide(); + } else { + if (!m_deviceListView->isVisible()) + m_deviceListView->setVisible(true); + + m_deviceListView->setFixedSize(ITME_WIDTH, m_deviceListView->count() * ITEM_HEIGHT + LISTVIEW_ITEM_SPACE * (m_deviceListView->count() * 2)); + } + + resetWidgetSize(); +} + +void DevCollaborationWidget::addItem(const CollaborationDevice *device) +{ + if (!device) + return; + + QStandardItem *item = new QStandardItem(); + DevItemDelegate::DevItemData data; + data.checkedIconPath = device->deviceIcon(); // TODO + data.text = device->name(); + data.iconPath = device->deviceIcon(); + int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; + + item->setData(QVariant::fromValue(data), DevItemDelegate::StaticDataRole); + item->setData(device->uuid(), DevItemDelegate::UUIDDataRole); + item->setData(0, DevItemDelegate::DegreeDataRole); + item->setData(resultState, DevItemDelegate::ResultDataRole); + + m_viewItemModel->appendRow(item); + m_uuidItemMap[device->uuid()] = item; + + connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged); +} + +void DevCollaborationWidget::updateDeviceListView() +{ + QList devices = m_deviceModel->devices(); + if (devices.isEmpty()) { + m_deviceListView->removeItems(0, m_deviceListView->count()); + return; + } + + // 删除不存在设备 + for (int row = 0; row < m_deviceListView->count(); row++) { + QStandardItem *item = m_viewItemModel->item(row); + if (!item) + continue; + + QString uuid = item->data(DevItemDelegate::UUIDDataRole).toString(); + if (m_deviceModel->getDevice(uuid)) + continue; + + m_deviceListView->removeItem(row); + + if (m_uuidItemMap.contains(uuid)) { + m_uuidItemMap.remove(uuid); + } + + if (m_connectingDevices.contains(uuid)) { + m_connectingDevices.removeAll(uuid); + } + } + + // 处理新增 + for (CollaborationDevice *device : devices) { + if (!m_uuidItemMap.contains(device->uuid())) { + addItem(device); + } + } +} + +void DevCollaborationWidget::resetWidgetSize() +{ + int height = TITLE_HEIGHT + ITME_SPACE + (m_deviceListView->count() ? m_deviceListView->height() : 0); + + setFixedSize(ITME_WIDTH, height); +} + +void DevCollaborationWidget::itemClicked(const QModelIndex &index) +{ + QString uuid = index.data(DevItemDelegate::UUIDDataRole).toString(); + const CollaborationDevice *device = m_deviceModel->getDevice(uuid); + if (!device) + return; + + if (!device->isPaired()) { + device->pair(); + m_connectingDevices.append(uuid); + } else if (!device->isCooperated()) { + device->requestCooperate(); + m_connectingDevices.append(uuid); + } else if (device->isCooperated()) { + device->disconnectDevice(); + } + + if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive()) + m_refreshTimer->start(30); +} + +void DevCollaborationWidget::itemStatusChanged() +{ + CollaborationDevice *device = qobject_cast(sender()); + if (!device) + return; + + QString uuid = device->uuid(); + if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) { + // 更新item的连接状态 + int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; + m_uuidItemMap[uuid]->setData(resultState, DevItemDelegate::ResultDataRole); + if (device->isCooperated()) + m_uuidItemMap[uuid]->setData(0, DevItemDelegate::DegreeDataRole); + + m_deviceListView->update(m_uuidItemMap[uuid]->index()); + + if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(uuid)) { + m_connectingDevices.removeAll(uuid); + } + } +} + +void DevCollaborationWidget::refreshViewItem() +{ + if (m_connectingDevices.isEmpty()) { + m_refreshTimer->stop(); + return; + } + + for (const QString &uuid : m_connectingDevices) { + if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) { + int degree = m_uuidItemMap[uuid]->data(DevItemDelegate::DegreeDataRole).toInt(); + degree += PER_DEGREE; // 递进值 + m_uuidItemMap[uuid]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole); + m_uuidItemMap[uuid]->setData(degree, DevItemDelegate::DegreeDataRole); + m_deviceListView->update(m_uuidItemMap[uuid]->index()); + } + } +} diff --git a/frame/window/components/devcollaborationwidget.h b/frame/window/components/devcollaborationwidget.h new file mode 100644 index 000000000..bef33c479 --- /dev/null +++ b/frame/window/components/devcollaborationwidget.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef DEVICE_COLLABORATION_WIDGET_H +#define DEVICE_COLLABORATION_WIDGET_H + +#include +#include + +DWIDGET_USE_NAMESPACE + +class CollaborationDevice; +class CollaborationDevModel; + +/*! + * \brief The DevCollaborationWidget class + * 设备跨端协同子页面 + */ +class DevCollaborationWidget : public QWidget +{ + Q_OBJECT +public: + explicit DevCollaborationWidget(QWidget *parent = nullptr); + +protected: + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + +private slots: + void loadDevice(); + void itemClicked(const QModelIndex &index); + void itemStatusChanged(); + void refreshViewItem(); + +private: + void initUI(); + void updateDeviceListView(); + + void addItem(const CollaborationDevice *device); + void resetWidgetSize(); + +private: + CollaborationDevModel *m_deviceModel; + DListView *m_deviceListView; + QStandardItemModel *m_viewItemModel; + QMap m_uuidItemMap; + QStringList m_connectingDevices; + + QTimer *m_refreshTimer; +}; + +#endif // DEVICE_COLLABORATION_WIDGET_H diff --git a/frame/window/components/devitemdelegate.cpp b/frame/window/components/devitemdelegate.cpp new file mode 100644 index 000000000..876cde1cf --- /dev/null +++ b/frame/window/components/devitemdelegate.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "devitemdelegate.h" + +#include +#include +#include + +#include + +#define RADIUS_VALUE 10 +#define ITEM_SPACE 10 +#define ICON_WIDTH 16 +#define ICON_HEIGHT 16 +#define TEXT_RECT_HEIGHT 20 +#define ITEM_HEIGHT 36 +#define INDICATOR_SHADOW_OFFSET 10 + +DevItemDelegate::DevItemDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ + +} + +void DevItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + if (!index.isValid()) + return; + + painter->setRenderHint(QPainter::Antialiasing); + QVariant var = index.data(StaticDataRole); + DevItemData itemData = var.value(); + QRect rect = option.rect; + QPen pen; + pen.setWidth(2); + + // 鼠标悬停 + if (option.state.testFlag(QStyle::State_MouseOver)) { + pen.setColor(QColor("#EBECED")); + painter->setPen(pen); + painter->setBrush(QColor("#EBECED")); + painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); + } + + // 选中背景(连接上和选中) + int result = index.data(ResultDataRole).toInt(); + if (option.state.testFlag(QStyle::State_Selected) && result == Connected) { + pen.setColor(QColor("#0081FF")); + painter->setPen(pen); + painter->setBrush(QColor("#0081FF")); + painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); + } else { + // 绘制默认背景 + pen.setColor(QColor("#EBECED")); + painter->setPen(pen); + painter->setBrush(QColor("#EBECED")); + painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); + } + + bool selected = (option.state.testFlag(QStyle::State_Selected) && result == Connected); + + // 绘制Icon + QString imagePath = selected ? itemData.checkedIconPath : itemData.iconPath; + QRect iconRect = QRect(rect.left() + ITEM_SPACE, rect.top() + rect.height() / 2 - ICON_HEIGHT / 2, + ICON_WIDTH, ICON_HEIGHT); + painter->drawImage(iconRect, QImage(imagePath)); + + // 绘制text + QFont font = Dtk::Widget::DFontSizeManager::instance()->t4(); + painter->setFont(font); + pen.setColor(selected ? Qt::white : Qt::black); + painter->setPen(pen); + + int textRectWidth = rect.width() - ITEM_SPACE - iconRect.width() - iconRect.width() - ITEM_SPACE; + QRect textRect = QRect(iconRect.right() + ITEM_SPACE, rect.top() + 2, + textRectWidth, rect.height()); + + QFontMetrics fm(font); + QString itemText = fm.elidedText(itemData.text, Qt::ElideRight, textRectWidth); + painter->drawText(textRect, itemText); + + switch (result) { + case ResultState::Connected: + drawResultState(painter, rect); + break; + case ResultState::Connecting: + drawWaitingState(painter, rect, index.data(DegreeDataRole).toInt()); + break; + default: + break; + } +} + +QSize DevItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(index) + return QSize(option.rect.width(), ITEM_HEIGHT); +} + +void DevItemDelegate::drawWaitingState(QPainter *painter, const QRect &rect, int degree) const +{ + int left = rect.width() - ITEM_SPACE; + int top = rect.top() + rect.height() / 2 - ICON_HEIGHT / 2; + QRect newRect(left, top, ICON_WIDTH, ICON_HEIGHT); + + painter->setRenderHint(QPainter::Antialiasing, true); + QList> indicatorColors; + for (int i = 0; i < 3; i++) + indicatorColors << createDefaultIndicatorColorList(QColor("#0081FF")); + + double radius = 16 * 0.66; + auto center = QRectF(newRect).center(); + auto indicatorRadius = radius / 2 / 2 * 1.1; + auto indicatorDegreeDelta = 360 / indicatorColors.count(); + + for (int i = 0; i < indicatorColors.count(); ++i) { + QList colors = indicatorColors.value(i); + for (int j = 0; j < colors.count(); ++j) { + double degreeCurrent = degree - j * INDICATOR_SHADOW_OFFSET + indicatorDegreeDelta * i; + auto x = (radius - indicatorRadius) * qCos(qDegreesToRadians(degreeCurrent)); + auto y = (radius - indicatorRadius) * qSin(qDegreesToRadians(degreeCurrent)); + + x = center.x() + x; + y = center.y() + y; + auto tl = QPointF(x - 1 * indicatorRadius, y - 1 * indicatorRadius); + QRectF rf(tl.x(), tl.y(), indicatorRadius * 2, indicatorRadius * 2); + + QPainterPath path; + path.addEllipse(rf); + + painter->fillPath(path, colors.value(j)); + } + } +} + +void DevItemDelegate::drawResultState(QPainter *painter, const QRect &rect) const +{ + // 绘制对勾,14x12 + int left = rect.width() - ITEM_SPACE; + int top = rect.top() + rect.height() / 2 - 6; + + QPainterPath path; + path.moveTo(left, top + 6); + path.lineTo(left + 4, top + 11); + path.lineTo(left + 12, top + 1); + + painter->drawPath(path); +} + +QList DevItemDelegate::createDefaultIndicatorColorList(QColor color) const +{ + QList colors; + QList opacitys; + opacitys << 100 << 30 << 15 << 10 << 5 << 4 << 3 << 2 << 1; + for (int i = 0; i < opacitys.count(); ++i) { + color.setAlpha(255 * opacitys.value(i) / 100); + colors << color; + } + + return colors; +} diff --git a/frame/window/components/devitemdelegate.h b/frame/window/components/devitemdelegate.h new file mode 100644 index 000000000..266d07a2a --- /dev/null +++ b/frame/window/components/devitemdelegate.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef DEVITEMDELEGATE_H +#define DEVITEMDELEGATE_H + +#include + +/*! + * \brief The DevItemDelegate class + */ +class DevItemDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + enum DevItemDataRole { + StaticDataRole = Qt::UserRole + 1, // 静态信息 + UUIDDataRole = Qt::UserRole + 2, // uuid, 可唯一代表一个设备 + DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数 + ResultDataRole = Qt::UserRole + 4 // 连接结果 + }; + + enum ResultState { + None, + Connecting, + Connected + }; + + struct DevItemData { + QString checkedIconPath; + QString iconPath; + QString text; + }; + +public: + explicit DevItemDelegate(QObject *parent = nullptr); + +protected: + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; + +private: + void drawWaitingState(QPainter *painter, const QRect &rect, int degree) const; + void drawResultState(QPainter *painter, const QRect &rect) const; + QList createDefaultIndicatorColorList(QColor color) const; +}; + +Q_DECLARE_METATYPE(DevItemDelegate::DevItemData) + +#endif // DEVITEMDELEGATE_H diff --git a/frame/window/components/displaysettingwidget.cpp b/frame/window/components/displaysettingwidget.cpp new file mode 100644 index 000000000..510108faa --- /dev/null +++ b/frame/window/components/displaysettingwidget.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "displaysettingwidget.h" +#include "brightnessadjwidget.h" +#include "devcollaborationwidget.h" + +#include +#include + +#include + +DisplaySettingWidget::DisplaySettingWidget(QWidget *parent) + : QWidget(parent) + , m_brightnessAdjWidget(new BrightnessAdjWidget(this)) + , m_collaborationWidget(new DevCollaborationWidget(this)) + , m_settingBtn(new QPushButton(this)) +{ + initUI(); + + connect(m_settingBtn, &QPushButton::clicked, this, [ this ](){ + DDBusSender().service("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .method("ShowPage").arg(QString("display")).call(); + hide(); + }); +} + +void DisplaySettingWidget::initUI() +{ + QVBoxLayout *mainLayout = new QVBoxLayout(); + mainLayout->setMargin(0); + + mainLayout->addWidget(m_brightnessAdjWidget); + mainLayout->addWidget(m_collaborationWidget); + mainLayout->addWidget(m_settingBtn); + mainLayout->addStretch(); + + setLayout(mainLayout); +} diff --git a/frame/window/components/displaysettingwidget.h b/frame/window/components/displaysettingwidget.h new file mode 100644 index 000000000..ae8005808 --- /dev/null +++ b/frame/window/components/displaysettingwidget.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef DISPLAY_SETTING_WIDGET_H +#define DISPLAY_SETTING_WIDGET_H + +#include + +class QPushButton; +class BrightnessAdjWidget; +class DevCollaborationWidget; + +/*! + * \brief The DisplaySettingWidget class + * 显示设置页面,快捷设置面板-->亮度调节栏右边显示按钮-->此页面 + */ +class DisplaySettingWidget : public QWidget +{ + Q_OBJECT +public: + explicit DisplaySettingWidget(QWidget *parent = nullptr); + +private: + void initUI(); + +private: + BrightnessAdjWidget *m_brightnessAdjWidget; // 亮度调整 + DevCollaborationWidget *m_collaborationWidget; // 跨端协同 + QPushButton *m_settingBtn; // 设置按钮 +}; + + +#endif // DISPLAY_SETTING_WIDGET_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 0cc5141db..bf318e80f 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -32,6 +32,7 @@ #include "pluginchildpage.h" #include "volumemodel.h" #include "utils.h" +#include "displaysettingwidget.h" #include #include @@ -68,6 +69,7 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_volumnWidget(new VolumeWidget(m_volumeModel, m_componentWidget)) , m_brihtnessWidget(new BrightnessWidget(m_brightnessModel, m_componentWidget)) , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumeModel, this)) + , m_displaySettingWidget(new DisplaySettingWidget(this)) , m_childPage(new PluginChildPage(this)) , m_dragPluginPosition(QPoint(0, 0)) { @@ -341,7 +343,7 @@ void QuickSettingContainer::initConnection() connect(m_brihtnessWidget->sliderContainer(), &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &iconPosition) { if (iconPosition == SliderContainer::RightIcon) { // 点击右侧的按钮,弹出具体的调节的界面 - // showWidget(m_brightSettingWidget, tr("brightness")); + showWidget(m_displaySettingWidget, tr("brightness")); resizeView(); } }); diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 0ee1a4452..e0aaf853e 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -44,6 +44,7 @@ class VolumeDevicesWidget; class QLabel; class PluginChildPage; class QGridLayout; +class DisplaySettingWidget; DWIDGET_USE_NAMESPACE @@ -103,6 +104,7 @@ private: BrightnessWidget *m_brihtnessWidget; VolumeDevicesWidget *m_volumeSettingWidget; + DisplaySettingWidget *m_displaySettingWidget; PluginChildPage *m_childPage; QPoint m_dragPluginPosition; }; From fba15f118a4a6992940a5137d4dcbabb20e5b6b2 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 22 Sep 2022 04:48:04 +0000 Subject: [PATCH 082/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=9C=A8=E5=89=AF=E5=B1=8F=E4=B8=8A=E6=96=B9?= =?UTF-8?q?=E9=BC=A0=E6=A0=87=E8=B7=9F=E9=9A=8F=E6=9C=AA=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E5=88=B0=E5=B7=A6=E4=BE=A7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:任务栏修改位置从下到上方的时候,未更新XEventMonitor监听的位置,所以在鼠标移入主屏幕的时候没有响应cursorMove信号,导致任务栏没有移动 Log: 修复任务栏在副屏上方鼠标跟随未移动到左侧的问题 Influence: 开启鼠标跟随,任务栏默认在主屏,鼠标移动到副屏幕,任务栏跟随到副屏幕,改变任务栏位置为上,此时任务栏在副屏幕的上方,将鼠标移动到主屏幕的上方,观察任务栏是否移动到主屏幕的上方 Bug: https://pms.uniontech.com/bug-view-147641.html Change-Id: Ie1265f14509b582325adca2f542c4dc0af1fc53c --- frame/window/mainwindowbase.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index 1ec2c9faf..82ff30e5d 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -568,11 +568,17 @@ void MainWindowBase::resizeEvent(QResizeEvent *event) } m_shadowMaskOptimizeTimer->start(); + + if (!isDraging()) + m_updateDragAreaTimer->start(); } void MainWindowBase::moveEvent(QMoveEvent *) { updateDragGeometry(); + + if (!isDraging()) + m_updateDragAreaTimer->start(); } void MainWindowBase::enterEvent(QEvent *e) From 54596580fb616a4efdceec51fc98d7aabd876801 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 22 Sep 2022 05:29:20 +0000 Subject: [PATCH 083/257] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E4=B8=AD=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 控制中心设置任务栏插件已经移动到dde-control-center中,此处不再需要,删除 Log: 个性化任务栏插件移动到控制中心 Influence: 无 Task: https://pms.uniontech.com/task-view-130353.html Change-Id: I4d94f46fb1c6d6ad61f46334742f736dd7291245 --- plugins/dcc-dock-plugin/.tx/config | 10 - plugins/dcc-dock-plugin/CMakeLists.txt | 53 --- .../actions/icon_dock_32px.svg | 7 - .../dcc-dock-plugin/com_deepin_dde_dock.cpp | 102 ---- plugins/dcc-dock-plugin/com_deepin_dde_dock.h | 158 ------- plugins/dcc-dock-plugin/config_watcher.cpp | 91 ---- plugins/dcc-dock-plugin/config_watcher.h | 59 --- .../dde.dock.plugin.dconfig.json | 72 --- plugins/dcc-dock-plugin/dock_settings.json | 3 - plugins/dcc-dock-plugin/module_widget.cpp | 439 ------------------ plugins/dcc-dock-plugin/module_widget.h | 100 ---- plugins/dcc-dock-plugin/resources.qrc | 41 -- plugins/dcc-dock-plugin/settings_module.cpp | 151 ------ plugins/dcc-dock-plugin/settings_module.h | 91 ---- .../texts/dcc_dock_assistant_16px.svg | 15 - .../texts/dcc_dock_desktop_16px.svg | 7 - .../texts/dcc_dock_grandsearch_16px.svg | 9 - .../texts/dcc_dock_keyboard_16px.svg | 7 - .../texts/dcc_dock_notify_16px.svg | 7 - .../texts/dcc_dock_plug_in_16px.svg | 7 - .../texts/dcc_dock_power_16px.svg | 7 - .../texts/dcc_dock_systemmonitor_16px.svg | 9 - .../texts/dcc_dock_task_16px.svg | 7 - .../texts/dcc_dock_time_16px.svg | 9 - .../texts/dcc_dock_trash_16px.svg | 9 - .../dcc-dock-plugin/translate_generation.sh | 11 - .../translations/dcc-dock-plugin.ts | 173 ------- .../translations/dcc-dock-plugin_az.ts | 173 ------- .../translations/dcc-dock-plugin_bo.ts | 173 ------- .../translations/dcc-dock-plugin_ca.ts | 173 ------- .../translations/dcc-dock-plugin_cs.ts | 173 ------- .../translations/dcc-dock-plugin_de.ts | 173 ------- .../translations/dcc-dock-plugin_el.ts | 130 ------ .../translations/dcc-dock-plugin_en_US.ts | 175 ------- .../translations/dcc-dock-plugin_es.ts | 173 ------- .../translations/dcc-dock-plugin_fi.ts | 173 ------- .../translations/dcc-dock-plugin_fr.ts | 130 ------ .../translations/dcc-dock-plugin_hr.ts | 130 ------ .../translations/dcc-dock-plugin_hu.ts | 173 ------- .../translations/dcc-dock-plugin_it.ts | 173 ------- .../translations/dcc-dock-plugin_ms.ts | 130 ------ .../translations/dcc-dock-plugin_nl.ts | 173 ------- .../translations/dcc-dock-plugin_pl.ts | 173 ------- .../translations/dcc-dock-plugin_pt.ts | 173 ------- .../translations/dcc-dock-plugin_pt_BR.ts | 173 ------- .../translations/dcc-dock-plugin_ru.ts | 173 ------- .../translations/dcc-dock-plugin_sq.ts | 173 ------- .../translations/dcc-dock-plugin_tr.ts | 173 ------- .../translations/dcc-dock-plugin_ug.ts | 173 ------- .../translations/dcc-dock-plugin_uk.ts | 173 ------- .../translations/dcc-dock-plugin_zh_CN.ts | 173 ------- .../translations/dcc-dock-plugin_zh_HK.ts | 173 ------- .../translations/dcc-dock-plugin_zh_TW.ts | 173 ------- 53 files changed, 5982 deletions(-) delete mode 100644 plugins/dcc-dock-plugin/.tx/config delete mode 100644 plugins/dcc-dock-plugin/CMakeLists.txt delete mode 100644 plugins/dcc-dock-plugin/actions/icon_dock_32px.svg delete mode 100644 plugins/dcc-dock-plugin/com_deepin_dde_dock.cpp delete mode 100644 plugins/dcc-dock-plugin/com_deepin_dde_dock.h delete mode 100644 plugins/dcc-dock-plugin/config_watcher.cpp delete mode 100644 plugins/dcc-dock-plugin/config_watcher.h delete mode 100644 plugins/dcc-dock-plugin/dde.dock.plugin.dconfig.json delete mode 100644 plugins/dcc-dock-plugin/dock_settings.json delete mode 100644 plugins/dcc-dock-plugin/module_widget.cpp delete mode 100644 plugins/dcc-dock-plugin/module_widget.h delete mode 100644 plugins/dcc-dock-plugin/resources.qrc delete mode 100644 plugins/dcc-dock-plugin/settings_module.cpp delete mode 100644 plugins/dcc-dock-plugin/settings_module.h delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_assistant_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_desktop_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_grandsearch_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_keyboard_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_notify_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_plug_in_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_power_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_systemmonitor_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_task_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_time_16px.svg delete mode 100644 plugins/dcc-dock-plugin/texts/dcc_dock_trash_16px.svg delete mode 100755 plugins/dcc-dock-plugin/translate_generation.sh delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_az.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_bo.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ca.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_cs.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_de.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_el.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_en_US.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_es.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_fi.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_fr.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_hr.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_hu.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_it.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ms.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_nl.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pl.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pt.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pt_BR.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ru.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_sq.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_tr.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ug.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_uk.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_CN.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_HK.ts delete mode 100644 plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_TW.ts diff --git a/plugins/dcc-dock-plugin/.tx/config b/plugins/dcc-dock-plugin/.tx/config deleted file mode 100644 index fa112435f..000000000 --- a/plugins/dcc-dock-plugin/.tx/config +++ /dev/null @@ -1,10 +0,0 @@ -[main] -host = https://www.transifex.com -minimum_perc = 80 -mode = developer - -[deepin-desktop-environment.dcc-dock-plugin] -file_filter = translations/dcc-dock-plugin_.ts -source_file = translations/dcc-dock-plugin.ts -source_lang = en -type = QT diff --git a/plugins/dcc-dock-plugin/CMakeLists.txt b/plugins/dcc-dock-plugin/CMakeLists.txt deleted file mode 100644 index 0c5144277..000000000 --- a/plugins/dcc-dock-plugin/CMakeLists.txt +++ /dev/null @@ -1,53 +0,0 @@ -cmake_minimum_required(VERSION 3.7) - -set(PLUGIN_NAME "dcc-dock-plugin") - -project(${PLUGIN_NAME}) - -set(CMAKE_AUTOMOC ON) - -file(GLOB_RECURSE SRCS - "*.h" - "*.cpp") - -find_package(Qt5 COMPONENTS Core Widgets DBus Svg LinguistTools REQUIRED) -find_package(DdeControlCenter REQUIRED) -find_package(PkgConfig REQUIRED) -find_package(DtkWidget REQUIRED) - -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) -pkg_check_modules(QGSettings REQUIRED gsettings-qt) - -add_library(${PLUGIN_NAME} SHARED ${SRCS} resources.qrc) -set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./) -target_include_directories(${PLUGIN_NAME} PUBLIC - ../src - ../../frame/util - ${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Svg_INCLUDE_DIRS} - ${DtkWidget_INCLUDE_DIRS} - ${DdeControlCenter_INCLUDE_DIR} - ${DFrameworkDBus_INCLUDE_DIRS} - ${QGSettings_INCLUDE_DIRS} - ${Qt5DBus_INCLUDE_DIRS} - ) -target_link_libraries(${PLUGIN_NAME} PRIVATE - ${Qt5Widgets_LIBRARIES} - ${Qt5Svg_LIBRARIES} - ${DtkWidget_LIBRARIES} - ${DdeControlCenter_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} - ${QGSettings_LIBRARIES} - ${Qt5DBus_LIBRARIES} - ) - -file(GLOB TS_FILES "translations/*.ts") -qt5_add_translation(QM_FILES ${TS_FILES}) -add_custom_target(translations ALL DEPENDS ${QM_FILES}) -install(FILES ${QM_FILES} DESTINATION share/${PLUGIN_NAME}/translations) - -# dconfig -file(GLOB DCONFIG_FILES "dde.dock.plugin.dconfig.json") -dconfig_meta_files(APPID dde-control-center FILES ${DCONFIG_FILES}) - -install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-control-center/modules) diff --git a/plugins/dcc-dock-plugin/actions/icon_dock_32px.svg b/plugins/dcc-dock-plugin/actions/icon_dock_32px.svg deleted file mode 100644 index a9aa35d8f..000000000 --- a/plugins/dcc-dock-plugin/actions/icon_dock_32px.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - list2_icon/dock/normal - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/com_deepin_dde_dock.cpp b/plugins/dcc-dock-plugin/com_deepin_dde_dock.cpp deleted file mode 100644 index 67aca4e32..000000000 --- a/plugins/dcc-dock-plugin/com_deepin_dde_dock.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp-fix version 0.8 - * Command line was: qdbusxml2cpp-fix -c Dock -p com_deepin_dde_dock com.deepin.dde.Dock.xml - * - * qdbusxml2cpp-fix is Copyright (C) 2016 Deepin Technology Co., Ltd. - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "com_deepin_dde_dock.h" - -/* - * Implementation of interface class _Dock - */ - -class _DockPrivate -{ -public: - _DockPrivate() = default; - - // begin member variables - bool showInPrimary; - -public: - QMap m_processingCalls; - QMap> m_waittingCalls; -}; - -_Dock::_Dock(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : DBusExtendedAbstractInterface(service, path, staticInterfaceName(), connection, parent) - , d_ptr(new _DockPrivate) -{ - connect(this, &_Dock::propertyChanged, this, &_Dock::onPropertyChanged); - -} - -_Dock::~_Dock() -{ - qDeleteAll(d_ptr->m_processingCalls.values()); - delete d_ptr; -} - -void _Dock::onPropertyChanged(const QString &propName, const QVariant &value) -{ - if (propName == QStringLiteral("showInPrimary")) - { - const bool &showInPrimary = qvariant_cast(value); - if (d_ptr->showInPrimary != showInPrimary) - { - d_ptr->showInPrimary = showInPrimary; - Q_EMIT ShowInPrimaryChanged(d_ptr->showInPrimary); - } - return; - } - - qWarning() << "property not handle: " << propName; - return; -} - -bool _Dock::showInPrimary() -{ - return qvariant_cast(internalPropGet("showInPrimary", &d_ptr->showInPrimary)); -} - -void _Dock::setShowInPrimary(bool value) -{ - - internalPropSet("showInPrimary", QVariant::fromValue(value), &d_ptr->showInPrimary); -} - -void _Dock::CallQueued(const QString &callName, const QList &args) -{ - if (d_ptr->m_waittingCalls.contains(callName)) - { - d_ptr->m_waittingCalls[callName] = args; - return; - } - if (d_ptr->m_processingCalls.contains(callName)) - { - d_ptr->m_waittingCalls.insert(callName, args); - } else { - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(asyncCallWithArgumentList(callName, args)); - connect(watcher, &QDBusPendingCallWatcher::finished, this, &_Dock::onPendingCallFinished); - d_ptr->m_processingCalls.insert(callName, watcher); - } -} - -void _Dock::onPendingCallFinished(QDBusPendingCallWatcher *w) -{ - w->deleteLater(); - const auto callName = d_ptr->m_processingCalls.key(w); - Q_ASSERT(!callName.isEmpty()); - if (callName.isEmpty()) - return; - d_ptr->m_processingCalls.remove(callName); - if (!d_ptr->m_waittingCalls.contains(callName)) - return; - const auto args = d_ptr->m_waittingCalls.take(callName); - CallQueued(callName, args); -} diff --git a/plugins/dcc-dock-plugin/com_deepin_dde_dock.h b/plugins/dcc-dock-plugin/com_deepin_dde_dock.h deleted file mode 100644 index f2b3d89b6..000000000 --- a/plugins/dcc-dock-plugin/com_deepin_dde_dock.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp-fix version 0.8 - * Command line was: qdbusxml2cpp-fix -c Dock -p com_deepin_dde_dock com.deepin.dde.Dock.xml - * - * qdbusxml2cpp-fix is Copyright (C) 2016 Deepin Technology Co., Ltd. - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef COM_DEEPIN_DDE_DOCK_H -#define COM_DEEPIN_DDE_DOCK_H - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -/* - * Proxy class for interface com.deepin.dde.Dock - */ -class _DockPrivate; -class _Dock : public DBusExtendedAbstractInterface -{ - Q_OBJECT - -public: - static inline const char *staticInterfaceName() - { return "com.deepin.dde.Dock"; } - -public: - explicit _Dock(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); - - ~_Dock(); - - Q_PROPERTY(bool showInPrimary READ showInPrimary WRITE setShowInPrimary NOTIFY ShowInPrimaryChanged) - bool showInPrimary(); - void setShowInPrimary(bool value); - -public Q_SLOTS: // METHODS - inline QDBusPendingReply GetLoadedPlugins() - { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("GetLoadedPlugins"), argumentList); - } - - - - inline QDBusPendingReply<> ReloadPlugins() - { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("ReloadPlugins"), argumentList); - } - - inline void ReloadPluginsQueued() - { - QList argumentList; - - CallQueued(QStringLiteral("ReloadPlugins"), argumentList); - } - - - inline QDBusPendingReply<> callShow() - { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("callShow"), argumentList); - } - - inline void callShowQueued() - { - QList argumentList; - - CallQueued(QStringLiteral("callShow"), argumentList); - } - - - inline QDBusPendingReply getPluginKey(const QString &pluginName) - { - QList argumentList; - argumentList << QVariant::fromValue(pluginName); - return asyncCallWithArgumentList(QStringLiteral("getPluginKey"), argumentList); - } - - - - inline QDBusPendingReply getPluginVisible(const QString &pluginName) - { - QList argumentList; - argumentList << QVariant::fromValue(pluginName); - return asyncCallWithArgumentList(QStringLiteral("getPluginVisible"), argumentList); - } - - - - inline QDBusPendingReply<> resizeDock(int offset, bool dragging) - { - QList argumentList; - argumentList << QVariant::fromValue(offset) << QVariant::fromValue(dragging); - return asyncCallWithArgumentList(QStringLiteral("resizeDock"), argumentList); - } - - inline void resizeDockQueued(int offset, bool dragging) - { - QList argumentList; - argumentList << QVariant::fromValue(offset) << QVariant::fromValue(dragging); - - CallQueued(QStringLiteral("resizeDock"), argumentList); - } - - - inline QDBusPendingReply<> setPluginVisible(const QString &pluginName, bool visible) - { - QList argumentList; - argumentList << QVariant::fromValue(pluginName) << QVariant::fromValue(visible); - return asyncCallWithArgumentList(QStringLiteral("setPluginVisible"), argumentList); - } - - inline void setPluginVisibleQueued(const QString &pluginName, bool visible) - { - QList argumentList; - argumentList << QVariant::fromValue(pluginName) << QVariant::fromValue(visible); - - CallQueued(QStringLiteral("setPluginVisible"), argumentList); - } - - - -Q_SIGNALS: // SIGNALS - void pluginVisibleChanged(const QString &in0, bool in1); - // begin property changed signals - void ShowInPrimaryChanged(bool value) const; - -public Q_SLOTS: - void CallQueued(const QString &callName, const QList &args); - -private Q_SLOTS: - void onPendingCallFinished(QDBusPendingCallWatcher *w); - void onPropertyChanged(const QString &propName, const QVariant &value); - -private: - _DockPrivate *d_ptr; -}; - -namespace com { - namespace deepin { - namespace dde { - typedef ::_Dock Dock; - } - } -} -#endif diff --git a/plugins/dcc-dock-plugin/config_watcher.cpp b/plugins/dcc-dock-plugin/config_watcher.cpp deleted file mode 100644 index 3363bf491..000000000 --- a/plugins/dcc-dock-plugin/config_watcher.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2021 Uniontech Technology Co., Ltd. - * - * Author: fanpengcheng - * - * Maintainer: fanpengcheng - * - * 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 . - */ -#include "config_watcher.h" -#include "utils.h" - -#include -#include -#include -#include -#include -#include - -#include - -using namespace dcc_dock_plugin; - -DCORE_USE_NAMESPACE -/** - * @brief GSettingWatcher::GSettingWatcher 用于监听处于 \a baseSchemasId + "." + \a module 配置下的配置项内容变化,并将变化应用到绑定的控件上 - */ -ConfigWatcher::ConfigWatcher(const QString &fileName, QObject *parent) - : QObject(parent) - , m_config(new DConfig(fileName, QString(), this)) -{ - if (m_config->isValid()) { - connect(m_config, &DConfig::valueChanged, this, &ConfigWatcher::onStatusModeChanged); - } else { - qWarning() << "config parse failed:" << fileName; - } -} - -ConfigWatcher::~ConfigWatcher() -{ - m_map.clear(); -} - -void ConfigWatcher::bind(const QString &key, QWidget *binder) -{ - m_map.insert(key, binder); - - setStatus(key, binder); - // 自动解绑 - connect(binder, &QObject::destroyed, this, [=] { - m_map.remove(m_map.key(binder), binder); - }); -} - -void ConfigWatcher::setStatus(const QString &key, QWidget *binder) -{ - if (!binder || !m_config->isValid() || !m_config->keyList().contains(key)) - return; - - const QString setting = m_config->value(key).toString(); - - if ("Enabled" == setting) { - binder->setEnabled(true); - } else if ("Disabled" == setting) { - binder->setEnabled(false); - } - - binder->setVisible("Hidden" != setting); -} - -void ConfigWatcher::onStatusModeChanged(const QString &key) -{ - if (!m_map.isEmpty() && m_map.contains(key)) { - for (auto it = m_map.begin(); it != m_map.end(); ++it) { - if (key == it.key()) { - setStatus(key, it.value()); - } - } - } -} diff --git a/plugins/dcc-dock-plugin/config_watcher.h b/plugins/dcc-dock-plugin/config_watcher.h deleted file mode 100644 index c8b2a2d63..000000000 --- a/plugins/dcc-dock-plugin/config_watcher.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2021 Uniontech Technology Co., Ltd. - * - * Author: fanpengcheng - * - * Maintainer: fanpengcheng - * - * 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 . - */ -#ifndef GSETTINGWATCHER_H -#define GSETTINGWATCHER_H - -#include - -#include -#include -#include - -class QGSettings; -class QListView; -class QStandardItem; - -DCORE_BEGIN_NAMESPACE -class DConfig; -DCORE_END_NAMESPACE - -namespace dcc_dock_plugin { -class ConfigWatcher : public QObject -{ - Q_OBJECT - -public: - ConfigWatcher(const QString &fileName, QObject *parent = nullptr); - ~ConfigWatcher(); - - void bind(const QString &key, QWidget *binder); - -private: - void setStatus(const QString &key, QWidget *binder); - void onStatusModeChanged(const QString &key); - -private: - QMultiHash m_map; - DTK_CORE_NAMESPACE::DConfig *m_config; -}; -} - -#endif // GSETTINGWATCHER_H diff --git a/plugins/dcc-dock-plugin/dde.dock.plugin.dconfig.json b/plugins/dcc-dock-plugin/dde.dock.plugin.dconfig.json deleted file mode 100644 index 2400142eb..000000000 --- a/plugins/dcc-dock-plugin/dde.dock.plugin.dconfig.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "magic":"dsg.config.meta", - "version":"1.0", - "contents":{ - "Control-Center_Dock_Model":{ - "value":"Enabled", - "serial":0, - "flags":"", - "name":"Model", - "name[zh_CN]":"模式", - "description[zh_CN]":"此配置为模式选择功能的是否启用,默认为启用;当配置为启用时,该设置项可以设置;当配置为禁用时,该设置项置灰;当配置为隐藏时,该设置项隐藏;", - "description":"", - "permissions":"readwrite", - "visibility":"public" - }, - "Control-Center_Dock_Location":{ - "value":"Enabled", - "serial":0, - "flags":"", - "name":"Location", - "name[zh_CN]":"位置", - "description[zh_CN]":"此配置为位置选择功能的是否启用,默认为启用;当配置为启用时,该设置项可以设置;当配置为禁用时,该设置项置灰;当配置为隐藏时,该设置项隐藏;", - "description":"", - "permissions":"readwrite", - "visibility":"public" - }, - "Control-Center_Dock_State":{ - "value":"Enabled", - "serial":0, - "flags":"", - "name":"State", - "name[zh_CN]":"状态", - "description[zh_CN]":"此配置为状态选择功能的是否启用,默认为启用;当配置为启用时,该设置项可以设置;当配置为禁用时,该设置项置灰;当配置为隐藏时,该设置项隐藏;", - "description":"", - "permissions":"readwrite", - "visibility":"public" - }, - "Control-Center_Dock_Size":{ - "value":"Enabled", - "serial":0, - "flags":"", - "name":"Size", - "name[zh_CN]":"调整大小", - "description[zh_CN]":"此配置为调整大小功能的是否启用,默认为启用;当配置为启用时,该设置项可以设置;当配置为禁用时,该设置项置灰;当配置为隐藏时,该设置项隐藏;", - "description":"", - "permissions":"readwrite", - "visibility":"public" - }, - "Control-Center_Dock_Multi-screen":{ - "value":"Enabled", - "serial":0, - "flags":"", - "name":"Multi-screen", - "name[zh_CN]":"多屏显示设置", - "description[zh_CN]":"此配置为多屏显示设置项功能的是否启用,默认为启用;当配置为启用时,该设置项可以设置;当配置为禁用时,该设置项置灰;当配置为隐藏时,该设置项隐藏;", - "description":"", - "permissions":"readwrite", - "visibility":"public" - }, - "Control-Center_Dock_Plugins":{ - "value":"Enabled", - "serial":0, - "flags":"", - "name":"Plugins", - "name[zh_CN]":"插件", - "description[zh_CN]":"此配置为插件显示功能的是否启用,默认为启用;当配置为启用时,该设置项可以设置;当配置为禁用时,该设置项置灰;当配置为隐藏时,该设置项隐藏;", - "description":"", - "permissions":"readwrite", - "visibility":"public" - } - } -} \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/dock_settings.json b/plugins/dcc-dock-plugin/dock_settings.json deleted file mode 100644 index dbc6b7b2e..000000000 --- a/plugins/dcc-dock-plugin/dock_settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api" : "1.0.0" -} \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/module_widget.cpp b/plugins/dcc-dock-plugin/module_widget.cpp deleted file mode 100644 index 89c4df202..000000000 --- a/plugins/dcc-dock-plugin/module_widget.cpp +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2021 Uniontech Technology Co., Ltd. - * - * Author: fanpengcheng - * - * Maintainer: fanpengcheng - * - * 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 . - */ -#include "module_widget.h" -#include "utils.h" - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -enum DisplayMode { - Fashion = 0, - Efficient = 1, -}; - -enum HideMode { - KeepShowing = 0, - KeepHidden = 1, - SmartHide = 3, -}; - -enum Position { - Top = 0, - Right = 1, - Bottom = 2, - Left = 3, -}; - -#ifdef USE_AM -static const QString serviceName = QString("org.deepin.dde.daemon.Dock1"); -static const QString servicePath = QString("org.deepin.dde.daemon.Dock1"); -#else -static const QString serviceName = QString("com.deepin.dde.daemon.Dock"); -static const QString servicePath = QString("/com/deepin/dde/daemon/Dock"); -#endif - -ModuleWidget::ModuleWidget(QWidget *parent) - : QScrollArea(parent) - , m_modeComboxWidget(new ComboxWidget(this)) - , m_positionComboxWidget(new ComboxWidget(this)) - , m_stateComboxWidget(new ComboxWidget(this)) - , m_screenSettingComboxWidget(new ComboxWidget(this)) - , m_pluginTips(new DTipLabel(tr("Select which icons appear in the Dock"), this)) - , m_pluginView(new DListView(this)) - , m_pluginModel(new QStandardItemModel(this)) - , m_daemonDockInter(new DBusDock(serviceName, servicePath, QDBusConnection::sessionBus(), this)) - , m_dockInter(new DBusInter("com.deepin.dde.Dock", "/com/deepin/dde/Dock", QDBusConnection::sessionBus(), this)) - , m_dconfigWatcher(new ConfigWatcher("dde.dock.plugin.dconfig", this)) - , m_sliderPressed(false) -{ - //~ contents_path /personalization/Dock - //~ child_page Dock - m_pluginAreaTitle = new TitleLabel(tr("Plugin Area"), this); - - //~ contents_path /personalization/Dock - //~ child_page Dock - m_sizeSlider = new TitledSliderItem(tr("Size"), this); - - //~ contents_path /personalization/Dock - //~ child_page Dock - m_screenSettingTitle = new TitleLabel(tr("Multiple Displays"), this); - - // 异步,否则频繁调用可能会导致卡顿 - m_daemonDockInter->setSync(false); - initUI(); - - connect(m_dockInter, &DBusInter::pluginVisibleChanged, this, &ModuleWidget::updateItemCheckStatus); -} - -ModuleWidget::~ModuleWidget() -{ -} - -void ModuleWidget::initUI() -{ - setBackgroundRole(QPalette::Base); - setFrameShape(QFrame::NoFrame); - setWidgetResizable(true); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - QVBoxLayout *layout = new QVBoxLayout; - layout->setContentsMargins(10, 10, 10, 10); - layout->setSpacing(10); - - static QMap g_modeMap = {{tr("Fashion mode"), Fashion} - , {tr("Efficient mode"), Efficient}}; - // 模式 - if (Utils::SettingValue("com.deepin.dde.dock.module.menu", QByteArray(), "modeVisible", true).toBool()) { - //~ contents_path /personalization/Dock - //~ child_page Dock - m_modeComboxWidget->setTitle(tr("Mode")); - m_modeComboxWidget->addBackground(); - m_modeComboxWidget->setComboxOption(QStringList() << tr("Fashion mode") << tr("Efficient mode")); - m_modeComboxWidget->setCurrentText(g_modeMap.key(m_daemonDockInter->displayMode())); - connect(m_modeComboxWidget, &ComboxWidget::onSelectChanged, this, [ = ] (const QString &text) { - m_daemonDockInter->setDisplayMode(g_modeMap.value(text)); - }); - connect(m_daemonDockInter, &DBusDock::DisplayModeChanged, this, [ = ] (int value) { - DisplayMode mode = static_cast(value); - if (g_modeMap.key(mode) == m_modeComboxWidget->comboBox()->currentText()) - return; - - m_modeComboxWidget->setCurrentText(g_modeMap.key(mode)); - }); - layout->addWidget(m_modeComboxWidget); - m_dconfigWatcher->bind("Control-Center_Dock_Model", m_modeComboxWidget); - } else { - m_modeComboxWidget->setVisible(false); - } - - if (Utils::SettingValue("com.deepin.dde.dock.module.menu", QByteArray(), "locationVisible", true).toBool()) { - // 位置 - static QMap g_positionMap = {{tr("Top"), Top} - , {tr("Bottom"), Bottom} - , {tr("Left"), Left} - , {tr("Right"), Right}}; - - //~ contents_path /personalization/Dock - //~ child_page Dock - m_positionComboxWidget->setTitle(tr("Location")); - m_positionComboxWidget->addBackground(); - m_positionComboxWidget->setComboxOption(QStringList() << tr("Top") << tr("Bottom") << tr("Left") << tr("Right")); - m_positionComboxWidget->setCurrentText(g_positionMap.key(m_daemonDockInter->position())); - connect(m_positionComboxWidget, &ComboxWidget::onSelectChanged, this, [ = ] (const QString &text) { - m_daemonDockInter->setPosition(g_positionMap.value(text)); - }); - connect(m_daemonDockInter, &DBusDock::PositionChanged, this, [ = ] (int position) { - Position pos = static_cast(position); - if (g_positionMap.key(pos) == m_positionComboxWidget->comboBox()->currentText()) - return; - - m_positionComboxWidget->setCurrentText(g_positionMap.key(pos)); - }); - layout->addWidget(m_positionComboxWidget); - m_dconfigWatcher->bind("Control-Center_Dock_Location", m_positionComboxWidget); - } else { - m_positionComboxWidget->setVisible(false); - } - - // 状态 - if (Utils::SettingValue("com.deepin.dde.dock.module.menu", QByteArray(), "statusVisible", true).toBool()) { - static QMap g_stateMap = {{tr("Keep shown"), KeepShowing} - , {tr("Keep hidden"), KeepHidden} - , {tr("Smart hide"), SmartHide}}; - - //~ contents_path /personalization/Dock - //~ child_page Dock - m_stateComboxWidget->setTitle(tr("Status")); - m_stateComboxWidget->addBackground(); - m_stateComboxWidget->setComboxOption(QStringList() << tr("Keep shown") << tr("Keep hidden") << tr("Smart hide")); - m_stateComboxWidget->setCurrentText(g_stateMap.key(m_daemonDockInter->hideMode())); - connect(m_stateComboxWidget, &ComboxWidget::onSelectChanged, this, [ = ] (const QString &text) { - m_daemonDockInter->setHideMode(g_stateMap.value(text)); - }); - connect(m_daemonDockInter, &DBusDock::HideModeChanged, this, [ = ] (int value) { - HideMode mode = static_cast(value); - if (g_stateMap.key(mode) == m_stateComboxWidget->comboBox()->currentText()) - return; - - m_stateComboxWidget->setCurrentText(g_stateMap.key(mode)); - }); - layout->addWidget(m_stateComboxWidget); - m_dconfigWatcher->bind("Control-Center_Dock_State", m_stateComboxWidget); - } else { - m_stateComboxWidget->setVisible(false); - } - - // 高度调整控件 - m_sizeSlider->addBackground(); - m_sizeSlider->slider()->setRange(40, 100); - QStringList ranges; - ranges << tr("Small") << "" << tr("Large"); - m_sizeSlider->setAnnotations(ranges); - connect(m_daemonDockInter, &DBusDock::DisplayModeChanged, this, &ModuleWidget::updateSliderValue); - connect(m_daemonDockInter, &DBusDock::WindowSizeFashionChanged, this, &ModuleWidget::updateSliderValue); - connect(m_daemonDockInter, &DBusDock::WindowSizeEfficientChanged, this, &ModuleWidget::updateSliderValue); - connect(m_sizeSlider->slider(), &DSlider::sliderMoved, m_sizeSlider->slider(), &DSlider::valueChanged); - connect(m_sizeSlider->slider(), &DSlider::valueChanged, this, [ = ] (int value) { - m_dockInter->resizeDock(value, true); - }); - connect(m_sizeSlider->slider(), &DSlider::sliderPressed, m_dockInter, [ = ] { - m_daemonDockInter->blockSignals(true); - m_sliderPressed = true; - }); - connect(m_sizeSlider->slider(), &DSlider::sliderReleased, m_dockInter, [ = ] { - m_daemonDockInter->blockSignals(false); - m_sliderPressed = false; - - // 松开手后通知dock拖拽状态接触 - QTimer::singleShot(0, this, [ = ] { - int offset = m_sizeSlider->slider()->value(); - m_dockInter->resizeDock(offset, false); - }); - }); - - updateSliderValue(); - m_dconfigWatcher->bind("Control-Center_Dock_Size", m_sizeSlider); - - layout->addWidget(m_sizeSlider); - - // 多屏显示设置 - if (QDBusConnection::sessionBus().interface()->isServiceRegistered("com.deepin.dde.Dock") - && QApplication::screens().size() > 1 - && !isCopyMode() - && Utils::SettingValue("com.deepin.dde.dock.module.menu", QByteArray(), "multiscreenVisible", true).toBool()) { - static QMap g_screenSettingMap = {{tr("On screen where the cursor is"), false} - , {tr("Only on main screen"), true}}; - - layout->addSpacing(10); - layout->addWidget(m_screenSettingTitle); - m_screenSettingComboxWidget->setTitle(tr("Show Dock")); - m_screenSettingComboxWidget->addBackground(); - m_screenSettingComboxWidget->setComboxOption(QStringList() << tr("On screen where the cursor is") << tr("Only on main screen")); - m_screenSettingComboxWidget->setCurrentText(g_screenSettingMap.key(m_dockInter->showInPrimary())); - connect(m_screenSettingComboxWidget, &ComboxWidget::onSelectChanged, this, [ = ] (const QString &text) { - m_dockInter->setShowInPrimary(g_screenSettingMap.value(text)); - }); - connect(qApp, &QApplication::screenAdded, this, [ = ] { - m_screenSettingTitle->setVisible(qApp->screens().count() > 1); - m_screenSettingComboxWidget->setVisible(qApp->screens().count() > 1); - }); - connect(qApp, &QApplication::screenRemoved, this, [ = ] { - m_screenSettingTitle->setVisible(qApp->screens().count() > 1); - m_screenSettingComboxWidget->setVisible(qApp->screens().count() > 1); - }); - - // 这里不会生效,但实际场景中也不存在有其他可配置的地方,可以不用处理 - connect(m_dockInter, &DBusInter::ShowInPrimaryChanged, this, [ = ] (bool showInPrimary) { - if (m_screenSettingComboxWidget->comboBox()->currentText() == g_screenSettingMap.key(showInPrimary)) - return; - - m_screenSettingComboxWidget->blockSignals(true); - m_screenSettingComboxWidget->setCurrentText(g_screenSettingMap.key(showInPrimary)); - m_screenSettingComboxWidget->blockSignals(false); - }); - layout->addWidget(m_screenSettingComboxWidget); - m_dconfigWatcher->bind("Control-Center_Dock_Multi-screen", m_screenSettingTitle); - m_dconfigWatcher->bind("Control-Center_Dock_Multi-screen", m_screenSettingComboxWidget); - } else { - m_screenSettingTitle->setVisible(false); - m_screenSettingComboxWidget->setVisible(false); - } - - // 插件区域 - QDBusPendingReply reply = m_dockInter->GetLoadedPlugins(); - QStringList plugins = reply.value(); - if (reply.error().type() != QDBusError::ErrorType::NoError - || !Utils::SettingValue("com.deepin.dde.dock.module.menu", QByteArray(), "hideVisible", true).toBool()) { - m_pluginAreaTitle->setVisible(false); - m_pluginTips->setVisible(false); - m_pluginView->setVisible(false); - qWarning() << "dbus call failed, method: 'GetLoadedPlugins()'"; - } else { - const QMap &pluginIconMap = {{"AiAssistant", "dcc_dock_assistant"} - , {"show-desktop", "dcc_dock_desktop"} - , {"onboard", "dcc_dock_keyboard"} - , {"notifications", "dcc_dock_notify"} - , {"shutdown", "dcc_dock_power"} - , {"multitasking", "dcc_dock_task"} - , {"datetime", "dcc_dock_time"} - , {"system-monitor", "dcc_dock_systemmonitor"} - , {"grand-search", "dcc_dock_grandsearch"} - , {"trash", "dcc_dock_trash"}}; - if (plugins.size() != 0) { - layout->addSpacing(10); - layout->addWidget(m_pluginAreaTitle); - m_dconfigWatcher->bind("Control-Center_Dock_Plugins", m_pluginAreaTitle); - - DFontSizeManager::instance()->bind(m_pluginTips, DFontSizeManager::T8); - m_pluginTips->adjustSize(); - m_pluginTips->setWordWrap(true); - m_pluginTips->setContentsMargins(10, 5, 10, 5); - m_pluginTips->setAlignment(Qt::AlignLeft); - layout->addWidget(m_pluginTips); - m_dconfigWatcher->bind("Control-Center_Dock_Plugins", m_pluginTips); - - m_pluginView->setAccessibleName("pluginList"); - m_pluginView->setBackgroundType(DStyledItemDelegate::BackgroundType::ClipCornerBackground); - m_pluginView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_pluginView->setSelectionMode(QListView::SelectionMode::NoSelection); - m_pluginView->setEditTriggers(DListView::NoEditTriggers); - m_pluginView->setFrameShape(DListView::NoFrame); - m_pluginView->setViewportMargins(0, 0, 0, 0); - m_pluginView->setItemSpacing(1); - - QMargins itemMargins(m_pluginView->itemMargins()); - itemMargins.setLeft(14); - m_pluginView->setItemMargins(itemMargins); - - m_pluginView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - QScroller *scroller = QScroller::scroller(m_pluginView->viewport()); - QScrollerProperties sp; - sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); - scroller->setScrollerProperties(sp); - - m_pluginView->setModel(m_pluginModel); - - layout->addWidget(m_pluginView); - m_dconfigWatcher->bind("Control-Center_Dock_Plugins", m_pluginView); - - for (auto name : plugins) { - DStandardItem *item = new DStandardItem(name); - item->setFontSize(DFontSizeManager::T8); - QSize size(16, 16); - - // 插件图标 - auto leftAction = new DViewItemAction(Qt::AlignVCenter, size, size, true); - leftAction->setIcon(QIcon::fromTheme(pluginIconMap.value(m_dockInter->getPluginKey(name), "dcc_dock_plug_in"))); - item->setActionList(Qt::Edge::LeftEdge, {leftAction}); - - auto rightAction = new DViewItemAction(Qt::AlignVCenter, size, size, true); - bool visible = m_dockInter->getPluginVisible(name); - auto checkstatus = visible ? DStyle::SP_IndicatorChecked : DStyle::SP_IndicatorUnchecked ; - auto checkIcon = qobject_cast(style())->standardIcon(checkstatus); - rightAction->setIcon(checkIcon); - item->setActionList(Qt::Edge::RightEdge, {rightAction}); - m_pluginModel->appendRow(item); - - connect(rightAction, &DViewItemAction::triggered, this, [ = ] { - bool checked = m_dockInter->getPluginVisible(name); - m_dockInter->setPluginVisible(name, !checked); - updateItemCheckStatus(name, !checked); - }); - } - // 固定大小,防止滚动 - int lineHeight = m_pluginView->visualRect(m_pluginView->indexAt(QPoint(0, 0))).height(); - m_pluginView->setMinimumHeight(lineHeight * plugins.size() + 10); - } else { - m_pluginAreaTitle->setVisible(false); - m_pluginTips->setVisible(false); - m_pluginView->setVisible(false); - } - } - - // 支持在触摸屏上滚动 - QScroller::grabGesture(this->window(), QScroller::LeftMouseButtonGesture); - QScroller *scroller = QScroller::scroller(this->window()); - QScrollerProperties sp; - sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); - scroller->setScrollerProperties(sp); - - // 保持内容正常铺满 - layout->addStretch(); - - // 界面内容过多时可滚动查看 - QWidget *widget = new QWidget; - widget->setLayout(layout); - setWidget(widget); -} - -/**判断屏幕是否为复制模式的依据,第一个屏幕的X和Y值是否和其他的屏幕的X和Y值相等 - * 对于复制模式,这两个值肯定是相等的,如果不是复制模式,这两个值肯定不等,目前支持双屏 - * @brief DisplayManager::isCopyMode - * @return - */ -bool ModuleWidget::isCopyMode() -{ - QList screens = qApp->screens(); - if (screens.size() < 2) - return false; - - // 在多个屏幕的情况下,如果所有屏幕的位置的X和Y值都相等,则认为是复制模式 - QRect screenRect = screens[0]->availableGeometry(); - for (int i = 1; i < screens.size(); i++) { - QRect rect = screens[i]->availableGeometry(); - if (screenRect.x() != rect.x() || screenRect.y() != rect.y()) - return false; - } - - return true; -} - -void ModuleWidget::updateSliderValue() -{ - auto displayMode = m_daemonDockInter->displayMode(); - - m_sizeSlider->slider()->blockSignals(true); - if (displayMode == DisplayMode::Fashion) { - if (int(m_daemonDockInter->windowSizeFashion()) != m_sizeSlider->slider()->value()) - m_sizeSlider->slider()->setValue(int(m_daemonDockInter->windowSizeFashion())); - } else if (displayMode == DisplayMode::Efficient) { - if (int(m_daemonDockInter->windowSizeEfficient()) != m_sizeSlider->slider()->value()) - m_sizeSlider->slider()->setValue(int(m_daemonDockInter->windowSizeEfficient())); - } - m_sizeSlider->slider()->blockSignals(false); -} - -void ModuleWidget::updateItemCheckStatus(const QString &name, bool visible) -{ - for (int i = 0; i < m_pluginModel->rowCount(); ++i) { - auto item = static_cast(m_pluginModel->item(i)); - if (item->text() != name || item->actionList(Qt::Edge::RightEdge).size() < 1) - continue; - - auto action = item->actionList(Qt::Edge::RightEdge).first(); - auto checkstatus = visible ? DStyle::SP_IndicatorChecked : DStyle::SP_IndicatorUnchecked ; - auto icon = qobject_cast(style())->standardIcon(checkstatus); - action->setIcon(icon); - m_pluginView->update(item->index()); - break; - } -} diff --git a/plugins/dcc-dock-plugin/module_widget.h b/plugins/dcc-dock-plugin/module_widget.h deleted file mode 100644 index 50fd9103b..000000000 --- a/plugins/dcc-dock-plugin/module_widget.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2021 Uniontech Technology Co., Ltd. - * - * Author: fanpengcheng - * - * Maintainer: fanpengcheng - * - * 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 . - */ -#ifndef MODULE_WIDGET_H -#define MODULE_WIDGET_H - -#ifdef USE_AM -#include "dockinterface.h" -#else -#include -#endif - -#include - -#include - -#include "com_deepin_dde_dock.h" -#include "config_watcher.h" - -namespace dcc { -namespace widgets { -class ComboxWidget; -class TitledSliderItem; -} -} - -DWIDGET_BEGIN_NAMESPACE -class DListView; -class DTipLabel; -DWIDGET_END_NAMESPACE - -class TitleLabel; -class QStandardItemModel; - -using namespace dcc::widgets; -using namespace dcc_dock_plugin; - -#ifdef USE_AM -using DBusDock = org::deepin::dde::daemon::DdeDock; -#else -using DBusDock = com::deepin::dde::daemon::Dock; -#endif - -using DBusInter = com::deepin::dde::Dock; - -class ModuleWidget : public QScrollArea -{ - Q_OBJECT -public: - explicit ModuleWidget(QWidget *parent = nullptr); - ~ ModuleWidget(); - -private: - void initUI(); - bool isCopyMode(); - -private Q_SLOTS: - void updateSliderValue(); - void updateItemCheckStatus(const QString &name, bool visible); - -private: - ComboxWidget *m_modeComboxWidget; - ComboxWidget *m_positionComboxWidget; - ComboxWidget *m_stateComboxWidget; - - TitledSliderItem *m_sizeSlider; - - TitleLabel *m_screenSettingTitle; - ComboxWidget *m_screenSettingComboxWidget; - - TitleLabel *m_pluginAreaTitle; - DTK_WIDGET_NAMESPACE::DTipLabel *m_pluginTips; - DTK_WIDGET_NAMESPACE::DListView *m_pluginView; - QStandardItemModel *m_pluginModel; - - DBusDock *m_daemonDockInter; - DBusInter *m_dockInter; - ConfigWatcher *m_dconfigWatcher; - - bool m_sliderPressed; -}; - -#endif // MODULE_WIDGET_H diff --git a/plugins/dcc-dock-plugin/resources.qrc b/plugins/dcc-dock-plugin/resources.qrc deleted file mode 100644 index b56db9a9e..000000000 --- a/plugins/dcc-dock-plugin/resources.qrc +++ /dev/null @@ -1,41 +0,0 @@ - - - actions/icon_dock_32px.svg - texts/dcc_dock_time_16px.svg - texts/dcc_dock_assistant_16px.svg - texts/dcc_dock_desktop_16px.svg - texts/dcc_dock_keyboard_16px.svg - texts/dcc_dock_notify_16px.svg - texts/dcc_dock_plug_in_16px.svg - texts/dcc_dock_power_16px.svg - texts/dcc_dock_task_16px.svg - texts/dcc_dock_trash_16px.svg - texts/dcc_dock_grandsearch_16px.svg - texts/dcc_dock_systemmonitor_16px.svg - - - translations/dcc-dock-plugin.ts - translations/dcc-dock-plugin_bo.ts - translations/dcc-dock-plugin_az.ts - translations/dcc-dock-plugin_cs.ts - translations/dcc-dock-plugin_fi.ts - translations/dcc-dock-plugin_hu.ts - translations/dcc-dock-plugin_nl.ts - translations/dcc-dock-plugin_pt.ts - translations/dcc-dock-plugin_sq.ts - translations/dcc-dock-plugin_ug.ts - translations/dcc-dock-plugin_uk.ts - translations/dcc-dock-plugin_zh_CN.ts - translations/dcc-dock-plugin_zh_HK.ts - translations/dcc-dock-plugin_zh_TW.ts - translations/dcc-dock-plugin_de.ts - translations/dcc-dock-plugin_ca.ts - translations/dcc-dock-plugin_es.ts - translations/dcc-dock-plugin_hr.ts - translations/dcc-dock-plugin_it.ts - translations/dcc-dock-plugin_pl.ts - translations/dcc-dock-plugin_pt_BR.ts - translations/dcc-dock-plugin_ru.ts - translations/dcc-dock-plugin_en_US.ts - - diff --git a/plugins/dcc-dock-plugin/settings_module.cpp b/plugins/dcc-dock-plugin/settings_module.cpp deleted file mode 100644 index 9483ab447..000000000 --- a/plugins/dcc-dock-plugin/settings_module.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2021 Uniontech Technology Co., Ltd. - * - * Author: fanpengcheng - * - * Maintainer: fanpengcheng - * - * 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 . - */ -#include "settings_module.h" -#include "module_widget.h" -#include "config_watcher.h" - -#include - -#include -#include - -DWIDGET_USE_NAMESPACE -DCORE_USE_NAMESPACE - -SettingsModule::SettingsModule() - : QObject() - , ModuleInterface() - , m_moduleWidget(nullptr) - , m_config(new DConfig("dde.dock.plugin.dconfig", QString(), this)) -{ - QTranslator *translator = new QTranslator(this); - translator->load(QString("/usr/share/dcc-dock-plugin/translations/dcc-dock-plugin_%1.qm").arg(QLocale::system().name())); - QCoreApplication::installTranslator(translator); -} - -SettingsModule::~SettingsModule() -{ - -} - -void SettingsModule::initialize() -{ - -} - -void SettingsModule::active() -{ - m_moduleWidget = new ModuleWidget; - - m_frameProxy->pushWidget(this, m_moduleWidget); - m_moduleWidget->setVisible(true); -} - -QStringList SettingsModule::availPage() const -{ - return QStringList() << "Dock"; -} - -const QString SettingsModule::displayName() const -{ - return tr("Dock"); -} - -QIcon SettingsModule::icon() const -{ - return QIcon::fromTheme("icon_dock"); -} - -QString SettingsModule::translationPath() const -{ - return QString(":/translations/dcc-dock-plugin_%1.ts"); -} - -QString SettingsModule::path() const -{ - return PERSONALIZATION; -} - -QString SettingsModule::follow() const -{ - return "10"; -} - -const QString SettingsModule::name() const -{ - return QStringLiteral("Dock"); -} - -void SettingsModule::showPage(const QString &pageName) -{ - Q_UNUSED(pageName); -} - -void SettingsModule::addChildPageTrans() const -{ - if (!m_frameProxy) - return; - - m_frameProxy->addChildPageTrans("Dock", tr("Dock")); -} - -void SettingsModule::initSearchData() -{ - onStatusChanged(); - - if (m_config->isValid()) - connect(m_config, &DConfig::valueChanged, this, &SettingsModule::onStatusChanged); -} - -void SettingsModule::preInitialize(bool sync, FrameProxyInterface::PushType) -{ - Q_UNUSED(sync); - addChildPageTrans(); - initSearchData(); -} - -void SettingsModule::onStatusChanged() -{ - if (!m_frameProxy) - return; - - // 模块名称 - const QString &module = m_frameProxy->moduleDisplayName(PERSONALIZATION); - - // 子模块名称 - const QString &dock = tr("Dock"); - - // 二级菜单显示状态设置 - m_frameProxy->setWidgetVisible(module, dock, true); - - auto visibleState = [ = ](const QString &key) { - return (m_config->value(QString("%1").arg(key)).toString() == "Enabled"); - }; - - // 三级菜单显示状态设置 - m_frameProxy->setDetailVisible(module, dock, tr("Mode"), visibleState("Control-Center_Dock_Model")); - m_frameProxy->setDetailVisible(module, dock, tr("Location"), visibleState("Control-Center_Dock_Location")); - m_frameProxy->setDetailVisible(module, dock, tr("Status"), visibleState("Control-Center_Dock_State")); - m_frameProxy->setDetailVisible(module, dock, tr("Size"), visibleState("Control-Center_Dock_Size")); - m_frameProxy->setDetailVisible(module, dock, tr("Show Dock"), visibleState("Control-Center_Dock_Multi-screen")); - m_frameProxy->setDetailVisible(module, dock, tr("Plugin Area"), visibleState("Control-Center_Dock_Plugins")); - m_frameProxy->updateSearchData(module); -} diff --git a/plugins/dcc-dock-plugin/settings_module.h b/plugins/dcc-dock-plugin/settings_module.h deleted file mode 100644 index 148809fca..000000000 --- a/plugins/dcc-dock-plugin/settings_module.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2021 Uniontech Technology Co., Ltd. - * - * Author: fanpengcheng - * - * Maintainer: fanpengcheng - * - * 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 . - */ -#ifndef SETTINGSMODULE_H -#define SETTINGSMODULE_H - -#include - -#include - -#include "interface/namespace.h" -#include "interface/moduleinterface.h" -#include "interface/frameproxyinterface.h" - -namespace DCC_NAMESPACE { - class ModuleInterface; - class FrameProxyInterface; -} - -using namespace DCC_NAMESPACE; - -DCORE_BEGIN_NAMESPACE -class DConfig; -DCORE_END_NAMESPACE - -class ModuleWidget; -class SettingsModule : public QObject, public ModuleInterface -{ - Q_OBJECT - - Q_PLUGIN_METADATA(IID ModuleInterface_iid FILE "dock_settings.json") - Q_INTERFACES(DCC_NAMESPACE::ModuleInterface) - -public: - explicit SettingsModule(); - - ~SettingsModule() Q_DECL_OVERRIDE; - - void initialize() Q_DECL_OVERRIDE; - - QStringList availPage() const Q_DECL_OVERRIDE; - - const QString displayName() const Q_DECL_OVERRIDE; - - QIcon icon() const Q_DECL_OVERRIDE; - - QString translationPath() const Q_DECL_OVERRIDE; - - QString path() const Q_DECL_OVERRIDE; - - QString follow() const Q_DECL_OVERRIDE; - - const QString name() const Q_DECL_OVERRIDE; - - void showPage(const QString &pageName) Q_DECL_OVERRIDE; - - void addChildPageTrans() const Q_DECL_OVERRIDE; - - void initSearchData() Q_DECL_OVERRIDE; - - void preInitialize(bool sync = false,FrameProxyInterface::PushType = FrameProxyInterface::PushType::Normal) Q_DECL_OVERRIDE; - -private: - void onStatusChanged(); - -public Q_SLOTS: - void active() Q_DECL_OVERRIDE; - -private: - ModuleWidget *m_moduleWidget; - DTK_CORE_NAMESPACE::DConfig *m_config; -}; - -#endif // SETTINGSMODULE_H diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_assistant_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_assistant_16px.svg deleted file mode 100644 index 7c2010bf1..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_assistant_16px.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - icon/dock/assistant - - - - - - - - - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_desktop_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_desktop_16px.svg deleted file mode 100644 index c0fa9ab19..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_desktop_16px.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon/dock/desktop - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_grandsearch_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_grandsearch_16px.svg deleted file mode 100644 index b1e0e65ba..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_grandsearch_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - icon/dock-set/search - - - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_keyboard_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_keyboard_16px.svg deleted file mode 100644 index d9c5718b2..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_keyboard_16px.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon/dock/keyboard - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_notify_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_notify_16px.svg deleted file mode 100644 index fba759921..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_notify_16px.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon/dock/notify - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_plug_in_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_plug_in_16px.svg deleted file mode 100644 index 5ab6bf7fd..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_plug_in_16px.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon/dock/plug-in2 - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_power_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_power_16px.svg deleted file mode 100644 index 66aea8e7c..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_power_16px.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon/dock-set/power - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_systemmonitor_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_systemmonitor_16px.svg deleted file mode 100644 index 50ee6bb28..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_systemmonitor_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - icon/dock-set/monitor - - - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_task_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_task_16px.svg deleted file mode 100644 index 0537c2347..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_task_16px.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon/dock/task - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_time_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_time_16px.svg deleted file mode 100644 index da813d6f9..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_time_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - icon/dock/time - - - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/texts/dcc_dock_trash_16px.svg b/plugins/dcc-dock-plugin/texts/dcc_dock_trash_16px.svg deleted file mode 100644 index 05ce6decf..000000000 --- a/plugins/dcc-dock-plugin/texts/dcc_dock_trash_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - icon/dock/trash - - - - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translate_generation.sh b/plugins/dcc-dock-plugin/translate_generation.sh deleted file mode 100755 index c9080923b..000000000 --- a/plugins/dcc-dock-plugin/translate_generation.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# this file is used to auto-generate .qm file from .ts file. -# author: shibowen at linuxdeepin.com - -ts_list=(`ls translations/*.ts`) - -for ts in "${ts_list[@]}" -do - printf "\nprocess ${ts}\n" - lrelease "${ts}" -done diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin.ts deleted file mode 100644 index e2d1a109c..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Size - Dock - /personalization/Dock - - - - Multiple Displays - Multiple Displays - Dock - /personalization/Dock - - - - Plugin Area - Plugin Area - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Select which icons appear in the Dock - - - - - Fashion mode - Fashion mode - - - - - Efficient mode - Efficient mode - - - - Mode - Mode - Dock - /personalization/Dock - - - - - Top - Top - - - - - Bottom - Bottom - - - - - Left - Left - - - - - Right - Right - - - - Location - Location - Dock - /personalization/Dock - - - - - Keep shown - Keep shown - - - - - Keep hidden - Keep hidden - - - - - Smart hide - Smart hide - - - - Status - Status - Dock - /personalization/Dock - - - - Small - Small - - - - Large - Large - - - - - On screen where the cursor is - On screen where the cursor is - - - - - Only on main screen - Only on main screen - - - - Show Dock - Show Dock - - - - SettingsModule - - - - - Dock - Dock - - - - Mode - Mode - - - - Location - Location - - - - Status - Status - - - - Size - Size - - - - Show Dock - Show Dock - - - - Plugin Area - Plugin Area - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_az.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_az.ts deleted file mode 100644 index bb5921a3e..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_az.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Ölçü - Dock - /personalization/Dock - - - - Multiple Displays - Çoxsaylı ekran - Dock - /personalization/Dock - - - - Plugin Area - Plaqin sahəsi - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Dok paneldə görünəcək nişanları seçin - - - - - Fashion mode - Müasir rejim - - - - - Efficient mode - Səmərəli rejim - - - - Mode - Rejim - Dock - /personalization/Dock - - - - - Top - Yuxarıda - - - - - Bottom - Aşağıda - - - - - Left - Sol - - - - - Right - Sağ - - - - Location - Yerləşmə - Dock - /personalization/Dock - - - - - Keep shown - Görünsün - - - - - Keep hidden - Gizli qalsın - - - - - Smart hide - Ağıllı gizlənmə - - - - Status - Vəziyyəti - Dock - /personalization/Dock - - - - Small - Kiçik - - - - Large - Geniş - - - - - On screen where the cursor is - Kursorun olduğu ekranda - - - - - Only on main screen - Yalnız əsas ekranda - - - - Show Dock - Dok paneli göstərmək - - - - SettingsModule - - - - - Dock - Dok panel - - - - Mode - Rejim - - - - Location - Yerləşmə - - - - Status - Vəziyyəti - - - - Size - Ölçü - - - - Show Dock - Dok paneli göstərmək - - - - Plugin Area - Plaqin sahəsi - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_bo.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_bo.ts deleted file mode 100644 index 86105e4c8..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_bo.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - ཆེ་ཆུང་། - Dock - /personalization/Dock - - - - Multiple Displays - བརྙན་མང་མངོན་སྟོན་སྒྲིག་འགོད། - Dock - /personalization/Dock - - - - Plugin Area - ལྷུ་ལག་ཁུལ་ཁོངས། - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - ལས་འགན་ཚན་བྱང་གི་ལྷུ་ལག་ཁུལ་དུ་མངོན་པའི་པར་རིས་འདེམས་པ། - - - - - Fashion mode - དར་སྲོལ་དཔེ་རྣམ། - - - - - Efficient mode - ལས་ཆོད་ཆེ་བའི་དཔེ་རྣམ། - - - - Mode - དཔེ་རྣམ། - Dock - /personalization/Dock - - - - - Top - གོང་། - - - - - Bottom - འོག - - - - - Left - གཡོན། - - - - - Right - གཡས། - - - - Location - གནས་ས། - Dock - /personalization/Dock - - - - - Keep shown - རྟག་ཏུ་མངོན་པ། - - - - - Keep hidden - རྟག་ཏུ་ཡིབ་པ། - - - - - Smart hide - རིག་ནུས་གབ་ཡིབ། - - - - Status - རྣམ་པ། - Dock - /personalization/Dock - - - - Small - ཆུང་ངུ། - - - - Large - ཆེ་བ། - - - - - On screen where the cursor is - ཙི་གུའི་གནས་ཡུལ་ལྟར་མངོན་པ། - - - - - Only on main screen - བརྙན་ཡོལ་ཨ་མ་ཁོ་ན་མངོན་པ། - - - - Show Dock - ལས་འགན་ཚན་བྱང་གི་གནས་ས། - - - - SettingsModule - - - - - Dock - ལས་འགན་ཚན་བྱང་། - - - - Mode - དཔེ་རྣམ། - - - - Location - གནས་ས། - - - - Status - རྣམ་པ། - - - - Size - ཆེ་ཆུང་། - - - - Show Dock - ལས་འགན་ཚན་བྱང་གི་གནས་ས། - - - - Plugin Area - ལྷུ་ལག་ཁུལ་ཁོངས། - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ca.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ca.ts deleted file mode 100644 index 14bee9c98..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ca.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Mida - Dock - /personalization/Dock - - - - Multiple Displays - Pantalles múltiples - Dock - /personalization/Dock - - - - Plugin Area - Àrea de connectors - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Seleccioneu quines icones apareixen a l'acoblador. - - - - - Fashion mode - Mode de moda - - - - - Efficient mode - Mode eficient - - - - Mode - Mode - Dock - /personalization/Dock - - - - - Top - Dalt - - - - - Bottom - A baix - - - - - Left - A l'esquerra - - - - - Right - A la dreta - - - - Location - Ubicació - Dock - /personalization/Dock - - - - - Keep shown - Mantén-lo visible - - - - - Keep hidden - Mantén-lo amagat - - - - - Smart hide - Ocultació intel·ligent - - - - Status - Estat - Dock - /personalization/Dock - - - - Small - petit - - - - Large - gros - - - - - On screen where the cursor is - A la pantalla el cursor és - - - - - Only on main screen - Només a la pantalla principal - - - - Show Dock - Mostra l'acoblador - - - - SettingsModule - - - - - Dock - Acoblador - - - - Mode - Mode - - - - Location - Ubicació - - - - Status - Estat - - - - Size - Mida - - - - Show Dock - Mostra l'acoblador - - - - Plugin Area - Àrea de connectors - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_cs.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_cs.ts deleted file mode 100644 index a85e3d002..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_cs.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Velikost - Dock - /personalization/Dock - - - - Multiple Displays - Více displejů - Dock - /personalization/Dock - - - - Plugin Area - Oblast pluginu - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Vyberte, které ikony se zobrazí v panelu - - - - - Fashion mode - Líbivý režim - - - - - Efficient mode - Nenáročný režim - - - - Mode - Režim - Dock - /personalization/Dock - - - - - Top - Nahoře - - - - - Bottom - Dole - - - - - Left - Vlevo - - - - - Right - Vpravo - - - - Location - Umístění - Dock - /personalization/Dock - - - - - Keep shown - Ponechat zobrazený - - - - - Keep hidden - Ponechat skrytý - - - - - Smart hide - Chytré skrývání - - - - Status - Stav - Dock - /personalization/Dock - - - - Small - Malý - - - - Large - Velký - - - - - On screen where the cursor is - Na obrazovce, na které se nachází ukazatel - - - - - Only on main screen - Pouze na hlavní obrazovce - - - - Show Dock - Zobrazit panel - - - - SettingsModule - - - - - Dock - Panel - - - - Mode - Režim - - - - Location - Umístění - - - - Status - Stav - - - - Size - Velikost - - - - Show Dock - Zobrazit panel - - - - Plugin Area - Oblast pluginu - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_de.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_de.ts deleted file mode 100644 index 957533edd..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_de.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Größe - Dock - /personalization/Dock - - - - Multiple Displays - Mehrfachbildschirm - Dock - /personalization/Dock - - - - Plugin Area - Pluginbereich - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Wählen Sie aus, welche Symbole im Dock erscheinen sollen - - - - - Fashion mode - Design-Modus - - - - - Efficient mode - Leistungs-Modus - - - - Mode - Modus - Dock - /personalization/Dock - - - - - Top - Oben - - - - - Bottom - Unten - - - - - Left - Links - - - - - Right - Rechts - - - - Location - Standort - Dock - /personalization/Dock - - - - - Keep shown - Angezeigt lassen - - - - - Keep hidden - Ausgeblendet lassen - - - - - Smart hide - Intelligentes Ausblenden - - - - Status - Status - Dock - /personalization/Dock - - - - Small - Klein - - - - Large - Groß - - - - - On screen where the cursor is - Auf dem Bildschirm, wo sich der Zeiger befindet - - - - - Only on main screen - Nur auf dem Hauptbildschirm - - - - Show Dock - Dock anzeigen - - - - SettingsModule - - - - - Dock - Dock - - - - Mode - Modus - - - - Location - Standort - - - - Status - Status - - - - Size - Größe - - - - Show Dock - Dock anzeigen - - - - Plugin Area - Pluginbereich - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_el.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_el.ts deleted file mode 100644 index c99a7eb0f..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_el.ts +++ /dev/null @@ -1,130 +0,0 @@ - - - ModuleWidget - - - Size - Μέγεθος - - - - Multiple Displays - Πολλαπλές Οθόνες - - - - Plugin Area - - - - - Select which icons appear in the Dock - - - - - - Fashion mode - Μοντέρνα λειτουργία - - - - - Efficient mode - Αποτελεσματική λειτουργία - - - - Mode - Λειτουργία - - - - - Top - Πάνω μέρος - - - - - Bottom - Κάτω μέρος - - - - - Left - Αριστερά - - - - - Right - Δεξιά - - - - Location - Τοποθεσία - - - - - Keep shown - - - - - - Keep hidden - Κρατήστε κρυφό - - - - - Smart hide - Έξυπνη απόκρυψη - - - - Status - Κατάσταση - - - - Small - Μικρό - - - - Large - Μεγάλο - - - - - On screen where the cursor is - Στην οθόνη όπου βρίσκεται ο κέρσορας - - - - - Only on main screen - Μόνο στην κύρια οθόνη - - - - Show Dock - - - - - SettingsModule - - - Dock - Προσθήκη στην γραμμή εργασιών - /personalization/Dock - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_en_US.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_en_US.ts deleted file mode 100644 index adf44cd9a..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_en_US.ts +++ /dev/null @@ -1,175 +0,0 @@ - - - - - ModuleWidget - - - Size - Size - Dock - /personalization/Dock - - - - Multiple Displays - Multiple Displays - Dock - /personalization/Dock - - - - Plugin Area - Plugin Area - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Select which icons appear in the Dock - - - - - Fashion mode - Fashion mode - - - - - Efficient mode - Efficient mode - - - - Mode - Mode - Dock - /personalization/Dock - - - - - Top - Top - - - - - Bottom - Bottom - - - - - Left - Left - - - - - Right - Right - - - - Location - Location - Dock - /personalization/Dock - - - - - Keep shown - Keep shown - - - - - Keep hidden - Keep hidden - - - - - Smart hide - Smart hide - - - - Status - Status - Dock - /personalization/Dock - - - - Small - Small - - - - Large - Large - - - - - On screen where the cursor is - On screen where the cursor is - - - - - Only on main screen - Only on main screen - - - - Show Dock - Show Dock - - - - SettingsModule - - - - - Dock - Dock - - - - Mode - Mode - - - - Location - Location - - - - Status - Status - - - - Size - Size - - - - Show Dock - Show Dock - - - - Plugin Area - Plugin Area - - - diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_es.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_es.ts deleted file mode 100644 index 5fd167187..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_es.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Tamaño - Dock - /personalization/Dock - - - - Multiple Displays - Múltiples pantallas - Dock - /personalization/Dock - - - - Plugin Area - Área de complementos - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Seleccionar los iconos que aparecen en el Dock - - - - - Fashion mode - Modo elegante - - - - - Efficient mode - Modo eficiente - - - - Mode - Modo - Dock - /personalization/Dock - - - - - Top - Arriba - - - - - Bottom - Abajo - - - - - Left - Izquierda - - - - - Right - Derecha - - - - Location - Ubicación - Dock - /personalization/Dock - - - - - Keep shown - Mantener visible - - - - - Keep hidden - Mantener oculto - - - - - Smart hide - Ocultar inteligentemente - - - - Status - Estado - Dock - /personalization/Dock - - - - Small - Pequeña - - - - Large - Grande - - - - - On screen where the cursor is - En la pantalla donde está el cursor - - - - - Only on main screen - Solo en la pantalla principal - - - - Show Dock - Mostrar el dock - - - - SettingsModule - - - - - Dock - Dock - - - - Mode - Modo - - - - Location - Ubicación - - - - Status - Estado - - - - Size - Tamaño - - - - Show Dock - Mostrar el dock - - - - Plugin Area - Área de complementos - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_fi.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_fi.ts deleted file mode 100644 index 5d5a9539f..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_fi.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Koko - Dock - /personalization/Dock - - - - Multiple Displays - Useita näyttöjä - Dock - /personalization/Dock - - - - Plugin Area - Laajennusalue - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Valitse mitkä kuvakkeet näkyvät telakassa - - - - - Fashion mode - Muodikas - - - - - Efficient mode - Tehokas - - - - Mode - Tila - Dock - /personalization/Dock - - - - - Top - Ylhäällä - - - - - Bottom - Alhaalla - - - - - Left - Vasen - - - - - Right - Oikea - - - - Location - Sijainti - Dock - /personalization/Dock - - - - - Keep shown - Näytä aina - - - - - Keep hidden - Pidä piilossa - - - - - Smart hide - Älykäs piilotus - - - - Status - Tila - Dock - /personalization/Dock - - - - Small - Pieni - - - - Large - Suuri - - - - - On screen where the cursor is - Näytöllä, jossa kohdistin on - - - - - Only on main screen - Vain päänäytöllä - - - - Show Dock - Näytä telakka - - - - SettingsModule - - - - - Dock - Telakka - - - - Mode - Tila - - - - Location - Sijainti - - - - Status - Tila - - - - Size - Koko - - - - Show Dock - Näytä telakka - - - - Plugin Area - Laajennusalue - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_fr.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_fr.ts deleted file mode 100644 index f37f7ad2e..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_fr.ts +++ /dev/null @@ -1,130 +0,0 @@ - - - ModuleWidget - - - Size - Taille - - - - Multiple Displays - Affichages multiples - - - - Plugin Area - - - - - Select which icons appear in the Dock - - - - - - Fashion mode - Mode dock - - - - - Efficient mode - Mode étendu - - - - Mode - Mode - - - - - Top - Haut - - - - - Bottom - Bas - - - - - Left - Gauche - - - - - Right - Droite - - - - Location - Emplacement - - - - - Keep shown - - - - - - Keep hidden - Maintenir caché - - - - - Smart hide - Masquer intelligemment - - - - Status - Statut - - - - Small - Petit - - - - Large - Grand - - - - - On screen where the cursor is - Sur l'écran où se trouve le curseur - - - - - Only on main screen - Uniquement sur l'écran principal - - - - Show Dock - - - - - SettingsModule - - - Dock - Dock - /personalization/Dock - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_hr.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_hr.ts deleted file mode 100644 index 6af61048f..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_hr.ts +++ /dev/null @@ -1,130 +0,0 @@ - - - ModuleWidget - - - Size - Veličina - - - - Multiple Displays - Višestruki zasloni - - - - Plugin Area - - - - - Select which icons appear in the Dock - - - - - - Fashion mode - Moderan način - - - - - Efficient mode - Učinkoviti način - - - - Mode - Način - - - - - Top - Gore - - - - - Bottom - Dolje - - - - - Left - Lijevo - - - - - Right - Desno - - - - Location - Lokacija - - - - - Keep shown - Drži prikazano - - - - - Keep hidden - Drži skriveno - - - - - Smart hide - Pametno skrivanje - - - - Status - Status - - - - Small - Maleno - - - - Large - Veliko - - - - - On screen where the cursor is - Na zaslon gdje je pokazivač - - - - - Only on main screen - Samo na glavni zaslon - - - - Show Dock - - - - - SettingsModule - - - Dock - - /personalization/Dock - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_hu.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_hu.ts deleted file mode 100644 index 8f902fda1..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_hu.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Méret - Dock - /personalization/Dock - - - - Multiple Displays - Többképernyős mód - Dock - /personalization/Dock - - - - Plugin Area - Bővítmény terület - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Válassza ki, hogy mely ikonok jelenjenek meg a dokkolóban - - - - - Fashion mode - Stílusos mód - - - - - Efficient mode - Hatékony mód - - - - Mode - Mód - Dock - /personalization/Dock - - - - - Top - Fent - - - - - Bottom - Lent - - - - - Left - Bal - - - - - Right - Jobb - - - - Location - Hely - Dock - /personalization/Dock - - - - - Keep shown - Megjelenítve tartás - - - - - Keep hidden - Maradjon rejtett - - - - - Smart hide - Intelligens elrejtés - - - - Status - Állapot - Dock - /personalization/Dock - - - - Small - Kicsi - - - - Large - Nagy - - - - - On screen where the cursor is - A képernyőn, ahol a kurzor található - - - - - Only on main screen - Csak a főképernyőn - - - - Show Dock - Dokkoló mutatása - - - - SettingsModule - - - - - Dock - Dokkoló - - - - Mode - Mód - - - - Location - Hely - - - - Status - Állapot - - - - Size - Méret - - - - Show Dock - Dokkoló mutatása - - - - Plugin Area - Bővítmény terület - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_it.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_it.ts deleted file mode 100644 index a0911d92d..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_it.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Dimensione - Dock - /personalization/Dock - - - - Multiple Displays - Display multipli - Dock - /personalization/Dock - - - - Plugin Area - Area plugin - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Seleziona quali icone appaiono nel Dock - - - - - Fashion mode - Modalità Fashion - - - - - Efficient mode - Modalità Efficient - - - - Mode - Modalità - Dock - /personalization/Dock - - - - - Top - Sopra - - - - - Bottom - Sotto - - - - - Left - Sinistra - - - - - Right - Destra - - - - Location - Posizione - Dock - /personalization/Dock - - - - - Keep shown - Mostra sempre - - - - - Keep hidden - Lascia nascosta - - - - - Smart hide - Nascondi automaticamente - - - - Status - Comportamento - Dock - /personalization/Dock - - - - Small - Piccolo - - - - Large - Grande - - - - - On screen where the cursor is - Sullo schermo dove è presente il cursore - - - - - Only on main screen - Solo sullo schermo principale - - - - Show Dock - Mostra la Dock - - - - SettingsModule - - - - - Dock - Dock - - - - Mode - Modalità - - - - Location - Posizione - - - - Status - Comportamento - - - - Size - Dimensioni - - - - Show Dock - Mostra la Dock - - - - Plugin Area - Area plugin - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ms.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ms.ts deleted file mode 100644 index ec70d1a43..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ms.ts +++ /dev/null @@ -1,130 +0,0 @@ - - - ModuleWidget - - - Size - Saiz - - - - Multiple Displays - Paparan Berbilang - - - - Plugin Area - - - - - Select which icons appear in the Dock - - - - - - Fashion mode - Mod fesyen - - - - - Efficient mode - Mod efisyen - - - - Mode - Mod - - - - - Top - Teratas - - - - - Bottom - Bawah - - - - - Left - Kiri - - - - - Right - Kanan - - - - Location - Lokasi - - - - - Keep shown - - - - - - Keep hidden - Kekal tersembunyi - - - - - Smart hide - Sembunyi pintar - - - - Status - Status - - - - Small - Kecil - - - - Large - Besar - - - - - On screen where the cursor is - Atas skrin yang mana kursor berada - - - - - Only on main screen - Hanya dalam skrin utama - - - - Show Dock - - - - - SettingsModule - - - Dock - Labuh - /personalization/Dock - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_nl.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_nl.ts deleted file mode 100644 index 2748b27c4..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_nl.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Grootte - Dock - /personalization/Dock - - - - Multiple Displays - Meerdere beeldschermen - Dock - /personalization/Dock - - - - Plugin Area - Invoegtoepassingsgebied - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Geef aan welke pictogrammen moeten worden getoond op het dock - - - - - Fashion mode - Moderne modus - - - - - Efficient mode - Efficiënte modus - - - - Mode - Modus - Dock - /personalization/Dock - - - - - Top - Bovenaan - - - - - Bottom - Onderaan - - - - - Left - Links - - - - - Right - Rechts - - - - Location - Locatie - Dock - /personalization/Dock - - - - - Keep shown - Altijd tonen - - - - - Keep hidden - Altijd verbergen - - - - - Smart hide - Slim verbergen - - - - Status - Status - Dock - /personalization/Dock - - - - Small - Klein - - - - Large - Groot - - - - - On screen where the cursor is - Op het scherm waar de cursor is - - - - - Only on main screen - Alleen op hoofdscherm - - - - Show Dock - Dock tonen - - - - SettingsModule - - - - - Dock - Vastmaken - - - - Mode - Modus - - - - Location - Locatie - - - - Status - Status - - - - Size - Grootte - - - - Show Dock - Dock tonen - - - - Plugin Area - Invoegtoepassingsgebied - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pl.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pl.ts deleted file mode 100644 index 0b2da01b6..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pl.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Rozmiar - Dock - /personalization/Dock - - - - Multiple Displays - Wiele ekranów - Dock - /personalization/Dock - - - - Plugin Area - Strefa wtyczek - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Wybierz, które wtyczki pojawią się w Doku - - - - - Fashion mode - Tryb modny - - - - - Efficient mode - Tryb wydajny - - - - Mode - Tryb - Dock - /personalization/Dock - - - - - Top - Góra - - - - - Bottom - Dół - - - - - Left - Lewo - - - - - Right - Prawo - - - - Location - Położenie - Dock - /personalization/Dock - - - - - Keep shown - Zawsze wyświetlaj - - - - - Keep hidden - Zawsze ukrywaj - - - - - Smart hide - Inteligentne ukrywanie - - - - Status - Status - Dock - /personalization/Dock - - - - Small - Mały - - - - Large - Ogromny - - - - - On screen where the cursor is - Na ekranie, tam gdzie jest kursor - - - - - Only on main screen - Tylko na ekranie głównym - - - - Show Dock - Pokaż dok - - - - SettingsModule - - - - - Dock - Dok - - - - Mode - Tryb - - - - Location - Położenie - - - - Status - Status - - - - Size - Rozmiar - - - - Show Dock - Pokaż dok - - - - Plugin Area - Strefa wtyczek - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pt.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pt.ts deleted file mode 100644 index ceb75afbb..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pt.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Tamanho - Dock - /personalization/Dock - - - - Multiple Displays - Vários ecrãs - Dock - /personalization/Dock - - - - Plugin Area - Área de plugins - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Selecione quais os ícones que aparecem na Doca - - - - - Fashion mode - Modo Elegante - - - - - Efficient mode - Modo eficiente - - - - Mode - Modo - Dock - /personalization/Dock - - - - - Top - Superior - - - - - Bottom - Inferior - - - - - Left - Esquerda - - - - - Right - Direita - - - - Location - Localização - Dock - /personalization/Dock - - - - - Keep shown - Manter visível - - - - - Keep hidden - Manter ocultada - - - - - Smart hide - Ocultação inteligente - - - - Status - Estado - Dock - /personalization/Dock - - - - Small - Pequeno - - - - Large - Grande - - - - - On screen where the cursor is - No ecrã onde se encontra o cursor - - - - - Only on main screen - Apenas no ecrã principal - - - - Show Dock - Mostrar Doca - - - - SettingsModule - - - - - Dock - Doca - - - - Mode - Modo - - - - Location - Localização - - - - Status - Estado - - - - Size - Tamanho - - - - Show Dock - Mostrar Doca - - - - Plugin Area - Área de plugins - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pt_BR.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pt_BR.ts deleted file mode 100644 index 5b39d544a..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_pt_BR.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Size - Dock - /personalization/Dock - - - - Multiple Displays - Multiple Displays - Dock - /personalization/Dock - - - - Plugin Area - Plugin Area - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Select which icons appear in the Dock - - - - - Fashion mode - Fashion mode - - - - - Efficient mode - Efficient mode - - - - Mode - Mode - Dock - /personalization/Dock - - - - - Top - Top - - - - - Bottom - Bottom - - - - - Left - Left - - - - - Right - Right - - - - Location - Location - Dock - /personalization/Dock - - - - - Keep shown - Keep shown - - - - - Keep hidden - Keep hidden - - - - - Smart hide - Smart hide - - - - Status - Status - Dock - /personalization/Dock - - - - Small - Small - - - - Large - Large - - - - - On screen where the cursor is - On screen where the cursor is - - - - - Only on main screen - Only on main screen - - - - Show Dock - Show Dock - - - - SettingsModule - - - - - Dock - Dock - - - - Mode - Mode - - - - Location - Location - - - - Status - Status - - - - Size - Tamanho - - - - Show Dock - Show Dock - - - - Plugin Area - Plugin Area - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ru.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ru.ts deleted file mode 100644 index 4f8e4f717..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ru.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Размер - Dock - /personalization/Dock - - - - Multiple Displays - Несколько Дисплеев - Dock - /personalization/Dock - - - - Plugin Area - Область Плагина - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Выбрать какие значки будут отображаться в Dock - - - - - Fashion mode - Стильный режим - - - - - Efficient mode - Эффективный режим - - - - Mode - Режим - Dock - /personalization/Dock - - - - - Top - На верху - - - - - Bottom - Внизу - - - - - Left - Слева - - - - - Right - Справа - - - - Location - Расположение - Dock - /personalization/Dock - - - - - Keep shown - Отображать - - - - - Keep hidden - Скрывать - - - - - Smart hide - Умное скрытие - - - - Status - Статус - Dock - /personalization/Dock - - - - Small - Маленький - - - - Large - Большой - - - - - On screen where the cursor is - На экране, где находится курсор - - - - - Only on main screen - Только на главном экране - - - - Show Dock - Показывать Dock - - - - SettingsModule - - - - - Dock - Dock - - - - Mode - Режим - - - - Location - Расположение - - - - Status - Статус - - - - Size - Размер - - - - Show Dock - Показывать Dock - - - - Plugin Area - Область Плагина - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_sq.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_sq.ts deleted file mode 100644 index cdd55f008..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_sq.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Madhësi - Dock - /personalization/Dock - - - - Multiple Displays - Shumë Ekrane - Dock - /personalization/Dock - - - - Plugin Area - Zonë Shtojcash - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Përzgjidhni cilat ikona shfaqen te Paneli - - - - - Fashion mode - Mënyra “Në modë” - - - - - Efficient mode - Mënyra efikasitet - - - - Mode - Mënyrë - Dock - /personalization/Dock - - - - - Top - Në Krye - - - - - Bottom - Në Fund - - - - - Left - Majtas - - - - - Right - Djathtas - - - - Location - Vendndodhje - Dock - /personalization/Dock - - - - - Keep shown - Mbaje të shfaqur - - - - - Keep hidden - Mbaje të fshehur - - - - - Smart hide - Fshehje e mençur - - - - Status - Gjendje - Dock - /personalization/Dock - - - - Small - I vogël - - - - Large - I madh - - - - - On screen where the cursor is - Në ekranin ku është kursori - - - - - Only on main screen - Vetëm në ekranin kryesor - - - - Show Dock - Shfaqe Panelin - - - - SettingsModule - - - - - Dock - Panel - - - - Mode - Mënyrë - - - - Location - Vendndodhje - - - - Status - Gjendje - - - - Size - Madhësi - - - - Show Dock - Shfaqe Panelin - - - - Plugin Area - Zonë Shtojcash - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_tr.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_tr.ts deleted file mode 100644 index 13821aac2..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_tr.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Boyut - Dock - /personalization/Dock - - - - Multiple Displays - Çoklu Ekran - Dock - /personalization/Dock - - - - Plugin Area - Eklenti Alanı - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Rıhtım'da hangi simgelerin görüneceğini seçin - - - - - Fashion mode - Moda Kip - - - - - Efficient mode - Verimli Kip - - - - Mode - Kip - Dock - /personalization/Dock - - - - - Top - Üst - - - - - Bottom - Alt - - - - - Left - Sol - - - - - Right - Sağ - - - - Location - Konum - Dock - /personalization/Dock - - - - - Keep shown - Gösterilmeyi sürdür - - - - - Keep hidden - Gizli tut - - - - - Smart hide - Akıll gizle - - - - Status - Durum - Dock - /personalization/Dock - - - - Small - Küçük - - - - Large - Büyük - - - - - On screen where the cursor is - İmlecin bulunduğu ekranda - - - - - Only on main screen - Sadece ana ekranda - - - - Show Dock - Rıhtımı Göster - - - - SettingsModule - - - - - Dock - Rıhtım - - - - Mode - Kip - - - - Location - Konum - - - - Status - Durum - - - - Size - Boyut - - - - Show Dock - Rıhtımı Göster - - - - Plugin Area - Eklenti Alanı - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ug.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ug.ts deleted file mode 100644 index 618b3b8e5..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_ug.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - چوڭلۇقى - Dock - /personalization/Dock - - - - Multiple Displays - كۆپ ئېكرانلىق كۆرسىتىش تەڭشىكى - Dock - /personalization/Dock - - - - Plugin Area - قىستۇرما رايونى - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - ۋەزىپە ئىستونى قىستۇرما رايونىدا كۆرسىتىلىدىغان سىنبەلگىنى تاللاڭ - - - - - Fashion mode - مودا ھالەت - - - - - Efficient mode - يۇقىرى ئۈنۈملۈك ھالەت - - - - Mode - ھالىتى - Dock - /personalization/Dock - - - - - Top - ئۈستى - - - - - Bottom - ئاستى - - - - - Left - سول - - - - - Right - ئوڭ - - - - Location - ئورنى - Dock - /personalization/Dock - - - - - Keep shown - داۋاملىق كۆرسىتىش - - - - - Keep hidden - داۋاملىق يوشۇرۇش - - - - - Smart hide - ئەقلىي يوشۇرۇش - - - - Status - ھالىتى - Dock - /personalization/Dock - - - - Small - كىچىك - - - - Large - چوڭ - - - - - On screen where the cursor is - مائۇسنىڭ ئورنىغا ئەگىشىپ كۆرۈنسۇن - - - - - Only on main screen - ئاساسىي ئېكراندىلا كۆرۈنسۇن - - - - Show Dock - ۋەزىپە ئىستونىنىڭ ئورنى - - - - SettingsModule - - - - - Dock - ۋەزىپە ئىستونى - - - - Mode - ھالىتى - - - - Location - ئورنى - - - - Status - ھالىتى - - - - Size - چوڭلۇقى - - - - Show Dock - ۋەزىپە ئىستونىنىڭ ئورنى - - - - Plugin Area - قىستۇرما رايونى - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_uk.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_uk.ts deleted file mode 100644 index b2dcd7e43..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_uk.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - Розмір - Dock - /personalization/Dock - - - - Multiple Displays - Кілька дисплеїв - Dock - /personalization/Dock - - - - Plugin Area - Область додатків - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - Виберіть, які піктограми буде показано на бічній панелі - - - - - Fashion mode - Модний режим - - - - - Efficient mode - Ефективний режим - - - - Mode - Режим - Dock - /personalization/Dock - - - - - Top - Вгорі - - - - - Bottom - Внизу - - - - - Left - Ліворуч - - - - - Right - Праворуч - - - - Location - Розташування - Dock - /personalization/Dock - - - - - Keep shown - Показувати постійно - - - - - Keep hidden - Залишати прихованим - - - - - Smart hide - Розумне приховування - - - - Status - Стан - Dock - /personalization/Dock - - - - Small - Малий - - - - Large - Великий - - - - - On screen where the cursor is - На екрані, де перебуває вказівник - - - - - Only on main screen - Лише на головному екрані - - - - Show Dock - Показувати панель - - - - SettingsModule - - - - - Dock - Панель - - - - Mode - Режим - - - - Location - Розташування - - - - Status - Стан - - - - Size - Розмір - - - - Show Dock - Показувати панель - - - - Plugin Area - Область додатків - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_CN.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_CN.ts deleted file mode 100644 index 66bcf32f8..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_CN.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - 大小 - Dock - /personalization/Dock - - - - Multiple Displays - 多屏显示设置 - Dock - /personalization/Dock - - - - Plugin Area - 插件区域 - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - 选择显示在任务栏插件区域的图标 - - - - - Fashion mode - 时尚模式 - - - - - Efficient mode - 高效模式 - - - - Mode - 模式 - Dock - /personalization/Dock - - - - - Top - - - - - - Bottom - - - - - - Left - - - - - - Right - - - - - Location - 位置 - Dock - /personalization/Dock - - - - - Keep shown - 一直显示 - - - - - Keep hidden - 一直隐藏 - - - - - Smart hide - 智能隐藏 - - - - Status - 状态 - Dock - /personalization/Dock - - - - Small - - - - - Large - - - - - - On screen where the cursor is - 跟随鼠标位置显示 - - - - - Only on main screen - 仅主屏显示 - - - - Show Dock - 任务栏位置 - - - - SettingsModule - - - - - Dock - 任务栏 - - - - Mode - 模式 - - - - Location - 位置 - - - - Status - 状态 - - - - Size - 大小 - - - - Show Dock - 任务栏位置 - - - - Plugin Area - 插件区域 - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_HK.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_HK.ts deleted file mode 100644 index 145c7c10f..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_HK.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - 大小 - Dock - /personalization/Dock - - - - Multiple Displays - 多屏顯示設置 - Dock - /personalization/Dock - - - - Plugin Area - 插件區域 - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - 選擇顯示在任務欄插件區域的圖標 - - - - - Fashion mode - 時尚模式 - - - - - Efficient mode - 高效模式 - - - - Mode - 模式 - Dock - /personalization/Dock - - - - - Top - - - - - - Bottom - - - - - - Left - - - - - - Right - - - - - Location - 位置 - Dock - /personalization/Dock - - - - - Keep shown - 一直顯示 - - - - - Keep hidden - 一直隱藏 - - - - - Smart hide - 智能隱藏 - - - - Status - 狀態 - Dock - /personalization/Dock - - - - Small - - - - - Large - - - - - - On screen where the cursor is - 跟隨鼠標位置顯示 - - - - - Only on main screen - 僅主屏顯示 - - - - Show Dock - 任務欄位置 - - - - SettingsModule - - - - - Dock - 任務欄 - - - - Mode - 模式 - - - - Location - 位置 - - - - Status - 狀態 - - - - Size - 大小 - - - - Show Dock - 任務欄位置 - - - - Plugin Area - 插件區域 - - - \ No newline at end of file diff --git a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_TW.ts b/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_TW.ts deleted file mode 100644 index 3aaf10bc5..000000000 --- a/plugins/dcc-dock-plugin/translations/dcc-dock-plugin_zh_TW.ts +++ /dev/null @@ -1,173 +0,0 @@ - - - ModuleWidget - - - Size - 大小 - Dock - /personalization/Dock - - - - Multiple Displays - 多屏顯示設定 - Dock - /personalization/Dock - - - - Plugin Area - 外掛程式區域 - Dock - /personalization/Dock - - - - Select which icons appear in the Dock - 選擇顯示在任務欄外掛程式區域的圖示 - - - - - Fashion mode - 時尚模式 - - - - - Efficient mode - 高效模式 - - - - Mode - 模式 - Dock - /personalization/Dock - - - - - Top - 頂部 - - - - - Bottom - 底部 - - - - - Left - 左側 - - - - - Right - 右側 - - - - Location - 位置 - Dock - /personalization/Dock - - - - - Keep shown - 永遠顯示 - - - - - Keep hidden - 永遠隱藏 - - - - - Smart hide - 智慧隱藏 - - - - Status - 狀態 - Dock - /personalization/Dock - - - - Small - - - - - Large - - - - - - On screen where the cursor is - 跟隨滑鼠位置顯示 - - - - - Only on main screen - 僅主屏顯示 - - - - Show Dock - 任務欄位置 - - - - SettingsModule - - - - - Dock - 任務欄 - - - - Mode - 模式 - - - - Location - 位置 - - - - Status - 狀態 - - - - Size - 大小 - - - - Show Dock - 任務欄位置 - - - - Plugin Area - 外掛程式區域 - - - \ No newline at end of file From 9b9bdc228663c2c1bcb95b17cb3ba64f451831e0 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 22 Sep 2022 08:56:24 +0000 Subject: [PATCH 084/257] =?UTF-8?q?fix:=20=E6=97=B6=E5=B0=9A=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=A2=9E=E5=8A=A0=E9=98=B4=E5=BD=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在切换模式根据当前模式判断是否增加阴影 Log: UI优化 Influence: 时尚模式观察阴影 Bug: https://pms.uniontech.com/bug-view-137267.html Change-Id: I510fa4c2a66ed144cf97c88592c52d2b66d93a78 --- frame/window/mainwindowbase.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index 82ff30e5d..4a93619ff 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -353,6 +353,7 @@ void MainWindowBase::setDisplayMode(const Dock::DisplayMode &displayMode) { m_displayMode = displayMode; adjustShadowMask(); + m_platformWindowHandle.setShadowOffset(QPoint(0, (displayMode == Dock::DisplayMode::Fashion ? 5 : 0))); } void MainWindowBase::setPosition(const Dock::Position &position) @@ -554,7 +555,9 @@ void MainWindowBase::initUi() m_platformWindowHandle.setEnableBlurWindow(true); m_platformWindowHandle.setTranslucentBackground(true); m_platformWindowHandle.setShadowOffset(QPoint(0, 0)); - m_platformWindowHandle.setShadowColor(Qt::transparent); + QColor shadorColor = Qt::black; + shadorColor.setAlpha(static_cast(0.3 * 255)); + m_platformWindowHandle.setShadowColor(shadorColor); } void MainWindowBase::resizeEvent(QResizeEvent *event) From 279ff63e41ac17c485c18961025040c4d788b159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Tue, 20 Sep 2022 16:38:24 +0800 Subject: [PATCH 085/257] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E7=9A=84=E5=BD=A2?= =?UTF-8?q?=E5=BC=8F=E6=8C=87=E5=AE=9A=E6=8F=92=E4=BB=B6=E7=9A=84=E8=B7=AF?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 插件路径优先由DOCK_PLUGIN_PATH指定 Log: Influence: 影响插件加载,对旧插件保持兼容 Issue: https://github.com/linuxdeepin/developer-center/issues/3402 Change-Id: I9f499bff59767b7993e94d14bd3fa52f4c27c734 --- frame/controller/proxyplugincontroller.cpp | 84 +++++++++++++++------- frame/controller/proxyplugincontroller.h | 2 +- 2 files changed, 61 insertions(+), 25 deletions(-) diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index ba281b758..cc5ab269b 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -21,28 +21,67 @@ #include "proxyplugincontroller.h" #include "pluginsiteminterface.h" +#include + +static QStringList getPathFromConf(const QString &key) { + QSettings set("/etc/deepin/dde-dock.conf", QSettings::IniFormat); + auto value = set.value(key).toString(); + if (!value.isEmpty()) { + return value.split(':'); + } + + return QStringList(); +} + // 该方法用来设置所有的需要加载的插件的路径信息 -static QMap> getPluginPaths() +static QMap getPluginPaths() { + QMap plugins; + // 添加系统目录 - QList pluginPaths; - pluginPaths << QStringList{ QString("%1/.local/lib/dde-dock/plugins/").arg(QDir::homePath()) } - << QStringList{ QString(qApp->applicationDirPath() + "/../plugins"), - QString("/usr/lib/dde-dock/plugins") }; - QMap> plugins; - plugins[PluginType::FixedSystemPlugin] = pluginPaths; + { + QStringList pluginPaths; + #ifdef QT_DEBUG + pluginPaths << qApp->applicationDirPath() + "/../plugins"; + #else + pluginPaths << "/usr/lib/dde-dock/plugins"; + + const QStringList &pluginsDirs = getPathFromConf("PATH"); + if (!pluginsDirs.isEmpty()) + pluginPaths << pluginsDirs; + #endif + plugins[PluginType::FixedSystemPlugin] = pluginPaths; + } // 添加快捷插件目录 - pluginPaths.clear(); - pluginPaths << QStringList{ QString(qApp->applicationDirPath() + "/../plugins/quick-trays"), - QString("/usr/lib/dde-dock/plugins/quick-trays") }; - plugins[PluginType::QuickPlugin] = pluginPaths; + { + QStringList pluginPaths; + #ifdef QT_DEBUG + pluginPaths << qApp->applicationDirPath() + "/../plugins/quick-trays"; + #else + pluginPaths << "/usr/lib/dde-dock/plugins/quick-trays"; + + const QStringList &pluginsDirs = getPathFromConf("QUICK_TRAY_PATH"); + if (!pluginsDirs.isEmpty()) + pluginPaths << pluginsDirs; + #endif + plugins[PluginType::QuickPlugin] = pluginPaths; + } // 添加系统插件目录 - pluginPaths.clear(); - pluginPaths << QStringList { QString(qApp->applicationDirPath() + "/../plugins/system-trays"), - QString("/usr/lib/dde-dock/plugins/system-trays") }; - plugins[PluginType::SystemTrays] = pluginPaths; + { + QStringList pluginPaths; + #ifdef QT_DEBUG + pluginPaths << qApp->applicationDirPath() + "/../plugins/system-trays"; + #else + pluginPaths << "/usr/lib/dde-dock/plugins/system-trays"; + + const QStringList &pluginsDirs = getPathFromConf("SYSTEM_TRAY_PATH"); + if (!pluginsDirs.isEmpty()) + pluginPaths << pluginsDirs; + #endif + plugins[PluginType::SystemTrays] = pluginPaths; + } return plugins; } @@ -58,9 +97,9 @@ ProxyPluginController *ProxyPluginController::instance(PluginType instanceKey) return proxyInstances.value(instanceKey); // 生成单例类,获取加载插件的路径信息 - static QMap> pluginLoadInfos = getPluginPaths(); + static QMap pluginLoadInfos = getPluginPaths(); ProxyPluginController *controller = new ProxyPluginController(); - controller->m_dirs = (pluginLoadInfos.contains(instanceKey) ? pluginLoadInfos[instanceKey] : QList()); + controller->m_dirs = pluginLoadInfos.contains(instanceKey) ? pluginLoadInfos[instanceKey] : QStringList(); proxyInstances[instanceKey] = controller; qApp->setProperty("proxyController", QVariant::fromValue(proxyInstances)); return controller; @@ -229,14 +268,11 @@ void ProxyPluginController::removePluginItem(PluginsItemInterface * const itemIn void ProxyPluginController::startLoader() { QDir dir; - for (const QStringList &pluginPaths : m_dirs) { - for (const QString &pluginPath : pluginPaths) { - if (!dir.exists(pluginPath)) - continue; + for (const QString &path : m_dirs) { + if (!dir.exists(path)) + continue; - AbstractPluginsController::startLoader(new PluginLoader(pluginPath, this)); - break; - } + AbstractPluginsController::startLoader(new PluginLoader(path, this)); } } diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index 49e3575c1..e76dcd04e 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -73,7 +73,7 @@ private: private: QList m_interfaces; - QList m_dirs; + QStringList m_dirs; QList m_pluginsItems; QMap m_pluginsItemKeys; }; From c9aca4f728cee31078bd156089e91b0bae64e8e8 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 26 Sep 2022 02:58:42 +0000 Subject: [PATCH 086/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E6=97=B6=E5=B0=9A=E6=A8=A1=E5=BC=8F=E4=B8=8B?= =?UTF-8?q?=E6=89=93=E5=BC=80=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E5=B4=A9?= =?UTF-8?q?=E6=BA=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wayland下时尚模式的xcb_connection_t的值为nullptr,构造函数中传入一个可用的值 Log: 修复wayland环境时尚模式下打开企业微信崩溃的问题 Influence: 进入wayland桌面,进入时尚模式,打开企业微信,双击,观察企业微信是否正常打开 Task: https://pms.uniontech.com/task-view-196629.html Change-Id: Ib0a5ebdadbce672474db9dab57f27da263b8096b --- frame/window/tray/tray_delegate.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index dd6c65b79..c3122e1b7 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -64,14 +64,13 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem BaseTrayWidget *trayWidget = nullptr; if(type == TrayIconType::XEMBED) { if (Utils::IS_WAYLAND_DISPLAY) { - trayWidget = new XEmbedTrayItemWidget(winId, nullptr, nullptr, parent); - } else { - int screenp = 0; + static Display *display = XOpenDisplay(nullptr); + static int screenp = 0; static xcb_connection_t *xcb_connection = xcb_connect(qgetenv("DISPLAY"), &screenp); - static Display *m_display = XOpenDisplay(nullptr); - trayWidget = new XEmbedTrayItemWidget(winId, xcb_connection, m_display, parent); + trayWidget = new XEmbedTrayItemWidget(winId, xcb_connection, display, parent); + } else { + trayWidget = new XEmbedTrayItemWidget(winId, nullptr, nullptr, parent); } - const TrayModel *model = qobject_cast(index.model()); if (model) connect(model, &TrayModel::requestUpdateIcon, trayWidget, &BaseTrayWidget::updateIcon); From 386e18634e3b0e5101f4f035ff1c0b6c92cb40e0 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 26 Sep 2022 05:42:57 +0000 Subject: [PATCH 087/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E6=95=88=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=89=98=E7=9B=98=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E5=9B=BE=E6=A0=87=E6=B2=A1=E6=9C=89=E8=B7=9F=E9=9A=8F?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E5=8F=98=E5=8C=96=E8=80=8C=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将ProxyPluginController的eventFilter函数默认返回值设置为AbstractPluginsController的默认返回值 Log: 修复高效模式下托盘入口图标没有跟随位置变化而变化 Influence: 时尚模式下改变任务栏位置,观察托盘入口是否发生变化 Bug: https://pms.uniontech.com/bug-view-147743.html Change-Id: I81ccfb3add3de93b9e9cd418c446d81fc765b199 --- frame/controller/proxyplugincontroller.cpp | 4 +--- frame/util/abstractpluginscontroller.h | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index cc5ab269b..a35d41432 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -144,8 +144,6 @@ ProxyPluginController::ProxyPluginController(QObject *parent) // 只有在非安全模式下才加载插件,安全模式会在等退出安全模式后通过接受事件的方式来加载插件 if (!qApp->property("safeMode").toBool()) QMetaObject::invokeMethod(this, &ProxyPluginController::startLoader, Qt::QueuedConnection); - - qApp->installEventFilter(this); } QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const itemInter) @@ -231,7 +229,7 @@ bool ProxyPluginController::eventFilter(QObject *watched, QEvent *event) startLoader(); } - return QObject::eventFilter(watched, event); + return AbstractPluginsController::eventFilter(watched, event); } QList ProxyPluginController::getValidController(PluginsItemInterface *itemInter) const diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index ebfc303bd..6eebacbeb 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -64,6 +64,7 @@ protected: QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; PluginsItemInterface *pluginInterAt(const QString &itemKey); PluginsItemInterface *pluginInterAt(QObject *destItem); + bool eventFilter(QObject *o, QEvent *e) override; protected Q_SLOTS: void startLoader(PluginLoader *loader); @@ -75,8 +76,6 @@ private slots: void initPlugin(PluginsItemInterface *interface); void refreshPluginSettings(); -private: - bool eventFilter(QObject *o, QEvent *e) override; private: QDBusConnectionInterface *m_dbusDaemonInterface; From 3f4ff0d292875532f6de14c9861849102282ae40 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 27 Sep 2022 02:58:33 +0000 Subject: [PATCH 088/257] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96CMakeList.tx?= =?UTF-8?q?t=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CMakeList.txt文件中从GLOB改成GLOB_RECURSE,删除重复的包含 Log: 优化CMakeList.txt文件 Influence: 无 Task: https://pms.uniontech.com/task-view-96831.html Change-Id: I2ca603eed4704f2d2c6eb87a027836e768084c7f --- frame/CMakeLists.txt | 11 +---------- plugins/airplane-mode/CMakeLists.txt | 2 -- plugins/bluetooth/CMakeLists.txt | 2 -- plugins/datetime/CMakeLists.txt | 2 -- plugins/keyboard-layout/CMakeLists.txt | 6 +----- plugins/onboard/CMakeLists.txt | 2 -- plugins/power/CMakeLists.txt | 2 -- plugins/sound/CMakeLists.txt | 2 -- plugins/trash/CMakeLists.txt | 4 +--- plugins/tray/CMakeLists.txt | 4 ---- 10 files changed, 3 insertions(+), 34 deletions(-) diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index 456d0f599..b78048e9b 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -12,16 +12,7 @@ endif() generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) # Sources files -file(GLOB_RECURSE SRCS "*.h" - "*.cpp" - "../widgets/*.h" - "../widgets/*.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" - "./qtdbusextended/*.h" - "./qtdbusextended/*.cpp" - "./dbusinterface/types/*.h" - "./dbusinterface/types/*.cpp") +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../widgets/*.h" "../widgets/*.cpp") # Find the library find_package(PkgConfig REQUIRED) diff --git a/plugins/airplane-mode/CMakeLists.txt b/plugins/airplane-mode/CMakeLists.txt index 5a8bab952..b28736de2 100644 --- a/plugins/airplane-mode/CMakeLists.txt +++ b/plugins/airplane-mode/CMakeLists.txt @@ -12,8 +12,6 @@ file(GLOB_RECURSE SRCS "*.h" "../../widgets/*.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") diff --git a/plugins/bluetooth/CMakeLists.txt b/plugins/bluetooth/CMakeLists.txt index 3072dd5c2..ffe049b77 100644 --- a/plugins/bluetooth/CMakeLists.txt +++ b/plugins/bluetooth/CMakeLists.txt @@ -16,8 +16,6 @@ file(GLOB_RECURSE SRCS "*.h" "../../frame/util/statebutton.cpp" "../../frame/util/horizontalseperator.h" "../../frame/util/horizontalseperator.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") diff --git a/plugins/datetime/CMakeLists.txt b/plugins/datetime/CMakeLists.txt index a21a92061..a4962985f 100644 --- a/plugins/datetime/CMakeLists.txt +++ b/plugins/datetime/CMakeLists.txt @@ -10,8 +10,6 @@ file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" - "./dbusinterface/*.h" - "./dbusinterface/*.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp" "") diff --git a/plugins/keyboard-layout/CMakeLists.txt b/plugins/keyboard-layout/CMakeLists.txt index 76ed7434f..376574684 100644 --- a/plugins/keyboard-layout/CMakeLists.txt +++ b/plugins/keyboard-layout/CMakeLists.txt @@ -8,12 +8,8 @@ generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_ # Sources files file(GLOB_RECURSE SRCS "*.h" "*.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" "../../frame/qtdbusextended/*.h" - "../../frame/qtdbusextended/*.cpp" - "./dbusinterface/types/*.h" - "./dbusinterface/types/*.cpp") + "../../frame/qtdbusextended/*.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/onboard/CMakeLists.txt b/plugins/onboard/CMakeLists.txt index aa3d2eff3..54eca840a 100644 --- a/plugins/onboard/CMakeLists.txt +++ b/plugins/onboard/CMakeLists.txt @@ -10,8 +10,6 @@ file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") diff --git a/plugins/power/CMakeLists.txt b/plugins/power/CMakeLists.txt index 1cd9e364f..b68a5a83e 100644 --- a/plugins/power/CMakeLists.txt +++ b/plugins/power/CMakeLists.txt @@ -10,8 +10,6 @@ file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") diff --git a/plugins/sound/CMakeLists.txt b/plugins/sound/CMakeLists.txt index f101dc90e..1e677d8db 100644 --- a/plugins/sound/CMakeLists.txt +++ b/plugins/sound/CMakeLists.txt @@ -14,8 +14,6 @@ file(GLOB_RECURSE SRCS "*.h" "../../frame/util/imageutil.cpp" "../../frame/util/horizontalseperator.h" "../../frame/util/horizontalseperator.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") diff --git a/plugins/trash/CMakeLists.txt b/plugins/trash/CMakeLists.txt index a08f4c468..c8c07da2b 100644 --- a/plugins/trash/CMakeLists.txt +++ b/plugins/trash/CMakeLists.txt @@ -6,12 +6,10 @@ project(${PLUGIN_NAME}) generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) # Sources files -file(GLOB SRCS "*.h" +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") diff --git a/plugins/tray/CMakeLists.txt b/plugins/tray/CMakeLists.txt index e9ba79466..018b86e93 100644 --- a/plugins/tray/CMakeLists.txt +++ b/plugins/tray/CMakeLists.txt @@ -38,10 +38,6 @@ file(GLOB_RECURSE SRCS "*.h" "../../frame/controller/proxyplugincontroller.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp" - "./dbusinterface/generation_dbus_interface/*.h" - "./dbusinterface/generation_dbus_interface/*.cpp" - "./dbusinterface/types/*.h" - "./dbusinterface/types/*.cpp" ) find_package(PkgConfig REQUIRED) From ebccd7337887f0b62abe66a191e9d4b67ad08f54 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 28 Sep 2022 07:05:04 +0000 Subject: [PATCH 089/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E5=90=AF=E5=8A=A8=E5=99=A8=E5=90=8E=E9=BC=A0=E6=A0=87?= =?UTF-8?q?=E5=86=8D=E6=AC=A1=E7=82=B9=E5=87=BB=E6=97=A0=E6=B3=95=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=90=AF=E5=8A=A8=E5=99=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 接口调用从Show改成Toggle Log: Influence: 从任务栏点击鼠标开启启动器,再次点击鼠标,观察启动器是否收缩 Task: https://pms.uniontech.com/task-view-198183.html Change-Id: I956270a1f601e913385ee334d4f240bf3f85c349 --- frame/item/launcheritem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/item/launcheritem.cpp b/frame/item/launcheritem.cpp index 2c8195e4f..b333a35ee 100644 --- a/frame/item/launcheritem.cpp +++ b/frame/item/launcheritem.cpp @@ -108,7 +108,7 @@ void LauncherItem::mouseReleaseEvent(QMouseEvent *e) QDBusPendingReply visibleReply = dbusSender.property("Visible").get(); if (!visibleReply.value()) - dbusSender.method("Show").call(); + dbusSender.method("Toggle").call(); } QWidget *LauncherItem::popupTips() From cb96a7bab85d29ea31aba9953ada743cf627ccc8 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 11 Oct 2022 08:29:02 +0000 Subject: [PATCH 090/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E4=B8=8B=E7=AA=97=E5=8F=A3=E9=A2=84=E8=A7=88=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将获取窗口预览图的接口修改为CaptureWindow接口来获取,在wayland和x11下接口统一 Log: 修复wayland下窗口预览图为空的问题 Influence: 进入wayland,鼠标放入任务栏已经打开的窗口图标上,观察预览图是否显示 Bug: https://pms.uniontech.com/bug-view-140919.html Bug: https://pms.uniontech.com/bug-view-150475.html Change-Id: Idc18a356c8df19a73130362e839a61ed26108d23 --- frame/item/appmultiitem.cpp | 15 +--- frame/item/appmultiitem.h | 2 +- frame/item/components/appsnapshot.cpp | 53 ++++-------- frame/item/components/appsnapshot.h | 6 +- frame/item/components/floatingpreview.cpp | 2 +- frame/util/imageutil.cpp | 98 ++++++++++++++--------- frame/util/imageutil.h | 6 +- 7 files changed, 87 insertions(+), 95 deletions(-) diff --git a/frame/item/appmultiitem.cpp b/frame/item/appmultiitem.cpp index f387912f8..cabb94260 100644 --- a/frame/item/appmultiitem.cpp +++ b/frame/item/appmultiitem.cpp @@ -109,20 +109,13 @@ void AppMultiItem::paintEvent(QPaintEvent *) painter.setRenderHint(QPainter::Antialiasing, true); painter.setRenderHint(QPainter::SmoothPixmapTransform, true); - if (m_snapImage.isNull()) { -#ifdef USE_AM - if (Utils::IS_WAYLAND_DISPLAY) - m_snapImage = ImageUtil::loadWindowThumb(m_windowInfo.uuid, width() - 20, height() - 20); - else -#endif - m_snapImage = ImageUtil::loadWindowThumb(m_winId, width() - 20, height() - 20); - } + if (m_pixmap.isNull()) + m_pixmap = ImageUtil::loadWindowThumb(Utils::IS_WAYLAND_DISPLAY ? m_windowInfo.uuid : QString::number(m_winId)); DStyleHelper dstyle(style()); const int radius = dstyle.pixelMetric(DStyle::PM_FrameRadius); QRect itemRect = rect(); itemRect.marginsRemoved(QMargins(6, 6, 6, 6)); - QPixmap pixmapWindowIcon = QPixmap::fromImage(m_snapImage); QPainterPath path; path.addRoundedRect(rect(), radius, radius); painter.fillPath(path, Qt::transparent); @@ -133,12 +126,12 @@ void AppMultiItem::paintEvent(QPaintEvent *) painter.fillPath(path, backColor); } - itemRect = m_snapImage.rect(); + itemRect = m_pixmap.rect(); int itemWidth = itemRect.width(); int itemHeight = itemRect.height(); int x = (rect().width() - itemWidth) / 2; int y = (rect().height() - itemHeight) / 2; - painter.drawPixmap(QRect(x, y, itemWidth, itemHeight), pixmapWindowIcon); + painter.drawPixmap(QRect(x, y, itemWidth, itemHeight), m_pixmap); QPixmap pixmapAppIcon; ThemeAppIcon::getIcon(pixmapAppIcon, m_entryInter->icon(), qMin(width(), height()) * 0.8); diff --git a/frame/item/appmultiitem.h b/frame/item/appmultiitem.h index ea9963f0c..3c0c2d0a5 100644 --- a/frame/item/appmultiitem.h +++ b/frame/item/appmultiitem.h @@ -59,7 +59,7 @@ private: AppItem *m_appItem; WindowInfo m_windowInfo; DockEntryInter *m_entryInter; - QImage m_snapImage; + QPixmap m_pixmap; WId m_winId; QMenu *m_menu; }; diff --git a/frame/item/components/appsnapshot.cpp b/frame/item/components/appsnapshot.cpp index dd598235a..a271fc617 100644 --- a/frame/item/components/appsnapshot.cpp +++ b/frame/item/components/appsnapshot.cpp @@ -38,6 +38,7 @@ #include #include #include +#include struct SHMInfo { long shmid; @@ -206,31 +207,24 @@ void AppSnapshot::fetchSnapshot() if (!m_wmHelper->hasComposite()) return; - QImage qimage; SHMInfo *info = nullptr; uchar *image_data = nullptr; XImage *ximage = nullptr; // 优先使用窗管进行窗口截图 if (isKWinAvailable()) { -#ifdef USE_AM - if (Utils::IS_WAYLAND_DISPLAY) - m_snapshot = ImageUtil::loadWindowThumb(m_windowInfo.uuid, SNAP_WIDTH, SNAP_HEIGHT); - else -#endif - m_snapshot = ImageUtil::loadWindowThumb(m_wid, SNAP_WIDTH, SNAP_HEIGHT); - - m_snapshotSrcRect = m_snapshot.rect(); + const QString windowInfoId = Utils::IS_WAYLAND_DISPLAY ? m_windowInfo.uuid : QString::number(m_wid); + m_pixmap = ImageUtil::loadWindowThumb(windowInfoId); } else { do { // get window image from shm(only for deepin app) + QImage qimage; info = getImageDSHM(); if (info) { qDebug() << "get Image from dxcbplugin SHM..."; image_data = (uchar *)shmat(info->shmid, 0, 0); if ((qint64)image_data != -1) { - m_snapshot = QImage(image_data, info->width, info->height, info->bytesPerLine, (QImage::Format)info->format); - m_snapshotSrcRect = QRect(info->rect.x, info->rect.y, info->rect.width, info->rect.height); + qimage = QImage(image_data, info->width, info->height, info->bytesPerLine, (QImage::Format)info->format); break; } qDebug() << "invalid pointer of shm!"; @@ -253,23 +247,10 @@ void AppSnapshot::fetchSnapshot() Q_ASSERT(!qimage.isNull()); - // remove shadow frame - m_snapshotSrcRect = rectRemovedShadow(qimage, nullptr); - m_snapshot = qimage; + m_pixmap = QPixmap::fromImage(qimage); } while (false); } - QSizeF size(rect().marginsRemoved(QMargins(8, 8, 8, 8)).size()); - const auto ratio = devicePixelRatioF(); - size = m_snapshotSrcRect.size().scaled(size * ratio, Qt::KeepAspectRatio); - qreal scale = qreal(size.width()) / m_snapshotSrcRect.width(); - m_snapshot = m_snapshot.scaled(qRound(m_snapshot.width() * scale), qRound(m_snapshot.height() * scale), - Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - m_snapshotSrcRect.moveTop(m_snapshotSrcRect.top() * scale + 0.5); - m_snapshotSrcRect.moveLeft(m_snapshotSrcRect.left() * scale + 0.5); - m_snapshotSrcRect.setWidth(size.width() - 0.5); - m_snapshotSrcRect.setHeight(size.height() - 0.5); - if (image_data) shmdt(image_data); if (ximage) XDestroyImage(ximage); if (info) XFree(info); @@ -312,7 +293,7 @@ void AppSnapshot::paintEvent(QPaintEvent *e) return; } - if (m_snapshot.isNull()) + if (m_pixmap.isNull()) return; const auto ratio = devicePixelRatioF(); @@ -324,22 +305,20 @@ void AppSnapshot::paintEvent(QPaintEvent *e) painter.drawRoundedRect(rect(), 5, 5); } - // draw image - const QImage &im = m_snapshot; - - const qreal offset_x = width() / 2.0 - m_snapshotSrcRect.width() / ratio / 2 - m_snapshotSrcRect.left() / ratio; - const qreal offset_y = height() / 2.0 - m_snapshotSrcRect.height() / ratio / 2 - m_snapshotSrcRect.top() / ratio; + const qreal offset_x = width() / 2.0 - SNAP_WIDTH / ratio / 2; + const qreal offset_y = height() / 2.0 - SNAP_HEIGHT / ratio / 2; DStyleHelper dstyle(style()); const int radius = dstyle.pixelMetric(DStyle::PM_FrameRadius); - QBrush brush; - brush.setTextureImage(im); - painter.setBrush(brush); - painter.setPen(Qt::NoPen); - painter.scale(1 / ratio, 1 / ratio); + painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); painter.translate(QPoint(offset_x * ratio, offset_y * ratio)); - painter.drawRoundedRect(m_snapshotSrcRect, radius * ratio, radius * ratio); + QRect imageRect(8, 8, width() - 16, height() - 16); + painter.setPen(Qt::NoPen); + QPainterPath path; + path.addRoundedRect(imageRect, radius * ratio, radius * ratio); + painter.setClipPath(path); + painter.drawPixmap(imageRect, m_pixmap, m_pixmap.rect()); } void AppSnapshot::mousePressEvent(QMouseEvent *e) diff --git a/frame/item/components/appsnapshot.h b/frame/item/components/appsnapshot.h index 8282caefe..811acdbd7 100644 --- a/frame/item/components/appsnapshot.h +++ b/frame/item/components/appsnapshot.h @@ -68,8 +68,7 @@ public: inline bool attentioned() const { return m_windowInfo.attention; } inline bool closeAble() const { return m_closeAble; } inline void setCloseAble(const bool value) { m_closeAble = value; } - inline const QImage snapshot() const { return m_snapshot; } - inline const QRectF snapshotGeometry() const { return m_snapshotSrcRect; } + inline const QPixmap snapshot() const { return m_pixmap; } inline const QString title() const { return m_windowInfo.title; } void setWindowState(); void setTitleVisible(bool bVisible); @@ -108,8 +107,7 @@ private: bool m_closeAble; bool m_isWidowHidden; - QImage m_snapshot; - QRectF m_snapshotSrcRect; + QPixmap m_pixmap; Dock::TipsWidget *m_title; DPushButton *m_3DtitleBtn; diff --git a/frame/item/components/floatingpreview.cpp b/frame/item/components/floatingpreview.cpp index be9960d0c..925f6d2f6 100644 --- a/frame/item/components/floatingpreview.cpp +++ b/frame/item/components/floatingpreview.cpp @@ -109,7 +109,7 @@ void FloatingPreview::paintEvent(QPaintEvent *e) if (m_tracked.isNull()) return; - const QImage &snapshot = m_tracked->snapshot(); + const QPixmap &snapshot = m_tracked->snapshot(); if (snapshot.isNull()) return; diff --git a/frame/util/imageutil.cpp b/frame/util/imageutil.cpp index e3bc0a00c..7167bc6b4 100644 --- a/frame/util/imageutil.cpp +++ b/frame/util/imageutil.cpp @@ -32,9 +32,15 @@ #include #include #include +#include +#include #include +#include +#include +#include + const QPixmap ImageUtil::loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio) { QIcon icon = QIcon::fromTheme(iconName); @@ -88,52 +94,66 @@ QCursor* ImageUtil::loadQCursorFromX11Cursor(const char* theme, const char* curs return cursor; } -QImage ImageUtil::loadWindowThumb(const WId &windowId, int width, int height) +QPixmap ImageUtil::loadWindowThumb(const QString &winInfoId) { - QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Screenshot"), QStringLiteral("org.kde.kwin.Screenshot")); + // 在tmp下创建临时目录,用来存放缩略图 + QString thumbPath(imagePath()); + QDir dir(thumbPath); + if (!dir.exists()) + dir.mkpath(thumbPath); - QList args; - args << QVariant::fromValue(windowId); - args << QVariant::fromValue(quint32(width)); - args << QVariant::fromValue(quint32(height)); - - QDBusReply reply = interface.callWithArgumentList(QDBus::Block, QStringLiteral("screenshotForWindowExtend"), args); - if(reply.isValid()){ - const QString tmpFile = reply.value(); - if (QFile::exists(tmpFile)) { - QImage image(tmpFile); - QFile::remove(tmpFile); - return image; - } - qDebug() << "get current workspace background error, file does not exist : " << tmpFile; - } else { - qDebug() << "get current workspace background error: "<< reply.error().message(); + QString fileName = QString("%1/%2").arg(thumbPath).arg(winInfoId); + int fileId = open(fileName.toLocal8Bit().data(), O_CREAT | O_RDWR, S_IWUSR | S_IRUSR); + if (fileId < 0) { + //打开文件失败 + return QPixmap(); } - return QImage(); -} - -QImage ImageUtil::loadWindowThumb(const QString &uuid, int width, int height) -{ - QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Screenshot"), QStringLiteral("org.kde.kwin.Screenshot")); - + QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/org/kde/KWin/ScreenShot2"), QStringLiteral("org.kde.KWin.ScreenShot2")); + // 第一个参数,winID或者UUID QList args; - args << QVariant::fromValue(uuid); - args << QVariant::fromValue(quint32(width)); - args << QVariant::fromValue(quint32(height)); + args << QVariant::fromValue(winInfoId); + // 第二个参数,需要截图的选项 + QVariantMap option; + option["include-decoration"] = true; + option["include-cursor"] = false; + option["native-resolution"] = true; + args << QVariant::fromValue(option); + // 第三个参数,文件描述符 + args << QVariant::fromValue(QDBusUnixFileDescriptor(fileId)); - QDBusReply reply = interface.callWithArgumentList(QDBus::Block, QStringLiteral("screenshotForWindowExtendUuid"), args); - if(reply.isValid()){ - const QString tmpFile = reply.value(); - if (QFile::exists(tmpFile)) { - QImage image(tmpFile); - QFile::remove(tmpFile); - return image; - } - qDebug() << "get current workspace background error, file does not exist : " << tmpFile; - } else { + QDBusReply reply = interface.callWithArgumentList(QDBus::Block, QStringLiteral("CaptureWindow"), args); + if(!reply.isValid()) { + close(fileId); qDebug() << "get current workspace background error: "<< reply.error().message(); + return QPixmap(); } - return QImage(); + QVariantMap imageInfo = reply.value(); + int imageWidth = imageInfo.value("width").toUInt(); + int imageHeight = imageInfo.value("height").toUInt(); + int imageStride = imageInfo.value("stride").toUInt(); + int imageFormat = imageInfo.value("format").toUInt(); + + QFile file; + if (!file.open(fileId, QIODevice::ReadOnly)) { + close(fileId); + return QPixmap(); + } + + if (file.size() == 0) { + file.close(); + return QPixmap(); + } + + QByteArray fileContent = file.readAll(); + QImage image(reinterpret_cast(fileContent.data()), imageWidth, imageHeight, imageStride, static_cast(imageFormat)); + QPixmap pixmap = QPixmap::fromImage(image); + close(fileId); + return pixmap; +} + +QString ImageUtil::imagePath() +{ + return QString("%1/dde-dock/windowthumb").arg(QDir::tempPath()); } diff --git a/frame/util/imageutil.h b/frame/util/imageutil.h index 204b10153..0cc336ea2 100644 --- a/frame/util/imageutil.h +++ b/frame/util/imageutil.h @@ -36,8 +36,10 @@ public: static const QPixmap loadSvg(const QString &iconName, const QSize size, const qreal ratio = qApp->devicePixelRatio()); static QCursor* loadQCursorFromX11Cursor(const char* theme, const char* cursorName, int cursorSize); // 加载窗口的预览图 - static QImage loadWindowThumb(const WId &windowId, int width, int height); // x11下加载,用windowID - static QImage loadWindowThumb(const QString &uuid, int width, int height); // wayland下加载,用uuid + static QPixmap loadWindowThumb(const QString &winInfoId); // 加载图片,参数为windowId或者窗口的UUID + +private: + static QString imagePath(); }; #endif // IMAGEUTIL_H From 480f621fbfa18fdc0f695bf43c17661b990de06d Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 13 Oct 2022 05:58:00 +0000 Subject: [PATCH 091/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=9C=A8=E5=8F=B3=E4=BE=A7=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 计算任务栏右侧位置的时候,x坐标设置错误导致窗口向右移动后,任务栏计算重合区域错误,将x坐标修改为正确的位置即可解决 Log: 修复任务栏在右侧智能隐藏失败的问题 Influence: 任务栏右侧智能隐藏,将窗口拖动到任务栏的右侧,观察任务栏是否隐藏 Bug: https://pms.uniontech.com/bug-view-154513.html Change-Id: Ia4357c60872acf502295d9339160339a33626bcc --- frame/window/windowmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 6fb1fc266..da00261ee 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -375,7 +375,7 @@ QRect WindowManager::getDockGeometry(bool withoutScale) const y = windowRect.y(); if (i == 0) { - y = windowRect.y(); + x = windowRect.x(); width = windowRect.width(); } height += windowRect.height() + mainWindow->dockSpace(); From 7ffb1e0188627326afb2d194dfc3a2a2428c6e2e Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Mon, 17 Oct 2022 14:08:46 +0800 Subject: [PATCH 092/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B7=A8?= =?UTF-8?q?=E7=AB=AF=E5=8D=8F=E5=90=8C=E8=AE=BE=E5=A4=87=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=AF=B9=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.原有获取设备数错误,已修复。 2.修改设备列表以设备uuid为标识一台设备方案,改为使用MachinePath,避免服务挂掉重启后,设备列表不更新导致设备连接异常。 3.增加页面显示判断后端服务valid,如果invalid,则清空设备列表数据。 4.去掉自动扫描功能,后端已提供定时发送扫描的全量设备。 Log: 修复跨端协同设备列表数量显示不对的问题。 Bug: https://pms.uniontech.com/task-view-203831.html Influence: 跨端协同设备数量,及设备协同连接。 Change-Id: I3a2cb2f5f77f36df89db53e135838c79df8498ed --- frame/model/collaborationdevmodel.cpp | 50 ++++++-------- frame/model/collaborationdevmodel.h | 9 ++- .../components/devcollaborationwidget.cpp | 65 +++++++++---------- .../components/devcollaborationwidget.h | 3 +- frame/window/components/devitemdelegate.h | 8 +-- 5 files changed, 61 insertions(+), 74 deletions(-) diff --git a/frame/model/collaborationdevmodel.cpp b/frame/model/collaborationdevmodel.cpp index 81be2d560..a987e1b00 100644 --- a/frame/model/collaborationdevmodel.cpp +++ b/frame/model/collaborationdevmodel.cpp @@ -39,7 +39,6 @@ static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties"; CollaborationDevModel::CollaborationDevModel(QObject *parent) : QObject(parent) - , m_timer(new QTimer(this)) , m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this)) { if (m_colDbusInter->isValid()) { @@ -56,21 +55,18 @@ CollaborationDevModel::CollaborationDevModel(QObject *parent) } m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); - - connect(m_timer, &QTimer::timeout, this, &CollaborationDevModel::callScanMethod); + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); } -void CollaborationDevModel::scanDevice() +void CollaborationDevModel::checkServiceValid() { - callScanMethod(); - m_timer->start(30 * 1000); // 30s -} - -void CollaborationDevModel::stopScanDevice() -{ - if (m_timer->isActive()) - m_timer->stop(); + if (!m_colDbusInter->isValid()) { + for (CollaborationDevice *device : m_devices) { + device->deleteLater(); + } + m_devices.clear(); + Q_EMIT devicesChanged(); + } } QList CollaborationDevModel::devices() const @@ -90,17 +86,15 @@ void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg) QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); if (changedProps.contains("Machines")) { - QStringList devPaths = changedProps.value("Machines").toStringList(); + QList paths = m_colDbusInter->property("Machines").value>(); + QStringList devPaths; + for (const QDBusObjectPath& path : paths) { + devPaths << path.path(); + } updateDevice(devPaths); } } -void CollaborationDevModel::callScanMethod() -{ - // TODO 该功能目前不可用 - // m_dbusInter->asyncCall("Scan"); -} - void CollaborationDevModel::updateDevice(const QStringList &devPaths) { if (devPaths.isEmpty()) { @@ -132,16 +126,9 @@ void CollaborationDevModel::updateDevice(const QStringList &devPaths) emit devicesChanged(); } -const CollaborationDevice *CollaborationDevModel::getDevice(const QString &uuid) +const CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath) { - QList devices = m_devices.values(); - for (const CollaborationDevice *device : devices) { - if (device->uuid() == uuid) { - return device; - } - } - - return nullptr; + return m_devices.value(machinePath, nullptr); } CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent) @@ -184,6 +171,11 @@ QString CollaborationDevice::uuid() const return m_uuid; } +QString CollaborationDevice::machinePath() const +{ + return m_path; +} + QString CollaborationDevice::deviceIcon() const { switch (m_OS) { diff --git a/frame/model/collaborationdevmodel.h b/frame/model/collaborationdevmodel.h index 8a2ca1487..cab4b4db2 100644 --- a/frame/model/collaborationdevmodel.h +++ b/frame/model/collaborationdevmodel.h @@ -43,20 +43,18 @@ signals: void devicesChanged(); public: - void scanDevice(); - void stopScanDevice(); + void checkServiceValid(); + QList devices() const; - const CollaborationDevice *getDevice(const QString &uuid); + const CollaborationDevice *getDevice(const QString &machinePath); private slots: void onPropertyChanged(const QDBusMessage &msg); private: - void callScanMethod(); void updateDevice(const QStringList &devPaths); private: - QTimer *m_timer; // 定时扫描设备 QDBusInterface *m_colDbusInter; // machine path : device object QMap m_devices; @@ -84,6 +82,7 @@ public: QString name() const; QString uuid() const; + QString machinePath() const; QString deviceIcon() const; bool isPaired() const; bool isCooperated() const; diff --git a/frame/window/components/devcollaborationwidget.cpp b/frame/window/components/devcollaborationwidget.cpp index e9855f322..0da6ab4ae 100644 --- a/frame/window/components/devcollaborationwidget.cpp +++ b/frame/window/components/devcollaborationwidget.cpp @@ -54,18 +54,11 @@ DevCollaborationWidget::DevCollaborationWidget(QWidget *parent) void DevCollaborationWidget::showEvent(QShowEvent *event) { - m_deviceModel->scanDevice(); + m_deviceModel->checkServiceValid(); QWidget::showEvent(event); } -void DevCollaborationWidget::hideEvent(QHideEvent *event) -{ - m_deviceModel->stopScanDevice(); - - QWidget::hideEvent(event); -} - void DevCollaborationWidget::initUI() { m_deviceListView->setModel(m_viewItemModel); @@ -133,12 +126,12 @@ void DevCollaborationWidget::addItem(const CollaborationDevice *device) int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; item->setData(QVariant::fromValue(data), DevItemDelegate::StaticDataRole); - item->setData(device->uuid(), DevItemDelegate::UUIDDataRole); + item->setData(device->machinePath(), DevItemDelegate::MachinePathDataRole); item->setData(0, DevItemDelegate::DegreeDataRole); item->setData(resultState, DevItemDelegate::ResultDataRole); m_viewItemModel->appendRow(item); - m_uuidItemMap[device->uuid()] = item; + m_deviceItemMap[device->machinePath()] = item; connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged); } @@ -157,24 +150,24 @@ void DevCollaborationWidget::updateDeviceListView() if (!item) continue; - QString uuid = item->data(DevItemDelegate::UUIDDataRole).toString(); - if (m_deviceModel->getDevice(uuid)) + QString machinePath = item->data(DevItemDelegate::MachinePathDataRole).toString(); + if (m_deviceModel->getDevice(machinePath)) continue; m_deviceListView->removeItem(row); - if (m_uuidItemMap.contains(uuid)) { - m_uuidItemMap.remove(uuid); + if (m_deviceItemMap.contains(machinePath)) { + m_deviceItemMap.remove(machinePath); } - if (m_connectingDevices.contains(uuid)) { - m_connectingDevices.removeAll(uuid); + if (m_connectingDevices.contains(machinePath)) { + m_connectingDevices.removeAll(machinePath); } } // 处理新增 for (CollaborationDevice *device : devices) { - if (!m_uuidItemMap.contains(device->uuid())) { + if (!m_deviceItemMap.contains(device->machinePath())) { addItem(device); } } @@ -189,19 +182,23 @@ void DevCollaborationWidget::resetWidgetSize() void DevCollaborationWidget::itemClicked(const QModelIndex &index) { - QString uuid = index.data(DevItemDelegate::UUIDDataRole).toString(); - const CollaborationDevice *device = m_deviceModel->getDevice(uuid); + QString machinePath = index.data(DevItemDelegate::MachinePathDataRole).toString(); + const CollaborationDevice *device = m_deviceModel->getDevice(machinePath); if (!device) return; if (!device->isPaired()) { device->pair(); - m_connectingDevices.append(uuid); + if (!m_connectingDevices.contains(machinePath)) + m_connectingDevices.append(machinePath); } else if (!device->isCooperated()) { device->requestCooperate(); - m_connectingDevices.append(uuid); + if (!m_connectingDevices.contains(machinePath)) + m_connectingDevices.append(machinePath); } else if (device->isCooperated()) { device->disconnectDevice(); + if (m_connectingDevices.contains(machinePath)) + m_connectingDevices.removeOne(machinePath); } if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive()) @@ -214,18 +211,18 @@ void DevCollaborationWidget::itemStatusChanged() if (!device) return; - QString uuid = device->uuid(); - if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) { + QString machinePath = device->machinePath(); + if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { // 更新item的连接状态 int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; - m_uuidItemMap[uuid]->setData(resultState, DevItemDelegate::ResultDataRole); + m_deviceItemMap[machinePath]->setData(resultState, DevItemDelegate::ResultDataRole); if (device->isCooperated()) - m_uuidItemMap[uuid]->setData(0, DevItemDelegate::DegreeDataRole); + m_deviceItemMap[machinePath]->setData(0, DevItemDelegate::DegreeDataRole); - m_deviceListView->update(m_uuidItemMap[uuid]->index()); + m_deviceListView->update(m_deviceItemMap[machinePath]->index()); - if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(uuid)) { - m_connectingDevices.removeAll(uuid); + if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(machinePath)) { + m_connectingDevices.removeAll(machinePath); } } } @@ -237,13 +234,13 @@ void DevCollaborationWidget::refreshViewItem() return; } - for (const QString &uuid : m_connectingDevices) { - if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) { - int degree = m_uuidItemMap[uuid]->data(DevItemDelegate::DegreeDataRole).toInt(); + for (const QString &machinePath : m_connectingDevices) { + if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { + int degree = m_deviceItemMap[machinePath]->data(DevItemDelegate::DegreeDataRole).toInt(); degree += PER_DEGREE; // 递进值 - m_uuidItemMap[uuid]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole); - m_uuidItemMap[uuid]->setData(degree, DevItemDelegate::DegreeDataRole); - m_deviceListView->update(m_uuidItemMap[uuid]->index()); + m_deviceItemMap[machinePath]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole); + m_deviceItemMap[machinePath]->setData(degree, DevItemDelegate::DegreeDataRole); + m_deviceListView->update(m_deviceItemMap[machinePath]->index()); } } } diff --git a/frame/window/components/devcollaborationwidget.h b/frame/window/components/devcollaborationwidget.h index bef33c479..c7dd90aeb 100644 --- a/frame/window/components/devcollaborationwidget.h +++ b/frame/window/components/devcollaborationwidget.h @@ -41,7 +41,6 @@ public: protected: void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; private slots: void loadDevice(); @@ -60,7 +59,7 @@ private: CollaborationDevModel *m_deviceModel; DListView *m_deviceListView; QStandardItemModel *m_viewItemModel; - QMap m_uuidItemMap; + QMap m_deviceItemMap; QStringList m_connectingDevices; QTimer *m_refreshTimer; diff --git a/frame/window/components/devitemdelegate.h b/frame/window/components/devitemdelegate.h index 266d07a2a..e97d3455a 100644 --- a/frame/window/components/devitemdelegate.h +++ b/frame/window/components/devitemdelegate.h @@ -31,10 +31,10 @@ class DevItemDelegate : public QStyledItemDelegate Q_OBJECT public: enum DevItemDataRole { - StaticDataRole = Qt::UserRole + 1, // 静态信息 - UUIDDataRole = Qt::UserRole + 2, // uuid, 可唯一代表一个设备 - DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数 - ResultDataRole = Qt::UserRole + 4 // 连接结果 + StaticDataRole = Qt::UserRole + 1, // 静态信息 + MachinePathDataRole = Qt::UserRole + 2, // machinePath, 可唯一代表一个设备 + DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数 + ResultDataRole = Qt::UserRole + 4 // 连接结果 }; enum ResultState { From 4d2796522400bc7de020a2942cde737763f71b35 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Fri, 14 Oct 2022 17:26:24 +0800 Subject: [PATCH 093/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=B6?= =?UTF-8?q?=E5=B0=9A=E6=A8=A1=E5=BC=8F=E4=B8=8B=E5=BF=AB=E6=8D=B7=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=9D=A2=E6=9D=BF=E6=98=BE=E7=A4=BA=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=AD=90=E9=A1=B5=E9=9D=A2=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4=E8=B7=A8=E7=AB=AF=E5=8D=8F=E5=90=8C?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 显示设置子页面获取页面的高度错误导致显示不全的问题。 Log: 修复时尚模式下快捷设置面板显示设置子页面显示不全的问题。 Bug: https://pms.uniontech.com/bug-view-160587.html Bug: https://pms.uniontech.com/bug-view-160599.html Influence: 时尚模式下显示设置子页面显示问题。 Change-Id: I52fa0d279f3ded73a2630b20f3b08dc2fb7d85c9 --- frame/window/components/brightnessadjwidget.cpp | 13 +++++++++++-- frame/window/components/devitemdelegate.cpp | 2 +- frame/window/components/displaysettingwidget.cpp | 10 +++++++++- frame/window/quicksettingcontainer.cpp | 2 ++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/frame/window/components/brightnessadjwidget.cpp b/frame/window/components/brightnessadjwidget.cpp index 3ae544459..1b339a977 100644 --- a/frame/window/components/brightnessadjwidget.cpp +++ b/frame/window/components/brightnessadjwidget.cpp @@ -25,18 +25,24 @@ #include +const int ItemSpacing = 5; + BrightnessAdjWidget::BrightnessAdjWidget(QWidget *parent) : QWidget(parent) , m_mainLayout(new QVBoxLayout(this)) , m_brightnessModel(new BrightnessModel(this)) { - m_mainLayout->setSpacing(5); + m_mainLayout->setMargin(0); + m_mainLayout->setSpacing(ItemSpacing); + loadBrightnessItem(); } void BrightnessAdjWidget::loadBrightnessItem() { QList monitors = m_brightnessModel->monitors(); + int itemHeight = monitors.count() > 1 ? 56 : 30; + for (BrightMonitor *monitor : monitors) { SliderContainer *sliderContainer = new SliderContainer(this); if (monitors.count() > 1) @@ -48,7 +54,7 @@ void BrightnessAdjWidget::loadBrightnessItem() sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 12); sliderContainer->setFixedWidth(310); - sliderContainer->setFixedHeight(monitors.count() > 1 ? 56 : 30); + sliderContainer->setFixedHeight(itemHeight); sliderContainer->updateSliderValue(monitor->brightness()); SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); @@ -58,5 +64,8 @@ void BrightnessAdjWidget::loadBrightnessItem() connect(monitor, &BrightMonitor::brightnessChanged, sliderContainer, &SliderContainer::updateSliderValue); connect(sliderContainer, &SliderContainer::sliderValueChanged, monitor, &BrightMonitor::setBrightness); } + + QMargins margins = this->contentsMargins(); + setFixedHeight(margins.top() + margins.bottom() + monitors.count() * itemHeight + monitors.count() * ItemSpacing); } diff --git a/frame/window/components/devitemdelegate.cpp b/frame/window/components/devitemdelegate.cpp index 876cde1cf..73e50d222 100644 --- a/frame/window/components/devitemdelegate.cpp +++ b/frame/window/components/devitemdelegate.cpp @@ -27,7 +27,7 @@ #include #define RADIUS_VALUE 10 -#define ITEM_SPACE 10 +#define ITEM_SPACE 20 #define ICON_WIDTH 16 #define ICON_HEIGHT 16 #define TEXT_RECT_HEIGHT 20 diff --git a/frame/window/components/displaysettingwidget.cpp b/frame/window/components/displaysettingwidget.cpp index 510108faa..6ac92c601 100644 --- a/frame/window/components/displaysettingwidget.cpp +++ b/frame/window/components/displaysettingwidget.cpp @@ -27,11 +27,13 @@ #include +const int ItemSpacing = 10; + DisplaySettingWidget::DisplaySettingWidget(QWidget *parent) : QWidget(parent) , m_brightnessAdjWidget(new BrightnessAdjWidget(this)) , m_collaborationWidget(new DevCollaborationWidget(this)) - , m_settingBtn(new QPushButton(this)) + , m_settingBtn(new QPushButton(tr("Display setting"), this)) { initUI(); @@ -46,8 +48,10 @@ DisplaySettingWidget::DisplaySettingWidget(QWidget *parent) void DisplaySettingWidget::initUI() { + setContentsMargins(0, 10, 0, 30); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->setMargin(0); + mainLayout->setSpacing(ItemSpacing); mainLayout->addWidget(m_brightnessAdjWidget); mainLayout->addWidget(m_collaborationWidget); @@ -55,4 +59,8 @@ void DisplaySettingWidget::initUI() mainLayout->addStretch(); setLayout(mainLayout); + + QMargins margins = this->contentsMargins(); + setFixedHeight(margins.top() + margins.bottom() + m_brightnessAdjWidget->height() + + m_collaborationWidget->height() + m_settingBtn->height() + ItemSpacing * 2); } diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index bf318e80f..83549ea80 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -327,6 +327,8 @@ void QuickSettingContainer::initUi() resizeView(); setFixedWidth(ITEMWIDTH * 4 + (ITEMSPACE * 5)); }, Qt::QueuedConnection); + + m_displaySettingWidget->setVisible(false); } void QuickSettingContainer::initConnection() From a213f09616ec236cc015927317f6d89a5231fd12 Mon Sep 17 00:00:00 2001 From: baodi Date: Wed, 19 Oct 2022 12:59:13 +0800 Subject: [PATCH 094/257] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新版本号 Log: Task: https://pms.uniontech.com/task-view-204765.html Influence: 版本号 Change-Id: Iad1f011369217791fdccfaae42dde7581618680f --- debian/changelog | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/debian/changelog b/debian/changelog index eef53b148..54c9d3b89 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,39 @@ +dde-dock (6.0.4) unstable; urgency=medium + + [ Deepin Packages Builder ] + * fix: 修复托盘图标提示信息显示异常的问题(Bug: 150521)(Influence: 托盘提示信息显示) + * fix: 时尚模式时间日期tips有wayland默认tittle(Bug: 149173)(Influence: 任务栏时尚模式下时间日期tips是否显示正常) + * fix: 修复多任务视图界面点击任意处均导致任务栏显示右键菜单的问题(Bug: 150507)(Influence: 任务栏右键菜单显示的时机) + * feat: 拖动任务栏图标实现分屏效果(Task: 163465)(Influence: 从任务栏拖动图标到屏幕上方,查看是否有分屏功能) + * feat: 开启AM宏(Task: 162227)(Influence: 无) + * fix: 修复从任务栏无法打开控制中心问题(Bug: 149189)(Influence: 任务栏-任务栏设置-打开控制中心 任务栏-蓝牙-蓝牙设置 任务栏-日期-日期时间设置 任务栏-电源-电源设置 任务栏-关机-关机设置 任务栏-声音-声音设置 观察是否正常打开控制中心) + * fix: 时尚模式下日期时间增加右键菜单(Task: 162235)(Influence: 任务栏-时尚模式,右键查看日期时间是否存在时间日期菜单) + * fix: 修复从最近使用区域移除驻留后应用图标没有驻留到应用区域最末尾(Bug: 147643)(Influence: 任务栏时尚模式下,在最近使用区域移除驻留,观察移除的驻留是否在区域的末尾) + * feat: 增加适配控制中心设置是否使用最近区域的功能(Bug: 147717)(Influence: 开关是否显示最近使用应用,时尚模式下观察最近使用应用是否显示或隐藏) + * feat: 增加窗口多开的功能(Task: 170977)(Influence: 控制中心开启多开窗口显示,观察应用打开的窗口是否在对应的位置显示) + * feat: 任务栏应用拖动到移除驻留(Bug: 147699)(Influence: 拖动任务栏应用到回收站,观察是否可以移除驻留) + * fix: 修复wayland环境下应用打开窗口无法显示预览的问题(Bug: 140919)(Influence: wayland-任务栏打开一个应用窗口,鼠标放入到窗口上,查看预览图) + * fix: 任务栏代码结构优化解耦(Bug: 137267, 140029, 134527, 146743, 150293)(Influence: 打开任务栏,观察时尚模式下圆角,左右侧区域中间是否连接在一起等) + * feat: 删除插件基类的isPrimary接口(Task: 121387)(Influence: 安装网络插件,查看网络插件是否在快捷设置面板中显示两列图标) + * fix: 修改v20的接口为v23的接口(Task: 182009)(Influence: 打开控制中心,鼠标移动唤醒任务栏等操作) + * fix: 删除任务栏对libdframeworkdbus-dev库的依赖(Task: 182009)(Influence: 打开控制中心,鼠标移动唤醒任务栏、加载插件等,观察相关功能是否正常) + * fix: 修复部分托盘服务对应进程状态异常时导致任务栏卡死问题(Bug: 121947)(Influence: 托盘服务) + * feat: 添加任务栏跨端协同操作功能。(Task: 119639)(Influence: 任务栏跨端协同功能。) + * fix: 修复任务栏在副屏上方鼠标跟随未移动到左侧的问题(Bug: 147641)(Influence: 开启鼠标跟随,任务栏默认在主屏,鼠标移动到副屏幕,任务栏跟随到副屏幕,改变任务栏位置为上,此时任务栏在副屏幕的上方,将鼠标移动到主屏幕的上方,观察任务栏是否移动到主屏幕的上方) + * feat: 删除任务栏中控制中心设置插件(Task: 130353)(Influence: 无) + * fix: 时尚模式增加阴影(Bug: 137267)(Influence: 时尚模式观察阴影) + * feat: 支持通过环境变量的形式指定插件的路径(Issue: 3402)(Influence: 影响插件加载,对旧插件保持兼容) + * fix: 修复wayland环境时尚模式下打开企业微信崩溃的问题(Task: 196629)(Influence: 进入wayland桌面,进入时尚模式,打开企业微信,双击,观察企业微信是否正常打开) + * fix: 修复高效模式下托盘入口图标没有跟随位置变化而变化(Bug: 147743)(Influence: 时尚模式下改变任务栏位置,观察托盘入口是否发生变化) + * style: 优化CMakeList.txt文件(Task: 96831)(Influence: 无) + * fix: 修复开启启动器后鼠标再次点击无法关闭启动器的问题(Task: 198183)(Influence: 从任务栏点击鼠标开启启动器,再次点击鼠标,观察启动器是否收缩) + * fix: 修复wayland下窗口预览为空的问题(Bug: 140919, 150475)(Influence: 进入wayland,鼠标放入任务栏已经打开的窗口图标上,观察预览图是否显示) + * fix: 修复任务栏在右侧智能隐藏失败(Bug: 154513)(Influence: 任务栏右侧智能隐藏,将窗口拖动到任务栏的右侧,观察任务栏是否隐藏) + * fix: 修复跨端协同设备列表数量显示不对的问题。(Bug: 203831)(Influence: 跨端协同设备数量,及设备协同连接。) + * fix: 修复时尚模式下快捷设置面板显示设置子页面显示不全,导致跨端协同设备列表显示异常问题。(Bug: 160587, 160599)(Influence: 时尚模式下显示设置子页面显示问题。) + + -- baodi Wed, 19 Oct 2022 12:57:31 +0800 + dde-dock (6.0.3) unstable; urgency=medium [ TagBuilder ] From c474ae7b23a45dfbccb4d19a8102b73eb28da1f3 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 27 Oct 2022 07:03:28 +0000 Subject: [PATCH 095/257] =?UTF-8?q?feat:=20=E8=93=9D=E7=89=99=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E9=80=82=E5=BA=94=E5=BF=AB=E6=8D=B7=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 蓝牙插件增加PluginsItemInterface的新增接口,适应快捷面板的功能 Log: Influence: 任务栏-快捷设置-蓝牙 Task: https://pms.uniontech.com/task-view-121387.html Change-Id: I324233d5b2a4dae3b7ede2ad10ccf9afb7cfd401 --- debian/dde-dock.install | 1 + frame/window/quicksettingcontainer.cpp | 24 +- frame/window/quicksettingcontainer.h | 3 +- interfaces/pluginsiteminterface.h | 2 + plugins/bluetooth/CMakeLists.txt | 4 +- plugins/bluetooth/bloothadapterwidget.cpp | 210 ++++++++++++++++++ plugins/bluetooth/bloothadapterwidget.h | 73 ++++++ plugins/bluetooth/bluetooth.json | 1 + plugins/bluetooth/bluetoothitem.cpp | 19 +- plugins/bluetooth/bluetoothitem.h | 4 +- plugins/bluetooth/bluetoothplugin.cpp | 36 ++- plugins/bluetooth/bluetoothplugin.h | 9 + plugins/bluetooth/bluetoothwidget.cpp | 137 ++++++++++++ plugins/bluetooth/bluetoothwidget.h | 62 ++++++ .../bluetooth/componments/adaptersmanager.cpp | 46 ++-- .../bluetooth/componments/adaptersmanager.h | 1 + .../bluetooth/componments/bluetoothapplet.cpp | 9 +- .../bluetooth/componments/bluetoothapplet.h | 4 +- 18 files changed, 600 insertions(+), 45 deletions(-) create mode 100644 plugins/bluetooth/bloothadapterwidget.cpp create mode 100644 plugins/bluetooth/bloothadapterwidget.h create mode 100644 plugins/bluetooth/bluetoothwidget.cpp create mode 100644 plugins/bluetooth/bluetoothwidget.h diff --git a/debian/dde-dock.install b/debian/dde-dock.install index 1091cba33..1de3b1685 100644 --- a/debian/dde-dock.install +++ b/debian/dde-dock.install @@ -7,6 +7,7 @@ usr/lib/dde-dock/plugins/libtrash.so usr/lib/dde-dock/plugins/libtray.so usr/lib/dde-dock/plugins/liboverlay-warning.so usr/lib/dde-dock/plugins/system-trays +usr/lib/dde-dock/plugins/quick-trays usr/lib/dde-dock/plugins/libmultitasking.so usr/lib/dde-dock/plugins/libshow-desktop.so usr/lib/dde-dock/plugins/system-trays/libkeyboard-layout.so diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 83549ea80..82205c1bd 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -158,17 +158,18 @@ void QuickSettingContainer::onItemDetailClick(PluginsItemInterface *pluginInter) if (!quickItemWidget) return; - QWidget *widget = pluginInter->itemWidget(quickItemWidget->itemKey()); + QWidget *widget = pluginInter->itemPopupApplet(QUICK_ITEM_DETAIL_KEY); if (!widget) return; showWidget(widget, pluginInter->pluginDisplayName()); + onResizeView(); } bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) { if (watched == m_childPage && event->type() == QEvent::Resize) - resizeView(); + onResizeView(); return QWidget::eventFilter(watched, event); } @@ -184,7 +185,7 @@ void QuickSettingContainer::onPluginInsert(QuickSettingItem *quickItem) { initQuickItem(quickItem); updateItemLayout(); - resizeView(); + onResizeView(); } void QuickSettingContainer::onPluginRemove(QuickSettingItem *quickItem) @@ -196,7 +197,7 @@ void QuickSettingContainer::onPluginRemove(QuickSettingItem *quickItem) //调整子控件的位置 updateItemLayout(); - resizeView(); + onResizeView(); } void QuickSettingContainer::mousePressEvent(QMouseEvent *event) @@ -324,7 +325,7 @@ void QuickSettingContainer::initUi() if (pluginItems.size() > 0) updateItemLayout(); // 设置当前窗口的大小 - resizeView(); + onResizeView(); setFixedWidth(ITEMWIDTH * 4 + (ITEMSPACE * 5)); }, Qt::QueuedConnection); @@ -335,18 +336,18 @@ void QuickSettingContainer::initConnection() { connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, &QuickSettingContainer::onPluginInsert); connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); - connect(m_playerWidget, &MediaWidget::visibleChanged, this, [ this ] { resizeView(); }); - connect(m_volumnWidget, &VolumeWidget::visibleChanged, this, [ this ] { resizeView(); }); + connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); + connect(m_volumnWidget, &VolumeWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); connect(m_volumnWidget, &VolumeWidget::rightIconClick, this, [ this ] { showWidget(m_volumeSettingWidget, tr("voice")); - resizeView(); + onResizeView(); }); - connect(m_brihtnessWidget, &BrightnessWidget::visibleChanged, this, [ this ] { resizeView(); }); + connect(m_brihtnessWidget, &BrightnessWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); connect(m_brihtnessWidget->sliderContainer(), &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &iconPosition) { if (iconPosition == SliderContainer::RightIcon) { // 点击右侧的按钮,弹出具体的调节的界面 showWidget(m_displaySettingWidget, tr("brightness")); - resizeView(); + onResizeView(); } }); connect(m_childPage, &PluginChildPage::back, this, [ this ] { @@ -358,7 +359,8 @@ void QuickSettingContainer::initConnection() }); } -void QuickSettingContainer::resizeView() +// 调整尺寸 +void QuickSettingContainer::onResizeView() { if (m_switchLayout->currentWidget() == m_mainWidget) { QList pluginItems = m_pluginLoader->settingItems(); diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index e0aaf853e..91e077351 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -70,14 +70,13 @@ private Q_SLOTS: void onPluginRemove(QuickSettingItem *quickItem); void onItemDetailClick(PluginsItemInterface *pluginInter); bool eventFilter(QObject *watched, QEvent *event) override; + void onResizeView(); private: // 加载UI void initUi(); // 初始化槽函数 void initConnection(); - // 调整尺寸 - void resizeView(); // 调整控件位置 void updateItemLayout(); // 初始化控件项目 diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index c296829b6..4720dd7f1 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -34,6 +34,8 @@ enum class DockPart { SystemPanel // 系统插件显示区域 }; +// 快捷面板详情页面的itemWidget对应的itemKey +#define QUICK_ITEM_DETAIL_KEY "quick_item_detail_key" /// /// \brief The PluginsItemInterface class /// the dock plugins item interface, all dock plugins should diff --git a/plugins/bluetooth/CMakeLists.txt b/plugins/bluetooth/CMakeLists.txt index ffe049b77..78185f0d2 100644 --- a/plugins/bluetooth/CMakeLists.txt +++ b/plugins/bluetooth/CMakeLists.txt @@ -30,7 +30,7 @@ pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} resources/bluetooth.qrc) -set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../system-trays) +set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../quick-trays) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} ../../interfaces @@ -48,4 +48,4 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE ${Qt5Svg_LIBRARIES} ) -install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/system-trays) +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/quick-trays) diff --git a/plugins/bluetooth/bloothadapterwidget.cpp b/plugins/bluetooth/bloothadapterwidget.cpp new file mode 100644 index 000000000..f14503510 --- /dev/null +++ b/plugins/bluetooth/bloothadapterwidget.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "bloothadapterwidget.h" +#include "adapter.h" +#include "device.h" + +#include +#include + +#define ITEMHEIGHT 45 + +BloothAdapterWidget::BloothAdapterWidget(Adapter *adapter, QWidget *parent) + : QWidget(parent) + , m_adapter(adapter) + , m_myDeviceLabel(new QLabel(tr("my device"), this)) + , m_myDeviceView(new DListView(this)) + , m_otherDeviceLabel(new QLabel(tr("other device"), this)) + , m_otherDeviceView(new DListView(this)) + , m_myDeviceModel(new QStandardItemModel(this)) + , m_otherDeviceModel(new QStandardItemModel(this)) +{ + initUi(); + initConnection(); + initDevice(); +} + +Adapter *BloothAdapterWidget::adapter() +{ + return m_adapter; +} + +void BloothAdapterWidget::onDeviceAdded(const Device *device) +{ + if (device->name().isEmpty()) + return; + + DStandardItem *deviceItem = new DStandardItem; + deviceItem->setData(QVariant::fromValue(const_cast(device)), Dtk::UserRole + 1); + deviceItem->setText(device->name()); + if (device->paired()) { + // 我的设备 + m_myDeviceModel->insertRow(0, deviceItem); + } else { + // 其他设备 + m_otherDeviceModel->insertRow(0, deviceItem); + } + + updateDeviceVisible(); +} + +void BloothAdapterWidget::onDeviceRemoved(const Device *device) +{ + auto removeDeviceItem = [ = ](QStandardItemModel *model) { + for (int i = 0; i < model->rowCount(); i++) { + Device *tmpDevice = model->item(i)->data(Dtk::UserRole + 1).value(); + if (tmpDevice == device) { + model->removeRow(i); + return true; + } + } + + return false; + }; + + if (!removeDeviceItem(m_myDeviceModel)) + removeDeviceItem(m_otherDeviceModel); + + updateDeviceVisible(); +} + +void BloothAdapterWidget::onDeviceNameUpdated(const Device *device) const +{ + auto findDeviceItem = [ = ](QStandardItemModel *model)->DStandardItem * { + for (int i = 0; i < model->rowCount(); i++) { + DStandardItem *item = static_cast(model->item(i)); + Device *tmpDevice = item->data(Dtk::UserRole + 1).value(); + if (tmpDevice == device) { + return item; + } + } + + return nullptr; + }; + DStandardItem *item = findDeviceItem(m_myDeviceModel); + if (!item) + item = findDeviceItem(m_otherDeviceModel); + if (item) + item->setText(device->name()); +} + +void BloothAdapterWidget::onPoweredChanged(const bool powered) +{ + initDevice(); + updateDeviceVisible(); +} + +void BloothAdapterWidget::onOtherClicked(const QModelIndex &index) +{ + Device *device = index.data(Dtk::UserRole + 1).value(); + if (!device || device->state() == Device::State::StateConnected) + return; + + if (device->deviceType() == "audio-card" + && device->state() == Device::State::StateAvailable + && device->deviceType() == "pheadset") { + return; + } + + Q_EMIT requestConnectDevice(device); +} + +void BloothAdapterWidget::initUi() +{ + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + mainLayout->addWidget(m_myDeviceLabel); + mainLayout->addWidget(m_myDeviceView); + mainLayout->addSpacing(20); + mainLayout->addWidget(m_otherDeviceLabel); + mainLayout->addSpacing(6); + mainLayout->addWidget(m_otherDeviceView); + + m_myDeviceLabel->setVisible(false); + m_myDeviceView->setVisible(false); + m_myDeviceView->setModel(m_myDeviceModel); + m_myDeviceView->setFixedHeight(0); + m_myDeviceView->setItemSpacing(5); + + m_otherDeviceLabel->setVisible(false); + m_otherDeviceView->setVisible(false); + m_otherDeviceView->setModel(m_otherDeviceModel); + m_otherDeviceView->setFixedHeight(0); + m_otherDeviceView->setItemSpacing(5); +} + +void BloothAdapterWidget::initConnection() +{ + connect(m_adapter, &Adapter::deviceAdded, this, &BloothAdapterWidget::onDeviceAdded); + connect(m_adapter, &Adapter::deviceRemoved, this, &BloothAdapterWidget::onDeviceRemoved); + connect(m_adapter, &Adapter::deviceNameUpdated, this, &BloothAdapterWidget::onDeviceNameUpdated); + connect(m_adapter, &Adapter::poweredChanged, this, &BloothAdapterWidget::onPoweredChanged); + + connect(m_otherDeviceView, &DListView::clicked, this, &BloothAdapterWidget::onOtherClicked); +} + +void BloothAdapterWidget::initDevice() +{ + m_myDeviceModel->clear(); + m_otherDeviceModel->clear(); + QMap devices = m_adapter->devices(); + for (auto it = devices.begin(); it != devices.end(); it++) + onDeviceAdded(it.value()); +} + +void BloothAdapterWidget::adjustHeight() +{ + int height = m_myDeviceView->height() + 20 + m_otherDeviceView->height() + 5; + + if (m_myDeviceLabel->isVisible()) + height += m_myDeviceLabel->height(); + if (m_otherDeviceLabel->isVisible()) + height += m_otherDeviceLabel->height(); + + setFixedHeight(height); +} + +void BloothAdapterWidget::updateDeviceVisible() +{ + bool powered = m_adapter->powered(); + if (powered) { + m_myDeviceLabel->setVisible(m_myDeviceModel->rowCount() > 0); + m_myDeviceView->setVisible(m_myDeviceModel->rowCount() > 0); + m_myDeviceView->setFixedHeight(std::min(m_myDeviceModel->rowCount(), 10) * ITEMHEIGHT); + + m_otherDeviceLabel->setVisible(m_adapter->powered() && m_otherDeviceModel->rowCount() > 0); + m_otherDeviceView->setVisible(m_adapter->powered() && m_otherDeviceModel->rowCount() > 0); + m_otherDeviceView->setFixedHeight(std::min(m_otherDeviceModel->rowCount(), 10) * ITEMHEIGHT); + } else { + m_myDeviceLabel->setVisible(false); + m_myDeviceView->setVisible(false); + m_myDeviceView->setFixedHeight(0); + + m_otherDeviceLabel->setVisible(false); + m_otherDeviceView->setVisible(false); + m_otherDeviceView->setFixedHeight(0); + } + + adjustHeight(); + Q_EMIT requestUpdate(); + +} diff --git a/plugins/bluetooth/bloothadapterwidget.h b/plugins/bluetooth/bloothadapterwidget.h new file mode 100644 index 000000000..83f47dd85 --- /dev/null +++ b/plugins/bluetooth/bloothadapterwidget.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef BLOOTHADAPTERWIDGET_H +#define BLOOTHADAPTERWIDGET_H + +#include + +#include + +class Adapter; +class QLabel; +class Device; +class QStandardItemModel; + +using namespace Dtk::Widget; + +class BloothAdapterWidget : public QWidget +{ + Q_OBJECT + +public: + explicit BloothAdapterWidget(Adapter *adapter, QWidget *parent = nullptr); + + Adapter *adapter(); + +Q_SIGNALS: + void requestConnectDevice(Device *device); + void requestUpdate() const; + +protected Q_SLOTS: + void onDeviceAdded(const Device *device); + void onDeviceRemoved(const Device *device); + void onDeviceNameUpdated(const Device *device) const; + void onPoweredChanged(const bool powered); + + void onOtherClicked(const QModelIndex &index); + +private: + void initUi(); + void initConnection(); + void initDevice(); + void adjustHeight(); + void updateDeviceVisible(); + +private: + Adapter *m_adapter; + QLabel *m_myDeviceLabel; + DListView *m_myDeviceView; + QLabel *m_otherDeviceLabel; + DListView *m_otherDeviceView; + QStandardItemModel *m_myDeviceModel; + QStandardItemModel *m_otherDeviceModel; +}; + +#endif // BLOOTHADAPTERWIDGET_H diff --git a/plugins/bluetooth/bluetooth.json b/plugins/bluetooth/bluetooth.json index 8400bab79..936d08d86 100644 --- a/plugins/bluetooth/bluetooth.json +++ b/plugins/bluetooth/bluetooth.json @@ -1,4 +1,5 @@ { "api": "2.0.0", + "primary" : true, "depends-daemon-dbus-service": "org.deepin.daemon.Bluetooth1" } diff --git a/plugins/bluetooth/bluetoothitem.cpp b/plugins/bluetooth/bluetoothitem.cpp index 560fc9921..daf706d0f 100644 --- a/plugins/bluetooth/bluetoothitem.cpp +++ b/plugins/bluetooth/bluetoothitem.cpp @@ -21,6 +21,7 @@ */ #include "bluetoothitem.h" +#include "adaptersmanager.h" #include "constants.h" #include "../widgets/tipswidget.h" #include "../frame/util/imageutil.h" @@ -29,6 +30,7 @@ #include #include #include +#include #include @@ -41,10 +43,10 @@ DGUI_USE_NAMESPACE using namespace Dock; -BluetoothItem::BluetoothItem(QWidget *parent) +BluetoothItem::BluetoothItem(AdaptersManager *adapterManager, QWidget *parent) : QWidget(parent) , m_tipsLabel(new TipsWidget(this)) - , m_applet(new BluetoothApplet(this)) + , m_applet(new BluetoothApplet(adapterManager, this)) , m_devState(Device::State::StateUnavailable) , m_adapterPowered(m_applet->poweredInitState()) { @@ -195,6 +197,19 @@ bool BluetoothItem::hasAdapter() return m_applet->hasAadapter(); } +bool BluetoothItem::isPowered() +{ + if (!m_applet->hasAadapter()) + return false; + + QList adapters = m_applet->adaptersManager()->adapters(); + for (const Adapter *adapter : adapters) { + if (adapter->powered()) + return true; + } + return false; +} + void BluetoothItem::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); diff --git a/plugins/bluetooth/bluetoothitem.h b/plugins/bluetooth/bluetoothitem.h index 3e1c21a3c..89a382f6d 100644 --- a/plugins/bluetooth/bluetoothitem.h +++ b/plugins/bluetooth/bluetoothitem.h @@ -30,6 +30,7 @@ #define BLUETOOTH_KEY "bluetooth-item-key" class BluetoothApplet; +class AdaptersManager; namespace Dock { class TipsWidget; @@ -39,7 +40,7 @@ class BluetoothItem : public QWidget Q_OBJECT public: - explicit BluetoothItem(QWidget *parent = nullptr); + explicit BluetoothItem(AdaptersManager *adapterManager, QWidget *parent = nullptr); QWidget *tipsWidget(); QWidget *popupApplet(); @@ -51,6 +52,7 @@ public: void refreshTips(); bool hasAdapter(); + bool isPowered(); protected: void resizeEvent(QResizeEvent *event); diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index e7d29234c..1b9534cf2 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -21,12 +21,16 @@ */ #include "bluetoothplugin.h" +#include "bluetoothwidget.h" +#include "adaptersmanager.h" #define STATE_KEY "enable" BluetoothPlugin::BluetoothPlugin(QObject *parent) - : QObject(parent), - m_bluetoothItem(nullptr) + : QObject(parent) + , m_adapterManager(new AdaptersManager(this)) + , m_bluetoothItem(nullptr) + , m_bluetoothWidget(new BluetoothWidget(m_adapterManager)) { } @@ -47,7 +51,7 @@ void BluetoothPlugin::init(PluginProxyInterface *proxyInter) if (m_bluetoothItem) return; - m_bluetoothItem.reset(new BluetoothItem); + m_bluetoothItem.reset(new BluetoothItem(m_adapterManager)); connect(m_bluetoothItem.data(), &BluetoothItem::justHasAdapter, [&] { m_enableState = true; @@ -100,6 +104,10 @@ QWidget *BluetoothPlugin::itemPopupApplet(const QString &itemKey) return m_bluetoothItem->popupApplet(); } + if (itemKey == QUICK_ITEM_DETAIL_KEY) { + return m_bluetoothItem->popupApplet(); + } + return nullptr; } @@ -145,6 +153,28 @@ void BluetoothPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } +QIcon BluetoothPlugin::icon(const DockPart &) +{ + static QIcon icon(":/bluetooth-active-symbolic.svg"); + return icon; +} + +PluginsItemInterface::PluginStatus BluetoothPlugin::status() const +{ + if (m_bluetoothItem.data()->isPowered()) + return PluginStatus::Active; + + return PluginStatus::Deactive; +} + +QString BluetoothPlugin::description() const +{ + if (m_bluetoothItem.data()->isPowered()) + return tr("open"); + + return tr("close"); +} + void BluetoothPlugin::refreshPluginItemsVisible() { if (pluginIsDisable()) diff --git a/plugins/bluetooth/bluetoothplugin.h b/plugins/bluetooth/bluetoothplugin.h index e4db9d83e..094eb4bf4 100644 --- a/plugins/bluetooth/bluetoothplugin.h +++ b/plugins/bluetooth/bluetoothplugin.h @@ -28,6 +28,9 @@ #include +class BluetoothWidget; +class AdaptersManager; + class BluetoothPlugin : public QObject, PluginsItemInterface { Q_OBJECT @@ -53,11 +56,17 @@ public: void refreshIcon(const QString &itemKey) override; void pluginSettingsChanged() override; + QIcon icon(const DockPart &) override; + PluginStatus status() const override; + QString description() const override; + private: void refreshPluginItemsVisible(); private: + AdaptersManager *m_adapterManager; QScopedPointer m_bluetoothItem; + QScopedPointer m_bluetoothWidget; bool m_enableState = true; }; diff --git a/plugins/bluetooth/bluetoothwidget.cpp b/plugins/bluetooth/bluetoothwidget.cpp new file mode 100644 index 000000000..daf3f1408 --- /dev/null +++ b/plugins/bluetooth/bluetoothwidget.cpp @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "bluetoothwidget.h" +#include "adaptersmanager.h" +#include "bloothadapterwidget.h" +#include "adapter.h" +#include "device.h" + +#include +#include + +#include +#include + +BluetoothWidget::BluetoothWidget(AdaptersManager *adapterManager, QWidget *parent) + : QWidget(parent) + , m_switchButton(new DSwitchButton(this)) + , m_headerWidget(new QWidget(this)) + , m_adapterWidget(new QWidget(this)) + , m_adaptersManager(adapterManager) + , m_adapterLayout(new QVBoxLayout(m_adapterWidget)) +{ + initUi(); + initConnection(); +} + +BluetoothWidget::~BluetoothWidget() +{ +} + +void BluetoothWidget::onAdapterIncreased(Adapter *adapter) +{ + BloothAdapterWidget *adapterWidget = new BloothAdapterWidget(adapter, m_adapterWidget); + m_adapterLayout->addWidget(adapterWidget); + connect(adapterWidget, &BloothAdapterWidget::requestConnectDevice, this, [ this, adapter ](Device *device) { + m_adaptersManager->connectDevice(device, adapter); + }); + connect(adapterWidget, &BloothAdapterWidget::requestUpdate, this, [ this ] { + adjustHeight(); + }); + + updateCheckStatus(); + + QMetaObject::invokeMethod(this, &BluetoothWidget::adjustHeight, Qt::QueuedConnection); +} + +void BluetoothWidget::onAdapterDecreased(Adapter *adapter) +{ + for (int i = 0; i < m_adapterLayout->count(); i++) { + BloothAdapterWidget *adapterWidget = static_cast(m_adapterLayout->itemAt(i)->widget()); + if (adapterWidget && adapterWidget->adapter() == adapter) { + m_adapterLayout->removeWidget(adapterWidget); + + updateCheckStatus(); + QMetaObject::invokeMethod(this, &BluetoothWidget::adjustHeight, Qt::QueuedConnection); + break; + } + } +} + +void BluetoothWidget::onCheckedChanged(bool checked) +{ + QList adapters = m_adaptersManager->adapters(); + for (const Adapter *adapter : adapters) + m_adaptersManager->setAdapterPowered(adapter, checked); +} + +void BluetoothWidget::initUi() +{ + QHBoxLayout *headerLayout = new QHBoxLayout(m_headerWidget); + headerLayout->addStretch(); + headerLayout->addWidget(m_switchButton); + headerLayout->addStretch(); + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + mainLayout->addWidget(m_headerWidget); + mainLayout->addSpacing(3); + mainLayout->addWidget(m_adapterWidget); + + m_adapterLayout->setContentsMargins(0, 0, 0, 0); + m_adapterLayout->setSpacing(0); + + QList adapters = m_adaptersManager->adapters(); + for (const Adapter *adapter : adapters) { + onAdapterIncreased(const_cast(adapter)); + } +} + +void BluetoothWidget::initConnection() +{ + connect(m_adaptersManager, &AdaptersManager::adapterIncreased, this, &BluetoothWidget::onAdapterIncreased); + connect(m_adaptersManager, &AdaptersManager::adapterDecreased, this, &BluetoothWidget::onAdapterDecreased); + connect(m_switchButton, &DSwitchButton::checkedChanged, this, &BluetoothWidget::onCheckedChanged); +} + +void BluetoothWidget::updateCheckStatus() +{ + bool checked = false; + QList adapters = m_adaptersManager->adapters(); + for (const Adapter *adapter : adapters) + checked = adapter->powered(); + + m_switchButton->setChecked(checked); +} + +void BluetoothWidget::adjustHeight() +{ + int height = m_switchButton->height() + m_headerWidget->height(); + for (int i = 0; i < m_adapterLayout->count(); i++) { + BloothAdapterWidget *adapterWidget = static_cast(m_adapterLayout->itemAt(i)->widget()); + if (!adapterWidget) + continue; + + height += adapterWidget->height(); + } + + setFixedHeight(height); +} diff --git a/plugins/bluetooth/bluetoothwidget.h b/plugins/bluetooth/bluetoothwidget.h new file mode 100644 index 000000000..109e65c38 --- /dev/null +++ b/plugins/bluetooth/bluetoothwidget.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef BLUETOOTHWIDGET_H +#define BLUETOOTHWIDGET_H + +#include + +class QLabel; +class AdaptersManager; +class Adapter; +class QVBoxLayout; + +namespace Dtk { namespace Widget { class DListView; class DSwitchButton; } } + +using namespace Dtk::Widget; + +class BluetoothWidget : public QWidget +{ + Q_OBJECT + +public: + explicit BluetoothWidget(AdaptersManager *adapterManager, QWidget *parent = nullptr); + ~BluetoothWidget() override; + +protected Q_SLOTS: + void onAdapterIncreased(Adapter *adapter); + void onAdapterDecreased(Adapter *adapter); + void onCheckedChanged(bool checked); + +private: + void initUi(); + void initConnection(); + void updateCheckStatus(); + void adjustHeight(); + +private: + DSwitchButton *m_switchButton; + QWidget *m_headerWidget; + QWidget *m_adapterWidget; + AdaptersManager *m_adaptersManager; + QVBoxLayout *m_adapterLayout; +}; + +#endif // BLUETOOTHWIDGET_H diff --git a/plugins/bluetooth/componments/adaptersmanager.cpp b/plugins/bluetooth/componments/adaptersmanager.cpp index 59b529fcf..78ee7f631 100644 --- a/plugins/bluetooth/componments/adaptersmanager.cpp +++ b/plugins/bluetooth/componments/adaptersmanager.cpp @@ -227,29 +227,28 @@ void AdaptersManager::adapterAdd(Adapter *adapter, const QJsonObject &adpterObj) QDBusObjectPath dPath(adpterObj["Path"].toString()); QDBusPendingCall call = m_bluetoothInter->GetDevices(dPath); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, [this, adapter, call, watcher] { - if (adapter) { - if (!call.isError()) { - QDBusReply reply = call.reply(); - const QString replyStr = reply.value(); - QJsonDocument doc = QJsonDocument::fromJson(replyStr.toUtf8()); - adapter->initDevicesList(doc); - emit this->adapterIncreased(adapter); - } else { - qWarning() << call.error().message(); - } - } - delete watcher; - }); + connect(watcher, &QDBusPendingCallWatcher::finished, watcher, &QDBusPendingCallWatcher::deleteLater); + connect(watcher, &QDBusPendingCallWatcher::finished, [ this, adapter, call ] { + if (!call.isError()) { + QDBusReply reply = call.reply(); + const QString replyStr = reply.value(); + QJsonDocument doc = QJsonDocument::fromJson(replyStr.toUtf8()); + adapter->initDevicesList(doc); - QString id = adapter->id(); - if (!id.isEmpty()) { - if (!m_adapters.contains(id)) { - m_adapters[id] = adapter; - } else if (m_adapters[id] == nullptr) { - m_adapters[id] = adapter; + QString id = adapter->id(); + if (!id.isEmpty()) { + if (!m_adapters.contains(id)) { + m_adapters[id] = adapter; + } else if (!m_adapters[id]) { + m_adapters[id] = adapter; + } + } + + emit this->adapterIncreased(adapter); + } else { + qWarning() << call.error().message(); } - } + }); } void AdaptersManager::inflateAdapter(Adapter *adapter, const QJsonObject &adapterObj) @@ -273,3 +272,8 @@ void AdaptersManager::adapterRefresh(const Adapter *adapter) QDBusObjectPath dPath(adapter->id()); m_bluetoothInter->RequestDiscovery(dPath); } + +QList AdaptersManager::adapters() +{ + return m_adapters.values(); +} diff --git a/plugins/bluetooth/componments/adaptersmanager.h b/plugins/bluetooth/componments/adaptersmanager.h index 50f96a90b..4a997374e 100644 --- a/plugins/bluetooth/componments/adaptersmanager.h +++ b/plugins/bluetooth/componments/adaptersmanager.h @@ -38,6 +38,7 @@ public: void connectDevice(const Device *device, Adapter *adapter); int adaptersCount(); void adapterRefresh(const Adapter *adapter); + QList adapters(); signals: void adapterIncreased(Adapter *adapter); diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index 7d684376c..d54a6b501 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -112,11 +112,11 @@ void SettingLabel::paintEvent(QPaintEvent *event) return QWidget::paintEvent(event); } -BluetoothApplet::BluetoothApplet(QWidget *parent) +BluetoothApplet::BluetoothApplet(AdaptersManager *adapterManager, QWidget *parent) : QWidget(parent) , m_scroarea(nullptr) , m_contentWidget(new QWidget(this)) - , m_adaptersManager(new AdaptersManager(this)) + , m_adaptersManager(adapterManager) , m_settingLabel(new SettingLabel(tr("Bluetooth settings"), this)) , m_mainLayout(new QVBoxLayout(this)) , m_contentLayout(new QVBoxLayout(m_contentWidget)) @@ -178,6 +178,11 @@ QStringList BluetoothApplet::connectedDevicesName() return deviceList; } +AdaptersManager *BluetoothApplet::adaptersManager() +{ + return m_adaptersManager; +} + void BluetoothApplet::onAdapterAdded(Adapter *adapter) { if (!m_adapterItems.size()) { diff --git a/plugins/bluetooth/componments/bluetoothapplet.h b/plugins/bluetooth/componments/bluetoothapplet.h index 442013499..f71e397c6 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.h +++ b/plugins/bluetooth/componments/bluetoothapplet.h @@ -77,7 +77,7 @@ class BluetoothApplet : public QWidget { Q_OBJECT public: - explicit BluetoothApplet(QWidget *parent = nullptr); + explicit BluetoothApplet(AdaptersManager *adapterManager, QWidget *parent = nullptr); bool poweredInitState(); // 当前是否有蓝牙适配器 bool hasAadapter(); @@ -89,6 +89,8 @@ public: QStringList connectedDevicesName(); inline bool airplaneModeEnable() const { return m_airplaneModeEnable;} + // 返回蓝牙适配器 + AdaptersManager *adaptersManager(); signals: void noAdapter(); From e02ce4f03ba1e01e5ab8e4407092d3d0f3e46d4f Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 26 Oct 2022 09:11:56 +0000 Subject: [PATCH 096/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E5=90=AF=E5=8A=A8=E5=99=A8?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E5=92=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=AE=BE=E7=BD=AE=E6=99=BA=E8=83=BD=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 向后端发送任务栏尺寸的时候,无需计算分辨率相关,此处去掉分辨率的设置 Log: 优化高缩放率下任务栏的数据错误 Influence: 前提:屏幕分辨率设置为1.25;1、任务栏设置为智能隐藏,将窗口拖动到任务栏下方,观察任务栏是否隐藏;2、观察启动器的位置是否正确 Bug: https://pms.uniontech.com/bug-view-154513.html Bug: https://pms.uniontech.com/bug-view-157413.html Change-Id: Iebd9f31b9207852425d5215bb3b92152ec4ab46c --- frame/window/mainwindowbase.cpp | 2 +- frame/window/windowmanager.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index 4a93619ff..ea8d83b86 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -388,7 +388,7 @@ QRect MainWindowBase::getDockGeometry(QScreen *screen, const Dock::Position &pos const int margin = static_cast((displaymode == DisplayMode::Fashion ? 10 : 0) * (withoutScale ? qApp->devicePixelRatio() : 1)); int dockSize = 0; if (hideState == Dock::HideState::Show) - dockSize = windowSize(); + dockSize = windowSize() * (withoutScale ? qApp->devicePixelRatio() : 1); // 拿到当前显示器缩放之前的分辨率 QRect screenRect = screen->handle()->geometry(); diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index da00261ee..58649f53b 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -601,7 +601,7 @@ void WindowManager::onChangeDockPosition(QString fromScreen, QString toScreen, c void WindowManager::onRequestUpdateFrontendGeometry() { - QRect rect = getDockGeometry(false); + QRect rect = getDockGeometry(true); // 向com.deepin.dde.daemon.Dock的SetFrontendWindowRect接口设置区域时,此区域的高度或宽度不能为0,否则会导致其HideState属性循环切换,造成任务栏循环显示或隐藏 if (rect.width() == 0 || rect.height() == 0) return; From fabfe1846f32e4a66a06fec7fef821e71232cedc Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 27 Oct 2022 07:03:28 +0000 Subject: [PATCH 097/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=8B=96=E5=8A=A8=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=88=86=E5=B1=8F=E5=90=8E=E9=BC=A0=E6=A0=87=E5=9B=9E=E5=88=B0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E9=81=AE=E7=BD=A9=E4=B8=8D=E6=B6=88?= =?UTF-8?q?=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在releaseSplit中增加隐藏遮罩的处理 Log: 优化任务栏分屏功能 Influence: 从任务栏拖动图标到桌面,不松手,然后再回到任务栏,观察遮罩是否消失 Task: https://pms.uniontech.com/task-view-181523.html Change-Id: I9ec2a3ca62cd830cc6b4f7079d2550e9d21a36c1 --- frame/screenspliter/screenspliter_wayland.cpp | 6 ++++++ frame/screenspliter/screenspliter_wayland.h | 1 + frame/screenspliter/screenspliter_xcb.cpp | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/frame/screenspliter/screenspliter_wayland.cpp b/frame/screenspliter/screenspliter_wayland.cpp index 3be9ea623..98341ab68 100644 --- a/frame/screenspliter/screenspliter_wayland.cpp +++ b/frame/screenspliter/screenspliter_wayland.cpp @@ -172,6 +172,12 @@ bool ScreenSpliter_Wayland::suportSplitScreen() return (!m_checkedNotSupport); } +bool ScreenSpliter_Wayland::releaseSplit() +{ + setMaskVisible(QRect(), false); + return true; +} + /** * @brief SplitWindowManager::SplitWindowManager * @param wayland下的分屏的管理 diff --git a/frame/screenspliter/screenspliter_wayland.h b/frame/screenspliter/screenspliter_wayland.h index 79ef7c027..28e995b74 100644 --- a/frame/screenspliter/screenspliter_wayland.h +++ b/frame/screenspliter/screenspliter_wayland.h @@ -59,6 +59,7 @@ public: void startSplit(const QRect &rect) override; bool split(SplitDirection direction) override; bool suportSplitScreen() override; + bool releaseSplit() override; private: void setMaskVisible(const QRect &rect, bool visible); diff --git a/frame/screenspliter/screenspliter_xcb.cpp b/frame/screenspliter/screenspliter_xcb.cpp index 3d954691c..9b6ebf6d7 100644 --- a/frame/screenspliter/screenspliter_xcb.cpp +++ b/frame/screenspliter/screenspliter_xcb.cpp @@ -95,7 +95,6 @@ void ScreenSpliter_Xcb::startSplit(const QRect &rect) bool ScreenSpliter_Xcb::split(ScreenSpliter::SplitDirection direction) { - showSplitScreenEffect(QRect(), false); if (!openWindow()) return false; @@ -208,6 +207,7 @@ bool ScreenSpliter_Xcb::suportSplitScreen() bool ScreenSpliter_Xcb::releaseSplit() { + showSplitScreenEffect(QRect(), false); if (!m_isSplitCreateWindow) return false; From c73ef98002bd4e2c5a984f5e3e872a54ad527304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Fri, 28 Oct 2022 15:18:37 +0800 Subject: [PATCH 098/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=89=98=E7=9B=98=E6=97=A0=E5=9B=BE=E6=A0=87=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 未在初始化时获取图标信息 Log: 修复部分托盘无图标的问题 Influence: 安全中心、授权管理等应用的托盘图标 Bug: https://pms.uniontech.com/bug-view-160761.html Change-Id: I5b4a3a2d7b688ad0275e3acfe2bd72841a75e92a --- plugins/tray/snitraywidget.cpp | 26 ++++++++++++++++++++++++++ plugins/tray/snitraywidget.h | 1 + 2 files changed, 27 insertions(+) diff --git a/plugins/tray/snitraywidget.cpp b/plugins/tray/snitraywidget.cpp index 2500c09c6..1fb516754 100644 --- a/plugins/tray/snitraywidget.cpp +++ b/plugins/tray/snitraywidget.cpp @@ -156,6 +156,8 @@ SNITrayWidget::SNITrayWidget(const QString &sniServicePath, QWidget *parent) connect(m_sniInter, &StatusNotifierItem::NewStatus, [ = ] { onSNIStatusChanged(m_sniInter->status()); }); + + initSNIPropertys(); } QString SNITrayWidget::itemKeyForConfig() @@ -251,6 +253,30 @@ uint SNITrayWidget::servicePID(const QString &servicePath) return conn.interface()->servicePid(serviceName); } +void SNITrayWidget::initSNIPropertys() +{ + m_sniAttentionIconName = m_sniInter->attentionIconName(); + m_sniAttentionIconPixmap = m_sniInter->attentionIconPixmap(); + m_sniAttentionMovieName = m_sniInter->attentionMovieName(); + m_sniCategory = m_sniInter->category(); + m_sniIconName = m_sniInter->iconName(); + m_sniIconPixmap = m_sniInter->iconPixmap(); + m_sniIconThemePath = m_sniInter->iconThemePath(); + m_sniMenuPath = m_sniInter->menu(); + m_sniOverlayIconName = m_sniInter->overlayIconName(); + m_sniOverlayIconPixmap = m_sniInter->overlayIconPixmap(); + m_sniStatus = m_sniInter->status(); + + // 使用同步的方式获取id,否则在插入的时候无法获取正确的位置 + m_sniInter->setSync(true); + m_sniId = m_sniInter->id(); + m_sniInter->setSync(false); + + m_updateIconTimer->start(); +// m_updateOverlayIconTimer->start(); +// m_updateAttentionIconTimer->start(); +} + void SNITrayWidget::initMenu() { const QString &sniMenuPath = m_sniMenuPath.path(); diff --git a/plugins/tray/snitraywidget.h b/plugins/tray/snitraywidget.h index 17517bda4..65b487fd1 100644 --- a/plugins/tray/snitraywidget.h +++ b/plugins/tray/snitraywidget.h @@ -79,6 +79,7 @@ Q_SIGNALS: void statusChanged(SNITrayWidget::ItemStatus status); private Q_SLOTS: + void initSNIPropertys(); void initMenu(); void refreshIcon(); void refreshOverlayIcon(); From a8b8e6bd0095c8b2107a2ff52bbb95fb1b67420b Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Mon, 24 Oct 2022 15:10:26 +0800 Subject: [PATCH 099/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B7=A8?= =?UTF-8?q?=E7=AB=AF=E5=8D=8F=E5=90=8C=E8=AE=BE=E5=A4=87=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E5=8F=98=E5=8C=96=E6=97=B6=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当跨端协同列表数量变化的时候,没有将子页面高度变化通知父窗口从而更新整个页面高度导致的问题。 Log: 修复跨端协同设备数量变化时列表页面显示不全的问题 But: https://pms.uniontech.com/bug-view-165835.html Influence: 跨端协同设备变化时,页面显示。 Change-Id: I3a0ac51ea7f412cc530a075ad55b4cc710a5df90 --- .../components/devcollaborationwidget.cpp | 20 ++++++++++++------- .../components/devcollaborationwidget.h | 4 ++++ .../components/displaysettingwidget.cpp | 9 ++++++++- .../window/components/displaysettingwidget.h | 1 + 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/frame/window/components/devcollaborationwidget.cpp b/frame/window/components/devcollaborationwidget.cpp index 0da6ab4ae..68ceffd7d 100644 --- a/frame/window/components/devcollaborationwidget.cpp +++ b/frame/window/components/devcollaborationwidget.cpp @@ -31,10 +31,9 @@ #include #define TITLE_HEIGHT 16 -#define ITME_WIDTH 310 +#define ITEM_WIDTH 310 #define ITEM_HEIGHT 36 -#define LISTVIEW_ITEM_SPACE 2 -#define ITME_SPACE 10 +#define LISTVIEW_ITEM_SPACE 5 #define PER_DEGREE 14 DevCollaborationWidget::DevCollaborationWidget(QWidget *parent) @@ -59,6 +58,13 @@ void DevCollaborationWidget::showEvent(QShowEvent *event) QWidget::showEvent(event); } +void DevCollaborationWidget::resizeEvent(QResizeEvent *event) +{ + Q_EMIT sizeChanged(); + + QWidget::resizeEvent(event); +} + void DevCollaborationWidget::initUI() { m_deviceListView->setModel(m_viewItemModel); @@ -73,7 +79,7 @@ void DevCollaborationWidget::initUI() QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->setMargin(0); mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(ITME_SPACE); + mainLayout->setSpacing(0); mainLayout->addLayout(hLayout); mainLayout->addWidget(m_deviceListView); @@ -107,7 +113,7 @@ void DevCollaborationWidget::loadDevice() if (!m_deviceListView->isVisible()) m_deviceListView->setVisible(true); - m_deviceListView->setFixedSize(ITME_WIDTH, m_deviceListView->count() * ITEM_HEIGHT + LISTVIEW_ITEM_SPACE * (m_deviceListView->count() * 2)); + m_deviceListView->setFixedSize(ITEM_WIDTH, m_deviceListView->count() * ITEM_HEIGHT + LISTVIEW_ITEM_SPACE * (m_deviceListView->count() * 2)); } resetWidgetSize(); @@ -175,9 +181,9 @@ void DevCollaborationWidget::updateDeviceListView() void DevCollaborationWidget::resetWidgetSize() { - int height = TITLE_HEIGHT + ITME_SPACE + (m_deviceListView->count() ? m_deviceListView->height() : 0); + int height = TITLE_HEIGHT + (m_deviceListView->count() ? m_deviceListView->height() : 0); - setFixedSize(ITME_WIDTH, height); + setFixedSize(ITEM_WIDTH, height); } void DevCollaborationWidget::itemClicked(const QModelIndex &index) diff --git a/frame/window/components/devcollaborationwidget.h b/frame/window/components/devcollaborationwidget.h index c7dd90aeb..421208e00 100644 --- a/frame/window/components/devcollaborationwidget.h +++ b/frame/window/components/devcollaborationwidget.h @@ -39,8 +39,12 @@ class DevCollaborationWidget : public QWidget public: explicit DevCollaborationWidget(QWidget *parent = nullptr); +signals: + void sizeChanged(); + protected: void showEvent(QShowEvent *event) override; + void resizeEvent(QResizeEvent *event) override; private slots: void loadDevice(); diff --git a/frame/window/components/displaysettingwidget.cpp b/frame/window/components/displaysettingwidget.cpp index 6ac92c601..f27d1e21f 100644 --- a/frame/window/components/displaysettingwidget.cpp +++ b/frame/window/components/displaysettingwidget.cpp @@ -60,7 +60,14 @@ void DisplaySettingWidget::initUI() setLayout(mainLayout); + resizeWidgetHeight(); + connect(m_collaborationWidget, &DevCollaborationWidget::sizeChanged, + this, &DisplaySettingWidget::resizeWidgetHeight); +} + +void DisplaySettingWidget::resizeWidgetHeight() +{ QMargins margins = this->contentsMargins(); setFixedHeight(margins.top() + margins.bottom() + m_brightnessAdjWidget->height() + - m_collaborationWidget->height() + m_settingBtn->height() + ItemSpacing * 2); + m_collaborationWidget->height() + m_settingBtn->height() + ItemSpacing * 2); } diff --git a/frame/window/components/displaysettingwidget.h b/frame/window/components/displaysettingwidget.h index ae8005808..9ea0b8fc4 100644 --- a/frame/window/components/displaysettingwidget.h +++ b/frame/window/components/displaysettingwidget.h @@ -39,6 +39,7 @@ public: private: void initUI(); + void resizeWidgetHeight(); private: BrightnessAdjWidget *m_brightnessAdjWidget; // 亮度调整 From 9e2e8fb18d9329818039d801f72a04d35aebad30 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 19 Oct 2022 03:50:12 +0000 Subject: [PATCH 100/257] =?UTF-8?q?feat:=20=E9=AB=98=E6=95=88=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=A2=9E=E5=8A=A0=E5=8A=A0=E8=BD=BD=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除原来的tray插件,高效模式下,加载插件使用时尚模式相同的加载插件的方式 Log: 增加高效模式加载插件的功能 Influence: 高效模式下加载插件 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I5766382fb64bd544b3c7a9c40d1ce4668613d508 --- debian/dde-dock.install | 2 - frame/controller/dockitemmanager.cpp | 81 +---- frame/controller/dockitemmanager.h | 4 - frame/controller/dockpluginscontroller.cpp | 163 --------- frame/controller/dockpluginscontroller.h | 62 ---- frame/controller/fixedplugincontroller.cpp | 83 ----- frame/controller/fixedplugincontroller.h | 56 --- frame/controller/proxyplugincontroller.cpp | 30 +- frame/controller/proxyplugincontroller.h | 3 +- frame/controller/quicksettingcontroller.cpp | 114 +++--- frame/controller/quicksettingcontroller.h | 24 +- frame/controller/toolapphelper.cpp | 145 ++++---- frame/controller/toolapphelper.h | 7 +- frame/dbus/dbusdockadaptors.cpp | 1 + frame/item/pluginsitem.h | 7 +- frame/item/quicksettingitem.cpp | 321 +++++++++++----- frame/item/quicksettingitem.h | 43 ++- frame/window/components/datetimedisplayer.cpp | 66 +++- frame/window/components/datetimedisplayer.h | 4 +- frame/window/docktraywindow.cpp | 342 ++++++++++++++++++ frame/window/docktraywindow.h | 91 +++++ frame/window/mainpanelcontrol.cpp | 65 ++-- frame/window/mainpanelcontrol.h | 7 +- frame/window/quickpluginwindow.cpp | 68 +++- frame/window/quickpluginwindow.h | 8 +- frame/window/quicksettingcontainer.cpp | 43 ++- frame/window/quicksettingcontainer.h | 7 +- frame/window/systempluginwindow.cpp | 95 +++-- frame/window/systempluginwindow.h | 15 +- .../window/tray/widgets/expandiconwidget.cpp | 182 +++++----- frame/window/tray/widgets/expandiconwidget.h | 25 +- frame/window/traymanagerwindow.cpp | 3 +- plugins/CMakeLists.txt | 6 +- 33 files changed, 1242 insertions(+), 931 deletions(-) delete mode 100644 frame/controller/dockpluginscontroller.cpp delete mode 100644 frame/controller/dockpluginscontroller.h delete mode 100644 frame/controller/fixedplugincontroller.cpp delete mode 100644 frame/controller/fixedplugincontroller.h create mode 100644 frame/window/docktraywindow.cpp create mode 100644 frame/window/docktraywindow.h diff --git a/debian/dde-dock.install b/debian/dde-dock.install index 1de3b1685..977d6ab70 100644 --- a/debian/dde-dock.install +++ b/debian/dde-dock.install @@ -1,10 +1,8 @@ usr/share usr/bin etc/dde-dock -usr/lib/dde-dock/plugins/libdatetime.so usr/lib/dde-dock/plugins/libshutdown.so usr/lib/dde-dock/plugins/libtrash.so -usr/lib/dde-dock/plugins/libtray.so usr/lib/dde-dock/plugins/liboverlay-warning.so usr/lib/dde-dock/plugins/system-trays usr/lib/dde-dock/plugins/quick-trays diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index 3742aec42..8a83ce2d6 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -26,6 +26,7 @@ #include "traypluginitem.h" #include "utils.h" #include "appmultiitem.h" +#include "quicksettingcontroller.h" #include #include @@ -40,7 +41,6 @@ const QGSettings *DockItemManager::m_dockedSettings = Utils::ModuleSettingsPtr(" DockItemManager::DockItemManager(QObject *parent) : QObject(parent) , m_appInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) - , m_pluginsInter(new DockPluginsController(this)) , m_loadFinished(false) { //固定区域:启动器 @@ -77,13 +77,6 @@ DockItemManager::DockItemManager(QObject *parent) connect(m_appInter, &DockInter::ShowMultiWindowChanged, this, &DockItemManager::onShowMultiWindowChanged); #endif - // 插件信号 - connect(m_pluginsInter, &DockPluginsController::pluginItemInserted, this, &DockItemManager::pluginItemInserted, Qt::QueuedConnection); - connect(m_pluginsInter, &DockPluginsController::pluginItemRemoved, this, &DockItemManager::pluginItemRemoved, Qt::QueuedConnection); - connect(m_pluginsInter, &DockPluginsController::pluginItemUpdated, this, &DockItemManager::itemUpdated, Qt::QueuedConnection); - connect(m_pluginsInter, &DockPluginsController::trayVisableCountChanged, this, &DockItemManager::trayVisableCountChanged, Qt::QueuedConnection); - connect(m_pluginsInter, &DockPluginsController::pluginLoaderFinished, this, &DockItemManager::onPluginLoadFinished, Qt::QueuedConnection); - DApplication *app = qobject_cast(qApp); if (app) { connect(app, &DApplication::iconThemeChanged, this, &DockItemManager::refreshItemsIcon); @@ -110,7 +103,7 @@ const QList> DockItemManager::itemList() const const QList DockItemManager::pluginList() const { - return m_pluginsInter->pluginsMap().keys(); + return QuickSettingController::instance()->pluginsMap().keys(); } bool DockItemManager::appIsOnDock(const QString &appDesktop) const @@ -268,76 +261,6 @@ void DockItemManager::appItemRemoved(AppItem *appItem) appItem->deleteLater(); } -void DockItemManager::pluginItemInserted(PluginsItem *item) -{ - manageItem(item); - - DockItem::ItemType pluginType = item->itemType(); - - // find first plugins item position - int firstPluginPosition = -1; - for (int i(0); i != m_itemList.size(); ++i) { - DockItem::ItemType type = m_itemList[i]->itemType(); - if (type != pluginType) - continue; - - firstPluginPosition = i; - break; - } - - if (firstPluginPosition == -1) - firstPluginPosition = m_itemList.size(); - - // find insert position - int insertIndex = 0; - const int itemSortKey = item->itemSortKey(); - if (itemSortKey == -1 || firstPluginPosition == -1) { - insertIndex = m_itemList.size(); - } else if (itemSortKey == 0) { - insertIndex = firstPluginPosition; - } else { - insertIndex = m_itemList.size(); - for (int i(firstPluginPosition + 1); i != m_itemList.size() + 1; ++i) { - PluginsItem *pItem = static_cast(m_itemList[i - 1].data()); - Q_ASSERT(pItem); - - const int sortKey = pItem->itemSortKey(); - if (pluginType == DockItem::FixedPlugin) { - if (sortKey != -1 && itemSortKey > sortKey) - continue; - insertIndex = i - 1; - break; - } - if (sortKey != -1 && itemSortKey > sortKey && pItem->itemType() != DockItem::FixedPlugin) - continue; - insertIndex = i - 1; - break; - } - } - - m_itemList.insert(insertIndex, item); - if(pluginType == DockItem::FixedPlugin) - insertIndex ++; - - if (!Utils::SettingValue(QString("com.deepin.dde.dock.module.") + item->pluginName(), QByteArray(), "enable", true).toBool()) - item->setVisible(false); - - emit itemInserted(insertIndex - firstPluginPosition, item); -} - -void DockItemManager::pluginItemRemoved(PluginsItem *item) -{ - item->hidePopup(); - - emit itemRemoved(item); - - m_itemList.removeOne(item); - - if (m_loadFinished) { - updatePluginsItemOrderKey(); - } -} - void DockItemManager::reloadAppItems() { // remove old item diff --git a/frame/controller/dockitemmanager.h b/frame/controller/dockitemmanager.h index 961229b47..41bc952cb 100644 --- a/frame/controller/dockitemmanager.h +++ b/frame/controller/dockitemmanager.h @@ -22,7 +22,6 @@ #ifndef DOCKITEMMANAGER_H #define DOCKITEMMANAGER_H -#include "dockpluginscontroller.h" #include "pluginsiteminterface.h" #include "dockitem.h" #include "appitem.h" @@ -75,8 +74,6 @@ private: void appItemAdded(const QDBusObjectPath &path, const int index); void appItemRemoved(const QString &appId); void appItemRemoved(AppItem *appItem); - void pluginItemInserted(PluginsItem *item); - void pluginItemRemoved(PluginsItem *item); void updatePluginsItemOrderKey(); void reloadAppItems(); void manageItem(DockItem *item); @@ -89,7 +86,6 @@ private: private: DockInter *m_appInter; - DockPluginsController *m_pluginsInter; static DockItemManager *INSTANCE; diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp deleted file mode 100644 index 625771be0..000000000 --- a/frame/controller/dockpluginscontroller.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "dockpluginscontroller.h" -#include "proxyplugincontroller.h" -#include "pluginsiteminterface.h" -#include "traypluginitem.h" - -#include -#include -#include - -DockPluginsController::DockPluginsController(QObject *parent) - : AbstractPluginsController(parent) -{ - setObjectName("DockPlugin"); - - ProxyPluginController::instance(PluginType::FixedSystemPlugin)->addProxyInterface(this); -} - -DockPluginsController::~DockPluginsController() -{ - ProxyPluginController::instance(PluginType::FixedSystemPlugin)->removeProxyInterface(this); -} - -void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, const QString &itemKey) -{ - QMap> &mPluginsMap = pluginsMap(); - - // check if same item added - if (mPluginsMap.contains(itemInter)) - if (mPluginsMap[itemInter].contains(itemKey)) - return; - - // 取 plugin api - ProxyPluginController *proxyController = ProxyPluginController::instance(itemInter); - if (!proxyController) - return; - - QPluginLoader *pluginLoader = proxyController->pluginLoader(itemInter); - if (!pluginLoader) - return; - - const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); - - PluginsItem *item = nullptr; - if (itemInter->pluginName() == "tray") { - item = new TrayPluginItem(itemInter, itemKey, meta); - if (item->graphicsEffect()) { - item->graphicsEffect()->setEnabled(false); - } - connect(static_cast(item), &TrayPluginItem::trayVisableCountChanged, - this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection); - } else { - item = new PluginsItem(itemInter, itemKey, meta); - } - - mPluginsMap[itemInter][itemKey] = item; - - emit pluginItemInserted(item); -} - -void DockPluginsController::itemUpdate(PluginsItemInterface *const itemInter, const QString &itemKey) -{ - PluginsItem *item = getPluginItem(itemInter, itemKey); - if (!item) - return; - - item->update(); - - emit pluginItemUpdated(item); -} - -void DockPluginsController::itemRemoved(PluginsItemInterface *const itemInter, const QString &itemKey) -{ - PluginsItem *item = getPluginItem(itemInter, itemKey); - if (!item) - return; - - item->detachPluginWidget(); - - emit pluginItemRemoved(item); - - QMap> &mPluginsMap = pluginsMap(); - mPluginsMap[itemInter].remove(itemKey); - - // do not delete the itemWidget object(specified in the plugin interface) - item->centralWidget()->setParent(nullptr); - - if (item->isDragging()) { - QDrag::cancel(); - } - - // just delete our wrapper object(PluginsItem) - item->deleteLater(); -} - -void DockPluginsController::requestWindowAutoHide(PluginsItemInterface *const itemInter, const QString &itemKey, const bool autoHide) -{ - PluginsItem *item = getPluginItem(itemInter, itemKey); - if (!item) - return; - - Q_EMIT item->requestWindowAutoHide(autoHide); -} - -void DockPluginsController::requestRefreshWindowVisible(PluginsItemInterface *const itemInter, const QString &itemKey) -{ - PluginsItem *item = getPluginItem(itemInter, itemKey); - if (!item) - return; - - Q_EMIT item->requestRefreshWindowVisible(); -} - -void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const itemInter, const QString &itemKey, const bool visible) -{ - PluginsItem *item = getPluginItem(itemInter, itemKey); - if (!item) - return; - - if (visible) { - item->showPopupApplet(itemInter->itemPopupApplet(itemKey)); - } else { - item->hidePopup(); - } -} - -QMap> &DockPluginsController::pluginsMap() -{ - return ProxyPluginController::instance(PluginType::FixedSystemPlugin)->pluginsMap(); -} - -PluginsItem *DockPluginsController::getPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) const -{ - ProxyPluginController *proxyController = ProxyPluginController::instance(itemInter); - if (!proxyController) - return nullptr; - - const QMap> &plugins = proxyController->pluginsMap(); - if (plugins.contains(itemInter) && plugins[itemInter].contains(itemKey)) - return static_cast(plugins[itemInter][itemKey]); - - return nullptr; -} diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h deleted file mode 100644 index 53143c195..000000000 --- a/frame/controller/dockpluginscontroller.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef DOCKPLUGINSCONTROLLER_H -#define DOCKPLUGINSCONTROLLER_H - -#include "pluginsitem.h" -#include "pluginproxyinterface.h" -#include "abstractpluginscontroller.h" - -#include -#include -#include -#include - -class PluginsItemInterface; -class DockPluginsController : public AbstractPluginsController -{ - Q_OBJECT - -public: - explicit DockPluginsController(QObject *parent = nullptr); - ~DockPluginsController() override; - - // implements PluginProxyInterface - void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; - void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; - QMap> &pluginsMap(); - -private: - PluginsItem *getPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) const; - -signals: - void pluginItemInserted(PluginsItem *pluginItem) const; - void pluginItemRemoved(PluginsItem *pluginItem) const; - void pluginItemUpdated(PluginsItem *pluginItem) const; - void trayVisableCountChanged(const int &count) const; -}; - -#endif // DOCKPLUGINSCONTROLLER_H diff --git a/frame/controller/fixedplugincontroller.cpp b/frame/controller/fixedplugincontroller.cpp deleted file mode 100644 index 5e4b5545a..000000000 --- a/frame/controller/fixedplugincontroller.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "fixedplugincontroller.h" -#include "utils.h" -#include "proxyplugincontroller.h" -#include "systempluginwindow.h" - -FixedPluginController::FixedPluginController(QObject *parent) - : AbstractPluginsController(parent) -{ - setObjectName("FixedPluginController"); - ProxyPluginController::instance(PluginType::FixedSystemPlugin)->addProxyInterface(this); -} - -FixedPluginController::~FixedPluginController() -{ - ProxyPluginController::instance(PluginType::FixedSystemPlugin)->removeProxyInterface(this); -} - -void FixedPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - StretchPluginsItem *item = new StretchPluginsItem(itemInter, itemKey); - m_pluginItems << item; - Q_EMIT pluginItemInserted(item); -} - -void FixedPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) -{ - for (StretchPluginsItem *item : m_pluginItems) { - if (item->pluginInter() == itemInter) { - Q_EMIT pluginItemUpdated(item); - break; - } - } -} - -void FixedPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &) -{ - for (StretchPluginsItem *item : m_pluginItems) { - if (item->pluginInter() == itemInter) { - m_pluginItems.removeOne(item); - Q_EMIT pluginItemRemoved(item); - item->deleteLater(); - break; - } - } -} - -bool FixedPluginController::needLoad(PluginsItemInterface *itemInter) -{ - ProxyPluginController *controller = ProxyPluginController::instance(itemInter); - if (!controller) - return false; - - QPluginLoader *pluginLoader = controller->pluginLoader(itemInter); - if (!pluginLoader) - return false; - - // isFixed配置表示该插件在时尚模式下,显示在最右侧的图标,例如关机图标 - QJsonObject json = pluginLoader->metaData().value("MetaData").toObject(); - if (json.contains("fixed")) - return json.value("fixed").toBool(); - - return false; -} diff --git a/frame/controller/fixedplugincontroller.h b/frame/controller/fixedplugincontroller.h deleted file mode 100644 index 11ea4c227..000000000 --- a/frame/controller/fixedplugincontroller.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef FIXEDPLUGINCONTROLLER_H -#define FIXEDPLUGINCONTROLLER_H - -#include "abstractpluginscontroller.h" - -class StretchPluginsItem; - -class FixedPluginController : public AbstractPluginsController -{ - Q_OBJECT - -public: - explicit FixedPluginController(QObject *parent = nullptr); - ~FixedPluginController() override; - -Q_SIGNALS: - void pluginItemInserted(StretchPluginsItem *); - void pluginItemRemoved(StretchPluginsItem *); - void pluginItemUpdated(StretchPluginsItem *); - -protected: - void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemUpdate(PluginsItemInterface * const itemInter, const QString &) override; - void itemRemoved(PluginsItemInterface * const itemInter, const QString &) override; - - void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} - void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} - void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} - - bool needLoad(PluginsItemInterface *itemInter) override; - -private: - QList m_pluginItems; -}; - -#endif // FIXEDPLUGINCONTROLLER_H diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index a35d41432..66b4edaf6 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -37,39 +37,25 @@ static QStringList getPathFromConf(const QString &key) { static QMap getPluginPaths() { QMap plugins; - - // 添加系统目录 - { - QStringList pluginPaths; - #ifdef QT_DEBUG - pluginPaths << qApp->applicationDirPath() + "/../plugins"; - #else - pluginPaths << "/usr/lib/dde-dock/plugins"; - - const QStringList &pluginsDirs = getPathFromConf("PATH"); - if (!pluginsDirs.isEmpty()) - pluginPaths << pluginsDirs; - #endif - plugins[PluginType::FixedSystemPlugin] = pluginPaths; - } - // 添加快捷插件目录 { QStringList pluginPaths; #ifdef QT_DEBUG - pluginPaths << qApp->applicationDirPath() + "/../plugins/quick-trays"; + pluginPaths << qApp->applicationDirPath() + "/../plugins/quick-trays" + << qApp->applicationDirPath() + "/../plugins"; #else - pluginPaths << "/usr/lib/dde-dock/plugins/quick-trays"; + pluginPaths << "/usr/lib/dde-dock/plugins/quick-trays" + << "/usr/lib/dde-dock/plugins"; - const QStringList &pluginsDirs = getPathFromConf("QUICK_TRAY_PATH"); + const QStringList pluginsDirs = (getPathFromConf("QUICK_TRAY_PATH") << getPathFromConf("PATH")); if (!pluginsDirs.isEmpty()) - pluginPaths << pluginsDirs; + pluginPaths << pluginsDirs; #endif plugins[PluginType::QuickPlugin] = pluginPaths; } // 添加系统插件目录 - { + { QStringList pluginPaths; #ifdef QT_DEBUG pluginPaths << qApp->applicationDirPath() + "/../plugins/system-trays"; @@ -78,7 +64,7 @@ static QMap getPluginPaths() const QStringList &pluginsDirs = getPathFromConf("SYSTEM_TRAY_PATH"); if (!pluginsDirs.isEmpty()) - pluginPaths << pluginsDirs; + pluginPaths << pluginsDirs; #endif plugins[PluginType::SystemTrays] = pluginPaths; } diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index e76dcd04e..e475be82a 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -26,8 +26,7 @@ class PluginsItemInterface; // 加载的插件的类型(1 根目录下的插件 2 快捷设置插件 3 系统插件) enum class PluginType { - FixedSystemPlugin = 0, - QuickPlugin, + QuickPlugin = 0, SystemTrays }; diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index e507291b8..af78c1920 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -22,6 +22,7 @@ #include "quicksettingitem.h" #include "pluginsiteminterface.h" #include "proxyplugincontroller.h" +#include "pluginsitem.h" QuickSettingController::QuickSettingController(QObject *parent) : AbstractPluginsController(parent) @@ -35,78 +36,46 @@ QuickSettingController::~QuickSettingController() ProxyPluginController::instance(PluginType::QuickPlugin)->removeProxyInterface(this); } -void QuickSettingController::sortPlugins() -{ - QList primarySettingItems; - QList quickItems; - for (QuickSettingItem *item : m_quickSettingItems) { - if (item->isPrimary()) - primarySettingItems << item; - else - quickItems << item; - } - - static QStringList existKeys = {"network-item-key", "sound-item-key", "VPN", "PROJECTSCREEN"}; - qSort(primarySettingItems.begin(), primarySettingItems.end(), [ = ](QuickSettingItem *item1, QuickSettingItem *item2) { - int index1 = existKeys.indexOf(item1->itemKey()); - int index2 = existKeys.indexOf(item2->itemKey()); - if (index1 >= 0 || index2 >= 0) - return index1 < index2; - - return true; - }); - - m_quickSettingItems.clear(); - m_quickSettingItems << primarySettingItems << quickItems; -} - void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { - QList::iterator findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(), - [ = ](QuickSettingItem *item) { - return item->itemKey() == itemKey; - }); - - if (findItemIterator != m_quickSettingItems.end()) - return; - + // 根据读取到的metaData数据获取当前插件的类型,提供给外部 + PluginAttribute pluginClass = PluginAttribute::Quick; QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter); - QJsonObject metaData; - if (pluginLoader) - metaData = pluginLoader->metaData().value("MetaData").toObject(); - QuickSettingItem *quickItem = new QuickSettingItem(itemInter, itemKey, metaData); + QJsonObject meta; + if (pluginLoader) { + meta = pluginLoader->metaData().value("MetaData").toObject(); + if (meta.contains("tool") && meta.value("tool").toBool()) + pluginClass = PluginAttribute::Tool; + else if (meta.contains("fixed") && meta.value("fixed").toBool()) + pluginClass = PluginAttribute::Fixed; + } - m_quickSettingItems << quickItem; - sortPlugins(); + m_quickPlugins[pluginClass] << itemInter; + m_quickPluginsMap[itemInter] = itemKey; - emit pluginInserted(quickItem); + emit pluginInserted(itemInter, pluginClass); } void QuickSettingController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) { - auto findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(), - [ = ](QuickSettingItem *item) { - return item->pluginItem() == itemInter; - }); - if (findItemIterator != m_quickSettingItems.end()) { - QuickSettingItem *settingItem = *findItemIterator; - settingItem->update(); - } } void QuickSettingController::itemRemoved(PluginsItemInterface * const itemInter, const QString &) { - // 删除本地记录的插件列表 - QList::iterator findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(), - [ = ](QuickSettingItem *item) { - return (item->pluginItem() == itemInter); - }); - if (findItemIterator != m_quickSettingItems.end()) { - QuickSettingItem *quickItem = *findItemIterator; - m_quickSettingItems.removeOne(quickItem); - Q_EMIT pluginRemoved(quickItem); - quickItem->deleteLater(); + for (auto it = m_quickPlugins.begin(); it != m_quickPlugins.end(); it++) { + QList &plugins = m_quickPlugins[it.key()]; + if (!plugins.contains(itemInter)) + continue; + + plugins.removeOne(itemInter); + if (plugins.isEmpty()) + m_quickPlugins.remove(it.key()); + + break; } + + m_quickPluginsMap.remove(itemInter); + Q_EMIT pluginRemoved(itemInter); } void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) @@ -119,3 +88,32 @@ QuickSettingController *QuickSettingController::instance() static QuickSettingController instance; return &instance; } + +QList QuickSettingController::pluginItems(const PluginAttribute &pluginClass) const +{ + return m_quickPlugins.value(pluginClass); +} + +QString QuickSettingController::itemKey(PluginsItemInterface *pluginItem) const +{ + return m_quickPluginsMap.value(pluginItem); +} + +QJsonObject QuickSettingController::metaData(PluginsItemInterface *pluginItem) const +{ + QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(pluginItem); + if (!pluginLoader) + return QJsonObject(); + + return pluginLoader->metaData().value("MetaData").toObject(); +} + +PluginsItem *QuickSettingController::pluginItemWidget(PluginsItemInterface *pluginItem) +{ + if (m_pluginItemWidgetMap.contains(pluginItem)) + return m_pluginItemWidgetMap[pluginItem]; + + PluginsItem *widget = new PluginsItem(pluginItem, itemKey(pluginItem), metaData(pluginItem)); + m_pluginItemWidgetMap[pluginItem] = widget; + return widget; +} diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index fdd4a1936..eb5398643 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -24,18 +24,29 @@ #include "abstractpluginscontroller.h" class QuickSettingItem; +class PluginsItem; class QuickSettingController : public AbstractPluginsController { Q_OBJECT +public: + enum class PluginAttribute { + Quick = 0, + Tool, + Fixed + }; + public: static QuickSettingController *instance(); - const QList &settingItems() const { return m_quickSettingItems; } + QList pluginItems(const PluginAttribute &pluginClass) const; + QString itemKey(PluginsItemInterface *pluginItem) const; + QJsonObject metaData(PluginsItemInterface *pluginItem) const; + PluginsItem *pluginItemWidget(PluginsItemInterface *pluginItem); Q_SIGNALS: - void pluginInserted(QuickSettingItem *); - void pluginRemoved(QuickSettingItem *); + void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute &); + void pluginRemoved(PluginsItemInterface *itemInter); void pluginUpdated(PluginsItemInterface *, const DockPart &); protected: @@ -52,10 +63,9 @@ protected: void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; private: - void sortPlugins(); - -private: - QList m_quickSettingItems; + QMap> m_quickPlugins; + QMap m_quickPluginsMap; + QMap m_pluginItemWidgetMap; }; #endif // CONTAINERPLUGINSCONTROLLER_H diff --git a/frame/controller/toolapphelper.cpp b/frame/controller/toolapphelper.cpp index 1b0fc7bc1..d2215ad26 100644 --- a/frame/controller/toolapphelper.cpp +++ b/frame/controller/toolapphelper.cpp @@ -22,6 +22,7 @@ #include "toolapphelper.h" #include "dockitem.h" #include "pluginsitem.h" +#include "quicksettingcontroller.h" #include #include @@ -33,37 +34,23 @@ ToolAppHelper::ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget, , m_displayMode(DisplayMode::Efficient) , m_trashItem(nullptr) { + connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { + if (pluginClass != QuickSettingController::PluginAttribute::Tool) + return; + + pluginItemAdded(itemInter); + }); + + QList pluginItems = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Tool); + for (PluginsItemInterface *pluginItem : pluginItems) + pluginItemAdded(pluginItem); } void ToolAppHelper::setDisplayMode(DisplayMode displayMode) { m_displayMode = displayMode; - resetPluginItems(); updateWidgetStatus(); -} - -void ToolAppHelper::addPluginItem(int index, DockItem *dockItem) -{ - if (pluginInTool(dockItem)) - appendToToolArea(index, dockItem); - else - appendToPluginArea(index, dockItem); - - // 将插件指针顺序保存到列表中 - if (index >= 0 && index < m_sequentPluginItems.size()) - m_sequentPluginItems.insert(index, dockItem); - else - m_sequentPluginItems << dockItem; - - // 保存垃圾箱插件指针 - PluginsItem *pluginsItem = qobject_cast(dockItem); - if (pluginsItem && pluginsItem->pluginName() == "trash") - m_trashItem = pluginsItem; - - if (!toolIsVisible()) - updateWidgetStatus(); - - Q_EMIT requestUpdate(); + moveToolWidget(); } void ToolAppHelper::removePluginItem(DockItem *dockItem) @@ -90,23 +77,16 @@ bool ToolAppHelper::toolIsVisible() const return m_toolAreaWidget->isVisible(); } -void ToolAppHelper::appendToPluginArea(int index, DockItem *dockItem) -{ - // 因为日期时间插件和其他插件的大小有异,为了方便设置边距,在插件区域布局再添加一层布局设置边距 - // 因此在处理插件图标时,需要通过两层布局判断是否为需要的插件,例如拖动插件位置等判断 - QBoxLayout *boxLayout = new QBoxLayout(QBoxLayout::LeftToRight, m_pluginAreaWidget); - boxLayout->addWidget(dockItem, 0, Qt::AlignCenter); - QBoxLayout *pluginLayout = static_cast(m_pluginAreaWidget->layout()); - pluginLayout->insertLayout(index, boxLayout, 0); -} - void ToolAppHelper::appendToToolArea(int index, DockItem *dockItem) { + dockItem->setParent(m_toolAreaWidget); QBoxLayout *boxLayout = static_cast(m_toolAreaWidget->layout()); if (index >= 0) boxLayout->insertWidget(index, dockItem); else boxLayout->addWidget(dockItem); + + Q_EMIT requestUpdate(); } bool ToolAppHelper::removePluginArea(DockItem *dockItem) @@ -141,28 +121,26 @@ bool ToolAppHelper::removeToolArea(DockItem *dockItem) return false; } -void ToolAppHelper::resetPluginItems() +void ToolAppHelper::moveToolWidget() { - if (m_displayMode == DisplayMode::Efficient) { - // 高效模式下, 让工具区域的插件移动到插件区域显示 - QList dockItems = dockItemOnWidget(true); - for (DockItem *dockItem : dockItems) { - // 从工具列表中移除插件, 将这些插件放入到插件区域 - removeToolArea(dockItem); - int index = itemIndex(dockItem, false); - appendToPluginArea(index, dockItem); - } - } else { - // 时尚模式下,将插件区域对应的插件移动到工具区域 - QList dockItems = dockItemOnWidget(false); - for (DockItem *dockItem : dockItems) { - if (!pluginInTool(dockItem)) - continue; + for (int i = m_toolAreaWidget->layout()->count() - 1; i >= 0; i--) { + QLayoutItem *layoutItem = m_toolAreaWidget->layout()->itemAt(i); + if (!layoutItem) + continue; - // 从插件区域中移除相关插件,并将其插入到工具区域中 - removePluginArea(dockItem); - int index = itemIndex(dockItem, true); - appendToToolArea(index, dockItem); + PluginsItem *pluginWidget = qobject_cast(layoutItem->widget()); + if (!pluginWidget) + continue; + + m_toolAreaWidget->layout()->removeWidget(pluginWidget); + } + + if (m_displayMode == Dock::DisplayMode::Fashion) { + QuickSettingController *quickController = QuickSettingController::instance(); + QList plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tool); + for (PluginsItemInterface *plugin : plugins) { + PluginsItem *pluginWidget = quickController->pluginItemWidget(plugin); + m_toolAreaWidget->layout()->addWidget(pluginWidget); } } } @@ -186,9 +164,6 @@ void ToolAppHelper::updateWidgetStatus() bool ToolAppHelper::pluginInTool(DockItem *dockItem) const { - if (m_displayMode != DisplayMode::Fashion) - return false; - PluginsItem *pluginItem = qobject_cast(dockItem); if (!pluginItem) return false; @@ -238,19 +213,55 @@ QList ToolAppHelper::dockItemOnWidget(bool isTool) const } } else { QBoxLayout *pluginLayout = static_cast(m_pluginAreaWidget->layout()); - for (int i = 0; i < pluginLayout->count(); ++i) { - QLayoutItem *layoutItem = pluginLayout->itemAt(i); - QLayout *boxLayout = layoutItem->layout(); - if (!boxLayout) - continue; + if (pluginLayout) { + for (int i = 0; i < pluginLayout->count(); ++i) { + QLayoutItem *layoutItem = pluginLayout->itemAt(i); + QLayout *boxLayout = layoutItem->layout(); + if (!boxLayout) + continue; - DockItem *dockItem = qobject_cast(boxLayout->itemAt(0)->widget()); - if (!dockItem) - continue; + DockItem *dockItem = qobject_cast(boxLayout->itemAt(0)->widget()); + if (!dockItem) + continue; - dockItems << dockItem; + dockItems << dockItem; + } } } return dockItems; } + +void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter) +{ + if (m_displayMode != Dock::DisplayMode::Fashion || pluginExists(itemInter)) + return; + + QuickSettingController *quickController = QuickSettingController::instance(); + PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter); + if (pluginInTool(pluginItem)) + appendToToolArea(0, pluginItem); +} + +bool ToolAppHelper::pluginExists(PluginsItemInterface *itemInter) const +{ + QBoxLayout *boxLayout = static_cast(m_toolAreaWidget->layout()); + if (!boxLayout) + return false; + + for (int i = 0; i < boxLayout->count() ; i++) { + QLayoutItem *layoutItem = boxLayout->itemAt(i); + if (!layoutItem) + continue; + + PluginsItem *pluginItem = qobject_cast(layoutItem->widget()); + if (!pluginItem) + continue; + + // 如果当前的插件的接口已经存在,则无需再次插入 + if (pluginItem->pluginItem() == itemInter) + return true; + } + + return false; +} diff --git a/frame/controller/toolapphelper.h b/frame/controller/toolapphelper.h index 8feee7919..dd3513ed8 100644 --- a/frame/controller/toolapphelper.h +++ b/frame/controller/toolapphelper.h @@ -29,6 +29,7 @@ class QWidget; class DockItem; class PluginsItem; +class PluginsItemInterface; using namespace Dock; @@ -40,7 +41,6 @@ public: explicit ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget, QObject *parent = nullptr); void setDisplayMode(DisplayMode displayMode); - void addPluginItem(int index, DockItem *dockItem); void removePluginItem(DockItem *dockItem); PluginsItem *trashPlugin() const; bool toolIsVisible() const; @@ -50,16 +50,17 @@ Q_SIGNALS: void toolVisibleChanged(bool); private: - void appendToPluginArea(int index, DockItem *dockItem); void appendToToolArea(int index, DockItem *dockItem); bool removePluginArea(DockItem *dockItem); bool removeToolArea(DockItem *dockItem); + void moveToolWidget(); - void resetPluginItems(); void updateWidgetStatus(); bool pluginInTool(DockItem *dockItem) const; int itemIndex(DockItem *dockItem, bool isTool) const; QList dockItemOnWidget(bool isTool) const; + void pluginItemAdded(PluginsItemInterface *itemInter); + bool pluginExists(PluginsItemInterface *itemInter) const; private: QWidget *m_pluginAreaWidget; diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index fe945a10c..6cc8b2102 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -24,6 +24,7 @@ #include "dockitemmanager.h" #include "windowmanager.h" #include "proxyplugincontroller.h" +#include "pluginsitem.h" #include #include diff --git a/frame/item/pluginsitem.h b/frame/item/pluginsitem.h index 008b6c5e9..7e3bfbb3d 100644 --- a/frame/item/pluginsitem.h +++ b/frame/item/pluginsitem.h @@ -26,12 +26,14 @@ #include "pluginsiteminterface.h" class QGSettings; + class PluginsItem : public DockItem { Q_OBJECT + friend class QuickSettingController; + public: - explicit PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &jsonData, QWidget *parent = nullptr); ~PluginsItem() override; int itemSortKey() const; @@ -58,6 +60,9 @@ public: public slots: void refreshIcon() override; +protected: + explicit PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &jsonData, QWidget *parent = nullptr); + private slots: void onGSettingsChanged(const QString &key); diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 2e2e75063..eb922f886 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -28,6 +28,8 @@ #include #include +#include +#include #define ICONWIDTH 24 #define ICONHEIGHT 24 @@ -48,7 +50,13 @@ QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, cons , m_pluginInter(pluginInter) , m_itemKey(itemKey) , m_metaData(metaData) + , m_iconWidgetParent(new QWidget(this)) + , m_iconWidget(new QuickIconWidget(pluginInter, itemKey, isPrimary(), m_iconWidgetParent)) + , m_textWidget(new QWidget(this)) + , m_nameLabel(new QLabel(m_textWidget)) + , m_stateLabel(new QLabel(m_textWidget)) { + initUi(); setAcceptDrops(true); this->installEventFilter(this); } @@ -57,6 +65,32 @@ QuickSettingItem::~QuickSettingItem() { } +bool QuickSettingItem::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::MouseButtonRelease) { + if (obj->objectName() == "expandLabel") { + // 如果是鼠标的按下事件 + if (isPrimary()) + Q_EMIT detailClicked(m_pluginInter); + } else if (obj == this) { + const QString &command = m_pluginInter->itemCommand(m_itemKey); + if (!command.isEmpty()) + QProcess::startDetached(command); + + if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey)) + showPopupApplet(w); + } + } else if (event->type() == QEvent::Resize) { + if (obj == m_nameLabel) { + m_nameLabel->setText(QFontMetrics(m_nameLabel->font()).elidedText(m_pluginInter->pluginDisplayName(), Qt::TextElideMode::ElideRight, m_nameLabel->width())); + } else if (obj == m_stateLabel) { + m_stateLabel->setText(QFontMetrics(m_stateLabel->font()).elidedText(m_pluginInter->description(), Qt::TextElideMode::ElideRight, m_stateLabel->width())); + } + } + + return DockItem::eventFilter(obj, event); +} + PluginsItemInterface *QuickSettingItem::pluginItem() const { return m_pluginInter; @@ -114,84 +148,9 @@ void QuickSettingItem::paintEvent(QPaintEvent *e) QPainterPath path; path.addRoundedRect(rect(), RADIUS, RADIUS); painter.setClipPath(path); - // 绘制背景色 DPalette dpa = DPaletteHelper::instance()->palette(this); - painter.fillRect(rect(), dpa.brush(DPalette::ColorRole::Mid)); - // 让图标填上前景色 - int pixmapWidth = static_cast(ICONWIDTH * qApp->devicePixelRatio()); - int pixmapHeight = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); - QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) { - QSize size = iconSizes[0]; - if (size.isValid() && !size.isEmpty() && !size.isNull()) { - pixmapWidth = size.width(); - pixmapHeight = size.height(); - } - } - QPixmap pm = icon.pixmap(pixmapWidth, pixmapHeight); - QPainter pa(&pm); - pa.setCompositionMode(QPainter::CompositionMode_SourceIn); - pa.fillRect(pm.rect(), painter.pen().brush()); - if (isPrimary()) { - // 如果是主图标,则显示阴影背景 - int marginYSpace = yMarginSpace(); - QRect iconBg(MARGINLEFTSPACE, marginYSpace, BGSIZE, BGSIZE); - painter.save(); - painter.setPen(Qt::NoPen); - painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); - painter.drawEllipse(iconBg); - painter.restore(); - QRect rctIcon(iconBg.x() + (iconBg.width() - pixmapWidth) / 2, - iconBg.y() + (iconBg.height() - pixmapHeight) / 2, - pixmapWidth, pixmapHeight); - painter.drawPixmap(rctIcon, pm); - // 绘制文字 - painter.setPen(Qt::black); - - QRect rctPluginName(iconBg.right() + 10, iconBg.top(), BGWIDTH - BGSIZE - OPENICONSIZE - 10 * 2, BGSIZE / 2); - QFont font = DFontSizeManager::instance()->t6(); - font.setBold(true); - painter.setFont(font); - QTextOption textOption; - textOption.setAlignment(Qt::AlignLeft | Qt::AlignVCenter); - QString displayName = QFontMetrics(font).elidedText(m_pluginInter->pluginDisplayName(), Qt::TextElideMode::ElideRight, rctPluginName.width()); - painter.drawText(rctPluginName, displayName, textOption); - // 绘制下方啊的状态文字 - QRect rctPluginStatus(rctPluginName.x(), rctPluginName.bottom() + 1, - rctPluginName.width(), BGSIZE / 2); - font = DFontSizeManager::instance()->t10(); - painter.setFont(font); - QString description = QFontMetrics(font).elidedText(m_pluginInter->description(), Qt::TextElideMode::ElideRight, rctPluginStatus.width()); - painter.drawText(rctPluginStatus, description, textOption); - // 绘制右侧的展开按钮 - QPixmap expandPixmap = ImageUtil::loadSvg(expandFileName(), expandSize); - int iconRight = rect().width() - MARGINRIGHTSPACE; - QRect rectOfExpand(iconRight - expandSize.width(), - (rctIcon.y() + (rctIcon.height() - expandSize.height()) / 2), - expandSize.width(), expandSize.height()); - painter.drawPixmap(rectOfExpand, expandPixmap); - } else { - // 绘制图标 - QRect rctIcon = iconRect(); - painter.drawPixmap(rctIcon, pm); - // 绘制文字 - QFont ft; - ft.setPixelSize(FONTSIZE); - painter.setFont(ft); - QTextOption option; - option.setAlignment(Qt::AlignTop | Qt::AlignHCenter); - painter.drawText(QRect(QPoint(0, rctIcon.top() + ICONHEIGHT + ICONSPACE), - QPoint(width(), height())), m_pluginInter->pluginDisplayName(), option); - } -} - -QRect QuickSettingItem::iconRect() -{ - int left = (width() - ICONWIDTH) / 2; - int top = (height() - ICONHEIGHT - ICONSPACE - 10) / 2; - return QRect(left, top, ICONWIDTH, ICONHEIGHT); + painter.fillRect(rect(), Qt::white); } QColor QuickSettingItem::foregroundColor() const @@ -207,31 +166,96 @@ QColor QuickSettingItem::foregroundColor() const return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); } -void QuickSettingItem::mouseReleaseEvent(QMouseEvent *event) +void QuickSettingItem::initUi() { - // 如果是鼠标的按下事件 if (isPrimary()) { - QMouseEvent *mouseEvent = static_cast(event); - QRect rctExpand(rect().width() - MARGINRIGHTSPACE - expandSize.width(), - (rect().height() - expandSize.height()) / 2, - expandSize.width(), expandSize.height()); - if (rctExpand.contains(mapFromGlobal(mouseEvent->globalPos()))) - Q_EMIT detailClicked(m_pluginInter); + // 如果是占用两排的插件,则用横向Layout + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(10, 0, 10, 0); + mainLayout->setSpacing(0); + mainLayout->addStretch(10); + mainLayout->setAlignment(Qt::AlignCenter); + // 添加图标 + QVBoxLayout *iconLayout = new QVBoxLayout(m_iconWidgetParent); + iconLayout->setContentsMargins(0, 0, 0, 0); + iconLayout->setSpacing(0); + iconLayout->setAlignment(Qt::AlignCenter); + m_iconWidget->setFixedSize(BGSIZE, BGSIZE); + iconLayout->addWidget(m_iconWidget); + mainLayout->addWidget(m_iconWidgetParent); + mainLayout->addSpacing(10); + // 添加中间的名称部分 + QFont nameFont = DFontSizeManager::instance()->t6(); + nameFont.setBold(true); + QPalette pe; + pe.setColor(QPalette::WindowText, Qt::black); + m_nameLabel->setPalette(pe); + m_stateLabel->setPalette(pe); + m_nameLabel->setFont(nameFont); + m_stateLabel->setFont(DFontSizeManager::instance()->t10()); + m_nameLabel->setText(m_pluginInter->pluginDisplayName()); + m_stateLabel->setText(m_pluginInter->description()); + m_nameLabel->installEventFilter(this); + m_stateLabel->installEventFilter(this); + QVBoxLayout *textLayout = new QVBoxLayout(m_textWidget); + textLayout->setContentsMargins(0, 0, 0, 0); + textLayout->setSpacing(0); + textLayout->addWidget(m_nameLabel); + textLayout->addWidget(m_stateLabel); + textLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + mainLayout->addWidget(m_textWidget); + + // 添加右侧的展开按钮 + QWidget *expandWidgetParent = new QWidget(this); + QVBoxLayout *expandLayout = new QVBoxLayout(expandWidgetParent); + expandLayout->setSpacing(0); + QLabel *expandLabel = new QLabel(expandWidgetParent); + expandLabel->setObjectName("expandLabel"); + expandLabel->setPixmap(QPixmap(expandFileName())); + expandLabel->setFixedSize(expandSize); + expandLabel->setAutoFillBackground(true); + expandLabel->installEventFilter(this); + expandLayout->addWidget(expandLabel); + pe.setBrush(QPalette::Window, Qt::transparent); + expandLabel->setPalette(pe); + + mainLayout->addWidget(expandWidgetParent); } else { - const QString command = m_pluginInter->itemCommand(m_itemKey); - if (!command.isEmpty()) - QProcess::startDetached(command); + QHBoxLayout *iconLayout = new QHBoxLayout(m_iconWidgetParent); + iconLayout->setContentsMargins(0, 0, 0, 0); + iconLayout->setSpacing(0); + iconLayout->setAlignment(Qt::AlignHCenter); - if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey)) - showPopupApplet(w); + m_iconWidgetParent->setFixedHeight(ICONHEIGHT); + m_iconWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + iconLayout->addWidget(m_iconWidget); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(0, 10, 0, 10); + mainLayout->setSpacing(7); + mainLayout->setAlignment(Qt::AlignCenter); + // 添加上方的图标 + mainLayout->addWidget(m_iconWidgetParent); + + // 添加下方的文字 + QHBoxLayout *textLayout = new QHBoxLayout(m_textWidget); + textLayout->setAlignment(Qt::AlignCenter); + textLayout->setContentsMargins(0, 0, 0, 0); + textLayout->setSpacing(0); + QFont nameFont = DFontSizeManager::instance()->t10(); + QPalette pe; + pe.setColor(QPalette::WindowText, Qt::black); + m_nameLabel->setFont(nameFont); + m_nameLabel->setPalette(pe); + m_nameLabel->setText(m_pluginInter->pluginDisplayName()); + textLayout->addWidget(m_nameLabel); + m_stateLabel->setVisible(false); + m_textWidget->setFixedHeight(11); + mainLayout->addWidget(m_textWidget); + installEventFilter(this); } } -int QuickSettingItem::yMarginSpace() -{ - return (rect().height() - BGSIZE) / 2; -} - QString QuickSettingItem::expandFileName() { if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) @@ -239,3 +263,112 @@ QString QuickSettingItem::expandFileName() return QString(":/icons/resources/arrow-right.svg"); } + +QPixmap QuickSettingItem::pluginIcon() const +{ + QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); + if (icon.isNull()) { + // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 + QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + QPixmap grabPixmap = itemWidget->grab(); + return grabPixmap; + } + + // 获取icon接口返回的图标 + int pixmapWidth = width(); + int pixmapHeight = height(); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) { + QSize size = iconSizes[0]; + if (size.isValid() && !size.isEmpty() && !size.isNull()) { + pixmapWidth = size.width(); + pixmapHeight = size.height(); + } + } + + return icon.pixmap(pixmapWidth, pixmapHeight); +} + +/** + * @brief QuickIconWidget::QuickIconWidget + * @param pluginInter + * @param parent + * 图标的widget + */ +QuickIconWidget::QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, bool isPrimary, QWidget *parent) + : QWidget(parent) + , m_pluginInter(pluginInter) + , m_itemKey(itemKey) + , m_isPrimary(isPrimary) +{ +} + +void QuickIconWidget::paintEvent(QPaintEvent *event) +{ + QWidget::paintEvent(event); + QPixmap pm = pluginIcon(); + + QPainter painter(this); + painter.setRenderHint(QPainter::RenderHint::Antialiasing); + painter.setPen(foregroundColor()); + + if (m_isPrimary) { + DPalette dpa = DPaletteHelper::instance()->palette(this); + QPainter pa(&pm); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pm.rect(), painter.pen().brush()); + // 如果是主图标,则显示阴影背景 + painter.save(); + painter.setPen(Qt::NoPen); + painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); + painter.drawEllipse(rect()); + painter.restore(); + QRect rctIcon((rect().width() - pm.width()) / 2, (rect().height() - pm.height()) / 2, pm.width(), pm.height()); + painter.drawPixmap(rctIcon, pm); + } else { + QRect rctIcon(0, 0, pm.width(), pm.height()); + painter.drawPixmap(rctIcon, pm); + } +} + +QColor QuickIconWidget::foregroundColor() const +{ + DPalette dpa = DPaletteHelper::instance()->palette(this); + // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 + if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) + return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); + + if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Deactive) + return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); + + return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); +} + +QPixmap QuickIconWidget::pluginIcon() const +{ + QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); + if (icon.isNull()) { + // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 + QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); + if (itemWidget) { + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + return itemWidget->grab(); + } + return QPixmap(); + } + + // 获取icon接口返回的图标 + int pixmapWidth = width(); + int pixmapHeight = height(); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) { + QSize size = iconSizes[0]; + if (size.isValid() && !size.isEmpty() && !size.isNull()) { + pixmapWidth = size.width(); + pixmapHeight = size.height(); + } + } + + return icon.pixmap(pixmapWidth, pixmapHeight); +} diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 08c416395..97cb1b0f6 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -24,17 +24,18 @@ #include "dockitem.h" class PluginsItemInterface; +class QuickIconWidget; class QuickSettingItem : public DockItem { Q_OBJECT - friend class QuickSettingController; - Q_SIGNALS: void detailClicked(PluginsItemInterface *); public: + QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent = nullptr); + ~QuickSettingItem() override; PluginsItemInterface *pluginItem() const; ItemType itemType() const override; const QPixmap dragPixmap(); @@ -42,23 +43,49 @@ public: bool isPrimary() const; protected: - QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent = nullptr); - ~QuickSettingItem() override; + bool eventFilter(QObject *obj, QEvent *event) override; void paintEvent(QPaintEvent *e) override; - QRect iconRect(); QColor foregroundColor() const; - void mouseReleaseEvent(QMouseEvent *event) override; - private: - int yMarginSpace(); + void initUi(); QString expandFileName(); + QPixmap pluginIcon() const; private: PluginsItemInterface *m_pluginInter; QString m_itemKey; QJsonObject m_metaData; + QWidget *m_iconWidgetParent; + QuickIconWidget *m_iconWidget; + QWidget *m_textWidget; + QLabel *m_nameLabel; + QLabel *m_stateLabel; +}; + +/** + * @brief The QuickIconWidget class + * 图标的Widget + */ +class QuickIconWidget : public QWidget +{ + Q_OBJECT + +public: + explicit QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, bool isPrimary, QWidget *parent = Q_NULLPTR); + +protected: + void paintEvent(QPaintEvent *event) override; + +private: + QColor foregroundColor() const; + QPixmap pluginIcon() const; + +private: + PluginsItemInterface *m_pluginInter; + QString m_itemKey; + bool m_isPrimary; }; #endif // QUICKSETTINGITEM_H diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index df5bc4e3f..48da1df2c 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -42,7 +42,7 @@ static QMap dateFormat{{ 0,"yyyy/M/d" }, { 1,"yyyy-M-d" }, { 2,"yy { 4,"yyyy-MM-dd" }, { 5,"yyyy.MM.dd" }, { 6,"yy/M/d" }, { 7,"yy-M-d" }, { 8,"yy.M.d" }}; static QMap timeFormat{{0, "h:mm"}, {1, "hh:mm"}}; -DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) +DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent) : QWidget (parent) , m_timedateInter(new Timedate("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", QDBusConnection::sessionBus(), this)) , m_position(Dock::Position::Bottom) @@ -52,6 +52,7 @@ DateTimeDisplayer::DateTimeDisplayer(QWidget *parent) , m_tipsTimer(new QTimer(this)) , m_currentSize(0) , m_oneRow(false) + , m_showMultiRow(showMultiRow) { m_tipPopupWindow.reset(new DockPopupWindow); // 日期格式变化的时候,需要重绘 @@ -131,12 +132,16 @@ QSize DateTimeDisplayer::suitableSize() const QSize DateTimeDisplayer::suitableSize(const Dock::Position &position) const { DateTimeInfo info = dateTimeInfo(position); - if (position == Dock::Position::Top || position == Dock::Position::Bottom) { - int width = info.m_timeRect.width() + info.m_dateRect.width() + 16; - return QSize(width, height()); + if (position == Dock::Position::Left || position == Dock::Position::Right) + return QSize(width(), info.m_timeRect.height() + info.m_dateRect.height()); + + // 如果在上下显示 + if (m_showMultiRow) { + // 如果显示多行的情况,一般是在高效模式下显示,因此,返回最大的尺寸 + return QSize(qMax(info.m_timeRect.width(), info.m_dateRect.width()), height()); } - return QSize(width(), info.m_timeRect.height() + info.m_dateRect.height()); + return QSize(info.m_timeRect.width() + info.m_dateRect.width() + 16, height()); } void DateTimeDisplayer::mousePressEvent(QMouseEvent *event) @@ -209,20 +214,29 @@ DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Posi info.m_time = getTimeString(position); info.m_date = getDateString(position); - if (position == Dock::Top || position == Dock::Bottom) { - int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width() + 3; - int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; + // 如果是左右方向 + if (position == Dock::Position::Left || position == Dock::Position::Right) { + int textWidth = rect().width(); + info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2); + info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2); + return info; + } + int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width() + 3; + int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; + // 如果是上下方向 + if (m_showMultiRow) { + // 日期时间多行显示(一般是高效模式下) + info.m_timeRect = QRect(0, 0, timeWidth, height() / 2); + info.m_dateRect = QRect(0, height() / 2, dateWidth, height() / 2); + } else { info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height()); int dateX = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2 - ITEMSPACE; // 如果时间的X坐标小于日期的X坐标,需要手动设置坐标在日期坐标的右侧 if (dateX < info.m_timeRect.right()) dateX = info.m_timeRect.right(); info.m_dateRect = QRect(dateX, 0, dateWidth, height()); - } else { - int textWidth = rect().width(); - info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2); - info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2); } + return info; } @@ -260,16 +274,17 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e) painter.setRenderHint(QPainter::Antialiasing); painter.setPen(QPen(palette().brightText(), 1)); - int timeTextFlag = Qt::AlignCenter; - int dateTextFlag = Qt::AlignCenter; - if (m_position == Dock::Top || m_position == Dock::Bottom) { - timeTextFlag = Qt::AlignLeft | Qt::AlignVCenter; - dateTextFlag = Qt::AlignRight | Qt::AlignVCenter; + int timeAlignFlag = Qt::AlignCenter; + int dateAlignFlag = Qt::AlignCenter; + if (m_showMultiRow) { + timeAlignFlag = Qt::AlignHCenter | Qt::AlignBottom; + dateAlignFlag = Qt::AlignHCenter | Qt::AlignTop; } + painter.setFont(timeFont()); - painter.drawText(info.m_timeRect, timeTextFlag, info.m_time); + painter.drawText(textRect(info.m_timeRect), timeAlignFlag, info.m_time); painter.setFont(m_dateFont); - painter.drawText(info.m_dateRect, dateTextFlag, info.m_date); + painter.drawText(textRect(info.m_dateRect), dateAlignFlag, info.m_date); updateLastData(info); } @@ -352,6 +367,19 @@ void DateTimeDisplayer::createMenuItem() } } +QRect DateTimeDisplayer::textRect(const QRect &sourceRect) const +{ + // 如果是上下,则不做任何变化 + if (!m_showMultiRow && (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)) + return sourceRect; + + QRect resultRect = sourceRect; + QSize size = suitableSize(); + // 如果是左右或者上下多行显示,设置宽度 + resultRect.setWidth(size.width()); + return resultRect; +} + void DateTimeDisplayer::enterEvent(QEvent *event) { Q_UNUSED(event); diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index 587da8a11..37fa224f9 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -48,7 +48,7 @@ private: }; public: - explicit DateTimeDisplayer(QWidget *parent = nullptr); + explicit DateTimeDisplayer(bool showMultiRow, QWidget *parent = nullptr); ~DateTimeDisplayer() override; void setPositon(Dock::Position position); void setOneRow(bool oneRow); @@ -80,6 +80,7 @@ private: QFont timeFont() const; void createMenuItem(); + QRect textRect(const QRect &sourceRect) const; private Q_SLOTS: void onTimeChanged(); @@ -97,6 +98,7 @@ private: QString m_lastTimeString; int m_currentSize; bool m_oneRow; + bool m_showMultiRow; }; #endif // DATETIMEDISPLAYER_H diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp new file mode 100644 index 000000000..12ddc1ea6 --- /dev/null +++ b/frame/window/docktraywindow.cpp @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "docktraywindow.h" +#include "datetimedisplayer.h" +#include "systempluginwindow.h" +#include "quickpluginwindow.h" +#include "tray_gridview.h" +#include "tray_model.h" +#include "tray_delegate.h" +#include "quicksettingcontroller.h" +#include "pluginsitem.h" + +#include + +#include +#include + +#define FRONTSPACING 18 +#define SPLITERSIZE 2 +#define SPLITESPACE 10 + +DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent) + : QWidget(parent) + , m_dockInter(dockInter) + , m_position(Dock::Position::Bottom) + , m_displayMode(Dock::DisplayMode::Efficient) + , m_mainBoxLayout(new QBoxLayout(QBoxLayout::Direction::RightToLeft, this)) + , m_toolWidget(new QWidget(this)) + , 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_quickIconWidget(new QuickPluginWindow(this)) + , m_trayView(new TrayGridView(this)) + , m_model(new TrayModel(m_trayView, false, true, this)) + , m_delegate(new TrayDelegate(m_trayView, this)) +{ + initUi(); + initConnection(); + + m_trayView->setModel(m_model); + m_trayView->setItemDelegate(m_delegate); + m_trayView->openPersistentEditor(m_model->index(0, 0)); +} + +void DockTrayWindow::setPositon(const Dock::Position &position) +{ + m_position = position; + m_dateTimeWidget->setPositon(position); + m_systemPuginWidget->setPositon(position); + m_quickIconWidget->setPositon(position); + m_trayView->setPosition(position); + updateLayout(position); + onResetLayout(); +} + +void DockTrayWindow::setDisplayMode(const Dock::DisplayMode &displayMode) +{ + m_displayMode = displayMode; + moveToolPlugin(); +} + +QSize DockTrayWindow::suitableSize(const Dock::Position &position, const int &, const double &) const +{ + if (position == Dock::Position::Left || position == Dock::Position::Right) { + // 左右的尺寸 + int height = FRONTSPACING + + m_toolWidget->height() + + (SPLITESPACE * 2) + + SPLITERSIZE + + m_dateTimeWidget->suitableSize(position).height() + + m_systemPuginWidget->suitableSize(position).height() + + m_quickIconWidget->suitableSize(position).height() + + m_trayView->suitableSize(position).height(); + + return QSize(-1, height); + } + // 上下的尺寸 + int width = FRONTSPACING + + m_toolWidget->width() + + (SPLITESPACE * 2) + + SPLITERSIZE + + m_dateTimeWidget->width() + + m_systemPuginWidget->width() + + m_quickIconWidget->width() + + m_trayView->width(); + return QSize(width, -1); +} + +QSize DockTrayWindow::suitableSize() const +{ + return suitableSize(m_position, 0, 0); +} + +void DockTrayWindow::layoutWidget() +{ + resizeTool(); +} + +void DockTrayWindow::resizeEvent(QResizeEvent *event) +{ + Q_EMIT requestUpdate(); + // 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示 + Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); + QWidget::resizeEvent(event); + switch (m_position) { + case Dock::Position::Left: + case Dock::Position::Right: + m_toolLineLabel->setFixedSize(width() * 0.6, SPLITERSIZE); + break; + case Dock::Position::Top: + case Dock::Position::Bottom: + m_toolLineLabel->setFixedSize(SPLITERSIZE, height() * 0.6); + break; + } +} + +void DockTrayWindow::paintEvent(QPaintEvent *event) +{ + QWidget::paintEvent(event); + QPainter painter(this); + QColor color; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { + color = Qt::black; + painter.setOpacity(0.5); + } else { + color = Qt::white; + painter.setOpacity(0.1); + } + + painter.fillRect(m_toolLineLabel->geometry(), color); +} + +/** 根据任务栏的位置来更新布局的方向 + * @brief DockTrayWindow::updateLayout + * @param position + */ +void DockTrayWindow::updateLayout(const Dock::Position &position) +{ + switch (position) { + case Dock::Position::Left: + case Dock::Position::Right: { + m_mainBoxLayout->setDirection(QBoxLayout::BottomToTop); + m_toolLayout->setDirection(QBoxLayout::BottomToTop); + break; + } + case Dock::Position::Top: + case Dock::Position::Bottom: { + m_mainBoxLayout->setDirection(QBoxLayout::RightToLeft); + m_toolLayout->setDirection(QBoxLayout::RightToLeft); + break; + } + } +} + +void DockTrayWindow::resizeTool() const +{ + int toolSize = 0; + int size = 0; + if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) + size = width(); + else + size = height(); + + for (int i = 0; i < m_toolLayout->count(); i++) { + QLayoutItem *layoutItem = m_toolLayout->itemAt(i); + if (!layoutItem) + continue; + + PluginsItem *toolWidget = qobject_cast(layoutItem->widget()); + if (!toolWidget) + continue; + + toolWidget->setFixedSize(size, size); + toolSize += size; + } + + if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) + m_toolWidget->setFixedHeight(toolSize); + else + m_toolWidget->setFixedWidth(toolSize); +} + +bool DockTrayWindow::pluginExists(PluginsItemInterface *itemInter) const +{ + for (int i = 0; i < m_toolLayout->count(); i++) { + QLayoutItem *layoutItem = m_toolLayout->itemAt(i); + if (!layoutItem) + continue; + + PluginsItem *pluginItem = qobject_cast(layoutItem->widget()); + if (!pluginItem) + continue; + + if (pluginItem->pluginItem() == itemInter) + return true; + } + + return false; +} + +void DockTrayWindow::moveToolPlugin() +{ + for (int i = m_toolLayout->count() - 1; i >= 0; i--) { + QLayoutItem *layoutItem = m_toolLayout->itemAt(i); + if (!layoutItem) + continue; + + PluginsItem *pluginWidget = qobject_cast(layoutItem->widget()); + if (!pluginWidget) + continue; + + m_toolLayout->removeWidget(pluginWidget); + } + if (m_displayMode == Dock::DisplayMode::Efficient) { + // 如果当前是高效模式,则将所有的工具插件移动到当前的工具区域 + QuickSettingController *quickController = QuickSettingController::instance(); + QList plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tool); + for (PluginsItemInterface *pluginInter : plugins) { + PluginsItem *pluginWidget = quickController->pluginItemWidget(pluginInter); + m_toolLayout->addWidget(pluginWidget); + } + } +} + +void DockTrayWindow::initUi() +{ + m_toolLayout->setContentsMargins(0, 0, 0, 0); + m_toolLayout->setSpacing(0); + + m_systemPuginWidget->setDisplayMode(Dock::DisplayMode::Efficient); + m_mainBoxLayout->setContentsMargins(0, 0, 0, 0); + m_mainBoxLayout->setSpacing(0); + m_mainBoxLayout->addSpacing(FRONTSPACING); + m_mainBoxLayout->addWidget(m_toolWidget); + m_mainBoxLayout->addSpacing(SPLITESPACE); + m_mainBoxLayout->addWidget(m_toolLineLabel); + m_mainBoxLayout->addSpacing(SPLITESPACE); + m_mainBoxLayout->addWidget(m_dateTimeWidget); + m_mainBoxLayout->addWidget(m_systemPuginWidget); + m_mainBoxLayout->addWidget(m_quickIconWidget); + m_mainBoxLayout->addWidget(m_trayView); + m_mainBoxLayout->setAlignment(m_toolLineLabel, Qt::AlignCenter); + + WinInfo info; + info.type = TrayIconType::EXPANDICON; + m_model->addRow(info); + m_trayView->openPersistentEditor(m_model->index(0, 0)); + + m_toolLineLabel->setFixedSize(0, 0); + + m_mainBoxLayout->addStretch(); +} + +void DockTrayWindow::initConnection() +{ + connect(m_systemPuginWidget, &SystemPluginWindow::itemChanged, this, &DockTrayWindow::onResetLayout); + connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &DockTrayWindow::onResetLayout); + connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, &DockTrayWindow::onResetLayout); + connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onResetLayout); + + connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ] (PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { + if (pluginClass != QuickSettingController::PluginAttribute::Tool) + return; + + onItemAdded(itemInter); + }); + + connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, &DockTrayWindow::onItemRemove); +} + +void DockTrayWindow::onResetLayout() +{ + switch(m_position) { + case Dock::Position::Left: + case Dock::Position::Right: { + m_dateTimeWidget->setFixedSize(QWIDGETSIZE_MAX, m_dateTimeWidget->suitableSize().height()); + m_systemPuginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPuginWidget->suitableSize().height()); + m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, m_quickIconWidget->suitableSize().height()); + m_trayView->setFixedSize(QWIDGETSIZE_MAX, m_trayView->suitableSize().height()); + break; + } + case Dock::Position::Top: + case Dock::Position::Bottom: { + m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), QWIDGETSIZE_MAX); + m_systemPuginWidget->setFixedSize(m_systemPuginWidget->suitableSize().width(), QWIDGETSIZE_MAX); + m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); + m_trayView->setFixedSize(m_trayView->suitableSize().width(), QWIDGETSIZE_MAX); + break; + } + } + Q_EMIT requestUpdate(); +} + +void DockTrayWindow::onItemAdded(PluginsItemInterface *itemInter) +{ + if (m_displayMode != Dock::DisplayMode::Efficient || pluginExists(itemInter)) + return; + + QuickSettingController *quickController = QuickSettingController::instance(); + PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter); + pluginItem->setVisible(true); + + m_toolLayout->addWidget(pluginItem); + + Q_EMIT requestUpdate(); +} + +void DockTrayWindow::onItemRemove(PluginsItemInterface *itemInter) +{ + for (int i = 0; i < m_toolLayout->count(); i++) { + QLayoutItem *layoutItem = m_toolLayout->itemAt(i); + if (!layoutItem) + continue; + + PluginsItem *pluginItem = qobject_cast(layoutItem->widget()); + if (!pluginItem || pluginItem->pluginItem() != itemInter) + continue; + + m_toolLayout->removeWidget(pluginItem); + Q_EMIT requestUpdate(); + break; + } +} diff --git a/frame/window/docktraywindow.h b/frame/window/docktraywindow.h new file mode 100644 index 000000000..fb1bffbbf --- /dev/null +++ b/frame/window/docktraywindow.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef DOCKTRAYWINDOW_H +#define DOCKTRAYWINDOW_H + +#include "constants.h" +#include "dbusutil.h" + +#include + +class QBoxLayout; +class SystemPluginWindow; +class DateTimeDisplayer; +class QuickPluginWindow; +class TrayGridView; +class TrayModel; +class TrayDelegate; +class PluginsItem; +class PluginsItemInterface; +class QLabel; + +class DockTrayWindow : public QWidget +{ + Q_OBJECT + +public: + explicit DockTrayWindow(DockInter *dockInter, QWidget *parent = nullptr); + + void setPositon(const Dock::Position &position); + void setDisplayMode(const Dock::DisplayMode &displayMode); + + QSize suitableSize(const Dock::Position &position, const int &, const double &) const; + QSize suitableSize() const; + + void layoutWidget(); + +Q_SIGNALS: + void requestUpdate(); + +protected: + void resizeEvent(QResizeEvent *event) override; + void paintEvent(QPaintEvent *event) override; + +private: + void initUi(); + void initConnection(); + void updateLayout(const Dock::Position &position); + void resizeTool() const; + bool pluginExists(PluginsItemInterface *itemInter) const; + void moveToolPlugin(); + +private Q_SLOTS: + void onResetLayout(); + void onItemAdded(PluginsItemInterface *itemInter); + void onItemRemove(PluginsItemInterface *itemInter); + +private: + DockInter *m_dockInter; + Dock::Position m_position; + Dock::DisplayMode m_displayMode; + QBoxLayout *m_mainBoxLayout; + QWidget *m_toolWidget; + QBoxLayout *m_toolLayout; + QLabel *m_toolLineLabel; + DateTimeDisplayer *m_dateTimeWidget; // 日期时间 + SystemPluginWindow *m_systemPuginWidget; // 固定区域-一般是右侧的电源按钮 + QuickPluginWindow *m_quickIconWidget; // 插件区域-包括网络、蓝牙等 + TrayGridView *m_trayView; // 托盘区域视图 + TrayModel *m_model; // 托盘区域的model + TrayDelegate *m_delegate; // 托盘区域的视图代理 +}; + +#endif // DOCKTRAYWINDOW_H diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 8548449d1..15d6327d1 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -39,6 +39,7 @@ #include "mainwindow.h" #include "appmultiitem.h" #include "dockscreen.h" +#include "docktraywindow.h" #include #include @@ -97,7 +98,7 @@ MainPanelControl::MainPanelControl(DockInter *dockInter, QWidget *parent) , m_placeholderItem(nullptr) , m_appDragWidget(nullptr) , m_displayMode(Efficient) - , m_tray(nullptr) + , m_tray(new DockTrayWindow(dockInter, this)) , m_dockInter(dockInter) , m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, m_dockInter, this)) , m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolSonAreaWidget, this)) @@ -181,22 +182,28 @@ void MainPanelControl::initUI() m_toolSonLayout->setContentsMargins(0, 0, 0, 0); m_toolAreaLayout->addWidget(m_toolSonAreaWidget); + // 添加托盘区域(包括托盘图标和插件)等 + m_tray->setObjectName("tray"); + m_mainPanelLayout->addWidget(m_tray); + + m_trayAreaWidget->setVisible(false); + m_pluginAreaWidget->setVisible(false); /* 托盘区域 */ - m_trayAreaWidget->setObjectName("trayarea"); + /*m_trayAreaWidget->setObjectName("trayarea"); m_trayAreaWidget->setLayout(m_trayAreaLayout); m_trayAreaLayout->setSpacing(0); m_trayAreaLayout->setContentsMargins(0, 10, 0, 10); m_mainPanelLayout->addWidget(m_trayAreaWidget); m_traySpliter->setObjectName("spliter_tray"); - m_mainPanelLayout->addWidget(m_traySpliter); + m_mainPanelLayout->addWidget(m_traySpliter);*/ /* 插件区域 */ - m_pluginAreaWidget->setObjectName("pluginarea"); + /*m_pluginAreaWidget->setObjectName("pluginarea"); m_pluginAreaWidget->setLayout(m_pluginLayout); m_pluginLayout->setSpacing(10); m_pluginLayout->setContentsMargins(0, 0, 0, 0); - m_mainPanelLayout->addWidget(m_pluginAreaWidget, 0, Qt::AlignCenter); + m_mainPanelLayout->addWidget(m_pluginAreaWidget, 0, Qt::AlignCenter);*/ /* 桌面预览 */ m_desktopWidget->setObjectName("showdesktoparea"); @@ -218,6 +225,7 @@ void MainPanelControl::initConnection() connect(m_toolHelper, &ToolAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate); connect(m_toolHelper, &ToolAppHelper::toolVisibleChanged, this, &MainPanelControl::onToolVisibleChanged); connect(m_multiHelper, &MultiWindowHelper::requestUpdate, this, &MainPanelControl::requestUpdate); + connect(m_tray, &DockTrayWindow::requestUpdate, this, &MainPanelControl::onTrayRequestUpdate); } /** @@ -231,6 +239,7 @@ void MainPanelControl::setDisplayMode(DisplayMode dislayMode) m_displayMode = dislayMode; m_recentHelper->setDisplayMode(dislayMode); + m_tray->setDisplayMode(dislayMode); m_toolHelper->setDisplayMode(dislayMode); m_multiHelper->setDisplayMode(dislayMode); updateDisplayMode(); @@ -310,13 +319,13 @@ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg) * @param index 位置索引,如果为负数则插入到最后,为正则插入到指定位置 * @param wdg 应用指针对象 */ -void MainPanelControl::addTrayAreaItem(int index, QWidget *wdg) +/*void MainPanelControl::addTrayAreaItem(int index, QWidget *wdg) { m_tray = static_cast(wdg); m_trayAreaLayout->insertWidget(index, wdg); if (m_tray) m_tray->installEventFilter(this); -} +}*/ /**移除固定区域某一应用 * @brief MainPanelControl::removeFixedAreaItem @@ -437,10 +446,12 @@ void MainPanelControl::insertItem(int index, DockItem *item) m_recentHelper->addAppItem(index, item); break; case DockItem::TrayPlugin: // 此处只会有一个tray系统托盘插件,微信、声音、网络蓝牙等等,都在系统托盘插件中处理的 - addTrayAreaItem(index, item); - break; + //addTrayAreaItem(index, item); + return; + //break; case DockItem::Plugins: - m_toolHelper->addPluginItem(index, item); + //m_toolHelper->addPluginItem(index, item); + return; break; case DockItem::AppMultiWindow: m_multiHelper->addMultiWindow(index, static_cast(item)); @@ -695,8 +706,8 @@ bool MainPanelControl::eventFilter(QObject *watched, QEvent *event) // 但是子部件的模式变化函数在FashionTrayItem部件中的 // NormalContainer部件尺寸变化完成之前就已经结束,导致 // NormalContainer没有更新自己的尺寸,引起插件区域拥挤 - if (m_tray && watched == m_tray && event->type() == QEvent::Resize) - m_tray->pluginItem()->displayModeChanged(m_displayMode); + //if (m_tray && watched == m_tray && event->type() == QEvent::Resize) + //m_tray->pluginItem()->displayModeChanged(m_displayMode); // 更新应用区域大小和任务栏图标大小 if (watched == m_appAreaSonWidget) { @@ -980,11 +991,11 @@ void MainPanelControl::updateModeChange() m_traySpliter->setVisible(m_displayMode == DisplayMode::Efficient); m_pluginAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); m_toolAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion); + m_toolSonAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion); onRecentVisibleChanged(m_recentHelper->recentIsVisible()); onDockAppVisibleChanged(m_recentHelper->dockAppIsVisible()); onToolVisibleChanged(m_toolHelper->toolIsVisible()); - if (m_tray) - m_tray->setVisible(m_displayMode == DisplayMode::Efficient); + m_tray->setVisible(m_displayMode == DisplayMode::Efficient); } /**把驻留应用和被打开的应用所在窗口移动到指定位置 @@ -1224,9 +1235,10 @@ void MainPanelControl::resizeDockIcon() } else { int totalLength = ((m_position == Position::Top) || (m_position == Position::Bottom)) ? width() : height(); // 减去托盘间隔区域 - if (m_tray) { + /*if (m_tray) { totalLength -= (m_tray->trayVisibleItemCount() + 1) * 10; - } + }*/ + totalLength -= m_tray->width(); // 减去3个分割线的宽度 totalLength -= 3 * SPLITER_SIZE; // 减去显示桌面图标宽度 @@ -1265,9 +1277,9 @@ void MainPanelControl::resizeDockIcon() return; // 参与计算的插件的个数包含托盘和插件 - int pluginCount = m_tray ? m_tray->trayVisibleItemCount() + calcPluginItemCount : calcPluginItemCount; +// int pluginCount = m_tray ? m_tray->trayVisibleItemCount() + calcPluginItemCount : calcPluginItemCount; // 需要计算的图标总数 - int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + pluginCount; + int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count()/* + pluginCount*/; if (iconCount <= 0) return; @@ -1290,8 +1302,8 @@ void MainPanelControl::resizeDockIcon() tray_item_size = 20; // 减去插件图标的大小后重新计算固定图标和应用图标的平均大小 - totalLength -= tray_item_size * pluginCount; - iconCount -= pluginCount; + totalLength -= m_tray->width();//tray_item_size * pluginCount; + //iconCount -= pluginCount; // 余数 yu = (totalLength % iconCount); @@ -1408,8 +1420,8 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) } } - if (m_tray) - m_tray->centralWidget()->setProperty("iconSize", traySize); + /*if (m_tray) + m_tray->centralWidget()->setProperty("iconSize", traySize);*/ // 因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局 // 因此需要通过多一层布局来获取各插件 @@ -1502,6 +1514,15 @@ void MainPanelControl::onToolVisibleChanged(bool visible) m_recentSpliter->setVisible(visible); } +void MainPanelControl::onTrayRequestUpdate() +{ + m_tray->layoutWidget(); + if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) + m_tray->setFixedHeight(m_tray->suitableSize().height()); + else + m_tray->setFixedWidth(m_tray->suitableSize().width()); +} + /**时尚模式没有‘显示桌面’区域 * @brief MainPanelControl::resizeDesktopWidget */ diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index cf4c7cc20..34d1c9cf5 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -31,7 +31,7 @@ using namespace Dock; class QBoxLayout; class QLabel; -class TrayPluginItem; +class DockTrayWindow; class PluginsItem; class DockItem; class PlaceholderItem; @@ -77,7 +77,7 @@ private: void addFixedAreaItem(int index, QWidget *wdg); void removeFixedAreaItem(QWidget *wdg); void removeAppAreaItem(QWidget *wdg); - void addTrayAreaItem(int index, QWidget *wdg); + //void addTrayAreaItem(int index, QWidget *wdg); void removeTrayAreaItem(QWidget *wdg); int getScreenSize() const; @@ -97,6 +97,7 @@ private Q_SLOTS: void onRecentVisibleChanged(bool visible); void onDockAppVisibleChanged(bool visible); void onToolVisibleChanged(bool visible); + void onTrayRequestUpdate(); protected: void dragMoveEvent(QDragMoveEvent *e) override; @@ -142,7 +143,7 @@ private: AppDragWidget *m_appDragWidget; DisplayMode m_displayMode; QPoint m_mousePressPos; - TrayPluginItem *m_tray; + DockTrayWindow *m_tray; int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置 DockInter *m_dockInter; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 40604d604..66e9af47a 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -70,13 +70,13 @@ void QuickPluginWindow::initUi() m_mainLayout->setDirection(QBoxLayout::RightToLeft); m_mainLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0); m_mainLayout->setSpacing(ITEMSPACE); - const QList &items = QuickSettingController::instance()->settingItems(); - for (QuickSettingItem *settingItem : items) { - const QString pluginName = settingItem->pluginItem()->pluginName(); + QList items = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick); + for (PluginsItemInterface *pluginItem : items) { + const QString pluginName = pluginItem->pluginName(); if (!fixedPluginNames.contains(pluginName)) continue; - addPlugin(settingItem); + addPlugin(pluginItem); } } @@ -137,8 +137,11 @@ QSize QuickPluginWindow::suitableSize() const return suitableSize(m_position); } -void QuickPluginWindow::addPlugin(QuickSettingItem *item) +void QuickPluginWindow::addPlugin(PluginsItemInterface *pluginItem) { + if (!isQuickPlugin(pluginItem)) + return; + for (int i = 0; i < m_mainLayout->count(); i++) { QLayoutItem *layoutItem = m_mainLayout->itemAt(i); if (!layoutItem) @@ -148,14 +151,14 @@ void QuickPluginWindow::addPlugin(QuickSettingItem *item) if (!dockItem) continue; - if (item->pluginItem() == dockItem->pluginItem()) { + if (pluginItem == dockItem->pluginItem()) { resetPluginDisplay(); return; } } - if (fixedPluginNames.contains(item->pluginItem()->pluginName())) { + if (fixedPluginNames.contains(pluginItem->pluginName())) { // 新插入的插件如果是固定插件,则将其插入到固定插件列表中,并对其进行排序 - m_fixedSettingItems << item->pluginItem(); + m_fixedSettingItems << pluginItem; qSort(m_fixedSettingItems.begin(), m_fixedSettingItems.end(), [](PluginsItemInterface *item1, PluginsItemInterface *item2) { int index1 = fixedPluginNames.indexOf(item1->pluginName()); int index2 = fixedPluginNames.indexOf(item2->pluginName()); @@ -163,7 +166,7 @@ void QuickPluginWindow::addPlugin(QuickSettingItem *item) }); } else { // 如果是非固定插件,则直接插入到末尾 - m_activeSettingItems << item->pluginItem(); + m_activeSettingItems << pluginItem; } resetPluginDisplay(); Q_EMIT itemCountChanged(); @@ -319,6 +322,15 @@ QuickDockItem *QuickPluginWindow::getDockItemByPlugin(PluginsItemInterface *item return nullptr; } +bool QuickPluginWindow::isQuickPlugin(PluginsItemInterface *pluginItem) +{ + QJsonObject metaData = QuickSettingController::instance()->metaData(pluginItem); + if (metaData.contains("tool")) + return !metaData.value("tool").toBool(); + + return true; +} + int QuickPluginWindow::getDropIndex(QPoint point) { QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(point, m_activeSettingItems)); @@ -435,6 +447,7 @@ void QuickPluginWindow::resetPluginDisplay() } // 将列表中所有的控件按照顺序添加到布局上 auto addWidget = [ = ](const QList &items) { + QuickSettingController *quickController = QuickSettingController::instance(); for (PluginsItemInterface *item : items) { QuickDockItem *itemWidget = nullptr; if (pluginItems.contains(item)) { @@ -445,7 +458,7 @@ void QuickPluginWindow::resetPluginDisplay() if (pluginLoader) metaData = pluginLoader->metaData().value("MetaData").toObject(); - itemWidget = new QuickDockItem(item, metaData, this); + itemWidget = new QuickDockItem(item, metaData, quickController->itemKey(item), this); itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); } connect(itemWidget, &QuickDockItem::clicked, this, &QuickPluginWindow::onFixedClick); @@ -460,16 +473,19 @@ void QuickPluginWindow::resetPluginDisplay() void QuickPluginWindow::initConnection() { - connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ](QuickSettingItem * settingItem) { - const QString pluginName = settingItem->pluginItem()->pluginName(); + connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { + if (pluginClass != QuickSettingController::PluginAttribute::Quick) + return; + + const QString pluginName = itemInter->pluginName(); if (!fixedPluginNames.contains(pluginName)) return; - addPlugin(settingItem); + addPlugin(itemInter); }); - connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ this ] (QuickSettingItem *settingItem){ - removePlugin(settingItem->pluginItem()); + connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ this ] (PluginsItemInterface *itemInter){ + removePlugin(itemInter); }); connect(QuickSettingController::instance(), &QuickSettingController::pluginUpdated, this, &QuickPluginWindow::onUpdatePlugin); @@ -480,10 +496,11 @@ void QuickPluginWindow::initConnection() * @param pluginItem * @param parent */ -QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, QWidget *parent) +QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent) : QWidget(parent) , m_pluginItem(pluginItem) , m_metaData(metaData) + , m_itemKey(itemKey) { } @@ -509,8 +526,7 @@ void QuickDockItem::paintEvent(QPaintEvent *event) if (!m_pluginItem) return QWidget::paintEvent(event); - int pixmapSize = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); - QPixmap pixmap = m_pluginItem->icon(DockPart::QuickPanel).pixmap(pixmapSize, pixmapSize); + QPixmap pixmap = iconPixmap(); QRect pixmapRect = QRect((rect().width() - ICONHEIGHT) / 2, (rect().height() - ICONHEIGHT) / 2, ICONHEIGHT, ICONHEIGHT); @@ -523,3 +539,19 @@ void QuickDockItem::mouseReleaseEvent(QMouseEvent *event) Q_EMIT clicked(); QWidget::mouseReleaseEvent(event); } + +QPixmap QuickDockItem::iconPixmap() const +{ + int pixmapSize = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); + QIcon icon = m_pluginItem->icon(DockPart::QuickShow); + if (!icon.isNull()) + return icon.pixmap(pixmapSize, pixmapSize); + + QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); + if (itemWidget) { + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + return itemWidget->grab(); + } + + return QPixmap(); +} diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index a873e0882..44da684b4 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -62,7 +62,7 @@ protected: void mousePressEvent(QMouseEvent *event) override; private Q_SLOTS: - void addPlugin(QuickSettingItem *item); + void addPlugin(PluginsItemInterface *pluginItem); void removePlugin(PluginsItemInterface *item); void onPluginDropItem(QDropEvent *event); void onPluginDragMove(QDragMoveEvent *event); @@ -79,6 +79,7 @@ private: void resetPluginDisplay(); QPoint popupPoint() const; QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); + bool isQuickPlugin(PluginsItemInterface *pluginItem); private: QBoxLayout *m_mainLayout; @@ -93,7 +94,7 @@ class QuickDockItem : public QWidget Q_OBJECT public: - explicit QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, QWidget *parent = nullptr); + explicit QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent = nullptr); ~QuickDockItem(); PluginsItemInterface *pluginItem(); @@ -106,9 +107,12 @@ protected: void paintEvent(QPaintEvent *event); void mouseReleaseEvent(QMouseEvent *event); + QPixmap iconPixmap() const; + private: PluginsItemInterface *m_pluginItem; QJsonObject m_metaData; + QString m_itemKey; }; #endif // QUICKPLUGINWINDOW_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 82205c1bd..2d7e36fed 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -144,12 +144,14 @@ void QuickSettingContainer::setPosition(Position position) } } -void QuickSettingContainer::initQuickItem(QuickSettingItem *quickItem) +void QuickSettingContainer::initQuickItem(PluginsItemInterface *plugin) { + QuickSettingItem *quickItem = new QuickSettingItem(plugin, m_pluginLoader->itemKey(plugin), m_pluginLoader->metaData(plugin)); quickItem->setParent(m_pluginWidget); quickItem->setMouseTracking(true); quickItem->installEventFilter(this); connect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); + m_quickSettings << quickItem; } void QuickSettingContainer::onItemDetailClick(PluginsItemInterface *pluginInter) @@ -181,19 +183,31 @@ void QuickSettingContainer::showWidget(QWidget *widget, const QString &title) m_switchLayout->setCurrentWidget(m_childPage); } -void QuickSettingContainer::onPluginInsert(QuickSettingItem *quickItem) +void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter) { - initQuickItem(quickItem); + initQuickItem(itemInter); updateItemLayout(); onResizeView(); } -void QuickSettingContainer::onPluginRemove(QuickSettingItem *quickItem) +void QuickSettingContainer::onPluginRemove(PluginsItemInterface * itemInter) { + QuickSettingItem *quickItem = nullptr; + for (QuickSettingItem *settingItem : m_quickSettings) { + if (settingItem->pluginItem() != itemInter) + continue; + + quickItem = settingItem; + break; + } + if (!quickItem) + return; + disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); quickItem->setParent(nullptr); quickItem->removeEventFilter(this); quickItem->setMouseTracking(false); + quickItem->deleteLater(); //调整子控件的位置 updateItemLayout(); @@ -258,8 +272,7 @@ void QuickSettingContainer::updateItemLayout() int row = 0; int column = 0; - QList quickSettings = m_pluginLoader->settingItems(); - for (QuickSettingItem *item : quickSettings) { + for (QuickSettingItem *item : m_quickSettings) { int usedColumn = item->isPrimary() ? 2 : 1; m_pluginLayout->addWidget(item, row, column, 1, usedColumn); column += usedColumn; @@ -309,9 +322,9 @@ void QuickSettingContainer::initUi() m_mainlayout->addWidget(m_componentWidget); // 加载所有的插件 - QList pluginItems = m_pluginLoader->settingItems(); - for (QuickSettingItem *quickItem: pluginItems) - initQuickItem(quickItem); + QList plugins = m_pluginLoader->pluginItems(QuickSettingController::PluginAttribute::Quick); + for (PluginsItemInterface *plugin : plugins) + initQuickItem(plugin); m_switchLayout->addWidget(m_mainWidget); m_switchLayout->addWidget(m_childPage); @@ -322,7 +335,7 @@ void QuickSettingContainer::initUi() setAcceptDrops(true); QMetaObject::invokeMethod(this, [ = ] { - if (pluginItems.size() > 0) + if (plugins.size() > 0) updateItemLayout(); // 设置当前窗口的大小 onResizeView(); @@ -334,7 +347,12 @@ void QuickSettingContainer::initUi() void QuickSettingContainer::initConnection() { - connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, &QuickSettingContainer::onPluginInsert); + connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { + if (pluginClass != QuickSettingController::PluginAttribute::Quick) + return; + + onPluginInsert(itemInter); + }); connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); connect(m_volumnWidget, &VolumeWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); @@ -363,9 +381,8 @@ void QuickSettingContainer::initConnection() void QuickSettingContainer::onResizeView() { if (m_switchLayout->currentWidget() == m_mainWidget) { - QList pluginItems = m_pluginLoader->settingItems(); int selfPluginCount = 0; - for (QuickSettingItem *item : pluginItems) { + for (QuickSettingItem *item : m_quickSettings) { // 如果是置顶的插件,则认为它占用两个普通插件的位置 int increCount = (item->isPrimary() ? 2 : 1); selfPluginCount += increCount; diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 91e077351..fec0ab53c 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -66,8 +66,8 @@ protected: void showHomePage(); private Q_SLOTS: - void onPluginInsert(QuickSettingItem *quickItem); - void onPluginRemove(QuickSettingItem *quickItem); + void onPluginInsert(PluginsItemInterface * itemInter); + void onPluginRemove(PluginsItemInterface * itemInter); void onItemDetailClick(PluginsItemInterface *pluginInter); bool eventFilter(QObject *watched, QEvent *event) override; void onResizeView(); @@ -80,7 +80,7 @@ private: // 调整控件位置 void updateItemLayout(); // 初始化控件项目 - void initQuickItem(QuickSettingItem *quickItem); + void initQuickItem(PluginsItemInterface *plugin); // 显示具体的窗体 void showWidget(QWidget *widget, const QString &title); // 清除移动轨迹 @@ -106,6 +106,7 @@ private: DisplaySettingWidget *m_displaySettingWidget; PluginChildPage *m_childPage; QPoint m_dragPluginPosition; + QList m_quickSettings; }; class QuickPluginMimeData : public QMimeData diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index d725d0ea7..6f67873b0 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -21,7 +21,7 @@ #include "systempluginwindow.h" #include "systemplugincontroller.h" #include "systempluginitem.h" -#include "fixedplugincontroller.h" +#include "quicksettingcontroller.h" #include #include @@ -35,21 +35,33 @@ SystemPluginWindow::SystemPluginWindow(QWidget *parent) : QWidget(parent) - , m_pluginController(new FixedPluginController(this)) , m_listView(new DListView(this)) + , m_displayMode(Dock::DisplayMode::Efficient) , m_position(Dock::Position::Bottom) , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) { initUi(); - connect(m_pluginController, &FixedPluginController::pluginItemInserted, this, &SystemPluginWindow::onPluginItemAdded); - connect(m_pluginController, &FixedPluginController::pluginItemRemoved, this, &SystemPluginWindow::onPluginItemRemoved); - connect(m_pluginController, &FixedPluginController::pluginItemUpdated, this, &SystemPluginWindow::onPluginItemUpdated); + initConnection(); } SystemPluginWindow::~SystemPluginWindow() { } +void SystemPluginWindow::setDisplayMode(const DisplayMode &displayMode) +{ + m_displayMode = displayMode; + + QObjectList childObjects = children(); + for (QObject *childObject : childObjects) { + StretchPluginsItem *item = qobject_cast(childObject); + if (!item) + continue; + + item->setDisplayMode(displayMode); + } +} + void SystemPluginWindow::setPositon(Position position) { if (m_position == position) @@ -111,46 +123,66 @@ void SystemPluginWindow::initUi() m_mainLayout->setSpacing(0); } -bool SystemPluginWindow::pluginExist(StretchPluginsItem *pluginItem) +void SystemPluginWindow::initConnection() +{ + QuickSettingController *quickController = QuickSettingController::instance(); + connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { + if (pluginClass != QuickSettingController::PluginAttribute::Fixed) + return; + + pluginAdded(itemInter); + }); + + connect(quickController, &QuickSettingController::pluginRemoved, this, &SystemPluginWindow::onPluginItemRemoved); + connect(quickController, &QuickSettingController::pluginUpdated, this, &SystemPluginWindow::onPluginItemUpdated); + + QList plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Fixed); + for (int i = 0; i < plugins.size(); i++) + pluginAdded(plugins[i]); +} + +StretchPluginsItem *SystemPluginWindow::findPluginItemWidget(PluginsItemInterface *pluginItem) { for (int i = 0; i < m_mainLayout->count(); i++) { QLayoutItem *layoutItem = m_mainLayout->itemAt(i); if (!layoutItem) continue; - if (layoutItem->widget() == pluginItem) - return true; + StretchPluginsItem *itemWidget = qobject_cast(layoutItem->widget()); + if (itemWidget && itemWidget->pluginInter() == pluginItem) + return itemWidget; } - return false; + return nullptr; } -void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem) +void SystemPluginWindow::pluginAdded(PluginsItemInterface *plugin) { - if (pluginExist(pluginItem)) - return; - - pluginItem->setPosition(m_position); - pluginItem->setParent(this); - pluginItem->show(); - m_mainLayout->addWidget(pluginItem); + StretchPluginsItem *item = new StretchPluginsItem(plugin, QuickSettingController::instance()->itemKey(plugin)); + item->setDisplayMode(m_displayMode); + item->setPosition(m_position); + item->setParent(this); + item->show(); + m_mainLayout->addWidget(item); Q_EMIT itemChanged(); } -void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem) +void SystemPluginWindow::onPluginItemRemoved(PluginsItemInterface *pluginItem) { - if (!pluginExist(pluginItem)) - return; - - pluginItem->setParent(nullptr); - pluginItem->hide(); - m_mainLayout->removeWidget(pluginItem); - Q_EMIT itemChanged(); + StretchPluginsItem *item = findPluginItemWidget(pluginItem); + if (item) { + item->setParent(nullptr); + item->hide(); + m_mainLayout->removeWidget(item); + Q_EMIT itemChanged(); + } } -void SystemPluginWindow::onPluginItemUpdated(StretchPluginsItem *pluginItem) +void SystemPluginWindow::onPluginItemUpdated(PluginsItemInterface *pluginItem) { - pluginItem->update(); + StretchPluginsItem *item = findPluginItemWidget(pluginItem); + if (item) + item->update(); } #define ICONSIZE 20 @@ -161,6 +193,7 @@ StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter, : DockItem(parent) , m_pluginInter(pluginInter) , m_itemKey(itemKey) + , m_displayMode(Dock::DisplayMode::Efficient) , m_position(Dock::Position::Bottom) { } @@ -169,6 +202,11 @@ StretchPluginsItem::~StretchPluginsItem() { } +void StretchPluginsItem::setDisplayMode(const DisplayMode &displayMode) +{ + m_displayMode = displayMode; +} + void StretchPluginsItem::setPosition(Position position) { m_position = position; @@ -260,6 +298,9 @@ QFont StretchPluginsItem::textFont(const Position &position) const bool StretchPluginsItem::needShowText() const { + // 如果是高效模式,则不需要显示下面的文本 + if (m_displayMode == Dock::DisplayMode::Efficient) + return false; // 任务栏在上方或者下方显示的时候,根据设计图,只有在当前区域高度大于50的时候才同时显示文本和图标 if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) return height() >= 50; diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 0e92f0864..67af5bddc 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -26,7 +26,6 @@ #include -class FixedPluginController; class StretchPluginsItem; class QBoxLayout; class PluginsItemInterface; @@ -42,6 +41,7 @@ class SystemPluginWindow : public QWidget public: explicit SystemPluginWindow(QWidget *parent = nullptr); ~SystemPluginWindow() override; + void setDisplayMode(const Dock::DisplayMode &displayMode); void setPositon(Dock::Position position); QSize suitableSize() const; QSize suitableSize(const Dock::Position &position) const; @@ -51,16 +51,17 @@ Q_SIGNALS: private: void initUi(); - bool pluginExist(StretchPluginsItem *pluginItem); + void initConnection(); + StretchPluginsItem *findPluginItemWidget(PluginsItemInterface *pluginItem); + void pluginAdded(PluginsItemInterface *plugin); private Q_SLOTS: - void onPluginItemAdded(StretchPluginsItem *pluginItem); - void onPluginItemRemoved(StretchPluginsItem *pluginItem); - void onPluginItemUpdated(StretchPluginsItem *pluginItem); + void onPluginItemRemoved(PluginsItemInterface *pluginItem); + void onPluginItemUpdated(PluginsItemInterface *pluginItem); private: - FixedPluginController *m_pluginController; DListView *m_listView; + Dock::DisplayMode m_displayMode; Dock::Position m_position; QBoxLayout *m_mainLayout; }; @@ -72,6 +73,7 @@ class StretchPluginsItem : public DockItem public: StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); ~StretchPluginsItem() override; + void setDisplayMode(const Dock::DisplayMode &displayMode); void setPosition(Dock::Position position); PluginsItemInterface *pluginInter() const; QString itemKey() const; @@ -97,6 +99,7 @@ private: private: PluginsItemInterface *m_pluginInter; QString m_itemKey; + Dock::DisplayMode m_displayMode; Dock::Position m_position; QPoint m_mousePressPoint; }; diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 0c858a142..2c5b89fb8 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -39,18 +39,11 @@ ExpandIconWidget::ExpandIconWidget(QWidget *parent, Qt::WindowFlags f) : BaseTrayWidget(parent, f) , m_regionInter(new DRegionMonitor(this)) , m_position(Dock::Position::Bottom) - , m_gridParentView(new RoundWidget(nullptr)) - , m_trayView(new TrayGridView(m_gridParentView)) - , m_trayDelegate(new TrayDelegate(m_trayView, m_trayView)) - , m_trayModel(new TrayModel(m_trayView, true, false)) { - initUi(); - initConnection(); } ExpandIconWidget::~ExpandIconWidget() { - m_gridParentView->deleteLater(); } void ExpandIconWidget::setPositonValue(Dock::Position position) @@ -69,17 +62,19 @@ void ExpandIconWidget::sendClick(uint8_t mouseButton, int x, int y) if (mouseButton != XCB_BUTTON_INDEX_1) return; - setTrayPanelVisible(!m_gridParentView->isVisible()); + QWidget *gridParentView = popupTrayView(); + setTrayPanelVisible(!gridParentView->isVisible()); } void ExpandIconWidget::setTrayPanelVisible(bool visible) { + QWidget *gridParentView = popupTrayView(); if (visible) { resetPosition(); - m_gridParentView->show(); + gridParentView->show(); m_regionInter->registerRegion(); } else { - m_gridParentView->hide(); + gridParentView->hide(); m_regionInter->unregisterRegion(); } } @@ -89,8 +84,11 @@ QPixmap ExpandIconWidget::icon() return QPixmap(dropIconFile()); } -void ExpandIconWidget::paintEvent(QPaintEvent *) +void ExpandIconWidget::paintEvent(QPaintEvent *event) { + if (popupTrayView()->trayView()->model()->rowCount() == 0) + return BaseTrayWidget::paintEvent(event); + QPainter painter(this); QPixmap pixmap = ImageUtil::loadSvg(dropIconFile(), QSize(ICON_SIZE, ICON_SIZE)); QRect rectOfPixmap(rect().x() + (rect().width() - ICON_SIZE) / 2, @@ -129,9 +127,72 @@ const QString ExpandIconWidget::dropIconFile() const return iconFile + ".svg"; } -QWidget *ExpandIconWidget::popupTrayView() +TrayGridWidget *ExpandIconWidget::popupTrayView() { - return m_gridParentView; + static TrayGridWidget *gridParentView = nullptr; + if (gridParentView) + return gridParentView; + + gridParentView = new TrayGridWidget(nullptr); + TrayGridView *trayView = new TrayGridView(gridParentView); + TrayDelegate *trayDelegate = new TrayDelegate(trayView, trayView); + TrayModel *trayModel = new TrayModel(trayView, true, false); + gridParentView->setTrayGridView(trayView); + + gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); + trayView->setModel(trayModel); + trayView->setItemDelegate(trayDelegate); + trayView->setSpacing(ITEM_SPACING); + trayView->setDragDistance(2); + + QVBoxLayout *layout = new QVBoxLayout(gridParentView); + layout->setContentsMargins(ITEM_SPACING, ITEM_SPACING, ITEM_SPACING, ITEM_SPACING); + layout->setSpacing(0); + layout->addWidget(trayView); + + auto rowCountChanged = [ = ] { + int count = trayModel->rowCount(); + trayView->setFixedSize(trayView->suitableSize()); + gridParentView->setFixedSize(trayView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2)); + if (count > 0) + resetPosition(); + else if (gridParentView->isVisible()) + gridParentView->hide(); + + Q_EMIT trayVisbleChanged(count > 0); + }; + + connect(trayView, &TrayGridView::rowCountChanged, this, rowCountChanged); + + connect(trayDelegate, &TrayDelegate::removeRow, this, [ = ](const QModelIndex &index) { + trayView->model()->removeRow(index.row(),index.parent()); + }); + connect(trayView, &TrayGridView::requestRemove, trayModel, &TrayModel::removeRow); + connect(m_regionInter, &DRegionMonitor::buttonPress, this, [ = ](const QPoint &mousePos, const int flag) { + // 如果当前是隐藏,那么在点击任何地方都隐藏 + if (!isVisible()) { + gridParentView->hide(); + return; + } + + if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) + return; + + QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); + const QRect rect = QRect(ptPos, size()); + if (rect.contains(mousePos)) + return; + + const QRect rctView(gridParentView->pos(), gridParentView->size()); + if (rctView.contains(mousePos)) + return; + + gridParentView->hide(); + }); + + QMetaObject::invokeMethod(this, rowCountChanged, Qt::QueuedConnection); + + return gridParentView; } void ExpandIconWidget::resetPosition() @@ -139,91 +200,29 @@ void ExpandIconWidget::resetPosition() if (!parentWidget()) return; + QWidget *gridParentView = popupTrayView(); QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); switch (m_position) { case Dock::Position::Bottom: { - ptPos.setY(ptPos.y() - m_gridParentView->height()); - ptPos.setX(ptPos.x() - m_gridParentView->width()); + ptPos.setY(ptPos.y() - gridParentView->height()); + ptPos.setX(ptPos.x() - gridParentView->width()); break; } case Dock::Position::Top: { - ptPos.setY(ptPos.y() + m_gridParentView->height()); - ptPos.setX(ptPos.x() - m_gridParentView->width()); + ptPos.setY(ptPos.y() + gridParentView->height()); + ptPos.setX(ptPos.x() - gridParentView->width()); break; } case Dock::Position::Left: { - ptPos.setX(ptPos.x() + m_gridParentView->width() / 2); + ptPos.setX(ptPos.x() + gridParentView->width() / 2); break; } case Dock::Position::Right: { - ptPos.setX(ptPos.x() - m_gridParentView->width() / 2); + ptPos.setX(ptPos.x() - gridParentView->width() / 2); break; } } - m_gridParentView->move(ptPos); -} - -void ExpandIconWidget::initUi() -{ - m_gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); - m_trayView->setModel(m_trayModel); - m_trayView->setItemDelegate(m_trayDelegate); - m_trayView->setSpacing(ITEM_SPACING); - m_trayView->setDragDistance(2); - - QVBoxLayout *layout = new QVBoxLayout(m_gridParentView); - layout->setContentsMargins(ITEM_SPACING, ITEM_SPACING, ITEM_SPACING, ITEM_SPACING); - layout->setSpacing(0); - layout->addWidget(m_trayView); -} - -void ExpandIconWidget::initConnection() -{ - connect(m_trayView, &TrayGridView::rowCountChanged, this, &ExpandIconWidget::onRowCountChanged); - - connect(m_trayDelegate, &TrayDelegate::removeRow, this, [ = ](const QModelIndex &index) { - m_trayView->model()->removeRow(index.row(),index.parent()); - }); - connect(m_trayView, &TrayGridView::requestRemove, m_trayModel, &TrayModel::removeRow); - connect(m_regionInter, &DRegionMonitor::buttonPress, this, &ExpandIconWidget::onGlobMousePress); - - QMetaObject::invokeMethod(this, &ExpandIconWidget::onRowCountChanged, Qt::QueuedConnection); -} - -void ExpandIconWidget::onRowCountChanged() -{ - int count = m_trayModel->rowCount(); - m_trayView->setFixedSize(m_trayView->suitableSize()); - m_gridParentView->setFixedSize(m_trayView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2)); - if (count > 0) - resetPosition(); - else if (m_gridParentView->isVisible()) - m_gridParentView->hide(); - - Q_EMIT trayVisbleChanged(count > 0); -} - -void ExpandIconWidget::onGlobMousePress(const QPoint &mousePos, const int flag) -{ - // 如果当前是隐藏,那么在点击任何地方都隐藏 - if (!isVisible()) { - m_gridParentView->hide(); - return; - } - - if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) - return; - - QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); - const QRect rect = QRect(ptPos, size()); - if (rect.contains(mousePos)) - return; - - const QRect rctView(m_gridParentView->pos(), m_gridParentView->size()); - if (rctView.contains(mousePos)) - return; - - m_gridParentView->hide(); + gridParentView->move(ptPos); } /** @@ -231,14 +230,25 @@ void ExpandIconWidget::onGlobMousePress(const QPoint &mousePos, const int flag) * @param parent */ -RoundWidget::RoundWidget(QWidget *parent) +TrayGridWidget::TrayGridWidget(QWidget *parent) : QWidget (parent) , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) + , m_trayGridView(nullptr) { setAttribute(Qt::WA_TranslucentBackground); } -void RoundWidget::paintEvent(QPaintEvent *event) +void TrayGridWidget::setTrayGridView(TrayGridView *trayView) +{ + m_trayGridView = trayView; +} + +TrayGridView *TrayGridWidget::trayView() const +{ + return m_trayGridView; +} + +void TrayGridWidget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); @@ -252,7 +262,7 @@ void RoundWidget::paintEvent(QPaintEvent *event) painter.fillPath(path, maskColor()); } -QColor RoundWidget::maskColor() const +QColor TrayGridWidget::maskColor() const { QColor color = DGuiApplicationHelper::standardPalette(DGuiApplicationHelper::instance()->themeType()).window().color(); int maskAlpha(static_cast(255 * m_dockInter->opacity())); diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h index 3560dae1f..57747f01f 100644 --- a/frame/window/tray/widgets/expandiconwidget.h +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -28,6 +28,7 @@ class TrayGridView; class TrayModel; class TrayDelegate; +class TrayGridWidget; namespace Dtk { namespace Gui { class DRegionMonitor; } } @@ -45,41 +46,32 @@ public: QString itemKeyForConfig() override { return "Expand"; } void updateIcon() override {} QPixmap icon() override; - QWidget *popupTrayView(); + TrayGridWidget *popupTrayView(); Q_SIGNALS: void trayVisbleChanged(bool); -private Q_SLOTS: - void onGlobMousePress(const QPoint &mousePos, const int flag); - void onRowCountChanged(); - protected: - void paintEvent(QPaintEvent *) override; + void paintEvent(QPaintEvent *event) override; const QString dropIconFile() const; void resetPosition(); -private: - void initUi(); - void initConnection(); - private: Dtk::Gui::DRegionMonitor *m_regionInter; Dock::Position m_position; - QWidget *m_gridParentView; - TrayGridView *m_trayView; - TrayDelegate *m_trayDelegate; - TrayModel *m_trayModel; }; // 绘制圆角窗体 -class RoundWidget : public QWidget +class TrayGridWidget : public QWidget { Q_OBJECT public: - explicit RoundWidget(QWidget *parent); + explicit TrayGridWidget(QWidget *parent); + + void setTrayGridView(TrayGridView *trayView); + TrayGridView *trayView() const; protected: void paintEvent(QPaintEvent *event) override; @@ -89,6 +81,7 @@ private: private: DockInter *m_dockInter; + TrayGridView *m_trayGridView; }; #endif // EXPANDICONWIDGET_H diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index dbf0b6baf..285817621 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -55,7 +55,7 @@ TrayManagerWindow::TrayManagerWindow(QWidget *parent) , m_systemPluginWidget(new SystemPluginWindow(this)) , m_appPluginWidget(new QWidget(m_appPluginDatetimeWidget)) , m_quickIconWidget(new QuickPluginWindow(m_appPluginWidget)) - , m_dateTimeWidget(new DateTimeDisplayer(m_appPluginDatetimeWidget)) + , m_dateTimeWidget(new DateTimeDisplayer(false, m_appPluginDatetimeWidget)) , m_appPluginLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) , m_trayView(new TrayGridView(this)) @@ -217,6 +217,7 @@ void TrayManagerWindow::resizeEvent(QResizeEvent *event) void TrayManagerWindow::initUi() { + m_systemPluginWidget->setDisplayMode(Dock::DisplayMode::Fashion); m_trayView->setModel(m_model); m_trayView->setItemDelegate(m_delegate); m_trayView->setDragDistance(2); diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 3bcb30dc3..de79d7fd0 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,9 +1,9 @@ -add_subdirectory("datetime") +#add_subdirectory("datetime") #add_subdirectory("disk-mount") add_subdirectory("shutdown") add_subdirectory("power") -add_subdirectory("sound") -add_subdirectory("tray") +#add_subdirectory("sound") +#add_subdirectory("tray") add_subdirectory("trash") add_subdirectory("keyboard-layout") add_subdirectory("onboard") From ee248287d3b6cff23fba511a4e4cfaf0632e0e4a Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 28 Oct 2022 10:00:09 +0000 Subject: [PATCH 101/257] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8Dv20=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加适配器,适配v20插件为v23接口,保证能正常加载v20插件 Log: 增加对v20插件的正常适配 Influence: 加载v20插件 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: If0b3c83cc808f62c0b15554fe6d58f90dc376175 --- frame/CMakeLists.txt | 1 + frame/controller/proxyplugincontroller.cpp | 40 +-- frame/controller/proxyplugincontroller.h | 14 +- frame/controller/quicksettingcontroller.cpp | 8 +- frame/controller/quicksettingcontroller.h | 13 +- frame/controller/systemplugincontroller.cpp | 16 +- frame/controller/systemplugincontroller.h | 12 +- frame/pluginadapter/pluginadapter.cpp | 190 +++++++++++++ frame/pluginadapter/pluginadapter.h | 78 ++++++ .../pluginadapter/pluginsiteminterface_v20.h | 261 ++++++++++++++++++ frame/util/abstractpluginscontroller.cpp | 88 +++++- frame/util/abstractpluginscontroller.h | 44 ++- interfaces/pluginsiteminterface.h | 2 +- 13 files changed, 694 insertions(+), 73 deletions(-) create mode 100644 frame/pluginadapter/pluginadapter.cpp create mode 100644 frame/pluginadapter/pluginadapter.h create mode 100644 frame/pluginadapter/pluginsiteminterface_v20.h diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index b78048e9b..fc38f7f11 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -66,6 +66,7 @@ target_include_directories(${BIN_NAME} PUBLIC item item/components model + pluginadapter screenspliter util window diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index 66b4edaf6..6ee42f37f 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -154,51 +154,53 @@ QString ProxyPluginController::itemKey(PluginsItemInterface *itemInter) const return QString(); } -void ProxyPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +void ProxyPluginController::pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { - addPluginItems(itemInter, itemKey); + if (!addPluginItems(itemInter, itemKey)) + return; + // 获取需要加载当前插件的监听者,然后将当前插件添加到监听者 QList validController = getValidController(itemInter); for (AbstractPluginsController *interface : validController) - interface->itemAdded(itemInter, itemKey); + interface->pluginItemAdded(itemInter, itemKey); } -void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) +void ProxyPluginController::pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) { QList validController = getValidController(itemInter); for (AbstractPluginsController *interface : validController) - interface->itemUpdate(itemInter, itemKey); + interface->pluginItemUpdate(itemInter, itemKey); } -void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) +void ProxyPluginController::pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) { // 先获取可执行的controller,再移除,因为在判断当前插件是否加载的时候需要用到当前容器中的插件来获取当前代理 QList validController = getValidController(itemInter); for (AbstractPluginsController *interface : validController) - interface->itemRemoved(itemInter, itemKey); + interface->pluginItemRemoved(itemInter, itemKey); removePluginItem(itemInter); } -void ProxyPluginController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) +void ProxyPluginController::requestPluginWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) { QList validController = getValidController(itemInter); for (AbstractPluginsController *interface : validController) - interface->requestWindowAutoHide(itemInter, itemKey, autoHide); + interface->requestPluginWindowAutoHide(itemInter, itemKey, autoHide); } -void ProxyPluginController::requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) +void ProxyPluginController::requestRefreshPluginWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) { QList validController = getValidController(itemInter); for (AbstractPluginsController *interface : validController) - interface->requestRefreshWindowVisible(itemInter, itemKey); + interface->requestRefreshPluginWindowVisible(itemInter, itemKey); } -void ProxyPluginController::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) +void ProxyPluginController::requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) { QList validController = getValidController(itemInter); for (AbstractPluginsController *interface : validController) - interface->requestSetAppletVisible(itemInter, itemKey, visible); + interface->requestSetPluginAppletVisible(itemInter, itemKey, visible); } void ProxyPluginController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) @@ -231,13 +233,15 @@ QList ProxyPluginController::getValidController(Plu return validController; } -void ProxyPluginController::addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey) +bool ProxyPluginController::addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey) { - if (!m_pluginsItems.contains(itemInter)) - m_pluginsItems << itemInter; + // 如果该插件已经存在,则无需再次插入 + if (m_pluginsItems.contains(itemInter)) + return false; - if (!m_pluginsItemKeys.contains(itemInter)) - m_pluginsItemKeys[itemInter] = itemKey; + m_pluginsItems << itemInter; + m_pluginsItemKeys[itemInter] = itemKey; + return true; } void ProxyPluginController::removePluginItem(PluginsItemInterface * const itemInter) diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index e475be82a..906575466 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -52,13 +52,13 @@ protected: explicit ProxyPluginController(QObject *parent = nullptr); ~ProxyPluginController() override {} - void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; - void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; + void requestPluginWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; + void requestRefreshPluginWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; @@ -66,7 +66,7 @@ protected: private: QList getValidController(PluginsItemInterface *itemInter) const; - void addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey); + bool addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey); void removePluginItem(PluginsItemInterface * const itemInter); void startLoader(); diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index af78c1920..3ec03a21c 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -36,7 +36,7 @@ QuickSettingController::~QuickSettingController() ProxyPluginController::instance(PluginType::QuickPlugin)->removeProxyInterface(this); } -void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +void QuickSettingController::pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { // 根据读取到的metaData数据获取当前插件的类型,提供给外部 PluginAttribute pluginClass = PluginAttribute::Quick; @@ -56,11 +56,7 @@ void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, c emit pluginInserted(itemInter, pluginClass); } -void QuickSettingController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) -{ -} - -void QuickSettingController::itemRemoved(PluginsItemInterface * const itemInter, const QString &) +void QuickSettingController::pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &) { for (auto it = m_quickPlugins.begin(); it != m_quickPlugins.end(); it++) { QList &plugins = m_quickPlugins[it.key()]; diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index eb5398643..b0b815304 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -54,12 +54,13 @@ protected: ~QuickSettingController() override; protected: - void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemUpdate(PluginsItemInterface * const itemInter, const QString &) override; - void itemRemoved(PluginsItemInterface * const itemInter, const QString &) override; - void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} - void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} - void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &) override {} + void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &) override; + void requestPluginWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} + void requestRefreshPluginWindowVisible(PluginsItemInterface * const, const QString &) override {} + void requestSetPluginAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; private: diff --git a/frame/controller/systemplugincontroller.cpp b/frame/controller/systemplugincontroller.cpp index fc6ff25a5..3de250334 100644 --- a/frame/controller/systemplugincontroller.cpp +++ b/frame/controller/systemplugincontroller.cpp @@ -33,7 +33,7 @@ SystemPluginController::SystemPluginController(QObject *parent) setObjectName("SystemTray"); } -void SystemPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +void SystemPluginController::pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { QMap> &mPluginsMap = pluginsMap(); @@ -54,7 +54,7 @@ void SystemPluginController::itemAdded(PluginsItemInterface * const itemInter, c emit pluginItemAdded(itemKey, item); } -void SystemPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) +void SystemPluginController::pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) { SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); if (!item) @@ -65,7 +65,7 @@ void SystemPluginController::itemUpdate(PluginsItemInterface * const itemInter, emit pluginItemUpdated(itemKey, item); } -void SystemPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) +void SystemPluginController::pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) { SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); if (!item) @@ -85,7 +85,7 @@ void SystemPluginController::itemRemoved(PluginsItemInterface * const itemInter, item->deleteLater(); } -void SystemPluginController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) +void SystemPluginController::requestPluginWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) { SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); if (!item) @@ -94,7 +94,7 @@ void SystemPluginController::requestWindowAutoHide(PluginsItemInterface * const Q_EMIT item->requestWindowAutoHide(autoHide); } -void SystemPluginController::requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) +void SystemPluginController::requestRefreshPluginWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) { SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); if (!item) @@ -103,7 +103,7 @@ void SystemPluginController::requestRefreshWindowVisible(PluginsItemInterface * Q_EMIT item->requestRefershWindowVisible(); } -void SystemPluginController::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) +void SystemPluginController::requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) { SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); if (!item) @@ -146,7 +146,7 @@ const QVariant SystemPluginController::getValueSystemTrayItem(const QString &ite return QVariant(); } - return getValue(inter, key, fallback); + return getPluginValue(inter, key, fallback); } void SystemPluginController::saveValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant &value) @@ -157,7 +157,7 @@ void SystemPluginController::saveValueSystemTrayItem(const QString &itemKey, con return; } - saveValue(inter, key, value); + savePluginValue(inter, key, value); } void SystemPluginController::startLoader() diff --git a/frame/controller/systemplugincontroller.h b/frame/controller/systemplugincontroller.h index 2fc26d155..5fbc02292 100644 --- a/frame/controller/systemplugincontroller.h +++ b/frame/controller/systemplugincontroller.h @@ -42,12 +42,12 @@ public: explicit SystemPluginController(QObject *parent = nullptr); // implements PluginProxyInterface - void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; - void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; + void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestPluginWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; + void requestRefreshPluginWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; int systemTrayItemSortKey(const QString &itemKey); void setSystemTrayItemSortKey(const QString &itemKey, const int order); diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp new file mode 100644 index 000000000..59322f46f --- /dev/null +++ b/frame/pluginadapter/pluginadapter.cpp @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "pluginadapter.h" + +#include + +#define ICONWIDTH 24 +#define ICONHEIGHT 24 + +PluginAdapter::PluginAdapter(PluginsItemInterface_V20 *pluginInter) + : m_pluginInter(pluginInter) +{ +} + +PluginAdapter::~PluginAdapter() +{ + delete m_pluginInter; +} + +const QString PluginAdapter::pluginName() const +{ + return m_pluginInter->pluginName(); +} + +const QString PluginAdapter::pluginDisplayName() const +{ + return m_pluginInter->pluginDisplayName(); +} + +void PluginAdapter::init(PluginProxyInterface *proxyInter) +{ + m_pluginInter->init(proxyInter); +} + +QWidget *PluginAdapter::itemWidget(const QString &itemKey) +{ + return m_pluginInter->itemWidget(itemKey); +} + +QWidget *PluginAdapter::itemTipsWidget(const QString &itemKey) +{ + return m_pluginInter->itemTipsWidget(itemKey); +} + +QWidget *PluginAdapter::itemPopupApplet(const QString &itemKey) +{ + return m_pluginInter->itemPopupApplet(itemKey); +} + +const QString PluginAdapter::itemCommand(const QString &itemKey) +{ + return m_pluginInter->itemCommand(itemKey); +} + +const QString PluginAdapter::itemContextMenu(const QString &itemKey) +{ + return m_pluginInter->itemContextMenu(itemKey); +} + +void PluginAdapter::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) +{ + m_pluginInter->invokedMenuItem(itemKey, menuId, checked); +} + +int PluginAdapter::itemSortKey(const QString &itemKey) +{ + return m_pluginInter->itemSortKey(itemKey); +} + +void PluginAdapter::setSortKey(const QString &itemKey, const int order) +{ + m_pluginInter->setSortKey(itemKey, order); +} + +bool PluginAdapter::itemAllowContainer(const QString &itemKey) +{ + return m_pluginInter->itemAllowContainer(itemKey); +} + +bool PluginAdapter::itemIsInContainer(const QString &itemKey) +{ + return m_pluginInter->itemIsInContainer(itemKey); +} + +void PluginAdapter::setItemIsInContainer(const QString &itemKey, const bool container) +{ + m_pluginInter->setItemIsInContainer(itemKey, container); +} + +bool PluginAdapter::pluginIsAllowDisable() +{ + return m_pluginInter->pluginIsAllowDisable(); +} + +bool PluginAdapter::pluginIsDisable() +{ + return m_pluginInter->pluginIsDisable(); +} + +void PluginAdapter::pluginStateSwitched() +{ + m_pluginInter->pluginStateSwitched(); +} + +void PluginAdapter::displayModeChanged(const Dock::DisplayMode displayMode) +{ + m_pluginInter->displayModeChanged(displayMode); +} + +void PluginAdapter::positionChanged(const Dock::Position position) +{ + m_pluginInter->positionChanged(position); +} + +void PluginAdapter::refreshIcon(const QString &itemKey) +{ + m_pluginInter->refreshIcon(itemKey); +} + +void PluginAdapter::pluginSettingsChanged() +{ + m_pluginInter->pluginSettingsChanged(); +} + +PluginsItemInterface::PluginType PluginAdapter::type() +{ + switch (m_pluginInter->type()) { + case PluginsItemInterface_V20::PluginType::Fixed: + return PluginsItemInterface::PluginType::Fixed; + case PluginsItemInterface_V20::PluginType::Normal: + return PluginsItemInterface::PluginType::Normal; + } +} + +PluginsItemInterface::PluginSizePolicy PluginAdapter::pluginSizePolicy() const +{ + switch (m_pluginInter->pluginSizePolicy()) { + case PluginsItemInterface_V20::PluginSizePolicy::Custom: + return PluginsItemInterface::PluginSizePolicy::Custom; + case PluginsItemInterface_V20::PluginSizePolicy::System: + return PluginsItemInterface::PluginSizePolicy::System; + } +} + +QIcon PluginAdapter::icon(const DockPart &dockPart) +{ + if (dockPart == DockPart::QuickPanel) { + // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 + QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); + if (itemWidget) { + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + return itemWidget->grab(); + } + } + + return QIcon(); +} + +PluginsItemInterface::PluginStatus PluginAdapter::status() const +{ + return PluginStatus::Active; +} + +QString PluginAdapter::description() const +{ + return tr("actived"); +} + +void PluginAdapter::setItemKey(const QString &itemKey) +{ + m_itemKey = itemKey; +} diff --git a/frame/pluginadapter/pluginadapter.h b/frame/pluginadapter/pluginadapter.h new file mode 100644 index 000000000..a9afbfc91 --- /dev/null +++ b/frame/pluginadapter/pluginadapter.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef PLUGINADAPTER_H +#define PLUGINADAPTER_H + +#include "pluginsiteminterface.h" +#include "pluginsiteminterface_v20.h" + +#include + +/** 适配器,当加载到v20插件的时候,通过该接口来转成v23接口的插件 + * @brief The PluginAdapter class + */ + +class PluginAdapter : public QObject, public PluginsItemInterface +{ + Q_OBJECT + +public: + PluginAdapter(PluginsItemInterface_V20 *pluginInter); + ~PluginAdapter(); + + const QString pluginName() const override; + const QString pluginDisplayName() const override; + void init(PluginProxyInterface *proxyInter) override; + QWidget *itemWidget(const QString &itemKey) override; + + QWidget *itemTipsWidget(const QString &itemKey) override; + QWidget *itemPopupApplet(const QString &itemKey) override; + const QString itemCommand(const QString &itemKey) override; + const QString itemContextMenu(const QString &itemKey) override; + void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; + int itemSortKey(const QString &itemKey) override; + void setSortKey(const QString &itemKey, const int order) override; + bool itemAllowContainer(const QString &itemKey) override; + bool itemIsInContainer(const QString &itemKey) override; + void setItemIsInContainer(const QString &itemKey, const bool container) override; + + bool pluginIsAllowDisable() override; + bool pluginIsDisable() override; + void pluginStateSwitched() override; + void displayModeChanged(const Dock::DisplayMode displayMode) override; + void positionChanged(const Dock::Position position) override; + void refreshIcon(const QString &itemKey) override; + void pluginSettingsChanged() override; + PluginType type() override; + PluginSizePolicy pluginSizePolicy() const override; + + QIcon icon(const DockPart &dockPart) override; + PluginStatus status() const override; + QString description() const override; + + void setItemKey(const QString &itemKey); + +private: + PluginsItemInterface_V20 *m_pluginInter; + QString m_itemKey; +}; + +#endif // PLUGINADAPTER_H diff --git a/frame/pluginadapter/pluginsiteminterface_v20.h b/frame/pluginadapter/pluginsiteminterface_v20.h new file mode 100644 index 000000000..ba992fc22 --- /dev/null +++ b/frame/pluginadapter/pluginsiteminterface_v20.h @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef PLUGINSITEMINTERFACE_V20_H +#define PLUGINSITEMINTERFACE_V20_H + +#include "pluginproxyinterface.h" + +#include +#include + +/// +/// \brief The PluginsItemInterface_V20 class +/// the dock plugins item interface, all dock plugins should +/// inheirt this class and override all pure virtual function. +/// +class PluginsItemInterface_V20 +{ +public: + enum PluginType { + Normal, + Fixed + }; + + /** + * @brief Plugin size policy + */ + enum PluginSizePolicy { + System = 1 << 0, // Follow the system + Custom = 1 << 1 // The custom + }; + + /// + /// \brief ~PluginsItemInterface_V20 + /// DON'T try to delete m_proxyInter. + /// + virtual ~PluginsItemInterface_V20() {} + + /// + /// \brief pluginName + /// tell dock the unique plugin id + /// \return + /// + virtual const QString pluginName() const = 0; + virtual const QString pluginDisplayName() const { return QString(); } + + /// + /// \brief init + /// init your plugins, you need to save proxyInter to m_proxyInter + /// member variable. but you shouldn't free this pointer. + /// \param proxyInter + /// DON'T try to delete this pointer. + /// + virtual void init(PluginProxyInterface *proxyInter) = 0; + /// + /// \brief itemWidget + /// your plugin item widget, each item should have a unique key. + /// \param itemKey + /// your widget' unqiue key. + /// \return + /// + virtual QWidget *itemWidget(const QString &itemKey) = 0; + + /// + /// \brief itemTipsWidget + /// override this function if your item want to have a tips. + /// the tips will shown when user hover your item. + /// nullptr will be ignored. + /// \param itemKey + /// \return + /// + virtual QWidget *itemTipsWidget(const QString &itemKey) {Q_UNUSED(itemKey); return nullptr;} + /// + /// \brief itemPopupApplet + /// override this function if your item wants to have an popup applet. + /// the popup applet will shown when user click your item. + /// + /// Tips: + /// dock should receive mouse press/release event to check user mouse operate, + /// if your item filter mouse event, this function will not be called. + /// so if you override mouse event and want to use popup applet, you + /// should pass event to your parent use QWidget::someEvent(e); + /// \param itemKey + /// \return + /// + virtual QWidget *itemPopupApplet(const QString &itemKey) {Q_UNUSED(itemKey); return nullptr;} + /// + /// \brief itemCommand + /// execute spec command when user clicked your item. + /// ensure your command do not get user input. + /// + /// empty string will be ignored. + /// \param itemKey + /// \return + /// + virtual const QString itemCommand(const QString &itemKey) {Q_UNUSED(itemKey); return QString();} + + /// + /// \brief itemContextMenu + /// context menu is shown when RequestPopupMenu called. + /// \param itemKey + /// \return + /// + virtual const QString itemContextMenu(const QString &itemKey) {Q_UNUSED(itemKey); return QString();} + /// + /// \brief invokedMenuItem + /// call if context menu item is clicked + /// \param itemKey + /// \param itemId + /// menu item id + /// \param checked + /// + virtual void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) {Q_UNUSED(itemKey); Q_UNUSED(menuId); Q_UNUSED(checked);} + + /// + /// \brief itemSortKey + /// tell dock where your item wants to put on. + /// + /// this index is start from 1 and + /// 0 for left side + /// -1 for right side + /// \param itemKey + /// \return + /// + virtual int itemSortKey(const QString &itemKey) {Q_UNUSED(itemKey); return 1;} + /// + /// \brief setSortKey + /// save your item new position + /// sort key will be changed when plugins order + /// changed(by user drag-drop) + /// \param itemKey + /// \param order + /// + virtual void setSortKey(const QString &itemKey, const int order) {Q_UNUSED(itemKey); Q_UNUSED(order);} + + /// + /// \brief itemAllowContainer + /// tell dock is your item allow to move into container + /// + /// if your item placed into container, popup tips and popup + /// applet will be disabled. + /// \param itemKey + /// \return + /// + virtual bool itemAllowContainer(const QString &itemKey) {Q_UNUSED(itemKey); return false;} + /// + /// \brief itemIsInContainer + /// tell dock your item is in container, this function + /// called at item init and if your item enable container. + /// \param itemKey + /// \return + /// + virtual bool itemIsInContainer(const QString &itemKey) {Q_UNUSED(itemKey); return false;} + /// + /// \brief setItemIsInContainer + /// save your item new state. + /// this function called when user drag out your item from + /// container or user drop item into container(if your item + /// allow drop into container). + /// \param itemKey + /// \param container + /// + virtual void setItemIsInContainer(const QString &itemKey, const bool container) {Q_UNUSED(itemKey); Q_UNUSED(container);} + + virtual bool pluginIsAllowDisable() { return false; } + virtual bool pluginIsDisable() { return false; } + virtual void pluginStateSwitched() {} + + /// + /// \brief displayModeChanged + /// override this function to receive display mode changed signal + /// \param displayMode + /// + virtual void displayModeChanged(const Dock::DisplayMode displayMode) {Q_UNUSED(displayMode);} + /// + /// \brief positionChanged + /// override this function to receive dock position changed signal + /// \param position + /// + virtual void positionChanged(const Dock::Position position) {Q_UNUSED(position);} + + /// + /// \brief refreshIcon + /// refresh item icon, its triggered when system icon theme changed. + /// \param itemKey + /// item key + /// + virtual void refreshIcon(const QString &itemKey) { Q_UNUSED(itemKey); } + + /// + /// \brief displayMode + /// get current dock display mode + /// \return + /// + inline Dock::DisplayMode displayMode() const + { + return qApp->property(PROP_DISPLAY_MODE).value(); + } + + /// + /// \brief position + /// get current dock position + /// \return + /// + inline Dock::Position position() const + { + return qApp->property(PROP_POSITION).value(); + } + + /// + /// \brief settingsChanged + /// override this function to receive plugin settings changed signal(DeepinSync) + /// + virtual void pluginSettingsChanged() {} + + /// + /// \brief type + /// default plugin add dock right,fixed plugin add to dock fixed area + /// + virtual PluginType type() { return Normal; } + + /// + /// \brief plugin size policy + /// default plugin size policy + /// + virtual PluginSizePolicy pluginSizePolicy() const { return System; } + +protected: + /// + /// \brief m_proxyInter + /// NEVER delete this object. + /// + PluginProxyInterface *m_proxyInter = nullptr; +}; + +QT_BEGIN_NAMESPACE + +#define ModuleInterface_iid "com.deepin.dock.PluginsItemInterface" + +Q_DECLARE_INTERFACE(PluginsItemInterface_V20, ModuleInterface_iid) +QT_END_NAMESPACE + +#endif // PLUGINSITEMINTERFACE_H diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index a53d55a77..82e39a555 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -21,6 +21,8 @@ #include "abstractpluginscontroller.h" #include "pluginsiteminterface.h" +#include "pluginsiteminterface_v20.h" +#include "pluginadapter.h" #include "utils.h" #include @@ -62,6 +64,71 @@ AbstractPluginsController::~AbstractPluginsController() } void AbstractPluginsController::saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) +{ + savePluginValue(getPluginInterface(itemInter), key, value); +} + +const QVariant AbstractPluginsController::getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &fallback) +{ + return getPluginValue(getPluginInterface(itemInter), key, fallback); +} + +void AbstractPluginsController::removeValue(PluginsItemInterface *const itemInter, const QStringList &keyList) +{ + removePluginValue(getPluginInterface(itemInter), keyList); +} + +void AbstractPluginsController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + PluginsItemInterface *pluginItem = getPluginInterface(itemInter); + PluginAdapter *pluginAdapter = dynamic_cast(pluginItem); + if (pluginAdapter) + pluginAdapter->setItemKey(itemKey); + + pluginItemAdded(pluginItem, itemKey); +} + +void AbstractPluginsController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + pluginItemUpdate(getPluginInterface(itemInter), itemKey); +} + +void AbstractPluginsController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + pluginItemRemoved(getPluginInterface(itemInter), itemKey); +} + +void AbstractPluginsController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) +{ + requestPluginWindowAutoHide(getPluginInterface(itemInter), itemKey, autoHide); +} + +void AbstractPluginsController::requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + requestRefreshPluginWindowVisible(getPluginInterface(itemInter), itemKey); +} + +void AbstractPluginsController::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) +{ + requestSetPluginAppletVisible(getPluginInterface(itemInter), itemKey, visible); +} + +PluginsItemInterface *AbstractPluginsController::getPluginInterface(PluginsItemInterface * const itemInter) +{ + // 先从事先定义好的map中查找,如果没有找到,就是v23插件,直接返回当前插件的指针 + qulonglong pluginAddr = (qulonglong)itemInter; + if (m_pluginAdapterMap.contains(pluginAddr)) + return m_pluginAdapterMap[pluginAddr]; + + return itemInter; +} + +QMap> &AbstractPluginsController::pluginsMap() +{ + return m_pluginsMap; +} + +void AbstractPluginsController::savePluginValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &value) { // is it necessary? // refreshPluginSettings(); @@ -99,7 +166,7 @@ void AbstractPluginsController::saveValue(PluginsItemInterface *const itemInter, m_dockDaemonInter->MergePluginSettings(QJsonDocument(remoteObject).toJson(QJsonDocument::JsonFormat::Compact)); } -const QVariant AbstractPluginsController::getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &fallback) +const QVariant AbstractPluginsController::getPluginValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &fallback) { // load from local cache QVariant v = m_pluginSettingsObject.value(itemInter->pluginName()).toObject().value(key).toVariant(); @@ -110,7 +177,7 @@ const QVariant AbstractPluginsController::getValue(PluginsItemInterface *const i return v; } -void AbstractPluginsController::removeValue(PluginsItemInterface *const itemInter, const QStringList &keyList) +void AbstractPluginsController::removePluginValue(PluginsItemInterface * const itemInter, const QStringList &keyList) { if (keyList.isEmpty()) { m_pluginSettingsObject.remove(itemInter->pluginName()); @@ -125,11 +192,6 @@ void AbstractPluginsController::removeValue(PluginsItemInterface *const itemInte m_dockDaemonInter->RemovePluginSettings(itemInter->pluginName(), keyList); } -QMap> &AbstractPluginsController::pluginsMap() -{ - return m_pluginsMap; -} - QObject *AbstractPluginsController::pluginItemAt(PluginsItemInterface *const itemInter, const QString &itemKey) const { if (!m_pluginsMap.contains(itemInter)) @@ -213,6 +275,18 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) } PluginsItemInterface *interface = qobject_cast(pluginLoader->instance()); + if (!interface) { + // 如果识别当前插件失败,就认为这个插件是v20的插件,将其转换为v20插件接口 + PluginsItemInterface_V20 *interface_v20 = qobject_cast(pluginLoader->instance()); + if (interface_v20) { + // 将v20插件接口通过适配器转换成v23的接口,方便在后面识别 + PluginAdapter *pluginAdapter = new PluginAdapter(interface_v20); + // 将适配器的地址保存到map列表中,因为适配器自己会调用itemAdded方法,转换成PluginsItemInterface类,但是实际上它 + // 对应的是PluginAdapter类,因此,这个map用于在后面的itemAdded方法中用来查找 + m_pluginAdapterMap[(qulonglong)(interface_v20)] = pluginAdapter; + interface = pluginAdapter; + } + } if (!interface) { qDebug() << objectName() << "load plugin failed!!!" << pluginLoader->errorString() << pluginFile; diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index 6eebacbeb..b53d15815 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -32,6 +32,8 @@ #include class PluginsItemInterface; +class PluginAdapter; + class AbstractPluginsController : public QObject, PluginProxyInterface { Q_OBJECT @@ -40,26 +42,40 @@ public: explicit AbstractPluginsController(QObject *parent = Q_NULLPTR); ~ AbstractPluginsController() override; - // implements PluginProxyInterface - void saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) override; - const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override; - void removeValue(PluginsItemInterface * const itemInter, const QStringList &keyList) override; - - void itemAdded(PluginsItemInterface * const, const QString &) override {} - void itemUpdate(PluginsItemInterface * const, const QString &) override {} - void itemRemoved(PluginsItemInterface * const, const QString &) override {} - void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} - void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} - void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} - void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {} virtual bool needLoad(PluginsItemInterface *) { return true; } QMap> &pluginsMap(); -signals: + virtual void savePluginValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value); + virtual const QVariant getPluginValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()); + virtual void removePluginValue(PluginsItemInterface * const itemInter, const QStringList &keyList); + + virtual void pluginItemAdded(PluginsItemInterface * const, const QString &) = 0; + virtual void pluginItemUpdate(PluginsItemInterface * const, const QString &) = 0; + virtual void pluginItemRemoved(PluginsItemInterface * const, const QString &) = 0; + virtual void requestPluginWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) {} + virtual void requestRefreshPluginWindowVisible(PluginsItemInterface * const, const QString &) {} + virtual void requestSetPluginAppletVisible(PluginsItemInterface * const, const QString &, const bool) {} + +Q_SIGNALS: void pluginLoaderFinished(); +private: + // implements PluginProxyInterface + void saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) override; + const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override; + void removeValue(PluginsItemInterface * const itemInter, const QStringList &keyList) override; + + void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; + void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; + + PluginsItemInterface *getPluginInterface(PluginsItemInterface * const itemInter); + protected: QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; PluginsItemInterface *pluginInterAt(const QString &itemKey); @@ -76,7 +92,6 @@ private slots: void initPlugin(PluginsItemInterface *interface); void refreshPluginSettings(); - private: QDBusConnectionInterface *m_dbusDaemonInterface; DockInter *m_dockDaemonInter; @@ -88,6 +103,7 @@ private: QMap, bool> m_pluginLoadMap; QJsonObject m_pluginSettingsObject; + QMap m_pluginAdapterMap; }; #endif // ABSTRACTPLUGINSCONTROLLER_H diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 4720dd7f1..8474e1d0e 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -287,7 +287,7 @@ protected: QT_BEGIN_NAMESPACE -#define ModuleInterface_iid "com.deepin.dock.PluginsItemInterface" +#define ModuleInterface_iid "com.deepin.dock.PluginsItemInterface_2_0_0" Q_DECLARE_INTERFACE(PluginsItemInterface, ModuleInterface_iid) QT_END_NAMESPACE From b2633a5f50cf67852932bd2add114e2d7cadcf83 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 28 Oct 2022 11:03:51 +0000 Subject: [PATCH 102/257] =?UTF-8?q?fix:=20=E5=8A=A0=E8=BD=BD=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、systemTray目录下的插件由QuickItemController类来统一加载,托盘区域增加系统插件的展示 2、蓝牙、飞行模式等插件修改为普通插件,用于在快捷面板显示 Log: 托盘区显示系统托盘插件 Influence: 插入U盘,查看托盘区域是否有U盘图标 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I57e1321fcc59dfc7cfad1c21aca343203e3fad00 --- debian/dde-dock.install | 3 +- frame/controller/proxyplugincontroller.cpp | 13 +++-- frame/controller/quicksettingcontroller.cpp | 22 +++++--- frame/controller/quicksettingcontroller.h | 3 +- frame/pluginadapter/pluginadapter.cpp | 20 +++++--- frame/window/docktraywindow.cpp | 17 +++--- frame/window/tray/tray_delegate.cpp | 18 +++++-- frame/window/tray/tray_delegate.h | 1 + frame/window/tray/tray_gridview.cpp | 4 +- frame/window/tray/tray_model.cpp | 57 +++++++++++++++++++-- frame/window/tray/tray_model.h | 26 +++++++--- frame/window/traymanagerwindow.cpp | 2 +- interfaces/constants.h | 4 ++ plugins/airplane-mode/CMakeLists.txt | 4 +- plugins/keyboard-layout/CMakeLists.txt | 2 +- 15 files changed, 146 insertions(+), 50 deletions(-) diff --git a/debian/dde-dock.install b/debian/dde-dock.install index 977d6ab70..24a6e6da9 100644 --- a/debian/dde-dock.install +++ b/debian/dde-dock.install @@ -4,9 +4,8 @@ etc/dde-dock usr/lib/dde-dock/plugins/libshutdown.so usr/lib/dde-dock/plugins/libtrash.so usr/lib/dde-dock/plugins/liboverlay-warning.so -usr/lib/dde-dock/plugins/system-trays usr/lib/dde-dock/plugins/quick-trays usr/lib/dde-dock/plugins/libmultitasking.so usr/lib/dde-dock/plugins/libshow-desktop.so -usr/lib/dde-dock/plugins/system-trays/libkeyboard-layout.so +usr/lib/dde-dock/plugins/libkeyboard-layout.so usr/share/dsg/apps/dde-dock/configs/ diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index 6ee42f37f..70b0cead3 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -20,6 +20,7 @@ */ #include "proxyplugincontroller.h" #include "pluginsiteminterface.h" +#include "constants.h" #include @@ -41,13 +42,15 @@ static QMap getPluginPaths() { QStringList pluginPaths; #ifdef QT_DEBUG - pluginPaths << qApp->applicationDirPath() + "/../plugins/quick-trays" - << qApp->applicationDirPath() + "/../plugins"; + pluginPaths << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(QUICK_PATH) + << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(PLUGIN_PATH) + << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(TRAY_PATH); #else - pluginPaths << "/usr/lib/dde-dock/plugins/quick-trays" - << "/usr/lib/dde-dock/plugins"; + pluginPaths << QString("/usr/lib/dde-dock%1").arg(QUICK_PATH) + << QString("/usr/lib/dde-dock%1").arg(PLUGIN_PATH) + << QString("/usr/lib/dde-dock%1").arg(TRAY_PATH); - const QStringList pluginsDirs = (getPathFromConf("QUICK_TRAY_PATH") << getPathFromConf("PATH")); + const QStringList pluginsDirs = (getPathFromConf("QUICK_TRAY_PATH") << getPathFromConf("PATH") << getPathFromConf("SYSTEM_TRAY_PATH")); if (!pluginsDirs.isEmpty()) pluginPaths << pluginsDirs; #endif diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 3ec03a21c..bec1ba079 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -41,13 +41,17 @@ void QuickSettingController::pluginItemAdded(PluginsItemInterface * const itemIn // 根据读取到的metaData数据获取当前插件的类型,提供给外部 PluginAttribute pluginClass = PluginAttribute::Quick; QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter); - QJsonObject meta; if (pluginLoader) { - meta = pluginLoader->metaData().value("MetaData").toObject(); - if (meta.contains("tool") && meta.value("tool").toBool()) - pluginClass = PluginAttribute::Tool; - else if (meta.contains("fixed") && meta.value("fixed").toBool()) - pluginClass = PluginAttribute::Fixed; + if (pluginLoader->fileName().contains("/plugins/system-trays")) { + // 如果是从系统托盘目录下加载的插件,则认为它是托盘插件,此时需要放入到托盘中 + pluginClass = PluginAttribute::System; + } else { + QJsonObject meta = pluginLoader->metaData().value("MetaData").toObject(); + if (meta.contains("tool") && meta.value("tool").toBool()) + pluginClass = PluginAttribute::Tool; + else if (meta.contains("fixed") && meta.value("fixed").toBool()) + pluginClass = PluginAttribute::Fixed; + } } m_quickPlugins[pluginClass] << itemInter; @@ -64,8 +68,10 @@ void QuickSettingController::pluginItemRemoved(PluginsItemInterface * const item continue; plugins.removeOne(itemInter); - if (plugins.isEmpty()) - m_quickPlugins.remove(it.key()); + if (plugins.isEmpty()) { + QuickSettingController::PluginAttribute pluginclass = it.key(); + m_quickPlugins.remove(pluginclass); + } break; } diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index b0b815304..142b37081 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -34,7 +34,8 @@ public: enum class PluginAttribute { Quick = 0, Tool, - Fixed + Fixed, + System }; public: diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp index 59322f46f..2fc20b9b4 100644 --- a/frame/pluginadapter/pluginadapter.cpp +++ b/frame/pluginadapter/pluginadapter.cpp @@ -162,13 +162,21 @@ PluginsItemInterface::PluginSizePolicy PluginAdapter::pluginSizePolicy() const QIcon PluginAdapter::icon(const DockPart &dockPart) { - if (dockPart == DockPart::QuickPanel) { + QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); + if (!itemWidget) + return QIcon(); + + switch (dockPart) { + case DockPart::QuickPanel: { // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 - QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); - if (itemWidget) { - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); - return itemWidget->grab(); - } + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + return itemWidget->grab(); + } + case DockPart::SystemPanel: { + itemWidget->setFixedSize(16, 16); + return itemWidget->grab(); + } + default: break; } return QIcon(); diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 12ddc1ea6..fd9a59d81 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -261,7 +261,7 @@ void DockTrayWindow::initUi() m_mainBoxLayout->setAlignment(m_toolLineLabel, Qt::AlignCenter); WinInfo info; - info.type = TrayIconType::EXPANDICON; + info.type = TrayIconType::ExpandIcon; m_model->addRow(info); m_trayView->openPersistentEditor(m_model->index(0, 0)); @@ -277,11 +277,15 @@ void DockTrayWindow::initConnection() connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, &DockTrayWindow::onResetLayout); connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onResetLayout); - connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ] (PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { - if (pluginClass != QuickSettingController::PluginAttribute::Tool) - return; - - onItemAdded(itemInter); + connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ] (PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + switch (pluginAttr) { + case QuickSettingController::PluginAttribute::Tool: + // 下方只处理回收站等插件 + onItemAdded(itemInter); + break; + default: + break; + } }); connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, &DockTrayWindow::onItemRemove); @@ -336,6 +340,7 @@ void DockTrayWindow::onItemRemove(PluginsItemInterface *itemInter) continue; m_toolLayout->removeWidget(pluginItem); + Q_EMIT requestUpdate(); break; } diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index c3122e1b7..1cef0370e 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -27,6 +27,9 @@ #include "widgets/snitrayitemwidget.h" #include "widgets/expandiconwidget.h" #include "utils.h" +#include "pluginsiteminterface.h" +#include "quicksettingcontroller.h" +#include "systempluginitem.h" #include @@ -62,7 +65,7 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem quint32 winId = index.data(TrayModel::WinIdRole).value(); BaseTrayWidget *trayWidget = nullptr; - if(type == TrayIconType::XEMBED) { + if(type == TrayIconType::XEmbed) { if (Utils::IS_WAYLAND_DISPLAY) { static Display *display = XOpenDisplay(nullptr); static int screenp = 0; @@ -74,9 +77,9 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem const TrayModel *model = qobject_cast(index.model()); if (model) connect(model, &TrayModel::requestUpdateIcon, trayWidget, &BaseTrayWidget::updateIcon); - } else if (type == TrayIconType::SNI) { + } else if (type == TrayIconType::Sni) { trayWidget = new SNITrayItemWidget(servicePath, parent); - } else if (type == TrayIconType::EXPANDICON) { + } else if (type == TrayIconType::ExpandIcon) { ExpandIconWidget *expandWidget = new ExpandIconWidget(parent); expandWidget->setPositonValue(m_position); connect(expandWidget, &ExpandIconWidget::trayVisbleChanged, this, [ = ](bool visible) { @@ -84,7 +87,7 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem }); connect(this, &TrayDelegate::requestDrag, this, &TrayDelegate::onRequestDrag); trayWidget = expandWidget; - } else if (type == TrayIconType::INDICATOR) { + } else if (type == TrayIconType::Incicator) { QString indicateName = key; int flagIndex = indicateName.indexOf("indicator:"); if (flagIndex >= 0) @@ -100,6 +103,13 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem indicatorWidget->setText(text); } trayWidget = indicatorWidget; + } else if (type == TrayIconType::SystemItem) { + PluginsItemInterface *pluginInter = (PluginsItemInterface *)(index.data(TrayModel::PluginInterfaceRole).toULongLong()); + if (pluginInter) { + const QString itemKey = QuickSettingController::instance()->itemKey(pluginInter); + SystemPluginItem::setDockPostion(m_position); + trayWidget = new SystemPluginItem(pluginInter, itemKey, parent); + } } if (trayWidget) diff --git a/frame/window/tray/tray_delegate.h b/frame/window/tray/tray_delegate.h index baa843715..5bd4e2175 100644 --- a/frame/window/tray/tray_delegate.h +++ b/frame/window/tray/tray_delegate.h @@ -33,6 +33,7 @@ struct WinInfo; class ExpandIconWidget; class QListView; +class PluginsItemInterface; class TrayDelegate : public QStyledItemDelegate { diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index 957b29b97..d190bd259 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -289,7 +289,7 @@ void TrayGridView::mouseMoveEvent(QMouseEvent *e) // 如果当前拖动的位置是托盘展开按钮,则不让其拖动 TrayIconType iconType = index.data(TrayModel::Role::TypeRole).value(); - if (iconType == TrayIconType::EXPANDICON) + if (iconType == TrayIconType::ExpandIcon) return DListView::mouseMoveEvent(e); if ((qAbs(e->pos().x() - m_dragPos.x()) > m_dragDistance || @@ -426,7 +426,7 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) QModelIndex modelIndex = indexAt(m_dragPos); TrayIconType trayType = modelIndex.data(TrayModel::Role::TypeRole).value(); // 展开图标不能移动 - if (trayType == TrayIconType::EXPANDICON) + if (trayType == TrayIconType::ExpandIcon) return false; m_dropPos = indexRect(modelIndex).center(); diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index 2640eb7d3..d7e4755be 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -23,6 +23,8 @@ #include "indicatortrayitem.h" #include "indicatorplugin.h" +#include "quicksettingcontroller.h" +#include "pluginsiteminterface.h" #include #include @@ -46,6 +48,19 @@ TrayModel::TrayModel(QListView *view, bool isIconTray, bool hasInputMethod, QObj if (isIconTray) { connect(m_monitor, &TrayMonitor::xEmbedTrayAdded, this, &TrayModel::onXEmbedTrayAdded); connect(m_monitor, &TrayMonitor::indicatorFounded, this, &TrayModel::onIndicatorFounded); + connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + if (pluginAttr != QuickSettingController::PluginAttribute::System) + return; + + systemItemAdded(itemInter); + }); + + connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, &TrayModel::onSystemItemRemoved); + QMetaObject::invokeMethod(this, [ = ] { + QList systemPlugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::System); + for (PluginsItemInterface *plugin : systemPlugins) + systemItemAdded(plugin); + }, Qt::QueuedConnection); } connect(m_monitor, &TrayMonitor::xEmbedTrayRemoved, this, &TrayModel::onXEmbedTrayRemoved); connect(m_monitor, &TrayMonitor::requestUpdateIcon, this, &TrayModel::requestUpdateIcon); @@ -173,6 +188,8 @@ QVariant TrayModel::data(const QModelIndex &index, int role) const return info.winId; case Role::ServiceRole: return info.servicePath; + case Role::PluginInterfaceRole: + return (qulonglong)(info.pluginInter); case Role::Blank: return indexDragging(index); default: @@ -202,7 +219,7 @@ bool TrayModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, in Q_UNUSED(column) TrayIconType iconType = parent.data(TrayModel::Role::TypeRole).value(); - if (iconType == TrayIconType::EXPANDICON) + if (iconType == TrayIconType::ExpandIcon) return false; return data->formats().contains(TRAY_DRAG_FALG); @@ -243,7 +260,7 @@ void TrayModel::onXEmbedTrayAdded(quint32 winId) beginInsertRows(QModelIndex(), rowCount(), rowCount()); WinInfo info; - info.type = XEMBED; + info.type = XEmbed; info.key = "wininfo:" + QString::number(winId); info.winId = winId; m_winInfos.append(info); @@ -295,6 +312,23 @@ bool TrayModel::isTypeWriting(const QString &servicePath) return (appFilePath.startsWith("/usr/bin/fcitx") || appFilePath.endsWith("chinime-qim")); } +void TrayModel::systemItemAdded(PluginsItemInterface *itemInter) +{ + for (const WinInfo &info : m_winInfos) { + if (info.pluginInter == itemInter) + return; + } + + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + + WinInfo info; + info.type = SystemItem; + info.pluginInter = itemInter; + m_winInfos.append(info); + + endInsertRows(); +} + void TrayModel::onSniTrayAdded(const QString &servicePath) { bool typeWriting = isTypeWriting(servicePath); @@ -313,7 +347,7 @@ void TrayModel::onSniTrayAdded(const QString &servicePath) beginInsertRows(QModelIndex(), rowCount(), rowCount()); WinInfo info; - info.type = SNI; + info.type = Sni; info.key = "sni:" + servicePath; info.servicePath = servicePath; info.isTypeWriting = typeWriting; // 是否为输入法 @@ -395,7 +429,7 @@ void TrayModel::onIndicatorAdded(const QString &indicatorName) beginInsertRows(QModelIndex(), rowCount(), rowCount()); WinInfo info; - info.type = INDICATOR; + info.type = Incicator; info.key = itemKey; m_winInfos.append(info); endInsertRows(); @@ -407,6 +441,21 @@ void TrayModel::onIndicatorRemoved(const QString &indicatorName) removeRow(itemKey); } +void TrayModel::onSystemItemRemoved(PluginsItemInterface *itemInter) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + + for (const WinInfo &info : m_winInfos) { + if (info.pluginInter != itemInter) + continue; + + m_winInfos.removeOne(info); + break; + } + + endInsertRows(); +} + void TrayModel::removeRow(const QString &itemKey) { for (const WinInfo &info : m_winInfos) { diff --git a/frame/window/tray/tray_model.h b/frame/window/tray/tray_model.h index 893c3f203..df41c8bb4 100644 --- a/frame/window/tray/tray_model.h +++ b/frame/window/tray/tray_model.h @@ -28,13 +28,15 @@ class TrayMonitor; class IndicatorPlugin; class IndicatorTrayItem; +class PluginsItemInterface; enum TrayIconType { - UNKNOW, - XEMBED, - SNI, - INDICATOR, - EXPANDICON + UnKnow, + XEmbed, + Sni, + Incicator, + ExpandIcon, + SystemItem }; struct WinInfo { @@ -43,19 +45,22 @@ struct WinInfo { quint32 winId; QString servicePath; bool isTypeWriting; + PluginsItemInterface *pluginInter; - WinInfo() : type(UNKNOW) + WinInfo() : type(UnKnow) , key(QString()) , winId(0) , servicePath(QString()) - , isTypeWriting(false) {} + , isTypeWriting(false) + , pluginInter(nullptr) {} bool operator==(const WinInfo &other) { return this->type == other.type && this->key == other.key && this->winId == other.winId && this->servicePath == other.servicePath - && this->isTypeWriting == other.isTypeWriting; + && this->isTypeWriting == other.isTypeWriting + && this->pluginInter == other.pluginInter; } }; @@ -69,6 +74,7 @@ public: KeyRole, WinIdRole, ServiceRole, + PluginInterfaceRole, Blank }; @@ -113,11 +119,15 @@ private Q_SLOTS: void onIndicatorAdded(const QString &indicatorName); void onIndicatorRemoved(const QString &indicatorName); + void onSystemItemRemoved(PluginsItemInterface *itemInter); + private: bool exist(const QString &itemKey); QString fileNameByServiceName(const QString &serviceName); bool isTypeWriting(const QString &servicePath); + void systemItemAdded(PluginsItemInterface *itemInter); + protected: QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE; QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 285817621..0e4a9871c 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -231,7 +231,7 @@ void TrayManagerWindow::initUi() m_splitLine->setPalette(pal); WinInfo info; - info.type = TrayIconType::EXPANDICON; + info.type = TrayIconType::ExpandIcon; m_model->addRow(info); m_trayView->openPersistentEditor(m_model->index(0, 0)); diff --git a/interfaces/constants.h b/interfaces/constants.h index 407aaff2b..08a8b8b3b 100644 --- a/interfaces/constants.h +++ b/interfaces/constants.h @@ -37,6 +37,10 @@ namespace Dock { #define PLUGIN_ICON_MAX_SIZE 20 #define PLUGIN_ITEM_WIDTH 300 +#define QUICK_PATH "/plugins/quick-trays" +#define PLUGIN_PATH "/plugins" +#define TRAY_PATH "/plugins/system-trays" + // 需求变更成插件图标始终保持20x20,但16x16的资源还在。所以暂时保留此宏 #define PLUGIN_ICON_MIN_SIZE 20 diff --git a/plugins/airplane-mode/CMakeLists.txt b/plugins/airplane-mode/CMakeLists.txt index b28736de2..3d6d8ee4f 100644 --- a/plugins/airplane-mode/CMakeLists.txt +++ b/plugins/airplane-mode/CMakeLists.txt @@ -26,7 +26,7 @@ pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} resources/airplane_mode.qrc) -set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../system-trays) +set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ..) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} @@ -45,4 +45,4 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE ${Qt5Widgets_LIBRARIES} ${Qt5Svg_LIBRARIES}) -install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/system-trays) +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) diff --git a/plugins/keyboard-layout/CMakeLists.txt b/plugins/keyboard-layout/CMakeLists.txt index 376574684..1538d6e68 100644 --- a/plugins/keyboard-layout/CMakeLists.txt +++ b/plugins/keyboard-layout/CMakeLists.txt @@ -37,5 +37,5 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE ${Qt5DBus_LIBRARIES} ) -install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/system-trays/) +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/) install(FILES ./keybord_layout.json DESTINATION /etc/dde-dock/indicator) From b670c15d1df9cf518dad2bd568241c9552f2d57c Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 17 Oct 2022 05:38:04 +0000 Subject: [PATCH 103/257] =?UTF-8?q?fix:=20=E6=89=98=E7=9B=98=E8=B7=9F?= =?UTF-8?q?=E9=9A=8F=E9=AB=98=E6=95=88=E6=A8=A1=E5=BC=8F=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、DockTrayWindow类增加调整位置接口,在改变任务栏位置的时候,调整高效模式下托盘区域的尺寸,让其适应任务栏 2、根据需求,删除任务栏右侧的显示桌面区域,该区域留给窗管做活动角 Log: Influence: 高效模式下,调整任务栏位置,观察托盘区域是否正常 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: If3ad21c12abfe67e6eff8be713ef20905d03e637 --- frame/controller/toolapphelper.cpp | 93 +------------- frame/controller/toolapphelper.h | 8 +- frame/window/docktraywindow.cpp | 8 +- frame/window/mainpanelcontrol.cpp | 187 ++++++----------------------- frame/window/mainpanelcontrol.h | 9 +- 5 files changed, 47 insertions(+), 258 deletions(-) diff --git a/frame/controller/toolapphelper.cpp b/frame/controller/toolapphelper.cpp index d2215ad26..1630f0336 100644 --- a/frame/controller/toolapphelper.cpp +++ b/frame/controller/toolapphelper.cpp @@ -27,12 +27,10 @@ #include #include -ToolAppHelper::ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget, QObject *parent) +ToolAppHelper::ToolAppHelper(QWidget *toolAreaWidget, QObject *parent) : QObject(parent) - , m_pluginAreaWidget(pluginAreaWidget) , m_toolAreaWidget(toolAreaWidget) , m_displayMode(DisplayMode::Efficient) - , m_trashItem(nullptr) { connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { if (pluginClass != QuickSettingController::PluginAttribute::Tool) @@ -55,11 +53,7 @@ void ToolAppHelper::setDisplayMode(DisplayMode displayMode) void ToolAppHelper::removePluginItem(DockItem *dockItem) { - if (dockItem == m_trashItem) - m_trashItem = nullptr; - - if (!removePluginArea(dockItem)) - removeToolArea(dockItem); + removeToolArea(dockItem); if (m_toolAreaWidget->layout()->count() == 0 && toolIsVisible()) updateWidgetStatus(); @@ -67,11 +61,6 @@ void ToolAppHelper::removePluginItem(DockItem *dockItem) Q_EMIT requestUpdate(); } -PluginsItem *ToolAppHelper::trashPlugin() const -{ - return m_trashItem; -} - bool ToolAppHelper::toolIsVisible() const { return m_toolAreaWidget->isVisible(); @@ -89,25 +78,6 @@ void ToolAppHelper::appendToToolArea(int index, DockItem *dockItem) Q_EMIT requestUpdate(); } -bool ToolAppHelper::removePluginArea(DockItem *dockItem) -{ - bool removeResult = false; - QBoxLayout *pluginLayout = static_cast(m_pluginAreaWidget->layout()); - for (int i = 0; i < pluginLayout->count(); ++i) { - QLayoutItem *layoutItem = pluginLayout->itemAt(i); - QLayout *boxLayout = layoutItem->layout(); - if (boxLayout && boxLayout->itemAt(0)->widget() == dockItem) { - boxLayout->removeWidget(dockItem); - pluginLayout->removeItem(layoutItem); - delete layoutItem; - layoutItem = nullptr; - removeResult = true; - } - } - - return removeResult; -} - bool ToolAppHelper::removeToolArea(DockItem *dockItem) { QBoxLayout *boxLayout = static_cast(m_toolAreaWidget->layout()); @@ -150,11 +120,9 @@ void ToolAppHelper::updateWidgetStatus() bool oldVisible = toolIsVisible(); if (m_displayMode == DisplayMode::Efficient) { // 高效模式 - m_pluginAreaWidget->setVisible(true); m_toolAreaWidget->setVisible(false); } else { // 时尚模式 - m_pluginAreaWidget->setVisible(false); m_toolAreaWidget->setVisible(m_toolAreaWidget->layout()->count() > 0); } bool visible = toolIsVisible(); @@ -175,63 +143,6 @@ bool ToolAppHelper::pluginInTool(DockItem *dockItem) const return false; } -/** - * @brief ToolAppHelper::itemIndex 返回该插件在工具区域(isTool == true)或插件区域(isTool == false)的正确位置 - * @param dockItem - * @param isTool - * @return - */ -int ToolAppHelper::itemIndex(DockItem *dockItem, bool isTool) const -{ - int index = m_sequentPluginItems.indexOf(dockItem); - if (index < 0 || index >= m_sequentPluginItems.size() - 1) - return -1; - - QList dockItems = dockItemOnWidget(isTool); - for (int i = index + 1; i < m_sequentPluginItems.size(); i++) { - DockItem *nextItem = m_sequentPluginItems[i]; - if (dockItems.contains(nextItem)) { - // 如果当前包含当前插入的下一个item,则直接返回下一个item的插入位置 - return dockItems.indexOf(nextItem); - } - } - - return -1; -} - -QList ToolAppHelper::dockItemOnWidget(bool isTool) const -{ - QList dockItems; - if (isTool) { - QLayout *layout = m_toolAreaWidget->layout(); - for (int i = 0; i < layout->count(); i++) { - DockItem *dockItem = qobject_cast(layout->itemAt(i)->widget()); - if (!dockItem) - continue; - - dockItems << dockItem; - } - } else { - QBoxLayout *pluginLayout = static_cast(m_pluginAreaWidget->layout()); - if (pluginLayout) { - for (int i = 0; i < pluginLayout->count(); ++i) { - QLayoutItem *layoutItem = pluginLayout->itemAt(i); - QLayout *boxLayout = layoutItem->layout(); - if (!boxLayout) - continue; - - DockItem *dockItem = qobject_cast(boxLayout->itemAt(0)->widget()); - if (!dockItem) - continue; - - dockItems << dockItem; - } - } - } - - return dockItems; -} - void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter) { if (m_displayMode != Dock::DisplayMode::Fashion || pluginExists(itemInter)) diff --git a/frame/controller/toolapphelper.h b/frame/controller/toolapphelper.h index dd3513ed8..ee152dafc 100644 --- a/frame/controller/toolapphelper.h +++ b/frame/controller/toolapphelper.h @@ -38,11 +38,10 @@ class ToolAppHelper : public QObject Q_OBJECT public: - explicit ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget, QObject *parent = nullptr); + explicit ToolAppHelper(QWidget *toolAreaWidget, QObject *parent = nullptr); void setDisplayMode(DisplayMode displayMode); void removePluginItem(DockItem *dockItem); - PluginsItem *trashPlugin() const; bool toolIsVisible() const; Q_SIGNALS: @@ -51,22 +50,17 @@ Q_SIGNALS: private: void appendToToolArea(int index, DockItem *dockItem); - bool removePluginArea(DockItem *dockItem); bool removeToolArea(DockItem *dockItem); void moveToolWidget(); void updateWidgetStatus(); bool pluginInTool(DockItem *dockItem) const; - int itemIndex(DockItem *dockItem, bool isTool) const; - QList dockItemOnWidget(bool isTool) const; void pluginItemAdded(PluginsItemInterface *itemInter); bool pluginExists(PluginsItemInterface *itemInter) const; private: - QWidget *m_pluginAreaWidget; QWidget *m_toolAreaWidget; DisplayMode m_displayMode; - PluginsItem *m_trashItem; QList m_sequentPluginItems; }; diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index fd9a59d81..34fa4f815 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -68,6 +68,10 @@ void DockTrayWindow::setPositon(const Dock::Position &position) m_systemPuginWidget->setPositon(position); m_quickIconWidget->setPositon(position); m_trayView->setPosition(position); + m_delegate->setPositon(position); + QModelIndex index = m_model->index(0, 0); + m_trayView->closePersistentEditor(index); + m_trayView->openPersistentEditor(index); updateLayout(position); onResetLayout(); } @@ -194,9 +198,9 @@ void DockTrayWindow::resizeTool() const } if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) - m_toolWidget->setFixedHeight(toolSize); + m_toolWidget->setFixedSize(QWIDGETSIZE_MAX, toolSize); else - m_toolWidget->setFixedWidth(toolSize); + m_toolWidget->setFixedSize(toolSize, QWIDGETSIZE_MAX); } bool DockTrayWindow::pluginExists(PluginsItemInterface *itemInter) const diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 15d6327d1..1b7b2e790 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -40,6 +40,7 @@ #include "appmultiitem.h" #include "dockscreen.h" #include "docktraywindow.h" +#include "quicksettingcontroller.h" #include #include @@ -79,10 +80,6 @@ MainPanelControl::MainPanelControl(DockInter *dockInter, QWidget *parent) , m_appAreaSonWidget(new QWidget(this)) , m_appAreaSonLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_appSpliter(new QLabel(this)) - , m_trayAreaWidget(new QWidget(this)) - , m_trayAreaLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) - , m_traySpliter(new QLabel(this)) - , m_pluginAreaWidget(new QWidget(this)) , m_recentAreaWidget(new QWidget(this)) , m_recentLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_recentSpliter(new QLabel(this)) @@ -93,7 +90,6 @@ MainPanelControl::MainPanelControl(DockInter *dockInter, QWidget *parent) , m_toolSonAreaWidget(new QWidget(m_toolAreaWidget)) , m_toolSonLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_toolSonAreaWidget)) , m_pluginLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) - , m_desktopWidget(new DesktopWidget(this)) , m_position(Position::Bottom) , m_placeholderItem(nullptr) , m_appDragWidget(nullptr) @@ -101,7 +97,7 @@ MainPanelControl::MainPanelControl(DockInter *dockInter, QWidget *parent) , m_tray(new DockTrayWindow(dockInter, this)) , m_dockInter(dockInter) , m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, m_dockInter, this)) - , m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolSonAreaWidget, this)) + , m_toolHelper(new ToolAppHelper(m_toolSonAreaWidget, this)) , m_multiHelper(new MultiWindowHelper(m_appAreaSonWidget, m_multiWindowWidget, this)) { initUI(); @@ -113,14 +109,13 @@ MainPanelControl::MainPanelControl(DockInter *dockInter, QWidget *parent) m_appAreaWidget->installEventFilter(this); m_appAreaSonWidget->installEventFilter(this); - m_trayAreaWidget->installEventFilter(this); - m_pluginAreaWidget->installEventFilter(this); + m_fixedAreaWidget->installEventFilter(this); + m_tray->installEventFilter(this); // 在设置每条线大小前,应该设置fixedsize(0,0) // 应为paintEvent函数会先调用设置背景颜色,大小为随机值 m_fixedSpliter->setFixedSize(0, 0); m_appSpliter ->setFixedSize(0, 0); - m_traySpliter->setFixedSize(0, 0); m_recentSpliter->setFixedSize(0, 0); } @@ -186,34 +181,10 @@ void MainPanelControl::initUI() m_tray->setObjectName("tray"); m_mainPanelLayout->addWidget(m_tray); - m_trayAreaWidget->setVisible(false); - m_pluginAreaWidget->setVisible(false); - /* 托盘区域 */ - /*m_trayAreaWidget->setObjectName("trayarea"); - m_trayAreaWidget->setLayout(m_trayAreaLayout); - m_trayAreaLayout->setSpacing(0); - m_trayAreaLayout->setContentsMargins(0, 10, 0, 10); - m_mainPanelLayout->addWidget(m_trayAreaWidget); - - m_traySpliter->setObjectName("spliter_tray"); - m_mainPanelLayout->addWidget(m_traySpliter);*/ - - /* 插件区域 */ - /*m_pluginAreaWidget->setObjectName("pluginarea"); - m_pluginAreaWidget->setLayout(m_pluginLayout); - m_pluginLayout->setSpacing(10); - m_pluginLayout->setContentsMargins(0, 0, 0, 0); - m_mainPanelLayout->addWidget(m_pluginAreaWidget, 0, Qt::AlignCenter);*/ - - /* 桌面预览 */ - m_desktopWidget->setObjectName("showdesktoparea"); - m_mainPanelLayout->addWidget(m_desktopWidget); - m_mainPanelLayout->setSpacing(0); m_mainPanelLayout->setContentsMargins(0, 0, 0, 0); m_mainPanelLayout->setAlignment(m_fixedSpliter, Qt::AlignCenter); m_mainPanelLayout->setAlignment(m_appSpliter, Qt::AlignCenter); - m_mainPanelLayout->setAlignment(m_traySpliter, Qt::AlignCenter); m_mainPanelLayout->setAlignment(m_recentSpliter, Qt::AlignCenter); } @@ -255,18 +226,14 @@ void MainPanelControl::updateMainPanelLayout() case Position::Bottom: m_fixedAreaWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); m_appAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_pluginAreaWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - m_trayAreaWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); m_mainPanelLayout->setDirection(QBoxLayout::LeftToRight); m_fixedAreaLayout->setDirection(QBoxLayout::LeftToRight); m_pluginLayout->setDirection(QBoxLayout::LeftToRight); - m_trayAreaLayout->setDirection(QBoxLayout::LeftToRight); m_appAreaSonLayout->setDirection(QBoxLayout::LeftToRight); m_recentLayout->setDirection(QBoxLayout::LeftToRight); m_multiWindowLayout->setDirection(QBoxLayout::LeftToRight); m_toolAreaLayout->setDirection(QBoxLayout::LeftToRight); m_toolSonLayout->setDirection(QBoxLayout::LeftToRight); - m_trayAreaLayout->setContentsMargins(0, 10, 0, 10); m_pluginLayout->setContentsMargins(10, 0, 10, 0); m_multiWindowLayout->setContentsMargins(0, 2, 0, 2); break; @@ -274,28 +241,24 @@ void MainPanelControl::updateMainPanelLayout() case Position::Left: m_fixedAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_appAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_pluginAreaWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - m_trayAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_mainPanelLayout->setDirection(QBoxLayout::TopToBottom); m_fixedAreaLayout->setDirection(QBoxLayout::TopToBottom); m_pluginLayout->setDirection(QBoxLayout::TopToBottom); - m_trayAreaLayout->setDirection(QBoxLayout::TopToBottom); m_appAreaSonLayout->setDirection(QBoxLayout::TopToBottom); m_recentLayout->setDirection(QBoxLayout::TopToBottom); m_multiWindowLayout->setDirection(QBoxLayout::TopToBottom); m_toolAreaLayout->setDirection(QBoxLayout::TopToBottom); m_toolSonLayout->setDirection(QBoxLayout::TopToBottom); - m_trayAreaLayout->setContentsMargins(10, 0, 10, 0); m_pluginLayout->setContentsMargins(0, 10, 0, 10); m_multiWindowLayout->setContentsMargins(2, 0, 2, 0); break; } - // 显示桌面的区域 - resizeDesktopWidget(); - // 设置任务栏各区域图标大小 resizeDockIcon(); + + // 调整托盘区域大小 + onTrayRequestUpdate(); } /**往固定区域添加应用 @@ -314,19 +277,6 @@ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg) Q_EMIT requestUpdate(); } -/**往托盘插件区域添加应用 - * @brief MainPanelControl::addTrayAreaItem - * @param index 位置索引,如果为负数则插入到最后,为正则插入到指定位置 - * @param wdg 应用指针对象 - */ -/*void MainPanelControl::addTrayAreaItem(int index, QWidget *wdg) -{ - m_tray = static_cast(wdg); - m_trayAreaLayout->insertWidget(index, wdg); - if (m_tray) - m_tray->installEventFilter(this); -}*/ - /**移除固定区域某一应用 * @brief MainPanelControl::removeFixedAreaItem * @param wdg 应用指针对象 @@ -347,22 +297,12 @@ void MainPanelControl::removeAppAreaItem(QWidget *wdg) Q_EMIT requestUpdate(); } -/**移除托盘插件区域某一应用 - * @brief MainPanelControl::removeTrayAreaItem - * @param wdg 应用指针对象 - */ -void MainPanelControl::removeTrayAreaItem(QWidget *wdg) -{ - m_trayAreaLayout->removeWidget(wdg); -} - void MainPanelControl::resizeEvent(QResizeEvent *event) { // 先通过消息循环让各部件调整好size后再计算图标大小 // 避免因为部件size没有调整完导致计算的图标大小不准确 // 然后重复触发m_pluginAreaWidget的reszie事件并重复计算,造成任务栏图标抖动问题 QWidget::resizeEvent(event); - resizeDesktopWidget(); resizeDockIcon(); } @@ -390,6 +330,20 @@ void MainPanelControl::dockRecentApp(DockItem *dockItem) appItem->requestDock(); } +PluginsItem *MainPanelControl::trash() const +{ + QuickSettingController *quickController = QuickSettingController::instance(); + QList toolPlugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tool); + for (PluginsItemInterface *plugin : toolPlugins) { + if (plugin->pluginName() != "trash") + continue; + + return quickController->pluginItemWidget(plugin); + } + + return nullptr; +} + /**根据任务栏所在位置, 设置应用区域控件的大小 * @brief MainPanelControl::updateAppAreaSonWidgetSize */ @@ -419,6 +373,8 @@ void MainPanelControl::setPositonValue(Dock::Position position) return; m_position = position; + m_tray->setPositon(position); + QMetaObject::invokeMethod(this, &MainPanelControl::updateMainPanelLayout, Qt::QueuedConnection); } @@ -445,14 +401,6 @@ void MainPanelControl::insertItem(int index, DockItem *item) case DockItem::Placeholder: m_recentHelper->addAppItem(index, item); break; - case DockItem::TrayPlugin: // 此处只会有一个tray系统托盘插件,微信、声音、网络蓝牙等等,都在系统托盘插件中处理的 - //addTrayAreaItem(index, item); - return; - //break; - case DockItem::Plugins: - //m_toolHelper->addPluginItem(index, item); - return; - break; case DockItem::AppMultiWindow: m_multiHelper->addMultiWindow(index, static_cast(item)); break; @@ -483,9 +431,6 @@ void MainPanelControl::removeItem(DockItem *item) case DockItem::Placeholder: m_recentHelper->removeAppItem(item); break; - case DockItem::TrayPlugin: - removeTrayAreaItem(item); - break; case DockItem::Plugins: m_toolHelper->removePluginItem(item); break; @@ -726,7 +671,7 @@ bool MainPanelControl::eventFilter(QObject *watched, QEvent *event) } // fix:88133 在计算icon大小时m_pluginAreaWidget的数据错误 - if (watched == m_pluginAreaWidget) { + if (watched == m_tray || watched == m_fixedAreaWidget) { switch (event->type()) { case QEvent::Resize: resizeDockIcon(); @@ -876,7 +821,7 @@ void MainPanelControl::startDrag(DockItem *dockItem) // isNeedBack 保存是否需要重置垃圾箱的AcceptDrops // 设置垃圾箱插件AcceptDrops false bool isNeedBack = false; - PluginsItem *trashItem = m_toolHelper->trashPlugin(); + PluginsItem *trashItem = trash(); if (item->itemType() == DockItem::Plugins && trashItem && dockItem != trashItem) { trashItem->centralWidget()->setAcceptDrops(false); isNeedBack = true; @@ -927,9 +872,6 @@ DockItem *MainPanelControl::dropTargetItem(DockItem *sourceItem, QPoint point) case DockItem::App: parentWidget = m_appAreaSonWidget; break; - case DockItem::Plugins: - parentWidget = m_pluginAreaWidget; - break; case DockItem::FixedPlugin: parentWidget = m_fixedAreaWidget; break; @@ -949,15 +891,7 @@ DockItem *MainPanelControl::dropTargetItem(DockItem *sourceItem, QPoint point) for (int i = 0 ; i < parentLayout->count(); ++i) { QLayoutItem *layoutItem = parentLayout->itemAt(i); - DockItem *dockItem = nullptr; - if (parentWidget == m_pluginAreaWidget) { - QLayout *layout = layoutItem->layout(); - if (layout) { - dockItem = qobject_cast(layout->itemAt(0)->widget()); - } - } else{ - dockItem = qobject_cast(layoutItem->widget()); - } + DockItem *dockItem = qobject_cast(layoutItem->widget()); if (!dockItem) continue; @@ -982,14 +916,10 @@ void MainPanelControl::updateDisplayMode() { updateModeChange(); moveAppSonWidget(); - resizeDesktopWidget(); } void MainPanelControl::updateModeChange() { - m_trayAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); - m_traySpliter->setVisible(m_displayMode == DisplayMode::Efficient); - m_pluginAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient); m_toolAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion); m_toolSonAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion); onRecentVisibleChanged(m_recentHelper->recentIsVisible()); @@ -1166,9 +1096,6 @@ void MainPanelControl::paintEvent(QPaintEvent *event) if (m_appSpliter->isVisible()) painter.fillRect(m_appSpliter->geometry(), color); - if (m_traySpliter->isVisible()) - painter.fillRect(m_traySpliter->geometry(), color); - if (m_recentSpliter->isVisible()) painter.fillRect(m_recentSpliter->geometry(), color); } @@ -1234,15 +1161,9 @@ void MainPanelControl::resizeDockIcon() 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; - }*/ totalLength -= m_tray->width(); // 减去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; @@ -1277,7 +1198,6 @@ void MainPanelControl::resizeDockIcon() return; // 参与计算的插件的个数包含托盘和插件 -// int pluginCount = m_tray ? m_tray->trayVisibleItemCount() + calcPluginItemCount : calcPluginItemCount; // 需要计算的图标总数 int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count()/* + pluginCount*/; if (iconCount <= 0) @@ -1303,7 +1223,6 @@ void MainPanelControl::resizeDockIcon() // 减去插件图标的大小后重新计算固定图标和应用图标的平均大小 totalLength -= m_tray->width();//tray_item_size * pluginCount; - //iconCount -= pluginCount; // 余数 yu = (totalLength % iconCount); @@ -1337,12 +1256,10 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { m_fixedSpliter->setFixedSize(SPLITER_SIZE, int(w * 0.6)); m_appSpliter->setFixedSize(SPLITER_SIZE, int(w * 0.6)); - m_traySpliter->setFixedSize(SPLITER_SIZE, int(w * 0.5)); m_recentSpliter->setFixedSize(SPLITER_SIZE, int(w * 0.6)); } else { m_fixedSpliter->setFixedSize(int(h * 0.6), SPLITER_SIZE); m_appSpliter->setFixedSize(int(h * 0.6), SPLITER_SIZE); - m_traySpliter->setFixedSize(int(h * 0.5), SPLITER_SIZE); m_recentSpliter->setFixedSize(int(h * 0.6), SPLITER_SIZE); } @@ -1420,9 +1337,6 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) } } - /*if (m_tray) - m_tray->centralWidget()->setProperty("iconSize", traySize);*/ - // 因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局 // 因此需要通过多一层布局来获取各插件 if ((m_position == Position::Top) || (m_position == Position::Bottom)) { @@ -1462,38 +1376,18 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) int appTopAndBottomMargin = 0; int appLeftAndRightMargin = 0; - int trayTopAndBottomMargin = 0; - int trayLeftAndRightMargin = 0; - if ((m_position == Position::Top) || (m_position == Position::Bottom)) { appTopAndBottomMargin = (m_fixedAreaWidget->height() - appItemSize) / 2; - trayTopAndBottomMargin = (m_trayAreaWidget->height() - traySize) / 2; } else { appLeftAndRightMargin = (m_fixedAreaWidget->width() - appItemSize) / 2; - trayLeftAndRightMargin = (m_trayAreaWidget->width() - traySize) / 2; } m_fixedAreaLayout->setContentsMargins(appLeftAndRightMargin, appTopAndBottomMargin, appLeftAndRightMargin, appTopAndBottomMargin); m_appAreaSonLayout->setContentsMargins(appLeftAndRightMargin, appTopAndBottomMargin, appLeftAndRightMargin, appTopAndBottomMargin); - m_trayAreaLayout->setContentsMargins(trayLeftAndRightMargin, trayTopAndBottomMargin, trayLeftAndRightMargin, trayTopAndBottomMargin); - - // 因为日期时间插件大小和其他插件大小有异,需要单独设置各插件的边距 - // 而不对日期时间插件设置边距 - for (int i = 0; i < m_pluginLayout->count(); ++ i) { - QLayout *layout = m_pluginLayout->itemAt(i)->layout(); - if (layout && layout->itemAt(0)) { - PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); - - if (pItem && pItem->pluginName() != "datetime") { - layout->setContentsMargins(trayLeftAndRightMargin, trayTopAndBottomMargin, trayLeftAndRightMargin, trayTopAndBottomMargin); - } - } - } } void MainPanelControl::onRequestUpdate() { - resizeDesktopWidget(); // 在插件区域界面发生变化后(新增插件、删除插件、时间长度变化,新增托盘等),会触发当前的信号,此时当前类 // 的尺寸还未变化,因此在此处发送requestUpdate信号,通知外面来调整任务栏右侧的大小,同时计算整个任务栏的大小 Q_EMIT requestUpdate(); @@ -1517,25 +1411,18 @@ void MainPanelControl::onToolVisibleChanged(bool visible) void MainPanelControl::onTrayRequestUpdate() { m_tray->layoutWidget(); - if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) - m_tray->setFixedHeight(m_tray->suitableSize().height()); - else - m_tray->setFixedWidth(m_tray->suitableSize().width()); -} - -/**时尚模式没有‘显示桌面’区域 - * @brief MainPanelControl::resizeDesktopWidget - */ -void MainPanelControl::resizeDesktopWidget() -{ - if (m_position == Position::Right || m_position == Position::Left) { - m_desktopWidget->setFixedSize(QWIDGETSIZE_MAX, DESKTOP_SIZE); - } else { - m_desktopWidget->setFixedSize(DESKTOP_SIZE, QWIDGETSIZE_MAX); + switch (m_position) { + case Dock::Position::Left: + case Dock::Position::Right: { + m_tray->setFixedSize(QWIDGETSIZE_MAX, m_tray->suitableSize().height()); + break; + } + case Dock::Position::Top: + case Dock::Position::Bottom: { + m_tray->setFixedSize(m_tray->suitableSize().width(), QWIDGETSIZE_MAX); + break; + } } - - if (DisplayMode::Fashion == m_displayMode) - m_desktopWidget->setFixedSize(0, 0); } /** diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 34d1c9cf5..897526afe 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -77,8 +77,6 @@ private: void addFixedAreaItem(int index, QWidget *wdg); void removeFixedAreaItem(QWidget *wdg); void removeAppAreaItem(QWidget *wdg); - //void addTrayAreaItem(int index, QWidget *wdg); - void removeTrayAreaItem(QWidget *wdg); int getScreenSize() const; // 拖拽相关 @@ -87,10 +85,10 @@ private: void moveItem(DockItem *sourceItem, DockItem *targetItem); void handleDragMove(QDragMoveEvent *e, bool isFilter); void calcuDockIconSize(int w, int h, int traySize); - void resizeDesktopWidget(); bool checkNeedShowDesktop(); bool appIsOnDock(const QString &appDesktop); void dockRecentApp(DockItem *dockItem); + PluginsItem *trash() const; private Q_SLOTS: void onRequestUpdate(); @@ -120,10 +118,6 @@ private: QWidget *m_appAreaSonWidget; // 子应用区域,所在位置根据显示模式手动指定 QBoxLayout *m_appAreaSonLayout; // 子应用区域布局 QLabel *m_appSpliter; // 应用区域与托盘区域间的分割线 - QWidget *m_trayAreaWidget; // 托盘区域 - QBoxLayout *m_trayAreaLayout; // 托盘区域布局 - QLabel *m_traySpliter; // 托盘区域与插件区域间的分割线 - QWidget *m_pluginAreaWidget; // 插件区域 QWidget *m_recentAreaWidget; // 最近打开应用 QBoxLayout *m_recentLayout; QLabel *m_recentSpliter; // 最近打开应用区域分割线 @@ -135,7 +129,6 @@ private: QBoxLayout *m_toolSonLayout; // 工具区域布局 QBoxLayout *m_pluginLayout; // 插件区域布局 - DesktopWidget *m_desktopWidget; // 桌面预览区域 Position m_position; QPointer m_placeholderItem; From 91d5bfbf07f243e232694300066351967df41ab2 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 2 Nov 2022 06:35:04 +0000 Subject: [PATCH 104/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=B2=A1=E6=9C=89=E5=8A=A0=E8=BD=BD=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=A1=8C=E9=9D=A2=E5=92=8C=E5=A4=9A=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=A7=86=E5=9B=BE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修改DBUS接口中获取当前已加载插件的接口 2、重新定义插件类型:快捷区域插件Quick, 工具插件(回收站等)Tool,托盘插件(U盘图标)Tray,系统插件(开机关机图标)System,固定区域插件(显示桌面和多任务视图)Fixed 3、加载固定区域插件(显示桌面和多任务视图) Log: Influence: 任务栏查看是否存在显示桌面和多任务栏视图的插件 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: Ia7ee8f94ae89ebc93b239f1d078c44e37b50b8ac --- frame/controller/dockitemmanager.cpp | 107 +++++++++++++++++- frame/controller/dockitemmanager.h | 7 +- frame/controller/proxyplugincontroller.cpp | 5 - frame/controller/proxyplugincontroller.h | 3 +- frame/controller/quicksettingcontroller.cpp | 63 ++++++++--- frame/controller/quicksettingcontroller.h | 13 ++- frame/dbus/dbusdockadaptors.cpp | 24 ++-- frame/dbus/dbusdockadaptors.h | 2 + frame/window/quicksettingcontainer.cpp | 2 + frame/window/systempluginwindow.cpp | 6 +- frame/window/tray/tray_model.cpp | 12 +- .../window/tray/widgets/snitrayitemwidget.cpp | 17 +++ plugins/multitasking/multitasking.json | 3 +- plugins/show-desktop/show-desktop.json | 3 +- plugins/shutdown/shutdown.json | 2 +- 15 files changed, 220 insertions(+), 49 deletions(-) diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index 8a83ce2d6..3aa7ba612 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -27,6 +27,7 @@ #include "utils.h" #include "appmultiitem.h" #include "quicksettingcontroller.h" +#include "proxyplugincontroller.h" #include #include @@ -68,6 +69,18 @@ DockItemManager::DockItemManager(QObject *parent) } // 托盘区域和插件区域 由DockPluginsController获取 + QuickSettingController *quickController = QuickSettingController::instance(); + connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + if (pluginAttr != QuickSettingController::PluginAttribute::Fixed) + return; + + m_pluginItems << itemInter; + pluginItemInserted(quickController->pluginItemWidget(itemInter)); + }); + + connect(quickController, &QuickSettingController::pluginRemoved, this, &DockItemManager::onPluginItemRemoved); + connect(quickController, &QuickSettingController::pluginUpdated, this, &DockItemManager::onPluginUpdate); + connect(ProxyPluginController::instance(), &ProxyPluginController::pluginLoaderFinished, this, &DockItemManager::onPluginLoadFinished, Qt::QueuedConnection); // 应用信号 connect(m_appInter, &DockInter::EntryAdded, this, &DockItemManager::appItemAdded); @@ -84,6 +97,13 @@ DockItemManager::DockItemManager(QObject *parent) connect(qApp, &QApplication::aboutToQuit, this, &QObject::deleteLater); + // 读取已经加载的固定区域插件 + QList plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Fixed); + for (PluginsItemInterface *plugin : plugins) { + m_pluginItems << plugin; + pluginItemInserted(quickController->pluginItemWidget(plugin)); + } + // 刷新图标 QMetaObject::invokeMethod(this, "refreshItemsIcon", Qt::QueuedConnection); } @@ -101,11 +121,6 @@ const QList> DockItemManager::itemList() const return m_itemList; } -const QList DockItemManager::pluginList() const -{ - return QuickSettingController::instance()->pluginsMap().keys(); -} - bool DockItemManager::appIsOnDock(const QString &appDesktop) const { return m_appInter->IsOnDock(appDesktop); @@ -279,6 +294,88 @@ void DockItemManager::manageItem(DockItem *item) connect(item, &DockItem::requestWindowAutoHide, this, &DockItemManager::requestWindowAutoHide, Qt::UniqueConnection); } +void DockItemManager::pluginItemInserted(PluginsItem *item) +{ + manageItem(item); + + DockItem::ItemType pluginType = item->itemType(); + + // find first plugins item position + int firstPluginPosition = -1; + for (int i(0); i != m_itemList.size(); ++i) { + DockItem::ItemType type = m_itemList[i]->itemType(); + if (type != pluginType) + continue; + + firstPluginPosition = i; + break; + } + + if (firstPluginPosition == -1) + firstPluginPosition = m_itemList.size(); + + // find insert position + int insertIndex = 0; + const int itemSortKey = item->itemSortKey(); + if (itemSortKey == -1 || firstPluginPosition == -1) { + insertIndex = m_itemList.size(); + } else if (itemSortKey == 0) { + insertIndex = firstPluginPosition; + } else { + insertIndex = m_itemList.size(); + for (int i(firstPluginPosition + 1); i != m_itemList.size() + 1; ++i) { + PluginsItem *pItem = static_cast(m_itemList[i - 1].data()); + Q_ASSERT(pItem); + + const int sortKey = pItem->itemSortKey(); + if (pluginType == DockItem::FixedPlugin) { + if (sortKey != -1 && itemSortKey > sortKey) + continue; + insertIndex = i - 1; + break; + } + if (sortKey != -1 && itemSortKey > sortKey && pItem->itemType() != DockItem::FixedPlugin) + continue; + insertIndex = i - 1; + break; + } + } + + m_itemList.insert(insertIndex, item); + if(pluginType == DockItem::FixedPlugin) + insertIndex ++; + + if (!Utils::SettingValue(QString("com.deepin.dde.dock.module.") + item->pluginName(), QByteArray(), "enable", true).toBool()) + item->setVisible(false); + + emit itemInserted(insertIndex - firstPluginPosition, item); +} + +void DockItemManager::onPluginItemRemoved(PluginsItemInterface *itemInter) +{ + if (!m_pluginItems.contains(itemInter)) + return; + + PluginsItem *item = QuickSettingController::instance()->pluginItemWidget(itemInter); + item->hidePopup(); + + emit itemRemoved(item); + + m_itemList.removeOne(item); + + if (m_loadFinished) { + updatePluginsItemOrderKey(); + } +} + +void DockItemManager::onPluginUpdate(PluginsItemInterface *itemInter) +{ + if (!m_pluginItems.contains(itemInter)) + return; + + Q_EMIT itemUpdated(QuickSettingController::instance()->pluginItemWidget(itemInter)); +} + void DockItemManager::onPluginLoadFinished() { updatePluginsItemOrderKey(); diff --git a/frame/controller/dockitemmanager.h b/frame/controller/dockitemmanager.h index 41bc952cb..dad07c475 100644 --- a/frame/controller/dockitemmanager.h +++ b/frame/controller/dockitemmanager.h @@ -31,6 +31,8 @@ #include class AppMultiItem; +class PluginsItem; + /** * @brief The DockItemManager class * 管理类,管理所有的应用数据,插件数据 @@ -43,7 +45,6 @@ public: static DockItemManager *instance(QObject *parent = nullptr); const QList > itemList() const; - const QList pluginList() const; bool appIsOnDock(const QString &appDesktop) const; signals: @@ -63,6 +64,8 @@ public slots: private Q_SLOTS: void onPluginLoadFinished(); + void onPluginItemRemoved(PluginsItemInterface *itemInter); + void onPluginUpdate(PluginsItemInterface *itemInter); #ifdef USE_AM void onAppWindowCountChanged(); @@ -77,6 +80,7 @@ private: void updatePluginsItemOrderKey(); void reloadAppItems(); void manageItem(DockItem *item); + void pluginItemInserted(PluginsItem *item); #ifdef USE_AM void updateMultiItems(AppItem *appItem, bool emitSignal = false); @@ -91,6 +95,7 @@ private: QList> m_itemList; QList m_appIDist; + QList m_pluginItems; bool m_loadFinished; // 记录所有插件是否加载完成 diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index 70b0cead3..f8a434188 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -144,11 +144,6 @@ QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const return nullptr; } -QList ProxyPluginController::pluginsItems() const -{ - return m_pluginsItems; -} - QString ProxyPluginController::itemKey(PluginsItemInterface *itemInter) const { if (m_pluginsItemKeys.contains(itemInter)) diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index 906575466..e52f738bb 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -40,12 +40,11 @@ class ProxyPluginController : public AbstractPluginsController Q_OBJECT public: - static ProxyPluginController *instance(PluginType instanceKey); + static ProxyPluginController *instance(PluginType instanceKey = PluginType::QuickPlugin); static ProxyPluginController *instance(PluginsItemInterface *itemInter); void addProxyInterface(AbstractPluginsController *interface); void removeProxyInterface(AbstractPluginsController *interface); QPluginLoader *pluginLoader(PluginsItemInterface * const itemInter); - QList pluginsItems() const; QString itemKey(PluginsItemInterface *itemInter) const; protected: diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index bec1ba079..7c72f6a42 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -39,20 +39,7 @@ QuickSettingController::~QuickSettingController() void QuickSettingController::pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { // 根据读取到的metaData数据获取当前插件的类型,提供给外部 - PluginAttribute pluginClass = PluginAttribute::Quick; - QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter); - if (pluginLoader) { - if (pluginLoader->fileName().contains("/plugins/system-trays")) { - // 如果是从系统托盘目录下加载的插件,则认为它是托盘插件,此时需要放入到托盘中 - pluginClass = PluginAttribute::System; - } else { - QJsonObject meta = pluginLoader->metaData().value("MetaData").toObject(); - if (meta.contains("tool") && meta.value("tool").toBool()) - pluginClass = PluginAttribute::Tool; - else if (meta.contains("fixed") && meta.value("fixed").toBool()) - pluginClass = PluginAttribute::Fixed; - } - } + PluginAttribute pluginClass = getPluginClass(itemInter); m_quickPlugins[pluginClass] << itemInter; m_quickPluginsMap[itemInter] = itemKey; @@ -85,6 +72,37 @@ void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInt Q_EMIT pluginUpdated(itemInter, part); } +QuickSettingController::PluginAttribute QuickSettingController::getPluginClass(PluginsItemInterface * const itemInter) const +{ + QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter); + if (!pluginLoader) + return PluginAttribute::Quick; + + if (pluginLoader->fileName().contains("/plugins/system-trays")) { + // 如果是从系统目录下加载的插件,则认为它是系统插件,此时需要放入到托盘中 + return PluginAttribute::Tray; + } + + QJsonObject meta = pluginLoader->metaData().value("MetaData").toObject(); + if (meta.contains("tool") && meta.value("tool").toBool()) { + // 如果有tool标记,则认为它是工具插件,例如回收站和窗管提供的相关插件 + return PluginAttribute::Tool; + } + + if (meta.contains("system") && meta.value("system").toBool()) { + // 如果有system标记,则认为它是右侧的关机按钮插件 + return PluginAttribute::System; + } + + if (meta.contains("fixed") && meta.value("fixed").toBool()) { + // 如果有fixed标记,则认为它是固定区域的插件,例如显示桌面和多任务视图 + return PluginAttribute::Fixed; + } + + // 其他的都认为是快捷插件 + return PluginAttribute::Quick; +} + QuickSettingController *QuickSettingController::instance() { static QuickSettingController instance; @@ -119,3 +137,20 @@ PluginsItem *QuickSettingController::pluginItemWidget(PluginsItemInterface *plug m_pluginItemWidgetMap[pluginItem] = widget; return widget; } + +QList QuickSettingController::pluginInSettings() +{ + QList settingPlugins; + // 用于在控制中心显示可改变位置的插件,这里只提供 + QMap> &plugins = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginsMap(); + QList allPlugins = plugins.keys(); + for (PluginsItemInterface *plugin : allPlugins) { + PluginAttribute pluginClass = getPluginClass(plugin); + if (pluginClass == QuickSettingController::PluginAttribute::Quick + || pluginClass == QuickSettingController::PluginAttribute::System + || pluginClass == QuickSettingController::PluginAttribute::Tool) + settingPlugins << plugin; + } + + return settingPlugins; +} diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 142b37081..63336d5e9 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -32,10 +32,11 @@ class QuickSettingController : public AbstractPluginsController public: enum class PluginAttribute { - Quick = 0, - Tool, - Fixed, - System + Quick = 0, // 快捷区域插件 + Tool, // 工具插件(回收站和窗管开发的另一套插件) + System, // 系统插件(关机插件) + Tray, // 托盘插件(U盘图标等) + Fixed // 固定区域插件(显示桌面和多任务视图) }; public: @@ -44,6 +45,7 @@ public: QString itemKey(PluginsItemInterface *pluginItem) const; QJsonObject metaData(PluginsItemInterface *pluginItem) const; PluginsItem *pluginItemWidget(PluginsItemInterface *pluginItem); + QList pluginInSettings(); Q_SIGNALS: void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute &); @@ -64,6 +66,9 @@ protected: void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; +private: + PluginAttribute getPluginClass(PluginsItemInterface * const itemInter) const; + private: QMap> m_quickPlugins; QMap m_quickPluginsMap; diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index 6cc8b2102..c85a6ecd5 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -24,6 +24,7 @@ #include "dockitemmanager.h" #include "windowmanager.h" #include "proxyplugincontroller.h" +#include "quicksettingcontroller.h" #include "pluginsitem.h" #include @@ -47,12 +48,13 @@ DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) }); } + QList allPlugin = plugins(); connect(DockItemManager::instance(), &DockItemManager::itemInserted, this, [ = ] (const int index, DockItem *item) { Q_UNUSED(index); if (item->itemType() == DockItem::Plugins || item->itemType() == DockItem::FixedPlugin) { PluginsItem *pluginItem = static_cast(item); - for (auto *p : DockItemManager::instance()->pluginList()) { + for (auto *p : allPlugin) { if (p->pluginName() == pluginItem->pluginName()) { Q_EMIT pluginVisibleChanged(p->pluginDisplayName(), getPluginVisible(p->pluginDisplayName())); } @@ -64,7 +66,7 @@ DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) if (item->itemType() == DockItem::Plugins || item->itemType() == DockItem::FixedPlugin) { PluginsItem *pluginItem = static_cast(item); - for (auto *p : DockItemManager::instance()->pluginList()) { + for (auto *p : allPlugin) { if (p->pluginName() == pluginItem->pluginName()) { Q_EMIT pluginVisibleChanged(p->pluginDisplayName(), getPluginVisible(p->pluginDisplayName())); } @@ -99,10 +101,10 @@ void DBusDockAdaptors::ReloadPlugins() QStringList DBusDockAdaptors::GetLoadedPlugins() { - auto pluginList = DockItemManager::instance()->pluginList(); + QList allPlugin = plugins(); QStringList nameList; QMap map; - for (auto plugin : pluginList) { + for (auto plugin : allPlugin) { // 托盘本身也是一个插件,这里去除掉这个特殊的插件,还有一些没有实际名字的插件 if (plugin->pluginName() == "tray" || plugin->pluginDisplayName().isEmpty() @@ -134,7 +136,8 @@ void DBusDockAdaptors::resizeDock(int offset, bool dragging) // 返回每个插件的识别Key(所以此值应始终不变),供个性化插件根据key去匹配每个插件对应的图标 QString DBusDockAdaptors::getPluginKey(const QString &pluginName) { - for (auto plugin : DockItemManager::instance()->pluginList()) { + QList allPlugin = plugins(); + for (auto plugin : allPlugin) { if (plugin->pluginDisplayName() == pluginName) return plugin->pluginName(); } @@ -144,7 +147,8 @@ QString DBusDockAdaptors::getPluginKey(const QString &pluginName) bool DBusDockAdaptors::getPluginVisible(const QString &pluginName) { - for (auto *p : DockItemManager::instance()->pluginList()) { + QList allPlugin = plugins(); + for (auto *p : allPlugin) { if (!p->pluginIsAllowDisable()) continue; @@ -165,7 +169,8 @@ bool DBusDockAdaptors::getPluginVisible(const QString &pluginName) void DBusDockAdaptors::setPluginVisible(const QString &pluginName, bool visible) { - for (auto *p : DockItemManager::instance()->pluginList()) { + QList allPlugin = plugins(); + for (auto *p : allPlugin) { if (!p->pluginIsAllowDisable()) continue; @@ -223,3 +228,8 @@ bool DBusDockAdaptors::isPluginValid(const QString &name) return true; } + +QList DBusDockAdaptors::plugins() const +{ + return QuickSettingController::instance()->pluginInSettings(); +} diff --git a/frame/dbus/dbusdockadaptors.h b/frame/dbus/dbusdockadaptors.h index 2d0575ce9..d3188235a 100644 --- a/frame/dbus/dbusdockadaptors.h +++ b/frame/dbus/dbusdockadaptors.h @@ -31,6 +31,7 @@ */ class QGSettings; class WindowManager; +class PluginsItemInterface; class DBusDockAdaptors: public QDBusAbstractAdaptor { @@ -100,6 +101,7 @@ signals: private: bool isPluginValid(const QString &name); + QList plugins() const; private: QGSettings *m_gsettings; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 2d7e36fed..f241080d5 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -203,6 +203,8 @@ void QuickSettingContainer::onPluginRemove(PluginsItemInterface * itemInter) if (!quickItem) return; + m_pluginLayout->removeWidget(quickItem); + m_quickSettings.removeOne(quickItem); disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); quickItem->setParent(nullptr); quickItem->removeEventFilter(this); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 6f67873b0..bfa651fdc 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -126,8 +126,8 @@ void SystemPluginWindow::initUi() void SystemPluginWindow::initConnection() { QuickSettingController *quickController = QuickSettingController::instance(); - connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { - if (pluginClass != QuickSettingController::PluginAttribute::Fixed) + connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + if (pluginAttr != QuickSettingController::PluginAttribute::System) return; pluginAdded(itemInter); @@ -136,7 +136,7 @@ void SystemPluginWindow::initConnection() connect(quickController, &QuickSettingController::pluginRemoved, this, &SystemPluginWindow::onPluginItemRemoved); connect(quickController, &QuickSettingController::pluginUpdated, this, &SystemPluginWindow::onPluginItemUpdated); - QList plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Fixed); + QList plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::System); for (int i = 0; i < plugins.size(); i++) pluginAdded(plugins[i]); } diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index d7e4755be..c0db86d71 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -48,17 +48,19 @@ TrayModel::TrayModel(QListView *view, bool isIconTray, bool hasInputMethod, QObj if (isIconTray) { connect(m_monitor, &TrayMonitor::xEmbedTrayAdded, this, &TrayModel::onXEmbedTrayAdded); connect(m_monitor, &TrayMonitor::indicatorFounded, this, &TrayModel::onIndicatorFounded); - connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { - if (pluginAttr != QuickSettingController::PluginAttribute::System) + + QuickSettingController *quickController = QuickSettingController::instance(); + connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + if (pluginAttr != QuickSettingController::PluginAttribute::Tray) return; systemItemAdded(itemInter); }); - connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, &TrayModel::onSystemItemRemoved); + connect(quickController, &QuickSettingController::pluginRemoved, this, &TrayModel::onSystemItemRemoved); QMetaObject::invokeMethod(this, [ = ] { - QList systemPlugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::System); - for (PluginsItemInterface *plugin : systemPlugins) + QList trayPlugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tray); + for (PluginsItemInterface *plugin : trayPlugins) systemItemAdded(plugin); }, Qt::QueuedConnection); } diff --git a/frame/window/tray/widgets/snitrayitemwidget.cpp b/frame/window/tray/widgets/snitrayitemwidget.cpp index a93215a21..e21befa84 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.cpp +++ b/frame/window/tray/widgets/snitrayitemwidget.cpp @@ -151,6 +151,23 @@ SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *par connect(m_sniInter, &StatusNotifierItem::NewStatus, [ = ] { onSNIStatusChanged(m_sniInter->status()); }); + + QMetaObject::invokeMethod(this, [ this ] { + m_sniIconName = m_sniInter->iconName(); + m_sniIconPixmap = m_sniInter->iconPixmap(); + m_sniIconThemePath = m_sniInter->iconThemePath(); + m_updateIconTimer->start(); + + m_sniOverlayIconName = m_sniInter->overlayIconName(); + m_sniOverlayIconPixmap = m_sniInter->overlayIconPixmap(); + m_sniIconThemePath = m_sniInter->iconThemePath(); + m_updateOverlayIconTimer->start(); + + m_sniAttentionIconName = m_sniInter->attentionIconName(); + m_sniAttentionIconPixmap = m_sniInter->attentionIconPixmap(); + m_sniIconThemePath = m_sniInter->iconThemePath(); + m_updateAttentionIconTimer->start(); + }, Qt::QueuedConnection); } QString SNITrayItemWidget::itemKeyForConfig() diff --git a/plugins/multitasking/multitasking.json b/plugins/multitasking/multitasking.json index bec81f0da..cdda5b480 100644 --- a/plugins/multitasking/multitasking.json +++ b/plugins/multitasking/multitasking.json @@ -1,3 +1,4 @@ { - "api": "2.0.0" + "api": "2.0.0", + "fixed": true } diff --git a/plugins/show-desktop/show-desktop.json b/plugins/show-desktop/show-desktop.json index bec81f0da..cdda5b480 100644 --- a/plugins/show-desktop/show-desktop.json +++ b/plugins/show-desktop/show-desktop.json @@ -1,3 +1,4 @@ { - "api": "2.0.0" + "api": "2.0.0", + "fixed": true } diff --git a/plugins/shutdown/shutdown.json b/plugins/shutdown/shutdown.json index cdda5b480..a1a7e7292 100644 --- a/plugins/shutdown/shutdown.json +++ b/plugins/shutdown/shutdown.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "fixed": true + "system": true } From db3e5f79da3bf7662f3cde24073797966322c675 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 18 Oct 2022 10:24:21 +0000 Subject: [PATCH 105/257] =?UTF-8?q?feat:=20=E5=9B=BE=E6=A0=87=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0toolTip=E5=92=8C=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 分别在QuickDockItem类,SystemPluginItem类和SystemPluginItem类中增加如下处理 1、增加toolTip功能 2、增加右键菜单功能 Log: 图标增加toolTip和菜单 Influence: 鼠标放入到托盘区域、快捷插件区域,关机区域,观察是否存在toolTip,右键,观察是否弹出菜单 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I7a700d9b9e4ee3c0681ae0de39712f3f5ae83224 --- frame/window/quickpluginwindow.cpp | 142 +++++++++++++++++- frame/window/quickpluginwindow.h | 16 +- frame/window/systempluginwindow.cpp | 5 + frame/window/systempluginwindow.h | 2 + frame/window/tray/tray_delegate.cpp | 3 +- .../window/tray/widgets/snitrayitemwidget.cpp | 70 +++++---- frame/window/tray/widgets/snitrayitemwidget.h | 15 +- .../window/tray/widgets/systempluginitem.cpp | 2 +- 8 files changed, 208 insertions(+), 47 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 66e9af47a..efe58c51a 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #define ITEMSIZE 22 #define ITEMSPACE 6 @@ -501,11 +502,28 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject , m_pluginItem(pluginItem) , m_metaData(metaData) , m_itemKey(itemKey) + , m_position(Dock::Position::Bottom) + , m_popupWindow(new DockPopupWindow) + , m_contextMenu(new QMenu(this)) { + m_popupWindow->setShadowBlurRadius(20); + m_popupWindow->setRadius(6); + m_popupWindow->setShadowYOffset(2); + m_popupWindow->setShadowXOffset(0); + m_popupWindow->setArrowWidth(18); + m_popupWindow->setArrowHeight(10); + m_popupWindow->setObjectName("quickitempopup"); + if (Utils::IS_WAYLAND_DISPLAY) { + Qt::WindowFlags flags = m_popupWindow->windowFlags() | Qt::FramelessWindowHint; + m_popupWindow->setWindowFlags(flags); + } + + connect(qApp, &QApplication::aboutToQuit, m_popupWindow, &DockPopupWindow::deleteLater); } QuickDockItem::~QuickDockItem() { + m_popupWindow->deleteLater(); } PluginsItemInterface *QuickDockItem::pluginItem() @@ -534,10 +552,79 @@ void QuickDockItem::paintEvent(QPaintEvent *event) painter.drawPixmap(pixmapRect, pixmap); } -void QuickDockItem::mouseReleaseEvent(QMouseEvent *event) +void QuickDockItem::mousePressEvent(QMouseEvent *event) { - Q_EMIT clicked(); - QWidget::mouseReleaseEvent(event); + switch (event->button()) { + case Qt::LeftButton: { + Q_EMIT clicked(); + break; + } + case Qt::RightButton: { + if (m_contextMenu->actions().isEmpty()) { + const QString menuJson = m_pluginItem->itemContextMenu(m_itemKey); + if (menuJson.isEmpty()) + return; + + QJsonDocument jsonDocument = QJsonDocument::fromJson(menuJson.toLocal8Bit().data()); + if (jsonDocument.isNull()) + return; + + QJsonObject jsonMenu = jsonDocument.object(); + + QJsonArray jsonMenuItems = jsonMenu.value("items").toArray(); + for (auto item : jsonMenuItems) { + QJsonObject itemObj = item.toObject(); + QAction *action = new QAction(itemObj.value("itemText").toString()); + action->setCheckable(itemObj.value("isCheckable").toBool()); + action->setChecked(itemObj.value("checked").toBool()); + action->setData(itemObj.value("itemId").toString()); + action->setEnabled(itemObj.value("isActive").toBool()); + m_contextMenu->addAction(action); + } + } + + m_contextMenu->exec(QCursor::pos()); + break; + } + default: + break; + } + QWidget::mousePressEvent(event); +} + +void QuickDockItem::enterEvent(QEvent *event) +{ + QWidget::enterEvent(event); + + QWidget *tipWidget = m_pluginItem->itemTipsWidget(m_itemKey); + if (!tipWidget) + return; + + switch (m_position) { + case Top: + m_popupWindow->setArrowDirection(DockPopupWindow::ArrowTop); + break; + case Bottom: + m_popupWindow->setArrowDirection(DockPopupWindow::ArrowBottom); + break; + case Left: + m_popupWindow->setArrowDirection(DockPopupWindow::ArrowLeft); + break; + case Right: + m_popupWindow->setArrowDirection(DockPopupWindow::ArrowRight); + break; + } + + m_popupWindow->resize(tipWidget->sizeHint()); + m_popupWindow->setContent(tipWidget); + + m_popupWindow->show(popupMarkPoint()); +} + +void QuickDockItem::leaveEvent(QEvent *event) +{ + QWidget::leaveEvent(event); + m_popupWindow->hide(); } QPixmap QuickDockItem::iconPixmap() const @@ -555,3 +642,52 @@ QPixmap QuickDockItem::iconPixmap() const return QPixmap(); } + +QPoint QuickDockItem::topleftPoint() const +{ + QPoint p = this->pos(); + /* 由于点击范围的问题,在图标的外面加了一层布局,这个布局的边距需要考虑 */ + switch (m_position) { + case Top: + p.setY(p.y() * 2); + break; + case Bottom: + p.setY(0); + break; + case Left: + p.setX(p.x() * 2); + break; + case Right: + p.setX(0); + break; + } + + QWidget *w = qobject_cast(this->parent()); + while (w) { + p += w->pos(); + w = qobject_cast(w->parent()); + } + + return p; +} + +QPoint QuickDockItem::popupMarkPoint() const +{ + QPoint p(topleftPoint()); + const QRect r = rect(); + switch (m_position) { + case Top: + p += QPoint(r.width() / 2, r.height()); + break; + case Bottom: + p += QPoint(r.width() / 2, 0); + break; + case Left: + p += QPoint(r.width(), r.height() / 2); + break; + case Right: + p += QPoint(0, r.height() / 2); + break; + } + return p; +} diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 44da684b4..27bdd52c4 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -34,6 +34,8 @@ class QStandardItem; class QMouseEvent; class QBoxLayout; class QuickDockItem; +class DockPopupWindow; +class QMenu; enum class DockPart; namespace Dtk { namespace Gui { class DRegionMonitor; } @@ -97,6 +99,7 @@ public: explicit QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent = nullptr); ~QuickDockItem(); + void setPositon(Dock::Position position); PluginsItemInterface *pluginItem(); bool isPrimary() const; @@ -104,15 +107,24 @@ Q_SIGNALS: void clicked(); protected: - void paintEvent(QPaintEvent *event); - void mouseReleaseEvent(QMouseEvent *event); + void paintEvent(QPaintEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; QPixmap iconPixmap() const; +private: + QPoint topleftPoint() const; + QPoint popupMarkPoint() const; + private: PluginsItemInterface *m_pluginItem; QJsonObject m_metaData; QString m_itemKey; + Dock::Position m_position; + DockPopupWindow *m_popupWindow; + QMenu *m_contextMenu; }; #endif // QUICKPLUGINWINDOW_H diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index bfa651fdc..cd17498e7 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -318,6 +318,11 @@ void StretchPluginsItem::invokedMenuItem(const QString &itemId, const bool check m_pluginInter->invokedMenuItem(m_itemKey, itemId, checked); } +QWidget *StretchPluginsItem::popupTips() +{ + return m_pluginInter->itemTipsWidget(m_itemKey); +} + void StretchPluginsItem::mousePressEvent(QMouseEvent *e) { m_hover = false; diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 67af5bddc..9a74aca1d 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -90,6 +90,8 @@ protected: const QString contextMenu() const override; void invokedMenuItem(const QString &itemId, const bool checked) override; + QWidget *popupTips() override; + private: void mouseClick(); QFont textFont() const; diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index 1cef0370e..a9bd34b5f 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -53,6 +53,8 @@ TrayDelegate::TrayDelegate(QListView *view, QObject *parent) void TrayDelegate::setPositon(Dock::Position position) { m_position = position; + SNITrayItemWidget::setDockPostion(position); + SystemPluginItem::setDockPostion(m_position); } QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const @@ -107,7 +109,6 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem PluginsItemInterface *pluginInter = (PluginsItemInterface *)(index.data(TrayModel::PluginInterfaceRole).toULongLong()); if (pluginInter) { const QString itemKey = QuickSettingController::instance()->itemKey(pluginInter); - SystemPluginItem::setDockPostion(m_position); trayWidget = new SystemPluginItem(pluginInter, itemKey, parent); } } diff --git a/frame/window/tray/widgets/snitrayitemwidget.cpp b/frame/window/tray/widgets/snitrayitemwidget.cpp index e21befa84..820e8bedd 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.cpp +++ b/frame/window/tray/widgets/snitrayitemwidget.cpp @@ -21,7 +21,7 @@ #include "snitrayitemwidget.h" #include "themeappicon.h" -//#include "test/tipswidget.h" +#include "tipswidget.h" #include @@ -43,8 +43,9 @@ const QStringList ItemCategoryList {"ApplicationStatus", "Communications", "Syst const QStringList ItemStatusList {"Passive", "Active", "NeedsAttention"}; const QStringList LeftClickInvalidIdList {"sogou-qimpanel",}; QPointer SNITrayItemWidget::PopupWindow = nullptr; -Dock::Position SNITrayItemWidget::DockPosition = Dock::Position::Top; +Dock::Position SNITrayItemWidget::DockPosition = Dock::Position::Bottom; using namespace Dock; + SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *parent) : BaseTrayWidget(parent), m_menu(nullptr), @@ -54,6 +55,8 @@ SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *par , m_sniServicePath(sniServicePath) , m_popupTipsDelayTimer(new QTimer(this)) , m_handleMouseReleaseTimer(new QTimer(this)) + , m_tipsLabel(new TipsWidget) + , m_popupShown(false) { m_popupTipsDelayTimer->setInterval(500); m_popupTipsDelayTimer->setSingleShot(true); @@ -152,22 +155,12 @@ SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *par onSNIStatusChanged(m_sniInter->status()); }); - QMetaObject::invokeMethod(this, [ this ] { - m_sniIconName = m_sniInter->iconName(); - m_sniIconPixmap = m_sniInter->iconPixmap(); - m_sniIconThemePath = m_sniInter->iconThemePath(); - m_updateIconTimer->start(); + QMetaObject::invokeMethod(this, &SNITrayItemWidget::initMember, Qt::QueuedConnection); +} - m_sniOverlayIconName = m_sniInter->overlayIconName(); - m_sniOverlayIconPixmap = m_sniInter->overlayIconPixmap(); - m_sniIconThemePath = m_sniInter->iconThemePath(); - m_updateOverlayIconTimer->start(); - - m_sniAttentionIconName = m_sniInter->attentionIconName(); - m_sniAttentionIconPixmap = m_sniInter->attentionIconPixmap(); - m_sniIconThemePath = m_sniInter->iconThemePath(); - m_updateAttentionIconTimer->start(); - }, Qt::QueuedConnection); +SNITrayItemWidget::~SNITrayItemWidget() +{ + m_tipsLabel->deleteLater(); } QString SNITrayItemWidget::itemKeyForConfig() @@ -643,16 +636,31 @@ void SNITrayItemWidget::handleMouseRelease() } } +void SNITrayItemWidget::initMember() +{ + onSNIAttentionIconNameChanged(m_sniInter->attentionIconName()); + onSNIAttentionIconPixmapChanged(m_sniInter->attentionIconPixmap()); + onSNIAttentionMovieNameChanged(m_sniInter->attentionMovieName()); + onSNICategoryChanged(m_sniInter->category()); + onSNIIconNameChanged(m_sniInter->iconName()); + onSNIIconPixmapChanged(m_sniInter->iconPixmap()); + onSNIIconThemePathChanged(m_sniInter->iconThemePath()); + onSNIIdChanged(m_sniInter->id()); + onSNIMenuChanged(m_sniInter->menu()); + onSNIOverlayIconNameChanged(m_sniInter->overlayIconName()); + onSNIOverlayIconPixmapChanged(m_sniInter->overlayIconPixmap()); + onSNIStatusChanged(m_sniInter->status()); + + m_updateIconTimer->start(); + m_updateOverlayIconTimer->start(); + m_updateAttentionIconTimer->start(); +} + void SNITrayItemWidget::showHoverTips() { if (PopupWindow->model()) return; - // if not in geometry area - const QRect r(topleftPoint(), size()); - if (!r.contains(QCursor::pos())) - return; - QProcess p; p.start("qdbus", {m_dbusService}); if (!p.waitForFinished(1000)) { @@ -669,20 +677,16 @@ void SNITrayItemWidget::showHoverTips() if (tooltip.title.isEmpty()) return; -#ifdef QT_DEBUG - setToolTip(tooltip.title); -#else -// // 当提示信息中有换行符时,需要使用setTextList -// if (tooltip.title.contains('\n')) -// m_tipsLabel->setTextList(tooltip.title.split('\n')); -// else -// m_tipsLabel->setText(tooltip.title); + // 当提示信息中有换行符时,需要使用setTextList + if (tooltip.title.contains('\n')) + m_tipsLabel->setTextList(tooltip.title.split('\n')); + else + m_tipsLabel->setText(tooltip.title); -// m_tipsLabel->setAccessibleName(itemKeyForConfig().replace("sni:","")); + m_tipsLabel->setAccessibleName(itemKeyForConfig().replace("sni:","")); -// showPopupWindow(m_tipsLabel); -#endif + showPopupWindow(m_tipsLabel); } } diff --git a/frame/window/tray/widgets/snitrayitemwidget.h b/frame/window/tray/widgets/snitrayitemwidget.h index 1af8f46c3..e2d278df0 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.h +++ b/frame/window/tray/widgets/snitrayitemwidget.h @@ -30,13 +30,12 @@ #include #include -//DWIDGET_USE_NAMESPACE -//DGUI_USE_NAMESPACE + class DBusMenuImporter; -//namespace Dock { -//class TipsWidget; -//} -//using namespace com::deepin::dde; +namespace Dock { +class TipsWidget; +} + using namespace org::kde; /** @@ -54,6 +53,7 @@ public: public: SNITrayItemWidget(const QString &sniServicePath, QWidget *parent = Q_NULLPTR); + ~SNITrayItemWidget(); QString itemKeyForConfig() override; void updateIcon() override; @@ -112,6 +112,7 @@ private: QPixmap newIconPixmap(IconType iconType); void setMouseData(QMouseEvent *e); void handleMouseRelease(); + void initMember(); private: StatusNotifierItem *m_sniInter; @@ -148,7 +149,7 @@ private: QPair m_lastMouseReleaseData; static Dock::Position DockPosition; static QPointer PopupWindow; -// Dock::TipsWidget *m_tipsLabel; + Dock::TipsWidget *m_tipsLabel; bool m_popupShown; }; diff --git a/frame/window/tray/widgets/systempluginitem.cpp b/frame/window/tray/widgets/systempluginitem.cpp index bac7752bd..bc21dca9b 100644 --- a/frame/window/tray/widgets/systempluginitem.cpp +++ b/frame/window/tray/widgets/systempluginitem.cpp @@ -30,7 +30,7 @@ #include -Dock::Position SystemPluginItem::DockPosition = Dock::Position::Top; +Dock::Position SystemPluginItem::DockPosition = Dock::Position::Bottom; QPointer SystemPluginItem::PopupWindow = nullptr; SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) From ae74a6133f78d909ce74d775e34de726eaba3244 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 2 Nov 2022 06:57:46 +0000 Subject: [PATCH 106/257] =?UTF-8?q?fix:=20=E5=AE=9E=E7=8E=B0=E9=AB=98?= =?UTF-8?q?=E6=95=88=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=89=98=E7=9B=98=E5=92=8C?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E6=8F=92=E4=BB=B6=E6=8B=96=E5=8A=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高效模式下和时尚模式下托盘区域共用一个TrayModel,在拖动图标的时候,时尚模式和高效模式保持相同的状态 Log: 实现高效模式下图标的拖动功能 Influence: 高效模式,从托盘或快捷面板拖动图标到任务栏 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I279b572231ea8efc9bd7f1ee0e628e9ee3eb064e --- CMakeLists.txt | 2 +- configs/com.deepin.dde.dock.dconfig.json | 22 +- debian/dde-dock.install | 2 +- frame/controller/quicksettingcontroller.cpp | 27 +- frame/controller/quicksettingcontroller.h | 6 +- frame/util/platformutils.cpp | 57 +++ frame/util/platformutils.h | 15 + frame/util/settingconfig.cpp | 57 +++ frame/util/settingconfig.h | 60 +++ frame/window/docktraywindow.cpp | 106 +++++- frame/window/docktraywindow.h | 3 + frame/window/quickpluginmodel.cpp | 202 ++++++++++ frame/window/quickpluginmodel.h | 69 ++++ frame/window/quickpluginwindow.cpp | 357 +++++++++--------- frame/window/quickpluginwindow.h | 17 +- frame/window/quicksettingcontainer.cpp | 95 +++-- frame/window/quicksettingcontainer.h | 11 +- frame/window/systempluginwindow.cpp | 10 + frame/window/systempluginwindow.h | 4 + frame/window/tray/tray_delegate.cpp | 28 +- frame/window/tray/tray_delegate.h | 3 +- frame/window/tray/tray_gridview.cpp | 24 +- frame/window/tray/tray_gridview.h | 9 +- frame/window/tray/tray_model.cpp | 311 ++++++++++++--- frame/window/tray/tray_model.h | 41 +- frame/window/tray/tray_monitor.cpp | 49 +++ frame/window/tray/tray_monitor.h | 13 + .../window/tray/widgets/expandiconwidget.cpp | 159 ++++---- frame/window/tray/widgets/expandiconwidget.h | 14 +- .../tray/widgets/xembedtrayitemwidget.cpp | 67 +--- .../tray/widgets/xembedtrayitemwidget.h | 3 - frame/window/traymainwindow.cpp | 1 + frame/window/traymanagerwindow.cpp | 74 ++-- frame/window/traymanagerwindow.h | 6 + 34 files changed, 1403 insertions(+), 521 deletions(-) create mode 100644 frame/util/platformutils.cpp create mode 100644 frame/util/platformutils.h create mode 100644 frame/util/settingconfig.cpp create mode 100644 frame/util/settingconfig.h create mode 100644 frame/window/quickpluginmodel.cpp create mode 100644 frame/window/quickpluginmodel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c0a0ad527..7689c1b3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,7 +161,7 @@ install(FILES gschema/com.deepin.dde.dock.module.gschema.xml #dconfig file(GLOB DCONFIG_FILES "configs/*.json") -install(FILES ${DCONFIG_FILES} DESTINATION /usr/share/dsg/apps/dde-dock/configs/) +install(FILES ${DCONFIG_FILES} DESTINATION /usr/share/dsg/configs/dde-dock/) # Address Sanitizer 内存错误检测工具,打开下面的编译选项可以看到调试信息,正常运行时不需要这些信息 #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fsanitize=address -O2") diff --git a/configs/com.deepin.dde.dock.dconfig.json b/configs/com.deepin.dde.dock.dconfig.json index 19c01ddcd..1d17aa4d5 100644 --- a/configs/com.deepin.dde.dock.dconfig.json +++ b/configs/com.deepin.dde.dock.dconfig.json @@ -15,6 +15,26 @@ "description":"0 Mouse over show;1 Always show; 2 Always hide", "permissions":"readwrite", "visibility":"public" - } + }, + "Dock_Quick_Plugin_Name": { + "value": ["network", "sound", "power"], + "serial": 0, + "flags": [], + "name": "显示在任务栏上的快捷插件", + "name[zh_CN]": "*****", + "description": "记录哪些插件的图标在任务栏启动的时候显示在任务栏上", + "permissions": "readwrite", + "visibility": "private" + }, + "Dock_Quick_Tray_Name": { + "value": ["fcitx"], + "serial": 0, + "flags": [], + "name": "显示在任务栏上的托盘图标", + "name[zh_CN]": "任务栏上固定的托盘图标", + "description": "记录哪些托盘的图标在任务栏启动的时候显示在任务栏上", + "permissions": "readwrite", + "visibility": "private" + } } } \ No newline at end of file diff --git a/debian/dde-dock.install b/debian/dde-dock.install index 24a6e6da9..4ea0c2294 100644 --- a/debian/dde-dock.install +++ b/debian/dde-dock.install @@ -8,4 +8,4 @@ usr/lib/dde-dock/plugins/quick-trays usr/lib/dde-dock/plugins/libmultitasking.so usr/lib/dde-dock/plugins/libshow-desktop.so usr/lib/dde-dock/plugins/libkeyboard-layout.so -usr/share/dsg/apps/dde-dock/configs/ +usr/share/dsg/configs/dde-dock/ diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 7c72f6a42..4f05ec6c5 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -39,12 +39,19 @@ QuickSettingController::~QuickSettingController() void QuickSettingController::pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { // 根据读取到的metaData数据获取当前插件的类型,提供给外部 - PluginAttribute pluginClass = getPluginClass(itemInter); + PluginAttribute pluginAttr = pluginAttribute(itemInter); - m_quickPlugins[pluginClass] << itemInter; + m_quickPlugins[pluginAttr] << itemInter; m_quickPluginsMap[itemInter] = itemKey; - emit pluginInserted(itemInter, pluginClass); + emit pluginInserted(itemInter, pluginAttr); +} + +void QuickSettingController::pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &) +{ + updateDockInfo(itemInter, DockPart::QuickPanel); + updateDockInfo(itemInter, DockPart::QuickShow); + updateDockInfo(itemInter, DockPart::SystemPanel); } void QuickSettingController::pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &) @@ -72,18 +79,18 @@ void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInt Q_EMIT pluginUpdated(itemInter, part); } -QuickSettingController::PluginAttribute QuickSettingController::getPluginClass(PluginsItemInterface * const itemInter) const +QuickSettingController::PluginAttribute QuickSettingController::pluginAttribute(PluginsItemInterface * const itemInter) const { QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter); if (!pluginLoader) return PluginAttribute::Quick; - if (pluginLoader->fileName().contains("/plugins/system-trays")) { + if (pluginLoader->fileName().contains(TRAY_PATH)) { // 如果是从系统目录下加载的插件,则认为它是系统插件,此时需要放入到托盘中 return PluginAttribute::Tray; } - QJsonObject meta = pluginLoader->metaData().value("MetaData").toObject(); + const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); if (meta.contains("tool") && meta.value("tool").toBool()) { // 如果有tool标记,则认为它是工具插件,例如回收站和窗管提供的相关插件 return PluginAttribute::Tool; @@ -145,10 +152,10 @@ QList QuickSettingController::pluginInSettings() QMap> &plugins = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginsMap(); QList allPlugins = plugins.keys(); for (PluginsItemInterface *plugin : allPlugins) { - PluginAttribute pluginClass = getPluginClass(plugin); - if (pluginClass == QuickSettingController::PluginAttribute::Quick - || pluginClass == QuickSettingController::PluginAttribute::System - || pluginClass == QuickSettingController::PluginAttribute::Tool) + PluginAttribute pluginAttr = pluginAttribute(plugin); + if (pluginAttr == QuickSettingController::PluginAttribute::Quick + || pluginAttr == QuickSettingController::PluginAttribute::System + || pluginAttr == QuickSettingController::PluginAttribute::Tool) settingPlugins << plugin; } diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 63336d5e9..e129da755 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -46,6 +46,7 @@ public: QJsonObject metaData(PluginsItemInterface *pluginItem) const; PluginsItem *pluginItemWidget(PluginsItemInterface *pluginItem); QList pluginInSettings(); + PluginAttribute pluginAttribute(PluginsItemInterface * const itemInter) const; Q_SIGNALS: void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute &); @@ -58,7 +59,7 @@ protected: protected: void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &) override {} + void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &) override; void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &) override; void requestPluginWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} void requestRefreshPluginWindowVisible(PluginsItemInterface * const, const QString &) override {} @@ -66,9 +67,6 @@ protected: void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; -private: - PluginAttribute getPluginClass(PluginsItemInterface * const itemInter) const; - private: QMap> m_quickPlugins; QMap m_quickPluginsMap; diff --git a/frame/util/platformutils.cpp b/frame/util/platformutils.cpp new file mode 100644 index 000000000..17ba90efb --- /dev/null +++ b/frame/util/platformutils.cpp @@ -0,0 +1,57 @@ +#include "platformutils.h" +#include "utils.h" + +#include + +#include + +#define NORMAL_WINDOW_PROP_NAME "WM_CLASS" +#define WINE_WINDOW_PROP_NAME "__wine_prefix" +#define IS_WINE_WINDOW_BY_WM_CLASS "explorer.exe" + +QString PlatformUtils::getAppNameForWindow(quint32 winId) +{ + // is normal application + QString appName = getWindowProperty(winId, NORMAL_WINDOW_PROP_NAME); + if (!appName.isEmpty() && appName != IS_WINE_WINDOW_BY_WM_CLASS) + return appName; + + // is wine application + appName = getWindowProperty(winId, WINE_WINDOW_PROP_NAME).split("/").last(); + if (!appName.isEmpty()) + return appName; + + // fallback to window id + return QString::number(winId); +} + +QString PlatformUtils::getWindowProperty(quint32 winId, QString propName) +{ + const auto display = Utils::IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + return QString(); + } + + Atom atom_prop = XInternAtom(display, propName.toLocal8Bit(), true); + if (!atom_prop) { + qDebug() << "Error: get window property failed, invalid property atom"; + return QString(); + } + + Atom actual_type_return; + int actual_format_return; + unsigned long nitems_return; + unsigned long bytes_after_return; + unsigned char *prop_return; + + int r = XGetWindowProperty(display, winId, atom_prop, 0, 100, false, AnyPropertyType, + &actual_type_return, &actual_format_return, &nitems_return, + &bytes_after_return, &prop_return); + + Q_UNUSED(r); + if (Utils::IS_WAYLAND_DISPLAY) + XCloseDisplay(display); + + return QString::fromLocal8Bit((char*)prop_return); +} diff --git a/frame/util/platformutils.h b/frame/util/platformutils.h new file mode 100644 index 000000000..42ed3044a --- /dev/null +++ b/frame/util/platformutils.h @@ -0,0 +1,15 @@ +#ifndef PLATFORMUTILS_H +#define PLATFORMUTILS_H + +#include + +class PlatformUtils +{ +public: + static QString getAppNameForWindow(quint32 winId); + +private: + static QString getWindowProperty(quint32 winId, QString propName); +}; + +#endif // PLATFORMUTILS_H diff --git a/frame/util/settingconfig.cpp b/frame/util/settingconfig.cpp new file mode 100644 index 000000000..1c505ead8 --- /dev/null +++ b/frame/util/settingconfig.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "settingconfig.h" + +#include + +DCORE_USE_NAMESPACE + +SettingConfig *SettingConfig::instance() +{ + static SettingConfig instance; + return &instance; +} + +void SettingConfig::setValue(const QString &key, const QVariant &value) +{ + if (m_config->isValid() && m_config->keyList().contains(key)) + m_config->setValue(key, value); +} + +QVariant SettingConfig::value(const QString &key) const +{ + if (m_config->isValid() && m_config->keyList().contains(key)) + return m_config->value(key); + + return QVariant(); +} + +SettingConfig::SettingConfig(QObject *parent) + : QObject(parent) + , m_config(new DConfig(QString("com.deepin.dde.dock.dconfig"), QString())) +{ + connect(m_config, &DConfig::valueChanged, this, &SettingConfig::onValueChanged); +} + +void SettingConfig::onValueChanged(const QString &key) +{ + Q_EMIT valueChanged(key, m_config->value(key)); +} diff --git a/frame/util/settingconfig.h b/frame/util/settingconfig.h new file mode 100644 index 000000000..ceddb5994 --- /dev/null +++ b/frame/util/settingconfig.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef SETTINGCONFIG_H +#define SETTINGCONFIG_H + +#include + +#include +#include + +DCORE_BEGIN_NAMESPACE +class DConfig; +DCORE_END_NAMESPACE + +DCORE_USE_NAMESPACE + +#define SETTINGCONFIG SettingConfig::instance() + +class SettingConfig : public QObject +{ + Q_OBJECT + +public: + static SettingConfig *instance(); + + void setValue(const QString &key, const QVariant &value); + QVariant value(const QString &key) const; + +Q_SIGNALS: + void valueChanged(const QString &key, const QVariant &value); + +protected: + explicit SettingConfig(QObject *parent = nullptr); + +private Q_SLOTS: + void onValueChanged(const QString &key); + +private: + DConfig *m_config; +}; + +#endif // SETTINGCONFIG_H diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 34fa4f815..a784d19d8 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -27,6 +27,7 @@ #include "tray_delegate.h" #include "quicksettingcontroller.h" #include "pluginsitem.h" +#include "quicksettingcontainer.h" #include @@ -50,15 +51,12 @@ DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent) , m_systemPuginWidget(new SystemPluginWindow(this)) , m_quickIconWidget(new QuickPluginWindow(this)) , m_trayView(new TrayGridView(this)) - , m_model(new TrayModel(m_trayView, false, true, this)) + , m_model(TrayModel::getDockModel()) , m_delegate(new TrayDelegate(m_trayView, this)) { initUi(); initConnection(); - - m_trayView->setModel(m_model); - m_trayView->setItemDelegate(m_delegate); - m_trayView->openPersistentEditor(m_model->index(0, 0)); + initAttribute(); } void DockTrayWindow::setPositon(const Dock::Position &position) @@ -69,9 +67,11 @@ void DockTrayWindow::setPositon(const Dock::Position &position) m_quickIconWidget->setPositon(position); m_trayView->setPosition(position); m_delegate->setPositon(position); - QModelIndex index = m_model->index(0, 0); - m_trayView->closePersistentEditor(index); - m_trayView->openPersistentEditor(index); + if (m_model->hasExpand()) { + // 切换位置的时候,需要重新关闭编辑器,然后在model的flag函数中再打开,防止图标的方向没有切换过来 + QModelIndex index = m_model->index(0, 0); + m_trayView->closePersistentEditor(index); + } updateLayout(position); onResetLayout(); } @@ -153,6 +153,41 @@ void DockTrayWindow::paintEvent(QPaintEvent *event) painter.fillRect(m_toolLineLabel->geometry(), color); } +bool DockTrayWindow::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == this || watched == m_toolWidget || watched == m_dateTimeWidget + || watched == m_trayView) { + switch (event->type()) { + case QEvent::Drop: { + QDropEvent *dropEvent = static_cast(event); + onDropIcon(dropEvent); + break; + } + case QEvent::DragEnter: { + QDragEnterEvent *dragEnterEvent = static_cast(event); + dragEnterEvent->setDropAction(Qt::CopyAction); + dragEnterEvent->accept(); + return true; + } + case QEvent::DragMove: { + QDragMoveEvent *dragMoveEvent = static_cast(event); + dragMoveEvent->setDropAction(Qt::CopyAction); + dragMoveEvent->accept(); + return true; + } + case QEvent::DragLeave: { + QDragLeaveEvent *dragLeaveEvent = static_cast(event); + dragLeaveEvent->accept(); + break; + } + default: + break; + } + } + + return QWidget::eventFilter(watched, event); +} + /** 根据任务栏的位置来更新布局的方向 * @brief DockTrayWindow::updateLayout * @param position @@ -264,11 +299,6 @@ void DockTrayWindow::initUi() m_mainBoxLayout->addWidget(m_trayView); m_mainBoxLayout->setAlignment(m_toolLineLabel, Qt::AlignCenter); - WinInfo info; - info.type = TrayIconType::ExpandIcon; - m_model->addRow(info); - m_trayView->openPersistentEditor(m_model->index(0, 0)); - m_toolLineLabel->setFixedSize(0, 0); m_mainBoxLayout->addStretch(); @@ -279,8 +309,20 @@ void DockTrayWindow::initConnection() connect(m_systemPuginWidget, &SystemPluginWindow::itemChanged, this, &DockTrayWindow::onResetLayout); connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &DockTrayWindow::onResetLayout); connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, &DockTrayWindow::onResetLayout); + connect(m_quickIconWidget, &QuickPluginWindow::requestDrop, this, &DockTrayWindow::onDropIcon); + connect(m_systemPuginWidget, &SystemPluginWindow::requestDrop, this, &DockTrayWindow::onDropIcon); + connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onResetLayout); + connect(m_model, &TrayModel::rowCountChanged, this, &DockTrayWindow::onResetLayout); + connect(m_model, &TrayModel::rowCountChanged, m_trayView, &TrayGridView::onUpdateEditorView); + connect(m_model, &TrayModel::requestRefreshEditor, m_trayView, &TrayGridView::onUpdateEditorView); + connect(m_trayView, &TrayGridView::dragLeaved, m_delegate, [ this ]{ + Q_EMIT m_delegate->requestDrag(true); + }); + connect(m_trayView, &TrayGridView::dragEntered, m_delegate, [ this ]{ + Q_EMIT m_delegate->requestDrag(false); + }); connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ] (PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { switch (pluginAttr) { case QuickSettingController::PluginAttribute::Tool: @@ -295,6 +337,24 @@ void DockTrayWindow::initConnection() connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, &DockTrayWindow::onItemRemove); } +void DockTrayWindow::initAttribute() +{ + setAcceptDrops(true); + setMouseTracking(true); + + m_trayView->setModel(m_model); + m_trayView->setItemDelegate(m_delegate); + m_trayView->setDragDistance(2); + m_trayView->setDragEnabled(true); + + installEventFilter(this); + m_toolWidget->installEventFilter(this); + m_dateTimeWidget->installEventFilter(this); + m_systemPuginWidget->installEventFilter(this); + m_quickIconWidget->installEventFilter(this); + m_trayView->installEventFilter(this); +} + void DockTrayWindow::onResetLayout() { switch(m_position) { @@ -349,3 +409,23 @@ void DockTrayWindow::onItemRemove(PluginsItemInterface *itemInter) break; } } + +void DockTrayWindow::onDropIcon(QDropEvent *dropEvent) +{ + if (!dropEvent || !dropEvent->mimeData() || dropEvent->source() == this) + return; + + if (qobject_cast(dropEvent->source())) { + const QuickPluginMimeData *mimeData = qobject_cast(dropEvent->mimeData()); + if (!mimeData) + return; + + PluginsItemInterface *pluginItem = static_cast(mimeData->pluginItemInterface()); + if (pluginItem) + m_quickIconWidget->dragPlugin(pluginItem); + } else if (qobject_cast(dropEvent->source())) { + // 将trayView中的dropEvent扩大到整个区域(this),这样便于随意拖动到这个区域都可以捕获。 + // m_trayView中有e->accept不会导致事件重复处理。 + m_trayView->handleDropEvent(dropEvent); + } +} diff --git a/frame/window/docktraywindow.h b/frame/window/docktraywindow.h index fb1bffbbf..eb5f2def9 100644 --- a/frame/window/docktraywindow.h +++ b/frame/window/docktraywindow.h @@ -58,10 +58,12 @@ Q_SIGNALS: protected: void resizeEvent(QResizeEvent *event) override; void paintEvent(QPaintEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private: void initUi(); void initConnection(); + void initAttribute(); void updateLayout(const Dock::Position &position); void resizeTool() const; bool pluginExists(PluginsItemInterface *itemInter) const; @@ -71,6 +73,7 @@ private Q_SLOTS: void onResetLayout(); void onItemAdded(PluginsItemInterface *itemInter); void onItemRemove(PluginsItemInterface *itemInter); + void onDropIcon(QDropEvent *dropEvent); private: DockInter *m_dockInter; diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp new file mode 100644 index 000000000..5d2699ff7 --- /dev/null +++ b/frame/window/quickpluginmodel.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "quickpluginmodel.h" +#include "pluginsiteminterface.h" +#include "quicksettingcontroller.h" +#include "settingconfig.h" + +static QStringList fixedPluginNames { "network", "sound", "power" }; +#define PLUGINNAMEKEY "Dock_Quick_Plugin_Name" + +QuickPluginModel *QuickPluginModel::instance() +{ + static QuickPluginModel instance; + return &instance; +} + +void QuickPluginModel::addPlugin(PluginsItemInterface *itemInter, int index) +{ + // 这里只接受快捷面板的插件,因此,需要做一次判断 + if (QuickSettingController::instance()->pluginAttribute(itemInter) != QuickSettingController::PluginAttribute::Quick) + return; + + if (index < 0) { + // 如果索引值小于0,则认为它插在最后面 + index = m_dockedPluginIndex.size(); + } + + // 如果插入的插件在原来的插件列表中存在,并且位置相同,则不做任何的处理 + int oldIndex = m_dockedPluginIndex.contains(itemInter->pluginName()); + if (oldIndex == index && m_dockedPluginsItems.contains(itemInter)) + return; + + m_dockedPluginIndex[itemInter->pluginName()] = index; + if (!m_dockedPluginsItems.contains(itemInter)) { + m_dockedPluginsItems << itemInter; + // 保存配置到dConfig中 + saveConfig(); + } + // 向外发送更新列表的信号 + Q_EMIT requestUpdate(); +} + +void QuickPluginModel::removePlugin(PluginsItemInterface *itemInter) +{ + if (!m_dockedPluginsItems.contains(itemInter) && !m_dockedPluginIndex.contains(itemInter->pluginName())) + return; + + if (m_dockedPluginIndex.contains(itemInter->pluginName())) { + m_dockedPluginIndex.remove(itemInter->pluginName()); + // 保存配置到DConfig中 + saveConfig(); + } + + if (m_dockedPluginsItems.contains(itemInter)) { + m_dockedPluginsItems.removeOne(itemInter); + Q_EMIT requestUpdate(); + } +} + +QList QuickPluginModel::dockedPluginItems() const +{ + // 先查找出固定插件,始终排列在最前面 + QList dockedItems; + QList activedItems; + for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { + if (fixedPluginNames.contains(itemInter->pluginName())) + dockedItems << itemInter; + else + activedItems << itemInter; + } + std::sort(dockedItems.begin(), dockedItems.end(), [ this ](PluginsItemInterface *item1, PluginsItemInterface *item2) { + return m_dockedPluginIndex.value(item1->pluginName()) < m_dockedPluginIndex.value(item2->pluginName()); + }); + std::sort(activedItems.begin(), activedItems.end(), [ this ](PluginsItemInterface *item1, PluginsItemInterface *item2) { + return m_dockedPluginIndex.value(item1->pluginName()) < m_dockedPluginIndex.value(item2->pluginName()); + }); + return (QList() << dockedItems << activedItems); +} + +bool QuickPluginModel::isDocked(PluginsItemInterface *itemInter) const +{ + return (m_dockedPluginsItems.contains(itemInter)); +} + +bool QuickPluginModel::isFixed(PluginsItemInterface *itemInter) const +{ + return fixedPluginNames.contains(itemInter->pluginName()); +} + +QuickPluginModel::QuickPluginModel(QObject *parent) + : QObject(parent) +{ + initConnection(); + initConfig(); +} + +void QuickPluginModel::onPluginRemoved(PluginsItemInterface *itemInter) +{ + // 如果插件移除,无需移除下方的排序设置,因为下次插件插入的时候还会插入到下方任务栏 + // 因此,此处只需要从列表中移除当前插件 + if (m_dockedPluginsItems.contains(itemInter)) + m_dockedPluginsItems.removeOne(itemInter); + // 向外发送更新列表的信号 + Q_EMIT requestUpdate(); +} + +void QuickPluginModel::onSettingChanged(const QString &key, const QVariant &value) +{ + if (key != PLUGINNAMEKEY) + return; + QStringList localOrder = m_dockedPluginIndex.keys(); + std::sort(localOrder.begin(), localOrder.end(), [ = ](const QString &key1, const QString &key2) { + return m_dockedPluginIndex.value(key1) < m_dockedPluginIndex.value(key2); + }); + if (localOrder == value.toStringList()) + return; + + // 当配置发生变化的时候,更新任务栏的插件显示 + // 1、将当前现有的插件列表中不在配置中的插件移除 + localOrder = value.toStringList(); + for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { + if (localOrder.contains(itemInter->pluginName())) + continue; + + m_dockedPluginsItems.removeOne(itemInter); + m_dockedPluginIndex.remove(itemInter->pluginName()); + } + // 2、将配置中已有的但是插件列表中没有的插件移动到任务栏上 + QList plugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick); + for (PluginsItemInterface *plugin : plugins) { + if (m_dockedPluginsItems.contains(plugin) || !localOrder.contains(plugin->pluginName())) + continue; + + m_dockedPluginsItems << plugin; + } + + m_dockedPluginIndex.clear(); + for (int i = 0; i < localOrder.size(); i++) + m_dockedPluginIndex[localOrder[i]] = i; + + Q_EMIT requestUpdate(); +} + +void QuickPluginModel::initConnection() +{ + QuickSettingController *quickController = QuickSettingController::instance(); + connect(quickController, &QuickSettingController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &plugAttr) { + if (plugAttr != QuickSettingController::PluginAttribute::Quick) + return; + + // 用来读取已经固定在下方的插件 + if (!m_dockedPluginIndex.contains(itemInter->pluginName())) + return; + + m_dockedPluginsItems << itemInter; + + // 向外发送更新列表的信号 + Q_EMIT requestUpdate(); + }); + + connect(quickController, &QuickSettingController::pluginRemoved, this, &QuickPluginModel::onPluginRemoved); + connect(quickController, &QuickSettingController::pluginUpdated, this, &QuickPluginModel::requestUpdatePlugin); + connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &QuickPluginModel::onSettingChanged); +} + +void QuickPluginModel::initConfig() +{ + // 此处用于读取dConfig配置,记录哪些插件是固定在任务栏上面的 + QStringList dockPluginsName = SETTINGCONFIG->value(PLUGINNAMEKEY).toStringList(); + for (int i = 0; i < dockPluginsName.size(); i++) + m_dockedPluginIndex[dockPluginsName[i]] = i; +} + +void QuickPluginModel::saveConfig() +{ + QStringList plugins; + for (auto it = m_dockedPluginIndex.begin(); it != m_dockedPluginIndex.end(); it++) { + plugins << it.key(); + } + std::sort(plugins.begin(), plugins.end(), [ this ](const QString &p1, const QString &p2) { + return m_dockedPluginIndex.value(p1) < m_dockedPluginIndex.value(p2); + }); + SETTINGCONFIG->setValue(PLUGINNAMEKEY, plugins); +} diff --git a/frame/window/quickpluginmodel.h b/frame/window/quickpluginmodel.h new file mode 100644 index 000000000..f028ef7de --- /dev/null +++ b/frame/window/quickpluginmodel.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef QUICKPLUGINMODEL_H +#define QUICKPLUGINMODEL_H + +#include +#include + +class PluginsItemInterface; +enum class DockPart; +/** + * 这是一个独立的Model,用来记录显示在任务栏下方的快捷插件 + * @brief The QuickPluginModel class + */ + +class QuickPluginModel : public QObject +{ + Q_OBJECT + +public: + static QuickPluginModel *instance(); + + void addPlugin(PluginsItemInterface *itemInter, int index = -1); + void removePlugin(PluginsItemInterface *itemInter); + + QList dockedPluginItems() const; + bool isDocked(PluginsItemInterface *itemInter) const; + bool isFixed(PluginsItemInterface *itemInter) const; + +Q_SIGNALS: + void requestUpdate(); + void requestUpdatePlugin(PluginsItemInterface *, const DockPart &); + +protected: + explicit QuickPluginModel(QObject *parent = nullptr); + +private Q_SLOTS: + void onPluginRemoved(PluginsItemInterface *itemInter); + void onSettingChanged(const QString &key, const QVariant &value); + +private: + void initConnection(); + void initConfig(); + void saveConfig(); + +private: + QList m_dockedPluginsItems; + QMap m_dockedPluginIndex; +}; + +#endif // QUICKPLUGINMODEL_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index efe58c51a..ee3a12331 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -25,6 +25,7 @@ #include "quicksettingcontainer.h" #include "appdrag.h" #include "proxyplugincontroller.h" +#include "quickpluginmodel.h" #include #include @@ -43,25 +44,48 @@ #define ICONWIDTH 18 #define ICONHEIGHT 16 -static QStringList fixedPluginNames{ "network", "sound", "power" }; +typedef struct DragInfo{ + QPoint dragPoint; + QuickDockItem *dockItem = nullptr; -const int itemDataRole = Dtk::UserRole + 1; -const int itemSortRole = Dtk::UserRole + 2; + void reset() { + dockItem = nullptr; + dragPoint.setX(0); + dragPoint.setY(0); + } + + bool isNull() const { + return (!dockItem); + } + + bool canDrag(QPoint currentPoint) const { + if (dragPoint.isNull()) + return false; + + return (qAbs(currentPoint.x() - dragPoint.x()) >=5 || + qAbs(currentPoint.y() - dragPoint.y()) >= 5); + } +} DragInfo; + +static QStringList fixedPluginNames{ "network", "sound", "power" }; QuickPluginWindow::QuickPluginWindow(QWidget *parent) : QWidget(parent) , m_mainLayout(new QBoxLayout(QBoxLayout::RightToLeft, this)) , m_position(Dock::Position::Bottom) + , m_dragInfo(new DragInfo) { initUi(); initConnection(); + installEventFilter(this); setAcceptDrops(true); setMouseTracking(true); } QuickPluginWindow::~QuickPluginWindow() { + delete m_dragInfo; } void QuickPluginWindow::initUi() @@ -71,14 +95,6 @@ void QuickPluginWindow::initUi() m_mainLayout->setDirection(QBoxLayout::RightToLeft); m_mainLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0); m_mainLayout->setSpacing(ITEMSPACE); - QList items = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick); - for (PluginsItemInterface *pluginItem : items) { - const QString pluginName = pluginItem->pluginName(); - if (!fixedPluginNames.contains(pluginName)) - continue; - - addPlugin(pluginItem); - } } void QuickPluginWindow::setPositon(Position position) @@ -97,40 +113,29 @@ void QuickPluginWindow::setPositon(Position position) } } -int QuickPluginWindow::findActiveTargetIndex(QuickDockItem *widget) -{ - for (int i = 0; i < m_activeSettingItems.size(); i++) { - PluginsItemInterface *settingItem = m_activeSettingItems[i]; - if (widget->pluginItem() == settingItem) - return i; - } - - return -1; -} - void QuickPluginWindow::dragPlugin(PluginsItemInterface *item) { - // 释放插件,一般是从快捷设置面板区域移动到这里的,固定插件不支持拖动 - if (fixedPluginNames.contains(item->pluginName())) - return; - + QuickPluginModel *quickModel = QuickPluginModel::instance(); QPoint itemPoint = mapFromGlobal(QCursor::pos()); // 查找移动后的位置,如果移动后的插件找不到,就直接放到最后 + int index = -1; QuickDockItem *targetWidget = qobject_cast(childAt(itemPoint)); - if (!targetWidget) { - m_activeSettingItems << item; - } else { + if (targetWidget) { // 如果是拖动到固定插件区域,也放到最后 - int targetIndex = findActiveTargetIndex(targetWidget); - if (targetIndex < 0) - m_activeSettingItems << item; - else - m_activeSettingItems.insert(targetIndex, item); + QList pluginItems = quickModel->dockedPluginItems(); + for (int i = 0; i < pluginItems.size(); i++) { + PluginsItemInterface *plugin = pluginItems[i]; + if (quickModel->isFixed(plugin)) + continue; + + if (targetWidget->pluginItem() == plugin) { + index = i; + break; + } + } } - //排序插入到当前窗体 - resetPluginDisplay(); - Q_EMIT itemCountChanged(); + quickModel->addPlugin(item, index); } QSize QuickPluginWindow::suitableSize() const @@ -138,41 +143,6 @@ QSize QuickPluginWindow::suitableSize() const return suitableSize(m_position); } -void QuickPluginWindow::addPlugin(PluginsItemInterface *pluginItem) -{ - if (!isQuickPlugin(pluginItem)) - return; - - for (int i = 0; i < m_mainLayout->count(); i++) { - QLayoutItem *layoutItem = m_mainLayout->itemAt(i); - if (!layoutItem) - continue; - - QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); - if (!dockItem) - continue; - - if (pluginItem == dockItem->pluginItem()) { - resetPluginDisplay(); - return; - } - } - if (fixedPluginNames.contains(pluginItem->pluginName())) { - // 新插入的插件如果是固定插件,则将其插入到固定插件列表中,并对其进行排序 - m_fixedSettingItems << pluginItem; - qSort(m_fixedSettingItems.begin(), m_fixedSettingItems.end(), [](PluginsItemInterface *item1, PluginsItemInterface *item2) { - int index1 = fixedPluginNames.indexOf(item1->pluginName()); - int index2 = fixedPluginNames.indexOf(item2->pluginName()); - return index1 < index2; - }); - } else { - // 如果是非固定插件,则直接插入到末尾 - m_activeSettingItems << pluginItem; - } - resetPluginDisplay(); - Q_EMIT itemCountChanged(); -} - QSize QuickPluginWindow::suitableSize(const Dock::Position &position) const { if (position == Dock::Position::Top || position == Dock::Position::Bottom) @@ -190,19 +160,6 @@ QSize QuickPluginWindow::suitableSize(const Dock::Position &position) const return QSize(ITEMSIZE, height); } -void QuickPluginWindow::removePlugin(PluginsItemInterface *item) -{ - if (m_fixedSettingItems.contains(item)) - m_fixedSettingItems.removeOne(item); - else if (m_activeSettingItems.contains(item)) - m_activeSettingItems.removeOne(item); - else - return; - - resetPluginDisplay(); - Q_EMIT itemCountChanged(); -} - PluginsItemInterface *QuickPluginWindow::findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems) { QuickDockItem *selectWidget = qobject_cast(childAt(mousePoint)); @@ -218,15 +175,105 @@ PluginsItemInterface *QuickPluginWindow::findQuickSettingItem(const QPoint &mous return nullptr; } -void QuickPluginWindow::mousePressEvent(QMouseEvent *event) +bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) { - // 查找非固定的图标,然后执行拖动 - PluginsItemInterface *quickItem = findQuickSettingItem(event->pos(), m_activeSettingItems); - if (!quickItem) - return; + switch (event->type()) { + case QEvent::MouseButtonPress: { + QuickDockItem *dockItem = qobject_cast(watched); + if (!dockItem) + break; - // 如果不是固定图标,则让其拖动 - startDrag(quickItem); + QMouseEvent *mouseEvent = static_cast(event); + m_dragInfo->dockItem = dockItem; + m_dragInfo->dragPoint = mouseEvent->pos(); + break; + } + case QEvent::MouseButtonRelease: { + if (m_dragInfo->isNull()) + break; + + QMouseEvent *mouseEvent = static_cast(event); + if (!m_dragInfo->canDrag(mouseEvent->pos())) { + // 弹出快捷设置面板 + DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); + popWindow->show(popupPoint()); + } + m_dragInfo->reset(); + break; + } + case QEvent::MouseMove: { + if (m_dragInfo->isNull()) + break; + + QMouseEvent *mouseEvent = static_cast(event); + if (m_dragInfo->canDrag(mouseEvent->pos())) { + startDrag(m_dragInfo->dockItem->pluginItem()); + m_dragInfo->reset(); + } + break; + } + case QEvent::Drop: { + Q_EMIT requestDrop(static_cast(event)); + break; + } + default: + break; + } + return QWidget::eventFilter(watched, event); +} + +void QuickPluginWindow::onRequestUpdate() +{ + bool countChanged = false; + QuickPluginModel *model = QuickPluginModel::instance(); + QList plugins = model->dockedPluginItems(); + // 先删除所有的widget + QMap pluginItems; + for (int i = m_mainLayout->count() - 1; i >= 0; i--) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); + if (!dockItem) + continue; + + dockItem->setParent(nullptr); + m_mainLayout->removeItem(layoutItem); + if (plugins.contains(dockItem->pluginItem())) { + // 如果该插件在任务栏上,则先将其添加到临时列表中 + pluginItems[dockItem->pluginItem()] = dockItem; + } else { + // 如果该插件不在任务栏上,则先删除 + dockItem->deleteLater(); + countChanged = true; + } + } + + // 将列表中所有的控件按照顺序添加到布局上 + QuickSettingController *quickController = QuickSettingController::instance(); + for (PluginsItemInterface *item : plugins) { + QuickDockItem *itemWidget = nullptr; + if (pluginItems.contains(item)) { + itemWidget = pluginItems[item]; + } else { + QJsonObject metaData; + QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(item); + if (pluginLoader) + metaData = pluginLoader->metaData().value("MetaData").toObject(); + + itemWidget = new QuickDockItem(item, metaData, quickController->itemKey(item), this); + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + itemWidget->installEventFilter(this); + itemWidget->setMouseTracking(true); + countChanged = true; + } + itemWidget->setParent(this); + m_mainLayout->addWidget(itemWidget); + } + + if (countChanged) + Q_EMIT itemCountChanged(); } QPoint QuickPluginWindow::popupPoint() const @@ -259,18 +306,6 @@ QPoint QuickPluginWindow::popupPoint() const return pointCurrent; } -void QuickPluginWindow::onFixedClick() -{ - // 查找固定团图标,然后点击弹出快捷面板 - QuickDockItem *dockItem = qobject_cast(sender()); - if (!dockItem || !fixedPluginNames.contains(dockItem->pluginItem()->pluginName())) - return; - - // 弹出快捷设置面板 - DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); - popWindow->show(popupPoint()); -} - void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart) { //update plugin status @@ -293,7 +328,8 @@ void QuickPluginWindow::startDrag(PluginsItemInterface *moveItem) drag->setHotSpot(QPoint(0, 0)); connect(drag->appDragWidget(), &AppDragWidget::requestSplitWindow, this, [ this, moveItem ] { - removePlugin(moveItem); + QuickPluginModel::instance()->removePlugin(moveItem); + Q_EMIT itemCountChanged(); }); connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, &QuickPluginWindow::onPluginDropItem); @@ -323,20 +359,34 @@ QuickDockItem *QuickPluginWindow::getDockItemByPlugin(PluginsItemInterface *item return nullptr; } -bool QuickPluginWindow::isQuickPlugin(PluginsItemInterface *pluginItem) +QuickDockItem *QuickPluginWindow::getActiveDockItem(QPoint point) const { - QJsonObject metaData = QuickSettingController::instance()->metaData(pluginItem); - if (metaData.contains("tool")) - return !metaData.value("tool").toBool(); + QuickDockItem *selectWidget = qobject_cast(childAt(point)); + if (!selectWidget) + return nullptr; - return true; + // 如果当前图标是固定插件,则不让插入 + if (QuickPluginModel::instance()->isFixed(selectWidget->pluginItem())) + return nullptr; + + return selectWidget; } int QuickPluginWindow::getDropIndex(QPoint point) { - QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(point, m_activeSettingItems)); - if (targetItem) - return m_activeSettingItems.indexOf(targetItem->pluginItem()); + QuickDockItem *targetItem = getActiveDockItem(point); + if (targetItem) { + for (int i = 0; i < m_mainLayout->count(); i++) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + if (layoutItem->widget() == targetItem) + return i; + } + + return -1; + } // 上下方向从右向左排列 if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { @@ -384,14 +434,7 @@ void QuickPluginWindow::onPluginDropItem(QDropEvent *event) // 获取当前鼠标在任务栏快捷图标区域的位置 QPoint currentPoint = mapFromGlobal(QCursor::pos()); // 获取区域图标插入的位置 - int dropIndex = getDropIndex(currentPoint); - if (dropIndex >= 0) - m_activeSettingItems.insert(dropIndex, data->pluginItemInterface()); - else - m_activeSettingItems << data->pluginItemInterface(); - - resetPluginDisplay(); - Q_EMIT itemCountChanged(); + QuickPluginModel::instance()->addPlugin(data->pluginItemInterface(), getDropIndex(currentPoint)); } void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) @@ -407,7 +450,7 @@ void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) return; QuickDockItem *sourceMoveWidget = getDockItemByPlugin(sourceItem); - QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(currentPoint, m_activeSettingItems)); + QuickDockItem *targetItem = getActiveDockItem(currentPoint); // 如果未找到要移动的目标位置,或者移动的目标位置是固定插件,或者原插件和目标插件是同一个插件,则不做任何操作 if (!sourceMoveWidget || !targetItem || sourceMoveWidget == targetItem) return; @@ -419,77 +462,21 @@ void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) allItems[childWidget] = i; } // 调整列表中的位置 - int sourceIndex = m_activeSettingItems.indexOf(sourceItem); +/* int sourceIndex = m_activeSettingItems.indexOf(sourceItem); int targetIndex = m_activeSettingItems.indexOf(targetItem->pluginItem()); if (sourceIndex >= 0) m_activeSettingItems.move(sourceIndex, targetIndex); else m_activeSettingItems.insert(targetIndex, sourceItem); - +*/ event->accept(); } -void QuickPluginWindow::resetPluginDisplay() -{ - // 先删除所有的widget - QMap pluginItems; - for (int i = m_mainLayout->count() - 1; i >= 0; i--) { - QLayoutItem *layoutItem = m_mainLayout->itemAt(i); - if (!layoutItem) - continue; - - QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); - if (!dockItem) - continue; - - dockItem->setParent(nullptr); - m_mainLayout->removeItem(layoutItem); - pluginItems[dockItem->pluginItem()] = dockItem; - } - // 将列表中所有的控件按照顺序添加到布局上 - auto addWidget = [ = ](const QList &items) { - QuickSettingController *quickController = QuickSettingController::instance(); - for (PluginsItemInterface *item : items) { - QuickDockItem *itemWidget = nullptr; - if (pluginItems.contains(item)) { - itemWidget = pluginItems[item]; - } else { - QJsonObject metaData; - QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(item); - if (pluginLoader) - metaData = pluginLoader->metaData().value("MetaData").toObject(); - - itemWidget = new QuickDockItem(item, metaData, quickController->itemKey(item), this); - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); - } - connect(itemWidget, &QuickDockItem::clicked, this, &QuickPluginWindow::onFixedClick); - itemWidget->setParent(this); - m_mainLayout->addWidget(itemWidget); - } - }; - - addWidget(m_fixedSettingItems); - addWidget(m_activeSettingItems); -} - void QuickPluginWindow::initConnection() { - connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { - if (pluginClass != QuickSettingController::PluginAttribute::Quick) - return; - - const QString pluginName = itemInter->pluginName(); - if (!fixedPluginNames.contains(pluginName)) - return; - - addPlugin(itemInter); - }); - - connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ this ] (PluginsItemInterface *itemInter){ - removePlugin(itemInter); - }); - - connect(QuickSettingController::instance(), &QuickSettingController::pluginUpdated, this, &QuickPluginWindow::onUpdatePlugin); + QuickPluginModel *model = QuickPluginModel::instance(); + connect(model, &QuickPluginModel::requestUpdate, this, &QuickPluginWindow::onRequestUpdate); + connect(model, &QuickPluginModel::requestUpdatePlugin, this, &QuickPluginWindow::onUpdatePlugin); } /** @@ -555,10 +542,6 @@ void QuickDockItem::paintEvent(QPaintEvent *event) void QuickDockItem::mousePressEvent(QMouseEvent *event) { switch (event->button()) { - case Qt::LeftButton: { - Q_EMIT clicked(); - break; - } case Qt::RightButton: { if (m_contextMenu->actions().isEmpty()) { const QString menuJson = m_pluginItem->itemContextMenu(m_itemKey); diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 27bdd52c4..b8133cd3d 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -59,16 +59,15 @@ public: Q_SIGNALS: void itemCountChanged(); + void requestDrop(QDropEvent *dropEvent); protected: - void mousePressEvent(QMouseEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private Q_SLOTS: - void addPlugin(PluginsItemInterface *pluginItem); - void removePlugin(PluginsItemInterface *item); + void onRequestUpdate(); void onPluginDropItem(QDropEvent *event); void onPluginDragMove(QDragMoveEvent *event); - void onFixedClick(); void onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart); private: @@ -76,18 +75,15 @@ private: void initConnection(); void startDrag(PluginsItemInterface *moveItem); PluginsItemInterface *findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems); - int findActiveTargetIndex(QuickDockItem *widget); int getDropIndex(QPoint point); - void resetPluginDisplay(); QPoint popupPoint() const; QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); - bool isQuickPlugin(PluginsItemInterface *pluginItem); + QuickDockItem *getActiveDockItem(QPoint point) const; private: QBoxLayout *m_mainLayout; Dock::Position m_position; - QList m_activeSettingItems; - QList m_fixedSettingItems; + struct DragInfo *m_dragInfo; }; // 用于在任务栏上显示的插件 @@ -103,9 +99,6 @@ public: PluginsItemInterface *pluginItem(); bool isPrimary() const; -Q_SIGNALS: - void clicked(); - protected: void paintEvent(QPaintEvent *event) override; void mousePressEvent(QMouseEvent *event) override; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index f241080d5..c7fa72423 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -41,10 +41,22 @@ #include #include #include +#include DWIDGET_USE_NAMESPACE -static const int QuickItemRole = Dtk::UserRole + 10; +struct QuickDragInfo { + QPoint dragPosition; + QuickSettingItem *dragItem = nullptr; + void reset() { + dragPosition.setX(0); + dragPosition.setY(0); + dragItem = nullptr; + } + bool isNull() { + return !dragItem; + } +} QuickDragInfo; #define ITEMWIDTH 70 #define ITEMHEIGHT 60 @@ -71,7 +83,7 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumeModel, this)) , m_displaySettingWidget(new DisplaySettingWidget(this)) , m_childPage(new PluginChildPage(this)) - , m_dragPluginPosition(QPoint(0, 0)) + , m_dragInfo(new struct QuickDragInfo) { initUi(); initConnection(); @@ -81,6 +93,7 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) QuickSettingContainer::~QuickSettingContainer() { + delete m_dragInfo; } void QuickSettingContainer::showHomePage() @@ -170,8 +183,29 @@ void QuickSettingContainer::onItemDetailClick(PluginsItemInterface *pluginInter) bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) { - if (watched == m_childPage && event->type() == QEvent::Resize) - onResizeView(); + switch (event->type()) { + case QEvent::Resize: { + if (watched == m_childPage) + onResizeView(); + break; + } + case QEvent::MouseButtonPress: { + QuickSettingItem *item = qobject_cast(watched); + if (!item) + break; + + QMouseEvent *mouseEvent = static_cast(event); + m_dragInfo->dragPosition = mouseEvent->pos(); + m_dragInfo->dragItem = item; + break; + } + case QEvent::MouseButtonRelease: { + m_dragInfo->reset(); + break; + } + default: + break; + } return QWidget::eventFilter(watched, event); } @@ -183,6 +217,17 @@ void QuickSettingContainer::showWidget(QWidget *widget, const QString &title) m_switchLayout->setCurrentWidget(m_childPage); } +QPoint QuickSettingContainer::hotSpot(const QPixmap &pixmap) +{ + if (m_position == Dock::Position::Left) + return QPoint(0, pixmap.height()); + + if (m_position == Dock::Position::Top) + return QPoint(pixmap.width(), 0); + + return QPoint(pixmap.width(), pixmap.height()); +} + void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter) { initQuickItem(itemInter); @@ -216,51 +261,23 @@ void QuickSettingContainer::onPluginRemove(PluginsItemInterface * itemInter) onResizeView(); } -void QuickSettingContainer::mousePressEvent(QMouseEvent *event) -{ - if (event->button() != Qt::LeftButton) - return QWidget::mousePressEvent(event); - - QuickSettingItem *moveItem = qobject_cast(childAt(event->pos())); - if (!moveItem || moveItem->isPrimary()) - return QWidget::mousePressEvent(event); - - m_dragPluginPosition = event->pos(); -} - -void QuickSettingContainer::clearDragPoint() -{ - m_dragPluginPosition.setX(0); - m_dragPluginPosition.setY(0); -} - -void QuickSettingContainer::mouseReleaseEvent(QMouseEvent *event) -{ - Q_UNUSED(event); - clearDragPoint(); -} - void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) { - if (m_dragPluginPosition.isNull()) + if (m_dragInfo->isNull()) return; - QuickSettingItem *moveItem = qobject_cast(childAt(m_dragPluginPosition)); - if (!moveItem) { - clearDragPoint(); - return; - } - QPoint pointCurrent = event->pos(); - if (qAbs(m_dragPluginPosition.x() - pointCurrent.x()) > 5 - || qAbs(m_dragPluginPosition.y() - pointCurrent.y()) > 5) { - clearDragPoint(); + if (qAbs(m_dragInfo->dragPosition.x() - pointCurrent.x()) > 5 + || qAbs(m_dragInfo->dragPosition.y() - pointCurrent.y()) > 5) { + QuickSettingItem *moveItem = m_dragInfo->dragItem; + m_dragInfo->reset(); + QDrag *drag = new QDrag(this); QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem->pluginItem()); drag->setMimeData(mimedata); QPixmap dragPixmap = moveItem->dragPixmap(); drag->setPixmap(dragPixmap); - drag->setHotSpot(QPoint(dragPixmap.width() / 2, dragPixmap.height() / 2)); + drag->setHotSpot(hotSpot(dragPixmap)); drag->exec(Qt::MoveAction | Qt::CopyAction); } diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index fec0ab53c..f2b714416 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -45,6 +45,7 @@ class QLabel; class PluginChildPage; class QGridLayout; class DisplaySettingWidget; +struct QuickDragInfo; DWIDGET_USE_NAMESPACE @@ -57,9 +58,8 @@ public: static void setPosition(Dock::Position position); protected: - void mousePressEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; explicit QuickSettingContainer(QWidget *parent = nullptr); ~QuickSettingContainer() override; @@ -69,7 +69,6 @@ private Q_SLOTS: void onPluginInsert(PluginsItemInterface * itemInter); void onPluginRemove(PluginsItemInterface * itemInter); void onItemDetailClick(PluginsItemInterface *pluginInter); - bool eventFilter(QObject *watched, QEvent *event) override; void onResizeView(); private: @@ -83,8 +82,8 @@ private: void initQuickItem(PluginsItemInterface *plugin); // 显示具体的窗体 void showWidget(QWidget *widget, const QString &title); - // 清除移动轨迹 - void clearDragPoint(); + // 获取拖动图标的热点 + QPoint hotSpot(const QPixmap &pixmap); private: static DockPopupWindow *m_popWindow; @@ -105,7 +104,7 @@ private: VolumeDevicesWidget *m_volumeSettingWidget; DisplaySettingWidget *m_displaySettingWidget; PluginChildPage *m_childPage; - QPoint m_dragPluginPosition; + QuickDragInfo *m_dragInfo; QList m_quickSettings; }; diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index cd17498e7..0a408c85e 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -117,10 +117,19 @@ QSize SystemPluginWindow::suitableSize(const Position &position) const return QSize(QWIDGETSIZE_MAX, itemHeight); } +bool SystemPluginWindow::eventFilter(QObject *watched, QEvent *event) +{ + if (event->type() == QEvent::Drop) + Q_EMIT requestDrop(static_cast(event)); + + return QWidget::eventFilter(watched, event); +} + void SystemPluginWindow::initUi() { m_mainLayout->setContentsMargins(0, 0, 0, 0); m_mainLayout->setSpacing(0); + installEventFilter(this); } void SystemPluginWindow::initConnection() @@ -161,6 +170,7 @@ void SystemPluginWindow::pluginAdded(PluginsItemInterface *plugin) StretchPluginsItem *item = new StretchPluginsItem(plugin, QuickSettingController::instance()->itemKey(plugin)); item->setDisplayMode(m_displayMode); item->setPosition(m_position); + item->installEventFilter(this); item->setParent(this); item->show(); m_mainLayout->addWidget(item); diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 9a74aca1d..b7bda5dc3 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -48,6 +48,10 @@ public: Q_SIGNALS: void itemChanged(); + void requestDrop(QDropEvent *dropEvent); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; private: void initUi(); diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index a9bd34b5f..4e14e8243 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -48,6 +48,7 @@ TrayDelegate::TrayDelegate(QListView *view, QObject *parent) , m_position(Dock::Position::Bottom) , m_listView(view) { + connect(this, &TrayDelegate::requestDrag, this, &TrayDelegate::onUpdateExpand); } void TrayDelegate::setPositon(Dock::Position position) @@ -83,11 +84,11 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem trayWidget = new SNITrayItemWidget(servicePath, parent); } else if (type == TrayIconType::ExpandIcon) { ExpandIconWidget *expandWidget = new ExpandIconWidget(parent); - expandWidget->setPositonValue(m_position); - connect(expandWidget, &ExpandIconWidget::trayVisbleChanged, this, [ = ](bool visible) { - Q_EMIT visibleChanged(index, visible); - }); - connect(this, &TrayDelegate::requestDrag, this, &TrayDelegate::onRequestDrag); + expandWidget->setPositon(m_position); + bool openExpand = index.data(TrayModel::ExpandRole).toBool(); + if (openExpand) + expandWidget->setTrayPanelVisible(true); + trayWidget = expandWidget; } else if (type == TrayIconType::Incicator) { QString indicateName = key; @@ -119,18 +120,23 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem return trayWidget; } -void TrayDelegate::onRequestDrag(bool on) +void TrayDelegate::onUpdateExpand(bool on) { ExpandIconWidget *expandwidget = expandWidget(); - if (!expandwidget) - return; if (on) { - expandwidget->setTrayPanelVisible(true); - } else { + if (!expandwidget) { + // 如果三角按钮不存在,那么就设置三角按钮可见,此时它会自动创建一个三角按钮 + TrayModel *model = qobject_cast(m_listView->model()); + if (model) + model->setExpandVisible(true, true); + } else { + expandwidget->setTrayPanelVisible(true); + } + } else if (expandwidget) { // 如果释放鼠标,则判断当前鼠标的位置是否在托盘内部,如果在,则无需隐藏 QPoint currentPoint = QCursor::pos(); - QWidget *view = expandwidget->popupTrayView(); + TrayGridWidget *view = ExpandIconWidget::popupTrayView(); expandwidget->setTrayPanelVisible(view->geometry().contains(currentPoint)); } } diff --git a/frame/window/tray/tray_delegate.h b/frame/window/tray/tray_delegate.h index 5bd4e2175..26487f761 100644 --- a/frame/window/tray/tray_delegate.h +++ b/frame/window/tray/tray_delegate.h @@ -45,11 +45,10 @@ public: Q_SIGNALS: void removeRow(const QModelIndex &) const; - void visibleChanged(const QModelIndex &, bool) const; void requestDrag(bool) const; private Q_SLOTS: - void onRequestDrag(bool on); + void onUpdateExpand(bool on); protected: QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index d190bd259..b62757f3c 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -19,6 +19,7 @@ * along with this program. If not, see . */ #include "tray_gridview.h" +#include "settingconfig.h" #include #include @@ -406,14 +407,22 @@ void TrayGridView::handleDropEvent(QDropEvent *e) info.key = static_cast(e->mimeData()->data("key")); info.winId = static_cast(e->mimeData()->data("winId").toInt()); info.servicePath = static_cast(e->mimeData()->data("servicePath")); + info.itemKey = static_cast(e->mimeData()->data("itemKey")); + info.isTypeWriting = (static_cast(e->mimeData()->data("isTypeWritting")) == "1"); + info.expand = (static_cast(e->mimeData()->data("expand")) == "1"); + info.pluginInter = (PluginsItemInterface *)(e->mimeData()->imageData().value()); QModelIndex targetIndex = getIndexFromPos(e->pos()); + int index = -1; if (targetIndex.isValid() && targetIndex.row() < dataModel->rowCount() - 1) { // 如果拖动的位置是合法的位置,则让其插入到当前的位置 - dataModel->insertRow(targetIndex.row(), info); + index = targetIndex.row(); + dataModel->insertRow(index, info); } else { // 在其他的情况下,让其插入到最后 dataModel->addRow(info); } + + dataModel->saveConfig(index, info); } } else { e->ignore(); @@ -421,6 +430,15 @@ void TrayGridView::handleDropEvent(QDropEvent *e) } } +void TrayGridView::onUpdateEditorView() +{ + for (int i = 0; i < model()->rowCount(); i++) { + QModelIndex index = model()->index(i, 0); + closePersistentEditor(index); + openPersistentEditor(index); + } +} + bool TrayGridView::beginDrag(Qt::DropActions supportedActions) { QModelIndex modelIndex = indexAt(m_dragPos); @@ -451,8 +469,6 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) QRect rectIcon(pixLabel->rect().topLeft(), pixLabel->size()); - listModel->setDragingIndex(modelIndex); - QDrag *drag = new QDrag(this); pixmap.scaled(pixmap.size() * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap.setDevicePixelRatio(ratio); @@ -469,6 +485,7 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) setState(DraggingState); listModel->setDragKey(itemKey); + listModel->setDragingIndex(modelIndex); Qt::DropAction dropAct = drag->exec(supportedActions); @@ -484,6 +501,7 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) pixLabel->deleteLater(); listModel->setDragKey(QString()); clearDragModelIndex(); + listModel->setExpandVisible(!TrayModel::getIconModel()->isEmpty()); m_dropPos = QPoint(); m_dragPos = QPoint(); diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h index 9a498453d..3a5e25b28 100644 --- a/frame/window/tray/tray_gridview.h +++ b/frame/window/tray/tray_gridview.h @@ -42,20 +42,23 @@ public: QSize suitableSize(const Dock::Position &position) const; void setDragDistance(int pixel); void setAnimationProperty(const QEasingCurve::Type easing, const int duringTime = 250); - void moveAnimation(); const QModelIndex modelIndex(const int index) const; const QRect indexRect(const QModelIndex &index) const; - void dropSwap(); void handleDropEvent(QDropEvent *e); +public Q_SLOTS: + void onUpdateEditorView(); + Q_SIGNALS: void requestRemove(const QString &); void dragLeaved(); void dragEntered(); -public Q_SLOTS: +private Q_SLOTS: void clearDragModelIndex(); + void dropSwap(); + void moveAnimation(); protected: void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE; diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index c0db86d71..7911adfb7 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -25,6 +25,8 @@ #include "indicatorplugin.h" #include "quicksettingcontroller.h" #include "pluginsiteminterface.h" +#include "settingconfig.h" +#include "platformutils.h" #include #include @@ -33,41 +35,54 @@ #include #define TRAY_DRAG_FALG "tray_drag" +#define DOCKQUICKTRAYNAME "Dock_Quick_Tray_Name" -TrayModel::TrayModel(QListView *view, bool isIconTray, bool hasInputMethod, QObject *parent) +TrayModel *TrayModel::getDockModel() +{ + static TrayModel *model = nullptr; + if (!model) { + model = new TrayModel(false); + TrayModel *iconModel = getIconModel(); + connect(iconModel, &TrayModel::rowsRemoved, model, [ = ] { + model->setExpandVisible(iconModel->rowCount() > 0); + }); + connect(iconModel, &TrayModel::rowsInserted, model, [ = ] { + model->setExpandVisible(iconModel->rowCount() > 0); + }); + } + + return model; +} + +TrayModel *TrayModel::getIconModel() +{ + static TrayModel model(true); + return &model; +} + +TrayModel::TrayModel(bool isIconTray, QObject *parent) : QAbstractListModel(parent) , m_dragModelIndex(QModelIndex()) , m_dropModelIndex(QModelIndex()) - , m_view(view) , m_monitor(new TrayMonitor(this)) , m_isTrayIcon(isIconTray) - , m_hasInputMethod(hasInputMethod) { - Q_ASSERT(m_view); - - if (isIconTray) { - connect(m_monitor, &TrayMonitor::xEmbedTrayAdded, this, &TrayModel::onXEmbedTrayAdded); - connect(m_monitor, &TrayMonitor::indicatorFounded, this, &TrayModel::onIndicatorFounded); - - QuickSettingController *quickController = QuickSettingController::instance(); - connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { - if (pluginAttr != QuickSettingController::PluginAttribute::Tray) - return; - - systemItemAdded(itemInter); - }); - - connect(quickController, &QuickSettingController::pluginRemoved, this, &TrayModel::onSystemItemRemoved); - QMetaObject::invokeMethod(this, [ = ] { - QList trayPlugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tray); - for (PluginsItemInterface *plugin : trayPlugins) - systemItemAdded(plugin); - }, Qt::QueuedConnection); - } + connect(m_monitor, &TrayMonitor::xEmbedTrayAdded, this, &TrayModel::onXEmbedTrayAdded); connect(m_monitor, &TrayMonitor::xEmbedTrayRemoved, this, &TrayModel::onXEmbedTrayRemoved); - connect(m_monitor, &TrayMonitor::requestUpdateIcon, this, &TrayModel::requestUpdateIcon); + connect(m_monitor, &TrayMonitor::sniTrayAdded, this, &TrayModel::onSniTrayAdded); connect(m_monitor, &TrayMonitor::sniTrayRemoved, this, &TrayModel::onSniTrayRemoved); + + connect(m_monitor, &TrayMonitor::indicatorFounded, this, &TrayModel::onIndicatorFounded); + + connect(m_monitor, &TrayMonitor::systemTrayAdded, this, &TrayModel::onSystemTrayAdded); + connect(m_monitor, &TrayMonitor::systemTrayRemoved, this, &TrayModel::onSystemTrayRemoved); + + connect(m_monitor, &TrayMonitor::requestUpdateIcon, this, &TrayModel::requestUpdateIcon); + connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &TrayModel::onSettingChanged); + + m_fixedTrayNames = SETTINGCONFIG->value(DOCKQUICKTRAYNAME).toStringList(); + m_fixedTrayNames.removeDuplicates(); } void TrayModel::dropSwap(int newPos) @@ -97,6 +112,7 @@ void TrayModel::clearDragDropIndex() m_dragModelIndex = m_dropModelIndex = QModelIndex(); + Q_EMIT requestRefreshEditor(); emit QAbstractItemModel::dataChanged(startIndex, endIndex); emit QAbstractItemModel::dataChanged(endIndex, startIndex); } @@ -106,6 +122,7 @@ void TrayModel::setDragingIndex(const QModelIndex index) m_dragModelIndex = index; m_dropModelIndex = index; + Q_EMIT requestRefreshEditor(); emit QAbstractListModel::dataChanged(index, index); } @@ -120,6 +137,44 @@ void TrayModel::setDragDropIndex(const QModelIndex index) emit QAbstractListModel::dataChanged(index, m_dragModelIndex); } +void TrayModel::setExpandVisible(bool visible, bool openExpand) +{ + // 如果是托盘,不支持展开图标 + if (m_isTrayIcon) + return; + + if (visible) { + // 如果展开图标已经存在,则不添加, + for (const WinInfo &winInfo : m_winInfos) { + if (winInfo.type == TrayIconType::ExpandIcon) + return; + } + // 如果是任务栏图标,则添加托盘展开图标 + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + WinInfo info; + info.type = TrayIconType::ExpandIcon; + info.expand = openExpand; + m_winInfos.insert(0, info); // 展开图标始终显示在第一个 + endInsertRows(); + + Q_EMIT requestRefreshEditor(); + Q_EMIT rowCountChanged(); + } else { + // 如果隐藏,则直接从列表中移除 + bool rowChanged = false; + beginResetModel(); + for (const WinInfo &winInfo : m_winInfos) { + if (winInfo.type == TrayIconType::ExpandIcon) { + m_winInfos.removeOne(winInfo); + rowChanged = true; + } + } + endResetModel(); + if (rowChanged) + Q_EMIT rowCountChanged(); + } +} + void TrayModel::setDragKey(const QString &key) { m_dragKey = key; @@ -165,8 +220,12 @@ QMimeData *TrayModel::mimeData(const QModelIndexList &indexes) const auto info = m_winInfos.at(itemIndex); mime->setData("type", QByteArray::number(static_cast(info.type))); mime->setData("key", info.key.toLatin1()); + mime->setData("itemKey", info.itemKey.toLatin1()); mime->setData("winId", QByteArray::number(info.winId)); mime->setData("servicePath", info.servicePath.toLatin1()); + mime->setData("isTypeWritting", info.isTypeWriting ? "1" : "0"); + mime->setData("expand", info.expand ? "1" : "0"); + mime->setImageData(QVariant::fromValue((qulonglong)(info.pluginInter))); //TODO 支持多个index的数据,待支持 } @@ -192,6 +251,10 @@ QVariant TrayModel::data(const QModelIndex &index, int role) const return info.servicePath; case Role::PluginInterfaceRole: return (qulonglong)(info.pluginInter); + case Role::ExpandRole: + return info.expand; + case Role::ItemKeyRole: + return info.itemKey; case Role::Blank: return indexDragging(index); default: @@ -211,6 +274,8 @@ bool TrayModel::removeRows(int row, int count, const QModelIndex &parent) m_dragInfo = m_winInfos.takeAt(row); endRemoveRows(); + Q_EMIT rowCountChanged(); + return true; } @@ -230,7 +295,7 @@ bool TrayModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, in Qt::ItemFlags TrayModel::flags(const QModelIndex &index) const { const Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); - m_view->openPersistentEditor(index); + Q_EMIT requestOpenEditor(index); return defaultFlags | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; } @@ -246,15 +311,40 @@ bool TrayModel::isIconTray() return m_isTrayIcon; } +bool TrayModel::hasExpand() const +{ + for (const WinInfo &winInfo : m_winInfos) { + if (winInfo.type == TrayIconType::ExpandIcon) + return true; + } + + return false; +} + +bool TrayModel::isEmpty() const +{ + for (const WinInfo &winInfo : m_winInfos) { + if (winInfo.type != TrayIconType::ExpandIcon) + return false; + } + + return true; +} + void TrayModel::clear() { beginResetModel(); m_winInfos.clear(); endResetModel(); + + Q_EMIT rowCountChanged(); } void TrayModel::onXEmbedTrayAdded(quint32 winId) { + if (!xembedCanExport(winId)) + return; + for (const WinInfo &info : m_winInfos) { if (info.winId == winId) return; @@ -264,9 +354,12 @@ void TrayModel::onXEmbedTrayAdded(quint32 winId) WinInfo info; info.type = XEmbed; info.key = "wininfo:" + QString::number(winId); + info.itemKey = xembedItemKey(winId); info.winId = winId; m_winInfos.append(info); endInsertRows(); + + Q_EMIT rowCountChanged(); } void TrayModel::onXEmbedTrayRemoved(quint32 winId) @@ -277,19 +370,21 @@ void TrayModel::onXEmbedTrayRemoved(quint32 winId) beginRemoveRows(QModelIndex(), index, index); m_winInfos.removeOne(info); endRemoveRows(); + + Q_EMIT rowCountChanged(); return; } } } -QString TrayModel::fileNameByServiceName(const QString &serviceName) +QString TrayModel::fileNameByServiceName(const QString &serviceName) const { QStringList serviceInfo = serviceName.split("/"); if (serviceInfo.size() <= 0) return QString(); QDBusInterface dbsInterface("org.freedesktop.DBus", "/org/freedesktop/DBus", - "org.freedesktop.DBus", QDBusConnection::sessionBus(), this); + "org.freedesktop.DBus", QDBusConnection::sessionBus()); QDBusMessage msg = dbsInterface.call("GetConnectionUnixProcessID", serviceInfo[0] ); QList arguments = msg.arguments(); if (arguments.size() == 0) @@ -308,35 +403,81 @@ QString TrayModel::fileNameByServiceName(const QString &serviceName) return QString(); } -bool TrayModel::isTypeWriting(const QString &servicePath) +bool TrayModel::isTypeWriting(const QString &servicePath) const { const QString appFilePath = fileNameByServiceName(servicePath); return (appFilePath.startsWith("/usr/bin/fcitx") || appFilePath.endsWith("chinime-qim")); } -void TrayModel::systemItemAdded(PluginsItemInterface *itemInter) +void TrayModel::saveConfig(int index, const WinInfo &winInfo) { - for (const WinInfo &info : m_winInfos) { - if (info.pluginInter == itemInter) - return; + if (m_fixedTrayNames.contains(winInfo.itemKey)) + return; + + if (index >= 0 && index < m_fixedTrayNames.size()) { + m_fixedTrayNames.insert(index, winInfo.itemKey); + } else { + m_fixedTrayNames << winInfo.itemKey; } + SETTINGCONFIG->setValue(DOCKQUICKTRAYNAME, m_fixedTrayNames); +} - beginInsertRows(QModelIndex(), rowCount(), rowCount()); +bool TrayModel::inTrayConfig(const QString itemKey) const +{ + if (m_isTrayIcon) { + // 如果是托盘区域,显示所有不在配置中的应用 + return !m_fixedTrayNames.contains(itemKey); + } + // 如果是任务栏区域,显示所有在配置中的应用 + return m_fixedTrayNames.contains(itemKey); +} - WinInfo info; - info.type = SystemItem; - info.pluginInter = itemInter; - m_winInfos.append(info); +QString TrayModel::xembedItemKey(quint32 winId) const +{ + return QString("embed:%1").arg(PlatformUtils::getAppNameForWindow(winId)); +} - endInsertRows(); +bool TrayModel::xembedCanExport(quint32 winId) const +{ + return inTrayConfig(xembedItemKey(winId)); +} + +QString TrayModel::sniItemKey(const QString &servicePath) const +{ + if (isTypeWriting(servicePath)) + return "fcitx"; + + QString fileName = fileNameByServiceName(servicePath); + return QString("sni:%1").arg(fileName.mid(fileName.lastIndexOf("/") + 1)); +} + +bool TrayModel::sniCanExport(const QString &servicePath) const +{ + return inTrayConfig(sniItemKey(servicePath)); +} + +bool TrayModel::indicatorCanExport(const QString &indicatorName) const +{ + return inTrayConfig(IndicatorTrayItem::toIndicatorKey(indicatorName)); +} + +QString TrayModel::systemItemKey(const QString &pluginName) const +{ + return QString("systemItem:%1").arg(pluginName); +} + +bool TrayModel::systemItemCanExport(const QString &pluginName) const +{ + return inTrayConfig(systemItemKey(pluginName)); } void TrayModel::onSniTrayAdded(const QString &servicePath) { - bool typeWriting = isTypeWriting(servicePath); - if ((m_hasInputMethod && !typeWriting) || (!m_hasInputMethod && typeWriting)) + if (!sniCanExport(servicePath)) return; + bool typeWriting = isTypeWriting(servicePath); + int citxIndex = -1; for (int i = 0; i < m_winInfos.size(); i++) { WinInfo info = m_winInfos[i]; @@ -351,6 +492,7 @@ void TrayModel::onSniTrayAdded(const QString &servicePath) WinInfo info; info.type = Sni; info.key = "sni:" + servicePath; + info.itemKey = sniItemKey(servicePath); info.servicePath = servicePath; info.isTypeWriting = typeWriting; // 是否为输入法 if (typeWriting) { @@ -366,6 +508,8 @@ void TrayModel::onSniTrayAdded(const QString &servicePath) } } else { m_winInfos.append(info); + + Q_EMIT rowCountChanged(); } endInsertRows(); } @@ -392,6 +536,8 @@ void TrayModel::onSniTrayRemoved(const QString &servicePath) beginRemoveRows(QModelIndex(), index, index); m_winInfos.removeOne(info); endRemoveRows(); + + Q_EMIT rowCountChanged(); } break; } @@ -423,6 +569,9 @@ void TrayModel::onIndicatorFounded(const QString &indicatorName) void TrayModel::onIndicatorAdded(const QString &indicatorName) { + if (!indicatorCanExport(indicatorName)) + return; + const QString &itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); for (const WinInfo &info : m_winInfos) { if (info.key == itemKey) @@ -433,8 +582,11 @@ void TrayModel::onIndicatorAdded(const QString &indicatorName) WinInfo info; info.type = Incicator; info.key = itemKey; + info.itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); m_winInfos.append(info); endInsertRows(); + + Q_EMIT rowCountChanged(); } void TrayModel::onIndicatorRemoved(const QString &indicatorName) @@ -443,19 +595,84 @@ void TrayModel::onIndicatorRemoved(const QString &indicatorName) removeRow(itemKey); } -void TrayModel::onSystemItemRemoved(PluginsItemInterface *itemInter) +void TrayModel::onSystemTrayAdded(PluginsItemInterface *itemInter) { + if (!systemItemCanExport(itemInter->pluginName())) + return; + + for (const WinInfo &info : m_winInfos) { + if (info.pluginInter == itemInter) + return; + } + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + WinInfo info; + info.type = SystemItem; + info.pluginInter = itemInter; + info.itemKey = systemItemKey(itemInter->pluginName()); + m_winInfos.append(info); + + endInsertRows(); + + Q_EMIT rowCountChanged(); +} + +void TrayModel::onSystemTrayRemoved(PluginsItemInterface *itemInter) +{ for (const WinInfo &info : m_winInfos) { if (info.pluginInter != itemInter) continue; + beginInsertRows(QModelIndex(), rowCount(), rowCount()); m_winInfos.removeOne(info); + endInsertRows(); + + Q_EMIT rowCountChanged(); break; } +} - endInsertRows(); +void TrayModel::onSettingChanged(const QString &key, const QVariant &value) +{ + if (key != DOCKQUICKTRAYNAME) + return; + + // 先将其转换为任务栏上的图标列表 + m_fixedTrayNames = value.toStringList(); + // 依次获取所有的图盘图标,判断当前图标是否可以保持在当前的view中, + // 如果可以保留,则添加到view上显示,否则,移除显示 + QList trayWinIds = m_monitor->trayWinIds(); + for (quint32 trayId : trayWinIds) { + if (xembedCanExport(trayId)) + onXEmbedTrayAdded(trayId); + else + onXEmbedTrayRemoved(trayId); + } + + QStringList sniServices = m_monitor->sniServices(); + for (const QString &sniService : sniServices) { + if (sniCanExport(sniService)) + onSniTrayAdded(sniService); + else + onSniTrayRemoved(sniService); + } + + QStringList indicators = m_monitor->indicatorNames(); + for (const QString &indicatorName : indicators) { + if (indicatorCanExport(indicatorName)) + onIndicatorAdded(indicatorName); + else + onIndicatorRemoved(indicatorName); + } + + QList pluginItems = m_monitor->systemTrays(); + for (PluginsItemInterface *plugin : pluginItems) { + if (systemItemCanExport(plugin->pluginName())) + onSystemTrayAdded(plugin); + else + onSystemTrayRemoved(plugin); + } } void TrayModel::removeRow(const QString &itemKey) @@ -466,6 +683,8 @@ void TrayModel::removeRow(const QString &itemKey) beginRemoveRows(QModelIndex(), index, index); m_winInfos.removeOne(info); endRemoveRows(); + + Q_EMIT rowCountChanged(); break; } } @@ -481,6 +700,9 @@ void TrayModel::addRow(WinInfo info) beginInsertRows(QModelIndex(), rowCount(), rowCount()); m_winInfos.append(info); endInsertRows(); + + Q_EMIT requestRefreshEditor(); + Q_EMIT rowCountChanged(); } void TrayModel::insertRow(int index, WinInfo info) @@ -497,6 +719,9 @@ void TrayModel::insertRow(int index, WinInfo info) beginInsertRows(QModelIndex(), index, index); m_winInfos.insert(index, info); endInsertRows(); + + Q_EMIT requestRefreshEditor(); + Q_EMIT rowCountChanged(); } bool TrayModel::exist(const QString &itemKey) diff --git a/frame/window/tray/tray_model.h b/frame/window/tray/tray_model.h index df41c8bb4..0e5b9f95e 100644 --- a/frame/window/tray/tray_model.h +++ b/frame/window/tray/tray_model.h @@ -42,16 +42,20 @@ enum TrayIconType { struct WinInfo { TrayIconType type; QString key; + QString itemKey; quint32 winId; QString servicePath; bool isTypeWriting; + bool expand; PluginsItemInterface *pluginInter; WinInfo() : type(UnKnow) , key(QString()) + , itemKey(QString()) , winId(0) , servicePath(QString()) , isTypeWriting(false) + , expand(false) , pluginInter(nullptr) {} bool operator==(const WinInfo &other) { @@ -59,6 +63,7 @@ struct WinInfo { && this->key == other.key && this->winId == other.winId && this->servicePath == other.servicePath + && this->itemKey == other.itemKey && this->isTypeWriting == other.isTypeWriting && this->pluginInter == other.pluginInter; } @@ -75,12 +80,15 @@ public: WinIdRole, ServiceRole, PluginInterfaceRole, + ExpandRole, + ItemKeyRole, Blank }; typedef QList WinInfos; - TrayModel(QListView *view, bool isIconTray, bool hasInputMethod, QObject *parent = Q_NULLPTR); + static TrayModel *getDockModel(); + static TrayModel *getIconModel(); void dropSwap(int newPos); void dropInsert(int newPos); @@ -88,6 +96,7 @@ public: void clearDragDropIndex(); void setDragingIndex(const QModelIndex index); void setDragDropIndex(const QModelIndex index); + void setExpandVisible(bool visible, bool openExpand = false); void setDragKey(const QString &key); @@ -97,18 +106,27 @@ public: int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; bool isIconTray(); + bool hasExpand() const; + bool isEmpty() const; void clear(); + void saveConfig(int index, const WinInfo &winInfo); Q_SIGNALS: void requestUpdateIcon(quint32); void requestUpdateWidget(const QList &); + void requestOpenEditor(const QModelIndex &index, bool isOpen = true) const; + void rowCountChanged(); + void requestRefreshEditor(); public Q_SLOTS: void removeRow(const QString &itemKey); void addRow(WinInfo info); void insertRow(int index, WinInfo info); +protected: + TrayModel(bool isIconTray, QObject *parent = Q_NULLPTR); + private Q_SLOTS: void onXEmbedTrayAdded(quint32 winId); void onXEmbedTrayRemoved(quint32 winId); @@ -119,14 +137,24 @@ private Q_SLOTS: void onIndicatorAdded(const QString &indicatorName); void onIndicatorRemoved(const QString &indicatorName); - void onSystemItemRemoved(PluginsItemInterface *itemInter); + void onSystemTrayAdded(PluginsItemInterface *itemInter); + void onSystemTrayRemoved(PluginsItemInterface *itemInter); + + void onSettingChanged(const QString &key, const QVariant &value); private: bool exist(const QString &itemKey); - QString fileNameByServiceName(const QString &serviceName); - bool isTypeWriting(const QString &servicePath); + QString fileNameByServiceName(const QString &serviceName) const; + bool isTypeWriting(const QString &servicePath) const; - void systemItemAdded(PluginsItemInterface *itemInter); + bool inTrayConfig(const QString itemKey) const; + QString xembedItemKey(quint32 winId) const; + bool xembedCanExport(quint32 winId) const; + QString sniItemKey(const QString &servicePath) const; + bool sniCanExport(const QString &servicePath) const; + bool indicatorCanExport(const QString &indicatorName) const; + QString systemItemKey(const QString &pluginName) const; + bool systemItemCanExport(const QString &pluginName) const; protected: QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE; @@ -142,14 +170,13 @@ private: QModelIndex m_dragModelIndex; QModelIndex m_dropModelIndex; WinInfo m_dragInfo; - QListView *m_view; TrayMonitor *m_monitor; QString m_dragKey; QMap m_indicatorMap; + QStringList m_fixedTrayNames; bool m_isTrayIcon; - bool m_hasInputMethod; }; Q_DECLARE_METATYPE(TrayIconType); diff --git a/frame/window/tray/tray_monitor.cpp b/frame/window/tray/tray_monitor.cpp index bb92f9dbc..a925052c8 100644 --- a/frame/window/tray/tray_monitor.cpp +++ b/frame/window/tray/tray_monitor.cpp @@ -19,6 +19,8 @@ * along with this program. If not, see . */ #include "tray_monitor.h" +#include "quicksettingcontroller.h" +#include "pluginsiteminterface.h" TrayMonitor::TrayMonitor(QObject *parent) : QObject(parent) @@ -36,10 +38,56 @@ TrayMonitor::TrayMonitor(QObject *parent) connect(m_sniWatcher, &StatusNotifierWatcher::StatusNotifierItemUnregistered, this, &TrayMonitor::onSniItemsChanged, Qt::QueuedConnection); QMetaObject::invokeMethod(this, "onSniItemsChanged", Qt::QueuedConnection); + //-------------------------------System Tray------------------------------------------// + QuickSettingController *quickController = QuickSettingController::instance(); + connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + if (pluginAttr != QuickSettingController::PluginAttribute::Tray) + return; + + m_systemTrays << itemInter; + Q_EMIT systemTrayAdded(itemInter); + }); + + connect(quickController, &QuickSettingController::pluginRemoved, this, [ = ](PluginsItemInterface *itemInter) { + if (!m_systemTrays.contains(itemInter)) + return; + + m_systemTrays.removeOne(itemInter); + Q_EMIT systemTrayRemoved(itemInter); + }); + + QMetaObject::invokeMethod(this, [ = ] { + QList trayPlugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tray); + for (PluginsItemInterface *plugin : trayPlugins) { + m_systemTrays << plugin; + Q_EMIT systemTrayAdded(plugin); + } + }, Qt::QueuedConnection); + //-------------------------------Tray Indicator---------------------------------------------// QMetaObject::invokeMethod(this, "startLoadIndicators", Qt::QueuedConnection); } +QList TrayMonitor::trayWinIds() const +{ + return m_trayWids; +} + +QStringList TrayMonitor::sniServices() const +{ + return m_sniServices; +} + +QStringList TrayMonitor::indicatorNames() const +{ + return m_indicatorNames; +} + +QList TrayMonitor::systemTrays() const +{ + return m_systemTrays; +} + void TrayMonitor::onTrayIconsChanged() { QList wids = m_trayInter->trayIcons(); @@ -93,6 +141,7 @@ void TrayMonitor::startLoadIndicators() for (const QFileInfo &fileInfo : indicatorConfDir.entryInfoList({"*.json"}, QDir::Files | QDir::NoDotAndDotDot)) { const QString &indicatorName = fileInfo.baseName(); + m_indicatorNames << indicatorName; Q_EMIT indicatorFounded(indicatorName); } } diff --git a/frame/window/tray/tray_monitor.h b/frame/window/tray/tray_monitor.h index de2ee566d..9318a8a22 100644 --- a/frame/window/tray/tray_monitor.h +++ b/frame/window/tray/tray_monitor.h @@ -26,7 +26,10 @@ #include "dbustraymanager.h" #include "statusnotifierwatcher_interface.h" +class PluginsItemInterface; + using namespace org::kde; + class TrayMonitor : public QObject { Q_OBJECT @@ -34,6 +37,11 @@ class TrayMonitor : public QObject public: explicit TrayMonitor(QObject *parent = nullptr); + QList trayWinIds() const; + QStringList sniServices() const; + QStringList indicatorNames() const; + QList systemTrays() const; + Q_SIGNALS: void requestUpdateIcon(quint32); void xEmbedTrayAdded(quint32); @@ -42,6 +50,9 @@ Q_SIGNALS: void sniTrayAdded(const QString &); void sniTrayRemoved(const QString &); + void systemTrayAdded(PluginsItemInterface *); + void systemTrayRemoved(PluginsItemInterface *); + void indicatorFounded(const QString &); public Q_SLOTS: @@ -56,6 +67,8 @@ private: QList m_trayWids; QStringList m_sniServices; + QStringList m_indicatorNames; + QList m_systemTrays; }; #endif // TRAYMONITOR_H diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 2c5b89fb8..9ffee3f9f 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -40,18 +40,43 @@ ExpandIconWidget::ExpandIconWidget(QWidget *parent, Qt::WindowFlags f) , m_regionInter(new DRegionMonitor(this)) , m_position(Dock::Position::Bottom) { + connect(m_regionInter, &DRegionMonitor::buttonPress, this, [ = ](const QPoint &mousePos, const int flag) { + TrayGridWidget *gridView = popupTrayView(); + // 如果当前是隐藏,那么在点击任何地方都隐藏 + if (!isVisible()) { + gridView->hide(); + return; + } + + if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) + return; + + QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); + const QRect rect = QRect(ptPos, size()); + if (rect.contains(mousePos)) + return; + + const QRect rctView(gridView->pos(), gridView->size()); + if (rctView.contains(mousePos)) + return; + + gridView->hide(); + }); } ExpandIconWidget::~ExpandIconWidget() { + TrayGridWidget *gridView = popupTrayView(); + gridView->setOwnerWidget(nullptr); + setTrayPanelVisible(false); } -void ExpandIconWidget::setPositonValue(Dock::Position position) +void ExpandIconWidget::setPositon(Dock::Position position) { - if (m_position == position) - return; + if (m_position != position) + m_position = position; - m_position = position; + TrayGridWidget::setPosition(position); } void ExpandIconWidget::sendClick(uint8_t mouseButton, int x, int y) @@ -59,6 +84,10 @@ void ExpandIconWidget::sendClick(uint8_t mouseButton, int x, int y) Q_UNUSED(x); Q_UNUSED(y); + // 如果当前图标不可见,则不让展开托盘列表 + if (popupTrayView()->trayView()->model()->rowCount() == 0) + return; + if (mouseButton != XCB_BUTTON_INDEX_1) return; @@ -68,9 +97,9 @@ void ExpandIconWidget::sendClick(uint8_t mouseButton, int x, int y) void ExpandIconWidget::setTrayPanelVisible(bool visible) { - QWidget *gridParentView = popupTrayView(); + TrayGridWidget *gridParentView = popupTrayView(); if (visible) { - resetPosition(); + gridParentView->resetPosition(); gridParentView->show(); m_regionInter->registerRegion(); } else { @@ -86,7 +115,8 @@ QPixmap ExpandIconWidget::icon() void ExpandIconWidget::paintEvent(QPaintEvent *event) { - if (popupTrayView()->trayView()->model()->rowCount() == 0) + TrayGridWidget *gridView = popupTrayView(); + if (gridView->trayView()->model()->rowCount() == 0) return BaseTrayWidget::paintEvent(event); QPainter painter(this); @@ -96,6 +126,8 @@ void ExpandIconWidget::paintEvent(QPaintEvent *event) ICON_SIZE, ICON_SIZE); painter.drawPixmap(rectOfPixmap, pixmap); + + gridView->setOwnerWidget(this); } const QString ExpandIconWidget::dropIconFile() const @@ -136,7 +168,7 @@ TrayGridWidget *ExpandIconWidget::popupTrayView() gridParentView = new TrayGridWidget(nullptr); TrayGridView *trayView = new TrayGridView(gridParentView); TrayDelegate *trayDelegate = new TrayDelegate(trayView, trayView); - TrayModel *trayModel = new TrayModel(trayView, true, false); + TrayModel *trayModel = TrayModel::getIconModel(); gridParentView->setTrayGridView(trayView); gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); @@ -152,102 +184,97 @@ TrayGridWidget *ExpandIconWidget::popupTrayView() auto rowCountChanged = [ = ] { int count = trayModel->rowCount(); - trayView->setFixedSize(trayView->suitableSize()); - gridParentView->setFixedSize(trayView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2)); if (count > 0) - resetPosition(); + gridParentView->resetPosition(); else if (gridParentView->isVisible()) gridParentView->hide(); - - Q_EMIT trayVisbleChanged(count > 0); }; - connect(trayView, &TrayGridView::rowCountChanged, this, rowCountChanged); + connect(trayModel, &TrayModel::rowCountChanged, gridParentView, rowCountChanged); - connect(trayDelegate, &TrayDelegate::removeRow, this, [ = ](const QModelIndex &index) { + connect(trayDelegate, &TrayDelegate::removeRow, trayView, [ = ](const QModelIndex &index) { trayView->model()->removeRow(index.row(),index.parent()); }); connect(trayView, &TrayGridView::requestRemove, trayModel, &TrayModel::removeRow); - connect(m_regionInter, &DRegionMonitor::buttonPress, this, [ = ](const QPoint &mousePos, const int flag) { - // 如果当前是隐藏,那么在点击任何地方都隐藏 - if (!isVisible()) { - gridParentView->hide(); - return; - } - - if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) - return; - - QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); - const QRect rect = QRect(ptPos, size()); - if (rect.contains(mousePos)) - return; - - const QRect rctView(gridParentView->pos(), gridParentView->size()); - if (rctView.contains(mousePos)) - return; - - gridParentView->hide(); + connect(trayModel, &TrayModel::requestOpenEditor, trayView, [ trayView ](const QModelIndex &index) { + trayView->openPersistentEditor(index); }); - QMetaObject::invokeMethod(this, rowCountChanged, Qt::QueuedConnection); + QMetaObject::invokeMethod(gridParentView, rowCountChanged, Qt::QueuedConnection); return gridParentView; } -void ExpandIconWidget::resetPosition() -{ - if (!parentWidget()) - return; - - QWidget *gridParentView = popupTrayView(); - QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); - switch (m_position) { - case Dock::Position::Bottom: { - ptPos.setY(ptPos.y() - gridParentView->height()); - ptPos.setX(ptPos.x() - gridParentView->width()); - break; - } - case Dock::Position::Top: { - ptPos.setY(ptPos.y() + gridParentView->height()); - ptPos.setX(ptPos.x() - gridParentView->width()); - break; - } - case Dock::Position::Left: { - ptPos.setX(ptPos.x() + gridParentView->width() / 2); - break; - } - case Dock::Position::Right: { - ptPos.setX(ptPos.x() - gridParentView->width() / 2); - break; - } - } - gridParentView->move(ptPos); -} - /** * @brief 圆角窗体的绘制 * @param parent */ +Dock::Position TrayGridWidget::m_position = Dock::Position::Bottom; + TrayGridWidget::TrayGridWidget(QWidget *parent) : QWidget (parent) , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) , m_trayGridView(nullptr) + , m_ownerWidget(nullptr) { setAttribute(Qt::WA_TranslucentBackground); } +void TrayGridWidget::setPosition(const Dock::Position &position) +{ + m_position = position; +} + void TrayGridWidget::setTrayGridView(TrayGridView *trayView) { m_trayGridView = trayView; } +void TrayGridWidget::setOwnerWidget(QWidget *widget) +{ + // 设置所属的Widget,目的是为了计算当前窗体的具体位置 + m_ownerWidget = widget; +} + TrayGridView *TrayGridWidget::trayView() const { return m_trayGridView; } +void TrayGridWidget::resetPosition() +{ + // 如果没有设置所属窗体,则无法计算位置 + if (!m_ownerWidget || !m_ownerWidget->parentWidget()) + return; + + QWidget *topWidget = m_ownerWidget->topLevelWidget(); + QPoint ptPos = m_ownerWidget->parentWidget()->mapToGlobal(m_ownerWidget->pos()); + switch (m_position) { + case Dock::Position::Bottom: { + ptPos.setX(ptPos.x() - width()); + ptPos.setY(topWidget->y() - height()); + break; + } + case Dock::Position::Top: { + ptPos.setY(topWidget->y() + topWidget->height()); + ptPos.setX(ptPos.x() - width()); + break; + } + case Dock::Position::Left: { + ptPos.setX(topWidget->x() + topWidget->width()); + break; + } + case Dock::Position::Right: { + ptPos.setX(topWidget->x() - width()); + break; + } + } + m_trayGridView->setFixedSize(m_trayGridView->suitableSize()); + setFixedSize(m_trayGridView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2)); + move(ptPos); +} + void TrayGridWidget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h index 57747f01f..8a178492b 100644 --- a/frame/window/tray/widgets/expandiconwidget.h +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -39,24 +39,19 @@ class ExpandIconWidget : public BaseTrayWidget public: explicit ExpandIconWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); ~ExpandIconWidget() override; - void setPositonValue(Dock::Position position); + void setPositon(Dock::Position position); void sendClick(uint8_t mouseButton, int x, int y) override; void setTrayPanelVisible(bool visible); QString itemKeyForConfig() override { return "Expand"; } void updateIcon() override {} QPixmap icon() override; - TrayGridWidget *popupTrayView(); - -Q_SIGNALS: - void trayVisbleChanged(bool); + static TrayGridWidget *popupTrayView(); protected: void paintEvent(QPaintEvent *event) override; const QString dropIconFile() const; - void resetPosition(); - private: Dtk::Gui::DRegionMonitor *m_regionInter; Dock::Position m_position; @@ -70,8 +65,11 @@ class TrayGridWidget : public QWidget public: explicit TrayGridWidget(QWidget *parent); + static void setPosition(const Dock::Position &position); void setTrayGridView(TrayGridView *trayView); + void setOwnerWidget(QWidget *widget); TrayGridView *trayView() const; + void resetPosition(); protected: void paintEvent(QPaintEvent *event) override; @@ -82,6 +80,8 @@ private: private: DockInter *m_dockInter; TrayGridView *m_trayGridView; + static Dock::Position m_position; + QWidget *m_ownerWidget; }; #endif // EXPANDICONWIDGET_H diff --git a/frame/window/tray/widgets/xembedtrayitemwidget.cpp b/frame/window/tray/widgets/xembedtrayitemwidget.cpp index eadb9745f..3a8c7ad74 100644 --- a/frame/window/tray/widgets/xembedtrayitemwidget.cpp +++ b/frame/window/tray/widgets/xembedtrayitemwidget.cpp @@ -21,6 +21,7 @@ #include "constants.h" #include "xembedtrayitemwidget.h" +#include "platformutils.h" //#include "utils.h" #include @@ -85,7 +86,7 @@ void sni_cleanup_xcb_image(void *data) XEmbedTrayItemWidget::XEmbedTrayItemWidget(quint32 winId, xcb_connection_t *cnn, Display *disp, QWidget *parent) : BaseTrayWidget(parent) , m_windowId(winId) - , m_appName(getAppNameForWindow(winId)) + , m_appName(PlatformUtils::getAppNameForWindow(winId)) , m_valid(true) , m_xcbCnn(cnn) , m_display(disp) @@ -116,7 +117,7 @@ XEmbedTrayItemWidget::~XEmbedTrayItemWidget() QString XEmbedTrayItemWidget::itemKeyForConfig() { - return QString("window:%1").arg(getAppNameForWindow(m_windowId)); + return QString("window:%1").arg(PlatformUtils::getAppNameForWindow(m_windowId)); } void XEmbedTrayItemWidget::showEvent(QShowEvent *e) @@ -375,45 +376,6 @@ void XEmbedTrayItemWidget::sendClick(uint8_t mouseButton, int x, int y) QTimer::singleShot(100, this, [=] { setX11PassMouseEvent(true); }); } -// NOTE: WM_NAME may can not obtain successfully -QString XEmbedTrayItemWidget::getWindowProperty(quint32 winId, QString propName) -{ - const auto display = IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display(); - if (!display) { - qWarning() << "QX11Info::display() is " << display; - return QString(); - } - - Atom atom_prop = XInternAtom(display, propName.toLocal8Bit(), true); - if (!atom_prop) { - qDebug() << "Error: get window property failed, invalid property atom"; - return QString(); - } - - Atom actual_type_return; - int actual_format_return; - unsigned long nitems_return; - unsigned long bytes_after_return; - unsigned char *prop_return; - - int r = XGetWindowProperty(display, winId, atom_prop, 0, 100, false, AnyPropertyType, - &actual_type_return, &actual_format_return, &nitems_return, - &bytes_after_return, &prop_return); - - Q_UNUSED(r); - -// qDebug() << (r == Success) -// << actual_type_return -// << actual_format_return -// << nitems_return -// << bytes_after_return -// << QString::fromLocal8Bit((char*)prop_return); - if (IS_WAYLAND_DISPLAY) - XCloseDisplay(display); - - return QString::fromLocal8Bit((char*)prop_return); -} - QString XEmbedTrayItemWidget::toXEmbedKey(quint32 winId) { return QString("window:%1").arg(winId); @@ -477,29 +439,6 @@ void XEmbedTrayItemWidget::refershIconImage() } } -QString XEmbedTrayItemWidget::getAppNameForWindow(quint32 winId) -{ - QString appName; - do { - // is normal application - appName = getWindowProperty(winId, NORMAL_WINDOW_PROP_NAME); - if (!appName.isEmpty() && appName != IS_WINE_WINDOW_BY_WM_CLASS) { - break; - } - - // is wine application - appName = getWindowProperty(winId, WINE_WINDOW_PROP_NAME).split("/").last(); - if (!appName.isEmpty()) { - break; - } - - // fallback to window id - appName = QString::number(winId); - } while (false); - - return appName; -} - //int XEmbedTrayWidget::getTrayWidgetKeySuffix(const QString &appName, quint32 winId) //{ // int suffix = AppWinidSuffixMap.value(appName).value(winId, 0); diff --git a/frame/window/tray/widgets/xembedtrayitemwidget.h b/frame/window/tray/widgets/xembedtrayitemwidget.h index cf03ab10a..26c301e9e 100644 --- a/frame/window/tray/widgets/xembedtrayitemwidget.h +++ b/frame/window/tray/widgets/xembedtrayitemwidget.h @@ -43,7 +43,6 @@ public: void updateIcon() override; void sendClick(uint8_t mouseButton, int x, int y) override; - static QString getWindowProperty(quint32 winId, QString propName); static QString toXEmbedKey(quint32 winId); static uint getWindowPID(quint32 winId); static bool isXEmbedKey(const QString &itemKey); @@ -60,8 +59,6 @@ private: void sendHoverEvent(); void refershIconImage(); - static QString getAppNameForWindow(quint32 winId); - private slots: void setX11PassMouseEvent(const bool pass); void setWindowOnTop(const bool top); diff --git a/frame/window/traymainwindow.cpp b/frame/window/traymainwindow.cpp index 6f8f9d58e..d9356e12b 100644 --- a/frame/window/traymainwindow.cpp +++ b/frame/window/traymainwindow.cpp @@ -63,6 +63,7 @@ void TrayMainWindow::setDisplayMode(const Dock::DisplayMode &displayMode) // 只有在时尚模式下才显示 setVisible(displayMode == Dock::DisplayMode::Fashion); MainWindowBase::setDisplayMode(displayMode); + m_trayManager->setDisplayMode(displayMode); } MainWindowBase::DockWindowType TrayMainWindow::windowType() const diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 0e4a9871c..a0b493246 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -59,9 +59,10 @@ TrayManagerWindow::TrayManagerWindow(QWidget *parent) , m_appPluginLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) , m_trayView(new TrayGridView(this)) - , m_model(new TrayModel(m_trayView, false, true)) + , m_model(TrayModel::getDockModel()) , m_delegate(new TrayDelegate(m_trayView, m_trayView)) , 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) @@ -120,20 +121,28 @@ void TrayManagerWindow::setPositon(Dock::Position position) else m_trayView->setOrientation(QListView::Flow::TopToBottom, false); - QModelIndex index = m_model->index(0, 0); - m_trayView->closePersistentEditor(index); TrayDelegate *delegate = static_cast(m_trayView->itemDelegate()); delegate->setPositon(position); - m_trayView->openPersistentEditor(index); m_trayView->setPosition(position); m_quickIconWidget->setPositon(position); m_dateTimeWidget->setPositon(position); m_systemPluginWidget->setPositon(position); + if (m_model->hasExpand()) { + // 切换位置的时候,需要先关闭编辑器,然后在model函数的flag方法中打开 + m_trayView->closePersistentEditor(m_model->index(0, 0)); + } updateLayout(); } +void TrayManagerWindow::setDisplayMode(Dock::DisplayMode displayMode) +{ + m_displayMode = displayMode; + // 从时尚模式切换到高效模式的时候,需要重新布局 + onTrayCountChanged(); +} + int TrayManagerWindow::appDatetimeSize(const Dock::Position &position) const { if (position == Dock::Position::Top || position == Dock::Position::Bottom) { @@ -208,6 +217,24 @@ QPainterPath TrayManagerWindow::roundedPaths() return path; } +void TrayManagerWindow::onTrayCountChanged() +{ + resetChildWidgetSize(); + Q_EMIT requestUpdate(); +} + +void TrayManagerWindow::onRequestUpdateWidget(const QList &idxs) +{ + for (int i = 0; i < idxs.size(); i++) { + int idx = idxs[i]; + if (idx < m_model->rowCount()) { + QModelIndex index = m_model->index(idx); + m_trayView->closePersistentEditor(index); + m_trayView->openPersistentEditor(index); + } + } +} + void TrayManagerWindow::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); @@ -230,11 +257,6 @@ void TrayManagerWindow::initUi() m_splitLine->setAutoFillBackground(true); m_splitLine->setPalette(pal); - WinInfo info; - info.type = TrayIconType::ExpandIcon; - m_model->addRow(info); - m_trayView->openPersistentEditor(m_model->index(0, 0)); - // 左侧的区域,包括应用托盘插件和下方的日期时间区域 m_appPluginLayout->setContentsMargins(0, 0, 0, 0); m_appPluginLayout->setSpacing(0); @@ -253,18 +275,9 @@ void TrayManagerWindow::initUi() void TrayManagerWindow::initConnection() { connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); - connect(m_trayView, &TrayGridView::rowCountChanged, this, [ this ] { - if (m_quickIconWidget->x() == 0) { - // 在加载界面的时候,会出现快捷设置区域的图标和左侧的托盘图标挤在一起(具体原因未知),此时需要延时50毫秒重新刷新界面来保证界面布局正常(临时解决方案) - QTimer::singleShot(50, this, [ this ] { - resetChildWidgetSize(); - Q_EMIT requestUpdate(); - }); - } else { - resetChildWidgetSize(); - Q_EMIT requestUpdate(); - } - }); + connect(m_model, &TrayModel::rowCountChanged, this, &TrayManagerWindow::onTrayCountChanged); + connect(m_model, &TrayModel::rowCountChanged, m_trayView, &TrayGridView::onUpdateEditorView); + connect(m_model, &TrayModel::requestRefreshEditor, m_trayView, &TrayGridView::onUpdateEditorView); connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, [ this ] { // 当插件数量发生变化的时候,需要调整尺寸 m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); @@ -287,28 +300,13 @@ void TrayManagerWindow::initConnection() Q_EMIT requestUpdate(); }); - connect(m_delegate, &TrayDelegate::visibleChanged, this, [ this ](const QModelIndex &index, bool visible) { - m_trayView->setRowHidden(index.row(), !visible); - resetChildWidgetSize(); - Q_EMIT requestUpdate(); - }); - connect(m_trayView, &TrayGridView::dragLeaved, m_delegate, [ this ]{ Q_EMIT m_delegate->requestDrag(true); }); connect(m_trayView, &TrayGridView::dragEntered, m_delegate, [ this ]{ Q_EMIT m_delegate->requestDrag(false); }); - connect(m_model, &TrayModel::requestUpdateWidget, this, [ this ](const QList &idxs) { - for (int i = 0; i < idxs.size(); i++) { - int idx = idxs[i]; - if (idx < m_model->rowCount()) { - QModelIndex index = m_model->index(idx); - m_trayView->closePersistentEditor(index); - m_trayView->openPersistentEditor(index); - } - } - }); + connect(m_model, &TrayModel::requestUpdateWidget, this, &TrayManagerWindow::onRequestUpdateWidget); connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &TrayManagerWindow::requestUpdate); m_trayView->installEventFilter(this); @@ -475,7 +473,7 @@ void TrayManagerWindow::dropEvent(QDropEvent *e) if (!e || !e->mimeData() || e->source() == this) return; - if (qobject_cast(e->source())) { + if (qobject_cast(e->source())) { const QuickPluginMimeData *mimeData = qobject_cast(e->mimeData()); if (!mimeData) return; diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 2e3580849..4068e9a45 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -57,6 +57,7 @@ public: void updateBorderRadius(int borderRadius); void updateLayout(); void setPositon(Dock::Position position); + void setDisplayMode(Dock::DisplayMode displayMode); QSize suitableSize() const; QSize suitableSize(const Dock::Position &position) const; @@ -83,6 +84,10 @@ private: int appDatetimeSize(const Dock::Position &position) const; QPainterPath roundedPaths(); +private Q_SLOTS: + void onTrayCountChanged(); + void onRequestUpdateWidget(const QList &idxs); + private: QWidget *m_appPluginDatetimeWidget; SystemPluginWindow *m_systemPluginWidget; @@ -95,6 +100,7 @@ private: TrayModel *m_model; TrayDelegate *m_delegate; Dock::Position m_position; + Dock::DisplayMode m_displayMode; QLabel *m_splitLine; DockInter *m_dockInter; bool m_singleShow; // 用于记录当前日期时间和插件区域是显示一行还是显示多行 From dd1ed1c0d43428be80695e588917f5b0a0f5a835 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 1 Nov 2022 10:16:07 +0000 Subject: [PATCH 107/257] =?UTF-8?q?feat:=20=E5=BF=AB=E6=8D=B7=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E6=94=AF=E6=8C=81=E6=8F=92=E4=BB=B6=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E7=9A=84=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 目前将声音的功能移到插件中实现,支持声音插件的面板的展示 Log: 简化任务栏代码,优化插件加载逻辑 Influence: 快捷面板,观察声音、亮度调整和音乐播放等功能是否显示正常 Task: https://pms.uniontech.com/task-view-208579.html Change-Id: I8fd7917e06dd7505da65dc36767166a779ffb0e6 --- frame/controller/quicksettingcontroller.cpp | 7 + frame/controller/quicksettingcontroller.h | 3 +- frame/model/volumemodel.cpp | 394 ------------------ frame/model/volumemodel.h | 135 ------ .../window/components/volumedeviceswidget.cpp | 260 ------------ frame/window/components/volumedeviceswidget.h | 74 ---- frame/window/components/volumewidget.cpp | 150 ------- frame/window/components/volumewidget.h | 64 --- frame/window/quicksettingcontainer.cpp | 224 +++++++--- frame/window/quicksettingcontainer.h | 8 +- .../settingdelegate.cpp | 0 .../components => widgets}/settingdelegate.h | 1 + .../slidercontainer.cpp | 0 .../components => widgets}/slidercontainer.h | 0 14 files changed, 179 insertions(+), 1141 deletions(-) delete mode 100644 frame/model/volumemodel.cpp delete mode 100644 frame/model/volumemodel.h delete mode 100644 frame/window/components/volumedeviceswidget.cpp delete mode 100644 frame/window/components/volumedeviceswidget.h delete mode 100644 frame/window/components/volumewidget.cpp delete mode 100644 frame/window/components/volumewidget.h rename {frame/window/components => widgets}/settingdelegate.cpp (100%) rename {frame/window/components => widgets}/settingdelegate.h (96%) rename {frame/window/components => widgets}/slidercontainer.cpp (100%) rename {frame/window/components => widgets}/slidercontainer.h (100%) diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 4f05ec6c5..9021bc8c5 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -74,6 +74,13 @@ void QuickSettingController::pluginItemRemoved(PluginsItemInterface * const item Q_EMIT pluginRemoved(itemInter); } +void QuickSettingController::requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool show) +{ + // 设置插件列表可见事件 + if (show) + Q_EMIT requestAppletShow(itemInter, itemKey); +} + void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) { Q_EMIT pluginUpdated(itemInter, part); diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index e129da755..384333650 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -52,6 +52,7 @@ Q_SIGNALS: void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute &); void pluginRemoved(PluginsItemInterface *itemInter); void pluginUpdated(PluginsItemInterface *, const DockPart &); + void requestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); protected: explicit QuickSettingController(QObject *parent = Q_NULLPTR); @@ -63,7 +64,7 @@ protected: void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &) override; void requestPluginWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} void requestRefreshPluginWindowVisible(PluginsItemInterface * const, const QString &) override {} - void requestSetPluginAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} + void requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool show) override; void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; diff --git a/frame/model/volumemodel.cpp b/frame/model/volumemodel.cpp deleted file mode 100644 index 45d2845cd..000000000 --- a/frame/model/volumemodel.cpp +++ /dev/null @@ -1,394 +0,0 @@ -#include "volumemodel.h" - -#include -#include -#include -#include -#include - -/** - * @brief 声音控制的类 - * @param parent - */ - -static const QString serviceName = QString("org.deepin.daemon.Audio1"); -static const QString servicePath = QString("/org/deepin/daemon/Audio1"); - -VolumeModel::VolumeModel(QObject *parent) - : QObject(parent) - , m_audio(new DBusAudio(serviceName, servicePath, QDBusConnection::sessionBus(), this)) -{ - reloadSinks(); - reloadPorts(); - connect(m_audio, &DBusAudio::DefaultSinkChanged, this, &VolumeModel::onDefaultSinkChanged); -} - -VolumeModel::~VolumeModel() -{ - clearPorts(); - clearSinks(); -} - -void VolumeModel::setActivePort(AudioPorts *port) -{ - m_audio->SetPort(port->cardId(), port->name(), port->direction()); -} - -QList VolumeModel::sinks() const -{ - return m_sinks; -} - -QList VolumeModel::ports() const -{ - return m_ports; -} - -AudioSink *VolumeModel::defaultSink() const -{ - for (AudioSink *sink : m_sinks) { - if (sink->isDefault()) - return sink; - } - - return nullptr; -} - -void VolumeModel::setVolume(int volumn) -{ - for (AudioSink *audiosink : m_sinks) { - if (audiosink->isDefault()) { - audiosink->setVolume(volumn, true); - break; - } - } -} - -void VolumeModel::setMute(bool value) -{ - for (AudioSink *audiosink : m_sinks) { - if (audiosink->isDefault()) { - audiosink->setMute(value); - break; - } - } -} - -int VolumeModel::volume() -{ - for (AudioSink *audiosink : m_sinks) { - if (audiosink->isDefault()) - return audiosink->volume(); - } - - return 0; -} - -bool VolumeModel::isMute() -{ - for (AudioSink *audiosink : m_sinks) { - if (audiosink->isDefault()) - return audiosink->isMute(); - } - - return false; -} - -bool VolumeModel::existActiveOutputDevice() -{ - for (AudioPorts *port : m_ports) { - if (port->direction() == 1) - return true; - } - - return false; -} - -void VolumeModel::reloadSinks() -{ - clearSinks(); - const QString defaultSinkPath = m_audio->defaultSink().path(); - QList sinkPaths = m_audio->sinks(); - for (const QDBusObjectPath &sinkPath : sinkPaths) { - const QString path = sinkPath.path(); - AudioSink *sink = new AudioSink(path, (path == defaultSinkPath), this); - connect(sink, &AudioSink::volumeChanged, this, [ = ](int volume) { - if (sink->isDefault()) - Q_EMIT volumeChanged(volume); - }); - connect(sink, &AudioSink::muteChanged, this, [ = ](bool isMute) { - if (sink->isDefault()) - Q_EMIT muteChanged(isMute); - }); - - m_sinks << sink; - } -} - -void VolumeModel::reloadPorts() -{ - clearPorts(); - QString cards = m_audio->cardsWithoutUnavailable(); - QJsonParseError error; - QJsonDocument json = QJsonDocument::fromJson(cards.toLocal8Bit(), &error); - if (error.error != QJsonParseError::NoError) - return; - - uint sinkCardId = 0; - QString sinkCardName; - AudioSink *sink = defaultSink(); - if (sink) { - sinkCardId = sink->cardId(); - sinkCardName = sink->name(); - } - - QJsonArray array = json.array(); - for (const QJsonValue value : array) { - QJsonObject cardObject = value.toObject(); - uint cardId = static_cast(cardObject.value("Id").toInt()); - QString cardName = cardObject.value("Name").toString(); - QJsonArray jPorts = cardObject.value("Ports").toArray(); - for (const QJsonValue jPortValue : jPorts) { - QJsonObject jPort = jPortValue.toObject(); - if (!jPort.value("Enabled").toBool()) - continue; - - int direction = jPort.value("Direction").toInt(); - if (direction != 1) - continue; - - AudioPorts *port = new AudioPorts(cardId, cardName); - port->setName(jPort.value("Name").toString()); - port->setDescription(jPort.value("Description").toString()); - port->setDirection(direction); - if (port->cardId() == sinkCardId && port->name() == sinkCardName) - port->setIsChecked(true); - - m_ports << port; - } - } -} - -void VolumeModel::onDefaultSinkChanged(const QDBusObjectPath &value) -{ - AudioSink *audioSink = nullptr; - const QString defaultPath = value.path(); - for (AudioSink *sink : m_sinks) { - sink->setDefault(defaultPath == sink->m_devicePath); - if (sink->isDefault()) - audioSink = sink; - } - - if (!audioSink) - return; - - bool checkChanged = false; - for (AudioPorts *port : m_ports) { - bool oldChecked = port->isChecked(); - port->setIsChecked(port->cardId() == audioSink->cardId() - && port->name() == audioSink->name()); - - if (oldChecked != port->isChecked() && port->isChecked()) - checkChanged = true; - } - - if (checkChanged) - Q_EMIT checkPortChanged(); - - Q_EMIT defaultSinkChanged(audioSink); -} - -void VolumeModel::clearSinks() -{ - for (AudioSink *sink : m_sinks) - delete sink; - - m_sinks.clear(); -} - -void VolumeModel::clearPorts() -{ - for (AudioPorts *port : m_ports) - delete port; - - m_ports.clear(); -} - -/** - * @brief 具体的声音设备 - * @param parent - */ - -AudioSink::AudioSink(QString path, bool isDefault, QObject *parent) - : QObject(parent) - , m_devicePath(path) - , m_sink(new DBusSink(serviceName, path, QDBusConnection::sessionBus(), this)) - , m_isDefault(isDefault) -{ - connect(m_sink, &DBusSink::MuteChanged, this, &AudioSink::muteChanged); - connect(m_sink, &DBusSink::VolumeChanged, this, [ this ](double value) { - Q_EMIT this->volumeChanged(static_cast(value * 100)); - }); -} - -AudioSink::~AudioSink() -{ -} - -void AudioSink::setDefault(bool isDefaultSink) -{ - m_isDefault = isDefaultSink; -} - -bool AudioSink::isDefault() -{ - return m_isDefault; -} - -bool AudioSink::isHeadPhone() -{ - return false; -} - -void AudioSink::setBalance(double value, bool isPlay) -{ - m_sink->SetBalance(value, isPlay); -} - -void AudioSink::setFade(double value) -{ - m_sink->SetFade(value); -} - -void AudioSink::setMute(bool mute) -{ - m_sink->SetMute(mute); -} - -void AudioSink::setPort(QString name) -{ - m_sink->SetPort(name); -} - -void AudioSink::setVolume(int value, bool isPlay) -{ - m_sink->SetVolume((value * 0.01), isPlay); -} - -bool AudioSink::isMute() -{ - return m_sink->mute(); -} - -bool AudioSink::supportBalance() -{ - return m_sink->supportBalance(); -} - -bool AudioSink::suoportFade() -{ - return m_sink->supportFade(); -} - -double AudioSink::balance() -{ - return m_sink->balance(); -} - -double AudioSink::baseVolume() -{ - return m_sink->baseVolume(); -} - -double AudioSink::fade() -{ - return m_sink->fade(); -} - -int AudioSink::volume() -{ - return static_cast(m_sink->volume() * 100); -} - -QString AudioSink::description() -{ - return m_sink->activePort().description; -} - -QString AudioSink::name() -{ - return m_sink->activePort().name; -} - -uint AudioSink::cardId() -{ - return m_sink->card(); -} - -AudioPorts::AudioPorts(uint cardId, QString cardName) - : m_cardId(cardId) - , m_cardName(cardName) - , m_direction(0) - , m_isCheck(false) - , m_isHeadPhone(false) -{ -} - -AudioPorts::~AudioPorts() -{ -} - -uint AudioPorts::cardId() const -{ - return m_cardId; -} - -QString AudioPorts::cardName() const -{ - return m_cardName; -} - -void AudioPorts::setName(const QString &name) -{ - m_portName = name; -} - -QString AudioPorts::name() const -{ - return m_portName; -} - -void AudioPorts::setDescription(const QString &desc) -{ - m_description = desc; -} - -QString AudioPorts::description() const -{ - return m_description; -} - -void AudioPorts::setDirection(int dir) -{ - m_direction = dir; -} - -void AudioPorts::setIsChecked(bool isChecked) -{ - m_isCheck = isChecked; -} - -int AudioPorts::direction() const -{ - return m_direction; -} - -bool AudioPorts::isChecked() const -{ - return m_isCheck; -} - -bool AudioPorts::isHeadPhone() const -{ - return m_isHeadPhone; -} diff --git a/frame/model/volumemodel.h b/frame/model/volumemodel.h deleted file mode 100644 index ab3b82e92..000000000 --- a/frame/model/volumemodel.h +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef VOLUMNMODEL_H -#define VOLUMNMODEL_H - -#include "org_deepin_daemon_audio.h" -#include "org_deepin_daemon_audio_sink.h" - -#include - -using DBusAudio = org::deepin::daemon::Audio1; -using DBusSink = org::deepin::daemon::audio1::Sink; - -class QDBusMessage; -class AudioSink; -class AudioPorts; - -class VolumeModel : public QObject -{ - Q_OBJECT - -public: - explicit VolumeModel(QObject *parent); - ~VolumeModel(); - - void setActivePort(AudioPorts *port); - - QList sinks() const; - QList ports() const; - - AudioSink *defaultSink() const; - - void setVolume(int volume); - void setMute(bool value); - - int volume(); - bool isMute(); - bool existActiveOutputDevice(); - -Q_SIGNALS: - void defaultSinkChanged(AudioSink *); - void volumeChanged(int); - void muteChanged(bool); - void checkPortChanged(); - -private Q_SLOTS: - void onDefaultSinkChanged(const QDBusObjectPath & value); - -private: - void reloadSinks(); - void reloadPorts(); - void clearSinks(); - void clearPorts(); - -private: - QList m_sinks; - QList m_ports; - - DBusAudio *m_audio; -}; - -class AudioSink : public QObject -{ - Q_OBJECT - - friend class VolumeModel; - -Q_SIGNALS: - void volumeChanged(int); - void muteChanged(bool); - -public: - bool isDefault(); - bool isHeadPhone(); - - void setBalance(double value, bool isPlay); - void setFade(double value); - void setMute(bool mute); - void setPort(QString name); - void setVolume(int value, bool isPlay); - - bool isMute(); - bool supportBalance(); - bool suoportFade(); - double balance(); - double baseVolume(); - double fade(); - int volume(); - QString description(); - QString name(); - uint cardId(); - -protected: - explicit AudioSink(QString path, bool isDefault, QObject *parent = nullptr); - ~AudioSink(); - void setDefault(bool isDefaultSink); - -private: - QString m_devicePath; - DBusSink *m_sink; - bool m_isDefault; -}; - -class AudioPorts : public QObject -{ - Q_OBJECT - - friend class VolumeModel; - -public: - uint cardId() const; - QString cardName() const; - QString name() const; - QString description() const; - int direction() const; - bool isChecked() const; - bool isHeadPhone() const; - -protected: - AudioPorts(uint cardId, QString cardName); - ~AudioPorts(); - void setName(const QString &name); - void setDescription(const QString &desc); - void setDirection(int dir); - void setIsChecked(bool isChecked); - -private: - uint m_cardId; - QString m_cardName; - QString m_portName; - QString m_description; - int m_direction; - bool m_isCheck; - bool m_isHeadPhone; -}; - -#endif // VOLUMNMODEL_H diff --git a/frame/window/components/volumedeviceswidget.cpp b/frame/window/components/volumedeviceswidget.cpp deleted file mode 100644 index 009822288..000000000 --- a/frame/window/components/volumedeviceswidget.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "volumedeviceswidget.h" -#include "brightnessmodel.h" -#include "volumemodel.h" -#include "settingdelegate.h" -#include "imageutil.h" -#include "slidercontainer.h" -#include "dbusutil.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -#define HEADERHEIGHT 30 -#define ITEMSPACE 16 - -VolumeDevicesWidget::VolumeDevicesWidget(VolumeModel *model, QWidget *parent) - : QWidget(parent) - , m_sliderParent(new QWidget(this)) - , m_sliderContainer(new SliderContainer(m_sliderParent)) - , m_descriptionLabel(new QLabel(tr("Output Device"), this)) - , m_deviceList(new DListView(this)) - , m_volumeModel(model) - , m_audioSink(nullptr) - , m_model(new QStandardItemModel(this)) - , m_delegate(new SettingDelegate(m_deviceList)) -{ - initUi(); - initConnection(); - reloadAudioDevices(); - m_sliderParent->installEventFilter(this); - - QMetaObject::invokeMethod(this, [ this ] { - resetVolumeInfo(); - resizeHeight(); - }, Qt::QueuedConnection); -} - -VolumeDevicesWidget::~VolumeDevicesWidget() -{ -} - -bool VolumeDevicesWidget::eventFilter(QObject *watcher, QEvent *event) -{ - if ((watcher == m_sliderParent) && (event->type() == QEvent::Paint)) { - QPainter painter(m_sliderParent); - painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿 - painter.setPen(Qt::NoPen); - - DPalette dpa = DPaletteHelper::instance()->palette(m_sliderParent); - painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); - painter.drawRoundedRect(m_sliderParent->rect(), 10, 10); - } - - return QWidget::eventFilter(watcher, event); -} - -void VolumeDevicesWidget::initUi() -{ - QVBoxLayout *layout = new QVBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(6); - - m_sliderParent->setFixedHeight(36); - - QHBoxLayout *sliderLayout = new QHBoxLayout(m_sliderParent); - sliderLayout->setContentsMargins(11, 0, 11, 0); - sliderLayout->setSpacing(0); - - QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(24, 24)); - m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 5); - QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(24, 24)); - m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 7); - - SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); - m_sliderContainer->setSliderProxyStyle(proxy); - sliderLayout->addWidget(m_sliderContainer); - - QHBoxLayout *topLayout = new QHBoxLayout(this); - topLayout->setContentsMargins(10, 0, 10, 0); - topLayout->setSpacing(0); - topLayout->addWidget(m_sliderParent); - - layout->addLayout(topLayout); - layout->addSpacing(4); - layout->addWidget(m_descriptionLabel); - - m_deviceList->setModel(m_model); - m_deviceList->setViewMode(QListView::ListMode); - m_deviceList->setMovement(QListView::Free); - m_deviceList->setItemRadius(12); - m_deviceList->setWordWrap(false); - m_deviceList->verticalScrollBar()->setVisible(false); - m_deviceList->horizontalScrollBar()->setVisible(false); - m_deviceList->setOrientation(QListView::Flow::TopToBottom, false); - layout->addWidget(m_deviceList); - m_deviceList->setSpacing(10); - - m_deviceList->setItemDelegate(m_delegate); -} - -void VolumeDevicesWidget::reloadAudioDevices() -{ - QList ports = m_volumeModel->ports(); - for (AudioPorts *port : ports) { - DStandardItem *item = new DStandardItem; - item->setText(QString("%1(%2)").arg(port->description()).arg(port->cardName())); - item->setIcon(QIcon(soundIconFile(port))); - item->setFlags(Qt::NoItemFlags); - item->setData(port->isChecked(), itemCheckRole); - item->setData(QVariant::fromValue(port), itemDataRole); - m_model->appendRow(item); - if (port->isChecked()) - m_deviceList->setCurrentIndex(m_model->indexFromItem(item)); - } - - DStandardItem *settingItem = new DStandardItem; - settingItem->setText(tr("Sound settings")); - settingItem->setFlags(Qt::NoItemFlags); - settingItem->setData(false, itemCheckRole); - m_model->appendRow(settingItem); -} - -void VolumeDevicesWidget::initConnection() -{ - m_audioSink = m_volumeModel->defaultSink(); - - if (m_audioSink) - connect(m_audioSink, &AudioSink::volumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); - connect(m_volumeModel, &VolumeModel::defaultSinkChanged, this, [ this ](AudioSink *sink) { - if (m_audioSink) - disconnect(m_audioSink); - - m_audioSink = sink; - if (sink) - connect(sink, &AudioSink::volumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); - - resetVolumeInfo(); - m_deviceList->update(); - }); - - connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { - AudioSink *defSink = m_volumeModel->defaultSink(); - if (!defSink) - return; - - defSink->setVolume(value, true); - }); - connect(m_volumeModel, &VolumeModel::checkPortChanged, this, [ this ] { - for (int i = 0; i < m_model->rowCount(); i++) { - QModelIndex index = m_model->index(i, 0); - AudioPorts *port = index.data(itemDataRole).value(); - if (port) - m_model->setData(index, port->isChecked(), itemCheckRole); - } - m_deviceList->update(); - }); - - connect(m_delegate, &SettingDelegate::selectIndexChanged, this, [ this ](const QModelIndex &index) { - AudioPorts *port = index.data(itemDataRole).value(); - if (port) { - m_volumeModel->setActivePort(port); - m_deviceList->update(); - } else { - // 打开控制中心的声音模块 - DDBusSender().service(controllCenterService) - .path(controllCenterPath) - .interface(controllCenterInterface) - .method("ShowPage").arg(QString("sound")).call(); - hide(); - } - }); -} - -QString VolumeDevicesWidget::leftIcon() -{ - QString iconLeft = QString(":/icons/resources/audio-volume-%1").arg(m_volumeModel->isMute() ? "muted" : "low"); - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - iconLeft.append("-dark"); - - return iconLeft; -} - -QString VolumeDevicesWidget::rightIcon() -{ - QString iconRight = QString(":/icons/resources/audio-volume-high"); - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - iconRight.append("-dark"); - - return iconRight; -} - -const QString VolumeDevicesWidget::soundIconFile(AudioPorts *port) const -{ - if (!port) - return QString(); - - if (port->isHeadPhone()) { - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - return QString(":/icons/resources/ICON_Device_Headphone_dark.svg"); - - return QString(":/icons/resources/ICON_Device_Headphone.svg"); - } - - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - return QString(":/icons/resources/ICON_Device_Laptop_dark.svg"); - - return QString(":/icons/resources/ICON_Device_Laptop.svg"); -} - -void VolumeDevicesWidget::resizeHeight() -{ - m_deviceList->adjustSize(); - QMargins m = layout()->contentsMargins(); - int height = m.top() + m.bottom() + HEADERHEIGHT + m_sliderContainer->height() + ITEMSPACE - + m_descriptionLabel->height() + m_deviceList->height(); - - setFixedHeight(height); -} - -void VolumeDevicesWidget::resetVolumeInfo() -{ - AudioSink *defaultSink = m_volumeModel->defaultSink(); - if (!defaultSink) - return; - - m_sliderContainer->updateSliderValue(defaultSink->volume()); -} diff --git a/frame/window/components/volumedeviceswidget.h b/frame/window/components/volumedeviceswidget.h deleted file mode 100644 index f73b3c6f5..000000000 --- a/frame/window/components/volumedeviceswidget.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef VOLUMEDEVICESWIDGET_H -#define VOLUMEDEVICESWIDGET_H - -#include - -#include - -namespace Dtk { namespace Widget { class DListView; } } - -using namespace Dtk::Widget; - -class SliderContainer; -class QStandardItemModel; -class QLabel; -class VolumeModel; -class AudioPorts; -class AudioSink; -class SettingDelegate; - -class VolumeDevicesWidget : public QWidget -{ - Q_OBJECT - -public: - explicit VolumeDevicesWidget(VolumeModel *model, QWidget *parent = nullptr); - ~VolumeDevicesWidget() override; - -protected: - bool eventFilter(QObject *watcher, QEvent *event) override; - -private: - void initUi(); - void reloadAudioDevices(); - void initConnection(); - QString leftIcon(); - QString rightIcon(); - const QString soundIconFile(AudioPorts *port) const; - - void resizeHeight(); - - void resetVolumeInfo(); - -private: - QWidget *m_sliderParent; - SliderContainer *m_sliderContainer; - QLabel *m_descriptionLabel; - DListView *m_deviceList; - VolumeModel *m_volumeModel; - AudioSink *m_audioSink; - QStandardItemModel *m_model; - SettingDelegate *m_delegate; -}; - -#endif // VOLUMEDEVICESWIDGET_H diff --git a/frame/window/components/volumewidget.cpp b/frame/window/components/volumewidget.cpp deleted file mode 100644 index 89532fbe5..000000000 --- a/frame/window/components/volumewidget.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "volumewidget.h" -#include "brightnessmodel.h" -#include "imageutil.h" -#include "volumemodel.h" -#include "imageutil.h" -#include "slidercontainer.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE - -#define ICON_SIZE 24 -#define BACKSIZE 36 - -VolumeWidget::VolumeWidget(VolumeModel *model, QWidget *parent) - : DBlurEffectWidget(parent) - , m_model(model) - , m_sliderContainer(new SliderContainer(this)) - , m_defaultSink(m_model->defaultSink()) -{ - initUi(); - initConnection(); -} - -VolumeWidget::~VolumeWidget() -{ -} - -void VolumeWidget::initUi() -{ - if (m_defaultSink) - m_sliderContainer->updateSliderValue(m_defaultSink->volume()); - - QHBoxLayout *mainLayout = new QHBoxLayout(this); - mainLayout->setContentsMargins(17, 0, 12, 0); - mainLayout->addWidget(m_sliderContainer); - - QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE)); - QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); - m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 12); - m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); - - SliderProxyStyle *proxy = new SliderProxyStyle; - m_sliderContainer->setSliderProxyStyle(proxy); - - bool existActiveOutputDevice = m_model->existActiveOutputDevice(); - setEnabled(existActiveOutputDevice); -} - -void VolumeWidget::initConnection() -{ - if (m_defaultSink) - connect(m_defaultSink, &AudioSink::volumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); - - connect(m_model, &VolumeModel::defaultSinkChanged, this, [ this ](AudioSink *sink) { - if (m_defaultSink) - disconnect(m_defaultSink); - - m_defaultSink = sink; - if (sink) { - m_sliderContainer->updateSliderValue(sink->volume()); - connect(sink, &AudioSink::volumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); - } - }); - - connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { - AudioSink *sink = m_model->defaultSink(); - if (sink) - sink->setVolume(value, true); - }); - - connect(m_model, &VolumeModel::muteChanged, this, [ this ] { - m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, QIcon(leftIcon())); - }); - - connect(m_sliderContainer, &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition icon) { - switch (icon) { - case SliderContainer::IconPosition::LeftIcon: { - if (m_model->existActiveOutputDevice()) - m_model->setMute(!m_model->isMute()); - break; - } - case SliderContainer::IconPosition::RightIcon: { - // 弹出音量选择对话框 - Q_EMIT rightIconClick(); - break; - } - } - }); -} - -void VolumeWidget::showEvent(QShowEvent *event) -{ - DBlurEffectWidget::showEvent(event); - Q_EMIT visibleChanged(true); -} - -void VolumeWidget::hideEvent(QHideEvent *event) -{ - DBlurEffectWidget::hideEvent(event); - Q_EMIT visibleChanged(false); -} - -const QString VolumeWidget::leftIcon() -{ - bool existActiveOutputDevice = m_model->existActiveOutputDevice(); - const bool mute = existActiveOutputDevice ? m_model->isMute() : true; - if (mute) - return QString(":/icons/resources/audio-volume-muted-dark"); - - return QString(":/icons/resources/volume"); -} - -const QString VolumeWidget::rightIcon() -{ - return QString(":/icons/resources/broadcast"); -} diff --git a/frame/window/components/volumewidget.h b/frame/window/components/volumewidget.h deleted file mode 100644 index e20fe344c..000000000 --- a/frame/window/components/volumewidget.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef VOLUMEWIDGET_H -#define VOLUMEWIDGET_H - -#include -#include - -class VolumeModel; -class QDBusMessage; -class SliderContainer; -class QLabel; -class AudioSink; - -DWIDGET_USE_NAMESPACE - -class VolumeWidget : public DBlurEffectWidget -{ - Q_OBJECT - -public: - explicit VolumeWidget(VolumeModel *model, QWidget *parent = nullptr); - ~VolumeWidget() override; - -Q_SIGNALS: - void visibleChanged(bool); - void rightIconClick(); - -protected: - void initUi(); - void initConnection(); - - void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; - -private: - const QString leftIcon(); - const QString rightIcon(); - -private: - VolumeModel *m_model; - SliderContainer *m_sliderContainer; - AudioSink *m_defaultSink; -}; - -#endif // VOLUMEWIDGET_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index c7fa72423..a91ebc6ab 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -27,10 +27,7 @@ #include "dockpopupwindow.h" #include "brightnesswidget.h" #include "slidercontainer.h" -#include "volumewidget.h" -#include "volumedeviceswidget.h" #include "pluginchildpage.h" -#include "volumemodel.h" #include "utils.h" #include "displaysettingwidget.h" @@ -47,11 +44,13 @@ DWIDGET_USE_NAMESPACE struct QuickDragInfo { QPoint dragPosition; - QuickSettingItem *dragItem = nullptr; + QWidget *dragItem = nullptr; + PluginsItemInterface *pluginInter = nullptr; void reset() { dragPosition.setX(0); dragPosition.setY(0); dragItem = nullptr; + pluginInter = nullptr; } bool isNull() { return !dragItem; @@ -76,11 +75,8 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_mainlayout(new QVBoxLayout(m_mainWidget)) , m_pluginLoader(QuickSettingController::instance()) , m_playerWidget(new MediaWidget(m_componentWidget)) - , m_volumeModel(new VolumeModel(this)) , m_brightnessModel(new BrightnessModel(this)) - , m_volumnWidget(new VolumeWidget(m_volumeModel, m_componentWidget)) , m_brihtnessWidget(new BrightnessWidget(m_brightnessModel, m_componentWidget)) - , m_volumeSettingWidget(new VolumeDevicesWidget(m_volumeModel, this)) , m_displaySettingWidget(new DisplaySettingWidget(this)) , m_childPage(new PluginChildPage(this)) , m_dragInfo(new struct QuickDragInfo) @@ -190,13 +186,27 @@ bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) break; } case QEvent::MouseButtonPress: { - QuickSettingItem *item = qobject_cast(watched); - if (!item) - break; - QMouseEvent *mouseEvent = static_cast(event); - m_dragInfo->dragPosition = mouseEvent->pos(); - m_dragInfo->dragItem = item; + QuickSettingItem *item = qobject_cast(watched); + if (item) { + m_dragInfo->dragPosition = mouseEvent->pos(); + m_dragInfo->dragItem = item; + m_dragInfo->pluginInter = item->pluginItem(); + } else { + QList plugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick); + for (PluginsItemInterface *plugin : plugins) { + if (!isApplet(plugin)) + continue; + + if (plugin->itemWidget(QUICK_ITEM_DETAIL_KEY) != watched) + continue; + + m_dragInfo->dragPosition = mouseEvent->pos(); + m_dragInfo->dragItem = plugin->itemWidget(QUICK_ITEM_DETAIL_KEY); + m_dragInfo->pluginInter = plugin; + break; + } + } break; } case QEvent::MouseButtonRelease: { @@ -228,36 +238,103 @@ QPoint QuickSettingContainer::hotSpot(const QPixmap &pixmap) return QPoint(pixmap.width(), pixmap.height()); } +bool QuickSettingContainer::isApplet(PluginsItemInterface *itemInter) const +{ + if (!itemInter->itemWidget(QUICK_ITEM_DETAIL_KEY)) + return false; + + QJsonObject json = QuickSettingController::instance()->metaData(itemInter); + if (!json.contains("applet")) + return false; + + return json.value("applet").toBool(); +} + void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter) { - initQuickItem(itemInter); - updateItemLayout(); + QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_DETAIL_KEY); + if (isApplet(itemInter)) { + // 如果存在这个窗体,就让其显示在下方 + DBlurEffectWidget *effectWidget = new DBlurEffectWidget(m_componentWidget); + QVBoxLayout *layout = new QVBoxLayout(effectWidget); + layout->setContentsMargins(0, 0, 0, 0); + itemWidget->setParent(effectWidget); + itemWidget->setVisible(true); + layout->addWidget(itemWidget); + effectWidget->setFixedHeight(itemWidget->height()); + effectWidget->setMaskColor(QColor(239, 240, 245)); + effectWidget->setBlurRectXRadius(8); + effectWidget->setBlurRectYRadius(8); + m_componentWidget->layout()->addWidget(effectWidget); + + itemWidget->installEventFilter(this); + } else { + // 如果不存在获取到的子窗体,就让其显示在上方插件显示的位置 + initQuickItem(itemInter); + updateItemLayout(); + } onResizeView(); } void QuickSettingContainer::onPluginRemove(PluginsItemInterface * itemInter) { - QuickSettingItem *quickItem = nullptr; - for (QuickSettingItem *settingItem : m_quickSettings) { - if (settingItem->pluginItem() != itemInter) - continue; + QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_DETAIL_KEY); + if (itemWidget) { + for (int i = 0; i < m_componentWidget->layout()->count(); i++) { + QLayoutItem *layoutItem = m_componentWidget->layout()->itemAt(i); + if (!layoutItem) + continue; - quickItem = settingItem; - break; + DBlurEffectWidget *effectWidget = qobject_cast(layoutItem->widget()); + if (!effectWidget || !effectWidget->layout()) + continue; + + bool found = false; + for (int j = 0; j < effectWidget->layout()->count(); j++) { + QLayoutItem *layoutItem = effectWidget->layout()->itemAt(i); + if (!layoutItem) + continue; + + if (layoutItem->widget() == itemWidget) { + effectWidget->layout()->removeWidget(itemWidget); + itemWidget->setParent(nullptr); + found = true; + break; + } + } + + if (!found) + continue; + + m_componentWidget->layout()->removeWidget(effectWidget); + effectWidget->setParent(nullptr); + effectWidget->deleteLater(); + break; + } + } else { + QuickSettingItem *quickItem = nullptr; + for (QuickSettingItem *settingItem : m_quickSettings) { + if (settingItem->pluginItem() != itemInter) + continue; + + quickItem = settingItem; + break; + } + if (!quickItem) + return; + + m_pluginLayout->removeWidget(quickItem); + m_quickSettings.removeOne(quickItem); + disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); + quickItem->setParent(nullptr); + quickItem->removeEventFilter(this); + quickItem->setMouseTracking(false); + quickItem->deleteLater(); + + //调整子控件的位置 + updateItemLayout(); } - if (!quickItem) - return; - m_pluginLayout->removeWidget(quickItem); - m_quickSettings.removeOne(quickItem); - disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); - quickItem->setParent(nullptr); - quickItem->removeEventFilter(this); - quickItem->setMouseTracking(false); - quickItem->deleteLater(); - - //调整子控件的位置 - updateItemLayout(); onResizeView(); } @@ -269,16 +346,23 @@ void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) QPoint pointCurrent = event->pos(); if (qAbs(m_dragInfo->dragPosition.x() - pointCurrent.x()) > 5 || qAbs(m_dragInfo->dragPosition.y() - pointCurrent.y()) > 5) { - QuickSettingItem *moveItem = m_dragInfo->dragItem; - m_dragInfo->reset(); QDrag *drag = new QDrag(this); - QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem->pluginItem()); + QuickSettingItem *moveItem = qobject_cast(m_dragInfo->dragItem); + QuickPluginMimeData *mimedata = new QuickPluginMimeData(m_dragInfo->pluginInter); drag->setMimeData(mimedata); - QPixmap dragPixmap = moveItem->dragPixmap(); - drag->setPixmap(dragPixmap); - drag->setHotSpot(hotSpot(dragPixmap)); + if (moveItem) { + QPixmap dragPixmap = moveItem->dragPixmap(); + drag->setPixmap(dragPixmap); + drag->setHotSpot(hotSpot(dragPixmap)); + } else { + // 如果拖动的是声音等插件 + QPixmap dragPixmap = m_dragInfo->dragItem->grab(); + drag->setPixmap(dragPixmap); + drag->setHotSpot(hotSpot(dragPixmap)); + } + m_dragInfo->reset(); drag->exec(Qt::MoveAction | Qt::CopyAction); } } @@ -312,11 +396,9 @@ void QuickSettingContainer::initUi() // 添加音乐播放插件 m_playerWidget->setFixedHeight(ITEMHEIGHT); - m_volumnWidget->setFixedHeight(ITEMHEIGHT); m_brihtnessWidget->setFixedHeight(ITEMHEIGHT); setWidgetStyle(m_playerWidget); - setWidgetStyle(m_volumnWidget); setWidgetStyle(m_brihtnessWidget); m_mainlayout->setSpacing(ITEMSPACE); @@ -336,20 +418,17 @@ void QuickSettingContainer::initUi() ctrlLayout->setSpacing(ITEMSPACE); ctrlLayout->addWidget(m_playerWidget); - ctrlLayout->addWidget(m_volumnWidget); ctrlLayout->addWidget(m_brihtnessWidget); m_mainlayout->addWidget(m_componentWidget); // 加载所有的插件 QList plugins = m_pluginLoader->pluginItems(QuickSettingController::PluginAttribute::Quick); for (PluginsItemInterface *plugin : plugins) - initQuickItem(plugin); + onPluginInsert(plugin); m_switchLayout->addWidget(m_mainWidget); m_switchLayout->addWidget(m_childPage); - m_volumeSettingWidget->hide(); - setMouseTracking(true); setAcceptDrops(true); @@ -373,12 +452,8 @@ void QuickSettingContainer::initConnection() onPluginInsert(itemInter); }); connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); + connect(m_pluginLoader, &QuickSettingController::requestAppletShow, this, &QuickSettingContainer::onRequestAppletShow); connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); - connect(m_volumnWidget, &VolumeWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); - connect(m_volumnWidget, &VolumeWidget::rightIconClick, this, [ this ] { - showWidget(m_volumeSettingWidget, tr("voice")); - onResizeView(); - }); connect(m_brihtnessWidget, &BrightnessWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); connect(m_brihtnessWidget->sliderContainer(), &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &iconPosition) { if (iconPosition == SliderContainer::RightIcon) { @@ -412,17 +487,50 @@ void QuickSettingContainer::onResizeView() m_pluginWidget->setFixedHeight(ITEMHEIGHT * rowCount + ITEMSPACE * (rowCount - 1)); - int panelCount = 0; - if (m_playerWidget->isVisible()) - panelCount++; - if (m_volumnWidget->isVisible()) - panelCount++; - if (m_brihtnessWidget->isVisible()) - panelCount++; + int height = 0; + int widgetCount = 0; + for (int i = 0; i < m_componentWidget->layout()->count(); i++) { + QLayoutItem *layoutItem = m_componentWidget->layout()->itemAt(i); + if (!layoutItem) + continue; + + DBlurEffectWidget *widget = qobject_cast(layoutItem->widget()); + if (!widget) + continue; + + if (widget == m_playerWidget || widget == m_brihtnessWidget) + continue; + + height += widget->height(); + widgetCount++; + } + + if (m_playerWidget->isVisible()) { + height += m_playerWidget->height(); + widgetCount++; + } + if (m_brihtnessWidget->isVisible()) { + height += m_brihtnessWidget->height(); + widgetCount++; + } + + m_componentWidget->setFixedHeight(height + (widgetCount - 1) * ITEMSPACE); - m_componentWidget->setFixedHeight(ITEMHEIGHT * panelCount + ITEMSPACE * (panelCount - 1)); setFixedHeight(ITEMSPACE * 3 + m_pluginWidget->height() + m_componentWidget->height()); } else if (m_switchLayout->currentWidget() == m_childPage) { setFixedHeight(m_childPage->height()); } } + +void QuickSettingContainer::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) +{ + if (itemKey == QUICK_ITEM_DETAIL_KEY) { + // 显示弹出的内容 + QWidget *itemApplet = itemInter->itemPopupApplet(itemKey); + if (!itemApplet) + return; + + showWidget(itemApplet, itemInter->pluginDisplayName()); + onResizeView(); + } +} diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index f2b714416..c56870fb0 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -33,9 +33,7 @@ class DockItem; class QVBoxLayout; class QuickSettingController; class MediaWidget; -class VolumeModel; class BrightnessModel; -class VolumeWidget; class BrightnessWidget; class QuickSettingItem; class DockPopupWindow; @@ -70,6 +68,7 @@ private Q_SLOTS: void onPluginRemove(PluginsItemInterface * itemInter); void onItemDetailClick(PluginsItemInterface *pluginInter); void onResizeView(); + void onRequestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); private: // 加载UI @@ -84,6 +83,8 @@ private: void showWidget(QWidget *widget, const QString &title); // 获取拖动图标的热点 QPoint hotSpot(const QPixmap &pixmap); + // 判断是否支持显示在面板上 + bool isApplet(PluginsItemInterface * itemInter) const; private: static DockPopupWindow *m_popWindow; @@ -96,12 +97,9 @@ private: QVBoxLayout *m_mainlayout; QuickSettingController *m_pluginLoader; MediaWidget *m_playerWidget; - VolumeModel *m_volumeModel; BrightnessModel *m_brightnessModel; - VolumeWidget *m_volumnWidget; BrightnessWidget *m_brihtnessWidget; - VolumeDevicesWidget *m_volumeSettingWidget; DisplaySettingWidget *m_displaySettingWidget; PluginChildPage *m_childPage; QuickDragInfo *m_dragInfo; diff --git a/frame/window/components/settingdelegate.cpp b/widgets/settingdelegate.cpp similarity index 100% rename from frame/window/components/settingdelegate.cpp rename to widgets/settingdelegate.cpp diff --git a/frame/window/components/settingdelegate.h b/widgets/settingdelegate.h similarity index 96% rename from frame/window/components/settingdelegate.h rename to widgets/settingdelegate.h index b55f83371..c12f0d2d9 100644 --- a/frame/window/components/settingdelegate.h +++ b/widgets/settingdelegate.h @@ -27,6 +27,7 @@ DWIDGET_USE_NAMESPACE static const int itemCheckRole = Dtk::UserRole + 1; static const int itemDataRole = Dtk::UserRole + 2; +static const int itemFlagRole = Dtk::UserRole + 3; class SettingDelegate : public DStyledItemDelegate { diff --git a/frame/window/components/slidercontainer.cpp b/widgets/slidercontainer.cpp similarity index 100% rename from frame/window/components/slidercontainer.cpp rename to widgets/slidercontainer.cpp diff --git a/frame/window/components/slidercontainer.h b/widgets/slidercontainer.h similarity index 100% rename from frame/window/components/slidercontainer.h rename to widgets/slidercontainer.h From 9985c9b2392edc318765032d0d9b7f7e3a2a5a4b Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 1 Nov 2022 08:13:27 +0000 Subject: [PATCH 108/257] =?UTF-8?q?feat:=20=E5=A3=B0=E9=9F=B3=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E9=80=82=E9=85=8Dv23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将声音的相关功能移到sound插件中,方便扩展,并适配v23的接口 Log: 声音插件适配v23 Influence: 观察任务栏是否存在声音插件 Task: https://pms.uniontech.com/task-view-210309.html Change-Id: I7f782af6955a017af940e639a02eedab8f459905 --- plugins/CMakeLists.txt | 2 +- plugins/sound/CMakeLists.txt | 5 +- plugins/sound/sound.json | 3 +- plugins/sound/soundapplet.cpp | 4 +- plugins/sound/sounddeviceswidget.cpp | 282 +++++++++++++++++++++++++++ plugins/sound/sounddeviceswidget.h | 84 ++++++++ plugins/sound/sounditem.cpp | 5 + plugins/sound/sounditem.h | 1 + plugins/sound/soundplugin.cpp | 38 +++- plugins/sound/soundplugin.h | 7 + plugins/sound/soundwidget.cpp | 154 +++++++++++++++ plugins/sound/soundwidget.h | 66 +++++++ 12 files changed, 638 insertions(+), 13 deletions(-) create mode 100644 plugins/sound/sounddeviceswidget.cpp create mode 100644 plugins/sound/sounddeviceswidget.h create mode 100644 plugins/sound/soundwidget.cpp create mode 100644 plugins/sound/soundwidget.h diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index de79d7fd0..298eeda5d 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -2,7 +2,7 @@ #add_subdirectory("disk-mount") add_subdirectory("shutdown") add_subdirectory("power") -#add_subdirectory("sound") +add_subdirectory("sound") #add_subdirectory("tray") add_subdirectory("trash") add_subdirectory("keyboard-layout") diff --git a/plugins/sound/CMakeLists.txt b/plugins/sound/CMakeLists.txt index 1e677d8db..0624825f0 100644 --- a/plugins/sound/CMakeLists.txt +++ b/plugins/sound/CMakeLists.txt @@ -28,12 +28,13 @@ pkg_check_modules(QGSettings REQUIRED gsettings-qt) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} resources/sound.qrc) -set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../system-trays) +set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../quick-trays) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} ./dbusinterface ./dbusinterface/generation_dbus_interface ../../interfaces + ../../widgets ../../frame ../../frame/accessible ../../frame/qtdbusextended @@ -48,4 +49,4 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE ${Qt5Svg_LIBRARIES} ) -install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/system-trays) +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/quick-trays) diff --git a/plugins/sound/sound.json b/plugins/sound/sound.json index 181aef926..e5b6168c7 100644 --- a/plugins/sound/sound.json +++ b/plugins/sound/sound.json @@ -1,4 +1,5 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "org.deepin.daemon.Audio1" + "depends-daemon-dbus-service": "org.deepin.daemon.Audio1", + "applet": true } diff --git a/plugins/sound/soundapplet.cpp b/plugins/sound/soundapplet.cpp index c9e78b94e..067b53c3e 100644 --- a/plugins/sound/soundapplet.cpp +++ b/plugins/sound/soundapplet.cpp @@ -285,7 +285,7 @@ void SoundApplet::onDefaultSinkChanged() connect(m_defSinkInter, &DBusSink::VolumeChanged, this, &SoundApplet::onVolumeChanged); connect(m_defSinkInter, &DBusSink::MuteChanged, this, [ = ] { - onVolumeChanged(m_defSinkInter->volume()); + onVolumeChanged(m_defSinkInter->volume() * 100); }); QString portId = m_defSinkInter->activePort().name; @@ -297,7 +297,7 @@ void SoundApplet::onDefaultSinkChanged() activePort(portId,cardId); //无声卡状态下,会有伪sink设备,显示音量为0 - onVolumeChanged(findPort(portId, cardId) != nullptr ? m_defSinkInter->volume() : 0); + onVolumeChanged(findPort(portId, cardId) != nullptr ? m_defSinkInter->volume() * 100 : 0); emit defaultSinkChanged(m_defSinkInter); } diff --git a/plugins/sound/sounddeviceswidget.cpp b/plugins/sound/sounddeviceswidget.cpp new file mode 100644 index 000000000..7557b6511 --- /dev/null +++ b/plugins/sound/sounddeviceswidget.cpp @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "sounddeviceswidget.h" +#include "brightnessmodel.h" +#include "settingdelegate.h" +#include "imageutil.h" +#include "slidercontainer.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +#define HEADERHEIGHT 30 +#define ITEMSPACE 16 + +#define AUDIOPORT 0 +#define AUDIOSETTING 1 + +const int cardIdRole = itemFlagRole + 1; + +SoundDevicesWidget::SoundDevicesWidget(QWidget *parent) + : QWidget(parent) + , m_sliderParent(new QWidget(this)) + , m_sliderContainer(new SliderContainer(m_sliderParent)) + , m_descriptionLabel(new QLabel(tr("Output Device"), this)) + , m_deviceList(new DListView(this)) + , m_volumeModel(new DBusAudio("org.deepin.daemon.Audio1", "/org/deepin/daemon/Audio1", QDBusConnection::sessionBus(), this)) + , m_audioSink(new DBusSink("org.deepin.daemon.Audio1", m_volumeModel->defaultSink().path(), QDBusConnection::sessionBus(), this)) + , m_model(new QStandardItemModel(this)) + , m_delegate(new SettingDelegate(m_deviceList)) +{ + initUi(); + initConnection(); + onAudioDevicesChanged(); + m_sliderParent->installEventFilter(this); + + QMetaObject::invokeMethod(this, [ this ] { + resetVolumeInfo(); + resizeHeight(); + }, Qt::QueuedConnection); +} + +SoundDevicesWidget::~SoundDevicesWidget() +{ +} + +bool SoundDevicesWidget::eventFilter(QObject *watcher, QEvent *event) +{ + if ((watcher == m_sliderParent) && (event->type() == QEvent::Paint)) { + QPainter painter(m_sliderParent); + painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿 + painter.setPen(Qt::NoPen); + + DPalette dpa = DPaletteHelper::instance()->palette(m_sliderParent); + painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); + painter.drawRoundedRect(m_sliderParent->rect(), 10, 10); + } + + return QWidget::eventFilter(watcher, event); +} + +void SoundDevicesWidget::initUi() +{ + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(6); + + m_sliderParent->setFixedHeight(36); + + QHBoxLayout *sliderLayout = new QHBoxLayout(m_sliderParent); + sliderLayout->setContentsMargins(11, 0, 11, 0); + sliderLayout->setSpacing(0); + + QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(24, 24)); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 5); + QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(24, 24)); + m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 7); + + SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); + m_sliderContainer->setSliderProxyStyle(proxy); + sliderLayout->addWidget(m_sliderContainer); + + QHBoxLayout *topLayout = new QHBoxLayout(this); + topLayout->setContentsMargins(10, 0, 10, 0); + topLayout->setSpacing(0); + topLayout->addWidget(m_sliderParent); + + layout->addLayout(topLayout); + layout->addSpacing(4); + layout->addWidget(m_descriptionLabel); + + m_deviceList->setModel(m_model); + m_deviceList->setViewMode(QListView::ListMode); + m_deviceList->setMovement(QListView::Free); + m_deviceList->setItemRadius(12); + m_deviceList->setWordWrap(false); + m_deviceList->verticalScrollBar()->setVisible(false); + m_deviceList->horizontalScrollBar()->setVisible(false); + m_deviceList->setOrientation(QListView::Flow::TopToBottom, false); + layout->addWidget(m_deviceList); + m_deviceList->setSpacing(10); + + m_deviceList->setItemDelegate(m_delegate); +} + +void SoundDevicesWidget::onAudioDevicesChanged() +{ + QList ports = m_audioSink->ports(); + for (AudioPort port : ports) { + if (port.availability != 0 && port.availability != 2) + continue; + + uint cardId = audioPortCardId(port); + if (!m_volumeModel->IsPortEnabled(cardId, port.name)) + continue; + + DStandardItem *item = new DStandardItem; + item->setText(QString("%1(%2)").arg(port.description).arg(port.name)); + item->setIcon(QIcon(soundIconFile(port))); + item->setFlags(Qt::NoItemFlags); + item->setData(port.availability == 2, itemCheckRole); + item->setData(QVariant::fromValue(port), itemDataRole); + item->setData(AUDIOPORT, itemFlagRole); + item->setData(cardId, cardIdRole); + m_model->appendRow(item); + if (port.availability == 2) + m_deviceList->setCurrentIndex(m_model->indexFromItem(item)); + } + + DStandardItem *settingItem = new DStandardItem; + settingItem->setText(tr("Sound settings")); + settingItem->setFlags(Qt::NoItemFlags); + settingItem->setData(false, itemCheckRole); + settingItem->setData(AUDIOSETTING, itemFlagRole); + m_model->appendRow(settingItem); +} + +void SoundDevicesWidget::initConnection() +{ + connect(m_audioSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); + connect(m_volumeModel, &DBusAudio::DefaultSinkChanged, this, &SoundDevicesWidget::onDefaultSinkChanged); + connect(m_delegate, &SettingDelegate::selectIndexChanged, this, &SoundDevicesWidget::onSelectIndexChanged); + connect(m_volumeModel, &DBusAudio::PortEnabledChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); + connect(m_volumeModel, &DBusAudio::CardsWithoutUnavailableChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); + + connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { + m_audioSink->SetVolume(value, true); + }); +} + +QString SoundDevicesWidget::leftIcon() +{ + QString iconLeft = QString(":/icons/resources/audio-volume-%1").arg(m_audioSink->mute() ? "muted" : "low"); + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + iconLeft.append("-dark"); + + return iconLeft; +} + +QString SoundDevicesWidget::rightIcon() +{ + QString iconRight = QString(":/icons/resources/audio-volume-high"); + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + iconRight.append("-dark"); + + return iconRight; +} + +const QString SoundDevicesWidget::soundIconFile(const AudioPort port) const +{ + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/ICON_Device_Laptop_dark.svg"); + + return QString(":/icons/resources/ICON_Device_Laptop.svg"); +} + +void SoundDevicesWidget::resizeHeight() +{ + m_deviceList->adjustSize(); + QMargins m = layout()->contentsMargins(); + int height = m.top() + m.bottom() + HEADERHEIGHT + m_sliderContainer->height() + ITEMSPACE + + m_descriptionLabel->height() + m_deviceList->height(); + + setFixedHeight(height); +} + +void SoundDevicesWidget::resetVolumeInfo() +{ + m_sliderContainer->updateSliderValue(m_audioSink->volume() * 100); +} + +uint SoundDevicesWidget::audioPortCardId(const AudioPort &audioport) const +{ + QString cards = m_volumeModel->cardsWithoutUnavailable(); + QJsonParseError error; + QJsonDocument json = QJsonDocument::fromJson(cards.toLocal8Bit(), &error); + if (error.error != QJsonParseError::NoError) + return -1; + + QJsonArray array = json.array(); + for (const QJsonValue value : array) { + QJsonObject cardObject = value.toObject(); + uint cardId = static_cast(cardObject.value("Id").toInt()); + QJsonArray jPorts = cardObject.value("Ports").toArray(); + for (const QJsonValue jPortValue : jPorts) { + QJsonObject jPort = jPortValue.toObject(); + if (!jPort.value("Enabled").toBool()) + continue; + + int direction = jPort.value("Direction").toInt(); + if (direction != 1) + continue; + + if (jPort.value("Name").toString() == audioport.name) + return cardId; + } + } + + return -1; +} + +void SoundDevicesWidget::onSelectIndexChanged(const QModelIndex &index) +{ + int flag = index.data(itemFlagRole).toInt(); + if (flag == AUDIOPORT) { + // 如果是点击具体的声音设备 + AudioPort port = index.data(itemDataRole).value(); + uint cardId = index.data(cardIdRole).toUInt(); + if (cardId >= 0) { + m_volumeModel->SetPort(cardId, port.name, 1); + m_deviceList->update(); + } + } else { + // 如果是点击声音设置,则打开控制中心的声音模块 + DDBusSender().service("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .method("ShowPage").arg(QString("sound")).call(); + hide(); + } +} + +void SoundDevicesWidget::onDefaultSinkChanged(const QDBusObjectPath &value) +{ + delete m_audioSink; + m_audioSink = new DBusSink("org.deepin.daemon.Audio1", m_volumeModel->defaultSink().path(), QDBusConnection::sessionBus(), this); + connect(m_audioSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); + + resetVolumeInfo(); + m_deviceList->update(); +} diff --git a/plugins/sound/sounddeviceswidget.h b/plugins/sound/sounddeviceswidget.h new file mode 100644 index 000000000..776c84487 --- /dev/null +++ b/plugins/sound/sounddeviceswidget.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef SOUNDDEVICESWIDGET_H +#define SOUNDDEVICESWIDGET_H + +#include "org_deepin_daemon_audio.h" +#include "org_deepin_daemon_audio_sink.h" + +#include + +#include + +namespace Dtk { namespace Widget { class DListView; } } + +using namespace Dtk::Widget; + +class SliderContainer; +class QStandardItemModel; +class QLabel; +class VolumeModel; +class AudioSink; +class SettingDelegate; + +using DBusAudio = org::deepin::daemon::Audio1; +using DBusSink = org::deepin::daemon::audio1::Sink; + +class SoundDevicesWidget : public QWidget +{ + Q_OBJECT + +public: + explicit SoundDevicesWidget(QWidget *parent = nullptr); + ~SoundDevicesWidget() override; + +protected: + bool eventFilter(QObject *watcher, QEvent *event) override; + +private: + void initUi(); + void initConnection(); + QString leftIcon(); + QString rightIcon(); + const QString soundIconFile(const AudioPort port) const; + + void resizeHeight(); + + void resetVolumeInfo(); + uint audioPortCardId(const AudioPort &audioport) const; + +private Q_SLOTS: + void onSelectIndexChanged(const QModelIndex &index); + void onDefaultSinkChanged(const QDBusObjectPath & value); + void onAudioDevicesChanged(); + +private: + QWidget *m_sliderParent; + SliderContainer *m_sliderContainer; + QLabel *m_descriptionLabel; + DListView *m_deviceList; + DBusAudio *m_volumeModel; + DBusSink *m_audioSink; + QStandardItemModel *m_model; + SettingDelegate *m_delegate; +}; + +#endif // VOLUMEDEVICESWIDGET_H diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 1ac357979..1872af7d9 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -249,6 +249,11 @@ void SoundItem::refreshTips(const int volume, const bool force) } } +QPixmap SoundItem::pixmap() const +{ + return m_iconPixmap; +} + void SoundItem::sinkChanged(DBusSink *sink) { m_sinkInter = sink; diff --git a/plugins/sound/sounditem.h b/plugins/sound/sounditem.h index 2dd144367..d06b2d2e9 100644 --- a/plugins/sound/sounditem.h +++ b/plugins/sound/sounditem.h @@ -50,6 +50,7 @@ public: void refreshIcon(); void refreshTips(const int volume, const bool force = false); + QPixmap pixmap() const; signals: void requestContextMenu() const; diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 2dc55b321..81d915ffd 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -21,6 +21,8 @@ #include "soundplugin.h" #include "soundaccessible.h" +#include "soundwidget.h" +#include "sounddeviceswidget.h" #include #include @@ -28,8 +30,9 @@ #define STATE_KEY "enable" SoundPlugin::SoundPlugin(QObject *parent) - : QObject(parent), - m_soundItem(nullptr) + : QObject(parent) + , m_soundItem(nullptr) + , m_soundWidget(nullptr) { QAccessible::installFactory(soundAccessibleFactory); } @@ -52,9 +55,17 @@ void SoundPlugin::init(PluginProxyInterface *proxyInter) return; m_soundItem.reset(new SoundItem); + m_soundWidget.reset(new SoundWidget); + m_soundWidget->setFixedHeight(60); - if (!pluginIsDisable()) + m_soundDeviceWidget.reset(new SoundDevicesWidget); + + if (!pluginIsDisable()) { m_proxyInter->itemAdded(this, SOUND_KEY); + connect(m_soundWidget.data(), &SoundWidget::rightIconClick, this, [ this, proxyInter ] { + proxyInter->requestSetAppletVisible(this, QUICK_ITEM_DETAIL_KEY, true); + }); + } } void SoundPlugin::pluginStateSwitched() @@ -71,18 +82,19 @@ bool SoundPlugin::pluginIsDisable() QWidget *SoundPlugin::itemWidget(const QString &itemKey) { - if (itemKey == SOUND_KEY) { + if (itemKey == SOUND_KEY) return m_soundItem.data(); - } + + if (itemKey == QUICK_ITEM_DETAIL_KEY) + return m_soundWidget.data(); return nullptr; } QWidget *SoundPlugin::itemTipsWidget(const QString &itemKey) { - if (itemKey == SOUND_KEY) { + if (itemKey == SOUND_KEY) return m_soundItem->tipsWidget(); - } return nullptr; } @@ -92,6 +104,8 @@ QWidget *SoundPlugin::itemPopupApplet(const QString &itemKey) if (itemKey == SOUND_KEY) { return m_soundItem->popupApplet(); } + if (itemKey == QUICK_ITEM_DETAIL_KEY) + return m_soundDeviceWidget.data(); return nullptr; } @@ -138,6 +152,16 @@ void SoundPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } +QIcon SoundPlugin::icon(const DockPart &) +{ + return m_soundItem->pixmap(); +} + +PluginsItemInterface::PluginStatus SoundPlugin::status() const +{ + return SoundPlugin::Active; +} + void SoundPlugin::refreshPluginItemsVisible() { if (pluginIsDisable()) diff --git a/plugins/sound/soundplugin.h b/plugins/sound/soundplugin.h index a76d99ddf..f14f5020a 100644 --- a/plugins/sound/soundplugin.h +++ b/plugins/sound/soundplugin.h @@ -25,6 +25,9 @@ #include "pluginsiteminterface.h" #include "sounditem.h" +class SoundWidget; +class SoundDevicesWidget; + class SoundPlugin : public QObject, PluginsItemInterface { Q_OBJECT @@ -49,12 +52,16 @@ public: void setSortKey(const QString &itemKey, const int order) override; void refreshIcon(const QString &itemKey) override; void pluginSettingsChanged() override; + QIcon icon(const DockPart &) override; + PluginStatus status() const override; private: void refreshPluginItemsVisible(); private: QScopedPointer m_soundItem; + QScopedPointer m_soundWidget; + QScopedPointer m_soundDeviceWidget; }; #endif // SOUNDPLUGIN_H diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp new file mode 100644 index 000000000..3f6fbfbac --- /dev/null +++ b/plugins/sound/soundwidget.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "soundwidget.h" +#include "brightnessmodel.h" +#include "imageutil.h" +#include "imageutil.h" +#include "slidercontainer.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DGUI_USE_NAMESPACE + +#define ICON_SIZE 24 +#define BACKSIZE 36 + +SoundWidget::SoundWidget(QWidget *parent) + : QWidget(parent) + , m_dbusAudio(new DBusAudio("org.deepin.daemon.Audio1", "/org/deepin/daemon/Audio1", QDBusConnection::sessionBus(), this)) + , m_sliderContainer(new SliderContainer(this)) + , m_defaultSink(new DBusSink("org.deepin.daemon.Audio1", m_dbusAudio->defaultSink().path(), QDBusConnection::sessionBus(), this)) +{ + initUi(); + initConnection(); +} + +SoundWidget::~SoundWidget() +{ +} + +void SoundWidget::initUi() +{ + if (m_defaultSink) + m_sliderContainer->updateSliderValue(m_defaultSink->volume() * 100); + + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(17, 0, 12, 0); + mainLayout->addWidget(m_sliderContainer); + + QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE)); + QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 12); + m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); + + SliderProxyStyle *proxy = new SliderProxyStyle; + m_sliderContainer->setSliderProxyStyle(proxy); + + setEnabled(existActiveOutputDevice()); +} + +void SoundWidget::initConnection() +{ + connect(m_defaultSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); + + connect(m_dbusAudio, &DBusAudio::DefaultSinkChanged, this, [ this ](const QDBusObjectPath &value) { + if (m_defaultSink) + delete m_defaultSink; + + m_defaultSink = new DBusSink("org.deepin.daemon.Audio1", value.path(), QDBusConnection::sessionBus(), this); + m_sliderContainer->updateSliderValue(m_defaultSink->volume() * 100); + connect(m_defaultSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); + }); + + connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { + m_defaultSink->SetVolume(value, true); + }); + + connect(m_defaultSink, &DBusSink::MuteChanged, this, [ this ] { + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, QIcon(leftIcon())); + }); + + connect(m_sliderContainer, &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition icon) { + switch (icon) { + case SliderContainer::IconPosition::LeftIcon: { + if (existActiveOutputDevice()) + m_defaultSink->SetMute(!m_defaultSink->mute()); + break; + } + case SliderContainer::IconPosition::RightIcon: { + // 弹出音量选择对话框 + Q_EMIT rightIconClick(); + break; + } + } + }); +} + +const QString SoundWidget::leftIcon() +{ + const bool mute = existActiveOutputDevice() ? m_defaultSink->mute() : true; + if (mute) + return QString(":/icons/resources/audio-volume-muted-dark"); + + return QString(":/icons/resources/volume"); +} + +const QString SoundWidget::rightIcon() +{ + return QString(":/icons/resources/broadcast"); +} + +/** 判断是否存在未禁用的声音输出设备 + * @brief SoundApplet::existActiveOutputDevice + * @return 存在返回true,否则返回false + */ +bool SoundWidget::existActiveOutputDevice() const +{ + QString info = m_dbusAudio->property("CardsWithoutUnavailable").toString(); + + QJsonDocument doc = QJsonDocument::fromJson(info.toUtf8()); + QJsonArray jCards = doc.array(); + for (QJsonValue cV : jCards) { + QJsonObject jCard = cV.toObject(); + QJsonArray jPorts = jCard["Ports"].toArray(); + + for (QJsonValue pV : jPorts) { + QJsonObject jPort = pV.toObject(); + if (jPort["Direction"].toInt() == 1 && jPort["Enabled"].toBool()) + return true; + } + } + + return false; +} diff --git a/plugins/sound/soundwidget.h b/plugins/sound/soundwidget.h new file mode 100644 index 000000000..ea3cdc727 --- /dev/null +++ b/plugins/sound/soundwidget.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef SOUNDWIDGET_H +#define SOUNDWIDGET_H + +#include "org_deepin_daemon_audio.h" +#include "org_deepin_daemon_audio_sink.h" + +#include +#include + +class QDBusMessage; +class SliderContainer; +class QLabel; +class AudioSink; + +DWIDGET_USE_NAMESPACE + +using DBusAudio = org::deepin::daemon::Audio1; +using DBusSink = org::deepin::daemon::audio1::Sink; + +class SoundWidget : public QWidget +{ + Q_OBJECT + +public: + explicit SoundWidget(QWidget *parent = nullptr); + ~SoundWidget() override; + +Q_SIGNALS: + void rightIconClick(); + +protected: + void initUi(); + void initConnection(); + +private: + const QString leftIcon(); + const QString rightIcon(); + bool existActiveOutputDevice() const; + +private: + DBusAudio *m_dbusAudio; + SliderContainer *m_sliderContainer; + DBusSink *m_defaultSink; +}; + +#endif // VOLUMEWIDGET_H From cf376ebb3f4fa075bfea571e570c28e68fc528bb Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 4 Nov 2022 06:29:03 +0000 Subject: [PATCH 109/257] =?UTF-8?q?style:=20=E6=B6=88=E9=99=A4=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E8=AD=A6=E5=91=8A=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将代码中的过期的不建议使用的函数或类替换成建议使用的函数或类 Log: 消除编译警告 Influence: 无 Task: https://pms.uniontech.com/task-view-96831.html Change-Id: Ie42a3eed97013adb047105bcf75e07ff8e0277a0 --- frame/controller/proxyplugincontroller.cpp | 2 ++ frame/dbus/dbusdockadaptors.cpp | 2 +- frame/dbusinterface/types/zoneinfo.cpp | 2 +- frame/item/components/appsnapshot.cpp | 2 +- frame/pluginadapter/pluginadapter.cpp | 2 ++ frame/pluginadapter/pluginadapter.h | 1 + frame/pluginadapter/pluginsiteminterface_v20.h | 4 ++-- frame/util/utils.h | 4 ++-- frame/window/components/desktop_widget.cpp | 2 +- frame/window/tray/tray_model.cpp | 2 +- plugins/onboard/onboardplugin.cpp | 6 ++++-- .../overlay-warning/overlay-warning-plugin.cpp | 4 ++-- plugins/show-desktop/showdesktopplugin.cpp | 4 ++-- plugins/shutdown/shutdownplugin.cpp | 3 +-- plugins/sound/componments/volumeslider.cpp | 5 ++--- plugins/sound/sounditem.cpp | 2 +- plugins/trash/trashwidget.cpp | 15 ++++++++------- widgets/tipswidget.cpp | 4 ++-- 18 files changed, 36 insertions(+), 30 deletions(-) diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index f8a434188..d9a529b65 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -24,6 +24,7 @@ #include +#ifndef QT_DEBUG static QStringList getPathFromConf(const QString &key) { QSettings set("/etc/deepin/dde-dock.conf", QSettings::IniFormat); auto value = set.value(key).toString(); @@ -33,6 +34,7 @@ static QStringList getPathFromConf(const QString &key) { return QStringList(); } +#endif // 该方法用来设置所有的需要加载的插件的路径信息 static QMap getPluginPaths() diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index c85a6ecd5..8cca73401 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -116,7 +116,7 @@ QStringList DBusDockAdaptors::GetLoadedPlugins() } // 排序,保持和原先任务栏右键菜单中的插件列表顺序一致 - qSort(nameList.begin(), nameList.end(), [ = ] (const QString &name1, const QString &name2) { + std::sort(nameList.begin(), nameList.end(), [ = ] (const QString &name1, const QString &name2) { return name1 > name2; }); diff --git a/frame/dbusinterface/types/zoneinfo.cpp b/frame/dbusinterface/types/zoneinfo.cpp index 95b46df3a..20f987c60 100644 --- a/frame/dbusinterface/types/zoneinfo.cpp +++ b/frame/dbusinterface/types/zoneinfo.cpp @@ -40,7 +40,7 @@ bool ZoneInfo::operator ==(const ZoneInfo &what) const QDebug operator<<(QDebug argument, const ZoneInfo & info) { argument << info.m_zoneName << ',' << info.m_zoneCity << ',' << info.m_utcOffset << ','; - argument << info.i2 << ',' << info.i3 << ',' << info.i4 << endl; + argument << info.i2 << ',' << info.i3 << ',' << info.i4 << Qt::endl; return argument; } diff --git a/frame/item/components/appsnapshot.cpp b/frame/item/components/appsnapshot.cpp index a271fc617..25b6f01fc 100644 --- a/frame/item/components/appsnapshot.cpp +++ b/frame/item/components/appsnapshot.cpp @@ -118,7 +118,7 @@ void AppSnapshot::updateTitle() } QFontMetrics fm(m_3DtitleBtn->font()); - int textWidth = fm.width(title()) + 10 + BTN_TITLE_MARGIN; + int textWidth = fm.horizontalAdvance(title()) + 10 + BTN_TITLE_MARGIN; int titleWidth = SNAP_WIDTH - (TITLE_MARGIN * 2 + BORDER_MARGIN); if (textWidth < titleWidth) { diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp index 2fc20b9b4..dc2b72375 100644 --- a/frame/pluginadapter/pluginadapter.cpp +++ b/frame/pluginadapter/pluginadapter.cpp @@ -148,6 +148,7 @@ PluginsItemInterface::PluginType PluginAdapter::type() case PluginsItemInterface_V20::PluginType::Normal: return PluginsItemInterface::PluginType::Normal; } + return PluginsItemInterface::PluginType::Normal; } PluginsItemInterface::PluginSizePolicy PluginAdapter::pluginSizePolicy() const @@ -158,6 +159,7 @@ PluginsItemInterface::PluginSizePolicy PluginAdapter::pluginSizePolicy() const case PluginsItemInterface_V20::PluginSizePolicy::System: return PluginsItemInterface::PluginSizePolicy::System; } + return PluginsItemInterface::PluginSizePolicy::Custom; } QIcon PluginAdapter::icon(const DockPart &dockPart) diff --git a/frame/pluginadapter/pluginadapter.h b/frame/pluginadapter/pluginadapter.h index a9afbfc91..ad9c2a271 100644 --- a/frame/pluginadapter/pluginadapter.h +++ b/frame/pluginadapter/pluginadapter.h @@ -33,6 +33,7 @@ class PluginAdapter : public QObject, public PluginsItemInterface { Q_OBJECT + Q_INTERFACES(PluginsItemInterface) public: PluginAdapter(PluginsItemInterface_V20 *pluginInter); diff --git a/frame/pluginadapter/pluginsiteminterface_v20.h b/frame/pluginadapter/pluginsiteminterface_v20.h index ba992fc22..913aa0e9d 100644 --- a/frame/pluginadapter/pluginsiteminterface_v20.h +++ b/frame/pluginadapter/pluginsiteminterface_v20.h @@ -253,9 +253,9 @@ protected: QT_BEGIN_NAMESPACE -#define ModuleInterface_iid "com.deepin.dock.PluginsItemInterface" +#define ModuleInterfaceV20_iid "com.deepin.dock.PluginsItemInterface" -Q_DECLARE_INTERFACE(PluginsItemInterface_V20, ModuleInterface_iid) +Q_DECLARE_INTERFACE(PluginsItemInterface_V20, ModuleInterfaceV20_iid) QT_END_NAMESPACE #endif // PLUGINSITEMINTERFACE_H diff --git a/frame/util/utils.h b/frame/util/utils.h index fd4cfdd33..57da80219 100644 --- a/frame/util/utils.h +++ b/frame/util/utils.h @@ -189,8 +189,8 @@ inline int comparePluginApi(const QString &pluginApi1, const QString &pluginApi2 return 0; // 拆分版本号 - QStringList subPluginApis1 = pluginApi1.split(".", QString::SkipEmptyParts, Qt::CaseSensitive); - QStringList subPluginApis2 = pluginApi2.split(".", QString::SkipEmptyParts, Qt::CaseSensitive); + QStringList subPluginApis1 = pluginApi1.split(".", Qt::SkipEmptyParts, Qt::CaseSensitive); + QStringList subPluginApis2 = pluginApi2.split(".", Qt::SkipEmptyParts, Qt::CaseSensitive); for (int i = 0; i < subPluginApis1.size(); ++i) { auto subPluginApi1 = subPluginApis1[i]; if (subPluginApis2.size() > i) { diff --git a/frame/window/components/desktop_widget.cpp b/frame/window/components/desktop_widget.cpp index f21911490..a16e53fc8 100644 --- a/frame/window/components/desktop_widget.cpp +++ b/frame/window/components/desktop_widget.cpp @@ -37,7 +37,7 @@ void DesktopWidget::enterEvent(QEvent *event) { if (checkNeedShowDesktop()) { m_needRecoveryWin = true; - QProcess::startDetached("/usr/lib/deepin-daemon/desktop-toggle"); + QProcess::startDetached("/usr/lib/deepin-daemon/desktop-toggle", QStringList()); } m_isHover = true; diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index 7911adfb7..aa460d4cc 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -711,7 +711,7 @@ void TrayModel::insertRow(int index, WinInfo info) const WinInfo &wininfo = m_winInfos[i]; if (wininfo.key == info.key) { beginResetModel(); - m_winInfos.swap(index, i); + m_winInfos.swapItemsAt(index, i); endResetModel(); return; } diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index d3c522b67..28496dbb1 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -126,7 +126,9 @@ void OnboardPlugin::invokedMenuItem(const QString &itemKey, const QString &menuI Q_UNUSED(itemKey) Q_UNUSED(checked) - if (menuId != "onboard-settings") return; + if (menuId != "onboard-settings") + return; + if(!m_startupState) { QProcess *process = new QProcess; connect(process,&QProcess::started, this, [ = ] { @@ -142,7 +144,7 @@ void OnboardPlugin::invokedMenuItem(const QString &itemKey, const QString &menuI process->close(); process->deleteLater(); }); - process->start("onboard-settings"); + process->start("onboard-settings", QStringList()); } DBusDock DockInter(serviceName, servicePath, QDBusConnection::sessionBus(), this); diff --git a/plugins/overlay-warning/overlay-warning-plugin.cpp b/plugins/overlay-warning/overlay-warning-plugin.cpp index 4c588418d..f6d8d2969 100644 --- a/plugins/overlay-warning/overlay-warning-plugin.cpp +++ b/plugins/overlay-warning/overlay-warning-plugin.cpp @@ -192,9 +192,9 @@ void OverlayWarningPlugin::showCloseOverlayDialogPre() void OverlayWarningPlugin::showCloseOverlayDialog() { qDebug() << "start disable overlayroot process"; - const int result = QProcess::execute("/usr/bin/pkexec /usr/sbin/overlayroot-disable"); + const int result = QProcess::execute("/usr/bin/pkexec /usr/sbin/overlayroot-disable", QStringList()); if (result == 0) { - QProcess::startDetached("reboot"); + QProcess::startDetached("reboot", QStringList()); } else { qDebug() << "disable overlayroot failed, the return code is" << result; } diff --git a/plugins/show-desktop/showdesktopplugin.cpp b/plugins/show-desktop/showdesktopplugin.cpp index 506c6ce55..526e14829 100644 --- a/plugins/show-desktop/showdesktopplugin.cpp +++ b/plugins/show-desktop/showdesktopplugin.cpp @@ -87,7 +87,7 @@ bool ShowDesktopPlugin::pluginIsDisable() const QString ShowDesktopPlugin::itemCommand(const QString &itemKey) { if (itemKey == pluginName()) - QProcess::startDetached("/usr/lib/deepin-daemon/desktop-toggle"); + QProcess::startDetached("/usr/lib/deepin-daemon/desktop-toggle", QStringList()); return QString(); } @@ -127,7 +127,7 @@ void ShowDesktopPlugin::invokedMenuItem(const QString &itemKey, const QString &m Q_UNUSED(checked) if (menuId == "show-desktop") { - QProcess::startDetached("/usr/lib/deepin-daemon/desktop-toggle"); + QProcess::startDetached("/usr/lib/deepin-daemon/desktop-toggle", QStringList()); } else if (menuId == "remove") { pluginStateSwitched(); } diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index a18263687..3461c244b 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -368,8 +368,7 @@ bool ShutdownPlugin::checkSwap() QTextStream stream(body.toUtf8()); while (!stream.atEnd()) { const std::pair result = - checkIsPartitionType(stream.readLine().simplified().split( - " ", QString::SplitBehavior::SkipEmptyParts)); + checkIsPartitionType(stream.readLine().simplified().split(" ", Qt::SkipEmptyParts)); qint64 image_size{ get_power_image_size() }; if (result.first) { diff --git a/plugins/sound/componments/volumeslider.cpp b/plugins/sound/componments/volumeslider.cpp index 15e6ade6d..f21af93af 100644 --- a/plugins/sound/componments/volumeslider.cpp +++ b/plugins/sound/componments/volumeslider.cpp @@ -71,8 +71,7 @@ void VolumeSlider::mouseMoveEvent(QMouseEvent *e) void VolumeSlider::mouseReleaseEvent(QMouseEvent *e) { - if (e->button() == Qt::LeftButton) - { + if (e->button() == Qt::LeftButton) { m_pressed = false; emit requestPlaySoundEffect(); } @@ -84,7 +83,7 @@ void VolumeSlider::wheelEvent(QWheelEvent *e) m_timer->start(); - DSlider::setValue(value() + (e->delta() > 0 ? 2 : -2)); + DSlider::setValue(value() + (e->angleDelta().y() > 0 ? 2 : -2)); } void VolumeSlider::onTimeout() diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 1872af7d9..2b046ac28 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -166,7 +166,7 @@ void SoundItem::resizeEvent(QResizeEvent *e) void SoundItem::wheelEvent(QWheelEvent *e) { - QWheelEvent *event = new QWheelEvent(e->pos(), e->delta(), e->buttons(), e->modifiers()); + QWheelEvent *event = new QWheelEvent(e->position(), e->angleDelta().y(), e->buttons(), e->modifiers()); qApp->postEvent(m_applet->mainSlider(), event); e->accept(); diff --git a/plugins/trash/trashwidget.cpp b/plugins/trash/trashwidget.cpp index 6e0e44ae3..a399b6499 100644 --- a/plugins/trash/trashwidget.cpp +++ b/plugins/trash/trashwidget.cpp @@ -27,6 +27,8 @@ #include "constants.h" #include "trashwidget.h" +#include + #include #include #include @@ -239,13 +241,12 @@ void TrashWidget::setDragging(bool state) void TrashWidget::removeApp(const QString &appKey) { - const QString cmd("dbus-send --print-reply --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.UninstallApp string:\"" + appKey + "\""); - - QProcess *proc = new QProcess; - proc->start(cmd); - proc->waitForFinished(); - - proc->deleteLater(); + DDBusSender().service("org.deepin.dde.Launcher1") + .path("/org/deepin/dde/Launcher1") + .interface("org.deepin.dde.Launcher1") + .method("UninstallApp") + .arg(appKey) + .call(); } void TrashWidget::moveToTrash(const QUrl &url) diff --git a/widgets/tipswidget.cpp b/widgets/tipswidget.cpp index 1bdb90add..6e5e4907a 100644 --- a/widgets/tipswidget.cpp +++ b/widgets/tipswidget.cpp @@ -26,7 +26,7 @@ void TipsWidget::setText(const QString &text) m_text = "བོད་སྐད་ཡིག་གཟུགས་ཚད་ལེན་ཚོད་ལྟའི་སྐོར་གྱི་རྗོད་ཚིག"; #endif - setFixedSize(fontMetrics().width(m_text) + 20, fontMetrics().boundingRect(m_text).height()); + setFixedSize(fontMetrics().horizontalAdvance(m_text) + 20, fontMetrics().boundingRect(m_text).height()); update(); @@ -46,7 +46,7 @@ void TipsWidget::setTextList(const QStringList &textList) int width = 0; int height = 0; for (QString text : m_textList) { - width = qMax(width, fontMetrics().width(text) + 20); + width = qMax(width, fontMetrics().horizontalAdvance(text) + 20); height += fontMetrics().boundingRect(text).height(); } From 9e60447a4d57a9bdeeb15cc41dd966bc86bf6eab Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 2 Nov 2022 05:29:15 +0000 Subject: [PATCH 110/257] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除CMakeLists.txt中多余的包含文件,防止编译的时候找不到对应的包引起报错或者警告 Log: 消除编译警告 Influence: 无 Task: https://pms.uniontech.com/task-view-96831.html Change-Id: I0b432916718ef1d3e46b6840513640ab9007982a --- plugins/airplane-mode/CMakeLists.txt | 4 ++-- plugins/bluetooth/CMakeLists.txt | 4 ++-- plugins/multitasking/CMakeLists.txt | 2 +- plugins/onboard/CMakeLists.txt | 4 ++-- plugins/overlay-warning/CMakeLists.txt | 2 +- plugins/power/CMakeLists.txt | 4 ++-- plugins/show-desktop/CMakeLists.txt | 2 +- plugins/shutdown/CMakeLists.txt | 5 +++-- plugins/trash/CMakeLists.txt | 4 ++-- 9 files changed, 16 insertions(+), 15 deletions(-) diff --git a/plugins/airplane-mode/CMakeLists.txt b/plugins/airplane-mode/CMakeLists.txt index 3d6d8ee4f..fa4b51fc5 100644 --- a/plugins/airplane-mode/CMakeLists.txt +++ b/plugins/airplane-mode/CMakeLists.txt @@ -8,8 +8,8 @@ generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_ # Sources files file(GLOB_RECURSE SRCS "*.h" "*.cpp" - "../../widgets/*.h" - "../../widgets/*.cpp" + "../../widgets/tipswidget.h" + "../../widgets/tipswidget.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" "../../frame/qtdbusextended/*.h" diff --git a/plugins/bluetooth/CMakeLists.txt b/plugins/bluetooth/CMakeLists.txt index 78185f0d2..5cd2a03ec 100644 --- a/plugins/bluetooth/CMakeLists.txt +++ b/plugins/bluetooth/CMakeLists.txt @@ -8,8 +8,8 @@ generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_ # Sources files file(GLOB_RECURSE SRCS "*.h" "*.cpp" - "../../widgets/*.h" - "../../widgets/*.cpp" + "../../widgets/tipswidget.h" + "../../widgets/tipswidget.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" "../../frame/util/statebutton.h" diff --git a/plugins/multitasking/CMakeLists.txt b/plugins/multitasking/CMakeLists.txt index 618ddcd0f..1c44ec04f 100644 --- a/plugins/multitasking/CMakeLists.txt +++ b/plugins/multitasking/CMakeLists.txt @@ -4,7 +4,7 @@ set(PLUGIN_NAME "multitasking") project(${PLUGIN_NAME}) # Sources files -file(GLOB SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp") +file(GLOB SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/onboard/CMakeLists.txt b/plugins/onboard/CMakeLists.txt index 54eca840a..11df5e04f 100644 --- a/plugins/onboard/CMakeLists.txt +++ b/plugins/onboard/CMakeLists.txt @@ -8,8 +8,8 @@ generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_ # Sources files file(GLOB_RECURSE SRCS "*.h" "*.cpp" - "../../widgets/*.h" - "../../widgets/*.cpp" + "../../widgets/tipswidget.h" + "../../widgets/tipswidget.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") diff --git a/plugins/overlay-warning/CMakeLists.txt b/plugins/overlay-warning/CMakeLists.txt index 3a07bf4b2..6041f163e 100644 --- a/plugins/overlay-warning/CMakeLists.txt +++ b/plugins/overlay-warning/CMakeLists.txt @@ -4,7 +4,7 @@ set(PLUGIN_NAME "overlay-warning") project(${PLUGIN_NAME}) # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp") +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/power/CMakeLists.txt b/plugins/power/CMakeLists.txt index b68a5a83e..3016ac120 100644 --- a/plugins/power/CMakeLists.txt +++ b/plugins/power/CMakeLists.txt @@ -8,8 +8,8 @@ generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_ # Sources files file(GLOB_RECURSE SRCS "*.h" "*.cpp" - "../../widgets/*.h" - "../../widgets/*.cpp" + "../../widgets/tipswidget.h" + "../../widgets/tipswidget.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") diff --git a/plugins/show-desktop/CMakeLists.txt b/plugins/show-desktop/CMakeLists.txt index d98d5b724..42e4c412a 100644 --- a/plugins/show-desktop/CMakeLists.txt +++ b/plugins/show-desktop/CMakeLists.txt @@ -4,7 +4,7 @@ set(PLUGIN_NAME "show-desktop") project(${PLUGIN_NAME}) # Sources files -file(GLOB SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp") +file(GLOB SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/shutdown/CMakeLists.txt b/plugins/shutdown/CMakeLists.txt index 2f123a3a8..3e436561d 100644 --- a/plugins/shutdown/CMakeLists.txt +++ b/plugins/shutdown/CMakeLists.txt @@ -4,7 +4,7 @@ set(PLUGIN_NAME "shutdown") project(${PLUGIN_NAME}) # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp") +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) @@ -23,7 +23,8 @@ set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../) target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ${Qt5DBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} - ../../interfaces) + ../../interfaces + ../../widgets) target_link_libraries(${PLUGIN_NAME} PRIVATE ${DtkWidget_LIBRARIES} ${Qt5Widgets_LIBRARIES} diff --git a/plugins/trash/CMakeLists.txt b/plugins/trash/CMakeLists.txt index c8c07da2b..1518c610e 100644 --- a/plugins/trash/CMakeLists.txt +++ b/plugins/trash/CMakeLists.txt @@ -8,8 +8,8 @@ generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_ # Sources files file(GLOB_RECURSE SRCS "*.h" "*.cpp" - "../../widgets/*.h" - "../../widgets/*.cpp" + "../../widgets/tipswidget.h" + "../../widgets/tipswidget.cpp" "../../frame/qtdbusextended/*.h" "../../frame/qtdbusextended/*.cpp") From 3a5e8c1ec695ee168122aceddfa477716eaebabd Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 4 Nov 2022 04:51:48 +0000 Subject: [PATCH 111/257] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E5=8C=BA=E5=9F=9Fkey=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改快捷区域key值 Log: 修改快捷区域获取数据的key值 Influence: 无 Task: https://pms.uniontech.com/task-view-96831.html Change-Id: Ie405a9b45c173092f5c32a06d85f44ec88a1f54e --- frame/window/quicksettingcontainer.cpp | 14 +++++++------- interfaces/pluginsiteminterface.h | 2 +- plugins/bluetooth/bluetoothplugin.cpp | 2 +- plugins/sound/soundplugin.cpp | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index a91ebc6ab..1b119415d 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -169,7 +169,7 @@ void QuickSettingContainer::onItemDetailClick(PluginsItemInterface *pluginInter) if (!quickItemWidget) return; - QWidget *widget = pluginInter->itemPopupApplet(QUICK_ITEM_DETAIL_KEY); + QWidget *widget = pluginInter->itemPopupApplet(QUICK_ITEM_KEY); if (!widget) return; @@ -198,11 +198,11 @@ bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) if (!isApplet(plugin)) continue; - if (plugin->itemWidget(QUICK_ITEM_DETAIL_KEY) != watched) + if (plugin->itemWidget(QUICK_ITEM_KEY) != watched) continue; m_dragInfo->dragPosition = mouseEvent->pos(); - m_dragInfo->dragItem = plugin->itemWidget(QUICK_ITEM_DETAIL_KEY); + m_dragInfo->dragItem = plugin->itemWidget(QUICK_ITEM_KEY); m_dragInfo->pluginInter = plugin; break; } @@ -240,7 +240,7 @@ QPoint QuickSettingContainer::hotSpot(const QPixmap &pixmap) bool QuickSettingContainer::isApplet(PluginsItemInterface *itemInter) const { - if (!itemInter->itemWidget(QUICK_ITEM_DETAIL_KEY)) + if (!itemInter->itemWidget(QUICK_ITEM_KEY)) return false; QJsonObject json = QuickSettingController::instance()->metaData(itemInter); @@ -252,7 +252,7 @@ bool QuickSettingContainer::isApplet(PluginsItemInterface *itemInter) const void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter) { - QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_DETAIL_KEY); + QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); if (isApplet(itemInter)) { // 如果存在这个窗体,就让其显示在下方 DBlurEffectWidget *effectWidget = new DBlurEffectWidget(m_componentWidget); @@ -278,7 +278,7 @@ void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter) void QuickSettingContainer::onPluginRemove(PluginsItemInterface * itemInter) { - QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_DETAIL_KEY); + QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); if (itemWidget) { for (int i = 0; i < m_componentWidget->layout()->count(); i++) { QLayoutItem *layoutItem = m_componentWidget->layout()->itemAt(i); @@ -524,7 +524,7 @@ void QuickSettingContainer::onResizeView() void QuickSettingContainer::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) { - if (itemKey == QUICK_ITEM_DETAIL_KEY) { + if (itemKey == QUICK_ITEM_KEY) { // 显示弹出的内容 QWidget *itemApplet = itemInter->itemPopupApplet(itemKey); if (!itemApplet) diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 8474e1d0e..0e148d599 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -35,7 +35,7 @@ enum class DockPart { }; // 快捷面板详情页面的itemWidget对应的itemKey -#define QUICK_ITEM_DETAIL_KEY "quick_item_detail_key" +#define QUICK_ITEM_KEY "quick_item_key" /// /// \brief The PluginsItemInterface class /// the dock plugins item interface, all dock plugins should diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index 1b9534cf2..ce4c6e178 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -104,7 +104,7 @@ QWidget *BluetoothPlugin::itemPopupApplet(const QString &itemKey) return m_bluetoothItem->popupApplet(); } - if (itemKey == QUICK_ITEM_DETAIL_KEY) { + if (itemKey == QUICK_ITEM_KEY) { return m_bluetoothItem->popupApplet(); } diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 81d915ffd..c2c8be211 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -63,7 +63,7 @@ void SoundPlugin::init(PluginProxyInterface *proxyInter) if (!pluginIsDisable()) { m_proxyInter->itemAdded(this, SOUND_KEY); connect(m_soundWidget.data(), &SoundWidget::rightIconClick, this, [ this, proxyInter ] { - proxyInter->requestSetAppletVisible(this, QUICK_ITEM_DETAIL_KEY, true); + proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); }); } } @@ -85,7 +85,7 @@ QWidget *SoundPlugin::itemWidget(const QString &itemKey) if (itemKey == SOUND_KEY) return m_soundItem.data(); - if (itemKey == QUICK_ITEM_DETAIL_KEY) + if (itemKey == QUICK_ITEM_KEY) return m_soundWidget.data(); return nullptr; @@ -104,7 +104,7 @@ QWidget *SoundPlugin::itemPopupApplet(const QString &itemKey) if (itemKey == SOUND_KEY) { return m_soundItem->popupApplet(); } - if (itemKey == QUICK_ITEM_DETAIL_KEY) + if (itemKey == QUICK_ITEM_KEY) return m_soundDeviceWidget.data(); return nullptr; From 3e84154462236bdd26493617b4818f0e46a1b75c Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 4 Nov 2022 03:49:49 +0000 Subject: [PATCH 112/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E5=BA=94=E7=94=A8=E6=89=93=E5=BC=80?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E9=A1=B5=E9=9D=A2=E4=BD=8D=E7=BD=AE=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 快捷面板点击到了非展开区域的情况下,直接打开快捷面板的弹出窗口,导致隐藏了快捷面板窗口 Log: 优化快捷面板交互问题 Influence: 从快捷面板展开蓝牙或者网络右侧的展开按钮,观察是否显示正常 Task: https://pms.uniontech.com/task-view-211641.html Change-Id: I52a3a74d035aed28465d82c5efb680f9ddb9ded8 --- frame/item/quicksettingitem.cpp | 4 +-- frame/window/quicksettingcontainer.cpp | 47 +++++++++++++++++++++----- frame/window/quicksettingcontainer.h | 2 ++ 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index eb922f886..0f6959d0d 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -77,8 +77,8 @@ bool QuickSettingItem::eventFilter(QObject *obj, QEvent *event) if (!command.isEmpty()) QProcess::startDetached(command); - if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey)) - showPopupApplet(w); + if (!isPrimary()) + Q_EMIT detailClicked(m_pluginInter); } } else if (event->type() == QEvent::Resize) { if (obj == m_nameLabel) { diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 1b119415d..bb60baa9a 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -250,6 +250,39 @@ bool QuickSettingContainer::isApplet(PluginsItemInterface *itemInter) const return json.value("applet").toBool(); } +bool QuickSettingContainer::isQuickPlugin(PluginsItemInterface *itemInter) const +{ + // 先判断是否为快捷面板区域(类似声音、亮度,音乐等) + QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) { + for (int i = 0; i < m_componentWidget->layout()->count(); i++) { + QLayoutItem *layoutItem = m_componentWidget->layout()->itemAt(i); + if (!layoutItem) + continue; + + DBlurEffectWidget *effectWidget = qobject_cast(layoutItem->widget()); + if (!effectWidget || !effectWidget->layout()) + continue; + + for (int j = 0; j < effectWidget->layout()->count(); j++) { + QLayoutItem *layoutItem = effectWidget->layout()->itemAt(i); + if (!layoutItem || layoutItem->widget() != itemWidget) + continue; + + return true; + } + } + } else { + for (QuickSettingItem *settingItem : m_quickSettings) { + if (settingItem->pluginItem() != itemInter) + continue; + + return true; + } + } + return false; +} + void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter) { QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); @@ -524,13 +557,11 @@ void QuickSettingContainer::onResizeView() void QuickSettingContainer::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) { - if (itemKey == QUICK_ITEM_KEY) { - // 显示弹出的内容 - QWidget *itemApplet = itemInter->itemPopupApplet(itemKey); - if (!itemApplet) - return; + // 显示弹出的内容 + QWidget *itemApplet = itemInter->itemPopupApplet(itemKey); + if (!itemApplet) + return; - showWidget(itemApplet, itemInter->pluginDisplayName()); - onResizeView(); - } + showWidget(itemApplet, itemInter->pluginDisplayName()); + onResizeView(); } diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index c56870fb0..6e0a548b1 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -85,6 +85,8 @@ private: QPoint hotSpot(const QPixmap &pixmap); // 判断是否支持显示在面板上 bool isApplet(PluginsItemInterface * itemInter) const; + // 判断插件是否在当前快捷面板上 + bool isQuickPlugin(PluginsItemInterface * itemInter) const; private: static DockPopupWindow *m_popWindow; From e6dd4cff3149322d020a059fc6c860c60fe61c20 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Tue, 25 Oct 2022 15:40:57 +0800 Subject: [PATCH 113/257] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E8=B7=A8=E7=AB=AF=E5=8D=8F=E5=90=8C=E5=9C=A8?= =?UTF-8?q?paired=E7=8A=B6=E6=80=81=E5=8F=98=E5=8C=96=E5=90=8E=E4=B8=BB?= =?UTF-8?q?=E5=8A=A8=E8=AF=B7=E6=B1=82=E5=8D=8F=E5=90=8C=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 其他地方操作跨端协同连接导致设备paired状态变化,任务栏跨端协同功能主动请求协同连接后续操作,会导致其他地方操作pair后直接设备共享的问题。 Log: 解决任务栏跨端协同在paired状态变化后主动请求协同连接的问题。 Influence: 任务栏设备协同连接功能。 Change-Id: Ie821de0cb36ad43476c860d5b3721be5a77b0699 --- frame/model/collaborationdevmodel.cpp | 14 +++++++++++--- frame/model/collaborationdevmodel.h | 6 +++++- frame/window/components/devcollaborationwidget.cpp | 4 +++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/frame/model/collaborationdevmodel.cpp b/frame/model/collaborationdevmodel.cpp index a987e1b00..6305ec88a 100644 --- a/frame/model/collaborationdevmodel.cpp +++ b/frame/model/collaborationdevmodel.cpp @@ -126,7 +126,7 @@ void CollaborationDevModel::updateDevice(const QStringList &devPaths) emit devicesChanged(); } -const CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath) +CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath) { return m_devices.value(machinePath, nullptr); } @@ -138,6 +138,7 @@ CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent , m_isPaired(false) , m_isCooperated(false) , m_isValid(false) + , m_isCooperating(false) , m_devDbusInter(new QDBusInterface(CollaborationService, devPath, CollaborationInterface + QString(".Machine"), QDBusConnection::sessionBus(), this)) { @@ -204,6 +205,11 @@ bool CollaborationDevice::isCooperated() const return m_isCooperated; } +void CollaborationDevice::setDeviceIsCooperating(bool isCooperating) +{ + m_isCooperating = isCooperating; +} + void CollaborationDevice::onPropertyChanged(const QDBusMessage &msg) { QList arguments = msg.arguments(); @@ -218,10 +224,12 @@ void CollaborationDevice::onPropertyChanged(const QDBusMessage &msg) if (changedProps.contains("Paired")) { bool isPaired = changedProps.value("Paired").value(); m_isPaired = isPaired; - if (isPaired) { + if (isPaired && m_isCooperating) { // paired 成功之后再去请求cooperate requestCooperate(); - } else { + } + + if (!isPaired){ Q_EMIT pairedStateChanged(false); } } else if (changedProps.contains("Cooperating")) { diff --git a/frame/model/collaborationdevmodel.h b/frame/model/collaborationdevmodel.h index cab4b4db2..013624211 100644 --- a/frame/model/collaborationdevmodel.h +++ b/frame/model/collaborationdevmodel.h @@ -46,7 +46,7 @@ public: void checkServiceValid(); QList devices() const; - const CollaborationDevice *getDevice(const QString &machinePath); + CollaborationDevice *getDevice(const QString &machinePath); private slots: void onPropertyChanged(const QDBusMessage &msg); @@ -86,6 +86,7 @@ public: QString deviceIcon() const; bool isPaired() const; bool isCooperated() const; + void setDeviceIsCooperating(bool isCooperating); private slots: void onPropertyChanged(const QDBusMessage &msg); @@ -112,6 +113,9 @@ private: bool m_isCooperated; bool m_isValid; + // 标记任务栏点击触发协同连接 + bool m_isCooperating; + QDBusInterface *m_devDbusInter; }; diff --git a/frame/window/components/devcollaborationwidget.cpp b/frame/window/components/devcollaborationwidget.cpp index 68ceffd7d..846957e03 100644 --- a/frame/window/components/devcollaborationwidget.cpp +++ b/frame/window/components/devcollaborationwidget.cpp @@ -189,11 +189,12 @@ void DevCollaborationWidget::resetWidgetSize() void DevCollaborationWidget::itemClicked(const QModelIndex &index) { QString machinePath = index.data(DevItemDelegate::MachinePathDataRole).toString(); - const CollaborationDevice *device = m_deviceModel->getDevice(machinePath); + CollaborationDevice *device = m_deviceModel->getDevice(machinePath); if (!device) return; if (!device->isPaired()) { + device->setDeviceIsCooperating(true); device->pair(); if (!m_connectingDevices.contains(machinePath)) m_connectingDevices.append(machinePath); @@ -217,6 +218,7 @@ void DevCollaborationWidget::itemStatusChanged() if (!device) return; + device->setDeviceIsCooperating(false); QString machinePath = device->machinePath(); if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { // 更新item的连接状态 From e67b016b275273676bfabbd2046c2b5dc29c263a Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 4 Nov 2022 07:28:51 +0000 Subject: [PATCH 114/257] =?UTF-8?q?style:=20=E6=9E=9A=E4=B8=BE=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E7=9A=84=E4=BF=A1=E5=8F=B7=E4=BC=A0=E9=80=92=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 枚举变量无需使用引用传递 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-96831.html Change-Id: Ic699c4c5fc0b495f614085306e9b473db493a86a --- frame/controller/dockitemmanager.cpp | 2 +- frame/controller/quicksettingcontroller.h | 4 ++-- frame/controller/toolapphelper.cpp | 4 ++-- frame/window/docktraywindow.cpp | 2 +- frame/window/quickpluginmodel.cpp | 2 +- frame/window/systempluginwindow.cpp | 2 +- frame/window/tray/tray_monitor.cpp | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index 3aa7ba612..3e7d0f73c 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -70,7 +70,7 @@ DockItemManager::DockItemManager(QObject *parent) // 托盘区域和插件区域 由DockPluginsController获取 QuickSettingController *quickController = QuickSettingController::instance(); - connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { if (pluginAttr != QuickSettingController::PluginAttribute::Fixed) return; diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 384333650..559940a41 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -49,9 +49,9 @@ public: PluginAttribute pluginAttribute(PluginsItemInterface * const itemInter) const; Q_SIGNALS: - void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute &); + void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute); void pluginRemoved(PluginsItemInterface *itemInter); - void pluginUpdated(PluginsItemInterface *, const DockPart &); + void pluginUpdated(PluginsItemInterface *, const DockPart); void requestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); protected: diff --git a/frame/controller/toolapphelper.cpp b/frame/controller/toolapphelper.cpp index 1630f0336..6359a8141 100644 --- a/frame/controller/toolapphelper.cpp +++ b/frame/controller/toolapphelper.cpp @@ -32,8 +32,8 @@ ToolAppHelper::ToolAppHelper(QWidget *toolAreaWidget, QObject *parent) , m_toolAreaWidget(toolAreaWidget) , m_displayMode(DisplayMode::Efficient) { - connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { - if (pluginClass != QuickSettingController::PluginAttribute::Tool) + connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { + if (pluginAttr != QuickSettingController::PluginAttribute::Tool) return; pluginItemAdded(itemInter); diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index a784d19d8..759c1add8 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -323,7 +323,7 @@ void DockTrayWindow::initConnection() connect(m_trayView, &TrayGridView::dragEntered, m_delegate, [ this ]{ Q_EMIT m_delegate->requestDrag(false); }); - connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ] (PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ] (PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { switch (pluginAttr) { case QuickSettingController::PluginAttribute::Tool: // 下方只处理回收站等插件 diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index 5d2699ff7..5c5d75596 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -162,7 +162,7 @@ void QuickPluginModel::onSettingChanged(const QString &key, const QVariant &valu void QuickPluginModel::initConnection() { QuickSettingController *quickController = QuickSettingController::instance(); - connect(quickController, &QuickSettingController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &plugAttr) { + connect(quickController, &QuickSettingController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute plugAttr) { if (plugAttr != QuickSettingController::PluginAttribute::Quick) return; diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 0a408c85e..7f6c25d99 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -135,7 +135,7 @@ void SystemPluginWindow::initUi() void SystemPluginWindow::initConnection() { QuickSettingController *quickController = QuickSettingController::instance(); - connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { if (pluginAttr != QuickSettingController::PluginAttribute::System) return; diff --git a/frame/window/tray/tray_monitor.cpp b/frame/window/tray/tray_monitor.cpp index a925052c8..49860117f 100644 --- a/frame/window/tray/tray_monitor.cpp +++ b/frame/window/tray/tray_monitor.cpp @@ -40,7 +40,7 @@ TrayMonitor::TrayMonitor(QObject *parent) //-------------------------------System Tray------------------------------------------// QuickSettingController *quickController = QuickSettingController::instance(); - connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginAttr) { + connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { if (pluginAttr != QuickSettingController::PluginAttribute::Tray) return; From ec894f286a983e628826d250905a07bbba8fed46 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 4 Nov 2022 07:39:35 +0000 Subject: [PATCH 115/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E6=B2=A1=E6=9C=89=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=8A=B6=E6=80=81=E5=9B=BE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当插件调用updateDockInfo接口的时候,快捷面板重新最新状态的插件图标的显示 Log: 修复快捷面板没有实时显示图标变化的问题 Influence: 笔记本上打开快捷面板,拔掉电源或插上电源,观察电池状态是否发生变化 Task: https://pms.uniontech.com/task-view-208069.html Change-Id: I81f97d69d3acbcd2a0a8e540274702b21ecde6b5 --- frame/window/quicksettingcontainer.cpp | 31 +++++++++++++++++++------- frame/window/quicksettingcontainer.h | 9 ++++---- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index bb60baa9a..1706e212a 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -250,7 +250,7 @@ bool QuickSettingContainer::isApplet(PluginsItemInterface *itemInter) const return json.value("applet").toBool(); } -bool QuickSettingContainer::isQuickPlugin(PluginsItemInterface *itemInter) const +QWidget *QuickSettingContainer::findPluginWindget(PluginsItemInterface *itemInter) const { // 先判断是否为快捷面板区域(类似声音、亮度,音乐等) QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); @@ -269,7 +269,7 @@ bool QuickSettingContainer::isQuickPlugin(PluginsItemInterface *itemInter) const if (!layoutItem || layoutItem->widget() != itemWidget) continue; - return true; + return itemWidget; } } } else { @@ -277,13 +277,14 @@ bool QuickSettingContainer::isQuickPlugin(PluginsItemInterface *itemInter) const if (settingItem->pluginItem() != itemInter) continue; - return true; + return settingItem; } } - return false; + + return nullptr; } -void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter) +void QuickSettingContainer::onPluginInsert(PluginsItemInterface *itemInter) { QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); if (isApplet(itemInter)) { @@ -309,7 +310,7 @@ void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter) onResizeView(); } -void QuickSettingContainer::onPluginRemove(PluginsItemInterface * itemInter) +void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) { QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); if (itemWidget) { @@ -478,14 +479,16 @@ void QuickSettingContainer::initUi() void QuickSettingContainer::initConnection() { - connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) { - if (pluginClass != QuickSettingController::PluginAttribute::Quick) + connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { + if (pluginAttr != QuickSettingController::PluginAttribute::Quick) return; onPluginInsert(itemInter); }); connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); connect(m_pluginLoader, &QuickSettingController::requestAppletShow, this, &QuickSettingContainer::onRequestAppletShow); + connect(m_pluginLoader, &QuickSettingController::pluginUpdated, this, &QuickSettingContainer::onPluginUpdated); + connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); connect(m_brihtnessWidget, &BrightnessWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); connect(m_brihtnessWidget->sliderContainer(), &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &iconPosition) { @@ -565,3 +568,15 @@ void QuickSettingContainer::onRequestAppletShow(PluginsItemInterface *itemInter, showWidget(itemApplet, itemInter->pluginDisplayName()); onResizeView(); } + +void QuickSettingContainer::onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart) +{ + if (dockPart != DockPart::QuickPanel) + return; + + QWidget *pluginWidget = findPluginWindget(itemInter); + if (!pluginWidget) + return; + + pluginWidget->update(); +} diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 6e0a548b1..023d9c3bd 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -64,11 +64,12 @@ protected: void showHomePage(); private Q_SLOTS: - void onPluginInsert(PluginsItemInterface * itemInter); - void onPluginRemove(PluginsItemInterface * itemInter); + void onPluginInsert(PluginsItemInterface *itemInter); + void onPluginRemove(PluginsItemInterface *itemInter); void onItemDetailClick(PluginsItemInterface *pluginInter); void onResizeView(); - void onRequestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); + void onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey); + void onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart); private: // 加载UI @@ -86,7 +87,7 @@ private: // 判断是否支持显示在面板上 bool isApplet(PluginsItemInterface * itemInter) const; // 判断插件是否在当前快捷面板上 - bool isQuickPlugin(PluginsItemInterface * itemInter) const; + QWidget *findPluginWindget(PluginsItemInterface * itemInter) const; private: static DockPopupWindow *m_popWindow; From 7658f813f69b96f8ba79b546208d0a7da3a27ff4 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 8 Nov 2022 02:27:01 +0000 Subject: [PATCH 116/257] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E5=8A=A0=E8=BD=BD=E8=80=81=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 老版本插件的加载通过插件的版本号进行判断,若插件版本不在版本列表中,则无需加载 Log: 优化任务栏加载老版本插件的方式 Influence: 任务栏启动的时候,观察老版本的插件(例如U盘插件等其他v20插件)是否正常加载 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I57b56276ee0cef14b59ff4b8bb8e223e0177f3bd --- frame/util/abstractpluginscontroller.cpp | 11 ++++++++--- interfaces/pluginsiteminterface.h | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index 82e39a555..297fca71f 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -274,9 +274,12 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) pluginIsValid = false; } - PluginsItemInterface *interface = qobject_cast(pluginLoader->instance()); - if (!interface) { - // 如果识别当前插件失败,就认为这个插件是v20的插件,将其转换为v20插件接口 + PluginsItemInterface *interface = nullptr; + // 如果版本是2.0.0,则认为是最新的插件,此时需要转换成v23的插件接口 + if (pluginApi == "2.0.0") { + interface = qobject_cast(pluginLoader->instance()); + } else if (pluginApi < "2.0.0") { + // 如果版本号小于2.0.0的,就认为这个插件是v20的插件,将其转换为v20插件接口 PluginsItemInterface_V20 *interface_v20 = qobject_cast(pluginLoader->instance()); if (interface_v20) { // 将v20插件接口通过适配器转换成v23的接口,方便在后面识别 @@ -286,6 +289,8 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) m_pluginAdapterMap[(qulonglong)(interface_v20)] = pluginAdapter; interface = pluginAdapter; } + } else { + qWarning() << "the plugin is not valid " << pluginFile; } if (!interface) { diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 0e148d599..ab0a98450 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -287,7 +287,7 @@ protected: QT_BEGIN_NAMESPACE -#define ModuleInterface_iid "com.deepin.dock.PluginsItemInterface_2_0_0" +#define ModuleInterface_iid "com.deepin.dock.PluginsItemInterface" Q_DECLARE_INTERFACE(PluginsItemInterface, ModuleInterface_iid) QT_END_NAMESPACE From 6ab996ded94153975c21ca73a3a0328476a26f10 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 8 Nov 2022 09:17:16 +0000 Subject: [PATCH 117/257] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E6=98=BE=E7=A4=BA=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将快捷面板区域单列、两列和下方显示的插件区域提取公共的基类,这三种插件的显示区域分别继承自这个基类,在面板显示区域按照统一的接口来显示不同类型的插件 Log: 优化快捷面板插件显示方式 Influence: 打开快捷面板,观察插件是否正常显示 Task: https://pms.uniontech.com/task-view-189527.html Change-Id: I5a3c1e0fd38f618fd342a13c738406b281ab3a52 --- frame/item/components/fullquickitem.cpp | 76 ++++++ frame/item/components/fullquickitem.h | 47 ++++ frame/item/components/multiquickitem.cpp | 249 ++++++++++++++++++ frame/item/components/multiquickitem.h | 70 +++++ frame/item/components/singlequickitem.cpp | 184 +++++++++++++ frame/item/components/singlequickitem.h | 48 ++++ frame/item/quicksettingitem.cpp | 266 ++----------------- frame/item/quicksettingitem.h | 53 ++-- frame/window/quicksettingcontainer.cpp | 301 +++++++--------------- frame/window/quicksettingcontainer.h | 12 +- 10 files changed, 812 insertions(+), 494 deletions(-) create mode 100644 frame/item/components/fullquickitem.cpp create mode 100644 frame/item/components/fullquickitem.h create mode 100644 frame/item/components/multiquickitem.cpp create mode 100644 frame/item/components/multiquickitem.h create mode 100644 frame/item/components/singlequickitem.cpp create mode 100644 frame/item/components/singlequickitem.h diff --git a/frame/item/components/fullquickitem.cpp b/frame/item/components/fullquickitem.cpp new file mode 100644 index 000000000..cf9f0c92b --- /dev/null +++ b/frame/item/components/fullquickitem.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "fullquickitem.h" +#include "pluginsiteminterface.h" + +FullQuickItem::FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) + : QuickSettingItem(pluginInter, parent) + , m_centerWidget(pluginInter->itemWidget(QUICK_ITEM_KEY)) + , m_effectWidget(new DBlurEffectWidget(this)) +{ + initUi(); +} + +FullQuickItem::~FullQuickItem() +{ + if (m_centerWidget) + m_centerWidget->setParent(nullptr); +} + +QuickSettingItem::QuickSettingType FullQuickItem::type() const +{ + return QuickSettingItem::QuickSettingType::Full; +} + +bool FullQuickItem::eventFilter(QObject *obj, QEvent *event) +{ + if (obj == m_centerWidget && event->type() == QEvent::Resize) { + m_effectWidget->setFixedHeight(m_centerWidget->height()); + setFixedHeight(m_centerWidget->height()); + } + return QuickSettingItem::eventFilter(obj, event); +} + +void FullQuickItem::initUi() +{ + m_effectWidget->setMaskColor(QColor(239, 240, 245)); + m_effectWidget->setBlurRectXRadius(8); + m_effectWidget->setBlurRectYRadius(8); + + QIcon icon = pluginItem()->icon(DockPart::QuickPanel); + if (icon.isNull()) + return; + + // 如果图标不为空 + if (!m_centerWidget) + return; + + QHBoxLayout *layout = new QHBoxLayout(m_effectWidget); + layout->setContentsMargins(0, 0, 0, 0); + layout->setAlignment(Qt::AlignHCenter); + layout->addWidget(m_centerWidget); + + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->addWidget(m_effectWidget); + + m_centerWidget->installEventFilter(this); +} diff --git a/frame/item/components/fullquickitem.h b/frame/item/components/fullquickitem.h new file mode 100644 index 000000000..6c67bd659 --- /dev/null +++ b/frame/item/components/fullquickitem.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef FULLQUICKITEM_H +#define FULLQUICKITEM_H + +#include "quicksettingitem.h" + +class FullQuickItem : public QuickSettingItem +{ + Q_OBJECT + +public: + FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); + ~FullQuickItem() override; + + QuickSettingType type() const override; + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + +private: + void initUi(); + +private: + QWidget *m_centerWidget; + DBlurEffectWidget *m_effectWidget; +}; + +#endif // FULLQUICKITEM_H diff --git a/frame/item/components/multiquickitem.cpp b/frame/item/components/multiquickitem.cpp new file mode 100644 index 000000000..cbc2950d5 --- /dev/null +++ b/frame/item/components/multiquickitem.cpp @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "multiquickitem.h" +#include "pluginsiteminterface.h" + +#include +#include +#include + +#define BGSIZE 36 +#define ICONWIDTH 24 +#define ICONHEIGHT 24 + +static QSize expandSize = QSize(20, 20); + +MultiQuickItem::MultiQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) + : QuickSettingItem(pluginInter, parent) + , m_selfDefine(false) +{ + initUi(); +} + +MultiQuickItem::~MultiQuickItem() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) + itemWidget->setParent(nullptr); +} + +QuickSettingItem::QuickSettingType MultiQuickItem::type() const +{ + return QuickSettingItem::QuickSettingType::Multi; +} + +bool MultiQuickItem::eventFilter(QObject *obj, QEvent *event) +{ + if (m_selfDefine) { + if (event->type() == QEvent::MouseButtonRelease) { + if (obj->objectName() == "expandLabel") { + // 如果是鼠标的按下事件 + QWidget *widget = pluginItem()->itemPopupApplet(QUICK_ITEM_KEY); + if (!widget) + return QuickSettingItem::eventFilter(obj, event); + + Q_EMIT requestShowChildWidget(widget); + + } else if (obj == this) { + const QString &command = pluginItem()->itemCommand(itemKey()); + if (!command.isEmpty()) + QProcess::startDetached(command, QStringList()); + } + } else if (event->type() == QEvent::Resize) { + QLabel *labelWidget = qobject_cast(obj); + if (!labelWidget) + return QuickSettingItem::eventFilter(obj, event); + + if (labelWidget->objectName() == "nameLabel") { + labelWidget->setText(QFontMetrics(labelWidget->font()).elidedText(pluginItem()->pluginDisplayName(), Qt::TextElideMode::ElideRight, labelWidget->width())); + } else if (labelWidget->objectName() == "stateLabel") { + labelWidget->setText(QFontMetrics(labelWidget->font()).elidedText(pluginItem()->description(), Qt::TextElideMode::ElideRight, labelWidget->width())); + } + } + } + + return QuickSettingItem::eventFilter(obj, event); +} + +void MultiQuickItem::initUi() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (pluginItem()->icon(DockPart::QuickPanel).isNull() && itemWidget) { + // 如果插件没有返回图标的显示,则获取插件的itemWidget + QHBoxLayout *mainLayout = new QHBoxLayout(this); + itemWidget->setParent(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->addWidget(itemWidget); + } else { + // 如果插件获取到插件区域的图标,则让其按照图标来组合显示 + // 如果是占用两排的插件,则用横向Layout + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(10, 0, 10, 0); + mainLayout->setSpacing(0); + mainLayout->addStretch(10); + mainLayout->setAlignment(Qt::AlignCenter); + + // 添加图标 + QWidget *iconWidgetParent = new QWidget(this); + QVBoxLayout *iconLayout = new QVBoxLayout(iconWidgetParent); + iconLayout->setContentsMargins(0, 0, 0, 0); + iconLayout->setSpacing(0); + iconLayout->setAlignment(Qt::AlignCenter); + + QWidget *iconWidget = new QuickIconWidget(pluginItem(), itemKey(), iconWidgetParent); + iconWidget->setFixedSize(BGSIZE, BGSIZE); + iconLayout->addWidget(iconWidget); + mainLayout->addWidget(iconWidgetParent); + mainLayout->addSpacing(10); + + // 添加中间的名称部分 + QWidget *textWidget = new QWidget(this); + QLabel *nameLabel = new QLabel(textWidget); + QLabel *stateLabel = new QLabel(textWidget); + nameLabel->setObjectName("nameLabel"); + stateLabel->setObjectName("stateLabel"); + + // 设置图标和文字的属性 + QFont nameFont = DFontSizeManager::instance()->t6(); + nameFont.setBold(true); + QPalette pe; + pe.setColor(QPalette::WindowText, Qt::black); + nameLabel->setPalette(pe); + stateLabel->setPalette(pe); + nameLabel->setFont(nameFont); + stateLabel->setFont(DFontSizeManager::instance()->t10()); + nameLabel->setText(pluginItem()->pluginDisplayName()); + stateLabel->setText(pluginItem()->description()); + nameLabel->installEventFilter(this); + stateLabel->installEventFilter(this); + + QVBoxLayout *textLayout = new QVBoxLayout(textWidget); + textLayout->setContentsMargins(0, 0, 0, 0); + textLayout->setSpacing(0); + textLayout->addWidget(nameLabel); + textLayout->addWidget(stateLabel); + textLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + mainLayout->addWidget(textWidget); + + // 添加右侧的展开按钮 + QWidget *expandWidgetParent = new QWidget(this); + QVBoxLayout *expandLayout = new QVBoxLayout(expandWidgetParent); + expandLayout->setSpacing(0); + QLabel *expandLabel = new QLabel(expandWidgetParent); + expandLabel->setObjectName("expandLabel"); + expandLabel->setPixmap(QPixmap(expandFileName())); + expandLabel->setFixedSize(expandSize); + expandLabel->setAutoFillBackground(true); + expandLabel->installEventFilter(this); + expandLayout->addWidget(expandLabel); + pe.setBrush(QPalette::Window, Qt::transparent); + expandLabel->setPalette(pe); + mainLayout->addWidget(expandWidgetParent); + m_selfDefine = true; + } +} + +QString MultiQuickItem::expandFileName() const +{ + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/arrow-right-dark.svg"); + + return QString(":/icons/resources/arrow-right.svg"); +} + +/** + * @brief QuickIconWidget::QuickIconWidget + * @param pluginInter + * @param parent + * 图标的widget + */ +QuickIconWidget::QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, QWidget *parent) + : QWidget(parent) + , m_pluginInter(pluginInter) + , m_itemKey(itemKey) +{ +} + +void QuickIconWidget::paintEvent(QPaintEvent *event) +{ + QPixmap pixmapIcon = pluginIcon(); + if (pixmapIcon.isNull()) + return QWidget::paintEvent(event); + + pixmapIcon = pluginIcon(true); + QPainter painter(this); + painter.setRenderHint(QPainter::RenderHint::Antialiasing); + painter.setPen(foregroundColor()); + + DPalette dpa = DPaletteHelper::instance()->palette(this); + QPainter pa(&pixmapIcon); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pixmapIcon.rect(), painter.pen().brush()); + // 如果是主图标,则显示阴影背景 + painter.save(); + painter.setPen(Qt::NoPen); + painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); + painter.drawEllipse(rect()); + painter.restore(); + QRect rctIcon((rect().width() - pixmapIcon.width()) / 2, (rect().height() - pixmapIcon.height()) / 2, pixmapIcon.width(), pixmapIcon.height()); + painter.drawPixmap(rctIcon, pixmapIcon); +} + +QColor QuickIconWidget::foregroundColor() const +{ + DPalette dpa = DPaletteHelper::instance()->palette(this); + // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 + if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) + return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); + + if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Deactive) + return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); + + return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); +} + +QPixmap QuickIconWidget::pluginIcon(bool contailGrab) const +{ + QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); + if (icon.isNull() && contailGrab) { + // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 + QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); + if (itemWidget) { + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + return itemWidget->grab(); + } + return QPixmap(); + } + + // 获取icon接口返回的图标 + int pixmapWidth = width(); + int pixmapHeight = height(); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) { + QSize size = iconSizes[0]; + if (size.isValid() && !size.isEmpty() && !size.isNull()) { + pixmapWidth = size.width(); + pixmapHeight = size.height(); + } + } + + return icon.pixmap(pixmapWidth, pixmapHeight); +} diff --git a/frame/item/components/multiquickitem.h b/frame/item/components/multiquickitem.h new file mode 100644 index 000000000..26e6b3b0d --- /dev/null +++ b/frame/item/components/multiquickitem.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef MULTIQUICKITEM_H +#define MULTIQUICKITEM_H + +#include + +class MultiQuickItem : public QuickSettingItem +{ + Q_OBJECT + +public: + MultiQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); + ~MultiQuickItem() override; + + QuickSettingType type() const override; + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + +private: + void initUi(); + QString expandFileName() const; + +private: + bool m_selfDefine; +}; + +/** + * @brief The QuickIconWidget class + * 图标的Widget + */ +class QuickIconWidget : public QWidget +{ + Q_OBJECT + +public: + explicit QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, QWidget *parent = Q_NULLPTR); + +protected: + void paintEvent(QPaintEvent *event) override; + +private: + QColor foregroundColor() const; + QPixmap pluginIcon(bool contailGrab = false) const; + +private: + PluginsItemInterface *m_pluginInter; + QString m_itemKey; +}; + +#endif // MULTIQUICKITEM_H diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp new file mode 100644 index 000000000..628f18386 --- /dev/null +++ b/frame/item/components/singlequickitem.cpp @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "singlequickitem.h" +#include "pluginsiteminterface.h" + +#include + +#define ICONHEIGHT 24 +#define ICONWIDTH 24 +#define TEXTHEIGHT 11 + +SingleQuickItem::SingleQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) + : QuickSettingItem(pluginInter, parent) +{ + initUi(); +} + +SingleQuickItem::~SingleQuickItem() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) + itemWidget->setParent(nullptr); +} + +QuickSettingItem::QuickSettingType SingleQuickItem::type() const +{ + return QuickSettingItem::QuickSettingType::Single; +} + +void SingleQuickItem::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event); + const QString &command = pluginItem()->itemCommand(itemKey()); + if (!command.isEmpty()) + QProcess::startDetached(command, QStringList()); + + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) + Q_EMIT requestShowChildWidget(itemWidget); +} + +void SingleQuickItem::resizeEvent(QResizeEvent *event) +{ + if (property("paint").toBool()) { + QLabel *imageLabel = findChildLabel(this, "imageLabel"); + if (imageLabel) { + // 更新图像 + imageLabel->setPixmap(pixmap()); + } + updatePluginName(findChildLabel(this, "textLabel")); + } + + QuickSettingItem::resizeEvent(event); +} + +void SingleQuickItem::initUi() +{ + QWidget *topWidget = iconWidget(this); + QVBoxLayout *layout = new QVBoxLayout(this); + layout->addWidget(topWidget); + installEventFilter(this); +} + +QWidget *SingleQuickItem::iconWidget(QWidget *parent) +{ + // 显示图标的窗体 + QWidget *widget = new QWidget(parent); + bool childIsEmpty = true; + QIcon icon = pluginItem()->icon(DockPart::QuickPanel); + if (icon.isNull()) { + // 如果图标为空,则将获取itemWidget作为它的显示 + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) { + QHBoxLayout *layout = new QHBoxLayout(widget); + layout->setContentsMargins(0, 0, 0 ,0); + itemWidget->setParent(widget); + layout->addWidget(itemWidget); + childIsEmpty = false; + } + } + + if (childIsEmpty) { + // 如果没有子窗体,则需要添加下方的文字 + QVBoxLayout *layout = new QVBoxLayout(widget); + layout->setAlignment(Qt::AlignVCenter); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + QLabel *imageLabel = new QLabel(widget); + imageLabel->setObjectName("imageLabel"); + imageLabel->setFixedHeight(ICONHEIGHT); + imageLabel->setAlignment(Qt::AlignCenter); + + QLabel *labelText = new QLabel(widget); + labelText->setObjectName("textLabel"); + labelText->setFixedHeight(TEXTHEIGHT); + updatePluginName(labelText); + labelText->setAlignment(Qt::AlignCenter); + labelText->setFont(DFontSizeManager::instance()->t10()); + layout->addWidget(imageLabel); + layout->addSpacing(7); + layout->addWidget(labelText); + } + + setProperty("paint", childIsEmpty); + + return widget; +} + +QPixmap SingleQuickItem::pixmap() const +{ + // 如果快捷面板区域的图标为空,那么就获取itemWidget的截图 + QIcon icon = pluginItem()->icon(DockPart::QuickPanel); + if (icon.isNull()) { + QWidget *itemWidget = pluginItem()->itemWidget(itemKey()); + if (itemWidget) { + itemWidget->setFixedSize(24, 24); + icon = itemWidget->grab(); + } + } + + int pixmapWidth = width(); + int pixmapHeight = height(); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) { + QSize size = iconSizes[0]; + if (size.isValid() && !size.isEmpty() && !size.isNull()) { + pixmapWidth = size.width(); + pixmapHeight = size.height(); + } + } + + return icon.pixmap(pixmapWidth, pixmapHeight); +} + +QLabel *SingleQuickItem::findChildLabel(QWidget *parent, const QString &childObjectName) const +{ + QList childrends = parent->children(); + for (QObject *child : childrends) { + QWidget *widget = qobject_cast(child); + if (!widget) + continue; + + QLabel *label = qobject_cast(child); + if (label && widget->objectName() == childObjectName) + return label; + + label = findChildLabel(widget, childObjectName); + if (label) + return label; + } + + return nullptr; +} + +void SingleQuickItem::updatePluginName(QLabel *textLabel) +{ + if (!textLabel) + return; + + QString text = pluginItem()->description(); + if (text.isEmpty()) + text = pluginItem()->pluginDisplayName(); + QFontMetrics ftm(textLabel->font()); + text = ftm.elidedText(text, Qt::TextElideMode::ElideRight, textLabel->width()); + textLabel->setText(text); +} diff --git a/frame/item/components/singlequickitem.h b/frame/item/components/singlequickitem.h new file mode 100644 index 000000000..fad3f86a3 --- /dev/null +++ b/frame/item/components/singlequickitem.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef SINGLEQUICKITEM_H +#define SINGLEQUICKITEM_H + +#include + +class SingleQuickItem : public QuickSettingItem +{ + Q_OBJECT + +public: + SingleQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); + ~SingleQuickItem() override; + + QuickSettingType type() const override; + +protected: + void mouseReleaseEvent(QMouseEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + +private: + void initUi(); + QWidget *iconWidget(QWidget *parent); + QPixmap pixmap() const; + QLabel *findChildLabel(QWidget *parent, const QString &childObjectName) const; + void updatePluginName(QLabel *textLabel); +}; + +#endif // SINGLEQUICKITEM_H diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 0f6959d0d..bbe9e7797 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -21,6 +21,10 @@ #include "quicksettingitem.h" #include "pluginsiteminterface.h" #include "imageutil.h" +#include "multiquickitem.h" +#include "singlequickitem.h" +#include "fullquickitem.h" +#include "quicksettingcontroller.h" #include #include @@ -43,54 +47,21 @@ #define OPENICONSIZE 12 #define MARGINRIGHTSPACE 9 -static QSize expandSize = QSize(20, 20); - -QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent) +QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, QWidget *parent) : DockItem(parent) , m_pluginInter(pluginInter) - , m_itemKey(itemKey) - , m_metaData(metaData) - , m_iconWidgetParent(new QWidget(this)) - , m_iconWidget(new QuickIconWidget(pluginInter, itemKey, isPrimary(), m_iconWidgetParent)) - , m_textWidget(new QWidget(this)) - , m_nameLabel(new QLabel(m_textWidget)) - , m_stateLabel(new QLabel(m_textWidget)) + , m_itemKey(QuickSettingController::instance()->itemKey(pluginInter)) + , m_metaData(QuickSettingController::instance()->metaData(pluginInter)) { - initUi(); setAcceptDrops(true); this->installEventFilter(this); + connect(QuickSettingController::instance(), &QuickSettingController::requestAppletShow, this, &QuickSettingItem::onRequestAppletShow); } QuickSettingItem::~QuickSettingItem() { } -bool QuickSettingItem::eventFilter(QObject *obj, QEvent *event) -{ - if (event->type() == QEvent::MouseButtonRelease) { - if (obj->objectName() == "expandLabel") { - // 如果是鼠标的按下事件 - if (isPrimary()) - Q_EMIT detailClicked(m_pluginInter); - } else if (obj == this) { - const QString &command = m_pluginInter->itemCommand(m_itemKey); - if (!command.isEmpty()) - QProcess::startDetached(command); - - if (!isPrimary()) - Q_EMIT detailClicked(m_pluginInter); - } - } else if (event->type() == QEvent::Resize) { - if (obj == m_nameLabel) { - m_nameLabel->setText(QFontMetrics(m_nameLabel->font()).elidedText(m_pluginInter->pluginDisplayName(), Qt::TextElideMode::ElideRight, m_nameLabel->width())); - } else if (obj == m_stateLabel) { - m_stateLabel->setText(QFontMetrics(m_stateLabel->font()).elidedText(m_pluginInter->description(), Qt::TextElideMode::ElideRight, m_stateLabel->width())); - } - } - - return DockItem::eventFilter(obj, event); -} - PluginsItemInterface *QuickSettingItem::pluginItem() const { return m_pluginInter; @@ -131,14 +102,6 @@ const QString QuickSettingItem::itemKey() const return m_itemKey; } -bool QuickSettingItem::isPrimary() const -{ - if (m_metaData.contains("primary")) - return m_metaData.value("primary").toBool(); - - return false; -} - void QuickSettingItem::paintEvent(QPaintEvent *e) { QWidget::paintEvent(e); @@ -166,209 +129,24 @@ QColor QuickSettingItem::foregroundColor() const return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); } -void QuickSettingItem::initUi() +void QuickSettingItem::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) { - if (isPrimary()) { - // 如果是占用两排的插件,则用横向Layout - QHBoxLayout *mainLayout = new QHBoxLayout(this); - mainLayout->setContentsMargins(10, 0, 10, 0); - mainLayout->setSpacing(0); - mainLayout->addStretch(10); - mainLayout->setAlignment(Qt::AlignCenter); - // 添加图标 - QVBoxLayout *iconLayout = new QVBoxLayout(m_iconWidgetParent); - iconLayout->setContentsMargins(0, 0, 0, 0); - iconLayout->setSpacing(0); - iconLayout->setAlignment(Qt::AlignCenter); - m_iconWidget->setFixedSize(BGSIZE, BGSIZE); - iconLayout->addWidget(m_iconWidget); - mainLayout->addWidget(m_iconWidgetParent); - mainLayout->addSpacing(10); - // 添加中间的名称部分 - QFont nameFont = DFontSizeManager::instance()->t6(); - nameFont.setBold(true); - QPalette pe; - pe.setColor(QPalette::WindowText, Qt::black); - m_nameLabel->setPalette(pe); - m_stateLabel->setPalette(pe); - m_nameLabel->setFont(nameFont); - m_stateLabel->setFont(DFontSizeManager::instance()->t10()); - m_nameLabel->setText(m_pluginInter->pluginDisplayName()); - m_stateLabel->setText(m_pluginInter->description()); - m_nameLabel->installEventFilter(this); - m_stateLabel->installEventFilter(this); - QVBoxLayout *textLayout = new QVBoxLayout(m_textWidget); - textLayout->setContentsMargins(0, 0, 0, 0); - textLayout->setSpacing(0); - textLayout->addWidget(m_nameLabel); - textLayout->addWidget(m_stateLabel); - textLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); - mainLayout->addWidget(m_textWidget); + // 显示弹出的内容 + QWidget *itemApplet = itemInter->itemPopupApplet(itemKey); + if (!itemApplet) + return; - // 添加右侧的展开按钮 - QWidget *expandWidgetParent = new QWidget(this); - QVBoxLayout *expandLayout = new QVBoxLayout(expandWidgetParent); - expandLayout->setSpacing(0); - QLabel *expandLabel = new QLabel(expandWidgetParent); - expandLabel->setObjectName("expandLabel"); - expandLabel->setPixmap(QPixmap(expandFileName())); - expandLabel->setFixedSize(expandSize); - expandLabel->setAutoFillBackground(true); - expandLabel->installEventFilter(this); - expandLayout->addWidget(expandLabel); - pe.setBrush(QPalette::Window, Qt::transparent); - expandLabel->setPalette(pe); - - mainLayout->addWidget(expandWidgetParent); - } else { - QHBoxLayout *iconLayout = new QHBoxLayout(m_iconWidgetParent); - iconLayout->setContentsMargins(0, 0, 0, 0); - iconLayout->setSpacing(0); - iconLayout->setAlignment(Qt::AlignHCenter); - - m_iconWidgetParent->setFixedHeight(ICONHEIGHT); - m_iconWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); - iconLayout->addWidget(m_iconWidget); - - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->setContentsMargins(0, 10, 0, 10); - mainLayout->setSpacing(7); - mainLayout->setAlignment(Qt::AlignCenter); - // 添加上方的图标 - mainLayout->addWidget(m_iconWidgetParent); - - // 添加下方的文字 - QHBoxLayout *textLayout = new QHBoxLayout(m_textWidget); - textLayout->setAlignment(Qt::AlignCenter); - textLayout->setContentsMargins(0, 0, 0, 0); - textLayout->setSpacing(0); - QFont nameFont = DFontSizeManager::instance()->t10(); - QPalette pe; - pe.setColor(QPalette::WindowText, Qt::black); - m_nameLabel->setFont(nameFont); - m_nameLabel->setPalette(pe); - m_nameLabel->setText(m_pluginInter->pluginDisplayName()); - textLayout->addWidget(m_nameLabel); - m_stateLabel->setVisible(false); - m_textWidget->setFixedHeight(11); - mainLayout->addWidget(m_textWidget); - installEventFilter(this); - } + Q_EMIT requestShowChildWidget(itemApplet); } -QString QuickSettingItem::expandFileName() +QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter) { - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - return QString(":/icons/resources/arrow-right-dark.svg"); + const QJsonObject metaData = QuickSettingController::instance()->metaData(pluginInter); + if (metaData.contains("primary") && metaData.value("primary").toBool()) + return new MultiQuickItem(pluginInter); - return QString(":/icons/resources/arrow-right.svg"); -} - -QPixmap QuickSettingItem::pluginIcon() const -{ - QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); - if (icon.isNull()) { - // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 - QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); - QPixmap grabPixmap = itemWidget->grab(); - return grabPixmap; - } - - // 获取icon接口返回的图标 - int pixmapWidth = width(); - int pixmapHeight = height(); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) { - QSize size = iconSizes[0]; - if (size.isValid() && !size.isEmpty() && !size.isNull()) { - pixmapWidth = size.width(); - pixmapHeight = size.height(); - } - } - - return icon.pixmap(pixmapWidth, pixmapHeight); -} - -/** - * @brief QuickIconWidget::QuickIconWidget - * @param pluginInter - * @param parent - * 图标的widget - */ -QuickIconWidget::QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, bool isPrimary, QWidget *parent) - : QWidget(parent) - , m_pluginInter(pluginInter) - , m_itemKey(itemKey) - , m_isPrimary(isPrimary) -{ -} - -void QuickIconWidget::paintEvent(QPaintEvent *event) -{ - QWidget::paintEvent(event); - QPixmap pm = pluginIcon(); - - QPainter painter(this); - painter.setRenderHint(QPainter::RenderHint::Antialiasing); - painter.setPen(foregroundColor()); - - if (m_isPrimary) { - DPalette dpa = DPaletteHelper::instance()->palette(this); - QPainter pa(&pm); - pa.setCompositionMode(QPainter::CompositionMode_SourceIn); - pa.fillRect(pm.rect(), painter.pen().brush()); - // 如果是主图标,则显示阴影背景 - painter.save(); - painter.setPen(Qt::NoPen); - painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); - painter.drawEllipse(rect()); - painter.restore(); - QRect rctIcon((rect().width() - pm.width()) / 2, (rect().height() - pm.height()) / 2, pm.width(), pm.height()); - painter.drawPixmap(rctIcon, pm); - } else { - QRect rctIcon(0, 0, pm.width(), pm.height()); - painter.drawPixmap(rctIcon, pm); - } -} - -QColor QuickIconWidget::foregroundColor() const -{ - DPalette dpa = DPaletteHelper::instance()->palette(this); - // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 - if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) - return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); - - if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Deactive) - return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); - - return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); -} - -QPixmap QuickIconWidget::pluginIcon() const -{ - QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); - if (icon.isNull()) { - // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 - QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); - if (itemWidget) { - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); - return itemWidget->grab(); - } - return QPixmap(); - } - - // 获取icon接口返回的图标 - int pixmapWidth = width(); - int pixmapHeight = height(); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) { - QSize size = iconSizes[0]; - if (size.isValid() && !size.isEmpty() && !size.isNull()) { - pixmapWidth = size.width(); - pixmapHeight = size.height(); - } - } - - return icon.pixmap(pixmapWidth, pixmapHeight); + if (pluginInter->itemWidget(QUICK_ITEM_KEY) && metaData.contains("applet") && metaData.value("applet").toBool()) + return new FullQuickItem(pluginInter); + + return new SingleQuickItem(pluginInter); } diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 97cb1b0f6..3f53b955e 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -30,62 +30,41 @@ class QuickSettingItem : public DockItem { Q_OBJECT -Q_SIGNALS: - void detailClicked(PluginsItemInterface *); +public: + enum class QuickSettingType { + Single = 1, // 插件的UI显示单列 + Multi = 2, // 插件的UI显示双列,例如网络和蓝牙等 + Full = 4 // 插件的UI整行显示,例如声音,亮度、音乐播放等 + }; public: - QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent = nullptr); + QuickSettingItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); ~QuickSettingItem() override; PluginsItemInterface *pluginItem() const; ItemType itemType() const override; - const QPixmap dragPixmap(); + virtual const QPixmap dragPixmap(); const QString itemKey() const; - bool isPrimary() const; + + virtual QuickSettingType type() const = 0; + +Q_SIGNALS: + void requestShowChildWidget(QWidget *); protected: - - bool eventFilter(QObject *obj, QEvent *event) override; void paintEvent(QPaintEvent *e) override; QColor foregroundColor() const; - -private: - void initUi(); - QString expandFileName(); - QPixmap pluginIcon() const; + void onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey); private: PluginsItemInterface *m_pluginInter; QString m_itemKey; QJsonObject m_metaData; - QWidget *m_iconWidgetParent; - QuickIconWidget *m_iconWidget; - QWidget *m_textWidget; - QLabel *m_nameLabel; - QLabel *m_stateLabel; }; -/** - * @brief The QuickIconWidget class - * 图标的Widget - */ -class QuickIconWidget : public QWidget +class QuickSettingFactory { - Q_OBJECT - public: - explicit QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, bool isPrimary, QWidget *parent = Q_NULLPTR); - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - QColor foregroundColor() const; - QPixmap pluginIcon() const; - -private: - PluginsItemInterface *m_pluginInter; - QString m_itemKey; - bool m_isPrimary; + static QuickSettingItem *createQuickWidget(PluginsItemInterface *const pluginInter); }; #endif // QUICKSETTINGITEM_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 1706e212a..422bbc5d9 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -153,30 +153,6 @@ void QuickSettingContainer::setPosition(Position position) } } -void QuickSettingContainer::initQuickItem(PluginsItemInterface *plugin) -{ - QuickSettingItem *quickItem = new QuickSettingItem(plugin, m_pluginLoader->itemKey(plugin), m_pluginLoader->metaData(plugin)); - quickItem->setParent(m_pluginWidget); - quickItem->setMouseTracking(true); - quickItem->installEventFilter(this); - connect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); - m_quickSettings << quickItem; -} - -void QuickSettingContainer::onItemDetailClick(PluginsItemInterface *pluginInter) -{ - QuickSettingItem *quickItemWidget = static_cast(sender()); - if (!quickItemWidget) - return; - - QWidget *widget = pluginInter->itemPopupApplet(QUICK_ITEM_KEY); - if (!widget) - return; - - showWidget(widget, pluginInter->pluginDisplayName()); - onResizeView(); -} - bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) { switch (event->type()) { @@ -192,20 +168,6 @@ bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) m_dragInfo->dragPosition = mouseEvent->pos(); m_dragInfo->dragItem = item; m_dragInfo->pluginInter = item->pluginItem(); - } else { - QList plugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick); - for (PluginsItemInterface *plugin : plugins) { - if (!isApplet(plugin)) - continue; - - if (plugin->itemWidget(QUICK_ITEM_KEY) != watched) - continue; - - m_dragInfo->dragPosition = mouseEvent->pos(); - m_dragInfo->dragItem = plugin->itemWidget(QUICK_ITEM_KEY); - m_dragInfo->pluginInter = plugin; - break; - } } break; } @@ -238,140 +200,53 @@ QPoint QuickSettingContainer::hotSpot(const QPixmap &pixmap) return QPoint(pixmap.width(), pixmap.height()); } -bool QuickSettingContainer::isApplet(PluginsItemInterface *itemInter) const +void QuickSettingContainer::appendPlugin(PluginsItemInterface *itemInter, bool needLayout) { - if (!itemInter->itemWidget(QUICK_ITEM_KEY)) - return false; - - QJsonObject json = QuickSettingController::instance()->metaData(itemInter); - if (!json.contains("applet")) - return false; - - return json.value("applet").toBool(); -} - -QWidget *QuickSettingContainer::findPluginWindget(PluginsItemInterface *itemInter) const -{ - // 先判断是否为快捷面板区域(类似声音、亮度,音乐等) - QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); - if (itemWidget) { - for (int i = 0; i < m_componentWidget->layout()->count(); i++) { - QLayoutItem *layoutItem = m_componentWidget->layout()->itemAt(i); - if (!layoutItem) - continue; - - DBlurEffectWidget *effectWidget = qobject_cast(layoutItem->widget()); - if (!effectWidget || !effectWidget->layout()) - continue; - - for (int j = 0; j < effectWidget->layout()->count(); j++) { - QLayoutItem *layoutItem = effectWidget->layout()->itemAt(i); - if (!layoutItem || layoutItem->widget() != itemWidget) - continue; - - return itemWidget; - } - } - } else { - for (QuickSettingItem *settingItem : m_quickSettings) { - if (settingItem->pluginItem() != itemInter) - continue; - - return settingItem; - } - } - - return nullptr; -} - -void QuickSettingContainer::onPluginInsert(PluginsItemInterface *itemInter) -{ - QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); - if (isApplet(itemInter)) { - // 如果存在这个窗体,就让其显示在下方 - DBlurEffectWidget *effectWidget = new DBlurEffectWidget(m_componentWidget); - QVBoxLayout *layout = new QVBoxLayout(effectWidget); - layout->setContentsMargins(0, 0, 0, 0); - itemWidget->setParent(effectWidget); - itemWidget->setVisible(true); - layout->addWidget(itemWidget); - effectWidget->setFixedHeight(itemWidget->height()); - effectWidget->setMaskColor(QColor(239, 240, 245)); - effectWidget->setBlurRectXRadius(8); - effectWidget->setBlurRectYRadius(8); - m_componentWidget->layout()->addWidget(effectWidget); - - itemWidget->installEventFilter(this); - } else { - // 如果不存在获取到的子窗体,就让其显示在上方插件显示的位置 - initQuickItem(itemInter); + QuickSettingItem *quickItem = QuickSettingFactory::createQuickWidget(itemInter); + quickItem->setParent(m_pluginWidget); + quickItem->setMouseTracking(true); + quickItem->installEventFilter(this); + connect(quickItem, &QuickSettingItem::requestShowChildWidget, this, &QuickSettingContainer::onShowChildWidget); + m_quickSettings << quickItem; + if (quickItem->type() == QuickSettingItem::QuickSettingType::Full) { + // 插件位置占据整行,例如声音、亮度和音乐等 + m_componentWidget->layout()->addWidget(quickItem); + } else if (needLayout) { + // 插件占据两行或者一行 updateItemLayout(); } + onResizeView(); } void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) { - QWidget *itemWidget = itemInter->itemWidget(QUICK_ITEM_KEY); - if (itemWidget) { - for (int i = 0; i < m_componentWidget->layout()->count(); i++) { - QLayoutItem *layoutItem = m_componentWidget->layout()->itemAt(i); - if (!layoutItem) - continue; + for (QuickSettingItem *item : m_quickSettings) { + if (item->pluginItem() != itemInter) + continue; - DBlurEffectWidget *effectWidget = qobject_cast(layoutItem->widget()); - if (!effectWidget || !effectWidget->layout()) - continue; + if (item->type() == QuickSettingItem::QuickSettingType::Full) + m_componentWidget->layout()->removeWidget(item); + else + m_pluginLayout->removeWidget(item); - bool found = false; - for (int j = 0; j < effectWidget->layout()->count(); j++) { - QLayoutItem *layoutItem = effectWidget->layout()->itemAt(i); - if (!layoutItem) - continue; - - if (layoutItem->widget() == itemWidget) { - effectWidget->layout()->removeWidget(itemWidget); - itemWidget->setParent(nullptr); - found = true; - break; - } - } - - if (!found) - continue; - - m_componentWidget->layout()->removeWidget(effectWidget); - effectWidget->setParent(nullptr); - effectWidget->deleteLater(); - break; - } - } else { - QuickSettingItem *quickItem = nullptr; - for (QuickSettingItem *settingItem : m_quickSettings) { - if (settingItem->pluginItem() != itemInter) - continue; - - quickItem = settingItem; - break; - } - if (!quickItem) - return; - - m_pluginLayout->removeWidget(quickItem); - m_quickSettings.removeOne(quickItem); - disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick); - quickItem->setParent(nullptr); - quickItem->removeEventFilter(this); - quickItem->setMouseTracking(false); - quickItem->deleteLater(); - - //调整子控件的位置 - updateItemLayout(); + m_quickSettings.removeOne(item); + break; } onResizeView(); } +void QuickSettingContainer::onShowChildWidget(QWidget *childWidget) +{ + QuickSettingItem *quickWidget = qobject_cast(sender()); + if (!quickWidget) + return; + + showWidget(childWidget, quickWidget->pluginItem()->pluginDisplayName()); + onResizeView(); +} + void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) { if (m_dragInfo->isNull()) @@ -407,17 +282,53 @@ void QuickSettingContainer::updateItemLayout() while (m_pluginLayout->count() > 0) m_pluginLayout->takeAt(0); - int row = 0; - int column = 0; + // 将插件按照两列和一列的顺序来进行排序 + QMap> quickSettings; + QMap> orderQuickSettings; + QuickSettingController *quickController = QuickSettingController::instance(); for (QuickSettingItem *item : m_quickSettings) { - int usedColumn = item->isPrimary() ? 2 : 1; - m_pluginLayout->addWidget(item, row, column, 1, usedColumn); - column += usedColumn; - if (column >= COLUMNCOUNT) { - row++; - column = 0; + QuickSettingItem::QuickSettingType type = item->type(); + if (type == QuickSettingItem::QuickSettingType::Full) + continue; + + QJsonObject metaData = quickController->metaData(item->pluginItem()); + if (metaData.contains("order")) + orderQuickSettings[type][item] = metaData.value("order").toInt(); + else + quickSettings[type] << item; + } + // 将需要排序的插件按照顺序插入到原来的数组中 + for (auto itQuick = orderQuickSettings.begin(); itQuick != orderQuickSettings.end(); itQuick++) { + QuickSettingItem::QuickSettingType type = itQuick.key(); + QMap &orderQuicks = itQuick.value(); + for (auto it = orderQuicks.begin(); it != orderQuicks.end(); it++) { + int index = it.value(); + if (index >= 0 && index < quickSettings[type].size()) + quickSettings[type][index] = it.key(); + else + quickSettings[type] << it.key(); } } + auto insertQuickSetting = [ quickSettings, this ](QuickSettingItem::QuickSettingType type, int &row, int &column) { + if (!quickSettings.contains(type)) + return; + + int usedColumn = (type == QuickSettingItem::QuickSettingType::Multi ? 2 : 1); + QList quickPlugins = quickSettings[type]; + for (QuickSettingItem *quickItem : quickPlugins) { + m_pluginLayout->addWidget(quickItem, row, column, 1, usedColumn); + column += usedColumn; + if (column >= COLUMNCOUNT) { + row++; + column = 0; + } + } + }; + + int row = 0; + int column = 0; + insertQuickSetting(QuickSettingItem::QuickSettingType::Multi, row, column); + insertQuickSetting(QuickSettingItem::QuickSettingType::Single, row, column); } void QuickSettingContainer::initUi() @@ -458,7 +369,7 @@ void QuickSettingContainer::initUi() // 加载所有的插件 QList plugins = m_pluginLoader->pluginItems(QuickSettingController::PluginAttribute::Quick); for (PluginsItemInterface *plugin : plugins) - onPluginInsert(plugin); + appendPlugin(plugin, false); m_switchLayout->addWidget(m_mainWidget); m_switchLayout->addWidget(m_childPage); @@ -483,10 +394,9 @@ void QuickSettingContainer::initConnection() if (pluginAttr != QuickSettingController::PluginAttribute::Quick) return; - onPluginInsert(itemInter); + appendPlugin(itemInter); }); connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); - connect(m_pluginLoader, &QuickSettingController::requestAppletShow, this, &QuickSettingContainer::onRequestAppletShow); connect(m_pluginLoader, &QuickSettingController::pluginUpdated, this, &QuickSettingContainer::onPluginUpdated); connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); @@ -512,45 +422,35 @@ void QuickSettingContainer::onResizeView() { if (m_switchLayout->currentWidget() == m_mainWidget) { int selfPluginCount = 0; + int fullItemHeight = 0; + int widgetCount = 0; for (QuickSettingItem *item : m_quickSettings) { + if (item->type() == QuickSettingItem::QuickSettingType::Full) { + fullItemHeight += item->height(); + widgetCount++; + continue; + } // 如果是置顶的插件,则认为它占用两个普通插件的位置 - int increCount = (item->isPrimary() ? 2 : 1); + int increCount = (item->type() == QuickSettingItem::QuickSettingType::Multi ? 2 : 1); selfPluginCount += increCount; } + int rowCount = selfPluginCount / COLUMNCOUNT; if (selfPluginCount % COLUMNCOUNT > 0) rowCount++; m_pluginWidget->setFixedHeight(ITEMHEIGHT * rowCount + ITEMSPACE * (rowCount - 1)); - int height = 0; - int widgetCount = 0; - for (int i = 0; i < m_componentWidget->layout()->count(); i++) { - QLayoutItem *layoutItem = m_componentWidget->layout()->itemAt(i); - if (!layoutItem) - continue; - - DBlurEffectWidget *widget = qobject_cast(layoutItem->widget()); - if (!widget) - continue; - - if (widget == m_playerWidget || widget == m_brihtnessWidget) - continue; - - height += widget->height(); - widgetCount++; - } - if (m_playerWidget->isVisible()) { - height += m_playerWidget->height(); + fullItemHeight += m_playerWidget->height(); widgetCount++; } if (m_brihtnessWidget->isVisible()) { - height += m_brihtnessWidget->height(); + fullItemHeight += m_brihtnessWidget->height(); widgetCount++; } - m_componentWidget->setFixedHeight(height + (widgetCount - 1) * ITEMSPACE); + m_componentWidget->setFixedHeight(fullItemHeight + (widgetCount - 1) * ITEMSPACE); setFixedHeight(ITEMSPACE * 3 + m_pluginWidget->height() + m_componentWidget->height()); } else if (m_switchLayout->currentWidget() == m_childPage) { @@ -558,25 +458,16 @@ void QuickSettingContainer::onResizeView() } } -void QuickSettingContainer::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) -{ - // 显示弹出的内容 - QWidget *itemApplet = itemInter->itemPopupApplet(itemKey); - if (!itemApplet) - return; - - showWidget(itemApplet, itemInter->pluginDisplayName()); - onResizeView(); -} - void QuickSettingContainer::onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart) { if (dockPart != DockPart::QuickPanel) return; - QWidget *pluginWidget = findPluginWindget(itemInter); - if (!pluginWidget) - return; + for (QuickSettingItem *settingItem : m_quickSettings) { + if (settingItem->pluginItem() != itemInter) + continue; - pluginWidget->update(); + settingItem->update(); + break; + } } diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 023d9c3bd..0fb6dab92 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -64,11 +64,9 @@ protected: void showHomePage(); private Q_SLOTS: - void onPluginInsert(PluginsItemInterface *itemInter); void onPluginRemove(PluginsItemInterface *itemInter); - void onItemDetailClick(PluginsItemInterface *pluginInter); + void onShowChildWidget(QWidget *childWidget); void onResizeView(); - void onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey); void onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart); private: @@ -79,15 +77,13 @@ private: // 调整控件位置 void updateItemLayout(); // 初始化控件项目 - void initQuickItem(PluginsItemInterface *plugin); + // void initQuickItem(PluginsItemInterface *plugin); // 显示具体的窗体 void showWidget(QWidget *widget, const QString &title); // 获取拖动图标的热点 QPoint hotSpot(const QPixmap &pixmap); - // 判断是否支持显示在面板上 - bool isApplet(PluginsItemInterface * itemInter) const; - // 判断插件是否在当前快捷面板上 - QWidget *findPluginWindget(PluginsItemInterface * itemInter) const; + // 插入插件 + void appendPlugin(PluginsItemInterface *itemInter, bool needLayout = true); private: static DockPopupWindow *m_popWindow; From e663e4ac168faad09a22f3f60b951178de836db7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 9 Nov 2022 02:31:27 +0000 Subject: [PATCH 118/257] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84onboard?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 适配v23并完善接口内容 Log: 完善onboard插件接口 Influence: 快捷面板观察onboard插件是否正常显示 Task: https://pms.uniontech.com/task-view-212611.html Change-Id: Ic3db0b0b880b20327a210ac103f116e58d7ffd6d --- plugins/onboard/onboarditem.cpp | 20 +++++++++++--------- plugins/onboard/onboarditem.h | 1 + plugins/onboard/onboardplugin.cpp | 23 +++++++++++++++++++++-- plugins/onboard/onboardplugin.h | 3 +++ 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/plugins/onboard/onboarditem.cpp b/plugins/onboard/onboarditem.cpp index de72f24e0..b69aaed52 100644 --- a/plugins/onboard/onboarditem.cpp +++ b/plugins/onboard/onboarditem.cpp @@ -46,17 +46,22 @@ OnboardItem::OnboardItem(QWidget *parent) m_icon = QIcon::fromTheme(":/icons/icon/deepin-virtualkeyboard.svg"); } +QPixmap OnboardItem::iconPixmap(int iconSize) const +{ + QString iconName = "deepin-virtualkeyboard"; + if (std::min(width(), height()) <= PLUGIN_BACKGROUND_MIN_SIZE + || DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + iconName.append(PLUGIN_MIN_ICON_NAME); + + return loadSvg(iconName, QSize(iconSize, iconSize)); +} + void OnboardItem::paintEvent(QPaintEvent *e) { Q_UNUSED(e); - QPixmap pixmap; - QString iconName = "deepin-virtualkeyboard"; - int iconSize = PLUGIN_ICON_MAX_SIZE; - QPainter painter(this); if (std::min(width(), height()) > PLUGIN_BACKGROUND_MIN_SIZE) { - QColor color; if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { color = Qt::black; @@ -95,12 +100,9 @@ void OnboardItem::paintEvent(QPaintEvent *e) path.addRoundedRect(rc, radius, radius); painter.fillPath(path, color); - } else if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - iconName.append(PLUGIN_MIN_ICON_NAME); } - pixmap = loadSvg(iconName, QSize(iconSize, iconSize)); - + QPixmap pixmap = iconPixmap(PLUGIN_ICON_MAX_SIZE); painter.setOpacity(1); const QRectF &rf = QRectF(rect()); const QRectF &rfp = QRectF(pixmap.rect()); diff --git a/plugins/onboard/onboarditem.h b/plugins/onboard/onboarditem.h index f2186a039..58b094dc5 100644 --- a/plugins/onboard/onboarditem.h +++ b/plugins/onboard/onboarditem.h @@ -33,6 +33,7 @@ class OnboardItem : public QWidget public: explicit OnboardItem(QWidget *parent = nullptr); + QPixmap iconPixmap(int iconSize) const; protected: void paintEvent(QPaintEvent *e) override; diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index 28496dbb1..ba46219b6 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -61,9 +61,10 @@ const QString OnboardPlugin::pluginDisplayName() const QWidget *OnboardPlugin::itemWidget(const QString &itemKey) { - Q_UNUSED(itemKey); + if (itemKey == pluginName()) + return m_onboardItem.data(); - return m_onboardItem.data(); + return nullptr; } QWidget *OnboardPlugin::itemTipsWidget(const QString &itemKey) @@ -184,6 +185,24 @@ void OnboardPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } +QIcon OnboardPlugin::icon(const DockPart &dockPart) +{ + if (dockPart == DockPart::QuickPanel) + return m_onboardItem->iconPixmap(24); + + return m_onboardItem->iconPixmap(20); +} + +PluginsItemInterface::PluginStatus OnboardPlugin::status() const +{ + return PluginsItemInterface::PluginStatus::Active; +} + +QString OnboardPlugin::description() const +{ + return pluginDisplayName(); +} + void OnboardPlugin::loadPlugin() { if (m_pluginLoaded) { diff --git a/plugins/onboard/onboardplugin.h b/plugins/onboard/onboardplugin.h index a8b005b4c..3d08b1795 100644 --- a/plugins/onboard/onboardplugin.h +++ b/plugins/onboard/onboardplugin.h @@ -59,6 +59,9 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; + QIcon icon(const DockPart &dockPart) override; + PluginStatus status() const override; + QString description() const override; private: void loadPlugin(); From 1e87fd5122b67f761f2b33d904043e20bcc49b93 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 8 Nov 2022 15:48:28 +0800 Subject: [PATCH 119/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=B6?= =?UTF-8?q?=E5=B0=9A=E6=A8=A1=E5=9E=8B=E4=B8=8B=E5=9B=BE=E6=A0=87=E9=93=BA?= =?UTF-8?q?=E6=BB=A1=E4=BB=BB=E5=8A=A1=E6=A0=8F=E7=9A=84=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 时尚模式下,计算任务栏的图标的尺寸和任务栏应用区域尺寸的时候,没有考虑托盘区域的尺寸,导致应用区域的尺寸过大,当图标铺满任务栏的时候,将整个任务栏挤出到屏幕外 Log: 修复任务栏时尚模式下的图标的显示问题 Influence: 时尚模式下,不断向任务栏添加图标,知道铺满,观察任务栏是否在屏幕可见区域内 Task: https://pms.uniontech.com/task-view-150049.html Change-Id: Ie3a3a459df7dd4fb127f6e7daa2e8b1c60a88c30 --- frame/window/mainpanelcontrol.cpp | 50 +++++++++++++++++++++++++------ frame/window/mainpanelcontrol.h | 1 + 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 1b7b2e790..e1761b1ec 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -268,7 +268,7 @@ void MainPanelControl::updateMainPanelLayout() */ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg) { - if(m_position == Position::Top || m_position == Position::Bottom){ + if(m_position == Position::Top || m_position == Position::Bottom) { wdg->setMaximumSize(height(),height()); } else { wdg->setMaximumSize(width(),width()); @@ -1006,6 +1006,8 @@ QSize MainPanelControl::suitableSize(const Position &position, int screenSize, d // 如果是特效模式 int totalLength = static_cast(screenSize / ratio); + // 减去插件区域的尺寸 + totalLength -= trayAreaSize(); // 需要参与计算的图标的总数 int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count() + m_toolSonLayout->count(); int multiWindowCount = m_multiWindowLayout->count(); @@ -1116,6 +1118,27 @@ int MainPanelControl::getScreenSize() const return screenRect.height(); } +int MainPanelControl::trayAreaSize() const +{ + if (m_displayMode == Dock::DisplayMode::Efficient) + return (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom ? m_tray->width() : m_tray->height()); + + int length = 0; + QWidgetList topLevelWidgets = qApp->topLevelWidgets(); + for (QWidget *widget : topLevelWidgets) { + MainWindowBase *topWindow = qobject_cast(widget); + if (!topWindow) + continue; + + if (topWindow->windowType() != MainWindowBase::DockWindowType::MainWindow) + length += (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom ? topWindow->width() : topWindow->height()); + + length += topWindow->dockSpace(); + } + + return length; +} + /**重新计算任务栏上应用图标、插件图标的大小,并设置 * @brief MainPanelControl::resizeDockIcon */ @@ -1125,10 +1148,8 @@ void MainPanelControl::resizeDockIcon() int tray_item_size = 0; // 总宽度 if (m_displayMode == DisplayMode::Fashion) { - int iconCount = 0; // 时尚模式 - int totalLength = getScreenSize(); - iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count(); + int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count(); if (m_recentAreaWidget->isVisible()) iconCount += m_recentLayout->count(); @@ -1138,6 +1159,15 @@ void MainPanelControl::resizeDockIcon() if (iconCount <= 0) return; + int totalLength = getScreenSize() - trayAreaSize(); + + if (m_fixedSpliter->isVisible()) + totalLength -= SPLITER_SIZE; + if (m_appSpliter->isVisible()) + totalLength -= SPLITER_SIZE; + if (m_recentSpliter->isVisible()) + totalLength -= SPLITER_SIZE; + // 余数 int yu = (totalLength % iconCount); // icon宽度 = (总宽度-余数)/icon个数 @@ -1161,9 +1191,14 @@ void MainPanelControl::resizeDockIcon() iconSize = (totalLength - yu) / iconCount; } else { int totalLength = ((m_position == Position::Top) || (m_position == Position::Bottom)) ? width() : height(); - totalLength -= m_tray->width(); + totalLength -= trayAreaSize(); // 减去3个分割线的宽度 - totalLength -= 3 * SPLITER_SIZE; + if (m_fixedSpliter->isVisible()) + totalLength -= SPLITER_SIZE; + if (m_appSpliter->isVisible()) + totalLength -= SPLITER_SIZE; + if (m_recentSpliter->isVisible()) + totalLength -= SPLITER_SIZE; int pluginItemCount = 0; int calcPluginItemCount = 0; @@ -1221,9 +1256,6 @@ void MainPanelControl::resizeDockIcon() if (tray_item_size < 20) tray_item_size = 20; - // 减去插件图标的大小后重新计算固定图标和应用图标的平均大小 - totalLength -= m_tray->width();//tray_item_size * pluginCount; - // 余数 yu = (totalLength % iconCount); // icon宽度 = (总宽度-余数)/icon个数 diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 897526afe..3a84785ca 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -78,6 +78,7 @@ private: void removeFixedAreaItem(QWidget *wdg); void removeAppAreaItem(QWidget *wdg); int getScreenSize() const; + int trayAreaSize() const; // 拖拽相关 void startDrag(DockItem *); From 28cc1b440c3464f4c0c8c19f0325a7e842ae9d50 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 9 Nov 2022 03:22:53 +0000 Subject: [PATCH 120/257] =?UTF-8?q?fix:=20=E9=80=82=E9=85=8D=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=89=88=E6=9C=AC=E7=9A=84dtk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dtk的路径名称发生了变化,先删除这个路径,由各个项目自己来添加 Log: 适配最新版本的dtk Influence: 无 Task: https://pms.uniontech.com/task-view-213083.html Change-Id: I700f5c47796a8cc3a24449594db5b0269d8ac084 --- cmake/DdeDock/DdeDockConfig.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/DdeDock/DdeDockConfig.cmake b/cmake/DdeDock/DdeDockConfig.cmake index a2dab5125..de60a77a8 100644 --- a/cmake/DdeDock/DdeDockConfig.cmake +++ b/cmake/DdeDock/DdeDockConfig.cmake @@ -1,2 +1 @@ set(DDE_DOCK_INCLUDE_DIR /usr/include/dde-dock) -include_directories("${DTKCORE_INCLUDE_DIR}") From b882272d3269c988fe706006cb297fb38c60db5d Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 9 Nov 2022 02:57:40 +0000 Subject: [PATCH 121/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A3=B0?= =?UTF-8?q?=E9=9F=B3=E8=AE=BE=E7=BD=AE=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端返回的声音数值范围是0-1,前端设置的范围是0-100,两者之间需要按照相应的转换关系进行转换 Log: 修复声音设置错误 Influence: 打开快捷设置面板,通过滑动条来调整声音,观察声音是否在设置的范围内,同时观察主面板和子面板两边的声音滑动条是否同步 Task: https://pms.uniontech.com/task-view-210309.html Change-Id: I5a567317ae68b18e4d423830d6f52352d21dabe1 --- plugins/sound/sounddeviceswidget.cpp | 4 ++-- plugins/sound/soundplugin.cpp | 4 ++-- plugins/sound/soundwidget.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/sound/sounddeviceswidget.cpp b/plugins/sound/sounddeviceswidget.cpp index 7557b6511..907b25d00 100644 --- a/plugins/sound/sounddeviceswidget.cpp +++ b/plugins/sound/sounddeviceswidget.cpp @@ -168,14 +168,14 @@ void SoundDevicesWidget::onAudioDevicesChanged() void SoundDevicesWidget::initConnection() { - connect(m_audioSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); + connect(m_audioSink, &DBusSink::VolumeChanged, this, [ = ](double value) { m_sliderContainer->updateSliderValue(value * 100); }); connect(m_volumeModel, &DBusAudio::DefaultSinkChanged, this, &SoundDevicesWidget::onDefaultSinkChanged); connect(m_delegate, &SettingDelegate::selectIndexChanged, this, &SoundDevicesWidget::onSelectIndexChanged); connect(m_volumeModel, &DBusAudio::PortEnabledChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); connect(m_volumeModel, &DBusAudio::CardsWithoutUnavailableChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { - m_audioSink->SetVolume(value, true); + m_audioSink->SetVolume(value * 0.01, true); }); } diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index c2c8be211..5e97e5f01 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -101,9 +101,9 @@ QWidget *SoundPlugin::itemTipsWidget(const QString &itemKey) QWidget *SoundPlugin::itemPopupApplet(const QString &itemKey) { - if (itemKey == SOUND_KEY) { + if (itemKey == SOUND_KEY) return m_soundItem->popupApplet(); - } + if (itemKey == QUICK_ITEM_KEY) return m_soundDeviceWidget.data(); diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 3f6fbfbac..df3f6f0ae 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -80,7 +80,7 @@ void SoundWidget::initUi() void SoundWidget::initConnection() { - connect(m_defaultSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); + connect(m_defaultSink, &DBusSink::VolumeChanged, this, [ this ](double value) { m_sliderContainer->updateSliderValue(value * 100); }); connect(m_dbusAudio, &DBusAudio::DefaultSinkChanged, this, [ this ](const QDBusObjectPath &value) { if (m_defaultSink) @@ -92,7 +92,7 @@ void SoundWidget::initConnection() }); connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { - m_defaultSink->SetVolume(value, true); + m_defaultSink->SetVolume(value * 0.01, true); }); connect(m_defaultSink, &DBusSink::MuteChanged, this, [ this ] { From 091ed36a88c6c412877b546929002edecc780a70 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 9 Nov 2022 03:53:31 +0000 Subject: [PATCH 122/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=BC=A0?= =?UTF-8?q?=E6=A0=87=E6=94=BE=E5=88=B0=E4=BB=BB=E5=8A=A1=E6=A0=8F=E4=B8=8A?= =?UTF-8?q?=E6=8B=96=E5=8A=A8=E5=8C=BA=E5=9F=9F=E5=B0=BA=E5=AF=B8=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改拖动区域的高度为定义好的拖拽尺寸 Log: 修复任务栏拖拽区域的高度 Influence: 任务栏在下方的时候,鼠标放入任务栏上方的位置,观察鼠标形状是否正常 Task: https://pms.uniontech.com/task-view-213103.html Change-Id: I4b5864c88960681bf51a8d86a7fd11ed9a59035b --- frame/window/mainwindowbase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index ea8d83b86..d6e170bce 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -232,7 +232,7 @@ void MainWindowBase::updateDragGeometry() m_dragWidget->setGeometry(0, height() - DRAG_AREA_SIZE, width(), DRAG_AREA_SIZE); break; case Dock::Bottom: - m_dragWidget->setGeometry(0, 0, width(), 20); + m_dragWidget->setGeometry(0, 0, width(), DRAG_AREA_SIZE); break; case Dock::Left: m_dragWidget->setGeometry(width() - DRAG_AREA_SIZE, 0, DRAG_AREA_SIZE, height()); From e011333e5a0534eb40418869af6557d1df4fd8fc Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 9 Nov 2022 05:36:03 +0000 Subject: [PATCH 123/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=85=B3?= =?UTF-8?q?=E6=9C=BA=E5=9B=BE=E6=A0=87=E4=B8=8E=E6=8F=92=E4=BB=B6=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E9=97=B4=E8=B7=9D=E8=BF=87=E5=A4=A7=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高效模式下,关机插件不显示文本,在计算尺寸的时候,不考虑文本的尺寸 Log: 修复高效模式间距过大的问题 Influence: 高效模式下,观察关机图标与左右侧插件和时间的距离 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I50c80880b811e7bb06b917891045d462628a8ee4 --- frame/window/systempluginwindow.cpp | 40 ++++++++++++++--------------- frame/window/systempluginwindow.h | 8 +++--- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 7f6c25d99..32253f16a 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -51,15 +51,7 @@ SystemPluginWindow::~SystemPluginWindow() void SystemPluginWindow::setDisplayMode(const DisplayMode &displayMode) { m_displayMode = displayMode; - - QObjectList childObjects = children(); - for (QObject *childObject : childObjects) { - StretchPluginsItem *item = qobject_cast(childObject); - if (!item) - continue; - - item->setDisplayMode(displayMode); - } + StretchPluginsItem::setDisplayMode(displayMode); } void SystemPluginWindow::setPositon(Position position) @@ -74,13 +66,15 @@ void SystemPluginWindow::setPositon(Position position) else m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom); + StretchPluginsItem::setPosition(position); + QObjectList childObjects = children(); for (QObject *childObject : childObjects) { StretchPluginsItem *item = qobject_cast(childObject); if (!item) continue; - item->setPosition(m_position); + item->update(); } } @@ -199,12 +193,13 @@ void SystemPluginWindow::onPluginItemUpdated(PluginsItemInterface *pluginItem) #define ICONTEXTSPACE 6 #define PLUGIN_ITEM_DRAG_THRESHOLD 20 +Dock::DisplayMode StretchPluginsItem::m_displayMode = Dock::DisplayMode::Efficient; +Dock::Position StretchPluginsItem::m_position = Dock::Position::Bottom; + StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter, const QString &itemKey, QWidget *parent) : DockItem(parent) , m_pluginInter(pluginInter) , m_itemKey(itemKey) - , m_displayMode(Dock::DisplayMode::Efficient) - , m_position(Dock::Position::Bottom) { } @@ -220,7 +215,6 @@ void StretchPluginsItem::setDisplayMode(const DisplayMode &displayMode) void StretchPluginsItem::setPosition(Position position) { m_position = position; - update(); } QString StretchPluginsItem::itemKey() const @@ -272,15 +266,19 @@ QSize StretchPluginsItem::suitableSize(const Position &position) const { int iconSize = static_cast(ICONSIZE * (qApp->devicePixelRatio())); if (position == Dock::Position::Top || position == Dock::Position::Bottom) { - int textWidth = QFontMetrics(textFont(position)).boundingRect(m_pluginInter->pluginDisplayName()).width(); - return QSize(qMax(textWidth, iconSize) + 10 * 2, -1); + 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); } - int height = 6; // 图标上边距6 - height += iconSize; // 图标尺寸20 - height += ICONTEXTSPACE; // 图标与文字间距6 - height += QFontMetrics(textFont(position)).height(); // 文本高度 - height += 4; // 下间距4 + int height = 6; // 图标上边距6 + height += iconSize; // 图标尺寸20 + height += ICONTEXTSPACE; // 图标与文字间距6 + if (needShowText()) // 只有在显示文本的时候才计算文本的高度 + height += QFontMetrics(textFont(position)).height(); // 文本高度 + height += 4; // 下间距4 return QSize(-1, height); } @@ -373,7 +371,7 @@ void StretchPluginsItem::mouseClick() { const QString command = m_pluginInter->itemCommand(m_itemKey); if (!command.isEmpty()) { - QProcess::startDetached(command); + QProcess::startDetached(command, QStringList()); return; } diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index b7bda5dc3..6d37080fd 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -77,8 +77,8 @@ class StretchPluginsItem : public DockItem public: StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); ~StretchPluginsItem() override; - void setDisplayMode(const Dock::DisplayMode &displayMode); - void setPosition(Dock::Position position); + static void setDisplayMode(const Dock::DisplayMode &displayMode); + static void setPosition(Dock::Position position); PluginsItemInterface *pluginInter() const; QString itemKey() const; QSize suitableSize() const; @@ -105,8 +105,8 @@ private: private: PluginsItemInterface *m_pluginInter; QString m_itemKey; - Dock::DisplayMode m_displayMode; - Dock::Position m_position; + static Dock::DisplayMode m_displayMode; + static Dock::Position m_position; QPoint m_mousePressPoint; }; From 719fea0c64ab3c7a3ef69d80dc8f3b4a6e36fe66 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 9 Nov 2022 10:17:33 +0000 Subject: [PATCH 124/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E6=95=88=E6=A8=A1=E5=BC=8F=E4=B8=8B=E5=85=B3=E6=9C=BA=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=98=BE=E7=A4=BA=E6=96=87=E6=9C=AC=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高效模式和时尚模式的插件是两个对象,在设置模式的时候用的是静态变量,导致两边识别到的模式始终为时尚模式,引起是否显示文字的判断错误 Log: 修复高效模式下关机按钮的显示问题 Influence: 高效模式下,调整任务栏到最高,观察关机按钮的显示 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I6161fbdf0a5d052ce6e422b2490f1281922f9510 --- frame/window/systempluginwindow.cpp | 11 +++++++++-- frame/window/systempluginwindow.h | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 32253f16a..551e0e2bd 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -51,7 +51,14 @@ SystemPluginWindow::~SystemPluginWindow() void SystemPluginWindow::setDisplayMode(const DisplayMode &displayMode) { m_displayMode = displayMode; - StretchPluginsItem::setDisplayMode(displayMode); + QObjectList childObjects = children(); + for (QObject *childObject : childObjects) { + StretchPluginsItem *item = qobject_cast(childObject); + if (!item) + continue; + + item->setDisplayMode(displayMode); + } } void SystemPluginWindow::setPositon(Position position) @@ -193,13 +200,13 @@ void SystemPluginWindow::onPluginItemUpdated(PluginsItemInterface *pluginItem) #define ICONTEXTSPACE 6 #define PLUGIN_ITEM_DRAG_THRESHOLD 20 -Dock::DisplayMode StretchPluginsItem::m_displayMode = Dock::DisplayMode::Efficient; Dock::Position StretchPluginsItem::m_position = Dock::Position::Bottom; StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter, const QString &itemKey, QWidget *parent) : DockItem(parent) , m_pluginInter(pluginInter) , m_itemKey(itemKey) + , m_displayMode(Dock::DisplayMode::Efficient) { } diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 6d37080fd..4e5bdb6d5 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -77,7 +77,7 @@ class StretchPluginsItem : public DockItem public: StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); ~StretchPluginsItem() override; - static void setDisplayMode(const Dock::DisplayMode &displayMode); + void setDisplayMode(const Dock::DisplayMode &displayMode); static void setPosition(Dock::Position position); PluginsItemInterface *pluginInter() const; QString itemKey() const; @@ -105,7 +105,7 @@ private: private: PluginsItemInterface *m_pluginInter; QString m_itemKey; - static Dock::DisplayMode m_displayMode; + Dock::DisplayMode m_displayMode; static Dock::Position m_position; QPoint m_mousePressPoint; }; From 7c2f2b38eaf6fee4a5a821751e587cfc993cb165 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 9 Nov 2022 11:03:59 +0000 Subject: [PATCH 125/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=98?= =?UTF-8?q?=E7=9B=98=E5=9B=BE=E6=A0=87=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、新增托盘图标后,自动调整顺序 2、托盘在调整位置之前先调整尺寸 3、删除多余的函数调用 Log: 修复托盘图标显示异常 Influence: 观察输入法是否正常显示,将托盘图标从托盘拖动到任务栏,观察该图标是否在展开托盘图标和输入法中间 Task: https://pms.uniontech.com/task-view-213361.html Change-Id: I6c87ba89c6fb44a33c32f9252cc2b00b1e828e76 --- frame/window/docktraywindow.cpp | 19 ++-- frame/window/mainpanelcontrol.cpp | 3 - frame/window/tray/tray_delegate.cpp | 20 ++-- frame/window/tray/tray_gridview.cpp | 12 +-- frame/window/tray/tray_gridview.h | 1 + frame/window/tray/tray_model.cpp | 94 ++++++++++++++----- frame/window/tray/tray_model.h | 19 ++-- .../window/tray/widgets/expandiconwidget.cpp | 66 +++++++------ frame/window/tray/widgets/expandiconwidget.h | 5 +- frame/window/traymanagerwindow.cpp | 22 ++--- frame/window/traymanagerwindow.h | 1 - 11 files changed, 158 insertions(+), 104 deletions(-) diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 759c1add8..640bca6f1 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -28,6 +28,7 @@ #include "quicksettingcontroller.h" #include "pluginsitem.h" #include "quicksettingcontainer.h" +#include "expandiconwidget.h" #include @@ -80,6 +81,9 @@ void DockTrayWindow::setDisplayMode(const Dock::DisplayMode &displayMode) { m_displayMode = displayMode; moveToolPlugin(); + // 如果当前模式为高效模式,则设置当前的trayView为其计算位置的参照 + if (displayMode == Dock::DisplayMode::Efficient) + ExpandIconWidget::popupTrayView()->setReferGridView(m_trayView); } QSize DockTrayWindow::suitableSize(const Dock::Position &position, const int &, const double &) const @@ -311,18 +315,19 @@ void DockTrayWindow::initConnection() connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, &DockTrayWindow::onResetLayout); connect(m_quickIconWidget, &QuickPluginWindow::requestDrop, this, &DockTrayWindow::onDropIcon); connect(m_systemPuginWidget, &SystemPluginWindow::requestDrop, this, &DockTrayWindow::onDropIcon); - connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); - connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onResetLayout); connect(m_model, &TrayModel::rowCountChanged, this, &DockTrayWindow::onResetLayout); connect(m_model, &TrayModel::rowCountChanged, m_trayView, &TrayGridView::onUpdateEditorView); connect(m_model, &TrayModel::requestRefreshEditor, m_trayView, &TrayGridView::onUpdateEditorView); - - connect(m_trayView, &TrayGridView::dragLeaved, m_delegate, [ this ]{ - Q_EMIT m_delegate->requestDrag(true); - }); - connect(m_trayView, &TrayGridView::dragEntered, m_delegate, [ this ]{ + connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); + connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onResetLayout); + connect(m_trayView, &TrayGridView::dragFinished, this, [ this ] { + // 如果拖拽结束,则隐藏托盘 Q_EMIT m_delegate->requestDrag(false); }); + + connect(m_trayView, &TrayGridView::dragLeaved, m_delegate, [ this ] { + Q_EMIT m_delegate->requestDrag(true); + }); connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ] (PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { switch (pluginAttr) { case QuickSettingController::PluginAttribute::Tool: diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index e1761b1ec..37e1b0660 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -205,9 +205,6 @@ void MainPanelControl::initConnection() */ void MainPanelControl::setDisplayMode(DisplayMode dislayMode) { - if (dislayMode == m_displayMode) - return; - m_displayMode = dislayMode; m_recentHelper->setDisplayMode(dislayMode); m_tray->setDisplayMode(dislayMode); diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index 4e14e8243..6f44b3658 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -125,19 +125,23 @@ void TrayDelegate::onUpdateExpand(bool on) ExpandIconWidget *expandwidget = expandWidget(); if (on) { - if (!expandwidget) { + if (expandwidget) { + expandwidget->setTrayPanelVisible(true); + } else { // 如果三角按钮不存在,那么就设置三角按钮可见,此时它会自动创建一个三角按钮 TrayModel *model = qobject_cast(m_listView->model()); if (model) model->setExpandVisible(true, true); - } else { - expandwidget->setTrayPanelVisible(true); } - } else if (expandwidget) { - // 如果释放鼠标,则判断当前鼠标的位置是否在托盘内部,如果在,则无需隐藏 - QPoint currentPoint = QCursor::pos(); - TrayGridWidget *view = ExpandIconWidget::popupTrayView(); - expandwidget->setTrayPanelVisible(view->geometry().contains(currentPoint)); + } else { + if (expandwidget) { + // 如果释放鼠标,则判断当前鼠标的位置是否在托盘内部,如果在,则无需隐藏 + QPoint currentPoint = QCursor::pos(); + TrayGridWidget *view = ExpandIconWidget::popupTrayView(); + expandwidget->setTrayPanelVisible(view->geometry().contains(currentPoint)); + } else { + ExpandIconWidget::popupTrayView()->hide(); + } } } diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index b62757f3c..9d397c0ec 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -467,8 +467,6 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) pixLabel->setPixmap(pixmap); pixLabel->setFixedSize(indexRect(modelIndex).size() / ratio); - QRect rectIcon(pixLabel->rect().topLeft(), pixLabel->size()); - QDrag *drag = new QDrag(this); pixmap.scaled(pixmap.size() * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap.setDevicePixelRatio(ratio); @@ -486,6 +484,8 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) listModel->setDragKey(itemKey); listModel->setDragingIndex(modelIndex); + // 删除当前的图标 + WinInfo winInfo = listModel->takeIndex(modelIndex); Qt::DropAction dropAct = drag->exec(supportedActions); @@ -493,18 +493,20 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) m_aniStartTime->stop(); m_pressed = false; - Q_EMIT dragEntered(); if (dropAct == Qt::IgnoreAction) { QPropertyAnimation *posAni = new QPropertyAnimation(pixLabel, "pos", pixLabel); - connect(posAni, &QPropertyAnimation::finished, [ &, listModel, pixLabel ] () { + connect(posAni, &QPropertyAnimation::finished, [ this, listModel, pixLabel, modelIndex, winInfo ] () { pixLabel->hide(); pixLabel->deleteLater(); listModel->setDragKey(QString()); + listModel->insertRow(modelIndex.row(), winInfo); clearDragModelIndex(); listModel->setExpandVisible(!TrayModel::getIconModel()->isEmpty()); m_dropPos = QPoint(); m_dragPos = QPoint(); + + Q_EMIT dragFinished(); }); posAni->setEasingCurve(QEasingCurve::Linear); posAni->setDuration(m_aniDuringTime); @@ -518,8 +520,6 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) m_dropPos = QPoint(); m_dragPos = QPoint(); - - Q_EMIT requestRemove(itemKey); } return true; diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h index 3a5e25b28..3951de3c6 100644 --- a/frame/window/tray/tray_gridview.h +++ b/frame/window/tray/tray_gridview.h @@ -54,6 +54,7 @@ Q_SIGNALS: void requestRemove(const QString &); void dragLeaved(); void dragEntered(); + void dragFinished(); private Q_SLOTS: void clearDragModelIndex(); diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index aa460d4cc..865a47241 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -340,6 +340,22 @@ void TrayModel::clear() Q_EMIT rowCountChanged(); } +WinInfo TrayModel::takeIndex(const QModelIndex &index) +{ + int row = index.row(); + if (row < 0 || row >= m_winInfos.size()) + return WinInfo(); + + WinInfo win = m_winInfos[row]; + beginResetModel(); + m_winInfos.removeAt(row); + endResetModel(); + + Q_EMIT rowCountChanged(); + + return win; +} + void TrayModel::onXEmbedTrayAdded(quint32 winId) { if (!xembedCanExport(winId)) @@ -357,6 +373,7 @@ void TrayModel::onXEmbedTrayAdded(quint32 winId) info.itemKey = xembedItemKey(winId); info.winId = winId; m_winInfos.append(info); + sortItems(); endInsertRows(); Q_EMIT rowCountChanged(); @@ -471,6 +488,48 @@ bool TrayModel::systemItemCanExport(const QString &pluginName) const return inTrayConfig(systemItemKey(pluginName)); } +void TrayModel::sortItems() +{ + // 如果当前是展开托盘的内容,则无需排序 + if (m_isTrayIcon) + return; + + // 数据排列,展开按钮始终排在最前面,输入法始终排在最后面 + WinInfos expandWin; + WinInfos inputMethodWin; + // 从列表中获取输入法和展开按钮 + for (const WinInfo &winInfo : m_winInfos) { + switch (winInfo.type) { + case TrayIconType::ExpandIcon: { + expandWin << winInfo; + break; + } + case TrayIconType::Sni: { + if (winInfo.isTypeWriting) + inputMethodWin << winInfo; + break; + } + default: + break; + } + } + // 从列表中移除展开按钮 + for (const WinInfo &winInfo : expandWin) + m_winInfos.removeOne(winInfo); + + // 从列表中移除输入法 + for (const WinInfo &winInfo : inputMethodWin) + m_winInfos.removeOne(winInfo); + + // 将展开按钮添加到列表的最前面 + for (int i = expandWin.size() - 1; i >= 0; i--) + m_winInfos.push_front(expandWin[i]); + + // 将输入法添加到列表的最后面 + for (int i = 0; i < inputMethodWin.size(); i++) + m_winInfos.push_back(inputMethodWin[i]); +} + void TrayModel::onSniTrayAdded(const QString &servicePath) { if (!sniCanExport(servicePath)) @@ -478,16 +537,6 @@ void TrayModel::onSniTrayAdded(const QString &servicePath) bool typeWriting = isTypeWriting(servicePath); - int citxIndex = -1; - for (int i = 0; i < m_winInfos.size(); i++) { - WinInfo info = m_winInfos[i]; - if (info.servicePath == servicePath) - return; - - if (typeWriting && info.isTypeWriting) - citxIndex = i; - } - beginInsertRows(QModelIndex(), rowCount(), rowCount()); WinInfo info; info.type = Sni; @@ -495,23 +544,12 @@ void TrayModel::onSniTrayAdded(const QString &servicePath) info.itemKey = sniItemKey(servicePath); info.servicePath = servicePath; info.isTypeWriting = typeWriting; // 是否为输入法 - if (typeWriting) { - if (citxIndex < 0) { - m_winInfos.append(info); - } else { - // 如果输入法在指定位置,则将输入法移动到指定位置 - m_winInfos[citxIndex] = info; - QTimer::singleShot(150, this, [ = ] { - // 对比需要变化的图标 - emit requestUpdateWidget({ citxIndex }); - }); - } - } else { - m_winInfos.append(info); + m_winInfos.append(info); - Q_EMIT rowCountChanged(); - } + sortItems(); endInsertRows(); + + Q_EMIT rowCountChanged(); } void TrayModel::onSniTrayRemoved(const QString &servicePath) @@ -584,6 +622,8 @@ void TrayModel::onIndicatorAdded(const QString &indicatorName) info.key = itemKey; info.itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); m_winInfos.append(info); + + sortItems(); endInsertRows(); Q_EMIT rowCountChanged(); @@ -613,6 +653,7 @@ void TrayModel::onSystemTrayAdded(PluginsItemInterface *itemInter) info.itemKey = systemItemKey(itemInter->pluginName()); m_winInfos.append(info); + sortItems(); endInsertRows(); Q_EMIT rowCountChanged(); @@ -699,6 +740,7 @@ void TrayModel::addRow(WinInfo info) beginInsertRows(QModelIndex(), rowCount(), rowCount()); m_winInfos.append(info); + sortItems(); endInsertRows(); Q_EMIT requestRefreshEditor(); @@ -718,6 +760,8 @@ void TrayModel::insertRow(int index, WinInfo info) } beginInsertRows(QModelIndex(), index, index); m_winInfos.insert(index, info); + sortItems(); + endInsertRows(); Q_EMIT requestRefreshEditor(); diff --git a/frame/window/tray/tray_model.h b/frame/window/tray/tray_model.h index 0e5b9f95e..63887d28d 100644 --- a/frame/window/tray/tray_model.h +++ b/frame/window/tray/tray_model.h @@ -110,11 +110,11 @@ public: bool isEmpty() const; void clear(); + WinInfo takeIndex(const QModelIndex &index); void saveConfig(int index, const WinInfo &winInfo); Q_SIGNALS: void requestUpdateIcon(quint32); - void requestUpdateWidget(const QList &); void requestOpenEditor(const QModelIndex &index, bool isOpen = true) const; void rowCountChanged(); void requestRefreshEditor(); @@ -142,6 +142,14 @@ private Q_SLOTS: void onSettingChanged(const QString &key, const QVariant &value); +protected: + QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; + bool removeRows(int row, int count, const QModelIndex &parent) Q_DECL_OVERRIDE; + bool canDropMimeData(const QMimeData *data, Qt::DropAction action, + int row, int column, const QModelIndex &parent) const Q_DECL_OVERRIDE; + Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; + private: bool exist(const QString &itemKey); QString fileNameByServiceName(const QString &serviceName) const; @@ -155,14 +163,7 @@ private: bool indicatorCanExport(const QString &indicatorName) const; QString systemItemKey(const QString &pluginName) const; bool systemItemCanExport(const QString &pluginName) const; - -protected: - QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE; - QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; - bool removeRows(int row, int count, const QModelIndex &parent) Q_DECL_OVERRIDE; - bool canDropMimeData(const QMimeData *data, Qt::DropAction action, - int row, int column, const QModelIndex &parent) const Q_DECL_OVERRIDE; - Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; + void sortItems(); private: WinInfos m_winInfos; diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 9ffee3f9f..79c3e5bf1 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -66,9 +66,6 @@ ExpandIconWidget::ExpandIconWidget(QWidget *parent, Qt::WindowFlags f) ExpandIconWidget::~ExpandIconWidget() { - TrayGridWidget *gridView = popupTrayView(); - gridView->setOwnerWidget(nullptr); - setTrayPanelVisible(false); } void ExpandIconWidget::setPositon(Dock::Position position) @@ -84,10 +81,6 @@ void ExpandIconWidget::sendClick(uint8_t mouseButton, int x, int y) Q_UNUSED(x); Q_UNUSED(y); - // 如果当前图标不可见,则不让展开托盘列表 - if (popupTrayView()->trayView()->model()->rowCount() == 0) - return; - if (mouseButton != XCB_BUTTON_INDEX_1) return; @@ -115,10 +108,6 @@ QPixmap ExpandIconWidget::icon() void ExpandIconWidget::paintEvent(QPaintEvent *event) { - TrayGridWidget *gridView = popupTrayView(); - if (gridView->trayView()->model()->rowCount() == 0) - return BaseTrayWidget::paintEvent(event); - QPainter painter(this); QPixmap pixmap = ImageUtil::loadSvg(dropIconFile(), QSize(ICON_SIZE, ICON_SIZE)); QRect rectOfPixmap(rect().x() + (rect().width() - ICON_SIZE) / 2, @@ -126,8 +115,6 @@ void ExpandIconWidget::paintEvent(QPaintEvent *event) ICON_SIZE, ICON_SIZE); painter.drawPixmap(rectOfPixmap, pixmap); - - gridView->setOwnerWidget(this); } const QString ExpandIconWidget::dropIconFile() const @@ -183,14 +170,17 @@ TrayGridWidget *ExpandIconWidget::popupTrayView() layout->addWidget(trayView); auto rowCountChanged = [ = ] { - int count = trayModel->rowCount(); - if (count > 0) - gridParentView->resetPosition(); - else if (gridParentView->isVisible()) - gridParentView->hide(); + if (gridParentView->isVisible()) { + int count = trayModel->rowCount(); + if (count > 0) + gridParentView->resetPosition(); + else + gridParentView->hide(); + } }; connect(trayModel, &TrayModel::rowCountChanged, gridParentView, rowCountChanged); + connect(trayModel, &TrayModel::requestRefreshEditor, trayView, &TrayGridView::onUpdateEditorView); connect(trayDelegate, &TrayDelegate::removeRow, trayView, [ = ](const QModelIndex &index) { trayView->model()->removeRow(index.row(),index.parent()); @@ -216,7 +206,7 @@ TrayGridWidget::TrayGridWidget(QWidget *parent) : QWidget (parent) , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) , m_trayGridView(nullptr) - , m_ownerWidget(nullptr) + , m_referGridView(nullptr) { setAttribute(Qt::WA_TranslucentBackground); } @@ -231,10 +221,9 @@ void TrayGridWidget::setTrayGridView(TrayGridView *trayView) m_trayGridView = trayView; } -void TrayGridWidget::setOwnerWidget(QWidget *widget) +void TrayGridWidget::setReferGridView(TrayGridView *trayView) { - // 设置所属的Widget,目的是为了计算当前窗体的具体位置 - m_ownerWidget = widget; + m_referGridView = trayView; } TrayGridView *TrayGridWidget::trayView() const @@ -245,20 +234,22 @@ TrayGridView *TrayGridWidget::trayView() const void TrayGridWidget::resetPosition() { // 如果没有设置所属窗体,则无法计算位置 - if (!m_ownerWidget || !m_ownerWidget->parentWidget()) + ExpandIconWidget *expWidget = expandWidget(); + if (!expWidget) return; - QWidget *topWidget = m_ownerWidget->topLevelWidget(); - QPoint ptPos = m_ownerWidget->parentWidget()->mapToGlobal(m_ownerWidget->pos()); + m_trayGridView->setFixedSize(m_trayGridView->suitableSize()); + setFixedSize(m_trayGridView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2)); + + QWidget *topWidget = expWidget->topLevelWidget(); + QPoint ptPos = expWidget->mapToGlobal(QPoint(0, 0)); switch (m_position) { case Dock::Position::Bottom: { - ptPos.setX(ptPos.x() - width()); ptPos.setY(topWidget->y() - height()); break; } case Dock::Position::Top: { ptPos.setY(topWidget->y() + topWidget->height()); - ptPos.setX(ptPos.x() - width()); break; } case Dock::Position::Left: { @@ -270,8 +261,6 @@ void TrayGridWidget::resetPosition() break; } } - m_trayGridView->setFixedSize(m_trayGridView->suitableSize()); - setFixedSize(m_trayGridView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2)); move(ptPos); } @@ -296,3 +285,22 @@ QColor TrayGridWidget::maskColor() const color.setAlpha(maskAlpha); return color; } + +ExpandIconWidget *TrayGridWidget::expandWidget() const +{ + if (!m_referGridView) + return nullptr; + + QAbstractItemModel *dataModel = m_referGridView->model(); + if (!dataModel) + return nullptr; + + for (int i = 0; i < dataModel->rowCount() - 1; i++) { + QModelIndex index = dataModel->index(i, 0); + ExpandIconWidget *widget = qobject_cast(m_referGridView->indexWidget(index)); + if (widget) + return widget; + } + + return nullptr; +} diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h index 8a178492b..0aa5f57eb 100644 --- a/frame/window/tray/widgets/expandiconwidget.h +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -67,7 +67,7 @@ public: static void setPosition(const Dock::Position &position); void setTrayGridView(TrayGridView *trayView); - void setOwnerWidget(QWidget *widget); + void setReferGridView(TrayGridView *trayView); TrayGridView *trayView() const; void resetPosition(); @@ -76,12 +76,13 @@ protected: private: QColor maskColor() const; + ExpandIconWidget *expandWidget() const; private: DockInter *m_dockInter; TrayGridView *m_trayGridView; + TrayGridView *m_referGridView; static Dock::Position m_position; - QWidget *m_ownerWidget; }; #endif // EXPANDICONWIDGET_H diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index a0b493246..bf7b12d2b 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -27,6 +27,7 @@ #include "quicksettingcontainer.h" #include "systempluginwindow.h" #include "datetimedisplayer.h" +#include "expandiconwidget.h" #include #include @@ -141,6 +142,9 @@ void TrayManagerWindow::setDisplayMode(Dock::DisplayMode displayMode) m_displayMode = displayMode; // 从时尚模式切换到高效模式的时候,需要重新布局 onTrayCountChanged(); + // 如果当前模式为高效模式,则设置当前的trayView为其计算位置的参照 + if (displayMode == Dock::DisplayMode::Fashion) + ExpandIconWidget::popupTrayView()->setReferGridView(m_trayView); } int TrayManagerWindow::appDatetimeSize(const Dock::Position &position) const @@ -223,18 +227,6 @@ void TrayManagerWindow::onTrayCountChanged() Q_EMIT requestUpdate(); } -void TrayManagerWindow::onRequestUpdateWidget(const QList &idxs) -{ - for (int i = 0; i < idxs.size(); i++) { - int idx = idxs[i]; - if (idx < m_model->rowCount()) { - QModelIndex index = m_model->index(idx); - m_trayView->closePersistentEditor(index); - m_trayView->openPersistentEditor(index); - } - } -} - void TrayManagerWindow::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); @@ -303,10 +295,12 @@ void TrayManagerWindow::initConnection() connect(m_trayView, &TrayGridView::dragLeaved, m_delegate, [ this ]{ Q_EMIT m_delegate->requestDrag(true); }); - connect(m_trayView, &TrayGridView::dragEntered, m_delegate, [ this ]{ + connect(m_trayView, &TrayGridView::dragFinished, this, [ this ] { + // 如果拖拽结束,则隐藏托盘 Q_EMIT m_delegate->requestDrag(false); }); - connect(m_model, &TrayModel::requestUpdateWidget, this, &TrayManagerWindow::onRequestUpdateWidget); + + connect(m_model, &TrayModel::rowCountChanged, m_trayView, &TrayGridView::onUpdateEditorView); connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &TrayManagerWindow::requestUpdate); m_trayView->installEventFilter(this); diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 4068e9a45..7631dc43a 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -86,7 +86,6 @@ private: private Q_SLOTS: void onTrayCountChanged(); - void onRequestUpdateWidget(const QList &idxs); private: QWidget *m_appPluginDatetimeWidget; From ad56764f49ae3ba0aef84eb854e977ab794dec29 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 10 Nov 2022 01:11:28 +0000 Subject: [PATCH 126/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=91=BD=E4=BB=A4=E6=97=A0=E6=B3=95=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调用QProcess::startDetached异步执行的时候,需要将命令和参数分隔,保证该命令正确执行 Log: 修复部分命令无法执行的问题 Influence: 任务栏关机命令观察是否正常执行 Task: https://pms.uniontech.com/task-view-213403.html Change-Id: I63d3a9629dce9becdfc4dcbe476b438070def5bf --- frame/item/components/multiquickitem.cpp | 9 ++++++--- frame/item/components/singlequickitem.cpp | 9 ++++++--- frame/window/systempluginwindow.cpp | 8 +++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/frame/item/components/multiquickitem.cpp b/frame/item/components/multiquickitem.cpp index cbc2950d5..0f79438a2 100644 --- a/frame/item/components/multiquickitem.cpp +++ b/frame/item/components/multiquickitem.cpp @@ -63,9 +63,12 @@ bool MultiQuickItem::eventFilter(QObject *obj, QEvent *event) Q_EMIT requestShowChildWidget(widget); } else if (obj == this) { - const QString &command = pluginItem()->itemCommand(itemKey()); - if (!command.isEmpty()) - QProcess::startDetached(command, QStringList()); + QStringList commandArgumend = pluginItem()->itemCommand(itemKey()).split(" "); + if (commandArgumend.size() > 0) { + QString command = commandArgumend.first(); + commandArgumend.removeFirst(); + QProcess::startDetached(command, commandArgumend); + } } } else if (event->type() == QEvent::Resize) { QLabel *labelWidget = qobject_cast(obj); diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp index 628f18386..83c8a4b82 100644 --- a/frame/item/components/singlequickitem.cpp +++ b/frame/item/components/singlequickitem.cpp @@ -48,9 +48,12 @@ QuickSettingItem::QuickSettingType SingleQuickItem::type() const void SingleQuickItem::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event); - const QString &command = pluginItem()->itemCommand(itemKey()); - if (!command.isEmpty()) - QProcess::startDetached(command, QStringList()); + QStringList commandArgument = pluginItem()->itemCommand(itemKey()).split(" "); + if (commandArgument.size() > 0) { + QString command = commandArgument.first(); + commandArgument.removeFirst(); + QProcess::startDetached(command, commandArgument); + } QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); if (itemWidget) diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 551e0e2bd..e01164ae2 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -376,9 +376,11 @@ void StretchPluginsItem::mouseReleaseEvent(QMouseEvent *e) void StretchPluginsItem::mouseClick() { - const QString command = m_pluginInter->itemCommand(m_itemKey); - if (!command.isEmpty()) { - QProcess::startDetached(command, QStringList()); + QStringList commandArgument = m_pluginInter->itemCommand(m_itemKey).split(" "); + if (commandArgument.size() > 0) { + QString command = commandArgument.first(); + commandArgument.removeFirst(); + QProcess::startDetached(command, commandArgument); return; } From 62c0802ae6ae433a5388b12ed19b8fbe0377d4fa Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 10 Nov 2022 12:58:59 +0000 Subject: [PATCH 127/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E4=B8=8B=E9=83=A8=E5=88=86=E6=89=98=E7=9B=98=E7=9A=84tooltips?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wayland下,将DockPopupWindow设置为Qt::FramelessWindowHint可以避免这个问题 Log: 修复wayland下托盘图标显示异常的问题 Influence: 进入wayland,打开音乐,鼠标放入到音乐图标上,观察是否正常显示提示消息 Bug: https://pms.uniontech.com/bug-view-157821.html Change-Id: I925e6403c7bea3352ef82220f04f8c3bc5a84e0e --- frame/window/tray/widgets/snitrayitemwidget.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frame/window/tray/widgets/snitrayitemwidget.cpp b/frame/window/tray/widgets/snitrayitemwidget.cpp index 820e8bedd..5fbea7b6a 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.cpp +++ b/frame/window/tray/widgets/snitrayitemwidget.cpp @@ -22,6 +22,7 @@ #include "snitrayitemwidget.h" #include "themeappicon.h" #include "tipswidget.h" +#include "utils.h" #include @@ -76,6 +77,8 @@ SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *par arrowRectangle->setArrowHeight(10); arrowRectangle->setObjectName("snitraypopup"); PopupWindow = arrowRectangle; + if (Utils::IS_WAYLAND_DISPLAY) + PopupWindow->setWindowFlags(PopupWindow->windowFlags() | Qt::FramelessWindowHint); connect(qApp, &QApplication::aboutToQuit, PopupWindow, &DockPopupWindow::deleteLater); } From 8a01a9342471e8ad3cbdde00c06bd74f11f8451e Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 11 Nov 2022 10:28:12 +0800 Subject: [PATCH 128/257] =?UTF-8?q?Revert=20"fix:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=8A=A0=E8=BD=BD=E8=80=81=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=8F=92=E4=BB=B6=E7=9A=84=E6=96=B9=E5=BC=8F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7658f813f69b96f8ba79b546208d0a7da3a27ff4. Change-Id: I7678bf40141d86e956111c57a85dfda7c19197f7 --- frame/util/abstractpluginscontroller.cpp | 11 +++-------- interfaces/pluginsiteminterface.h | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index 297fca71f..82e39a555 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -274,12 +274,9 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) pluginIsValid = false; } - PluginsItemInterface *interface = nullptr; - // 如果版本是2.0.0,则认为是最新的插件,此时需要转换成v23的插件接口 - if (pluginApi == "2.0.0") { - interface = qobject_cast(pluginLoader->instance()); - } else if (pluginApi < "2.0.0") { - // 如果版本号小于2.0.0的,就认为这个插件是v20的插件,将其转换为v20插件接口 + PluginsItemInterface *interface = qobject_cast(pluginLoader->instance()); + if (!interface) { + // 如果识别当前插件失败,就认为这个插件是v20的插件,将其转换为v20插件接口 PluginsItemInterface_V20 *interface_v20 = qobject_cast(pluginLoader->instance()); if (interface_v20) { // 将v20插件接口通过适配器转换成v23的接口,方便在后面识别 @@ -289,8 +286,6 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) m_pluginAdapterMap[(qulonglong)(interface_v20)] = pluginAdapter; interface = pluginAdapter; } - } else { - qWarning() << "the plugin is not valid " << pluginFile; } if (!interface) { diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index ab0a98450..0e148d599 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -287,7 +287,7 @@ protected: QT_BEGIN_NAMESPACE -#define ModuleInterface_iid "com.deepin.dock.PluginsItemInterface" +#define ModuleInterface_iid "com.deepin.dock.PluginsItemInterface_2_0_0" Q_DECLARE_INTERFACE(PluginsItemInterface, ModuleInterface_iid) QT_END_NAMESPACE From 305f1ba8fb3d377e28cf40d7e02d5dffbbf215c1 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 14 Nov 2022 02:37:20 +0000 Subject: [PATCH 129/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=B7=B2?= =?UTF-8?q?=E6=89=93=E5=BC=80=E5=BA=94=E7=94=A8=E7=BC=A9=E7=95=A5=E5=9B=BE?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=BD=8D=E7=BD=AE=E5=81=8F=E5=B7=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原来的逻辑中将显示位置进行了偏移导致显示位置与实际位置有偏差,将偏移相关部分移除即可 Log: 修复应用打开窗口预览图显示错误 Influence: 鼠标放入到已经打开的应用的上方,观察预览图的位置显示是否正常 Bug: https://pms.uniontech.com/bug-view-165775.html Change-Id: I14fbd7cfd7dc54f76371f1bdfe49cc651ac85d97 --- frame/item/components/appsnapshot.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/frame/item/components/appsnapshot.cpp b/frame/item/components/appsnapshot.cpp index 25b6f01fc..2c08509b9 100644 --- a/frame/item/components/appsnapshot.cpp +++ b/frame/item/components/appsnapshot.cpp @@ -305,14 +305,10 @@ void AppSnapshot::paintEvent(QPaintEvent *e) painter.drawRoundedRect(rect(), 5, 5); } - const qreal offset_x = width() / 2.0 - SNAP_WIDTH / ratio / 2; - const qreal offset_y = height() / 2.0 - SNAP_HEIGHT / ratio / 2; - DStyleHelper dstyle(style()); const int radius = dstyle.pixelMetric(DStyle::PM_FrameRadius); painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - painter.translate(QPoint(offset_x * ratio, offset_y * ratio)); QRect imageRect(8, 8, width() - 16, height() - 16); painter.setPen(Qt::NoPen); QPainterPath path; From 1bf372f2d04b76af3954bcca99036c60040cb399 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 16 Nov 2022 05:36:56 +0000 Subject: [PATCH 130/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E6=8F=92=E4=BB=B6=E5=8C=BA=E5=9F=9F=E5=86=8D=E5=8D=95?= =?UTF-8?q?=E5=87=BB=E5=BC=B9=E5=87=BA=E8=8F=9C=E5=8D=95=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在插件区域右键弹出菜单后,无需将事件传给基类,因此不会再触发主窗口的菜单的弹出操作 Log: 修复插件区域交互的问题 Influence: 右键插件区域,再左键,观察插件区域菜单是否正常显示 Bug: https://pms.uniontech.com/bug-view-171559.html Change-Id: I6fd4c974c10b89e4921c15e8bf0bb8aecef3eeca --- frame/window/quickpluginwindow.cpp | 59 +++++++++++++++--------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index ee3a12331..f7fd313e7 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -179,20 +179,26 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) { switch (event->type()) { case QEvent::MouseButtonPress: { + QMouseEvent *mouseEvent = static_cast(event); + if (mouseEvent->button() != Qt::LeftButton) + break; + QuickDockItem *dockItem = qobject_cast(watched); if (!dockItem) break; - QMouseEvent *mouseEvent = static_cast(event); m_dragInfo->dockItem = dockItem; m_dragInfo->dragPoint = mouseEvent->pos(); break; } case QEvent::MouseButtonRelease: { + QMouseEvent *mouseEvent = static_cast(event); + if (mouseEvent->button() != Qt::LeftButton) + break; + if (m_dragInfo->isNull()) break; - QMouseEvent *mouseEvent = static_cast(event); if (!m_dragInfo->canDrag(mouseEvent->pos())) { // 弹出快捷设置面板 DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); @@ -541,38 +547,33 @@ void QuickDockItem::paintEvent(QPaintEvent *event) void QuickDockItem::mousePressEvent(QMouseEvent *event) { - switch (event->button()) { - case Qt::RightButton: { - if (m_contextMenu->actions().isEmpty()) { - const QString menuJson = m_pluginItem->itemContextMenu(m_itemKey); - if (menuJson.isEmpty()) - return; + if (event->button() != Qt::RightButton) + return QWidget::mousePressEvent(event); - QJsonDocument jsonDocument = QJsonDocument::fromJson(menuJson.toLocal8Bit().data()); - if (jsonDocument.isNull()) - return; + if (m_contextMenu->actions().isEmpty()) { + const QString menuJson = m_pluginItem->itemContextMenu(m_itemKey); + if (menuJson.isEmpty()) + return; - QJsonObject jsonMenu = jsonDocument.object(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(menuJson.toLocal8Bit().data()); + if (jsonDocument.isNull()) + return; - QJsonArray jsonMenuItems = jsonMenu.value("items").toArray(); - for (auto item : jsonMenuItems) { - QJsonObject itemObj = item.toObject(); - QAction *action = new QAction(itemObj.value("itemText").toString()); - action->setCheckable(itemObj.value("isCheckable").toBool()); - action->setChecked(itemObj.value("checked").toBool()); - action->setData(itemObj.value("itemId").toString()); - action->setEnabled(itemObj.value("isActive").toBool()); - m_contextMenu->addAction(action); - } + QJsonObject jsonMenu = jsonDocument.object(); + + QJsonArray jsonMenuItems = jsonMenu.value("items").toArray(); + for (auto item : jsonMenuItems) { + QJsonObject itemObj = item.toObject(); + QAction *action = new QAction(itemObj.value("itemText").toString()); + action->setCheckable(itemObj.value("isCheckable").toBool()); + action->setChecked(itemObj.value("checked").toBool()); + action->setData(itemObj.value("itemId").toString()); + action->setEnabled(itemObj.value("isActive").toBool()); + m_contextMenu->addAction(action); } + } - m_contextMenu->exec(QCursor::pos()); - break; - } - default: - break; - } - QWidget::mousePressEvent(event); + m_contextMenu->exec(QCursor::pos()); } void QuickDockItem::enterEvent(QEvent *event) From 9aa23d8960870bf7b2a4abfa1e6e3b161789f8e5 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 16 Nov 2022 06:22:51 +0000 Subject: [PATCH 131/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=8F=B3=E9=94=AE=E8=8F=9C=E5=8D=95=E4=B8=8D=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加插件区域右键菜单的信号的响应函数 Log: 修复插件区域菜单失效的问题 Influence: 右键菜单区域,点击某个菜单项,观察是否正常响应 Bug: https://pms.uniontech.com/bug-view-164381.html Change-Id: I4e0044e2f629ff0e2a1a23dc157915175b34b144 --- frame/window/quickpluginwindow.cpp | 6 ++++++ frame/window/quickpluginwindow.h | 3 +++ 2 files changed, 9 insertions(+) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index f7fd313e7..812e0cf13 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -511,6 +511,7 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject m_popupWindow->setWindowFlags(flags); } + connect(m_contextMenu, &QMenu::triggered, this, &QuickDockItem::onMenuActionClicked); connect(qApp, &QApplication::aboutToQuit, m_popupWindow, &DockPopupWindow::deleteLater); } @@ -675,3 +676,8 @@ QPoint QuickDockItem::popupMarkPoint() const } return p; } + +void QuickDockItem::onMenuActionClicked(QAction *action) +{ + m_pluginItem->invokedMenuItem(m_itemKey, action->data().toString(), true); +} diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index b8133cd3d..9d07fac8b 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -111,6 +111,9 @@ private: QPoint topleftPoint() const; QPoint popupMarkPoint() const; +private Q_SLOTS: + void onMenuActionClicked(QAction *action); + private: PluginsItemInterface *m_pluginItem; QJsonObject m_metaData; From ea75c2e00d46b80dbc411ca6559a8c66c3fc0f2e Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 16 Nov 2022 06:42:46 +0000 Subject: [PATCH 132/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E7=82=B9=E5=87=BB=E6=97=B6=E9=97=B4=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=B4=A9=E6=BA=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit path和interface参数和顺序错误引起崩溃 Log: 修复任务栏时间设置崩溃的问题 Influence: 任务栏右键时间区域,打开时间设置,观察是否正常打开控制中心的时间设置 Bug: https://pms.uniontech.com/bug-view-171511.html Change-Id: If91629dcb45c2663d2bcf9a29adffcbf6ac20043 --- frame/window/components/datetimedisplayer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index 48da1df2c..aa6f2310b 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -356,8 +356,8 @@ void DateTimeDisplayer::createMenuItem() connect(timeSettingAction, &QAction::triggered, this, [ = ] { DDBusSender() .service(controllCenterService) - .interface(controllCenterPath) - .path(controllCenterInterface) + .path(controllCenterPath) + .interface(controllCenterInterface) .method(QString("ShowPage")) .arg(QString("datetime")) .call(); From b3172ccc96c254ebf15d19018887d475fd96fe36 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 17 Nov 2022 16:08:24 +0800 Subject: [PATCH 133/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8B=96?= =?UTF-8?q?=E5=8A=A8=E6=97=A0=E6=89=93=E5=BC=80=E7=AA=97=E5=8F=A3=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=88=86=E5=B1=8F=E5=90=8E=E8=87=AA=E5=8A=A8=E6=89=93?= =?UTF-8?q?=E5=BC=80=E5=BA=94=E7=94=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原来的逻辑为在应用没有打开窗口的时候,需要自动打开一个窗口然后来触发分屏的操作; 根据和产品详细讨论,现该逻辑改为:在应用没有打开窗口的时候,无需触发分屏 Log: Influence: 从任务栏拖动一个没有打开窗口的应用,观察是否打开应用(正常情况下不会打开应用),释放鼠标,观察应用图标是否回到任务栏上 Bug: https://pms.uniontech.com/bug-view-154349.html Change-Id: I6d07097a85912caf15ce63952d6b84225b3aeaad --- frame/item/components/appdragwidget.cpp | 45 +------- frame/screenspliter/screenspliter_wayland.cpp | 103 +++--------------- frame/screenspliter/screenspliter_wayland.h | 10 +- frame/screenspliter/screenspliter_xcb.cpp | 98 ++++------------- frame/screenspliter/screenspliter_xcb.h | 10 +- 5 files changed, 40 insertions(+), 226 deletions(-) diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index f98a5f9ed..7f1cff367 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -451,51 +451,8 @@ void AppDragWidget::initWaylandEnv() return; // 由于在wayland环境下无法触发drop事件,导致鼠标无法释放,所以这里暂时用XEventMonitor的方式(具体原因待查) - Dock::Position position = qApp->property(PROP_POSITION).value(); XEventMonitor *extralEventInter = new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus()); - QList extralRectList; - QList screens = DisplayManager::instance()->screens(); - for (QScreen *screen : screens) { - MonitRect monitorRect; - QRect screenRect = screen->geometry(); - screenRect.setSize(screenRect.size() * screen->devicePixelRatio()); - - switch (position) { - case Top: { - monitorRect.x1 = screenRect.x(); - monitorRect.y1 = screenRect.y(); - monitorRect.x2 = screenRect.x() + screenRect.width(); - monitorRect.y2 = screenRect.y(); - } - break; - case Bottom: { - monitorRect.x1 = screenRect.x(); - monitorRect.y1 = screenRect.y() + screenRect.height(); - monitorRect.x2 = screenRect.x() + screenRect.width(); - monitorRect.y2 = screenRect.y() + screenRect.height(); - } - break; - case Left: { - monitorRect.x1 = screenRect.x(); - monitorRect.y1 = screenRect.y(); - monitorRect.x2 = screenRect.x(); - monitorRect.y2 = screenRect.y() + screenRect.height(); - } - break; - case Right: { - monitorRect.x1 = screenRect.x() + screenRect.width(); - monitorRect.y1 = screenRect.y(); - monitorRect.x2 = screenRect.x() + screenRect.width(); - monitorRect.y2 = screenRect.y() + screenRect.height(); - } - break; - } - - if (!extralRectList.contains(monitorRect)) - extralRectList << monitorRect; - } - - QString key = extralEventInter->RegisterAreas(extralRectList, 1 << 1); + QString key = extralEventInter->RegisterFullScreen(); connect(this, &AppDragWidget::destroyed, this, [ key, extralEventInter ] { extralEventInter->UnregisterArea(key); delete extralEventInter; diff --git a/frame/screenspliter/screenspliter_wayland.cpp b/frame/screenspliter/screenspliter_wayland.cpp index 98341ab68..955a698cf 100644 --- a/frame/screenspliter/screenspliter_wayland.cpp +++ b/frame/screenspliter/screenspliter_wayland.cpp @@ -48,12 +48,9 @@ SplitWindowManager *ScreenSpliter_Wayland::m_splitManager = nullptr; */ ScreenSpliter_Wayland::ScreenSpliter_Wayland(AppItem *appItem, DockEntryInter *entryInter, QObject *parent) : ScreenSpliter(appItem, entryInter, parent) - , m_checkedNotSupport(false) { if (!m_splitManager) m_splitManager = new SplitWindowManager; - - connect(m_splitManager, &SplitWindowManager::splitStateChange, this, &ScreenSpliter_Wayland::onSplitStateChange); } ScreenSpliter_Wayland::~ScreenSpliter_Wayland() @@ -62,12 +59,8 @@ ScreenSpliter_Wayland::~ScreenSpliter_Wayland() void ScreenSpliter_Wayland::startSplit(const QRect &rect) { - if (entryInter()->windowInfos().size() == 0) { - // 如果默认打开的子窗口的数量为0,则无需操作,同时记录标记,在打开新的窗口的时候,设置遮罩 - m_splitRect = rect; - entryInter()->Activate(QX11Info::getTimestamp()); + if (!suportSplitScreen()) return; - } setMaskVisible(rect, true); } @@ -92,84 +85,32 @@ void ScreenSpliter_Wayland::setMaskVisible(const QRect &rect, bool visible) bool ScreenSpliter_Wayland::split(SplitDirection direction) { setMaskVisible(QRect(), false); - const QString windowUuid = splitUuid(); - if (windowUuid.isEmpty()) - return false; + // 如果当前不支持分屏,则返回false + if (!suportSplitScreen()) + return false; + + WindowInfoMap windowInfos = entryInter()->windowInfos(); + m_splitManager->requestSplitWindow(windowInfos.first().uuid.toStdString().c_str(), direction); - std::string sUuid = windowUuid.toStdString(); - const char *uuid = sUuid.c_str(); - m_splitManager->requestSplitWindow(uuid, direction); return true; } -QString ScreenSpliter_Wayland::splitUuid() const -{ -#ifdef USE_AM - WindowInfoMap windowsInfo = entryInter()->windowInfos(); - if (windowsInfo.isEmpty()) - return QString(); - - const QString uuid = windowsInfo.values()[0].uuid; - if (windowSupportSplit(uuid)) - return uuid; - -#endif - return QString(); -} - bool ScreenSpliter_Wayland::windowSupportSplit(const QString &uuid) const { return m_splitManager->canSplit(uuid); } -QString ScreenSpliter_Wayland::firstWindowUuid() const -{ -#ifdef USE_AM - WindowInfoMap winInfos = entryInter()->windowInfos(); - if (winInfos.size() == 0) - return QString(); - - return winInfos.begin().value().uuid; -#else - return QString(); -#endif -} - -void ScreenSpliter_Wayland::onSplitStateChange(const char *uuid, int splitable) -{ -#ifdef USE_AM - const QString windowUuid = firstWindowUuid(); - qDebug() << "Split State Changed, window uuid:" << windowUuid << "split uuid:" << uuid << "split value:" << splitable; - if (QString(uuid) != windowUuid) - return; - - if (m_splitRect.isEmpty()) - return; - - if (splitable > 0) { - setMaskVisible(m_splitRect, true); - } else { - // 如果不支持二分屏,则退出当前的窗体,且标记当前不支持二分屏,下次打开的时候不再进行打开窗口来检测 - entryInter()->ForceQuit(); - m_checkedNotSupport = true; - } - m_splitRect = QRect(0, 0, 0, 0); -#endif -} - bool ScreenSpliter_Wayland::suportSplitScreen() { - // 如果之前检测过是否不支持分屏(m_checkedNotSupport默认为false,如果不支持分屏,m_checkedNotSupport就会变为true),则直接返回不支持分屏 - if (m_checkedNotSupport) - return false; + // 判断所有打开的窗口列表,只要有一个窗口支持分屏,就认为它支持分屏 + const WindowInfoMap &windowsInfo = entryInter()->windowInfos(); + for (const WindowInfo &windowInfo : windowsInfo) { + if (windowSupportSplit(windowInfo.uuid)) + return true; + } - // 如果存在未打开的窗口,就默认让其认为支持,后续会根据这个来打开一个新的窗口 - if (entryInter()->windowInfos().size() == 0) - return true; - - // 如果存在已经打开的窗口 - m_checkedNotSupport = splitUuid().isEmpty(); - return (!m_checkedNotSupport); + // 如果所有的窗口都不支持分屏,就认为它不支持分屏,包括没有打开窗口的情况 + return false; } bool ScreenSpliter_Wayland::releaseSplit() @@ -201,17 +142,10 @@ SplitWindowManager::~SplitWindowManager() bool SplitWindowManager::canSplit(const QString &uuid) const { - if (!m_clientManagement) - return false; - - const QVector &clientWindowStates = m_clientManagement->getWindowStates(); - qInfo() << "client window states count:" << clientWindowStates.size(); - for (ClientManagement::WindowState windowState : clientWindowStates) { - qDebug() << "window uuid:" << uuid << "window state uuid:" << windowState.uuid - << "active:" << windowState.isActive << "resource name:" << windowState.resourceName; - if (windowState.splitable > 0 && QString(windowState.uuid) == uuid) + const QVector &windowStates = m_clientManagement->getWindowStates(); + for (const ClientManagement::WindowState &winState : windowStates) + if (winState.uuid == uuid && winState.splitable > 0) return true; - }; return false; } @@ -245,7 +179,6 @@ void SplitWindowManager::onConnectionFinished() Registry *registry = new Registry(this); connect(registry, &Registry::clientManagementAnnounced, this, [ this, registry ](quint32 name, quint32 version) { m_clientManagement = registry->createClientManagement(name, version, this); - connect(m_clientManagement, &ClientManagement::splitStateChange, this, &SplitWindowManager::splitStateChange); }); registry->setEventQueue(eventQueue); registry->create(m_connectionThreadObject); diff --git a/frame/screenspliter/screenspliter_wayland.h b/frame/screenspliter/screenspliter_wayland.h index 28e995b74..cbf57e17f 100644 --- a/frame/screenspliter/screenspliter_wayland.h +++ b/frame/screenspliter/screenspliter_wayland.h @@ -63,17 +63,11 @@ public: private: void setMaskVisible(const QRect &rect, bool visible); - QString splitUuid() const; bool windowSupportSplit(const QString &uuid) const; - QString firstWindowUuid() const; - -private Q_SLOTS: - void onSplitStateChange(const char* uuid, int splitable); private: static SplitWindowManager *m_splitManager; QRect m_splitRect; - bool m_checkedNotSupport; }; class SplitWindowManager : public QObject @@ -89,9 +83,6 @@ protected: bool canSplit(const QString &uuid) const; void requestSplitWindow(const char *uuid, const ScreenSpliter::SplitDirection &direction); -Q_SIGNALS: - void splitStateChange(const char *, int); - private Q_SLOTS: void onConnectionFinished(); @@ -99,6 +90,7 @@ private: ClientManagement *m_clientManagement; QThread *m_connectionThread; ConnectionThread *m_connectionThreadObject; + QMap m_splitWindowState; }; #endif // SCREENSPLITER_WAYLAND_H diff --git a/frame/screenspliter/screenspliter_xcb.cpp b/frame/screenspliter/screenspliter_xcb.cpp index 9b6ebf6d7..2d08491b1 100644 --- a/frame/screenspliter/screenspliter_xcb.cpp +++ b/frame/screenspliter/screenspliter_xcb.cpp @@ -78,49 +78,35 @@ static QByteArray windowProperty(quint32 WId, xcb_atom_t propAtom, xcb_atom_t ty ScreenSpliter_Xcb::ScreenSpliter_Xcb(AppItem *appItem, DockEntryInter *entryInter, QObject *parent) : ScreenSpliter(appItem, entryInter, parent) - , m_isSplitCreateWindow(false) { - connect(entryInter, &DockEntryInter::WindowInfosChanged, - this, &ScreenSpliter_Xcb::onUpdateWindowInfo, Qt::QueuedConnection); } void ScreenSpliter_Xcb::startSplit(const QRect &rect) { - if (!openWindow()) { - m_effectRect = rect; + if (!suportSplitScreen()) return; - } + showSplitScreenEffect(rect, true); } bool ScreenSpliter_Xcb::split(ScreenSpliter::SplitDirection direction) { - if (!openWindow()) + if (!suportSplitScreen()) return false; - // 如果当前的应用不支持分屏,也无需分屏,检查分屏的时候至少需要一个窗口,因此这里写在打开窗口之后 - quint32 WId = splittingWindowWId(); - if (WId == 0) { - // 如果当前存在主动打开的窗口,那么就关闭当前主动打开的窗口 - if (m_isSplitCreateWindow) { - entryInter()->ForceQuit(); - m_isSplitCreateWindow = false; - } - return false; - } - + quint32 WId = entryInter()->windowInfos().keys().first(); xcb_client_message_event_t xev; - xev.response_type = XCB_CLIENT_MESSAGE; xev.type = internAtom("_DEEPIN_SPLIT_WINDOW", false); xev.window = WId; xev.format = 32; - xev.data.data32[0] = direction_x11(direction); // 1: 左分屏 2: 右分屏 5 左上 6 右上 9 左下 10 右下 15: 全屏 - xev.data.data32[1] = 1; // 1 进入预览 0 不进入预览 + xev.data.data32[0] = direction_x11(direction); // 1: 左分屏 2: 右分屏 5 左上 6 右上 9 左下 10 右下 15: 全屏 + xev.data.data32[1] = 1; // 1 进入预览 0 不进入预览 xcb_send_event(QX11Info::connection(), false, QX11Info::appRootWindow(QX11Info::appScreen()), SubstructureNotifyMask, (const char *)&xev); xcb_flush(QX11Info::connection()); + return true; } @@ -140,31 +126,14 @@ uint32_t ScreenSpliter_Xcb::direction_x11(ScreenSpliter::SplitDirection directio return directionMapping.value(direction, SPLITUNKNOW); } -bool ScreenSpliter_Xcb::openWindow() -{ - // 查看当前应用是否有打开的窗口,如果没有,则先打开一个窗口 - const WindowInfoMap windowlist = entryInter()->windowInfos(); - if (!windowlist.isEmpty()) - return true; - - if (!m_isSplitCreateWindow) { - // 如果当前没有打开窗口,且未执行打开操作 - entryInter()->Activate(QX11Info::getTimestamp()); - m_isSplitCreateWindow = true; - } - - return false; -} - void ScreenSpliter_Xcb::showSplitScreenEffect(const QRect &rect, bool visible) { - quint32 WId = splittingWindowWId(); - if (WId == 0) + if (!suportSplitScreen()) return; + quint32 WId = entryInter()->windowInfos().keys().first(); // 触发分屏的效果 xcb_client_message_event_t xev; - xev.response_type = XCB_CLIENT_MESSAGE; xev.type = internAtom("_DEEPIN_SPLIT_OUTLINE", false); xev.window = WId; @@ -180,61 +149,32 @@ void ScreenSpliter_Xcb::showSplitScreenEffect(const QRect &rect, bool visible) xcb_flush(QX11Info::connection()); } -void ScreenSpliter_Xcb::onUpdateWindowInfo(const WindowInfoMap &info) -{ - // 如果打开的是第一个窗口,且这个打开的窗口是通过拖动二分屏的方式打开,且当前是结束拖拽 - // 并且不支持分屏那么这个窗口就需要关闭 - if (!appItem()->isDragging()) { - releaseSplit(); - } else if (!m_effectRect.isEmpty() && info.size() > 0) { - // 只有当需要触发分屏效果的时候,发现当前没有窗口,则记录当前分屏的区域,保存在m_effectRect中 - // 在新增窗口的时候,如果返现m_effectRect有值,则重新触发分屏,并且清空m_effectRect,防止再次打开窗口的时候再次触发分屏效果 - showSplitScreenEffect(m_effectRect, true); - m_effectRect.setRect(0, 0, 0, 0); - } -} - bool ScreenSpliter_Xcb::suportSplitScreen() { - // 如果当前的窗口的数量为0,则不知道它是否支持分屏,则始终让其返回true,然后打开窗口,因为窗口打开后, - // 要过一段事件才能收到信号,等收到信号后才知道它是否支持分屏,在窗口显示后会根据当前是否请求过执行分屏操作 - // 来决定是否执行分屏的操作 - if (entryInter()->windowInfos().size() == 0) - return true; + // 判断所有的窗口,只要有一个窗口支持分屏,就认为它支持分屏 + QList winIds = entryInter()->windowInfos().keys(); + for (const quint32 &winId : winIds) { + if (windowSupportSplit(winId)) + return true; + } - return (splittingWindowWId() != 0); + return false; } bool ScreenSpliter_Xcb::releaseSplit() { showSplitScreenEffect(QRect(), false); - if (!m_isSplitCreateWindow) - return false; - - if (!entryInter()->windowInfos().isEmpty() && splittingWindowWId() == 0) { - // 释放后,如果当前的窗口是通过验证是否支持二分屏的方式来新建的窗口(m_isSplitCreateWindow == true) - // 并且存在打开的窗口(也有可能不存在打开的窗口,打开的窗口最后才出来,时机上不好控制,所以这种情况 - // 在updateWindowInfos函数里面做了处理),并且打开的窗口不支持二分屏,则此时关闭新打开的窗口 - entryInter()->ForceQuit(); - } - - m_isSplitCreateWindow = false; return true; } -quint32 ScreenSpliter_Xcb::splittingWindowWId() +bool ScreenSpliter_Xcb::windowSupportSplit(quint32 winId) { - WindowInfoMap windowsInfo = entryInter()->windowInfos(); - if (windowsInfo.size() == 0) - return 0; - - quint32 WId = windowsInfo.keys().first(); xcb_atom_t propAtom = internAtom("_DEEPIN_NET_SUPPORTED", true); - QByteArray data = windowProperty(WId, propAtom, XCB_ATOM_CARDINAL, 4); + QByteArray data = windowProperty(winId, propAtom, XCB_ATOM_CARDINAL, 4); bool supported = false; if (const char *cdata = data.constData()) supported = *(reinterpret_cast(cdata)); - return supported ? WId : 0; + return supported; } diff --git a/frame/screenspliter/screenspliter_xcb.h b/frame/screenspliter/screenspliter_xcb.h index b8ac69a8b..f136e1346 100644 --- a/frame/screenspliter/screenspliter_xcb.h +++ b/frame/screenspliter/screenspliter_xcb.h @@ -39,17 +39,9 @@ public: bool releaseSplit() override; private: - quint32 splittingWindowWId(); uint32_t direction_x11(ScreenSpliter::SplitDirection direction); void showSplitScreenEffect(const QRect &rect, bool visible); - bool openWindow(); - -private Q_SLOTS: - void onUpdateWindowInfo(const WindowInfoMap &info); - -private: - bool m_isSplitCreateWindow; - QRect m_effectRect; + bool windowSupportSplit(quint32 winId); }; #endif // SCREENSPLITER_XCB_H From a406ebb68a0056929822eaeb6a2bd66da58bf896 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 16 Nov 2022 12:10:29 +0000 Subject: [PATCH 134/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E4=B8=8B=E6=89=93=E5=BC=80=E5=BF=AB=E6=8D=B7=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?tooltip=E6=B2=A1=E6=9C=89=E9=9A=90=E8=97=8F=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在打开快捷面板的时候,依次调用任务栏的插件图标的隐藏toolTip的功能将其隐藏 Log: Influence: 进入wayland,鼠标放在任务栏的插件上,点击应用弹出快捷面板,观察toolTip是否消失 Bug: https://pms.uniontech.com/bug-view-171551.html Change-Id: Iac6a7c1d55787a73d0f91952c7ca0585f41fd23a --- frame/window/quickpluginwindow.cpp | 19 +++++++++++++++++++ frame/window/quickpluginwindow.h | 1 + 2 files changed, 20 insertions(+) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 812e0cf13..16e85f5b9 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -202,6 +202,20 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) if (!m_dragInfo->canDrag(mouseEvent->pos())) { // 弹出快捷设置面板 DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); + if (Utils::IS_WAYLAND_DISPLAY) { + // TODO: 临时解决方案,如果是wayland环境,toolTip没有消失,因此,此处直接调用接口来隐藏 + for (int i = m_mainLayout->count() - 1; i >= 0; i--) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); + if (!dockItem) + continue; + + dockItem->hideToolTip(); + } + } popWindow->show(popupPoint()); } m_dragInfo->reset(); @@ -533,6 +547,11 @@ bool QuickDockItem::isPrimary() const return false; } +void QuickDockItem::hideToolTip() +{ + m_popupWindow->hide(); +} + void QuickDockItem::paintEvent(QPaintEvent *event) { if (!m_pluginItem) diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 9d07fac8b..b36eb08a8 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -98,6 +98,7 @@ public: void setPositon(Dock::Position position); PluginsItemInterface *pluginItem(); bool isPrimary() const; + void hideToolTip(); protected: void paintEvent(QPaintEvent *event) override; From ac9de7ef51ae3ba1dd386b493d6944fd87a58df6 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 17 Nov 2022 10:49:48 +0800 Subject: [PATCH 135/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E5=BF=AB=E6=8D=B7=E9=9D=A2=E6=9D=BF=E4=B9=8B=E5=A4=96?= =?UTF-8?q?=E7=9A=84=E5=8C=BA=E5=9F=9F=E5=BF=AB=E6=8D=B7=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E4=B8=8D=E5=85=B3=E9=97=AD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将DockPopupWindow中的DRegionMonitor换成XEventMonitor,监控它的鼠标点击和释放鼠标的事件 Log: Influence: 进入wayland,打开快捷面板,点击快捷面板之外的其他区域,观察快捷面板是否关闭 Bug: https://pms.uniontech.com/bug-view-171545.html Bug: https://pms.uniontech.com/bug-view-171583.html Change-Id: I5dda27170316132812c546d8c362d3dc4546e35a --- frame/util/dockpopupwindow.cpp | 65 +++++++++++++++--------------- frame/util/dockpopupwindow.h | 9 ++++- frame/window/quickpluginwindow.cpp | 2 +- 3 files changed, 40 insertions(+), 36 deletions(-) diff --git a/frame/util/dockpopupwindow.cpp b/frame/util/dockpopupwindow.cpp index b6235ff93..4db253601 100644 --- a/frame/util/dockpopupwindow.cpp +++ b/frame/util/dockpopupwindow.cpp @@ -22,6 +22,7 @@ #include "dockpopupwindow.h" #include "imageutil.h" #include "utils.h" +#include "dbusutil.h" #include #include @@ -34,10 +35,10 @@ DWIDGET_USE_NAMESPACE DockPopupWindow::DockPopupWindow(QWidget *parent) - : DArrowRectangle(ArrowBottom, parent), - m_model(false), - m_regionInter(new DRegionMonitor(this)), - m_enableMouseRelease(true) + : DArrowRectangle(ArrowBottom, parent) + , m_model(false) + , m_eventMonitor(new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus(), this)) + , m_enableMouseRelease(true) { setMargin(0); m_wmHelper = DWindowManagerHelper::instance(); @@ -53,7 +54,10 @@ DockPopupWindow::DockPopupWindow(QWidget *parent) } connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, this, &DockPopupWindow::compositeChanged); - connect(m_regionInter, &DRegionMonitor::buttonRelease, this, &DockPopupWindow::onGlobMouseRelease); + connect(m_eventMonitor, &XEventMonitor::ButtonPress, this, &DockPopupWindow::onButtonPress); + + if (Utils::IS_WAYLAND_DISPLAY) + QDBusConnection::sessionBus().connect("com.deepin.dde.lockFront", "/com/deepin/dde/lockFront", "com.deepin.dde.lockFront", "Visible", "b", this, SLOT(hide())); } DockPopupWindow::~DockPopupWindow() @@ -88,13 +92,15 @@ void DockPopupWindow::show(const QPoint &pos, const bool model) show(pos.x(), pos.y()); - if (m_regionInter->registered()) { - m_regionInter->unregisterRegion(); + if (!m_eventKey.isEmpty()) { + m_eventMonitor->UnregisterArea(m_eventKey); + m_eventKey.clear(); } if (m_model) { - m_regionInter->registerRegion(); + m_eventKey = m_eventMonitor->RegisterFullScreen(); } + blockButtonRelease(); } @@ -117,8 +123,10 @@ void DockPopupWindow::blockButtonRelease() void DockPopupWindow::hide() { - if (m_regionInter->registered()) - m_regionInter->unregisterRegion(); + if (!m_eventKey.isEmpty()) { + m_eventMonitor->UnregisterArea(m_eventKey); + m_eventKey.clear(); + } DArrowRectangle::hide(); } @@ -149,8 +157,7 @@ bool DockPopupWindow::eventFilter(QObject *o, QEvent *e) return false; // FIXME: ensure position move after global mouse release event - if (isVisible()) - { + if (isVisible()) { QTimer::singleShot(10, this, [=] { // NOTE(sbw): double check is necessary, in this time, the popup maybe already hided. if (isVisible()) @@ -161,27 +168,6 @@ bool DockPopupWindow::eventFilter(QObject *o, QEvent *e) return false; } -void DockPopupWindow::onGlobMouseRelease(const QPoint &mousePos, const int flag) -{ - Q_ASSERT(m_model); - - if (!m_enableMouseRelease) - return; - - if (!((flag == DRegionMonitor::WatchedFlags::Button_Left) || - (flag == DRegionMonitor::WatchedFlags::Button_Right))) { - return; - } - - const QRect rect = QRect(pos(), size()); - if (rect.contains(mousePos)) - return; - - emit accept(); - - m_regionInter->unregisterRegion(); -} - void DockPopupWindow::compositeChanged() { if (m_wmHelper->hasComposite()) @@ -195,3 +181,16 @@ void DockPopupWindow::ensureRaised() if (isVisible()) raise(); } + +void DockPopupWindow::onButtonPress(int type, int x, int y, const QString &key) +{ + if (!m_enableMouseRelease) + return; + + QRect popupRect(pos(), size()); + if (popupRect.contains(x, y)) + return; + + emit accept(); + hide(); +} diff --git a/frame/util/dockpopupwindow.h b/frame/util/dockpopupwindow.h index ca63f505e..81b1af7a1 100644 --- a/frame/util/dockpopupwindow.h +++ b/frame/util/dockpopupwindow.h @@ -22,6 +22,8 @@ #ifndef DOCKPOPUPWINDOW_H #define DOCKPOPUPWINDOW_H +#include "org_deepin_api_xeventmonitor.h" + #include #include #include @@ -29,6 +31,8 @@ DWIDGET_USE_NAMESPACE DGUI_USE_NAMESPACE +using XEventMonitor = ::org::deepin::api::XEventMonitor1; + class DockPopupWindow : public Dtk::Widget::DArrowRectangle { Q_OBJECT @@ -61,15 +65,16 @@ protected: void blockButtonRelease(); private slots: - void onGlobMouseRelease(const QPoint &mousePos, const int flag); void compositeChanged(); void ensureRaised(); + void onButtonPress(int type, int x, int y, const QString &key); private: bool m_model; QPoint m_lastPoint; - DRegionMonitor *m_regionInter; + XEventMonitor *m_eventMonitor; + QString m_eventKey; DWindowManagerHelper *m_wmHelper; bool m_enableMouseRelease; }; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 16e85f5b9..1f671c53e 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -216,7 +216,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) dockItem->hideToolTip(); } } - popWindow->show(popupPoint()); + popWindow->show(popupPoint(), true); } m_dragInfo->reset(); break; From 47f858178820d53dd6f32b664dacc7f4f554d0ad Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 16 Nov 2022 13:48:41 +0000 Subject: [PATCH 136/257] =?UTF-8?q?fix:=20=E5=8E=BB=E6=8E=89=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8F=92=E4=BB=B6=E7=9A=84=E5=8F=B3=E9=94=AE=E8=8F=9C?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 除了电池插件保留右键菜单,其他在快捷区域的插件不显示右键菜单 Log: 去掉插件的右键菜单 Influence: 右键蓝牙、声音等插件,观察是否有右键菜单 Bug: https://pms.uniontech.com/bug-view-171753.html Change-Id: Ied821bb2f2e1b6e6e6fe7952ee15745d793e7e7d --- plugins/bluetooth/bluetoothplugin.cpp | 9 --------- plugins/bluetooth/bluetoothplugin.h | 1 - plugins/onboard/onboardplugin.cpp | 20 -------------------- plugins/onboard/onboardplugin.h | 1 - plugins/sound/soundplugin.cpp | 9 --------- plugins/sound/soundplugin.h | 1 - 6 files changed, 41 deletions(-) diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index ce4c6e178..7b70444fa 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -111,15 +111,6 @@ QWidget *BluetoothPlugin::itemPopupApplet(const QString &itemKey) return nullptr; } -const QString BluetoothPlugin::itemContextMenu(const QString &itemKey) -{ - if (itemKey == BLUETOOTH_KEY) { - return m_bluetoothItem->contextMenu(); - } - - return QString(); -} - void BluetoothPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) { if (itemKey == BLUETOOTH_KEY) { diff --git a/plugins/bluetooth/bluetoothplugin.h b/plugins/bluetooth/bluetoothplugin.h index 094eb4bf4..567c5fc2d 100644 --- a/plugins/bluetooth/bluetoothplugin.h +++ b/plugins/bluetooth/bluetoothplugin.h @@ -49,7 +49,6 @@ public: QWidget *itemWidget(const QString &itemKey) override; QWidget *itemTipsWidget(const QString &itemKey) override; QWidget *itemPopupApplet(const QString &itemKey) override; - const QString itemContextMenu(const QString &itemKey) override; void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index ba46219b6..c1c5b51e6 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -102,26 +102,6 @@ const QString OnboardPlugin::itemCommand(const QString &itemKey) return QString("dbus-send --print-reply --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.ToggleVisible"); } -const QString OnboardPlugin::itemContextMenu(const QString &itemKey) -{ - Q_UNUSED(itemKey); - - QList items; - - QMap onboardSettings; - onboardSettings["itemId"] = "onboard-settings"; - onboardSettings["itemText"] = tr("Settings"); - onboardSettings["isActive"] = true; - items.push_back(onboardSettings); - - QMap menu; - menu["items"] = items; - menu["checkableMenu"] = false; - menu["singleCheck"] = false; - - return QJsonDocument::fromVariant(menu).toJson(); -} - void OnboardPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) { Q_UNUSED(itemKey) diff --git a/plugins/onboard/onboardplugin.h b/plugins/onboard/onboardplugin.h index 3d08b1795..ca79e2463 100644 --- a/plugins/onboard/onboardplugin.h +++ b/plugins/onboard/onboardplugin.h @@ -51,7 +51,6 @@ public: QWidget *itemWidget(const QString &itemKey) override; QWidget *itemTipsWidget(const QString &itemKey) override; const QString itemCommand(const QString &itemKey) override; - const QString itemContextMenu(const QString &itemKey) override; void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; void displayModeChanged(const Dock::DisplayMode displayMode) override; diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 5e97e5f01..38f8b712b 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -110,15 +110,6 @@ QWidget *SoundPlugin::itemPopupApplet(const QString &itemKey) return nullptr; } -const QString SoundPlugin::itemContextMenu(const QString &itemKey) -{ - if (itemKey == SOUND_KEY) { - return m_soundItem->contextMenu(); - } - - return QString(); -} - void SoundPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) { if (itemKey == SOUND_KEY) { diff --git a/plugins/sound/soundplugin.h b/plugins/sound/soundplugin.h index f14f5020a..29c1ad3e4 100644 --- a/plugins/sound/soundplugin.h +++ b/plugins/sound/soundplugin.h @@ -46,7 +46,6 @@ public: QWidget *itemWidget(const QString &itemKey) override; QWidget *itemTipsWidget(const QString &itemKey) override; QWidget *itemPopupApplet(const QString &itemKey) override; - const QString itemContextMenu(const QString &itemKey) override; void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; From 1236ae5b87fff551141d82140f25f24a2e686617 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 17 Nov 2022 06:41:20 +0000 Subject: [PATCH 137/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E4=B8=AD=E6=8B=96=E6=8B=BD=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=88=B0=E6=A1=8C=E9=9D=A2=E5=8C=BA=E5=9F=9F=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=B6=88=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在拖拽图标结束后,自动调用TrayView的onUpdateEditorView方法来重新生成图标 Log: Influence: 将托盘图标从任务栏快速向上拖动,观察任务栏托盘的图标是否还存在 Bug: https://pms.uniontech.com/bug-view-171539.html Change-Id: Ib2dc99742349f06ee27726073916464e7a5769b2 --- frame/window/tray/tray_delegate.cpp | 2 +- frame/window/tray/tray_gridview.cpp | 14 +++++++------- frame/window/tray/tray_model.cpp | 3 +++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index 6f44b3658..3e843ff42 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -149,7 +149,7 @@ void TrayDelegate::setEditorData(QWidget *editor, const QModelIndex &index) cons { BaseTrayWidget *widget = static_cast(editor); if (widget) { - widget->setNeedShow(!index.data(TrayModel::Blank).toBool()); + widget->setNeedShow(true); } } diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index 9d397c0ec..32bc7459b 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -457,10 +457,12 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) if (!widget) return false; + QMimeData *data = model()->mimeData(QModelIndexList() << modelIndex); + if (!data) + return false; + auto pixmap = widget->icon(); - QString text = modelIndex.data(Qt::DisplayRole).toString(); - QString itemKey = modelIndex.data(TrayModel::Role::KeyRole).toString(); qreal ratio = qApp->devicePixelRatio(); // 创建拖拽释放时的应用图标 QLabel *pixLabel = new QLabel(this); @@ -472,17 +474,13 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) pixmap.setDevicePixelRatio(ratio); drag->setPixmap(pixmap); drag->setHotSpot(pixmap.rect().center() / ratio); - QMimeData *data = model()->mimeData(QModelIndexList() << modelIndex); - if (!data) { - return false; - } data->setImageData(pixmap); drag->setMimeData(data); setState(DraggingState); - listModel->setDragKey(itemKey); + listModel->setDragKey(modelIndex.data(TrayModel::Role::KeyRole).toString()); listModel->setDragingIndex(modelIndex); // 删除当前的图标 WinInfo winInfo = listModel->takeIndex(modelIndex); @@ -506,6 +504,7 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) m_dropPos = QPoint(); m_dragPos = QPoint(); + onUpdateEditorView(); Q_EMIT dragFinished(); }); posAni->setEasingCurve(QEasingCurve::Linear); @@ -520,6 +519,7 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) m_dropPos = QPoint(); m_dragPos = QPoint(); + Q_EMIT dragFinished(); } return true; diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index 865a47241..7af3637d0 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -49,6 +49,9 @@ TrayModel *TrayModel::getDockModel() connect(iconModel, &TrayModel::rowsInserted, model, [ = ] { model->setExpandVisible(iconModel->rowCount() > 0); }); + connect(iconModel, &TrayModel::rowCountChanged, model, [ = ] { + model->setExpandVisible(iconModel->rowCount() > 0); + }); } return model; From 8e241834e0889c5a44bccae80334a2229f6dfb1a Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 17 Nov 2022 08:56:52 +0000 Subject: [PATCH 138/257] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将获取主屏幕的函数从qApp->primaryScreen()修改为内部封装好的接口 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-96831.html Change-Id: I25f7c4dfd76bd32b37a24de68bd4778132a38b15 --- frame/util/multiscreenworker.cpp | 2 +- frame/window/mainpanelcontrol.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 7d2fc4675..b42a6f6ff 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -705,7 +705,7 @@ QString MultiScreenWorker::getValidScreen(const Position &pos) if (DIS_INS->canDock(DIS_INS->screen(DOCK_SCREEN->current()), pos)) return DOCK_SCREEN->current(); - if (DIS_INS->canDock(qApp->primaryScreen(), pos)) + if (DIS_INS->canDock(DIS_INS->screen(DIS_INS->primary()), pos)) return DIS_INS->primary(); for (auto s : DIS_INS->screens()) { diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 37e1b0660..f56395710 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -1102,8 +1102,8 @@ void MainPanelControl::paintEvent(QPaintEvent *event) // 获取当前屏幕的高或者宽(任务栏上下的时候获取宽,左右获取高) int MainPanelControl::getScreenSize() const { - QScreen *currentScreen = qApp->primaryScreen(); DisplayManager *displayManager = DisplayManager::instance(); + QScreen *currentScreen = displayManager->screen(displayManager->primary()); QScreen *screen = displayManager->screen(DockScreen::instance()->current()); if (screen) currentScreen = screen; From 9abab8ed1bdf53c4a341c482b23acd882f131370 Mon Sep 17 00:00:00 2001 From: songwentao Date: Thu, 17 Nov 2022 14:03:17 +0800 Subject: [PATCH 139/257] =?UTF-8?q?fix:=20=E5=90=8C=E6=AD=A5=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=99=A8=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 启动器修改了拖拽时的MimeData中的特征字段信息, 任务栏同步修改 Log: Influence: 从启动器应用列表-拖拽到任务栏-回收站-卸载应用功能正常 Bug: https://pms.uniontech.com/bug-view-147753.html Change-Id: Ic8ab1ed87d40807b0a74e7db0cc84d06c8dabcb0 --- plugins/trash/trashwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/trash/trashwidget.cpp b/plugins/trash/trashwidget.cpp index a399b6499..48a723dd9 100644 --- a/plugins/trash/trashwidget.cpp +++ b/plugins/trash/trashwidget.cpp @@ -162,7 +162,7 @@ void TrashWidget::dragLeaveEvent(QDragLeaveEvent *e) void TrashWidget::dropEvent(QDropEvent *e) { if (e->mimeData()->hasFormat("RequestDock")) - return removeApp(e->mimeData()->data("AppKey")); + return removeApp(e->mimeData()->data("DesktopPath")); if (!e->mimeData()->hasUrls()) { return e->ignore(); From e98f1df2f55b3d26dd13959f7d9d20fa8fd6ade3 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 16 Nov 2022 18:21:48 +0800 Subject: [PATCH 140/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E6=89=98=E7=9B=98=E6=8B=96=E5=8A=A8=E5=BA=94=E7=94=A8=E5=88=B0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E4=B8=8A=E9=9D=A2=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将图标从托盘拖动到任务栏上面的时候,会将信息保存到DConfig配置,触发任务栏上多次添加图标的功能,引起图标重复 Log: 修复从托盘拖动应用到任务栏上图标显示异常 Influence: 将安全中心等图标从托盘拖动到任务栏,观察图标是否重复 Bug: https://pms.uniontech.com/bug-view-171493.html Change-Id: I15b85b8192e7e7cca0f563f9ecc6381cd616f0ee --- frame/window/tray/tray_delegate.h | 1 - frame/window/tray/tray_gridview.cpp | 14 +++++-- frame/window/tray/tray_model.cpp | 38 +++++++++++++++---- frame/window/tray/widgets/indicatorplugin.cpp | 16 +++++++- frame/window/tray/widgets/indicatorplugin.h | 3 ++ 5 files changed, 59 insertions(+), 13 deletions(-) diff --git a/frame/window/tray/tray_delegate.h b/frame/window/tray/tray_delegate.h index 26487f761..28d2dccf2 100644 --- a/frame/window/tray/tray_delegate.h +++ b/frame/window/tray/tray_delegate.h @@ -30,7 +30,6 @@ #define ICON_SIZE 16 #define ITEM_SPACING 5 -struct WinInfo; class ExpandIconWidget; class QListView; class PluginsItemInterface; diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index 32bc7459b..525dd294a 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -20,6 +20,9 @@ */ #include "tray_gridview.h" #include "settingconfig.h" +#include "expandiconwidget.h" +#include "tray_model.h" +#include "basetraywidget.h" #include #include @@ -33,9 +36,6 @@ #include #include -#include "tray_model.h" -#include "basetraywidget.h" - TrayGridView::TrayGridView(QWidget *parent) : DListView(parent) , m_aniCurveType(QEasingCurve::Linear) @@ -516,6 +516,14 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) } else { listModel->setDragKey(QString()); clearDragModelIndex(); + if (listModel->isIconTray()) { + // 如果当前是从托盘移动到任务栏,则根据托盘内部是否有应用来决定是否显示展开图标 + bool hasIcon = (listModel->rowCount() > 0); + TrayModel::getDockModel()->setExpandVisible(hasIcon, hasIcon); + // 如果没有图标,则隐藏托盘图标 + if (!hasIcon) + ExpandIconWidget::popupTrayView()->hide(); + } m_dropPos = QPoint(); m_dragPos = QPoint(); diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index 7af3637d0..2f7c6f071 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -148,9 +148,11 @@ void TrayModel::setExpandVisible(bool visible, bool openExpand) if (visible) { // 如果展开图标已经存在,则不添加, - for (const WinInfo &winInfo : m_winInfos) { - if (winInfo.type == TrayIconType::ExpandIcon) + for (WinInfo &winInfo : m_winInfos) { + if (winInfo.type == TrayIconType::ExpandIcon) { + winInfo.expand = openExpand; return; + } } // 如果是任务栏图标,则添加托盘展开图标 beginInsertRows(QModelIndex(), rowCount(), rowCount()); @@ -431,14 +433,24 @@ bool TrayModel::isTypeWriting(const QString &servicePath) const void TrayModel::saveConfig(int index, const WinInfo &winInfo) { - if (m_fixedTrayNames.contains(winInfo.itemKey)) - return; + if (m_isTrayIcon) { + // 如果是从任务栏将图标移动到托盘,就从配置中移除 + if (!m_fixedTrayNames.contains(winInfo.itemKey)) + return; - if (index >= 0 && index < m_fixedTrayNames.size()) { - m_fixedTrayNames.insert(index, winInfo.itemKey); + m_fixedTrayNames.removeOne(winInfo.itemKey); } else { - m_fixedTrayNames << winInfo.itemKey; + // 如果是将图标从托盘移到任务栏上面,就增加到配置中 + if (m_fixedTrayNames.contains(winInfo.itemKey)) + return; + + if (index >= 0 && index < m_fixedTrayNames.size()) { + m_fixedTrayNames.insert(index, winInfo.itemKey); + } else { + m_fixedTrayNames << winInfo.itemKey; + } } + SETTINGCONFIG->setValue(DOCKQUICKTRAYNAME, m_fixedTrayNames); } @@ -538,6 +550,11 @@ void TrayModel::onSniTrayAdded(const QString &servicePath) if (!sniCanExport(servicePath)) return; + for (const WinInfo &winInfo : m_winInfos) { + if (winInfo.servicePath == servicePath) + return; + } + bool typeWriting = isTypeWriting(servicePath); beginInsertRows(QModelIndex(), rowCount(), rowCount()); @@ -704,6 +721,13 @@ void TrayModel::onSettingChanged(const QString &key, const QVariant &value) QStringList indicators = m_monitor->indicatorNames(); for (const QString &indicatorName : indicators) { + if (!m_indicatorMap.contains(indicatorName)) + continue; + + IndicatorPlugin *plugin = m_indicatorMap[indicatorName]; + if (!plugin->isLoaded()) + continue; + if (indicatorCanExport(indicatorName)) onIndicatorAdded(indicatorName); else diff --git a/frame/window/tray/widgets/indicatorplugin.cpp b/frame/window/tray/widgets/indicatorplugin.cpp index 7eea2536d..158113b26 100644 --- a/frame/window/tray/widgets/indicatorplugin.cpp +++ b/frame/window/tray/widgets/indicatorplugin.cpp @@ -169,9 +169,11 @@ void IndicatorPluginPrivate::initDBus(const QString &indicatorName) if (data.contains("text")) { featData("text", data, SLOT(textPropertyChanged(QDBusMessage)), [ = ](QVariant v) { if (v.toString().isEmpty()) { + q->m_isLoaded = false; Q_EMIT q->removed(); return; } + q->m_isLoaded = true; Q_EMIT q->delayLoaded(); indicatorTrayWidget->setText(v.toString()); updateContent(); @@ -181,9 +183,11 @@ void IndicatorPluginPrivate::initDBus(const QString &indicatorName) if (data.contains("icon")) { featData("icon", data, SLOT(iconPropertyChanged(QDBusMessage)), [ = ](QVariant v) { if (v.toByteArray().isEmpty()) { + q->m_isLoaded = false; Q_EMIT q->removed(); return; } + q->m_isLoaded = true; Q_EMIT q->delayLoaded(); indicatorTrayWidget->setPixmapData(v.toByteArray()); updateContent(); @@ -214,6 +218,7 @@ void IndicatorPluginPrivate::initDBus(const QString &indicatorName) IndicatorPlugin::IndicatorPlugin(const QString &indicatorName, QObject *parent) : QObject(parent) , d_ptr(new IndicatorPluginPrivate(this)) + , m_isLoaded(false) { Q_D(IndicatorPlugin); @@ -244,12 +249,18 @@ void IndicatorPlugin::removeWidget() d->indicatorTrayWidget = nullptr; } +bool IndicatorPlugin::isLoaded() +{ + return m_isLoaded; +} + void IndicatorPlugin::textPropertyChanged(const QDBusMessage &message) { Q_D(IndicatorPlugin); - d->propertyChanged("text", message, [=] (const QVariant &value) { + d->propertyChanged("text", message, [ = ] (const QVariant &value) { if (value.toString().isEmpty()) { + m_isLoaded = false; Q_EMIT removed(); return; } @@ -266,8 +277,9 @@ void IndicatorPlugin::iconPropertyChanged(const QDBusMessage &message) { Q_D(IndicatorPlugin); - d->propertyChanged("icon", message, [=] (const QVariant &value) { + d->propertyChanged("icon", message, [ = ] (const QVariant &value) { if (value.toByteArray().isEmpty()) { + m_isLoaded = false; Q_EMIT removed(); return; } diff --git a/frame/window/tray/widgets/indicatorplugin.h b/frame/window/tray/widgets/indicatorplugin.h index 3c649f70b..01f17342d 100644 --- a/frame/window/tray/widgets/indicatorplugin.h +++ b/frame/window/tray/widgets/indicatorplugin.h @@ -37,6 +37,8 @@ public: void removeWidget(); + bool isLoaded(); + signals: void delayLoaded(); void removed(); @@ -47,5 +49,6 @@ private slots: private: QScopedPointer d_ptr; + bool m_isLoaded; Q_DECLARE_PRIVATE_D(qGetPtrHelper(d_ptr), IndicatorPlugin) }; From e6a73fe3c31241dce0f5f9b3c8da8557e5585e64 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 18 Nov 2022 03:19:58 +0000 Subject: [PATCH 141/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=BB=99=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=8F=92=E4=BB=B6=E5=92=8C=E6=89=98=E7=9B=98=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加plugins接口,用于给控制中心提供在任务栏上显示的插件或托盘区域,提供setItemOnDock接口,用于在控制中心设置哪些项在任务栏上面显示 Log: 给控制中心提供任务栏插件和托盘显示的接口 Influence: 无 Task: https://pms.uniontech.com/task-view-216841.html Change-Id: Id6abde586915e5827188156222804914a9edf7c9 --- frame/controller/quicksettingcontroller.cpp | 3 +- frame/dbus/dbusdockadaptors.cpp | 138 +++++++++++++++++++- frame/dbus/dbusdockadaptors.h | 40 +++++- frame/item/item.qrc | 1 + frame/item/resources/dcc_dock_plug_in.svg | 7 + interfaces/pluginsiteminterface.h | 7 +- 6 files changed, 183 insertions(+), 13 deletions(-) create mode 100644 frame/item/resources/dcc_dock_plug_in.svg diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 9021bc8c5..0a4717869 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -162,7 +162,8 @@ QList QuickSettingController::pluginInSettings() PluginAttribute pluginAttr = pluginAttribute(plugin); if (pluginAttr == QuickSettingController::PluginAttribute::Quick || pluginAttr == QuickSettingController::PluginAttribute::System - || pluginAttr == QuickSettingController::PluginAttribute::Tool) + || pluginAttr == QuickSettingController::PluginAttribute::Tool + || pluginAttr == QuickSettingController::PluginAttribute::Tray) settingPlugins << plugin; } diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index 8cca73401..e45e87c2e 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -26,10 +26,46 @@ #include "proxyplugincontroller.h" #include "quicksettingcontroller.h" #include "pluginsitem.h" +#include "settingconfig.h" #include #include #include +#include + +const QSize defaultIconSize = QSize(20, 20); + +QDebug operator<<(QDebug argument, const DockItemInfo &info) +{ + argument << "name:" << info.name << ", displayName:" << info.displayName + << "itemKey:" << info.itemKey << "SettingKey:" << info.settingKey + << "icon:" << info.icon << "visible:" << info.visible; + return argument; +} + +QDBusArgument &operator<<(QDBusArgument &arg, const DockItemInfo &info) +{ + arg.beginStructure(); + arg << info.name << info.displayName << info.itemKey << info.settingKey << info.icon << info.visible; + arg.endStructure(); + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, DockItemInfo &info) +{ + arg.beginStructure(); + arg >> info.name >> info.displayName >> info.itemKey >> info.settingKey >> info.icon >> info.visible; + arg.endStructure(); + return arg; +} + +void registerPluginInfoMetaType() +{ + qRegisterMetaType("DockItemInfo"); + qDBusRegisterMetaType(); + qRegisterMetaType("DockItemInfos"); + qDBusRegisterMetaType(); +} DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) : QDBusAbstractAdaptor(parent) @@ -48,7 +84,7 @@ DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) }); } - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); connect(DockItemManager::instance(), &DockItemManager::itemInserted, this, [ = ] (const int index, DockItem *item) { Q_UNUSED(index); if (item->itemType() == DockItem::Plugins @@ -73,6 +109,8 @@ DBusDockAdaptors::DBusDockAdaptors(WindowManager* parent) } } }); + + registerPluginInfoMetaType(); } DBusDockAdaptors::~DBusDockAdaptors() @@ -101,7 +139,7 @@ void DBusDockAdaptors::ReloadPlugins() QStringList DBusDockAdaptors::GetLoadedPlugins() { - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); QStringList nameList; QMap map; for (auto plugin : allPlugin) { @@ -128,6 +166,34 @@ QStringList DBusDockAdaptors::GetLoadedPlugins() return newList; } +DockItemInfos DBusDockAdaptors::plugins() +{ + // 获取本地加载的插件 + QList allPlugin = localPlugins(); + DockItemInfos pluginInfos; + QStringList quickSettingKeys = SETTINGCONFIG->value("Dock_Quick_Plugin_Name").toStringList(); + for (PluginsItemInterface *plugin : allPlugin) { + DockItemInfo info; + info.name = plugin->pluginName(); + info.displayName = plugin->pluginDisplayName(); + info.itemKey = plugin->pluginName(); + info.settingKey = "Dock_Quick_Plugin_Name"; + info.visible = quickSettingKeys.contains(info.itemKey); + QSize pixmapSize; + QIcon icon = getSettingIcon(plugin, pixmapSize); + if (!icon.isNull()) { + QBuffer buffer(&info.icon); + if (buffer.open(QIODevice::WriteOnly)) { + QPixmap pixmap = icon.pixmap(pixmapSize); + pixmap.save(&buffer, "bmp"); + } + } + pluginInfos << info; + } + + return pluginInfos; +} + void DBusDockAdaptors::resizeDock(int offset, bool dragging) { m_windowManager->resizeDock(offset, dragging); @@ -136,7 +202,7 @@ void DBusDockAdaptors::resizeDock(int offset, bool dragging) // 返回每个插件的识别Key(所以此值应始终不变),供个性化插件根据key去匹配每个插件对应的图标 QString DBusDockAdaptors::getPluginKey(const QString &pluginName) { - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); for (auto plugin : allPlugin) { if (plugin->pluginDisplayName() == pluginName) return plugin->pluginName(); @@ -147,7 +213,7 @@ QString DBusDockAdaptors::getPluginKey(const QString &pluginName) bool DBusDockAdaptors::getPluginVisible(const QString &pluginName) { - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); for (auto *p : allPlugin) { if (!p->pluginIsAllowDisable()) continue; @@ -169,7 +235,7 @@ bool DBusDockAdaptors::getPluginVisible(const QString &pluginName) void DBusDockAdaptors::setPluginVisible(const QString &pluginName, bool visible) { - QList allPlugin = plugins(); + QList allPlugin = localPlugins(); for (auto *p : allPlugin) { if (!p->pluginIsAllowDisable()) continue; @@ -192,6 +258,17 @@ void DBusDockAdaptors::setPluginVisible(const QString &pluginName, bool visible) qInfo() << "Unable to set information for this plugin"; } +void DBusDockAdaptors::setItemOnDock(const QString settingKey, const QString &itemKey, bool visible) +{ + QStringList settings = SETTINGCONFIG->value(settingKey).toStringList(); + if (visible && !settings.contains(itemKey)) + settings << itemKey; + else if (!visible && settings.contains(itemKey)) + settings.removeOne(itemKey); + + SETTINGCONFIG->setValue(settingKey, settings); +} + QRect DBusDockAdaptors::geometry() const { return m_windowManager->geometry(); @@ -229,7 +306,56 @@ bool DBusDockAdaptors::isPluginValid(const QString &name) return true; } -QList DBusDockAdaptors::plugins() const +QList DBusDockAdaptors::localPlugins() const { return QuickSettingController::instance()->pluginInSettings(); } + +QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const +{ + auto iconSize = [](const QIcon &icon) { + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + return iconSizes[0]; + + return defaultIconSize; + }; + // 先获取控制中心的设置图标 + QIcon icon = plugin->icon(DockPart::DCCSetting); + if (!icon.isNull()) { + pixmapSize = iconSize(icon); + return icon; + } + + // 如果插件中没有设置图标,则根据插件的类型,获取其他的图标 + QuickSettingController::PluginAttribute pluginAttr = QuickSettingController::instance()->pluginAttribute(plugin); + switch(pluginAttr) { + case QuickSettingController::PluginAttribute::System: { + icon = plugin->icon(DockPart::SystemPanel); + pixmapSize = defaultIconSize; + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + pixmapSize = iconSizes[0]; + break; + } + case QuickSettingController::PluginAttribute::Quick: { + icon = plugin->icon(DockPart::QuickShow); + if (icon.isNull()) + icon = plugin->icon(DockPart::QuickPanel); + pixmapSize = defaultIconSize; + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + pixmapSize = iconSizes[0]; + break; + } + default: + break; + } + + if (icon.isNull()) { + icon = QIcon(":/icons/resources/dcc_dock_plug_in.svg"); + pixmapSize = QSize(20, 20); + } + + return icon; +} diff --git a/frame/dbus/dbusdockadaptors.h b/frame/dbus/dbusdockadaptors.h index d3188235a..1cb2faf91 100644 --- a/frame/dbus/dbusdockadaptors.h +++ b/frame/dbus/dbusdockadaptors.h @@ -22,10 +22,11 @@ #ifndef DBUSDOCKADAPTORS_H #define DBUSDOCKADAPTORS_H -#include - #include "mainwindow.h" +#include +#include + /* * Adaptor class for interface com.deepin.dde.Dock */ @@ -33,6 +34,28 @@ class QGSettings; class WindowManager; class PluginsItemInterface; +struct DockItemInfo +{ + QString name; + QString displayName; + QString itemKey; + QString settingKey; + QByteArray icon; + bool visible; +}; + +QDebug operator<<(QDebug argument, const DockItemInfo &info); +QDBusArgument &operator<<(QDBusArgument &arg, const DockItemInfo &info); +const QDBusArgument &operator>>(const QDBusArgument &arg, DockItemInfo &info); + +Q_DECLARE_METATYPE(DockItemInfo) + +typedef QList DockItemInfos; + +Q_DECLARE_METATYPE(DockItemInfos) + +void registerPluginInfoMetaType(); + class DBusDockAdaptors: public QDBusAbstractAdaptor { Q_OBJECT @@ -46,6 +69,10 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor " " " " " " + " >" + " " + " \n" + " " " " " " " " @@ -62,6 +89,10 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor " " " " " " + " " + " " + " " + " " " " " " " " @@ -80,6 +111,7 @@ public Q_SLOTS: // METHODS void ReloadPlugins(); QStringList GetLoadedPlugins(); + DockItemInfos plugins(); void resizeDock(int offset, bool dragging); @@ -87,6 +119,7 @@ public Q_SLOTS: // METHODS bool getPluginVisible(const QString &pluginName); void setPluginVisible(const QString &pluginName, bool visible); + void setItemOnDock(const QString settingKey, const QString &itemKey, bool visible); public: // PROPERTIES QRect geometry() const; @@ -101,7 +134,8 @@ signals: private: bool isPluginValid(const QString &name); - QList plugins() const; + QList localPlugins() const; + QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const; private: QGSettings *m_gsettings; diff --git a/frame/item/item.qrc b/frame/item/item.qrc index b53265823..789855e93 100644 --- a/frame/item/item.qrc +++ b/frame/item/item.qrc @@ -89,5 +89,6 @@ resources/ICON_Device_Headphone.svg resources/ICON_Device_Laptop_dark.svg resources/ICON_Device_Laptop.svg + resources/dcc_dock_plug_in.svg diff --git a/frame/item/resources/dcc_dock_plug_in.svg b/frame/item/resources/dcc_dock_plug_in.svg new file mode 100644 index 000000000..5ab6bf7fd --- /dev/null +++ b/frame/item/resources/dcc_dock_plug_in.svg @@ -0,0 +1,7 @@ + + + icon/dock/plug-in2 + + + + \ No newline at end of file diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 0e148d599..be7cd0a51 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -29,9 +29,10 @@ // 任务栏的部件位置 enum class DockPart { - QuickShow = 0, // 快捷插件显示区域 - QuickPanel, // 快捷面板区域 - SystemPanel // 系统插件显示区域 + QuickShow = 0, // 快捷插件显示区域 + QuickPanel, // 快捷面板区域 + SystemPanel, // 系统插件显示区域 + DCCSetting // 显示在控制中心个性化设置的图标 }; // 快捷面板详情页面的itemWidget对应的itemKey From 16a8cf7d3e2c8c5cfbd9897616d959e700e7e183 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 18 Nov 2022 09:22:39 +0000 Subject: [PATCH 142/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=8F=92=E4=BB=B6=E5=90=8E=E5=BF=AB=E6=8D=B7=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、在插件移除后,除了从面板上将该插件的Widget移除外,删除该插件创建出来的QWidget 2、在插件对应的QWidget尺寸发生变化后,重新设置面板尺寸 3、在释放任务栏图标后,恢复ToolTip的parent Log: 修复移除插件后快捷面板显示异常的问题 Influence: 不断插入或者移除蓝牙设备,观察快捷面板是否显示正常 Bug: https://pms.uniontech.com/bug-view-171579.html Change-Id: I8168b49ad9eb047155efbd609be65f3dd263b6bc --- frame/item/components/fullquickitem.cpp | 14 +++++++++---- frame/item/components/fullquickitem.h | 1 + frame/window/quickpluginwindow.cpp | 10 +++++++++ frame/window/quickpluginwindow.h | 1 + frame/window/quicksettingcontainer.cpp | 27 ++++++++++++++----------- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/frame/item/components/fullquickitem.cpp b/frame/item/components/fullquickitem.cpp index cf9f0c92b..b83fddc29 100644 --- a/frame/item/components/fullquickitem.cpp +++ b/frame/item/components/fullquickitem.cpp @@ -27,6 +27,7 @@ FullQuickItem::FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *p , m_effectWidget(new DBlurEffectWidget(this)) { initUi(); + QMetaObject::invokeMethod(this, &FullQuickItem::resizeSelf, Qt::QueuedConnection); } FullQuickItem::~FullQuickItem() @@ -42,10 +43,9 @@ QuickSettingItem::QuickSettingType FullQuickItem::type() const bool FullQuickItem::eventFilter(QObject *obj, QEvent *event) { - if (obj == m_centerWidget && event->type() == QEvent::Resize) { - m_effectWidget->setFixedHeight(m_centerWidget->height()); - setFixedHeight(m_centerWidget->height()); - } + if (obj == m_centerWidget && event->type() == QEvent::Resize) + resizeSelf(); + return QuickSettingItem::eventFilter(obj, event); } @@ -74,3 +74,9 @@ void FullQuickItem::initUi() m_centerWidget->installEventFilter(this); } + +void FullQuickItem::resizeSelf() +{ + m_effectWidget->setFixedHeight(m_centerWidget->height()); + setFixedHeight(m_centerWidget->height()); +} diff --git a/frame/item/components/fullquickitem.h b/frame/item/components/fullquickitem.h index 6c67bd659..f734d313a 100644 --- a/frame/item/components/fullquickitem.h +++ b/frame/item/components/fullquickitem.h @@ -38,6 +38,7 @@ protected: private: void initUi(); + void resizeSelf(); private: QWidget *m_centerWidget; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 1f671c53e..acd2ea090 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -512,6 +512,7 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject , m_position(Dock::Position::Bottom) , m_popupWindow(new DockPopupWindow) , m_contextMenu(new QMenu(this)) + , m_tipParent(nullptr) { m_popupWindow->setShadowBlurRadius(20); m_popupWindow->setRadius(6); @@ -531,6 +532,10 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject QuickDockItem::~QuickDockItem() { + QWidget *tipWidget = m_pluginItem->itemTipsWidget(m_itemKey); + if (tipWidget && tipWidget->parentWidget() == m_popupWindow) + tipWidget->setParent(m_tipParent); + m_popupWindow->deleteLater(); } @@ -604,6 +609,11 @@ void QuickDockItem::enterEvent(QEvent *event) if (!tipWidget) return; + // 记录下toolTip的parent,因为在调用DockPopupWindow的时候会将DockPopupWindow设置为toolTip的parent, + // 在DockPopupWindow对象释放的时候, 会将toolTip也一起给释放 + if (tipWidget->parentWidget() != m_popupWindow) + m_tipParent = tipWidget->parentWidget(); + switch (m_position) { case Top: m_popupWindow->setArrowDirection(DockPopupWindow::ArrowTop); diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index b36eb08a8..a8c9ba7a4 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -122,6 +122,7 @@ private: Dock::Position m_position; DockPopupWindow *m_popupWindow; QMenu *m_contextMenu; + QWidget *m_tipParent; }; #endif // QUICKPLUGINWINDOW_H diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 422bbc5d9..904871a0b 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -157,8 +157,7 @@ bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) { switch (event->type()) { case QEvent::Resize: { - if (watched == m_childPage) - onResizeView(); + onResizeView(); break; } case QEvent::MouseButtonPress: { @@ -221,19 +220,23 @@ void QuickSettingContainer::appendPlugin(PluginsItemInterface *itemInter, bool n void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) { - for (QuickSettingItem *item : m_quickSettings) { - if (item->pluginItem() != itemInter) - continue; + QList::Iterator removeItemIter = std::find_if(m_quickSettings.begin(), m_quickSettings.end(), [ = ](QuickSettingItem *item)->bool { + return item->pluginItem() == itemInter; + }); - if (item->type() == QuickSettingItem::QuickSettingType::Full) - m_componentWidget->layout()->removeWidget(item); - else - m_pluginLayout->removeWidget(item); + QuickSettingItem *removeItem = *removeItemIter; + if (!removeItem) + return; - m_quickSettings.removeOne(item); - break; - } + if (removeItem->type() == QuickSettingItem::QuickSettingType::Full) + m_componentWidget->layout()->removeWidget(removeItem); + else + m_pluginLayout->removeWidget(removeItem); + m_quickSettings.removeOne(removeItem); + removeItem->deleteLater(); + + updateItemLayout(); onResizeView(); } From b3a989b0707bc6f959affbe411da5b49acee78c0 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 18 Nov 2022 08:10:17 +0000 Subject: [PATCH 143/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E7=AA=97=E5=8F=A3=E7=89=B9=E6=95=88=E4=B8=8B=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=99=A8=E6=8C=89=E9=92=AE=E8=A2=AB=E9=81=AE=E6=8C=A1?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关闭窗口特效模式下,多任务视图插件会自动移除,但是依然显示,会遮挡启动器按钮 Log: 修复关闭窗口特效下启动器按钮被遮挡的问题 Influence: 关闭窗口特效的时候,观察启动器按钮是否正常显示 Task: https://pms.uniontech.com/task-view-216977.html Change-Id: I8f2f7b3ca38de8dd201e4bda0869b939ed545fa9 --- frame/controller/dockitemmanager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index 3e7d0f73c..3c8e39f66 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -347,6 +347,8 @@ void DockItemManager::pluginItemInserted(PluginsItem *item) if (!Utils::SettingValue(QString("com.deepin.dde.dock.module.") + item->pluginName(), QByteArray(), "enable", true).toBool()) item->setVisible(false); + else + item->setVisible(true); emit itemInserted(insertIndex - firstPluginPosition, item); } @@ -358,6 +360,7 @@ void DockItemManager::onPluginItemRemoved(PluginsItemInterface *itemInter) PluginsItem *item = QuickSettingController::instance()->pluginItemWidget(itemInter); item->hidePopup(); + item->hide(); emit itemRemoved(item); From a8d44db60f530c0c0864912c675b6d634bb07fb0 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 18 Nov 2022 10:29:51 +0000 Subject: [PATCH 144/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E5=BC=B9=E5=87=BA=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E4=B8=8D=E5=87=86=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 快捷面板的弹出位置根据当前选中的插件位置来计算 Log: Influence: 从任务栏不同的插件图标点击,观察弹出快捷面板的位置 Bug: https://pms.uniontech.com/bug-view-172213.html Change-Id: Id229e0028221dd5ed10407d0054228aae0066ef0 --- frame/window/quickpluginwindow.cpp | 25 ++++++++++++++++++------- frame/window/quickpluginwindow.h | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index acd2ea090..7dc66c0cd 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -199,8 +199,14 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) if (m_dragInfo->isNull()) break; - if (!m_dragInfo->canDrag(mouseEvent->pos())) { - // 弹出快捷设置面板 + do { + if (m_dragInfo->canDrag(mouseEvent->pos())) + break; + + QuickDockItem *releaseItem = qobject_cast(watched); + if (!releaseItem) + break; + DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); if (Utils::IS_WAYLAND_DISPLAY) { // TODO: 临时解决方案,如果是wayland环境,toolTip没有消失,因此,此处直接调用接口来隐藏 @@ -216,9 +222,10 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) dockItem->hideToolTip(); } } - popWindow->show(popupPoint(), true); - } + popWindow->show(popupPoint(releaseItem), true); + } while (false); m_dragInfo->reset(); + break; } case QEvent::MouseMove: { @@ -296,31 +303,35 @@ void QuickPluginWindow::onRequestUpdate() Q_EMIT itemCountChanged(); } -QPoint QuickPluginWindow::popupPoint() const +QPoint QuickPluginWindow::popupPoint(QWidget *widget) const { - if (!parentWidget()) + if (!widget) return pos(); - QPoint pointCurrent = parentWidget()->mapToGlobal(pos()); + QPoint pointCurrent = widget->mapToGlobal(QPoint(0, 0)); switch (m_position) { case Dock::Position::Bottom: { // 在下方的时候,Y坐标设置在顶层窗口的y值,保证下方对齐 + pointCurrent.setX(pointCurrent.x() + widget->width() / 2); pointCurrent.setY(topLevelWidget()->y()); break; } case Dock::Position::Top: { // 在上面的时候,Y坐标设置为任务栏的下方,保证上方对齐 + pointCurrent.setX(pointCurrent.x() + widget->width() / 2); pointCurrent.setY(topLevelWidget()->y() + topLevelWidget()->height()); break; } case Dock::Position::Left: { // 在左边的时候,X坐标设置在顶层窗口的最右侧,保证左对齐 pointCurrent.setX(topLevelWidget()->x() + topLevelWidget()->width()); + pointCurrent.setY(pointCurrent.y() + widget->height() / 2); break; } case Dock::Position::Right: { // 在右边的时候,X坐标设置在顶层窗口的最左侧,保证右对齐 pointCurrent.setX(topLevelWidget()->x()); + pointCurrent.setY(pointCurrent.y() + widget->height() / 2); } } return pointCurrent; diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index a8c9ba7a4..27fe3c09c 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -76,7 +76,7 @@ private: void startDrag(PluginsItemInterface *moveItem); PluginsItemInterface *findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems); int getDropIndex(QPoint point); - QPoint popupPoint() const; + QPoint popupPoint(QWidget *widget) const; QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); QuickDockItem *getActiveDockItem(QPoint point) const; From f28dd1ac2c6a980c978db2397264e75976a318bd Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 21 Nov 2022 05:30:38 +0000 Subject: [PATCH 145/257] =?UTF-8?q?fix:=20=E7=94=B5=E6=B1=A0=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=9C=A8=E5=BF=AB=E6=8D=B7?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、新需求中,电池插件不显示在快捷面板上 2、在插入插件到快捷面板中的时候,判断快捷面板的图标或者显示在快捷面板的Widget为空的情况下,返回空 3、设置电池的快捷面板的图标返回为空图标 Log: 电池插件不显示在快捷面板 Influence: 从笔记本上,打开快捷面板,观察是否存在电池图标 Bug: https://pms.uniontech.com/bug-view-171713.html Change-Id: I506865b7ac26637b28c8fd2d40f044f9061040c8 --- frame/item/quicksettingitem.cpp | 4 ++++ frame/window/quicksettingcontainer.cpp | 3 +++ plugins/power/powerplugin.cpp | 5 ++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index bbe9e7797..d6d5710f6 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -141,6 +141,10 @@ void QuickSettingItem::onRequestAppletShow(PluginsItemInterface *itemInter, cons QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter) { + // 如果显示在面板的图标或者Widget为空,则不让显示(例如电池插件) + if (pluginInter->icon(DockPart::QuickPanel).isNull() && !pluginInter->itemWidget(QUICK_ITEM_KEY)) + return nullptr; + const QJsonObject metaData = QuickSettingController::instance()->metaData(pluginInter); if (metaData.contains("primary") && metaData.value("primary").toBool()) return new MultiQuickItem(pluginInter); diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 904871a0b..daaa62ce0 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -202,6 +202,9 @@ QPoint QuickSettingContainer::hotSpot(const QPixmap &pixmap) void QuickSettingContainer::appendPlugin(PluginsItemInterface *itemInter, bool needLayout) { QuickSettingItem *quickItem = QuickSettingFactory::createQuickWidget(itemInter); + if (!quickItem) + return; + quickItem->setParent(m_pluginWidget); quickItem->setMouseTracking(true); quickItem->installEventFilter(this); diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index b5aea7bb4..6e83cec23 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -201,7 +201,10 @@ void PowerPlugin::pluginSettingsChanged() QIcon PowerPlugin::icon(const DockPart &dockPart) { - Q_UNUSED(dockPart); + // 电池插件不显示在快捷面板上,因此此处返回空图标 + if (dockPart == DockPart::QuickPanel) + return QIcon(); + static QIcon batteryIcon; const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(); batteryIcon.detach(); From 9b33a95fabf7f479bef23687cb2cbf3c0c0b4edf Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 21 Nov 2022 16:24:02 +0800 Subject: [PATCH 146/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E6=97=A0=E6=B3=95=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E5=BF=AB=E6=8D=B7=E9=9D=A2=E6=9D=BF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 计算DockPopupWindow位置和大小的时候,需要考虑缩放率 Log: Influence: 在1.25倍缩放率下,展开快捷面板,点击网络插件展开按钮,观察是否可以展开 Task: https://pms.uniontech.com/task-view-218215.html Change-Id: I6c6c6dfe9a01ec65a80b93b5438b06fd3f97b050 --- frame/util/dockpopupwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/util/dockpopupwindow.cpp b/frame/util/dockpopupwindow.cpp index 4db253601..11912ae82 100644 --- a/frame/util/dockpopupwindow.cpp +++ b/frame/util/dockpopupwindow.cpp @@ -187,7 +187,7 @@ void DockPopupWindow::onButtonPress(int type, int x, int y, const QString &key) if (!m_enableMouseRelease) return; - QRect popupRect(pos(), size()); + QRect popupRect(pos() * qApp->devicePixelRatio(), size() * qApp->devicePixelRatio()) ; if (popupRect.contains(x, y)) return; From 06bab9d640d789c800d4fc49ad4e7392b401526f Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 21 Nov 2022 10:46:59 +0000 Subject: [PATCH 147/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=93=9D?= =?UTF-8?q?=E7=89=99=E5=88=97=E8=A1=A8=E4=B8=AD=E8=AE=BE=E5=A4=87=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E8=87=B4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加记录蓝牙设备顺序的列表,根据新增删除设备的顺序对设备进行排序 Log: Influence: 打开快捷面板中的蓝牙列表,在多个设备同时存在的情况下,观察设备顺序是否和控制中心一致 Bug: https://pms.uniontech.com/bug-view-171513.html Change-Id: I5c1017a30e0658022c61a053b9cd724312b37c40 --- frame/window/quicksettingcontainer.cpp | 5 ++-- .../bluetooth/componments/adaptersmanager.cpp | 23 ++++++++++--------- .../bluetooth/componments/adaptersmanager.h | 1 + .../bluetooth/componments/bluetoothapplet.cpp | 11 ++++++++- .../bluetooth/componments/bluetoothapplet.h | 1 + 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index daaa62ce0..e89ff39cd 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -227,10 +227,11 @@ void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) return item->pluginItem() == itemInter; }); - QuickSettingItem *removeItem = *removeItemIter; - if (!removeItem) + if (removeItemIter == m_quickSettings.end()) return; + QuickSettingItem *removeItem = *removeItemIter; + if (removeItem->type() == QuickSettingItem::QuickSettingType::Full) m_componentWidget->layout()->removeWidget(removeItem); else diff --git a/plugins/bluetooth/componments/adaptersmanager.cpp b/plugins/bluetooth/componments/adaptersmanager.cpp index 78ee7f631..3307e1165 100644 --- a/plugins/bluetooth/componments/adaptersmanager.cpp +++ b/plugins/bluetooth/componments/adaptersmanager.cpp @@ -173,6 +173,7 @@ void AdaptersManager::onRemoveAdapter(const QString &json) Adapter *adapter = const_cast(result); if (adapter) { m_adapters.remove(id); + m_adapterIds.removeOne(id); emit adapterDecreased(adapter); adapter->deleteLater(); } @@ -234,21 +235,17 @@ void AdaptersManager::adapterAdd(Adapter *adapter, const QJsonObject &adpterObj) const QString replyStr = reply.value(); QJsonDocument doc = QJsonDocument::fromJson(replyStr.toUtf8()); adapter->initDevicesList(doc); - - QString id = adapter->id(); - if (!id.isEmpty()) { - if (!m_adapters.contains(id)) { - m_adapters[id] = adapter; - } else if (!m_adapters[id]) { - m_adapters[id] = adapter; - } - } - emit this->adapterIncreased(adapter); } else { qWarning() << call.error().message(); } }); + + QString id = adapter->id(); + if (!id.isEmpty() && (!m_adapters.contains(id) || !m_adapters[id])) { + m_adapters[id] = adapter; + m_adapterIds << id; + } } void AdaptersManager::inflateAdapter(Adapter *adapter, const QJsonObject &adapterObj) @@ -275,5 +272,9 @@ void AdaptersManager::adapterRefresh(const Adapter *adapter) QList AdaptersManager::adapters() { - return m_adapters.values(); + QList allAdapter = m_adapters.values(); + std::sort(allAdapter.begin(), allAdapter.end(), [ & ](const Adapter *adapter1, const Adapter *adapter2) { + return m_adapterIds.indexOf(adapter1->id()) < m_adapterIds.indexOf(adapter2->id()); + }); + return allAdapter; } diff --git a/plugins/bluetooth/componments/adaptersmanager.h b/plugins/bluetooth/componments/adaptersmanager.h index 4a997374e..598cb53e5 100644 --- a/plugins/bluetooth/componments/adaptersmanager.h +++ b/plugins/bluetooth/componments/adaptersmanager.h @@ -61,6 +61,7 @@ private: private: DBusBluetooth *m_bluetoothInter; QMap m_adapters; + QStringList m_adapterIds; // 用于记录蓝牙适配器的排序 }; #endif // ADAPTERSMANAGER_H diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index d54a6b501..a4beb4667 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -126,6 +126,7 @@ BluetoothApplet::BluetoothApplet(AdaptersManager *adapterManager, QWidget *paren { initUi(); initConnect(); + initAdapters(); QScroller::grabGesture(m_scroarea, QScroller::LeftMouseButtonGesture); QScrollerProperties propertiesOne = QScroller::scroller(m_scroarea)->scrollerProperties(); @@ -202,7 +203,8 @@ void BluetoothApplet::onAdapterAdded(Adapter *adapter) m_adapterItems.insert(adapter->id(), adapterItem); - m_contentLayout->insertWidget(0, adapterItem, Qt::AlignTop | Qt::AlignVCenter); + // 将最新的设备插入到蓝牙设置前面 + m_contentLayout->insertWidget(m_contentLayout->count() - 1, adapterItem, Qt::AlignTop | Qt::AlignVCenter); updateBluetoothPowerState(); updateSize(); } @@ -321,6 +323,13 @@ void BluetoothApplet::updateIconTheme() m_scroarea->setPalette(scroareaBackgroud); } +void BluetoothApplet::initAdapters() +{ + QList adapters = m_adaptersManager->adapters(); + for (const Adapter *adapter : adapters) + onAdapterAdded(const_cast(adapter)); +} + void BluetoothApplet::setAirplaneModeEnabled(bool enable) { if (m_airplaneModeEnable == enable) diff --git a/plugins/bluetooth/componments/bluetoothapplet.h b/plugins/bluetooth/componments/bluetoothapplet.h index f71e397c6..ccf8f9c8d 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.h +++ b/plugins/bluetooth/componments/bluetoothapplet.h @@ -115,6 +115,7 @@ private: // 更新蓝牙插件主界面大小 void updateSize(); void updateIconTheme(); + void initAdapters(); private: QScrollArea *m_scroarea; From 58ed354c39f6e6ff9abf0afe8ea422b7c15c657a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Tue, 22 Nov 2022 11:56:39 +0800 Subject: [PATCH 148/257] =?UTF-8?q?chore:=20=E8=AE=BE=E7=BD=AE=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 镜像中打印日志不够详细 Log: 设置日志格式 Influence: 无 Task: https://pms.uniontech.com/task-view-124695.html Change-Id: I287704241f9f1a19d2ed81a41dc22149727ae58d --- frame/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/frame/main.cpp b/frame/main.cpp index 8bf7c4583..16bc9890b 100644 --- a/frame/main.cpp +++ b/frame/main.cpp @@ -195,6 +195,7 @@ int main(int argc, char *argv[]) QAccessible::installFactory(accessibleFactory); // 设置日志输出到控制台以及文件 + DLogManager::setLogFormat("%{time}{yyyyMMdd.HH:mm:ss.zzz}[%{type:1}][%{function:-35} %{line:-4}] %{message}\n"); DLogManager::registerConsoleAppender(); DLogManager::registerFileAppender(); From 224b0a9cb9c526500881b7bf85be01f2a6f43e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Tue, 22 Nov 2022 13:24:39 +0800 Subject: [PATCH 149/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9F=B3?= =?UTF-8?q?=E9=87=8F=E6=8F=92=E4=BB=B6=E8=B0=83=E8=8A=82=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E5=88=BB=E5=BA=A6=E4=B8=8D=E6=98=AF%2=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原有的功能,新需求做的时候并没有考虑到继承 Log: 修复音量插件调节最小刻度不是%2的问题 Influence: 音量插件调节 Bug: https://pms.uniontech.com/bug-view-172417.html Change-Id: Ia10448abb3e872ad47a46d34d1e179538c585c49 --- plugins/sound/soundwidget.cpp | 6 ++++-- widgets/slidercontainer.cpp | 10 ++++++++++ widgets/slidercontainer.h | 3 +++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index df3f6f0ae..65ddfe9bf 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -71,6 +71,8 @@ void SoundWidget::initUi() QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 12); m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); + m_sliderContainer->setRange(0, 100); + m_sliderContainer->setPageStep(2); SliderProxyStyle *proxy = new SliderProxyStyle; m_sliderContainer->setSliderProxyStyle(proxy); @@ -80,14 +82,14 @@ void SoundWidget::initUi() void SoundWidget::initConnection() { - connect(m_defaultSink, &DBusSink::VolumeChanged, this, [ this ](double value) { m_sliderContainer->updateSliderValue(value * 100); }); + connect(m_defaultSink, &DBusSink::VolumeChanged, this, [ this ](double value) {m_sliderContainer->updateSliderValue(std::round(value * 100.00));}); connect(m_dbusAudio, &DBusAudio::DefaultSinkChanged, this, [ this ](const QDBusObjectPath &value) { if (m_defaultSink) delete m_defaultSink; m_defaultSink = new DBusSink("org.deepin.daemon.Audio1", value.path(), QDBusConnection::sessionBus(), this); - m_sliderContainer->updateSliderValue(m_defaultSink->volume() * 100); + m_sliderContainer->updateSliderValue(std::round(m_defaultSink->volume() * 100.00)); connect(m_defaultSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); }); diff --git a/widgets/slidercontainer.cpp b/widgets/slidercontainer.cpp index 6ce0a95f2..fc6ef72c3 100644 --- a/widgets/slidercontainer.cpp +++ b/widgets/slidercontainer.cpp @@ -181,6 +181,16 @@ void SliderContainer::setIcon(const SliderContainer::IconPosition &iconPosition, } } +void SliderContainer::setPageStep(int step) +{ + return m_slider->setPageStep(step); +} + +void SliderContainer::setRange(int min, int max) +{ + return m_slider->setRange(min, max); +} + bool SliderContainer::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::MouseButtonRelease) { diff --git a/widgets/slidercontainer.h b/widgets/slidercontainer.h index f2f8d76b7..320ae035a 100644 --- a/widgets/slidercontainer.h +++ b/widgets/slidercontainer.h @@ -55,6 +55,9 @@ public: void setIcon(const IconPosition &iconPosition, const QIcon &icon); void setIcon(const IconPosition &iconPosition, const QPixmap &icon, const QSize &shadowSize, int space); + void setPageStep(int step); + void setRange(int min, int max); + Q_SIGNALS: void iconClicked(const IconPosition &); void sliderValueChanged(int value); From 2fcdf7a131c81f2c0a6ee3c1a0e998187877aec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Tue, 22 Nov 2022 13:16:05 +0800 Subject: [PATCH 150/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BA=AE?= =?UTF-8?q?=E5=BA=A6=E6=8F=92=E4=BB=B6=E6=97=A0=E6=B3=95=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=88=B0100=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit qt的slider控件默认最大值为99,需要手动设定 Log: 修复亮度插件无法调整到100的问题 Influence: 任务栏-亮度插件调节 Bug: https://pms.uniontech.com/bug-view-171869.html Change-Id: I1530ac0ae3b1b3fbf8f7bbe3236abe4a0b4f2b11 --- frame/window/components/brightnesswidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frame/window/components/brightnesswidget.cpp b/frame/window/components/brightnesswidget.cpp index cd8cff6a8..4966f7e49 100644 --- a/frame/window/components/brightnesswidget.cpp +++ b/frame/window/components/brightnesswidget.cpp @@ -73,6 +73,10 @@ void BrightnessWidget::initUi() m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); + // 需求要求调节范围是10%-100%,且调节幅度为1% + m_sliderContainer->setRange(10, 100); + m_sliderContainer->setPageStep(1); + SliderProxyStyle *style = new SliderProxyStyle; m_sliderContainer->setSliderProxyStyle(style); From 65d9cfa6efe24903b54a2c167c76053e469c4de4 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 22 Nov 2022 06:30:27 +0000 Subject: [PATCH 151/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=B1=95=E5=BC=80=E5=88=97=E8=A1=A8=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在插件请求展示列表的时候,需要判断请求的插件是否为当前插件 Log: Influence: 从快捷面板打开网络列表,观察标题是否为网络 Task: https://pms.uniontech.com/task-view-218733.html Change-Id: Ie2c19d76561918fd9aa6fc464f2a1f1bd0c35d37 --- frame/item/quicksettingitem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index d6d5710f6..941fdcbf3 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -131,6 +131,10 @@ QColor QuickSettingItem::foregroundColor() const void QuickSettingItem::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) { + // 只显示当前的插件的内容 + if (itemInter != m_pluginInter) + return; + // 显示弹出的内容 QWidget *itemApplet = itemInter->itemPopupApplet(itemKey); if (!itemApplet) From fa7a80b215d08d4eb896cf2db5a24994d65a7808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Tue, 22 Nov 2022 14:28:43 +0800 Subject: [PATCH 152/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E4=B8=AD=E9=9F=B3=E9=87=8F=E8=B0=83?= =?UTF-8?q?=E8=8A=82=E4=B8=8D=E5=93=8D=E5=BA=94=E9=9F=B3=E9=87=8F=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E8=AE=BE=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 代码中未处理音量增强的情况 Log: 修复快捷面板中音量调节不响应音量增强设置的问题 Influence: 任务栏-音量插件-音量增强时的交互 Bug: https://pms.uniontech.com/bug-view-171869.html Change-Id: I92e8d5eed9ecba3418edd4d562176b07b0fe1ac6 --- plugins/sound/soundwidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 65ddfe9bf..0ebdd900a 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -93,6 +93,10 @@ void SoundWidget::initConnection() connect(m_defaultSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); }); + connect(m_dbusAudio, &DBusAudio::MaxUIVolumeChanged, this, [ = ] (double maxValue) { + m_sliderContainer->setRange(0, std::round(maxValue * 100.00)); + }); + connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { m_defaultSink->SetVolume(value * 0.01, true); }); From a4be3f441d4e8312cb82911096ab1e6d5056eb27 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Tue, 22 Nov 2022 13:59:45 +0800 Subject: [PATCH 153/257] =?UTF-8?q?fix:=20=E8=A7=A3=E6=B1=BA=E5=8D=8F?= =?UTF-8?q?=E5=90=8C=E8=BF=9E=E6=8E=A5=E8=AE=BE=E5=A4=87=E6=97=B6=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=8D=8F=E5=90=8C=E6=9C=8D=E5=8A=A1=E6=80=BB=E5=BC=80?= =?UTF-8?q?=E5=85=B3=E5=AF=BC=E8=87=B4=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=B4=A9?= =?UTF-8?q?=E6=BA=83=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 协同连接设备时关闭协同服务总开关,未清除正在连接设备缓存数据导致问题。 当连接请求被拒绝后,需清除连接状态。 Log: Bug: https://pms.uniontech.com/bug-view-171741.html Influence: 协同连接设备. Change-Id: Ie89a3fa500ab78d0b01c24aff8b2f23ada58a1c9 --- frame/window/components/devcollaborationwidget.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frame/window/components/devcollaborationwidget.cpp b/frame/window/components/devcollaborationwidget.cpp index 846957e03..12706a6ee 100644 --- a/frame/window/components/devcollaborationwidget.cpp +++ b/frame/window/components/devcollaborationwidget.cpp @@ -147,6 +147,8 @@ void DevCollaborationWidget::updateDeviceListView() QList devices = m_deviceModel->devices(); if (devices.isEmpty()) { m_deviceListView->removeItems(0, m_deviceListView->count()); + m_deviceItemMap.clear(); + m_connectingDevices.clear(); return; } @@ -209,7 +211,7 @@ void DevCollaborationWidget::itemClicked(const QModelIndex &index) } if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive()) - m_refreshTimer->start(30); + m_refreshTimer->start(80); } void DevCollaborationWidget::itemStatusChanged() @@ -224,12 +226,12 @@ void DevCollaborationWidget::itemStatusChanged() // 更新item的连接状态 int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; m_deviceItemMap[machinePath]->setData(resultState, DevItemDelegate::ResultDataRole); - if (device->isCooperated()) + if (device->isCooperated() || !device->isPaired()) m_deviceItemMap[machinePath]->setData(0, DevItemDelegate::DegreeDataRole); m_deviceListView->update(m_deviceItemMap[machinePath]->index()); - if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(machinePath)) { + if ((resultState == DevItemDelegate::Connected || !device->isPaired()) && m_connectingDevices.contains(machinePath)) { m_connectingDevices.removeAll(machinePath); } } From c27b9788dcb47d6dd0825d729e791dc871aa44c6 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 22 Nov 2022 10:47:20 +0000 Subject: [PATCH 154/257] =?UTF-8?q?fix:=20=E4=BB=8E=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F=E7=A7=BB=E9=99=A4=E6=89=98=E7=9B=98=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=90=8E=E6=94=BE=E5=85=A5=E6=89=98=E7=9B=98=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、根据需求,从任务栏将图标拖出后,释放需要回到托盘区 2、修复从托盘区将图标移动到任务栏上图标消失的问题 3、修复向上拖动图标,托盘出现的位置歪了的问题 Log: Influence: 将图标从任务栏移出,松手后图标自动移到托盘区 Bug: https://pms.uniontech.com/bug-view-171497.html Bug: https://pms.uniontech.com/bug-view-171539.html Change-Id: Icfcd63afd60f46fece0b4f5ac5e267b3cb977ff1 --- frame/window/docktraywindow.cpp | 43 ++++----- frame/window/docktraywindow.h | 2 +- frame/window/tray/tray_delegate.cpp | 6 +- frame/window/tray/tray_gridview.cpp | 67 +++++++++----- frame/window/tray/tray_model.cpp | 12 ++- frame/window/tray/tray_model.h | 1 + .../window/tray/widgets/expandiconwidget.cpp | 90 +++++++++++++------ frame/window/tray/widgets/expandiconwidget.h | 6 +- frame/window/traymanagerwindow.cpp | 6 +- 9 files changed, 149 insertions(+), 84 deletions(-) diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 640bca6f1..761e8a2c1 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -68,13 +68,10 @@ void DockTrayWindow::setPositon(const Dock::Position &position) m_quickIconWidget->setPositon(position); m_trayView->setPosition(position); m_delegate->setPositon(position); - if (m_model->hasExpand()) { - // 切换位置的时候,需要重新关闭编辑器,然后在model的flag函数中再打开,防止图标的方向没有切换过来 - QModelIndex index = m_model->index(0, 0); - m_trayView->closePersistentEditor(index); - } + // 改变位置的时候,需要切换编辑器,以适应正确的位置 + m_trayView->onUpdateEditorView(); updateLayout(position); - onResetLayout(); + onUpdateComponentSize(); } void DockTrayWindow::setDisplayMode(const Dock::DisplayMode &displayMode) @@ -125,20 +122,10 @@ void DockTrayWindow::layoutWidget() void DockTrayWindow::resizeEvent(QResizeEvent *event) { - Q_EMIT requestUpdate(); // 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示 Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); QWidget::resizeEvent(event); - switch (m_position) { - case Dock::Position::Left: - case Dock::Position::Right: - m_toolLineLabel->setFixedSize(width() * 0.6, SPLITERSIZE); - break; - case Dock::Position::Top: - case Dock::Position::Bottom: - m_toolLineLabel->setFixedSize(SPLITERSIZE, height() * 0.6); - break; - } + onUpdateComponentSize(); } void DockTrayWindow::paintEvent(QPaintEvent *event) @@ -310,16 +297,16 @@ void DockTrayWindow::initUi() void DockTrayWindow::initConnection() { - connect(m_systemPuginWidget, &SystemPluginWindow::itemChanged, this, &DockTrayWindow::onResetLayout); - connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &DockTrayWindow::onResetLayout); - connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, &DockTrayWindow::onResetLayout); + connect(m_systemPuginWidget, &SystemPluginWindow::itemChanged, this, &DockTrayWindow::onUpdateComponentSize); + connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &DockTrayWindow::onUpdateComponentSize); + connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, &DockTrayWindow::onUpdateComponentSize); connect(m_quickIconWidget, &QuickPluginWindow::requestDrop, this, &DockTrayWindow::onDropIcon); connect(m_systemPuginWidget, &SystemPluginWindow::requestDrop, this, &DockTrayWindow::onDropIcon); - connect(m_model, &TrayModel::rowCountChanged, this, &DockTrayWindow::onResetLayout); + connect(m_model, &TrayModel::rowCountChanged, this, &DockTrayWindow::onUpdateComponentSize); connect(m_model, &TrayModel::rowCountChanged, m_trayView, &TrayGridView::onUpdateEditorView); connect(m_model, &TrayModel::requestRefreshEditor, m_trayView, &TrayGridView::onUpdateEditorView); connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); - connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onResetLayout); + connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onUpdateComponentSize); connect(m_trayView, &TrayGridView::dragFinished, this, [ this ] { // 如果拖拽结束,则隐藏托盘 Q_EMIT m_delegate->requestDrag(false); @@ -360,26 +347,26 @@ void DockTrayWindow::initAttribute() m_trayView->installEventFilter(this); } -void DockTrayWindow::onResetLayout() +void DockTrayWindow::onUpdateComponentSize() { - switch(m_position) { + switch (m_position) { case Dock::Position::Left: - case Dock::Position::Right: { + case Dock::Position::Right: + m_toolLineLabel->setFixedSize(width() * 0.6, SPLITERSIZE); m_dateTimeWidget->setFixedSize(QWIDGETSIZE_MAX, m_dateTimeWidget->suitableSize().height()); m_systemPuginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPuginWidget->suitableSize().height()); m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, m_quickIconWidget->suitableSize().height()); m_trayView->setFixedSize(QWIDGETSIZE_MAX, m_trayView->suitableSize().height()); break; - } case Dock::Position::Top: - case Dock::Position::Bottom: { + case Dock::Position::Bottom: + m_toolLineLabel->setFixedSize(SPLITERSIZE, height() * 0.6); m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_systemPuginWidget->setFixedSize(m_systemPuginWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_trayView->setFixedSize(m_trayView->suitableSize().width(), QWIDGETSIZE_MAX); break; } - } Q_EMIT requestUpdate(); } diff --git a/frame/window/docktraywindow.h b/frame/window/docktraywindow.h index eb5f2def9..4f12df02b 100644 --- a/frame/window/docktraywindow.h +++ b/frame/window/docktraywindow.h @@ -70,7 +70,7 @@ private: void moveToolPlugin(); private Q_SLOTS: - void onResetLayout(); + void onUpdateComponentSize(); void onItemAdded(PluginsItemInterface *itemInter); void onItemRemove(PluginsItemInterface *itemInter); void onDropIcon(QDropEvent *dropEvent); diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index 3e843ff42..3945e8d57 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -134,12 +134,14 @@ void TrayDelegate::onUpdateExpand(bool on) model->setExpandVisible(true, true); } } else { + // 获取托盘内图标的数量 + int trayIconCount = TrayModel::getIconModel()->rowCount(); if (expandwidget) { // 如果释放鼠标,则判断当前鼠标的位置是否在托盘内部,如果在,则无需隐藏 QPoint currentPoint = QCursor::pos(); TrayGridWidget *view = ExpandIconWidget::popupTrayView(); - expandwidget->setTrayPanelVisible(view->geometry().contains(currentPoint)); - } else { + expandwidget->setTrayPanelVisible(view->geometry().contains(currentPoint) && (trayIconCount > 0)); + } else if (trayIconCount == 0) { ExpandIconWidget::popupTrayView()->hide(); } } diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index 525dd294a..35c55e82a 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -413,7 +413,7 @@ void TrayGridView::handleDropEvent(QDropEvent *e) info.pluginInter = (PluginsItemInterface *)(e->mimeData()->imageData().value()); QModelIndex targetIndex = getIndexFromPos(e->pos()); int index = -1; - if (targetIndex.isValid() && targetIndex.row() < dataModel->rowCount() - 1) { + if (targetIndex.isValid() && targetIndex.row() < dataModel->rowCount()) { // 如果拖动的位置是合法的位置,则让其插入到当前的位置 index = targetIndex.row(); dataModel->insertRow(index, info); @@ -435,8 +435,17 @@ void TrayGridView::onUpdateEditorView() for (int i = 0; i < model()->rowCount(); i++) { QModelIndex index = model()->index(i, 0); closePersistentEditor(index); - openPersistentEditor(index); } + // 在关闭QWidget后不要立即调用openPersistentEditor来打开 + // 因为closePersistentEditor后,异步删除QWidget,在关闭后,如果立即调用openPersistentEditor,在删除的时候,会把 + // 通过openPersistentEditor新建的QWidget给删除,引起bug,因此,在所有的都closePersistentEditor后,异步来调用 + // openPersistentEditor就不会出现这种问题 + QMetaObject::invokeMethod(this, [ = ] { + for (int i = 0; i < model()->rowCount(); i++) { + QModelIndex index = model()->index(i, 0); + openPersistentEditor(index); + } + }, Qt::QueuedConnection); } bool TrayGridView::beginDrag(Qt::DropActions supportedActions) @@ -492,27 +501,45 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) m_pressed = false; if (dropAct == Qt::IgnoreAction) { - QPropertyAnimation *posAni = new QPropertyAnimation(pixLabel, "pos", pixLabel); - connect(posAni, &QPropertyAnimation::finished, [ this, listModel, pixLabel, modelIndex, winInfo ] () { - pixLabel->hide(); - pixLabel->deleteLater(); - listModel->setDragKey(QString()); - listModel->insertRow(modelIndex.row(), winInfo); - clearDragModelIndex(); - listModel->setExpandVisible(!TrayModel::getIconModel()->isEmpty()); + if (listModel->isIconTray()) { + // 如果当前是从托盘区域释放,按照原来的流程走 + QPropertyAnimation *posAni = new QPropertyAnimation(pixLabel, "pos", pixLabel); + connect(posAni, &QPropertyAnimation::finished, [ this, listModel, pixLabel, modelIndex, winInfo ] () { + pixLabel->hide(); + pixLabel->deleteLater(); + listModel->setDragKey(QString()); + listModel->insertRow(modelIndex.row(), winInfo); + clearDragModelIndex(); + listModel->setExpandVisible(!TrayModel::getIconModel()->isEmpty()); - m_dropPos = QPoint(); - m_dragPos = QPoint(); + m_dropPos = QPoint(); + m_dragPos = QPoint(); + + onUpdateEditorView(); + Q_EMIT dragFinished(); + }); + + posAni->setEasingCurve(QEasingCurve::Linear); + posAni->setDuration(m_aniDuringTime); + posAni->setStartValue((QCursor::pos() - QPoint(0, pixLabel->height() / 2))); + posAni->setEndValue(mapToGlobal(m_dropPos) - QPoint(0, pixLabel->height() / 2)); + pixLabel->show(); + posAni->start(QAbstractAnimation::DeleteWhenStopped); - onUpdateEditorView(); Q_EMIT dragFinished(); - }); - posAni->setEasingCurve(QEasingCurve::Linear); - posAni->setDuration(m_aniDuringTime); - posAni->setStartValue((QCursor::pos() - QPoint(0, pixLabel->height() / 2))); - posAni->setEndValue(mapToGlobal(m_dropPos) - QPoint(0, pixLabel->height() / 2)); - pixLabel->show(); - posAni->start(QAbstractAnimation::DeleteWhenStopped); + } else { + // 如果当前是从任务栏区域释放,则将释放后的图标放到托盘 + listModel->setDragKey(QString()); + clearDragModelIndex(); + TrayModel *trayModel = TrayModel::getIconModel(); + trayModel->addRow(winInfo); + + m_dragPos = QPoint(); + m_dropPos = QPoint(); + + trayModel->saveConfig(-1, winInfo); + Q_EMIT dragFinished(); + } } else { listModel->setDragKey(QString()); clearDragModelIndex(); diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index 2f7c6f071..4ef2876b7 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -180,6 +180,14 @@ void TrayModel::setExpandVisible(bool visible, bool openExpand) } } +void TrayModel::updateOpenExpand(bool openExpand) +{ + for (WinInfo &winInfo : m_winInfos) { + if (winInfo.type == TrayIconType::ExpandIcon) + winInfo.expand = openExpand; + } +} + void TrayModel::setDragKey(const QString &key) { m_dragKey = key; @@ -765,10 +773,10 @@ void TrayModel::addRow(WinInfo info) return; } - beginInsertRows(QModelIndex(), rowCount(), rowCount()); + beginResetModel(); m_winInfos.append(info); sortItems(); - endInsertRows(); + endResetModel(); Q_EMIT requestRefreshEditor(); Q_EMIT rowCountChanged(); diff --git a/frame/window/tray/tray_model.h b/frame/window/tray/tray_model.h index 63887d28d..7eb6e25a6 100644 --- a/frame/window/tray/tray_model.h +++ b/frame/window/tray/tray_model.h @@ -97,6 +97,7 @@ public: void setDragingIndex(const QModelIndex index); void setDragDropIndex(const QModelIndex index); void setExpandVisible(bool visible, bool openExpand = false); + void updateOpenExpand(bool openExpand); void setDragKey(const QString &key); diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 79c3e5bf1..4e34c59d8 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -37,31 +37,8 @@ DGUI_USE_NAMESPACE ExpandIconWidget::ExpandIconWidget(QWidget *parent, Qt::WindowFlags f) : BaseTrayWidget(parent, f) - , m_regionInter(new DRegionMonitor(this)) , m_position(Dock::Position::Bottom) { - connect(m_regionInter, &DRegionMonitor::buttonPress, this, [ = ](const QPoint &mousePos, const int flag) { - TrayGridWidget *gridView = popupTrayView(); - // 如果当前是隐藏,那么在点击任何地方都隐藏 - if (!isVisible()) { - gridView->hide(); - return; - } - - if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) - return; - - QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); - const QRect rect = QRect(ptPos, size()); - if (rect.contains(mousePos)) - return; - - const QRect rctView(gridView->pos(), gridView->size()); - if (rctView.contains(mousePos)) - return; - - gridView->hide(); - }); } ExpandIconWidget::~ExpandIconWidget() @@ -94,10 +71,8 @@ void ExpandIconWidget::setTrayPanelVisible(bool visible) if (visible) { gridParentView->resetPosition(); gridParentView->show(); - m_regionInter->registerRegion(); } else { gridParentView->hide(); - m_regionInter->unregisterRegion(); } } @@ -117,6 +92,17 @@ void ExpandIconWidget::paintEvent(QPaintEvent *event) painter.drawPixmap(rectOfPixmap, pixmap); } +void ExpandIconWidget::moveEvent(QMoveEvent *event) +{ + BaseTrayWidget::moveEvent(event); + // 当前展开按钮位置发生变化的时候,需要同时改变托盘的位置 + QMetaObject::invokeMethod(this, [] { + TrayGridWidget *gridView = popupTrayView(); + if (gridView->isVisible()) + gridView->resetPosition(); + }, Qt::QueuedConnection); +} + const QString ExpandIconWidget::dropIconFile() const { QString arrow; @@ -207,7 +193,9 @@ TrayGridWidget::TrayGridWidget(QWidget *parent) , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) , m_trayGridView(nullptr) , m_referGridView(nullptr) + , m_regionInter(new DRegionMonitor(this)) { + initMember(); setAttribute(Qt::WA_TranslucentBackground); } @@ -278,6 +266,58 @@ void TrayGridWidget::paintEvent(QPaintEvent *event) painter.fillPath(path, maskColor()); } +void TrayGridWidget::showEvent(QShowEvent *event) +{ + m_regionInter->registerRegion(); + QWidget::showEvent(event); +} + +void TrayGridWidget::hideEvent(QHideEvent *event) +{ + m_regionInter->unregisterRegion(); + // 在当前托盘区域隐藏后,需要设置任务栏区域的展开按钮的托盘为隐藏状态 + TrayModel::getDockModel()->updateOpenExpand(false); + QWidget::hideEvent(event); +} + +void TrayGridWidget::initMember() +{ + connect(m_regionInter, &DRegionMonitor::buttonPress, this, [ = ](const QPoint &mousePos, const int flag) { + // 如果当前是隐藏,那么在点击任何地方都隐藏 + if (!isVisible()) { + hide(); + return; + } + + if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) + return; + + QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); + const QRect rect = QRect(ptPos, size()); + if (rect.contains(mousePos)) + return; + // 如果点击的是展开区域,则不做任何处理,因为点击展开区域自己会处理 + if (m_referGridView) { + QAbstractItemModel *model = m_referGridView->model(); + for (int i = 0; i < model->rowCount(); i++) { + ExpandIconWidget *widget = qobject_cast(m_referGridView->indexWidget(model->index(i, 0))); + if (!widget) + continue; + + QRect rectExpandWidget(widget->mapToGlobal(QPoint(0, 0)), widget->size()); + if (rectExpandWidget.contains(mousePos)) + return; + } + } + + const QRect rctView(pos(), size()); + if (rctView.contains(mousePos)) + return; + + hide(); + }); +} + QColor TrayGridWidget::maskColor() const { QColor color = DGuiApplicationHelper::standardPalette(DGuiApplicationHelper::instance()->themeType()).window().color(); diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h index 0aa5f57eb..bbf0918d3 100644 --- a/frame/window/tray/widgets/expandiconwidget.h +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -50,10 +50,10 @@ public: protected: void paintEvent(QPaintEvent *event) override; + void moveEvent(QMoveEvent *event) override; const QString dropIconFile() const; private: - Dtk::Gui::DRegionMonitor *m_regionInter; Dock::Position m_position; }; @@ -73,8 +73,11 @@ public: protected: void paintEvent(QPaintEvent *event) override; + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; private: + void initMember(); QColor maskColor() const; ExpandIconWidget *expandWidget() const; @@ -82,6 +85,7 @@ private: DockInter *m_dockInter; TrayGridView *m_trayGridView; TrayGridView *m_referGridView; + Dtk::Gui::DRegionMonitor *m_regionInter; static Dock::Position m_position; }; diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index bf7b12d2b..8facb65f0 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -129,11 +129,7 @@ void TrayManagerWindow::setPositon(Dock::Position position) m_quickIconWidget->setPositon(position); m_dateTimeWidget->setPositon(position); m_systemPluginWidget->setPositon(position); - if (m_model->hasExpand()) { - // 切换位置的时候,需要先关闭编辑器,然后在model函数的flag方法中打开 - m_trayView->closePersistentEditor(m_model->index(0, 0)); - } - + m_trayView->onUpdateEditorView(); updateLayout(); } From a41df224f66296b56f2e6b1159c8eb73ded52779 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 23 Nov 2022 05:27:16 +0000 Subject: [PATCH 155/257] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E8=AE=BE=E7=BD=AE=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E4=B8=BB=E9=A2=98=E4=B8=8B=E5=9B=BE=E6=A0=87=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、任务栏插件接口中增加根据主题来获取不同图标的接口 2、声音、蓝牙、电源、虚拟键盘、回收站等插件完善控制中心的接口 3、任务栏图标的显示根据不同的主题来获取 Log: 完善对控制中心设置不同主题的接口 Influence: 在控制中心切换主题,观察图标是否发生变化 Bug: https://pms.uniontech.com/bug-view-172365.html Change-Id: Ia02193c9ebcf10559195c6fb8fe6227f581e165b --- frame/controller/quicksettingcontroller.cpp | 9 ++-- frame/dbus/dbusdockadaptors.cpp | 36 +++++++++------ frame/dbus/dbusdockadaptors.h | 5 ++- frame/util/abstractpluginscontroller.cpp | 7 +++ frame/util/abstractpluginscontroller.h | 2 + frame/window/quickpluginwindow.cpp | 3 +- interfaces/pluginsiteminterface.h | 6 +++ plugins/bluetooth/bluetoothplugin.cpp | 12 +++++ plugins/bluetooth/bluetoothplugin.h | 1 + plugins/onboard/icon/dcc_keyboard.svg | 7 +++ plugins/onboard/onboard.qrc | 1 + plugins/onboard/onboardplugin.cpp | 3 ++ .../shutdown/resources/icons/dcc_shutdown.svg | 7 +++ plugins/shutdown/shutdown.qrc | 1 + plugins/shutdown/shutdownplugin.cpp | 5 ++- plugins/sound/sounditem.cpp | 44 +++++++++++++++++++ plugins/sound/sounditem.h | 1 + plugins/sound/soundplugin.cpp | 5 +++ plugins/sound/soundplugin.h | 1 + plugins/trash/icons/dcc_trash.svg | 9 ++++ plugins/trash/resource.qrc | 1 + plugins/trash/trashplugin.cpp | 8 ++++ plugins/trash/trashplugin.h | 1 + 23 files changed, 153 insertions(+), 22 deletions(-) create mode 100644 plugins/onboard/icon/dcc_keyboard.svg create mode 100644 plugins/shutdown/resources/icons/dcc_shutdown.svg create mode 100644 plugins/trash/icons/dcc_trash.svg diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 0a4717869..ab4d3186a 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -156,14 +156,15 @@ QList QuickSettingController::pluginInSettings() { QList settingPlugins; // 用于在控制中心显示可改变位置的插件,这里只提供 - QMap> &plugins = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginsMap(); - QList allPlugins = plugins.keys(); + QList allPlugins = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginCurrent(); for (PluginsItemInterface *plugin : allPlugins) { + if (plugin->pluginDisplayName().isEmpty()) + continue; + PluginAttribute pluginAttr = pluginAttribute(plugin); if (pluginAttr == QuickSettingController::PluginAttribute::Quick || pluginAttr == QuickSettingController::PluginAttribute::System - || pluginAttr == QuickSettingController::PluginAttribute::Tool - || pluginAttr == QuickSettingController::PluginAttribute::Tray) + || pluginAttr == QuickSettingController::PluginAttribute::Tool) settingPlugins << plugin; } diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index e45e87c2e..d22e17c1c 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -28,6 +28,8 @@ #include "pluginsitem.h" #include "settingconfig.h" +#include + #include #include #include @@ -39,14 +41,14 @@ QDebug operator<<(QDebug argument, const DockItemInfo &info) { argument << "name:" << info.name << ", displayName:" << info.displayName << "itemKey:" << info.itemKey << "SettingKey:" << info.settingKey - << "icon:" << info.icon << "visible:" << info.visible; + << "icon_light:" << info.iconLight << "icon_dark:" << info.iconDark << "visible:" << info.visible; return argument; } QDBusArgument &operator<<(QDBusArgument &arg, const DockItemInfo &info) { arg.beginStructure(); - arg << info.name << info.displayName << info.itemKey << info.settingKey << info.icon << info.visible; + arg << info.name << info.displayName << info.itemKey << info.settingKey << info.iconLight << info.iconDark << info.visible; arg.endStructure(); return arg; } @@ -54,7 +56,7 @@ QDBusArgument &operator<<(QDBusArgument &arg, const DockItemInfo &info) const QDBusArgument &operator>>(const QDBusArgument &arg, DockItemInfo &info) { arg.beginStructure(); - arg >> info.name >> info.displayName >> info.itemKey >> info.settingKey >> info.icon >> info.visible; + arg >> info.name >> info.displayName >> info.itemKey >> info.settingKey >> info.iconLight >> info.iconDark >> info.visible; arg.endStructure(); return arg; } @@ -180,12 +182,20 @@ DockItemInfos DBusDockAdaptors::plugins() info.settingKey = "Dock_Quick_Plugin_Name"; info.visible = quickSettingKeys.contains(info.itemKey); QSize pixmapSize; - QIcon icon = getSettingIcon(plugin, pixmapSize); - if (!icon.isNull()) { - QBuffer buffer(&info.icon); + QIcon lightIcon = getSettingIcon(plugin, pixmapSize, DGuiApplicationHelper::ColorType::LightType); + if (!lightIcon.isNull()) { + QBuffer buffer(&info.iconLight); if (buffer.open(QIODevice::WriteOnly)) { - QPixmap pixmap = icon.pixmap(pixmapSize); - pixmap.save(&buffer, "bmp"); + QPixmap pixmap = lightIcon.pixmap(pixmapSize); + pixmap.save(&buffer, "png"); + } + } + QIcon darkIcon = getSettingIcon(plugin, pixmapSize, DGuiApplicationHelper::ColorType::DarkType); + if (!darkIcon.isNull()) { + QBuffer buffer(&info.iconDark); + if (buffer.open(QIODevice::WriteOnly)) { + QPixmap pixmap = darkIcon.pixmap(pixmapSize); + pixmap.save(&buffer, "png"); } } pluginInfos << info; @@ -311,7 +321,7 @@ QList DBusDockAdaptors::localPlugins() const return QuickSettingController::instance()->pluginInSettings(); } -QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const +QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize, int colorType) const { auto iconSize = [](const QIcon &icon) { QList iconSizes = icon.availableSizes(); @@ -321,7 +331,7 @@ QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixm return defaultIconSize; }; // 先获取控制中心的设置图标 - QIcon icon = plugin->icon(DockPart::DCCSetting); + QIcon icon = plugin->icon(DockPart::DCCSetting, colorType); if (!icon.isNull()) { pixmapSize = iconSize(icon); return icon; @@ -331,7 +341,7 @@ QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixm QuickSettingController::PluginAttribute pluginAttr = QuickSettingController::instance()->pluginAttribute(plugin); switch(pluginAttr) { case QuickSettingController::PluginAttribute::System: { - icon = plugin->icon(DockPart::SystemPanel); + icon = plugin->icon(DockPart::SystemPanel, colorType); pixmapSize = defaultIconSize; QList iconSizes = icon.availableSizes(); if (iconSizes.size() > 0) @@ -339,9 +349,9 @@ QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixm break; } case QuickSettingController::PluginAttribute::Quick: { - icon = plugin->icon(DockPart::QuickShow); + icon = plugin->icon(DockPart::QuickShow, colorType); if (icon.isNull()) - icon = plugin->icon(DockPart::QuickPanel); + icon = plugin->icon(DockPart::QuickPanel, colorType); pixmapSize = defaultIconSize; QList iconSizes = icon.availableSizes(); if (iconSizes.size() > 0) diff --git a/frame/dbus/dbusdockadaptors.h b/frame/dbus/dbusdockadaptors.h index 1cb2faf91..9a443a87b 100644 --- a/frame/dbus/dbusdockadaptors.h +++ b/frame/dbus/dbusdockadaptors.h @@ -40,7 +40,8 @@ struct DockItemInfo QString displayName; QString itemKey; QString settingKey; - QByteArray icon; + QByteArray iconLight; + QByteArray iconDark; bool visible; }; @@ -135,7 +136,7 @@ signals: private: bool isPluginValid(const QString &name); QList localPlugins() const; - QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize) const; + QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize, int colorType) const; private: QGSettings *m_gsettings; diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index 82e39a555..b1fde6484 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -63,6 +63,11 @@ AbstractPluginsController::~AbstractPluginsController() } } +QList AbstractPluginsController::pluginCurrent() const +{ + return m_pluginExists; +} + void AbstractPluginsController::saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) { savePluginValue(getPluginInterface(itemInter), key, value); @@ -85,6 +90,7 @@ void AbstractPluginsController::itemAdded(PluginsItemInterface * const itemInter if (pluginAdapter) pluginAdapter->setItemKey(itemKey); + m_pluginExists << pluginItem; pluginItemAdded(pluginItem, itemKey); } @@ -95,6 +101,7 @@ void AbstractPluginsController::itemUpdate(PluginsItemInterface * const itemInte void AbstractPluginsController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) { + m_pluginExists.removeOne(itemInter); pluginItemRemoved(getPluginInterface(itemInter), itemKey); } diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index b53d15815..a366c0426 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -43,6 +43,7 @@ public: ~ AbstractPluginsController() override; void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {} + virtual QList pluginCurrent() const; virtual bool needLoad(PluginsItemInterface *) { return true; } QMap> &pluginsMap(); @@ -101,6 +102,7 @@ private: // filepath, interface, loaded QMap, bool> m_pluginLoadMap; + QList m_pluginExists; QJsonObject m_pluginSettingsObject; QMap m_pluginAdapterMap; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 7dc66c0cd..25787babd 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -655,7 +656,7 @@ void QuickDockItem::leaveEvent(QEvent *event) QPixmap QuickDockItem::iconPixmap() const { int pixmapSize = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); - QIcon icon = m_pluginItem->icon(DockPart::QuickShow); + QIcon icon = m_pluginItem->icon(DockPart::QuickShow, DGuiApplicationHelper::instance()->themeType()); if (!icon.isNull()) return icon.pixmap(pixmapSize, pixmapSize); diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index be7cd0a51..7aa1dd28d 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -278,6 +278,12 @@ public: /// virtual QString description() const { return QString(); } + /// + /// the icon for the plugin + /// themeType {0:UnknownType 1:LightType 2:DarkType} + /// + virtual QIcon icon(const DockPart &dockPart, int themeType) { return icon(dockPart); } + protected: /// /// \brief m_proxyInter diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index 7b70444fa..ca3ea7917 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -24,8 +24,12 @@ #include "bluetoothwidget.h" #include "adaptersmanager.h" +#include + #define STATE_KEY "enable" +DGUI_USE_NAMESPACE + BluetoothPlugin::BluetoothPlugin(QObject *parent) : QObject(parent) , m_adapterManager(new AdaptersManager(this)) @@ -150,6 +154,14 @@ QIcon BluetoothPlugin::icon(const DockPart &) return icon; } +QIcon BluetoothPlugin::icon(const DockPart &dockPart, int themeType) +{ + if (themeType == DGuiApplicationHelper::ColorType::DarkType) + return QIcon(":/bluetooth-active-symbolic.svg"); + + return QIcon(":/bluetooth-active-symbolic-dark.svg"); +} + PluginsItemInterface::PluginStatus BluetoothPlugin::status() const { if (m_bluetoothItem.data()->isPowered()) diff --git a/plugins/bluetooth/bluetoothplugin.h b/plugins/bluetooth/bluetoothplugin.h index 567c5fc2d..35e1bdb21 100644 --- a/plugins/bluetooth/bluetoothplugin.h +++ b/plugins/bluetooth/bluetoothplugin.h @@ -56,6 +56,7 @@ public: void pluginSettingsChanged() override; QIcon icon(const DockPart &) override; + QIcon icon(const DockPart &dockPart, int themeType) override; PluginStatus status() const override; QString description() const override; diff --git a/plugins/onboard/icon/dcc_keyboard.svg b/plugins/onboard/icon/dcc_keyboard.svg new file mode 100644 index 000000000..d9c5718b2 --- /dev/null +++ b/plugins/onboard/icon/dcc_keyboard.svg @@ -0,0 +1,7 @@ + + + icon/dock/keyboard + + + + \ No newline at end of file diff --git a/plugins/onboard/onboard.qrc b/plugins/onboard/onboard.qrc index 12c16ed6b..a067f2ebe 100644 --- a/plugins/onboard/onboard.qrc +++ b/plugins/onboard/onboard.qrc @@ -1,5 +1,6 @@ icon/deepin-virtualkeyboard.svg + icon/dcc_keyboard.svg diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index c1c5b51e6..f0cbb04c3 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -167,6 +167,9 @@ void OnboardPlugin::pluginSettingsChanged() QIcon OnboardPlugin::icon(const DockPart &dockPart) { + if (dockPart == DockPart::DCCSetting) + return QIcon(":/icons/icon/dcc_keyboard.svg"); + if (dockPart == DockPart::QuickPanel) return m_onboardItem->iconPixmap(24); diff --git a/plugins/shutdown/resources/icons/dcc_shutdown.svg b/plugins/shutdown/resources/icons/dcc_shutdown.svg new file mode 100644 index 000000000..66aea8e7c --- /dev/null +++ b/plugins/shutdown/resources/icons/dcc_shutdown.svg @@ -0,0 +1,7 @@ + + + icon/dock-set/power + + + + \ No newline at end of file diff --git a/plugins/shutdown/shutdown.qrc b/plugins/shutdown/shutdown.qrc index c1dc1f493..b82e12964 100644 --- a/plugins/shutdown/shutdown.qrc +++ b/plugins/shutdown/shutdown.qrc @@ -3,5 +3,6 @@ resources/icons/fashion.svg resources/icons/normal.svg resources/icons/system-shutdown.svg + resources/icons/dcc_shutdown.svg diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index 3461c244b..f1c0e2ab4 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -60,7 +60,7 @@ const QString ShutdownPlugin::pluginName() const const QString ShutdownPlugin::pluginDisplayName() const { - return tr("Power"); + return tr("shutdown"); } QWidget *ShutdownPlugin::itemWidget(const QString &itemKey) @@ -304,7 +304,8 @@ void ShutdownPlugin::pluginSettingsChanged() QIcon ShutdownPlugin::icon(const DockPart &dockPart) { - Q_UNUSED(dockPart); + if (dockPart == DockPart::DCCSetting) + return QIcon(":/icons/resources/icons/dcc_shutdown.svg"); QIcon shutdownIcon; shutdownIcon.addPixmap(m_shutdownWidget->loadPixmap()); diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 2b046ac28..cede35e59 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -254,6 +254,50 @@ QPixmap SoundItem::pixmap() const return m_iconPixmap; } +QPixmap SoundItem::pixmap(int colorType) const +{ + const Dock::DisplayMode displayMode = Dock::DisplayMode::Efficient; + + const double volmue = m_applet->volumeValue(); + const double maxVolmue = m_applet->maxVolumeValue(); + const bool mute = m_applet->existActiveOutputDevice() ? m_sinkInter->mute() : true; + + QString iconString; + if (displayMode == Dock::Fashion) { + QString volumeString; + if (volmue >= 1000) + volumeString = "100"; + else + volumeString = QString("0") + ('0' + int(volmue / 100)) + "0"; + + iconString = "audio-volume-" + volumeString; + + if (mute) + iconString += "-muted"; + } else { + QString volumeString; + if (mute) + volumeString = "muted"; + else if (int(volmue) == 0) + volumeString = "off"; + else if (volmue / maxVolmue > double(2) / 3) + volumeString = "high"; + else if (volmue / maxVolmue > double(1) / 3) + volumeString = "medium"; + else + volumeString = "low"; + + iconString = QString("audio-volume-%1-symbolic").arg(volumeString); + } + + const auto ratio = devicePixelRatioF(); + int iconSize = PLUGIN_ICON_MAX_SIZE; + if (colorType == DGuiApplicationHelper::LightType) + iconString.append(PLUGIN_MIN_ICON_NAME); + + return ImageUtil::loadSvg(iconString, ":/", iconSize, ratio); +} + void SoundItem::sinkChanged(DBusSink *sink) { m_sinkInter = sink; diff --git a/plugins/sound/sounditem.h b/plugins/sound/sounditem.h index d06b2d2e9..b1fdb79c2 100644 --- a/plugins/sound/sounditem.h +++ b/plugins/sound/sounditem.h @@ -51,6 +51,7 @@ public: void refreshIcon(); void refreshTips(const int volume, const bool force = false); QPixmap pixmap() const; + QPixmap pixmap(int colorType) const; signals: void requestContextMenu() const; diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 38f8b712b..969bd9407 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -148,6 +148,11 @@ QIcon SoundPlugin::icon(const DockPart &) return m_soundItem->pixmap(); } +QIcon SoundPlugin::icon(const DockPart &dockPart, int themeType) +{ + return m_soundItem->pixmap(themeType); +} + PluginsItemInterface::PluginStatus SoundPlugin::status() const { return SoundPlugin::Active; diff --git a/plugins/sound/soundplugin.h b/plugins/sound/soundplugin.h index 29c1ad3e4..ca3202862 100644 --- a/plugins/sound/soundplugin.h +++ b/plugins/sound/soundplugin.h @@ -52,6 +52,7 @@ public: void refreshIcon(const QString &itemKey) override; void pluginSettingsChanged() override; QIcon icon(const DockPart &) override; + QIcon icon(const DockPart &dockPart, int themeType) override; PluginStatus status() const override; private: diff --git a/plugins/trash/icons/dcc_trash.svg b/plugins/trash/icons/dcc_trash.svg new file mode 100644 index 000000000..05ce6decf --- /dev/null +++ b/plugins/trash/icons/dcc_trash.svg @@ -0,0 +1,9 @@ + + + icon/dock/trash + + + + + + \ No newline at end of file diff --git a/plugins/trash/resource.qrc b/plugins/trash/resource.qrc index 063a18597..8168ace5e 100644 --- a/plugins/trash/resource.qrc +++ b/plugins/trash/resource.qrc @@ -1,5 +1,6 @@ + icons/dcc_trash.svg icons/user-trash.svg diff --git a/plugins/trash/trashplugin.cpp b/plugins/trash/trashplugin.cpp index 9b547cf57..a87e14f47 100644 --- a/plugins/trash/trashplugin.cpp +++ b/plugins/trash/trashplugin.cpp @@ -188,6 +188,14 @@ void TrashPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } +QIcon TrashPlugin::icon(const DockPart &dockPart, int themeType) +{ + if (dockPart == DockPart::DCCSetting) + return QIcon(":/icons/dcc_trash.svg"); + + return QIcon(); +} + void TrashPlugin::refreshPluginItemsVisible() { if (pluginIsDisable()) { diff --git a/plugins/trash/trashplugin.h b/plugins/trash/trashplugin.h index 0e4902be5..0ac09d8e4 100644 --- a/plugins/trash/trashplugin.h +++ b/plugins/trash/trashplugin.h @@ -62,6 +62,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void displayModeChanged(const Dock::DisplayMode displayMode) override; void pluginSettingsChanged() override; + QIcon icon(const DockPart &dockPart, int themeType) override; private: void refreshPluginItemsVisible(); From 04756c8f38d0564a538ba581099c26127d8d0161 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 23 Nov 2022 16:10:24 +0800 Subject: [PATCH 156/257] =?UTF-8?q?fix:=20=E5=8E=BB=E6=8E=89=E7=94=B5?= =?UTF-8?q?=E6=B1=A0=E7=9A=84=E5=8F=B3=E9=94=AE=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除电池右键菜单接口 Log: Influence: 右键电池插件,观察是否存在菜单 Bug: https://pms.uniontech.com/bug-view-171753.html Change-Id: I305fd4b48c4b89d8fbf92f109eb401a6d6223a41 --- plugins/power/powerplugin.cpp | 25 ------------------------- plugins/power/powerplugin.h | 1 - 2 files changed, 26 deletions(-) diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index 6e83cec23..a55fe2123 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -122,31 +122,6 @@ const QString PowerPlugin::itemCommand(const QString &itemKey) return QString(); } -const QString PowerPlugin::itemContextMenu(const QString &itemKey) -{ - if (itemKey != POWER_KEY) { - return QString(); - } - - QList items; - items.reserve(6); - - if (!QFile::exists(ICBC_CONF_FILE)) { - QMap power; - power["itemId"] = "power"; - power["itemText"] = tr("Power settings"); - power["isActive"] = true; - items.push_back(power); - } - - QMap menu; - menu["items"] = items; - menu["checkableMenu"] = false; - menu["singleCheck"] = false; - - return QJsonDocument::fromVariant(menu).toJson(); -} - void PowerPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) { Q_UNUSED(itemKey) diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index 02911f7ff..8d2ae4420 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -52,7 +52,6 @@ public: QWidget *itemWidget(const QString &itemKey) override; QWidget *itemTipsWidget(const QString &itemKey) override; const QString itemCommand(const QString &itemKey) override; - const QString itemContextMenu(const QString &itemKey) override; void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; void refreshIcon(const QString &itemKey) override; int itemSortKey(const QString &itemKey) override; From 4c324fe87269405f35d31882c6bca14cc1e77775 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 23 Nov 2022 09:34:12 +0000 Subject: [PATCH 157/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E8=93=9D=E7=89=99=E8=AE=BE=E5=A4=87=E5=90=8E=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E4=BE=9D=E7=84=B6=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 记录子面板中当前显示的插件的指针,当移除插件时,回到主面板 Log: Influence: 从电脑上移除蓝牙设备,观察快捷区域和快捷面板是否还有蓝牙图标 Bug: https://pms.uniontech.com/bug-view-171533.html Change-Id: Ia4106d943d0f9df9788db1b87ef8d8fab31c6be3 --- frame/window/quickpluginwindow.cpp | 33 ++++++++++++++++++++++---- frame/window/quickpluginwindow.h | 6 ++--- frame/window/quicksettingcontainer.cpp | 7 +++++- frame/window/quicksettingcontainer.h | 1 + 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 25787babd..1b2c76ba4 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -63,9 +63,29 @@ typedef struct DragInfo{ if (dragPoint.isNull()) return false; - return (qAbs(currentPoint.x() - dragPoint.x()) >=5 || + if (!dragPixmap()) + return false; + + return (qAbs(currentPoint.x() - dragPoint.x()) >= 5 || qAbs(currentPoint.y() - dragPoint.y()) >= 5); } + + QPixmap dragPixmap() const { + if (!dockItem) + return QPixmap(); + + QPixmap pixmap = dockItem->pluginItem()->icon(DockPart::QuickShow).pixmap(QSize(ITEMSIZE, ITEMSIZE)); + if (!pixmap.isNull()) + return pixmap; + + QString itemKey = QuickSettingController::instance()->itemKey(dockItem->pluginItem()); + QWidget *itemWidget = dockItem->pluginItem()->itemWidget(itemKey); + if (!itemWidget) + return QPixmap(); + + itemWidget->setFixedSize(20, 20); + return itemWidget->grab(); + } } DragInfo; static QStringList fixedPluginNames{ "network", "sound", "power" }; @@ -235,7 +255,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) QMouseEvent *mouseEvent = static_cast(event); if (m_dragInfo->canDrag(mouseEvent->pos())) { - startDrag(m_dragInfo->dockItem->pluginItem()); + startDrag(); m_dragInfo->reset(); } break; @@ -349,14 +369,19 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do dockItem->update(); } -void QuickPluginWindow::startDrag(PluginsItemInterface *moveItem) +void QuickPluginWindow::startDrag() { + if (!m_dragInfo->dockItem) + return; + + PluginsItemInterface *moveItem = m_dragInfo->dockItem->pluginItem(); AppDrag *drag = new AppDrag(this, new QuickDragWidget); QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem); drag->setMimeData(mimedata); drag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size())); - QPixmap dragPixmap = moveItem->icon(DockPart::QuickPanel).pixmap(QSize(ITEMSIZE, ITEMSIZE)); + QPixmap dragPixmap = m_dragInfo->dragPixmap(); drag->setPixmap(dragPixmap); + drag->setHotSpot(QPoint(0, 0)); connect(drag->appDragWidget(), &AppDragWidget::requestSplitWindow, this, [ this, moveItem ] { diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 27fe3c09c..5bcdfa4f2 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -73,7 +73,7 @@ private Q_SLOTS: private: void initUi(); void initConnection(); - void startDrag(PluginsItemInterface *moveItem); + void startDrag(); PluginsItemInterface *findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems); int getDropIndex(QPoint point); QPoint popupPoint(QWidget *widget) const; @@ -106,12 +106,12 @@ protected: void enterEvent(QEvent *event) override; void leaveEvent(QEvent *event) override; - QPixmap iconPixmap() const; - private: QPoint topleftPoint() const; QPoint popupMarkPoint() const; + QPixmap iconPixmap() const; + private Q_SLOTS: void onMenuActionClicked(QAction *action); diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index e89ff39cd..9266d482c 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -80,6 +80,7 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_displaySettingWidget(new DisplaySettingWidget(this)) , m_childPage(new PluginChildPage(this)) , m_dragInfo(new struct QuickDragInfo) + , m_childShowPlugin(nullptr) { initUi(); initConnection(); @@ -94,6 +95,7 @@ QuickSettingContainer::~QuickSettingContainer() void QuickSettingContainer::showHomePage() { + m_childShowPlugin = nullptr; m_switchLayout->setCurrentIndex(0); } @@ -239,6 +241,8 @@ void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) m_quickSettings.removeOne(removeItem); removeItem->deleteLater(); + if (m_childShowPlugin == itemInter) + showHomePage(); updateItemLayout(); onResizeView(); @@ -250,7 +254,8 @@ void QuickSettingContainer::onShowChildWidget(QWidget *childWidget) if (!quickWidget) return; - showWidget(childWidget, quickWidget->pluginItem()->pluginDisplayName()); + m_childShowPlugin = quickWidget->pluginItem(); + showWidget(childWidget, m_childShowPlugin->pluginDisplayName()); onResizeView(); } diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 0fb6dab92..905b23fe7 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -103,6 +103,7 @@ private: PluginChildPage *m_childPage; QuickDragInfo *m_dragInfo; QList m_quickSettings; + PluginsItemInterface *m_childShowPlugin; }; class QuickPluginMimeData : public QMimeData From f14c19ba9edf71e99ba2be6b6ab3584de93b4ba8 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 23 Nov 2022 12:36:28 +0000 Subject: [PATCH 158/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E7=AC=AC=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E9=9C=80=E8=A6=81=E5=AF=86=E7=A0=81=E7=9A=84?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=E6=B2=A1=E6=9C=89=E5=BC=B9=E5=87=BA=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E9=9D=A2=E6=9D=BF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在任务栏插件区域接收到显示面板的请求的时候,先显示快捷面板,然后在快捷面板中显示请求的窗体 Log: Influence: 从控制中心第一次连接需要密码的网络,观察任务栏是否显示网络列表 Bug: https://pms.uniontech.com/bug-view-150395.html Change-Id: Idec2390a55a6236d336c52bf73a10448bc84615f --- frame/item/quicksettingitem.cpp | 15 ------- frame/item/quicksettingitem.h | 1 - frame/window/pluginchildpage.cpp | 5 +++ frame/window/pluginchildpage.h | 1 + frame/window/quickpluginwindow.cpp | 58 +++++++++++++++++--------- frame/window/quickpluginwindow.h | 2 + frame/window/quicksettingcontainer.cpp | 44 +++++++++++-------- frame/window/quicksettingcontainer.h | 7 +--- 8 files changed, 75 insertions(+), 58 deletions(-) diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 941fdcbf3..711c37443 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -55,7 +55,6 @@ QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, QWid { setAcceptDrops(true); this->installEventFilter(this); - connect(QuickSettingController::instance(), &QuickSettingController::requestAppletShow, this, &QuickSettingItem::onRequestAppletShow); } QuickSettingItem::~QuickSettingItem() @@ -129,20 +128,6 @@ QColor QuickSettingItem::foregroundColor() const return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); } -void QuickSettingItem::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) -{ - // 只显示当前的插件的内容 - if (itemInter != m_pluginInter) - return; - - // 显示弹出的内容 - QWidget *itemApplet = itemInter->itemPopupApplet(itemKey); - if (!itemApplet) - return; - - Q_EMIT requestShowChildWidget(itemApplet); -} - QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter) { // 如果显示在面板的图标或者Widget为空,则不让显示(例如电池插件) diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 3f53b955e..52e4c4879 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -53,7 +53,6 @@ Q_SIGNALS: protected: void paintEvent(QPaintEvent *e) override; QColor foregroundColor() const; - void onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey); private: PluginsItemInterface *m_pluginInter; diff --git a/frame/window/pluginchildpage.cpp b/frame/window/pluginchildpage.cpp index 42db178c5..06fdec370 100644 --- a/frame/window/pluginchildpage.cpp +++ b/frame/window/pluginchildpage.cpp @@ -64,6 +64,11 @@ void PluginChildPage::setTitle(const QString &text) m_title->setText(text); } +void PluginChildPage::setCanBack(bool canBack) +{ + m_back->setVisible(canBack); +} + bool PluginChildPage::isBack() { return m_isBack; diff --git a/frame/window/pluginchildpage.h b/frame/window/pluginchildpage.h index b94d87d13..cc8edc7a7 100644 --- a/frame/window/pluginchildpage.h +++ b/frame/window/pluginchildpage.h @@ -35,6 +35,7 @@ public: ~PluginChildPage() override; void pushWidget(QWidget *widget); void setTitle(const QString &text); + void setCanBack(bool canBack); bool isBack(); Q_SIGNALS: diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 1b2c76ba4..f96db2ba8 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -224,26 +224,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) if (m_dragInfo->canDrag(mouseEvent->pos())) break; - QuickDockItem *releaseItem = qobject_cast(watched); - if (!releaseItem) - break; - - DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); - if (Utils::IS_WAYLAND_DISPLAY) { - // TODO: 临时解决方案,如果是wayland环境,toolTip没有消失,因此,此处直接调用接口来隐藏 - for (int i = m_mainLayout->count() - 1; i >= 0; i--) { - QLayoutItem *layoutItem = m_mainLayout->itemAt(i); - if (!layoutItem) - continue; - - QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); - if (!dockItem) - continue; - - dockItem->hideToolTip(); - } - } - popWindow->show(popupPoint(releaseItem), true); + showPopup(qobject_cast(watched)); } while (false); m_dragInfo->reset(); @@ -369,6 +350,11 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do dockItem->update(); } +void QuickPluginWindow::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) +{ + showPopup(getDockItemByPlugin(itemInter), itemInter->itemPopupApplet(itemKey)); +} + void QuickPluginWindow::startDrag() { if (!m_dragInfo->dockItem) @@ -429,6 +415,37 @@ QuickDockItem *QuickPluginWindow::getActiveDockItem(QPoint point) const return selectWidget; } +void QuickPluginWindow::showPopup(QuickDockItem *item, QWidget *childPage) +{ + if (!isVisible() || !item) + return; + + bool canBack = true; + DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); + if (!popWindow->isVisible()) { + if (Utils::IS_WAYLAND_DISPLAY) { + // TODO: 临时解决方案,如果是wayland环境,toolTip没有消失,因此,此处直接调用接口来隐藏 + for (int i = m_mainLayout->count() - 1; i >= 0; i--) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); + if (!dockItem) + continue; + + dockItem->hideToolTip(); + } + } + + popWindow->show(popupPoint(item), true); + canBack = false; + } + + QuickSettingContainer *container = static_cast(popWindow->getContent()); + container->showPage(childPage, item->pluginItem(), canBack); +} + int QuickPluginWindow::getDropIndex(QPoint point) { QuickDockItem *targetItem = getActiveDockItem(point); @@ -534,6 +551,7 @@ void QuickPluginWindow::initConnection() QuickPluginModel *model = QuickPluginModel::instance(); connect(model, &QuickPluginModel::requestUpdate, this, &QuickPluginWindow::onRequestUpdate); connect(model, &QuickPluginModel::requestUpdatePlugin, this, &QuickPluginWindow::onUpdatePlugin); + connect(QuickSettingController::instance(), &QuickSettingController::requestAppletShow, this, &QuickPluginWindow::onRequestAppletShow); } /** diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 5bcdfa4f2..8e43c17c2 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -69,6 +69,7 @@ private Q_SLOTS: void onPluginDropItem(QDropEvent *event); void onPluginDragMove(QDragMoveEvent *event); void onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart); + void onRequestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); private: void initUi(); @@ -79,6 +80,7 @@ private: QPoint popupPoint(QWidget *widget) const; QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); QuickDockItem *getActiveDockItem(QPoint point) const; + void showPopup(QuickDockItem *item, QWidget *childPage = nullptr); private: QBoxLayout *m_mainLayout; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 9266d482c..28b3ce693 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -93,10 +93,20 @@ QuickSettingContainer::~QuickSettingContainer() delete m_dragInfo; } -void QuickSettingContainer::showHomePage() +void QuickSettingContainer::showPage(QWidget *widget, PluginsItemInterface *pluginInter, bool canBack) { - m_childShowPlugin = nullptr; - m_switchLayout->setCurrentIndex(0); + if (widget) { + m_childShowPlugin = pluginInter; + m_childPage->setTitle(pluginInter->pluginDisplayName()); + m_childPage->setCanBack(canBack); + m_childPage->pushWidget(widget); + m_switchLayout->setCurrentWidget(m_childPage); + } else { + m_childShowPlugin = nullptr; + m_switchLayout->setCurrentIndex(0); + } + + onResizeView(); } // 根据位置获取箭头的方向 @@ -120,7 +130,6 @@ DockPopupWindow *QuickSettingContainer::popWindow() { if (m_popWindow) { QuickSettingContainer *container = static_cast(m_popWindow->getContent()); - container->showHomePage(); return m_popWindow; } @@ -155,6 +164,17 @@ void QuickSettingContainer::setPosition(Position position) } } +void QuickSettingContainer::showPage(QWidget *widget, const QString &title, bool canBack) +{ + m_childShowPlugin = nullptr; + m_childPage->setTitle(title); + m_childPage->setCanBack(canBack); + m_childPage->pushWidget(widget); + m_switchLayout->setCurrentWidget(m_childPage); + + onResizeView(); +} + bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) { switch (event->type()) { @@ -183,13 +203,6 @@ bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) return QWidget::eventFilter(watched, event); } -void QuickSettingContainer::showWidget(QWidget *widget, const QString &title) -{ - m_childPage->setTitle(title); - m_childPage->pushWidget(widget); - m_switchLayout->setCurrentWidget(m_childPage); -} - QPoint QuickSettingContainer::hotSpot(const QPixmap &pixmap) { if (m_position == Dock::Position::Left) @@ -242,7 +255,7 @@ void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) m_quickSettings.removeOne(removeItem); removeItem->deleteLater(); if (m_childShowPlugin == itemInter) - showHomePage(); + showPage(nullptr); updateItemLayout(); onResizeView(); @@ -254,9 +267,7 @@ void QuickSettingContainer::onShowChildWidget(QWidget *childWidget) if (!quickWidget) return; - m_childShowPlugin = quickWidget->pluginItem(); - showWidget(childWidget, m_childShowPlugin->pluginDisplayName()); - onResizeView(); + showPage(childWidget, quickWidget->pluginItem(), true); } void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) @@ -416,8 +427,7 @@ void QuickSettingContainer::initConnection() connect(m_brihtnessWidget->sliderContainer(), &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &iconPosition) { if (iconPosition == SliderContainer::RightIcon) { // 点击右侧的按钮,弹出具体的调节的界面 - showWidget(m_displaySettingWidget, tr("brightness")); - onResizeView(); + showPage(m_displaySettingWidget, tr("brightness"), true); } }); connect(m_childPage, &PluginChildPage::back, this, [ this ] { diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 905b23fe7..160243a8f 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -54,6 +54,7 @@ class QuickSettingContainer : public QWidget public: static DockPopupWindow *popWindow(); static void setPosition(Dock::Position position); + void showPage(QWidget *widget, PluginsItemInterface *pluginInter = nullptr, bool canBack = false); protected: void mouseMoveEvent(QMouseEvent *event) override; @@ -61,7 +62,7 @@ protected: explicit QuickSettingContainer(QWidget *parent = nullptr); ~QuickSettingContainer() override; - void showHomePage(); + void showPage(QWidget *widget, const QString &title, bool canBack = false); private Q_SLOTS: void onPluginRemove(PluginsItemInterface *itemInter); @@ -76,10 +77,6 @@ private: void initConnection(); // 调整控件位置 void updateItemLayout(); - // 初始化控件项目 - // void initQuickItem(PluginsItemInterface *plugin); - // 显示具体的窗体 - void showWidget(QWidget *widget, const QString &title); // 获取拖动图标的热点 QPoint hotSpot(const QPixmap &pixmap); // 插入插件 From 9033044f0affdc478f94b457d430b618ec6705da Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 23 Nov 2022 13:39:16 +0000 Subject: [PATCH 159/257] =?UTF-8?q?fix:=20=E9=80=82=E9=85=8Dv20=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=9C=A8=E4=BB=BB=E5=8A=A1=E6=A0=8F=E7=9A=84=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对于V20的插件,由于没有实现Icon接口,因此在任务栏显示的时候依然将原来的itemWidget返回的内容显示在任务栏上 Log: Influence: 任务栏显示v20插件 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: Ic820ace51b018447942b7deb92c9ca567eba00e8 --- frame/item/components/singlequickitem.cpp | 4 -- frame/pluginadapter/pluginadapter.cpp | 14 ++-- frame/window/quickpluginwindow.cpp | 79 +++++++++++++++++------ frame/window/quickpluginwindow.h | 7 ++ 4 files changed, 72 insertions(+), 32 deletions(-) diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp index 83c8a4b82..61b796bb4 100644 --- a/frame/item/components/singlequickitem.cpp +++ b/frame/item/components/singlequickitem.cpp @@ -54,10 +54,6 @@ void SingleQuickItem::mouseReleaseEvent(QMouseEvent *event) commandArgument.removeFirst(); QProcess::startDetached(command, commandArgument); } - - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (itemWidget) - Q_EMIT requestShowChildWidget(itemWidget); } void SingleQuickItem::resizeEvent(QResizeEvent *event) diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp index dc2b72375..0e0443a07 100644 --- a/frame/pluginadapter/pluginadapter.cpp +++ b/frame/pluginadapter/pluginadapter.cpp @@ -169,14 +169,14 @@ QIcon PluginAdapter::icon(const DockPart &dockPart) return QIcon(); switch (dockPart) { - case DockPart::QuickPanel: { - // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); - return itemWidget->grab(); - } + case DockPart::QuickPanel: case DockPart::SystemPanel: { - itemWidget->setFixedSize(16, 16); - return itemWidget->grab(); + // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 + QSize oldSize = itemWidget->size(); + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + QPixmap pixmap = itemWidget->grab(); + itemWidget->setFixedSize(oldSize); + return pixmap; } default: break; } diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index f96db2ba8..50eb4286c 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -83,7 +83,6 @@ typedef struct DragInfo{ if (!itemWidget) return QPixmap(); - itemWidget->setFixedSize(20, 20); return itemWidget->grab(); } } DragInfo; @@ -568,21 +567,11 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject , m_popupWindow(new DockPopupWindow) , m_contextMenu(new QMenu(this)) , m_tipParent(nullptr) + , m_mainLayout(nullptr) { - m_popupWindow->setShadowBlurRadius(20); - m_popupWindow->setRadius(6); - m_popupWindow->setShadowYOffset(2); - m_popupWindow->setShadowXOffset(0); - m_popupWindow->setArrowWidth(18); - m_popupWindow->setArrowHeight(10); - m_popupWindow->setObjectName("quickitempopup"); - if (Utils::IS_WAYLAND_DISPLAY) { - Qt::WindowFlags flags = m_popupWindow->windowFlags() | Qt::FramelessWindowHint; - m_popupWindow->setWindowFlags(flags); - } - - connect(m_contextMenu, &QMenu::triggered, this, &QuickDockItem::onMenuActionClicked); - connect(qApp, &QApplication::aboutToQuit, m_popupWindow, &DockPopupWindow::deleteLater); + initUi(); + initConnection(); + initAttribute(); } QuickDockItem::~QuickDockItem() @@ -696,6 +685,28 @@ void QuickDockItem::leaveEvent(QEvent *event) m_popupWindow->hide(); } +void QuickDockItem::showEvent(QShowEvent *event) +{ + if (!m_mainLayout) + return QWidget::showEvent(event); + + QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); + if (itemWidget && m_mainLayout->indexOf(itemWidget) < 0) { + itemWidget->setFixedSize(ICONWIDTH - 2, ICONHEIGHT - 2); + m_mainLayout->addWidget(itemWidget); + } +} + +void QuickDockItem::hideEvent(QHideEvent *event) +{ + if (!m_mainLayout) + return QWidget::hideEvent(event); + + QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); + if (itemWidget && m_mainLayout->indexOf(itemWidget) >= 0) + m_mainLayout->removeWidget(m_pluginItem->itemWidget(m_itemKey)); +} + QPixmap QuickDockItem::iconPixmap() const { int pixmapSize = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); @@ -703,15 +714,41 @@ QPixmap QuickDockItem::iconPixmap() const if (!icon.isNull()) return icon.pixmap(pixmapSize, pixmapSize); - QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); - if (itemWidget) { - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); - return itemWidget->grab(); - } - return QPixmap(); } +void QuickDockItem::initUi() +{ + QPixmap pixmap = iconPixmap(); + if (!pixmap.isNull()) + return; + + m_mainLayout = new QHBoxLayout(this); + m_mainLayout->setContentsMargins(0, 0, 0, 0); + m_pluginItem->itemWidget(m_itemKey)->installEventFilter(this); +} + +void QuickDockItem::initAttribute() +{ + m_popupWindow->setShadowBlurRadius(20); + m_popupWindow->setRadius(6); + m_popupWindow->setShadowYOffset(2); + m_popupWindow->setShadowXOffset(0); + m_popupWindow->setArrowWidth(18); + m_popupWindow->setArrowHeight(10); + m_popupWindow->setObjectName("quickitempopup"); + if (Utils::IS_WAYLAND_DISPLAY) { + Qt::WindowFlags flags = m_popupWindow->windowFlags() | Qt::FramelessWindowHint; + m_popupWindow->setWindowFlags(flags); + } +} + +void QuickDockItem::initConnection() +{ + connect(m_contextMenu, &QMenu::triggered, this, &QuickDockItem::onMenuActionClicked); + connect(qApp, &QApplication::aboutToQuit, m_popupWindow, &DockPopupWindow::deleteLater); +} + QPoint QuickDockItem::topleftPoint() const { QPoint p = this->pos(); diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 8e43c17c2..16f3dc24f 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -107,6 +107,8 @@ protected: void mousePressEvent(QMouseEvent *event) override; void enterEvent(QEvent *event) override; void leaveEvent(QEvent *event) override; + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; private: QPoint topleftPoint() const; @@ -114,6 +116,10 @@ private: QPixmap iconPixmap() const; + void initUi(); + void initAttribute(); + void initConnection(); + private Q_SLOTS: void onMenuActionClicked(QAction *action); @@ -125,6 +131,7 @@ private: DockPopupWindow *m_popupWindow; QMenu *m_contextMenu; QWidget *m_tipParent; + QHBoxLayout *m_mainLayout; }; #endif // QUICKPLUGINWINDOW_H From 7ed4de91b8607839c47ae9a29d2c069174e02f24 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 24 Nov 2022 03:25:59 +0000 Subject: [PATCH 160/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=96=B0=E7=9A=84=E8=93=9D=E7=89=99=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=90=8E=E5=85=B6=E4=BB=96=E8=93=9D=E7=89=99=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=85=B3=E9=97=AD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原来新增的类中接收到蓝牙新增信号的时候,会对所有的蓝牙设备进行关闭操作,该类为冗余的类,删除即可 Log: Influence: 系统中已经存在一个蓝牙设备,且是打开状态,打开快捷面板,进入蓝牙详情页面,插入新的蓝牙设备,观察之前的蓝牙设备是否自动关闭 Bug: https://pms.uniontech.com/bug-view-171477.html Change-Id: I6355496ca1be494ccba59921e82cc1921f1ebfff --- plugins/bluetooth/bluetoothplugin.cpp | 2 - plugins/bluetooth/bluetoothplugin.h | 2 - plugins/bluetooth/bluetoothwidget.cpp | 137 -------------------------- plugins/bluetooth/bluetoothwidget.h | 62 ------------ 4 files changed, 203 deletions(-) delete mode 100644 plugins/bluetooth/bluetoothwidget.cpp delete mode 100644 plugins/bluetooth/bluetoothwidget.h diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index ca3ea7917..d41225505 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -21,7 +21,6 @@ */ #include "bluetoothplugin.h" -#include "bluetoothwidget.h" #include "adaptersmanager.h" #include @@ -34,7 +33,6 @@ BluetoothPlugin::BluetoothPlugin(QObject *parent) : QObject(parent) , m_adapterManager(new AdaptersManager(this)) , m_bluetoothItem(nullptr) - , m_bluetoothWidget(new BluetoothWidget(m_adapterManager)) { } diff --git a/plugins/bluetooth/bluetoothplugin.h b/plugins/bluetooth/bluetoothplugin.h index 35e1bdb21..83f907040 100644 --- a/plugins/bluetooth/bluetoothplugin.h +++ b/plugins/bluetooth/bluetoothplugin.h @@ -28,7 +28,6 @@ #include -class BluetoothWidget; class AdaptersManager; class BluetoothPlugin : public QObject, PluginsItemInterface @@ -66,7 +65,6 @@ private: private: AdaptersManager *m_adapterManager; QScopedPointer m_bluetoothItem; - QScopedPointer m_bluetoothWidget; bool m_enableState = true; }; diff --git a/plugins/bluetooth/bluetoothwidget.cpp b/plugins/bluetooth/bluetoothwidget.cpp deleted file mode 100644 index daf3f1408..000000000 --- a/plugins/bluetooth/bluetoothwidget.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "bluetoothwidget.h" -#include "adaptersmanager.h" -#include "bloothadapterwidget.h" -#include "adapter.h" -#include "device.h" - -#include -#include - -#include -#include - -BluetoothWidget::BluetoothWidget(AdaptersManager *adapterManager, QWidget *parent) - : QWidget(parent) - , m_switchButton(new DSwitchButton(this)) - , m_headerWidget(new QWidget(this)) - , m_adapterWidget(new QWidget(this)) - , m_adaptersManager(adapterManager) - , m_adapterLayout(new QVBoxLayout(m_adapterWidget)) -{ - initUi(); - initConnection(); -} - -BluetoothWidget::~BluetoothWidget() -{ -} - -void BluetoothWidget::onAdapterIncreased(Adapter *adapter) -{ - BloothAdapterWidget *adapterWidget = new BloothAdapterWidget(adapter, m_adapterWidget); - m_adapterLayout->addWidget(adapterWidget); - connect(adapterWidget, &BloothAdapterWidget::requestConnectDevice, this, [ this, adapter ](Device *device) { - m_adaptersManager->connectDevice(device, adapter); - }); - connect(adapterWidget, &BloothAdapterWidget::requestUpdate, this, [ this ] { - adjustHeight(); - }); - - updateCheckStatus(); - - QMetaObject::invokeMethod(this, &BluetoothWidget::adjustHeight, Qt::QueuedConnection); -} - -void BluetoothWidget::onAdapterDecreased(Adapter *adapter) -{ - for (int i = 0; i < m_adapterLayout->count(); i++) { - BloothAdapterWidget *adapterWidget = static_cast(m_adapterLayout->itemAt(i)->widget()); - if (adapterWidget && adapterWidget->adapter() == adapter) { - m_adapterLayout->removeWidget(adapterWidget); - - updateCheckStatus(); - QMetaObject::invokeMethod(this, &BluetoothWidget::adjustHeight, Qt::QueuedConnection); - break; - } - } -} - -void BluetoothWidget::onCheckedChanged(bool checked) -{ - QList adapters = m_adaptersManager->adapters(); - for (const Adapter *adapter : adapters) - m_adaptersManager->setAdapterPowered(adapter, checked); -} - -void BluetoothWidget::initUi() -{ - QHBoxLayout *headerLayout = new QHBoxLayout(m_headerWidget); - headerLayout->addStretch(); - headerLayout->addWidget(m_switchButton); - headerLayout->addStretch(); - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(0); - mainLayout->addWidget(m_headerWidget); - mainLayout->addSpacing(3); - mainLayout->addWidget(m_adapterWidget); - - m_adapterLayout->setContentsMargins(0, 0, 0, 0); - m_adapterLayout->setSpacing(0); - - QList adapters = m_adaptersManager->adapters(); - for (const Adapter *adapter : adapters) { - onAdapterIncreased(const_cast(adapter)); - } -} - -void BluetoothWidget::initConnection() -{ - connect(m_adaptersManager, &AdaptersManager::adapterIncreased, this, &BluetoothWidget::onAdapterIncreased); - connect(m_adaptersManager, &AdaptersManager::adapterDecreased, this, &BluetoothWidget::onAdapterDecreased); - connect(m_switchButton, &DSwitchButton::checkedChanged, this, &BluetoothWidget::onCheckedChanged); -} - -void BluetoothWidget::updateCheckStatus() -{ - bool checked = false; - QList adapters = m_adaptersManager->adapters(); - for (const Adapter *adapter : adapters) - checked = adapter->powered(); - - m_switchButton->setChecked(checked); -} - -void BluetoothWidget::adjustHeight() -{ - int height = m_switchButton->height() + m_headerWidget->height(); - for (int i = 0; i < m_adapterLayout->count(); i++) { - BloothAdapterWidget *adapterWidget = static_cast(m_adapterLayout->itemAt(i)->widget()); - if (!adapterWidget) - continue; - - height += adapterWidget->height(); - } - - setFixedHeight(height); -} diff --git a/plugins/bluetooth/bluetoothwidget.h b/plugins/bluetooth/bluetoothwidget.h deleted file mode 100644 index 109e65c38..000000000 --- a/plugins/bluetooth/bluetoothwidget.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef BLUETOOTHWIDGET_H -#define BLUETOOTHWIDGET_H - -#include - -class QLabel; -class AdaptersManager; -class Adapter; -class QVBoxLayout; - -namespace Dtk { namespace Widget { class DListView; class DSwitchButton; } } - -using namespace Dtk::Widget; - -class BluetoothWidget : public QWidget -{ - Q_OBJECT - -public: - explicit BluetoothWidget(AdaptersManager *adapterManager, QWidget *parent = nullptr); - ~BluetoothWidget() override; - -protected Q_SLOTS: - void onAdapterIncreased(Adapter *adapter); - void onAdapterDecreased(Adapter *adapter); - void onCheckedChanged(bool checked); - -private: - void initUi(); - void initConnection(); - void updateCheckStatus(); - void adjustHeight(); - -private: - DSwitchButton *m_switchButton; - QWidget *m_headerWidget; - QWidget *m_adapterWidget; - AdaptersManager *m_adaptersManager; - QVBoxLayout *m_adapterLayout; -}; - -#endif // BLUETOOTHWIDGET_H From 5f4c199ccc7395a7d55c9d65abcfa7564c0f6df1 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 24 Nov 2022 03:49:06 +0000 Subject: [PATCH 161/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E5=B1=95=E5=BC=80=E5=90=8E=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=BA=94=E7=94=A8=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=89=93=E5=BC=80=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 快捷面板的Qt::Popup影响了该功能,删除设置该标记即可 Log: Influence: 打开快捷面板,再打开任务栏应用,观察是否在关闭快捷面板的同时打开了任务栏的应用 Bug: https://pms.uniontech.com/bug-view-166029.html Change-Id: I6fb374fa5c33b7242cb4e80beabde8017a7ef4f3 --- frame/window/quicksettingcontainer.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 28b3ce693..88df9adba 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -128,13 +128,10 @@ static DArrowRectangle::ArrowDirection getDirection(const Dock::Position &positi DockPopupWindow *QuickSettingContainer::popWindow() { - if (m_popWindow) { - QuickSettingContainer *container = static_cast(m_popWindow->getContent()); + if (m_popWindow) return m_popWindow; - } m_popWindow = new DockPopupWindow; - m_popWindow->setWindowFlag(Qt::Popup); m_popWindow->setShadowBlurRadius(20); m_popWindow->setRadius(18); m_popWindow->setShadowYOffset(2); @@ -144,7 +141,7 @@ DockPopupWindow *QuickSettingContainer::popWindow() m_popWindow->setArrowDirection(getDirection(m_position)); m_popWindow->setContent(new QuickSettingContainer(m_popWindow)); if (Utils::IS_WAYLAND_DISPLAY) - m_popWindow->setWindowFlags(m_popWindow->windowFlags() | Qt::FramelessWindowHint | Qt::Popup); + m_popWindow->setWindowFlags(m_popWindow->windowFlags() | Qt::FramelessWindowHint); return m_popWindow; } From ec092bb9800df0f49eec50b7b0a1b49438378463 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 24 Nov 2022 08:14:19 +0000 Subject: [PATCH 162/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=8F=92=E4=BB=B6=E9=9F=B3=E9=87=8F=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 音量设备解析错误,没有和控制中心保持一致,参照之前的音量的解析逻辑重新来显示音量的功能即可 Log: Influence: 从任务栏打开音量,进入音量的详情页面,观察是否和控制中心一致 Bug: https://pms.uniontech.com/bug-view-165853.html Change-Id: I39a6b0664ac2adc40f2ea523d8e0693426640ae5 --- plugins/sound/soundapplet.cpp | 99 ++-------- plugins/sound/soundapplet.h | 60 +----- plugins/sound/sounddeviceport.cpp | 80 ++++++++ plugins/sound/sounddeviceport.h | 76 ++++++++ plugins/sound/sounddeviceswidget.cpp | 281 ++++++++++++++++++++++----- plugins/sound/sounddeviceswidget.h | 21 +- plugins/sound/sounditem.cpp | 6 +- plugins/sound/soundwidget.cpp | 7 +- 8 files changed, 446 insertions(+), 184 deletions(-) create mode 100644 plugins/sound/sounddeviceport.cpp create mode 100644 plugins/sound/sounddeviceport.h diff --git a/plugins/sound/soundapplet.cpp b/plugins/sound/soundapplet.cpp index 067b53c3e..af15ed692 100644 --- a/plugins/sound/soundapplet.cpp +++ b/plugins/sound/soundapplet.cpp @@ -20,6 +20,7 @@ */ #include "soundapplet.h" +#include "sounddeviceport.h" #include "util/horizontalseperator.h" #include "../widgets/tipswidget.h" #include "../frame/util/imageutil.h" @@ -52,64 +53,6 @@ DWIDGET_USE_NAMESPACE DGUI_USE_NAMESPACE using namespace Dock; -Q_DECLARE_METATYPE(const Port *) - -Port::Port(QObject *parent) - : QObject(parent) - , m_isActive(false) - , m_direction(Out) -{ - -} - -void Port::setId(const QString &id) -{ - if (id != m_id) { - m_id = id; - Q_EMIT idChanged(id); - } -} - -void Port::setName(const QString &name) -{ - if (name != m_name) { - m_name = name; - Q_EMIT nameChanged(name); - } -} - -void Port::setCardName(const QString &cardName) -{ - if (cardName != m_cardName) { - m_cardName = cardName; - Q_EMIT cardNameChanged(cardName); - } -} - -void Port::setIsActive(bool isActive) -{ - if (isActive != m_isActive) { - m_isActive = isActive; - Q_EMIT isActiveChanged(isActive); - } -} - -void Port::setDirection(const Direction &direction) -{ - if (direction != m_direction) { - m_direction = direction; - Q_EMIT directionChanged(direction); - } -} - -void Port::setCardId(const uint &cardId) -{ - if (cardId != m_cardId) { - m_cardId = cardId; - Q_EMIT cardIdChanged(cardId); - } -} - SoundApplet::SoundApplet(QWidget *parent) : QScrollArea(parent) , m_centralWidget(new QWidget(this)) @@ -235,7 +178,7 @@ void SoundApplet::initUi() portEnableChange(cardId, portId); });; connect(m_listView, &DListView::clicked, this, [this](const QModelIndex & idx) { - const Port * port = m_listView->model()->data(idx, Qt::WhatsThisPropertyRole).value(); + const SoundDevicePort *port = m_listView->model()->data(idx, Qt::WhatsThisPropertyRole).value(); if (port) { m_audioInter->SetPort(port->cardId(), port->id(), int(port->direction())); //手动勾选时启用设备 @@ -337,13 +280,13 @@ void SoundApplet::cardsChanged(const QString &cards) const QString portId = jPort["Name"].toString(); const QString portName = jPort["Description"].toString(); - Port *port = findPort(portId, cardId); + SoundDevicePort *port = findPort(portId, cardId); const bool include = port != nullptr; - if (!include) { port = new Port(m_model); } + if (!include) { port = new SoundDevicePort(m_model); } port->setId(portId); port->setName(portName); - port->setDirection(Port::Direction(jPort["Direction"].toDouble())); + port->setDirection(SoundDevicePort::Direction(jPort["Direction"].toDouble())); port->setCardId(cardId); port->setCardName(cardName); @@ -360,7 +303,7 @@ void SoundApplet::cardsChanged(const QString &cards) onDefaultSinkChanged();//重新获取切换的设备信息 enableDevice(existActiveOutputDevice()); - for (Port *port : m_ports) { + for (SoundDevicePort *port : m_ports) { //只要有一个设备在控制中心被禁用后,在任务栏声音设备列表中该设备会被移除, if (!m_audioInter->IsPortEnabled(port->cardId(), port->id())) { removeDisabledDevice(port->id(), port->cardId()); @@ -428,9 +371,9 @@ void SoundApplet::refreshIcon() * @brief SoundApplet::startAddPort 添加端口前判断 * @param port 端口 */ -void SoundApplet::startAddPort(Port *port) +void SoundApplet::startAddPort(SoundDevicePort *port) { - if (!containsPort(port) && port->direction() == Port::Out) { + if (!containsPort(port) && port->direction() == SoundDevicePort::Out) { m_ports.append(port); addPort(port); } @@ -443,7 +386,7 @@ void SoundApplet::startAddPort(Port *port) */ void SoundApplet::startRemovePort(const QString &portId, const uint &cardId) { - Port *port = findPort(portId, cardId); + SoundDevicePort *port = findPort(portId, cardId); if (port) { m_ports.removeOne(port); port->deleteLater(); @@ -451,14 +394,14 @@ void SoundApplet::startRemovePort(const QString &portId, const uint &cardId) } } -bool SoundApplet::containsPort(const Port *port) +bool SoundApplet::containsPort(const SoundDevicePort *port) { return findPort(port->id(), port->cardId()) != nullptr; } -Port *SoundApplet::findPort(const QString &portId, const uint &cardId) const +SoundDevicePort *SoundApplet::findPort(const QString &portId, const uint &cardId) const { - auto it = std::find_if(m_ports.begin(), m_ports.end(), [ = ] (Port *p) { + auto it = std::find_if(m_ports.begin(), m_ports.end(), [ = ] (SoundDevicePort *p) { return (p->id() == portId && p->cardId() == cardId); }); @@ -469,23 +412,23 @@ Port *SoundApplet::findPort(const QString &portId, const uint &cardId) const return nullptr; } -void SoundApplet::addPort(const Port *port) +void SoundApplet::addPort(const SoundDevicePort *port) { DStandardItem *pi = new DStandardItem; QString deviceName = port->name() + "(" + port->cardName() + ")"; pi->setText(deviceName); pi->setTextColorRole(QPalette::BrightText); - pi->setData(QVariant::fromValue(port), Qt::WhatsThisPropertyRole); + pi->setData(QVariant::fromValue(port), Qt::WhatsThisPropertyRole); - connect(port, &Port::nameChanged, this, [ = ](const QString &str) { + connect(port, &SoundDevicePort::nameChanged, this, [ = ](const QString &str) { QString devName = str + "(" + port->cardName() + ")"; pi->setText(devName); }); - connect(port, &Port::cardNameChanged, this, [ = ](const QString &str) { + connect(port, &SoundDevicePort::cardNameChanged, this, [ = ](const QString &str) { QString devName = port->name() + "(" + str + ")"; pi->setText(devName); }); - connect(port, &Port::isActiveChanged, this, [ = ](bool isActive) { + connect(port, &SoundDevicePort::isActiveChanged, this, [ = ](bool isActive) { pi->setCheckState(isActive ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); }); @@ -504,7 +447,7 @@ void SoundApplet::removePort(const QString &portId, const uint &cardId) auto rmFunc = [ = ](QStandardItemModel * model) { for (int i = 0; i < model->rowCount();) { auto item = model->item(i); - auto port = item->data(Qt::WhatsThisPropertyRole).value(); + auto port = item->data(Qt::WhatsThisPropertyRole).value(); if (port->id() == portId && cardId == port->cardId()) { model->removeRow(i); break; @@ -526,7 +469,7 @@ void SoundApplet::removePort(const QString &portId, const uint &cardId) */ void SoundApplet::activePort(const QString &portId, const uint &cardId) { - for (Port *it : m_ports) { + for (SoundDevicePort *it : m_ports) { if (it->id() == portId && it->cardId() == cardId) { it->setIsActive(true); enableDevice(true); @@ -562,7 +505,7 @@ void SoundApplet::enableDevice(bool flag) void SoundApplet::disableAllDevice() { - for (Port *port : m_ports) { + for (SoundDevicePort *port : m_ports) { port->setIsActive(false); } } @@ -574,7 +517,7 @@ void SoundApplet::disableAllDevice() void SoundApplet::removeLastDevice() { if (m_ports.count() == 1 && m_ports.at(0)) { - m_lastPort = new Port(m_model); + m_lastPort = new SoundDevicePort(m_model); m_lastPort->setId(m_ports.at(0)->id()); m_lastPort->setName(m_ports.at(0)->name()); m_lastPort->setDirection(m_ports.at(0)->direction()); diff --git a/plugins/sound/soundapplet.h b/plugins/sound/soundapplet.h index 95aaa8164..245dc3a86 100644 --- a/plugins/sound/soundapplet.h +++ b/plugins/sound/soundapplet.h @@ -43,58 +43,12 @@ using DBusSink = org::deepin::daemon::audio1::Sink; class HorizontalSeperator; class QGSettings; +class SoundDevicePort; namespace Dock { class TipsWidget; } -class Port : public QObject -{ - Q_OBJECT -public: - enum Direction { - Out = 1, - In = 2 - }; - - explicit Port(QObject *parent = nullptr); - virtual ~Port() {} - - inline QString id() const { return m_id; } - void setId(const QString &id); - - inline QString name() const { return m_name; } - void setName(const QString &name); - - inline QString cardName() const { return m_cardName; } - void setCardName(const QString &cardName); - - inline bool isActive() const { return m_isActive; } - void setIsActive(bool isActive); - - inline Direction direction() const { return m_direction; } - void setDirection(const Direction &direction); - - inline uint cardId() const { return m_cardId; } - void setCardId(const uint &cardId); - -Q_SIGNALS: - void idChanged(QString id) const; - void nameChanged(QString name) const; - void cardNameChanged(QString name) const; - void isActiveChanged(bool ative) const; - void directionChanged(Direction direction) const; - void cardIdChanged(uint cardId) const; - -private: - QString m_id; - QString m_name; - uint m_cardId; - QString m_cardName; - bool m_isActive; - Direction m_direction; -}; - class BackgroundWidget : public QWidget { public: @@ -128,10 +82,10 @@ public: int volumeValue() const; int maxVolumeValue() const; VolumeSlider *mainSlider(); - void startAddPort(Port *port); + void startAddPort(SoundDevicePort *port); void startRemovePort(const QString &portId, const uint &cardId); - bool containsPort(const Port *port); - Port *findPort(const QString &portId, const uint &cardId) const; + bool containsPort(const SoundDevicePort *port); + SoundDevicePort *findPort(const QString &portId, const uint &cardId) const; void setUnchecked(DStandardItem *pi); void initUi(); @@ -148,7 +102,7 @@ private slots: void increaseVolumeChanged(); void cardsChanged(const QString &cards); void removePort(const QString &portId, const uint &cardId); - void addPort(const Port *port); + void addPort(const SoundDevicePort *port); void activePort(const QString &portId,const uint &cardId); void haldleDbusSignal(const QDBusMessage &msg); void updateListHeight(); @@ -181,9 +135,9 @@ private: DBusSink *m_defSinkInter; DTK_WIDGET_NAMESPACE::DListView *m_listView; QStandardItemModel *m_model; - QList m_ports; + QList m_ports; QString m_deviceInfo; - QPointer m_lastPort;//最后一个因为只有一个设备而被直接移除的设备 + QPointer m_lastPort;//最后一个因为只有一个设备而被直接移除的设备 const QGSettings *m_gsettings; }; diff --git a/plugins/sound/sounddeviceport.cpp b/plugins/sound/sounddeviceport.cpp new file mode 100644 index 000000000..ea4d48519 --- /dev/null +++ b/plugins/sound/sounddeviceport.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "sounddeviceport.h" + +SoundDevicePort::SoundDevicePort(QObject *parent) + : QObject(parent) + , m_isActive(false) + , m_direction(Out) +{ +} + +SoundDevicePort::~SoundDevicePort() +{ +} + +void SoundDevicePort::setId(const QString &id) +{ + if (id != m_id) { + m_id = id; + Q_EMIT idChanged(id); + } +} + +void SoundDevicePort::setName(const QString &name) +{ + if (name != m_name) { + m_name = name; + Q_EMIT nameChanged(name); + } +} + +void SoundDevicePort::setCardName(const QString &cardName) +{ + if (cardName != m_cardName) { + m_cardName = cardName; + Q_EMIT cardNameChanged(cardName); + } +} + +void SoundDevicePort::setIsActive(bool isActive) +{ + if (isActive != m_isActive) { + m_isActive = isActive; + Q_EMIT isActiveChanged(isActive); + } +} + +void SoundDevicePort::setDirection(const Direction &direction) +{ + if (direction != m_direction) { + m_direction = direction; + Q_EMIT directionChanged(direction); + } +} + +void SoundDevicePort::setCardId(const uint &cardId) +{ + if (cardId != m_cardId) { + m_cardId = cardId; + Q_EMIT cardIdChanged(cardId); + } +} diff --git a/plugins/sound/sounddeviceport.h b/plugins/sound/sounddeviceport.h new file mode 100644 index 000000000..8a035c6b1 --- /dev/null +++ b/plugins/sound/sounddeviceport.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef SOUNDDEVICEPORT_H +#define SOUNDDEVICEPORT_H + +#include + +class SoundDevicePort : public QObject +{ + Q_OBJECT + +public: + enum Direction { + Out = 1, + In = 2 + }; + + explicit SoundDevicePort(QObject *parent = nullptr); + virtual ~SoundDevicePort(); + + inline QString id() const { return m_id; } + void setId(const QString &id); + + inline QString name() const { return m_name; } + void setName(const QString &name); + + inline QString cardName() const { return m_cardName; } + void setCardName(const QString &cardName); + + inline bool isActive() const { return m_isActive; } + void setIsActive(bool isActive); + + inline Direction direction() const { return m_direction; } + void setDirection(const Direction &direction); + + inline uint cardId() const { return m_cardId; } + void setCardId(const uint &cardId); + +Q_SIGNALS: + void idChanged(const QString &id) const; + void nameChanged(const QString &name) const; + void cardNameChanged(const QString &name) const; + void isActiveChanged(bool ative) const; + void directionChanged(Direction direction) const; + void cardIdChanged(uint cardId) const; + +private: + QString m_id; + QString m_name; + uint m_cardId; + QString m_cardName; + bool m_isActive; + Direction m_direction; +}; + +Q_DECLARE_METATYPE(const SoundDevicePort *) + +#endif // SOUNDDEVICEPORT_H diff --git a/plugins/sound/sounddeviceswidget.cpp b/plugins/sound/sounddeviceswidget.cpp index 907b25d00..bb4e4850d 100644 --- a/plugins/sound/sounddeviceswidget.cpp +++ b/plugins/sound/sounddeviceswidget.cpp @@ -23,6 +23,7 @@ #include "settingdelegate.h" #include "imageutil.h" #include "slidercontainer.h" +#include "sounddeviceport.h" #include #include @@ -47,7 +48,7 @@ DWIDGET_USE_NAMESPACE #define AUDIOPORT 0 #define AUDIOSETTING 1 -const int cardIdRole = itemFlagRole + 1; +const int sortRole = itemFlagRole + 1; SoundDevicesWidget::SoundDevicesWidget(QWidget *parent) : QWidget(parent) @@ -55,10 +56,11 @@ SoundDevicesWidget::SoundDevicesWidget(QWidget *parent) , m_sliderContainer(new SliderContainer(m_sliderParent)) , m_descriptionLabel(new QLabel(tr("Output Device"), this)) , m_deviceList(new DListView(this)) - , m_volumeModel(new DBusAudio("org.deepin.daemon.Audio1", "/org/deepin/daemon/Audio1", QDBusConnection::sessionBus(), this)) - , m_audioSink(new DBusSink("org.deepin.daemon.Audio1", m_volumeModel->defaultSink().path(), QDBusConnection::sessionBus(), this)) + , m_soundInter(new DBusAudio("org.deepin.daemon.Audio1", "/org/deepin/daemon/Audio1", QDBusConnection::sessionBus(), this)) + , m_sinkInter(new DBusSink("org.deepin.daemon.Audio1", m_soundInter->defaultSink().path(), QDBusConnection::sessionBus(), this)) , m_model(new QStandardItemModel(this)) , m_delegate(new SettingDelegate(m_deviceList)) + , m_lastPort(nullptr) { initUi(); initConnection(); @@ -132,32 +134,9 @@ void SoundDevicesWidget::initUi() m_deviceList->setSpacing(10); m_deviceList->setItemDelegate(m_delegate); -} - -void SoundDevicesWidget::onAudioDevicesChanged() -{ - QList ports = m_audioSink->ports(); - for (AudioPort port : ports) { - if (port.availability != 0 && port.availability != 2) - continue; - - uint cardId = audioPortCardId(port); - if (!m_volumeModel->IsPortEnabled(cardId, port.name)) - continue; - - DStandardItem *item = new DStandardItem; - item->setText(QString("%1(%2)").arg(port.description).arg(port.name)); - item->setIcon(QIcon(soundIconFile(port))); - item->setFlags(Qt::NoItemFlags); - item->setData(port.availability == 2, itemCheckRole); - item->setData(QVariant::fromValue(port), itemDataRole); - item->setData(AUDIOPORT, itemFlagRole); - item->setData(cardId, cardIdRole); - m_model->appendRow(item); - if (port.availability == 2) - m_deviceList->setCurrentIndex(m_model->indexFromItem(item)); - } + m_model->setSortRole(sortRole); + // 增加音量设置 DStandardItem *settingItem = new DStandardItem; settingItem->setText(tr("Sound settings")); settingItem->setFlags(Qt::NoItemFlags); @@ -166,22 +145,202 @@ void SoundDevicesWidget::onAudioDevicesChanged() m_model->appendRow(settingItem); } +void SoundDevicesWidget::onAudioDevicesChanged() +{ + QMap tmpCardIds; + const QString cards = m_soundInter->cardsWithoutUnavailable(); + QJsonDocument doc = QJsonDocument::fromJson(cards.toUtf8()); + QJsonArray jCards = doc.array(); + for (QJsonValue cV : jCards) { + QJsonObject jCard = cV.toObject(); + const uint cardId = jCard["Id"].toInt(); + const QString cardName = jCard["Name"].toString(); + QJsonArray jPorts = jCard["Ports"].toArray(); + + QStringList tmpPorts; + + for (QJsonValue pV : jPorts) { + QJsonObject jPort = pV.toObject(); + const double portAvai = jPort["Available"].toDouble(); + if (portAvai == 2 || portAvai == 0 ) { + const QString portId = jPort["Name"].toString(); + const QString portName = jPort["Description"].toString(); + + SoundDevicePort *port = findPort(portId, cardId); + bool includePort = (port != nullptr); + if (!port) + port = new SoundDevicePort(m_model); + + port->setId(portId); + port->setName(portName); + port->setDirection(SoundDevicePort::Direction(jPort["Direction"].toDouble())); + port->setCardId(cardId); + port->setCardName(cardName); + + if (!includePort) + startAddPort(port); + + tmpPorts << portId; + } + } + tmpCardIds.insert(cardId, tmpPorts); + } + + onDefaultSinkChanged(m_soundInter->defaultSink());//重新获取切换的设备信息 + + for (SoundDevicePort *port : m_ports) { + //只要有一个设备在控制中心被禁用后,在任务栏声音设备列表中该设备会被移除, + if (!m_soundInter->IsPortEnabled(port->cardId(), port->id())) { + removeDisabledDevice(port->id(), port->cardId()); + } + //判断端口是否在最新的设备列表中 + if (tmpCardIds.contains(port->cardId())) { + if (!tmpCardIds[port->cardId()].contains(port->id())) { + startRemovePort(port->id(), port->cardId()); + } + } + else { + startRemovePort(port->id(), port->cardId()); + } + } + //当只有一个设备剩余时,该设备也需要移除 + removeLastDevice(); +} + void SoundDevicesWidget::initConnection() { - connect(m_audioSink, &DBusSink::VolumeChanged, this, [ = ](double value) { m_sliderContainer->updateSliderValue(value * 100); }); - connect(m_volumeModel, &DBusAudio::DefaultSinkChanged, this, &SoundDevicesWidget::onDefaultSinkChanged); + connect(m_sinkInter, &DBusSink::VolumeChanged, this, [ = ](double value) { m_sliderContainer->updateSliderValue(value * 100); }); + connect(m_sinkInter, &DBusSink::MuteChanged, this, [ = ] { m_sliderContainer->updateSliderValue(m_sinkInter->volume() * 100); }); + connect(m_soundInter, &DBusAudio::DefaultSinkChanged, this, &SoundDevicesWidget::onDefaultSinkChanged); connect(m_delegate, &SettingDelegate::selectIndexChanged, this, &SoundDevicesWidget::onSelectIndexChanged); - connect(m_volumeModel, &DBusAudio::PortEnabledChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); - connect(m_volumeModel, &DBusAudio::CardsWithoutUnavailableChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); + connect(m_soundInter, &DBusAudio::PortEnabledChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); + connect(m_soundInter, &DBusAudio::CardsWithoutUnavailableChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { - m_audioSink->SetVolume(value * 0.01, true); + m_sinkInter->SetVolume(value * 0.01, true); }); } +/** + * @brief SoundApplet::startAddPort 添加端口前判断 + * @param port 端口 + */ +void SoundDevicesWidget::startAddPort(SoundDevicePort *port) +{ + if (findPort(port->id(), port->cardId())) + return; + + if (port->direction() == SoundDevicePort::Out) { + m_ports.append(port); + addPort(port); + } +} + +void SoundDevicesWidget::startRemovePort(const QString &portId, const uint &cardId) +{ + SoundDevicePort *port = findPort(portId, cardId); + if (port) { + m_ports.removeOne(port); + port->deleteLater(); + removePort(portId, cardId); + } +} + +void SoundDevicesWidget::addPort(const SoundDevicePort *port) +{ + DStandardItem *portItem = new DStandardItem; + QString deviceName = port->name() + "(" + port->cardName() + ")"; + portItem->setIcon(QIcon(soundIconFile())); + portItem->setText(deviceName); + portItem->setTextColorRole(QPalette::BrightText); + portItem->setData(QVariant::fromValue(port), itemDataRole); + portItem->setData(port->isActive(), itemCheckRole); + portItem->setData(AUDIOPORT, itemFlagRole); + + connect(port, &SoundDevicePort::nameChanged, this, [ = ](const QString &str) { + QString devName = str + "(" + port->cardName() + ")"; + portItem->setText(devName); + }); + connect(port, &SoundDevicePort::cardNameChanged, this, [ = ](const QString &str) { + QString devName = port->name() + "(" + str + ")"; + portItem->setText(devName); + }); + connect(port, &SoundDevicePort::isActiveChanged, this, [ = ](bool isActive) { + portItem->setCheckState(isActive ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); + }); + + if (port->isActive()) { + portItem->setCheckState(Qt::CheckState::Checked); + } + + m_model->appendRow(portItem); + // 遍历列表,依次对不同的设备排序 + int row = 0; + int rowCount = m_model->rowCount(); + for (int i = 0; i < rowCount; i++) { + QStandardItem *item = m_model->item(i); + if (item->data(itemFlagRole).toInt() == AUDIOSETTING) { + item->setData(rowCount - 1, sortRole); + } else { + item->setData(row, sortRole); + row++; + } + } + + m_model->sort(0); +} + +void SoundDevicesWidget::removePort(const QString &portId, const uint &cardId) +{ + int removeRow = -1; + for (int i = 0; i < m_model->rowCount(); i++) { + QStandardItem *item = m_model->item(i); + if (item->data(itemFlagRole).toInt() != AUDIOPORT) + continue; + + const SoundDevicePort *port = item->data(itemDataRole).value(); + if (port && port->id() == portId && cardId == port->cardId()) { + removeRow = i; + break; + } + } + + if (removeRow >= 0) + m_model->removeRow(removeRow); +} + +void SoundDevicesWidget::activePort(const QString &portId, const uint &cardId) +{ + for (SoundDevicePort *it : m_ports) + it->setIsActive(it->id() == portId && it->cardId() == cardId); +} + +void SoundDevicesWidget::removeLastDevice() +{ + if (m_ports.count() == 1 && m_ports.at(0)) { + m_lastPort = new SoundDevicePort(m_model); + m_lastPort->setId(m_ports.at(0)->id()); + m_lastPort->setName(m_ports.at(0)->name()); + m_lastPort->setDirection(m_ports.at(0)->direction()); + m_lastPort->setCardId(m_ports.at(0)->cardId()); + m_lastPort->setCardName(m_ports.at(0)->cardName()); + startRemovePort(m_ports.at(0)->id(), m_ports.at(0)->cardId()); + qDebug() << "remove last output device"; + } +} + +void SoundDevicesWidget::removeDisabledDevice(QString portId, unsigned int cardId) +{ + startRemovePort(portId, cardId); + if (m_sinkInter->activePort().name == portId && m_sinkInter->card() == cardId) { + for (SoundDevicePort *port : m_ports) + port->setIsActive(false); + } +} + QString SoundDevicesWidget::leftIcon() { - QString iconLeft = QString(":/icons/resources/audio-volume-%1").arg(m_audioSink->mute() ? "muted" : "low"); + QString iconLeft = QString(":/icons/resources/audio-volume-%1").arg(m_sinkInter->mute() ? "muted" : "low"); if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) iconLeft.append("-dark"); @@ -197,7 +356,7 @@ QString SoundDevicesWidget::rightIcon() return iconRight; } -const QString SoundDevicesWidget::soundIconFile(const AudioPort port) const +const QString SoundDevicesWidget::soundIconFile() const { if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) return QString(":/icons/resources/ICON_Device_Laptop_dark.svg"); @@ -217,12 +376,13 @@ void SoundDevicesWidget::resizeHeight() void SoundDevicesWidget::resetVolumeInfo() { - m_sliderContainer->updateSliderValue(m_audioSink->volume() * 100); + //无声卡状态下,会有伪sink设备,显示音量为0 + m_sliderContainer->updateSliderValue(findPort(m_sinkInter->activePort().name, m_sinkInter->card()) != nullptr ? m_sinkInter->volume() * 100 : 0); } uint SoundDevicesWidget::audioPortCardId(const AudioPort &audioport) const { - QString cards = m_volumeModel->cardsWithoutUnavailable(); + QString cards = m_soundInter->cardsWithoutUnavailable(); QJsonParseError error; QJsonDocument json = QJsonDocument::fromJson(cards.toLocal8Bit(), &error); if (error.error != QJsonParseError::NoError) @@ -250,15 +410,28 @@ uint SoundDevicesWidget::audioPortCardId(const AudioPort &audioport) const return -1; } +SoundDevicePort *SoundDevicesWidget::findPort(const QString &portId, const uint &cardId) const +{ + auto it = std::find_if(m_ports.begin(), m_ports.end(), [ = ] (SoundDevicePort *p) { + return (p->id() == portId && p->cardId() == cardId); + }); + + if (it != m_ports.end()) { + return *it; + } + + return nullptr; +} + void SoundDevicesWidget::onSelectIndexChanged(const QModelIndex &index) { int flag = index.data(itemFlagRole).toInt(); if (flag == AUDIOPORT) { - // 如果是点击具体的声音设备 - AudioPort port = index.data(itemDataRole).value(); - uint cardId = index.data(cardIdRole).toUInt(); - if (cardId >= 0) { - m_volumeModel->SetPort(cardId, port.name, 1); + const SoundDevicePort *port = m_model->data(index, itemDataRole).value(); + if (port) { + m_soundInter->SetPort(port->cardId(), port->id(), int(port->direction())); + //手动勾选时启用设备 + m_soundInter->SetPortEnabled(port->cardId(), port->id(), true); m_deviceList->update(); } } else { @@ -273,9 +446,27 @@ void SoundDevicesWidget::onSelectIndexChanged(const QModelIndex &index) void SoundDevicesWidget::onDefaultSinkChanged(const QDBusObjectPath &value) { - delete m_audioSink; - m_audioSink = new DBusSink("org.deepin.daemon.Audio1", m_volumeModel->defaultSink().path(), QDBusConnection::sessionBus(), this); - connect(m_audioSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); + delete m_sinkInter; + m_sinkInter = new DBusSink("org.deepin.daemon.Audio1", m_soundInter->defaultSink().path(), QDBusConnection::sessionBus(), this); + connect(m_sinkInter, &DBusSink::VolumeChanged, this, [ = ](double value) { m_sliderContainer->updateSliderValue(value * 100); }); + connect(m_sinkInter, &DBusSink::MuteChanged, this, [ = ] { m_sliderContainer->updateSliderValue(m_sinkInter->volume() * 100); }); + + QString portId = m_sinkInter->activePort().name; + uint cardId = m_sinkInter->card(); + //最后一个设备会被移除,但是当在控制中心选中此设备后需要添加,并勾选 + if (m_lastPort && m_lastPort->cardId() == cardId && m_lastPort->id() == portId) + startAddPort(m_lastPort); + + activePort(portId, cardId); + + for (int i = 0; i < m_model->rowCount() ; i++) { + QStandardItem *item = m_model->item(i); + if (item->data(itemFlagRole).toInt() != AUDIOPORT) + continue; + + const SoundDevicePort *soundPort = item->data(itemDataRole).value(); + item->setData((soundPort && soundPort->id() == portId && soundPort->cardId() == cardId), itemCheckRole); + } resetVolumeInfo(); m_deviceList->update(); diff --git a/plugins/sound/sounddeviceswidget.h b/plugins/sound/sounddeviceswidget.h index 776c84487..4ba093554 100644 --- a/plugins/sound/sounddeviceswidget.h +++ b/plugins/sound/sounddeviceswidget.h @@ -38,6 +38,7 @@ class QLabel; class VolumeModel; class AudioSink; class SettingDelegate; +class SoundDevicePort; using DBusAudio = org::deepin::daemon::Audio1; using DBusSink = org::deepin::daemon::audio1::Sink; @@ -58,13 +59,25 @@ private: void initConnection(); QString leftIcon(); QString rightIcon(); - const QString soundIconFile(const AudioPort port) const; + const QString soundIconFile() const; void resizeHeight(); void resetVolumeInfo(); uint audioPortCardId(const AudioPort &audioport) const; + SoundDevicePort *findPort(const QString &portId, const uint &cardId) const; + void startAddPort(SoundDevicePort *port); + void startRemovePort(const QString &portId, const uint &cardId); + + void addPort(const SoundDevicePort *port); + void removePort(const QString &portId, const uint &cardId); + + void activePort(const QString &portId, const uint &cardId); + + void removeLastDevice(); + void removeDisabledDevice(QString portId, unsigned int cardId); + private Q_SLOTS: void onSelectIndexChanged(const QModelIndex &index); void onDefaultSinkChanged(const QDBusObjectPath & value); @@ -75,10 +88,12 @@ private: SliderContainer *m_sliderContainer; QLabel *m_descriptionLabel; DListView *m_deviceList; - DBusAudio *m_volumeModel; - DBusSink *m_audioSink; + DBusAudio *m_soundInter; + DBusSink *m_sinkInter; QStandardItemModel *m_model; SettingDelegate *m_delegate; + QList m_ports; + SoundDevicePort *m_lastPort; }; #endif // VOLUMEDEVICESWIDGET_H diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index cede35e59..4f952d3b8 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -195,7 +195,7 @@ void SoundItem::refreshIcon() const double volmue = m_applet->volumeValue(); const double maxVolmue = m_applet->maxVolumeValue(); - const bool mute = m_applet->existActiveOutputDevice() ? m_sinkInter->mute() : true; + const bool mute = m_applet->existActiveOutputDevice() ? (m_sinkInter && m_sinkInter->mute()) : true; const Dock::DisplayMode displayMode = Dock::DisplayMode::Efficient; QString iconString; @@ -241,7 +241,7 @@ void SoundItem::refreshTips(const int volume, const bool force) if (!force && !m_tipsLabel->isVisible()) return; - const bool mute = m_applet->existActiveOutputDevice() ? m_sinkInter->mute() : true; + const bool mute = m_applet->existActiveOutputDevice() ? (m_sinkInter && m_sinkInter->mute()) : true; if (mute) { m_tipsLabel->setText(QString(tr("Mute"))); } else { @@ -260,7 +260,7 @@ QPixmap SoundItem::pixmap(int colorType) const const double volmue = m_applet->volumeValue(); const double maxVolmue = m_applet->maxVolumeValue(); - const bool mute = m_applet->existActiveOutputDevice() ? m_sinkInter->mute() : true; + const bool mute = m_applet->existActiveOutputDevice() ? (m_sinkInter && m_sinkInter->mute()) : true; QString iconString; if (displayMode == Dock::Fashion) { diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 0ebdd900a..49528e92d 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -82,15 +82,18 @@ void SoundWidget::initUi() void SoundWidget::initConnection() { - connect(m_defaultSink, &DBusSink::VolumeChanged, this, [ this ](double value) {m_sliderContainer->updateSliderValue(std::round(value * 100.00));}); + connect(m_defaultSink, &DBusSink::VolumeChanged, this, [ this ](double value) { m_sliderContainer->updateSliderValue(std::round(value * 100.00)); }); + connect(m_defaultSink, &DBusSink::MuteChanged, this, [ = ] { m_sliderContainer->updateSliderValue(m_defaultSink->volume() * 100); }); connect(m_dbusAudio, &DBusAudio::DefaultSinkChanged, this, [ this ](const QDBusObjectPath &value) { if (m_defaultSink) delete m_defaultSink; m_defaultSink = new DBusSink("org.deepin.daemon.Audio1", value.path(), QDBusConnection::sessionBus(), this); + connect(m_defaultSink, &DBusSink::VolumeChanged, this, [ this ](double value) { m_sliderContainer->updateSliderValue(std::round(value * 100.00)); }); + connect(m_defaultSink, &DBusSink::MuteChanged, this, [ = ] { m_sliderContainer->updateSliderValue(m_defaultSink->volume() * 100); }); + m_sliderContainer->updateSliderValue(std::round(m_defaultSink->volume() * 100.00)); - connect(m_defaultSink, &DBusSink::VolumeChanged, m_sliderContainer, &SliderContainer::updateSliderValue); }); connect(m_dbusAudio, &DBusAudio::MaxUIVolumeChanged, this, [ = ] (double maxValue) { From 4386f13cd92f8e4a56bd185a451d304abfdb58db Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 13:54:13 +0800 Subject: [PATCH 163/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E8=93=9D=E7=89=99=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 快捷面板界面,点击蓝牙图标快速打开蓝牙设备或关闭蓝牙设备,同时根据需要显示不同状态的图标 Log: 修复快捷面板蓝牙状态显示错误的问题 Influence: 点击蓝牙图标,观察快捷面板蓝牙的打开或者关闭的状态 Bug: https://pms.uniontech.com/bug-view-171419.html Change-Id: I8aeb557463932ffa0cef0fc26fdb29a4799285bd --- plugins/bluetooth/bluetoothmainwidget.cpp | 201 ++++++++++++++++++ plugins/bluetooth/bluetoothmainwidget.h | 64 ++++++ plugins/bluetooth/bluetoothplugin.cpp | 18 +- plugins/bluetooth/bluetoothplugin.h | 3 + .../bluetooth/resources/arrow-right-dark.svg | 3 + plugins/bluetooth/resources/arrow-right.svg | 18 ++ plugins/bluetooth/resources/bluetooth.qrc | 2 + 7 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 plugins/bluetooth/bluetoothmainwidget.cpp create mode 100644 plugins/bluetooth/bluetoothmainwidget.h create mode 100644 plugins/bluetooth/resources/arrow-right-dark.svg create mode 100644 plugins/bluetooth/resources/arrow-right.svg diff --git a/plugins/bluetooth/bluetoothmainwidget.cpp b/plugins/bluetooth/bluetoothmainwidget.cpp new file mode 100644 index 000000000..ab8649af2 --- /dev/null +++ b/plugins/bluetooth/bluetoothmainwidget.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "bluetoothmainwidget.h" +#include "bluetoothitem.h" +#include "adaptersmanager.h" +#include "adapter.h" + +#include +#include + +#include +#include +#include +#include + +DGUI_USE_NAMESPACE +DWIDGET_USE_NAMESPACE + +BluetoothMainWidget::BluetoothMainWidget(AdaptersManager *adapterManager, QWidget *parent) + : QWidget(parent) + , m_adapterManager(adapterManager) + , m_iconWidget(new QWidget(this)) + , m_nameLabel(new QLabel(this)) + , m_stateLabel(new QLabel(this)) + , m_expandLabel(new QLabel(this)) +{ + initUi(); + initConnection(); +} + +BluetoothMainWidget::~BluetoothMainWidget() +{ +} + +bool BluetoothMainWidget::eventFilter(QObject *watcher, QEvent *event) +{ + if (watcher == m_iconWidget) { + switch (event->type()) { + case QEvent::Paint: { + QPainter painter(m_iconWidget); + // 在区域最中间绘制 + QRect iconRect = m_iconWidget->rect(); + int size = qMin(iconRect.height(), iconRect.width()); + QPoint ptCenter(iconRect.center()); + painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + // 填充原型路径 + QPainterPath path; + path.addEllipse(ptCenter, size / 2 - 1, size / 2 - 1); + // 设置黑色背景色 + QColor backColor(Qt::black); + backColor.setAlphaF(0.1); + painter.setBrush(backColor); + painter.fillPath(path, backColor); + // 添加图标 + bool blueStatus = isOpen(); + QPixmap pixmap(bluetoothIcon(blueStatus)); + if (blueStatus) { + QPainter pa(&pixmap); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pixmap.rect(), qApp->palette().highlight()); + } + painter.drawPixmap(QPoint(ptCenter.x() - pixmap.size().width() / 2, ptCenter.y() - pixmap.size().height() / 2), pixmap); + return true; + } + case QEvent::MouseButtonRelease: { + bool status = !(isOpen()); + for (const Adapter *adapter : m_adapterManager->adapters()) + const_cast(adapter)->setPowered(status); + + return true; + } + default: + break; + } + } + if (watcher == m_expandLabel && event->type() == QEvent::MouseButtonRelease) { + Q_EMIT requestExpand(); + return true; + } + if (watcher == m_nameLabel && event->type() == QEvent::Resize) { + m_nameLabel->setText(QFontMetrics(m_nameLabel->font()).elidedText(tr("Bluetooth"), Qt::TextElideMode::ElideRight, m_nameLabel->width())); + } + return QWidget::eventFilter(watcher, event); +} + +void BluetoothMainWidget::initUi() +{ + QHBoxLayout *mainLayout = new QHBoxLayout(this); + // 添加左侧的图标 + m_iconWidget->setFixedWidth(36); + // 添加中间的文本 + QWidget *textWidget = new QWidget(this); + QVBoxLayout *textLayout = new QVBoxLayout(textWidget); + textLayout->setContentsMargins(0, 10, 0, 10); + textLayout->setSpacing(0); + QFont nameFont = DFontSizeManager::instance()->t6(); + nameFont.setBold(true); + + QPalette pe; + pe.setColor(QPalette::WindowText, Qt::black); + m_nameLabel->setParent(textWidget); + m_nameLabel->setPalette(pe); + m_nameLabel->setFont(nameFont); + + m_stateLabel->setParent(textWidget); + m_stateLabel->setFont(DFontSizeManager::instance()->t10()); + textLayout->addWidget(m_nameLabel); + textLayout->addWidget(m_stateLabel); + + // 添加右侧的展开按钮 + QWidget *expandWidget = new QWidget(this); + QVBoxLayout *expandLayout = new QVBoxLayout(expandWidget); + expandLayout->setContentsMargins(0, 0, 0, 0); + expandLayout->setSpacing(0); + expandLayout->addWidget(m_expandLabel); + + // 设置图标和文本 + m_nameLabel->setText(tr("Bluetooth")); + updateExpandIcon(); + + // 将所有的窗体都添加到主布局中 + mainLayout->setContentsMargins(10, 0, 10, 0); + mainLayout->setSpacing(0); + mainLayout->addWidget(m_iconWidget); + mainLayout->addSpacing(10); + mainLayout->addWidget(textWidget); + mainLayout->addStretch(); + mainLayout->addWidget(expandWidget); + + m_iconWidget->installEventFilter(this); + m_expandLabel->installEventFilter(this); + m_nameLabel->installEventFilter(this); +} + +void BluetoothMainWidget::initConnection() +{ + connect(m_adapterManager, &AdaptersManager::adapterIncreased, this, &BluetoothMainWidget::onAdapterChanged); + connect(m_adapterManager, &AdaptersManager::adapterDecreased, this, &BluetoothMainWidget::onAdapterChanged); + connect(m_adapterManager, &AdaptersManager::adapterIncreased, this, [ = ](Adapter *adapter) { + connect(adapter, &Adapter::poweredChanged, this, &BluetoothMainWidget::onAdapterChanged); + }); + + for (const Adapter *adapter : m_adapterManager->adapters()) + connect(adapter, &Adapter::poweredChanged, this, &BluetoothMainWidget::onAdapterChanged); + + onAdapterChanged(); +} + +void BluetoothMainWidget::updateExpandIcon() +{ + QString expandIconFile = ":/arrow-right"; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType) + expandIconFile += "-dark"; + expandIconFile += ".svg"; + + m_expandLabel->setPixmap(expandIconFile); +} + +bool BluetoothMainWidget::isOpen() const +{ + QList adapters = m_adapterManager->adapters(); + for (const Adapter *adapter : adapters) { + if (adapter->powered()) + return true; + } + + return false; +} + +QString BluetoothMainWidget::bluetoothIcon(bool isOpen) const +{ + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType) + return isOpen ? ":/bluetooth-active-symbolic-dark.svg" : ":/bluetooth-disable-symbolic-dark.svg"; + + return isOpen ? ":/bluetooth-active-symbolic.svg" : ":/bluetooth-disable-symbolic.svg"; +} + +void BluetoothMainWidget::onAdapterChanged() +{ + bool bluetoothIsOpen = isOpen(); + m_stateLabel->setText(bluetoothIsOpen ? tr("open") : tr("close")); + m_iconWidget->update(); +} diff --git a/plugins/bluetooth/bluetoothmainwidget.h b/plugins/bluetooth/bluetoothmainwidget.h new file mode 100644 index 000000000..083fcc275 --- /dev/null +++ b/plugins/bluetooth/bluetoothmainwidget.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef BLUETOOTHMAINWIDGET_H +#define BLUETOOTHMAINWIDGET_H + +#include + +class AdaptersManager; +class QLabel; +class Adapter; + +class BluetoothMainWidget : public QWidget +{ + Q_OBJECT + +public: + explicit BluetoothMainWidget(AdaptersManager *adapterManager, QWidget *parent = nullptr); + ~BluetoothMainWidget(); + +Q_SIGNALS: + void requestExpand(); + +protected: + bool eventFilter(QObject *watcher, QEvent *event) override; + +private: + void initUi(); + void initConnection(); + + void updateExpandIcon(); + + bool isOpen() const; + QString bluetoothIcon(bool isOpen) const; + +private Q_SLOTS: + void onAdapterChanged(); + +private: + AdaptersManager *m_adapterManager; + QWidget *m_iconWidget; + QLabel *m_nameLabel; + QLabel *m_stateLabel; + QLabel *m_expandLabel; +}; + +#endif // BLUETOOTHMAINWIDGET_H diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index d41225505..e64b25b76 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -22,6 +22,7 @@ #include "bluetoothplugin.h" #include "adaptersmanager.h" +#include "bluetoothmainwidget.h" #include @@ -33,6 +34,7 @@ BluetoothPlugin::BluetoothPlugin(QObject *parent) : QObject(parent) , m_adapterManager(new AdaptersManager(this)) , m_bluetoothItem(nullptr) + , m_bluetoothWidget(nullptr) { } @@ -55,6 +57,8 @@ void BluetoothPlugin::init(PluginProxyInterface *proxyInter) m_bluetoothItem.reset(new BluetoothItem(m_adapterManager)); + m_bluetoothWidget.reset(new BluetoothMainWidget(m_adapterManager)); + connect(m_bluetoothItem.data(), &BluetoothItem::justHasAdapter, [&] { m_enableState = true; refreshPluginItemsVisible(); @@ -63,6 +67,9 @@ void BluetoothPlugin::init(PluginProxyInterface *proxyInter) m_enableState = false; refreshPluginItemsVisible(); }); + connect(m_bluetoothWidget.data(), &BluetoothMainWidget::requestExpand, this, [ = ] { + m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); + }); m_enableState = m_bluetoothItem->hasAdapter(); @@ -88,6 +95,9 @@ QWidget *BluetoothPlugin::itemWidget(const QString &itemKey) return m_bluetoothItem.data(); } + if (itemKey == QUICK_ITEM_KEY) + return m_bluetoothWidget.data(); + return nullptr; } @@ -146,14 +156,20 @@ void BluetoothPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -QIcon BluetoothPlugin::icon(const DockPart &) +QIcon BluetoothPlugin::icon(const DockPart &dockPart) { + if (dockPart == DockPart::QuickPanel) + return QIcon(); + static QIcon icon(":/bluetooth-active-symbolic.svg"); return icon; } QIcon BluetoothPlugin::icon(const DockPart &dockPart, int themeType) { + if (dockPart == DockPart::QuickPanel) + return QIcon(); + if (themeType == DGuiApplicationHelper::ColorType::DarkType) return QIcon(":/bluetooth-active-symbolic.svg"); diff --git a/plugins/bluetooth/bluetoothplugin.h b/plugins/bluetooth/bluetoothplugin.h index 83f907040..7190e538f 100644 --- a/plugins/bluetooth/bluetoothplugin.h +++ b/plugins/bluetooth/bluetoothplugin.h @@ -28,6 +28,8 @@ #include +class BluetoothMainWidget; + class AdaptersManager; class BluetoothPlugin : public QObject, PluginsItemInterface @@ -65,6 +67,7 @@ private: private: AdaptersManager *m_adapterManager; QScopedPointer m_bluetoothItem; + QScopedPointer m_bluetoothWidget; bool m_enableState = true; }; diff --git a/plugins/bluetooth/resources/arrow-right-dark.svg b/plugins/bluetooth/resources/arrow-right-dark.svg new file mode 100644 index 000000000..04d121e0b --- /dev/null +++ b/plugins/bluetooth/resources/arrow-right-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/bluetooth/resources/arrow-right.svg b/plugins/bluetooth/resources/arrow-right.svg new file mode 100644 index 000000000..25a187ff1 --- /dev/null +++ b/plugins/bluetooth/resources/arrow-right.svg @@ -0,0 +1,18 @@ + + + + arrow-right + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/bluetooth/resources/bluetooth.qrc b/plugins/bluetooth/resources/bluetooth.qrc index ece8036ac..0433881a9 100644 --- a/plugins/bluetooth/resources/bluetooth.qrc +++ b/plugins/bluetooth/resources/bluetooth.qrc @@ -6,6 +6,8 @@ bluetooth-disable-symbolic.svg bluetooth-waiting-symbolic-dark.svg bluetooth-waiting-symbolic.svg + arrow-right.svg + arrow-right-dark.svg list_select.png list_select@2x.png notify_close_press.png From 6bcaead4734b071e75390385fd08b630ba8c83cb Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 14:01:16 +0800 Subject: [PATCH 164/257] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E9=9F=B3?= =?UTF-8?q?=E9=87=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、只要存在音量设备,就显示设备列表 2、当设备在控制中心被禁用后,快捷面板音量滑块不可调节,并且变灰显示 Log: 完善音量功能 Influence: 从控制中心关闭设备,观察任务栏设备状态是否发生变化 Bug: https://pms.uniontech.com/bug-view-172429.html Change-Id: Ib98f77f49998d6f55f9ad69a18e7fbb30081acf1 --- plugins/sound/sounddeviceswidget.cpp | 146 ++++++++++++++------------- plugins/sound/sounddeviceswidget.h | 7 +- plugins/sound/soundplugin.cpp | 2 + widgets/slidercontainer.cpp | 25 +++-- widgets/slidercontainer.h | 4 +- 5 files changed, 100 insertions(+), 84 deletions(-) diff --git a/plugins/sound/sounddeviceswidget.cpp b/plugins/sound/sounddeviceswidget.cpp index bb4e4850d..3c0e49daa 100644 --- a/plugins/sound/sounddeviceswidget.cpp +++ b/plugins/sound/sounddeviceswidget.cpp @@ -44,6 +44,10 @@ DWIDGET_USE_NAMESPACE #define HEADERHEIGHT 30 #define ITEMSPACE 16 +#define ROWSPACE 10 +#define DESCRIPTIONHEIGHT 15 +#define ITEMRADIUS 12 +#define SLIDERHEIGHT 36 #define AUDIOPORT 0 #define AUDIOSETTING 1 @@ -60,15 +64,13 @@ SoundDevicesWidget::SoundDevicesWidget(QWidget *parent) , m_sinkInter(new DBusSink("org.deepin.daemon.Audio1", m_soundInter->defaultSink().path(), QDBusConnection::sessionBus(), this)) , m_model(new QStandardItemModel(this)) , m_delegate(new SettingDelegate(m_deviceList)) - , m_lastPort(nullptr) { initUi(); initConnection(); onAudioDevicesChanged(); - m_sliderParent->installEventFilter(this); QMetaObject::invokeMethod(this, [ this ] { - resetVolumeInfo(); + deviceEnabled(m_ports.size() > 0); resizeHeight(); }, Qt::QueuedConnection); } @@ -98,7 +100,7 @@ void SoundDevicesWidget::initUi() layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(6); - m_sliderParent->setFixedHeight(36); + m_sliderParent->setFixedHeight(SLIDERHEIGHT); QHBoxLayout *sliderLayout = new QHBoxLayout(m_sliderParent); sliderLayout->setContentsMargins(11, 0, 11, 0); @@ -119,22 +121,22 @@ void SoundDevicesWidget::initUi() topLayout->addWidget(m_sliderParent); layout->addLayout(topLayout); - layout->addSpacing(4); layout->addWidget(m_descriptionLabel); m_deviceList->setModel(m_model); m_deviceList->setViewMode(QListView::ListMode); m_deviceList->setMovement(QListView::Free); - m_deviceList->setItemRadius(12); + m_deviceList->setItemRadius(ITEMRADIUS); m_deviceList->setWordWrap(false); m_deviceList->verticalScrollBar()->setVisible(false); m_deviceList->horizontalScrollBar()->setVisible(false); m_deviceList->setOrientation(QListView::Flow::TopToBottom, false); layout->addWidget(m_deviceList); - m_deviceList->setSpacing(10); + m_deviceList->setSpacing(ROWSPACE); m_deviceList->setItemDelegate(m_delegate); m_model->setSortRole(sortRole); + m_descriptionLabel->setFixedHeight(DESCRIPTIONHEIGHT); // 增加音量设置 DStandardItem *settingItem = new DStandardItem; @@ -143,6 +145,8 @@ void SoundDevicesWidget::initUi() settingItem->setData(false, itemCheckRole); settingItem->setData(AUDIOSETTING, itemFlagRole); m_model->appendRow(settingItem); + + m_sliderParent->installEventFilter(this); } void SoundDevicesWidget::onAudioDevicesChanged() @@ -150,61 +154,55 @@ void SoundDevicesWidget::onAudioDevicesChanged() QMap tmpCardIds; const QString cards = m_soundInter->cardsWithoutUnavailable(); QJsonDocument doc = QJsonDocument::fromJson(cards.toUtf8()); - QJsonArray jCards = doc.array(); - for (QJsonValue cV : jCards) { - QJsonObject jCard = cV.toObject(); - const uint cardId = jCard["Id"].toInt(); - const QString cardName = jCard["Name"].toString(); - QJsonArray jPorts = jCard["Ports"].toArray(); + QJsonArray jCards = doc.array(); + for (QJsonValue cV : jCards) { + QJsonObject jCard = cV.toObject(); + const uint cardId = jCard["Id"].toInt(); + const QString cardName = jCard["Name"].toString(); + QJsonArray jPorts = jCard["Ports"].toArray(); - QStringList tmpPorts; + QStringList tmpPorts; - for (QJsonValue pV : jPorts) { - QJsonObject jPort = pV.toObject(); - const double portAvai = jPort["Available"].toDouble(); - if (portAvai == 2 || portAvai == 0 ) { - const QString portId = jPort["Name"].toString(); - const QString portName = jPort["Description"].toString(); + for (QJsonValue pV : jPorts) { + QJsonObject jPort = pV.toObject(); + const double portAvai = jPort["Available"].toDouble(); + if (portAvai != 2 && portAvai != 0 ) + continue; - SoundDevicePort *port = findPort(portId, cardId); - bool includePort = (port != nullptr); - if (!port) - port = new SoundDevicePort(m_model); + const QString portId = jPort["Name"].toString(); + const QString portName = jPort["Description"].toString(); - port->setId(portId); - port->setName(portName); - port->setDirection(SoundDevicePort::Direction(jPort["Direction"].toDouble())); - port->setCardId(cardId); - port->setCardName(cardName); + SoundDevicePort *port = findPort(portId, cardId); + bool includePort = (port != nullptr); + if (!port) + port = new SoundDevicePort(m_model); - if (!includePort) - startAddPort(port); + port->setId(portId); + port->setName(portName); + port->setDirection(SoundDevicePort::Direction(jPort["Direction"].toDouble())); + port->setCardId(cardId); + port->setCardName(cardName); - tmpPorts << portId; - } - } - tmpCardIds.insert(cardId, tmpPorts); + if (!includePort) + startAddPort(port); + + tmpPorts << portId; } + tmpCardIds.insert(cardId, tmpPorts); + } - onDefaultSinkChanged(m_soundInter->defaultSink());//重新获取切换的设备信息 + // 重新获取切换的设备信息 + onDefaultSinkChanged(m_soundInter->defaultSink()); - for (SoundDevicePort *port : m_ports) { - //只要有一个设备在控制中心被禁用后,在任务栏声音设备列表中该设备会被移除, - if (!m_soundInter->IsPortEnabled(port->cardId(), port->id())) { - removeDisabledDevice(port->id(), port->cardId()); - } - //判断端口是否在最新的设备列表中 - if (tmpCardIds.contains(port->cardId())) { - if (!tmpCardIds[port->cardId()].contains(port->id())) { - startRemovePort(port->id(), port->cardId()); - } - } - else { - startRemovePort(port->id(), port->cardId()); - } - } - //当只有一个设备剩余时,该设备也需要移除 - removeLastDevice(); + for (SoundDevicePort *port : m_ports) { + // 只要有一个设备在控制中心被禁用后,在任务栏声音设备列表中该设备会被移除, + if (!m_soundInter->IsPortEnabled(port->cardId(), port->id())) + removeDisabledDevice(port->id(), port->cardId()); + + // 判断端口是否在最新的设备列表中 + if (!tmpCardIds.contains(port->cardId()) || !tmpCardIds[port->cardId()].contains(port->id())) + startRemovePort(port->id(), port->cardId()); + } } void SoundDevicesWidget::initConnection() @@ -288,6 +286,10 @@ void SoundDevicesWidget::addPort(const SoundDevicePort *port) } m_model->sort(0); + if (m_ports.size() == 1) + deviceEnabled(true); + + resizeHeight(); } void SoundDevicesWidget::removePort(const QString &portId, const uint &cardId) @@ -307,6 +309,11 @@ void SoundDevicesWidget::removePort(const QString &portId, const uint &cardId) if (removeRow >= 0) m_model->removeRow(removeRow); + + if (m_ports.size() == 0) + deviceEnabled(false); + + resizeHeight(); } void SoundDevicesWidget::activePort(const QString &portId, const uint &cardId) @@ -315,20 +322,6 @@ void SoundDevicesWidget::activePort(const QString &portId, const uint &cardId) it->setIsActive(it->id() == portId && it->cardId() == cardId); } -void SoundDevicesWidget::removeLastDevice() -{ - if (m_ports.count() == 1 && m_ports.at(0)) { - m_lastPort = new SoundDevicePort(m_model); - m_lastPort->setId(m_ports.at(0)->id()); - m_lastPort->setName(m_ports.at(0)->name()); - m_lastPort->setDirection(m_ports.at(0)->direction()); - m_lastPort->setCardId(m_ports.at(0)->cardId()); - m_lastPort->setCardName(m_ports.at(0)->cardName()); - startRemovePort(m_ports.at(0)->id(), m_ports.at(0)->cardId()); - qDebug() << "remove last output device"; - } -} - void SoundDevicesWidget::removeDisabledDevice(QString portId, unsigned int cardId) { startRemovePort(portId, cardId); @@ -338,6 +331,12 @@ void SoundDevicesWidget::removeDisabledDevice(QString portId, unsigned int cardI } } +void SoundDevicesWidget::deviceEnabled(bool enable) +{ + m_sliderContainer->setEnabled(enable); + Q_EMIT enableChanged(enable); +} + QString SoundDevicesWidget::leftIcon() { QString iconLeft = QString(":/icons/resources/audio-volume-%1").arg(m_sinkInter->mute() ? "muted" : "low"); @@ -366,7 +365,14 @@ const QString SoundDevicesWidget::soundIconFile() const void SoundDevicesWidget::resizeHeight() { - m_deviceList->adjustSize(); + int deviceListHeight = 0; + for (int i = 0; i < m_model->rowCount(); i++) { + QModelIndex index = m_model->index(i, 0); + deviceListHeight += m_deviceList->visualRect(index).height() + m_deviceList->spacing() * 2; + if (i >= 9) // 最大显示12个条目,包含标题、滑块和设备标题、设备列表,因此,设备列表最多显示9个条目 + break; + } + m_deviceList->setFixedHeight(deviceListHeight); QMargins m = layout()->contentsMargins(); int height = m.top() + m.bottom() + HEADERHEIGHT + m_sliderContainer->height() + ITEMSPACE + m_descriptionLabel->height() + m_deviceList->height(); @@ -453,10 +459,6 @@ void SoundDevicesWidget::onDefaultSinkChanged(const QDBusObjectPath &value) QString portId = m_sinkInter->activePort().name; uint cardId = m_sinkInter->card(); - //最后一个设备会被移除,但是当在控制中心选中此设备后需要添加,并勾选 - if (m_lastPort && m_lastPort->cardId() == cardId && m_lastPort->id() == portId) - startAddPort(m_lastPort); - activePort(portId, cardId); for (int i = 0; i < m_model->rowCount() ; i++) { diff --git a/plugins/sound/sounddeviceswidget.h b/plugins/sound/sounddeviceswidget.h index 4ba093554..2830105f1 100644 --- a/plugins/sound/sounddeviceswidget.h +++ b/plugins/sound/sounddeviceswidget.h @@ -51,6 +51,9 @@ public: explicit SoundDevicesWidget(QWidget *parent = nullptr); ~SoundDevicesWidget() override; +Q_SIGNALS: + void enableChanged(bool); + protected: bool eventFilter(QObject *watcher, QEvent *event) override; @@ -75,9 +78,10 @@ private: void activePort(const QString &portId, const uint &cardId); - void removeLastDevice(); void removeDisabledDevice(QString portId, unsigned int cardId); + void deviceEnabled(bool enable); + private Q_SLOTS: void onSelectIndexChanged(const QModelIndex &index); void onDefaultSinkChanged(const QDBusObjectPath & value); @@ -93,7 +97,6 @@ private: QStandardItemModel *m_model; SettingDelegate *m_delegate; QList m_ports; - SoundDevicePort *m_lastPort; }; #endif // VOLUMEDEVICESWIDGET_H diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 969bd9407..c0b67258a 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -66,6 +66,8 @@ void SoundPlugin::init(PluginProxyInterface *proxyInter) proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); }); } + + connect(m_soundDeviceWidget.data(), &SoundDevicesWidget::enableChanged, m_soundWidget.data(), &SoundWidget::setEnabled); } void SoundPlugin::pluginStateSwitched() diff --git a/widgets/slidercontainer.cpp b/widgets/slidercontainer.cpp index fc6ef72c3..2e5739cb6 100644 --- a/widgets/slidercontainer.cpp +++ b/widgets/slidercontainer.cpp @@ -239,29 +239,36 @@ void SliderProxyStyle::drawComplexControl(QStyle::ComplexControl control, const QRect rectGroove = subControlRect(CC_Slider, sliderOption, SC_SliderGroove, widget); QRect rectHandle = subControlRect(CC_Slider, sliderOption, SC_SliderHandle, widget); if (m_drawSpecial == RoundHandler) - drawRoundSlider(painter, rectGroove, rectHandle); + drawRoundSlider(painter, rectGroove, rectHandle, widget); else - drawNormalSlider(painter, rectGroove, rectHandle, const_cast(widget)); + drawNormalSlider(painter, rectGroove, rectHandle, widget); painter->restore(); } // 绘制通用的滑动条 -void SliderProxyStyle::drawNormalSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, QWidget *wigdet) const +void SliderProxyStyle::drawNormalSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, const QWidget *wigdet) const { DPalette dpa = DPaletteHelper::instance()->palette(wigdet); - QPen penLine = QPen(dpa.color(DPalette::Highlight), 2); + QColor color = dpa.color(DPalette::Highlight); + QColor rightColor(Qt::gray); + if (!wigdet->isEnabled()) { + color.setAlphaF(0.8); + rightColor.setAlphaF(0.8); + } + + QPen penLine = QPen(color, 2); // 绘制上下的竖线,一根竖线的宽度是2,+4个像素刚好保证中间也是间隔2个像素 for (int i = rectGroove.x(); i < rectGroove.x() + rectGroove.width(); i = i + 4) { if (i < rectHandle.x()) painter->setPen(penLine); else - painter->setPen(QPen(Qt::gray, 2)); + painter->setPen(QPen(rightColor, 2)); painter->drawLine(i, rectGroove.y() + 2, i, rectGroove.y() + rectGroove.height() - 2); } // 绘制滚动区域 - painter->setBrush(dpa.color(DPalette::Highlight)); + painter->setBrush(color); painter->setPen(Qt::NoPen); QPainterPath path; path.addRoundedRect(rectHandle, 6, 6); @@ -269,10 +276,12 @@ void SliderProxyStyle::drawNormalSlider(QPainter *painter, QRect rectGroove, QRe } // 绘制设计师定义的那种圆形滑块,黑色的滑条 -void SliderProxyStyle::drawRoundSlider(QPainter *painter, QRect rectGroove, QRect rectHandle) const +void SliderProxyStyle::drawRoundSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, const QWidget *wigdet) const { // 深色背景下,滑块和滑动条白色,浅色背景下,滑块和滑动条黑色 - QBrush brush(DGuiApplicationHelper::DarkType == DGuiApplicationHelper::instance()->themeType() ? Qt::white : Qt::black); + QColor color = wigdet->isEnabled() ? (DGuiApplicationHelper::DarkType == DGuiApplicationHelper::instance()->themeType() ? Qt::white : Qt::black) : Qt::gray; + + QBrush brush(color); // 此处中绘制圆形滑动条,需要绘制圆角,圆角大小为其高度的一半 QPainterPath pathGroove; int radius = rectGroove.height() / 2; diff --git a/widgets/slidercontainer.h b/widgets/slidercontainer.h index 320ae035a..0dc14817e 100644 --- a/widgets/slidercontainer.h +++ b/widgets/slidercontainer.h @@ -100,8 +100,8 @@ protected: void drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const override; private: - void drawNormalSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, QWidget *wigdet) const; - void drawRoundSlider(QPainter *painter, QRect rectGroove, QRect rectHandle) const; + void drawNormalSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, const QWidget *wigdet) const; + void drawRoundSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, const QWidget *wigdet) const; private: StyleType m_drawSpecial; From c7df15ce0eed83f6149983bdf400ce84eb034cd9 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 14:37:54 +0800 Subject: [PATCH 165/257] =?UTF-8?q?feat:=20=E6=8F=92=E4=BB=B6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 插件接口类中增加flag接口,用于返回不同的插件的属性,在各插件的实现中实现这个接口 Log: Influence: 任务栏插件 Task: https://pms.uniontech.com/task-view-220099.html Change-Id: I9e8b8e0f5f9818856b70a76bbda9eb31dc4ebf65 --- frame/pluginadapter/pluginadapter.cpp | 13 +++++++-- frame/pluginadapter/pluginadapter.h | 4 ++- frame/util/abstractpluginscontroller.cpp | 2 +- interfaces/pluginsiteminterface.h | 28 +++++++++++++++++++ plugins/bluetooth/bluetoothplugin.cpp | 9 ++++++ plugins/bluetooth/bluetoothplugin.h | 1 + plugins/multitasking/multitaskingplugin.cpp | 5 ++++ plugins/multitasking/multitaskingplugin.h | 1 + .../overlay-warning-plugin.cpp | 5 ++++ .../overlay-warning/overlay-warning-plugin.h | 1 + plugins/power/powerplugin.cpp | 9 ++++++ plugins/power/powerplugin.h | 1 + plugins/show-desktop/showdesktopplugin.cpp | 5 ++++ plugins/show-desktop/showdesktopplugin.h | 1 + plugins/shutdown/shutdownplugin.cpp | 5 ++++ plugins/shutdown/shutdownplugin.h | 1 + plugins/sound/soundplugin.cpp | 9 ++++++ plugins/sound/soundplugin.h | 1 + plugins/trash/trashplugin.cpp | 6 ++++ plugins/trash/trashplugin.h | 1 + 20 files changed, 104 insertions(+), 4 deletions(-) diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp index 0e0443a07..ed00d9a53 100644 --- a/frame/pluginadapter/pluginadapter.cpp +++ b/frame/pluginadapter/pluginadapter.cpp @@ -25,8 +25,9 @@ #define ICONWIDTH 24 #define ICONHEIGHT 24 -PluginAdapter::PluginAdapter(PluginsItemInterface_V20 *pluginInter) +PluginAdapter::PluginAdapter(PluginsItemInterface_V20 *pluginInter, QPluginLoader *pluginLoader) : m_pluginInter(pluginInter) + , m_pluginLoader(pluginLoader) { } @@ -191,7 +192,15 @@ PluginsItemInterface::PluginStatus PluginAdapter::status() const QString PluginAdapter::description() const { - return tr("actived"); + return m_pluginInter->pluginDisplayName(); +} + +PluginFlags PluginAdapter::flags() const +{ + if (m_pluginLoader->fileName().contains(TRAY_PATH)) + return PluginFlag::Type_Tray | PluginFlag::Attribute_CanDrag | PluginFlag::Attribute_CanInsert; + + return PluginsItemInterface::flags(); } void PluginAdapter::setItemKey(const QString &itemKey) diff --git a/frame/pluginadapter/pluginadapter.h b/frame/pluginadapter/pluginadapter.h index ad9c2a271..c60b8eb8c 100644 --- a/frame/pluginadapter/pluginadapter.h +++ b/frame/pluginadapter/pluginadapter.h @@ -36,7 +36,7 @@ class PluginAdapter : public QObject, public PluginsItemInterface Q_INTERFACES(PluginsItemInterface) public: - PluginAdapter(PluginsItemInterface_V20 *pluginInter); + PluginAdapter(PluginsItemInterface_V20 *pluginInter, QPluginLoader *pluginLoader); ~PluginAdapter(); const QString pluginName() const override; @@ -68,12 +68,14 @@ public: QIcon icon(const DockPart &dockPart) override; PluginStatus status() const override; QString description() const override; + PluginFlags flags() const override; void setItemKey(const QString &itemKey); private: PluginsItemInterface_V20 *m_pluginInter; QString m_itemKey; + QPluginLoader *m_pluginLoader; }; #endif // PLUGINADAPTER_H diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index b1fde6484..4f143a562 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -287,7 +287,7 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) PluginsItemInterface_V20 *interface_v20 = qobject_cast(pluginLoader->instance()); if (interface_v20) { // 将v20插件接口通过适配器转换成v23的接口,方便在后面识别 - PluginAdapter *pluginAdapter = new PluginAdapter(interface_v20); + PluginAdapter *pluginAdapter = new PluginAdapter(interface_v20, pluginLoader); // 将适配器的地址保存到map列表中,因为适配器自己会调用itemAdded方法,转换成PluginsItemInterface类,但是实际上它 // 对应的是PluginAdapter类,因此,这个map用于在后面的itemAdded方法中用来查找 m_pluginAdapterMap[(qulonglong)(interface_v20)] = pluginAdapter; diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 7aa1dd28d..4957db431 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -35,6 +35,28 @@ enum class DockPart { DCCSetting // 显示在控制中心个性化设置的图标 }; +enum PluginFlag { + Type_NoneFlag = 0x1, // 插件类型-没有任何的属性,不在任何地方显示 + Type_Common = 0x2, // 插件类型-快捷插件区 + Type_Tool = 0x4, // 插件类型-工具插件,例如回收站 + Type_System = 0x8, // 插件类型-系统插件,例如关机插件 + Type_Tray = 0x10, // 插件类型-托盘区,例如U盘插件 + Type_Fixed = 0x20, // 插件类型-固定区域,例如多任务视图和显示桌面 + + Quick_Single = 0x40, // 当插件类型为Common时,快捷插件区域只有一列的那种插件 + Quick_Multi = 0x80, // 当插件类型为Common时,快捷插件区占两列的那种插件 + Quick_Full = 0x100, // 当插件类型为Common时,快捷插件区占用4列的那种插件,例如声音、亮度设置和音乐等 + + Attribute_CanDrag = 0x200, // 插件属性-是否支持拖动 + Attribute_CanInsert = 0x400, // 插件属性-是否支持在其前面插入其他的插件,普通的快捷插件是支持的 + Attribute_CanSetting = 0x800, // 插件属性-是否可以在控制中心设置显示或隐藏 + + FlagMask = 0xffffffff // 掩码 +}; + +Q_DECLARE_FLAGS(PluginFlags, PluginFlag) +Q_DECLARE_OPERATORS_FOR_FLAGS(PluginFlags) + // 快捷面板详情页面的itemWidget对应的itemKey #define QUICK_ITEM_KEY "quick_item_key" /// @@ -284,6 +306,12 @@ public: /// virtual QIcon icon(const DockPart &dockPart, int themeType) { return icon(dockPart); } + /// + /// \brief m_proxyInter + /// return the falgs for current plugin + /// + virtual PluginFlags flags() const { return PluginFlag::Type_Common | PluginFlag::Quick_Single | PluginFlag::Attribute_CanDrag | PluginFlag::Attribute_CanInsert | PluginFlag::Attribute_CanSetting; } + protected: /// /// \brief m_proxyInter diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index e64b25b76..4c1c5fe51 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -192,6 +192,15 @@ QString BluetoothPlugin::description() const return tr("close"); } +PluginFlags BluetoothPlugin::flags() const +{ + return PluginFlag::Type_Common + | PluginFlag::Quick_Multi + | PluginFlag::Attribute_CanDrag + | PluginFlag::Attribute_CanInsert + | PluginFlag::Attribute_CanSetting; +} + void BluetoothPlugin::refreshPluginItemsVisible() { if (pluginIsDisable()) diff --git a/plugins/bluetooth/bluetoothplugin.h b/plugins/bluetooth/bluetoothplugin.h index 7190e538f..c8508acdf 100644 --- a/plugins/bluetooth/bluetoothplugin.h +++ b/plugins/bluetooth/bluetoothplugin.h @@ -60,6 +60,7 @@ public: QIcon icon(const DockPart &dockPart, int themeType) override; PluginStatus status() const override; QString description() const override; + PluginFlags flags() const override; private: void refreshPluginItemsVisible(); diff --git a/plugins/multitasking/multitaskingplugin.cpp b/plugins/multitasking/multitaskingplugin.cpp index 1ffafb5f6..70d750151 100644 --- a/plugins/multitasking/multitaskingplugin.cpp +++ b/plugins/multitasking/multitaskingplugin.cpp @@ -184,6 +184,11 @@ PluginsItemInterface::PluginType MultitaskingPlugin::type() return PluginType::Fixed; } +PluginFlags MultitaskingPlugin::flags() const +{ + return PluginFlag::Type_Fixed; +} + void MultitaskingPlugin::updateVisible() { if (pluginIsDisable() || !DWindowManagerHelper::instance()->hasComposite()) { diff --git a/plugins/multitasking/multitaskingplugin.h b/plugins/multitasking/multitaskingplugin.h index 813fa0d2d..9da4037c0 100644 --- a/plugins/multitasking/multitaskingplugin.h +++ b/plugins/multitasking/multitaskingplugin.h @@ -55,6 +55,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; PluginType type() override; + PluginFlags flags() const override; private: void updateVisible(); diff --git a/plugins/overlay-warning/overlay-warning-plugin.cpp b/plugins/overlay-warning/overlay-warning-plugin.cpp index f6d8d2969..504ec497a 100644 --- a/plugins/overlay-warning/overlay-warning-plugin.cpp +++ b/plugins/overlay-warning/overlay-warning-plugin.cpp @@ -132,6 +132,11 @@ void OverlayWarningPlugin::setSortKey(const QString &itemKey, const int order) m_proxyInter->saveValue(this, key, order); } +PluginFlags OverlayWarningPlugin::flags() const +{ + return PluginFlag::Type_NoneFlag; +} + void OverlayWarningPlugin::loadPlugin() { if (m_pluginLoaded) { diff --git a/plugins/overlay-warning/overlay-warning-plugin.h b/plugins/overlay-warning/overlay-warning-plugin.h index ebb793184..95da096d3 100644 --- a/plugins/overlay-warning/overlay-warning-plugin.h +++ b/plugins/overlay-warning/overlay-warning-plugin.h @@ -59,6 +59,7 @@ public: int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; + PluginFlags flags() const override; private: void loadPlugin(); diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index a55fe2123..b4f7faf9a 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -187,6 +187,15 @@ QIcon PowerPlugin::icon(const DockPart &dockPart) return batteryIcon; } +PluginFlags PowerPlugin::flags() const +{ + // 电池插件只在任务栏上面展示,不在快捷面板展示,并且可以拖动,可以在其前面插入其他插件,可以在控制中心设置是否显示隐藏 + return PluginFlag::Type_Common + | PluginFlag::Attribute_CanDrag + | PluginFlag::Attribute_CanInsert + | PluginFlag::Attribute_CanSetting; +} + void PowerPlugin::updateBatteryVisible() { const bool exist = !m_powerInter->batteryPercentage().isEmpty(); diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index 8d2ae4420..17979b7a0 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -58,6 +58,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; QIcon icon(const DockPart &dockPart) override; + PluginFlags flags() const override; private: void updateBatteryVisible(); diff --git a/plugins/show-desktop/showdesktopplugin.cpp b/plugins/show-desktop/showdesktopplugin.cpp index 526e14829..3f6b94f31 100644 --- a/plugins/show-desktop/showdesktopplugin.cpp +++ b/plugins/show-desktop/showdesktopplugin.cpp @@ -164,6 +164,11 @@ PluginsItemInterface::PluginType ShowDesktopPlugin::type() return PluginType::Fixed; } +PluginFlags ShowDesktopPlugin::flags() const +{ + return PluginFlag::Type_Fixed; +} + void ShowDesktopPlugin::updateVisible() { if (pluginIsDisable()) diff --git a/plugins/show-desktop/showdesktopplugin.h b/plugins/show-desktop/showdesktopplugin.h index 49d01fd52..75b7d10bf 100644 --- a/plugins/show-desktop/showdesktopplugin.h +++ b/plugins/show-desktop/showdesktopplugin.h @@ -54,6 +54,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; PluginType type() override; + PluginFlags flags() const override; private: void updateVisible(); diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index f1c0e2ab4..d1dc7cee6 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -312,6 +312,11 @@ QIcon ShutdownPlugin::icon(const DockPart &dockPart) return shutdownIcon; } +PluginFlags ShutdownPlugin::flags() const +{ + return PluginFlag::Type_System | PluginFlag::Attribute_CanSetting; +} + void ShutdownPlugin::loadPlugin() { if (m_pluginLoaded) { diff --git a/plugins/shutdown/shutdownplugin.h b/plugins/shutdown/shutdownplugin.h index 1f5c65d1d..aac7b11e5 100644 --- a/plugins/shutdown/shutdownplugin.h +++ b/plugins/shutdown/shutdownplugin.h @@ -62,6 +62,7 @@ public: void pluginSettingsChanged() override; QIcon icon(const DockPart &dockPart) override; + PluginFlags flags() const override; // 休眠待机配置,保持和sessionshell一致 const QStringList session_ui_configs { diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index c0b67258a..60df9c6ff 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -160,6 +160,15 @@ PluginsItemInterface::PluginStatus SoundPlugin::status() const return SoundPlugin::Active; } +PluginFlags SoundPlugin::flags() const +{ + return PluginFlag::Type_Common + | PluginFlag::Quick_Full + | PluginFlag::Attribute_CanDrag + | PluginFlag::Attribute_CanInsert + | PluginFlag::Attribute_CanSetting; +} + void SoundPlugin::refreshPluginItemsVisible() { if (pluginIsDisable()) diff --git a/plugins/sound/soundplugin.h b/plugins/sound/soundplugin.h index ca3202862..566c8666a 100644 --- a/plugins/sound/soundplugin.h +++ b/plugins/sound/soundplugin.h @@ -54,6 +54,7 @@ public: QIcon icon(const DockPart &) override; QIcon icon(const DockPart &dockPart, int themeType) override; PluginStatus status() const override; + PluginFlags flags() const override; private: void refreshPluginItemsVisible(); diff --git a/plugins/trash/trashplugin.cpp b/plugins/trash/trashplugin.cpp index a87e14f47..0add94fc3 100644 --- a/plugins/trash/trashplugin.cpp +++ b/plugins/trash/trashplugin.cpp @@ -196,6 +196,12 @@ QIcon TrashPlugin::icon(const DockPart &dockPart, int themeType) return QIcon(); } +PluginFlags TrashPlugin::flags() const +{ + return PluginFlag::Type_Tool + | PluginFlag::Attribute_CanSetting; +} + void TrashPlugin::refreshPluginItemsVisible() { if (pluginIsDisable()) { diff --git a/plugins/trash/trashplugin.h b/plugins/trash/trashplugin.h index 0ac09d8e4..b986f8ec7 100644 --- a/plugins/trash/trashplugin.h +++ b/plugins/trash/trashplugin.h @@ -63,6 +63,7 @@ public: void displayModeChanged(const Dock::DisplayMode displayMode) override; void pluginSettingsChanged() override; QIcon icon(const DockPart &dockPart, int themeType) override; + PluginFlags flags() const override; private: void refreshPluginItemsVisible(); From 4f3f7a0aed3df7b1d485db081e05fd3738289023 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 15:30:34 +0800 Subject: [PATCH 166/257] =?UTF-8?q?fix:=20=E6=8F=92=E4=BB=B6=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=A0=87=E8=AE=B0=E6=9D=A5=E5=86=B3=E5=AE=9A=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在决定插件的位置的时候,根据插件的返回的标记来决定当前插件是属于固定插件、快捷插件、托盘插件、系统插件还是工具插件 Log: Influence: 任务栏插件类型 Task: https://pms.uniontech.com/task-view-220099.html Change-Id: I5dedc16fd7ccaac9d54dccf657e1a938bf3f2160 --- frame/controller/quicksettingcontroller.cpp | 54 ++++++++++----------- frame/controller/quicksettingcontroller.h | 5 +- frame/controller/toolapphelper.cpp | 6 +-- frame/item/pluginsitem.cpp | 5 -- frame/item/pluginsitem.h | 2 - frame/item/quicksettingitem.cpp | 14 +++--- frame/item/quicksettingitem.h | 1 - frame/window/quickpluginwindow.cpp | 30 +++++++----- frame/window/quickpluginwindow.h | 7 +-- plugins/bluetooth/bluetooth.json | 1 - plugins/multitasking/multitasking.json | 3 +- plugins/show-desktop/show-desktop.json | 3 +- plugins/shutdown/shutdown.json | 3 +- plugins/sound/sound.json | 3 +- plugins/trash/trash.json | 3 +- 15 files changed, 64 insertions(+), 76 deletions(-) diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index ab4d3186a..370ed8ea2 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -20,7 +20,6 @@ */ #include "quicksettingcontroller.h" #include "quicksettingitem.h" -#include "pluginsiteminterface.h" #include "proxyplugincontroller.h" #include "pluginsitem.h" @@ -88,33 +87,33 @@ void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInt QuickSettingController::PluginAttribute QuickSettingController::pluginAttribute(PluginsItemInterface * const itemInter) const { - QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter); - if (!pluginLoader) + // 工具插件,例如回收站 + if (hasFlag(itemInter, PluginFlag::Type_Tool)) + return PluginAttribute::Tool; + + // 系统插件,例如关机按钮 + if (hasFlag(itemInter, PluginFlag::Type_System)) + return PluginAttribute::System; + + // 托盘插件,例如磁盘图标 + if (hasFlag(itemInter, PluginFlag::Type_Tray)) + return PluginAttribute::Tray; + + // 固定插件,例如显示桌面和多任务试图 + if (hasFlag(itemInter, PluginFlag::Type_Fixed)) + return PluginAttribute::Fixed; + + // 通用插件,一般的插件都是通用插件,就是放在快捷插件区域的那些插件 + if (hasFlag(itemInter, PluginFlag::Type_Common)) return PluginAttribute::Quick; - if (pluginLoader->fileName().contains(TRAY_PATH)) { - // 如果是从系统目录下加载的插件,则认为它是系统插件,此时需要放入到托盘中 - return PluginAttribute::Tray; - } + // 基本插件,不在任务栏上显示的插件 + return PluginAttribute::None; +} - const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); - if (meta.contains("tool") && meta.value("tool").toBool()) { - // 如果有tool标记,则认为它是工具插件,例如回收站和窗管提供的相关插件 - return PluginAttribute::Tool; - } - - if (meta.contains("system") && meta.value("system").toBool()) { - // 如果有system标记,则认为它是右侧的关机按钮插件 - return PluginAttribute::System; - } - - if (meta.contains("fixed") && meta.value("fixed").toBool()) { - // 如果有fixed标记,则认为它是固定区域的插件,例如显示桌面和多任务视图 - return PluginAttribute::Fixed; - } - - // 其他的都认为是快捷插件 - return PluginAttribute::Quick; +bool QuickSettingController::hasFlag(PluginsItemInterface *itemInter, PluginFlag flag) const +{ + return itemInter->flags() & flag; } QuickSettingController *QuickSettingController::instance() @@ -161,10 +160,7 @@ QList QuickSettingController::pluginInSettings() if (plugin->pluginDisplayName().isEmpty()) continue; - PluginAttribute pluginAttr = pluginAttribute(plugin); - if (pluginAttr == QuickSettingController::PluginAttribute::Quick - || pluginAttr == QuickSettingController::PluginAttribute::System - || pluginAttr == QuickSettingController::PluginAttribute::Tool) + if (hasFlag(plugin, PluginFlag::Attribute_CanSetting)) settingPlugins << plugin; } diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 559940a41..a23b69aa2 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -22,6 +22,7 @@ #define QUICKSETTINGCONTROLLER_H #include "abstractpluginscontroller.h" +#include "pluginsiteminterface.h" class QuickSettingItem; class PluginsItem; @@ -32,7 +33,8 @@ class QuickSettingController : public AbstractPluginsController public: enum class PluginAttribute { - Quick = 0, // 快捷区域插件 + None = 0, // 不在任何区域显示的插件 + Quick, // 快捷区域插件 Tool, // 工具插件(回收站和窗管开发的另一套插件) System, // 系统插件(关机插件) Tray, // 托盘插件(U盘图标等) @@ -47,6 +49,7 @@ public: PluginsItem *pluginItemWidget(PluginsItemInterface *pluginItem); QList pluginInSettings(); PluginAttribute pluginAttribute(PluginsItemInterface * const itemInter) const; + bool hasFlag(PluginsItemInterface *itemInter, PluginFlag flag) const; Q_SIGNALS: void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute); diff --git a/frame/controller/toolapphelper.cpp b/frame/controller/toolapphelper.cpp index 6359a8141..500f0445d 100644 --- a/frame/controller/toolapphelper.cpp +++ b/frame/controller/toolapphelper.cpp @@ -136,11 +136,7 @@ bool ToolAppHelper::pluginInTool(DockItem *dockItem) const if (!pluginItem) return false; - QJsonObject metaData = pluginItem->metaData(); - if (metaData.contains("tool")) - return metaData.value("tool").toBool(); - - return false; + return (QuickSettingController::instance()->pluginAttribute(pluginItem->pluginItem()) == QuickSettingController::PluginAttribute::Tool); } void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter) diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index 7a115a808..c50355178 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -330,8 +330,3 @@ PluginsItemInterface *PluginsItem::pluginItem() const { return m_pluginInter; } - -QJsonObject PluginsItem::metaData() const -{ - return m_jsonData; -} diff --git a/frame/item/pluginsitem.h b/frame/item/pluginsitem.h index 7e3bfbb3d..7a4b70959 100644 --- a/frame/item/pluginsitem.h +++ b/frame/item/pluginsitem.h @@ -55,8 +55,6 @@ public: PluginsItemInterface *pluginItem() const; - QJsonObject metaData() const; - public slots: void refreshIcon() override; diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 711c37443..36b960e20 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -51,7 +51,6 @@ QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, QWid : DockItem(parent) , m_pluginInter(pluginInter) , m_itemKey(QuickSettingController::instance()->itemKey(pluginInter)) - , m_metaData(QuickSettingController::instance()->metaData(pluginInter)) { setAcceptDrops(true); this->installEventFilter(this); @@ -130,16 +129,19 @@ QColor QuickSettingItem::foregroundColor() const QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter) { + QuickSettingController *quickController = QuickSettingController::instance(); // 如果显示在面板的图标或者Widget为空,则不让显示(例如电池插件) - if (pluginInter->icon(DockPart::QuickPanel).isNull() && !pluginInter->itemWidget(QUICK_ITEM_KEY)) + if (!quickController->hasFlag(pluginInter, PluginFlag::Type_Common)) return nullptr; - const QJsonObject metaData = QuickSettingController::instance()->metaData(pluginInter); - if (metaData.contains("primary") && metaData.value("primary").toBool()) + if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Multi)) return new MultiQuickItem(pluginInter); - if (pluginInter->itemWidget(QUICK_ITEM_KEY) && metaData.contains("applet") && metaData.value("applet").toBool()) + if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Full)) return new FullQuickItem(pluginInter); - return new SingleQuickItem(pluginInter); + if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Single)) + return new SingleQuickItem(pluginInter); + + return nullptr; } diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 52e4c4879..962114883 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -57,7 +57,6 @@ protected: private: PluginsItemInterface *m_pluginInter; QString m_itemKey; - QJsonObject m_metaData; }; class QuickSettingFactory diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 50eb4286c..e2b9fd5f9 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -290,7 +290,7 @@ void QuickPluginWindow::onRequestUpdate() if (pluginLoader) metaData = pluginLoader->metaData().value("MetaData").toObject(); - itemWidget = new QuickDockItem(item, metaData, quickController->itemKey(item), this); + itemWidget = new QuickDockItem(item, quickController->itemKey(item), this); itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); itemWidget->installEventFilter(this); itemWidget->setMouseTracking(true); @@ -471,7 +471,7 @@ int QuickPluginWindow::getDropIndex(QPoint point) QuickDockItem *dockBeforeItem = qobject_cast(layoutBefore->widget()); QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); - if (dockItem->isPrimary()) + if (dockItem->canInsert()) continue; if (dockBeforeItem->geometry().x() > point.x() && dockItem->geometry().right() < point.x()) @@ -485,7 +485,7 @@ int QuickPluginWindow::getDropIndex(QPoint point) continue; QuickDockItem *dockBeforeItem = qobject_cast(layoutBefore->widget()); - if (dockBeforeItem->isPrimary()) + if (dockBeforeItem->canInsert()) break; QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); @@ -558,16 +558,17 @@ void QuickPluginWindow::initConnection() * @param pluginItem * @param parent */ -QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent) +QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent) : QWidget(parent) , m_pluginItem(pluginItem) - , m_metaData(metaData) , m_itemKey(itemKey) , m_position(Dock::Position::Bottom) , m_popupWindow(new DockPopupWindow) , m_contextMenu(new QMenu(this)) , m_tipParent(nullptr) , m_mainLayout(nullptr) + , m_canInsert(QuickSettingController::instance()->hasFlag(pluginItem, PluginFlag::Attribute_CanInsert)) + , m_dockItemParent(nullptr) { initUi(); initConnection(); @@ -588,12 +589,9 @@ PluginsItemInterface *QuickDockItem::pluginItem() return m_pluginItem; } -bool QuickDockItem::isPrimary() const +bool QuickDockItem::canInsert() const { - if (m_metaData.contains("primary")) - return m_metaData.value("primary").toBool(); - - return false; + return m_canInsert; } void QuickDockItem::hideToolTip() @@ -703,8 +701,10 @@ void QuickDockItem::hideEvent(QHideEvent *event) return QWidget::hideEvent(event); QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); - if (itemWidget && m_mainLayout->indexOf(itemWidget) >= 0) - m_mainLayout->removeWidget(m_pluginItem->itemWidget(m_itemKey)); + if (itemWidget && m_mainLayout->indexOf(itemWidget) >= 0) { + itemWidget->setParent(m_dockItemParent); + m_mainLayout->removeWidget(itemWidget); + } } QPixmap QuickDockItem::iconPixmap() const @@ -725,7 +725,11 @@ void QuickDockItem::initUi() m_mainLayout = new QHBoxLayout(this); m_mainLayout->setContentsMargins(0, 0, 0, 0); - m_pluginItem->itemWidget(m_itemKey)->installEventFilter(this); + QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); + if (itemWidget) { + m_dockItemParent = itemWidget->parentWidget(); + itemWidget->installEventFilter(this); + } } void QuickDockItem::initAttribute() diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 16f3dc24f..be2c66a11 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -94,12 +94,12 @@ class QuickDockItem : public QWidget Q_OBJECT public: - explicit QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent = nullptr); + explicit QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent = nullptr); ~QuickDockItem(); void setPositon(Dock::Position position); PluginsItemInterface *pluginItem(); - bool isPrimary() const; + bool canInsert() const; void hideToolTip(); protected: @@ -125,13 +125,14 @@ private Q_SLOTS: private: PluginsItemInterface *m_pluginItem; - QJsonObject m_metaData; QString m_itemKey; Dock::Position m_position; DockPopupWindow *m_popupWindow; QMenu *m_contextMenu; QWidget *m_tipParent; QHBoxLayout *m_mainLayout; + bool m_canInsert; + QWidget *m_dockItemParent; }; #endif // QUICKPLUGINWINDOW_H diff --git a/plugins/bluetooth/bluetooth.json b/plugins/bluetooth/bluetooth.json index 936d08d86..8400bab79 100644 --- a/plugins/bluetooth/bluetooth.json +++ b/plugins/bluetooth/bluetooth.json @@ -1,5 +1,4 @@ { "api": "2.0.0", - "primary" : true, "depends-daemon-dbus-service": "org.deepin.daemon.Bluetooth1" } diff --git a/plugins/multitasking/multitasking.json b/plugins/multitasking/multitasking.json index cdda5b480..bec81f0da 100644 --- a/plugins/multitasking/multitasking.json +++ b/plugins/multitasking/multitasking.json @@ -1,4 +1,3 @@ { - "api": "2.0.0", - "fixed": true + "api": "2.0.0" } diff --git a/plugins/show-desktop/show-desktop.json b/plugins/show-desktop/show-desktop.json index cdda5b480..bec81f0da 100644 --- a/plugins/show-desktop/show-desktop.json +++ b/plugins/show-desktop/show-desktop.json @@ -1,4 +1,3 @@ { - "api": "2.0.0", - "fixed": true + "api": "2.0.0" } diff --git a/plugins/shutdown/shutdown.json b/plugins/shutdown/shutdown.json index a1a7e7292..bec81f0da 100644 --- a/plugins/shutdown/shutdown.json +++ b/plugins/shutdown/shutdown.json @@ -1,4 +1,3 @@ { - "api": "2.0.0", - "system": true + "api": "2.0.0" } diff --git a/plugins/sound/sound.json b/plugins/sound/sound.json index e5b6168c7..181aef926 100644 --- a/plugins/sound/sound.json +++ b/plugins/sound/sound.json @@ -1,5 +1,4 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "org.deepin.daemon.Audio1", - "applet": true + "depends-daemon-dbus-service": "org.deepin.daemon.Audio1" } diff --git a/plugins/trash/trash.json b/plugins/trash/trash.json index a5a5d1d82..bec81f0da 100644 --- a/plugins/trash/trash.json +++ b/plugins/trash/trash.json @@ -1,4 +1,3 @@ { - "api": "2.0.0", - "tool": true + "api": "2.0.0" } From 4aed03f62bf614fcab5c8c448d1df9f1d5e8a547 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 14:37:54 +0800 Subject: [PATCH 167/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0display?= =?UTF-8?q?=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原来在dde-dock中的显示相关的代码部分移动到display插件中,生成新的插件 Log: Influence: 展开任务栏快捷面板,观察是否有亮度设置相关的功能 Task: https://pms.uniontech.com/task-view-220489.html Change-Id: Ifc1bb2395c3f9ff449513078aba0e3c56ad66881 --- plugins/display/CMakeLists.txt | 51 ++++ plugins/display/brightnessadjwidget.cpp | 71 +++++ plugins/display/brightnessadjwidget.h | 48 ++++ plugins/display/brightnessmodel.cpp | 190 +++++++++++++ plugins/display/brightnessmodel.h | 87 ++++++ plugins/display/brightnesswidget.cpp | 103 +++++++ plugins/display/brightnesswidget.h | 58 ++++ plugins/display/collaborationdevmodel.cpp | 267 ++++++++++++++++++ plugins/display/collaborationdevmodel.h | 122 ++++++++ plugins/display/devcollaborationwidget.cpp | 256 +++++++++++++++++ plugins/display/devcollaborationwidget.h | 72 +++++ plugins/display/devitemdelegate.cpp | 179 ++++++++++++ plugins/display/devitemdelegate.h | 67 +++++ plugins/display/display.json | 3 + plugins/display/displayplugin.cpp | 105 +++++++ plugins/display/displayplugin.h | 65 +++++ plugins/display/displaysettingwidget.cpp | 73 +++++ plugins/display/displaysettingwidget.h | 51 ++++ .../resource/ICON_Device_Headphone.svg | 17 ++ .../resource/ICON_Device_Headphone_dark.svg | 17 ++ .../display/resource/ICON_Device_Laptop.svg | 17 ++ .../resource/ICON_Device_Laptop_dark.svg | 17 ++ plugins/display/resource/brightness.svg | 15 + plugins/display/resource/brightnesshigh.svg | 3 + plugins/display/resource/brightnesslow.svg | 3 + plugins/display/resource/broadcast.svg | 15 + plugins/display/resource/display.qrc | 12 + 27 files changed, 1984 insertions(+) create mode 100644 plugins/display/CMakeLists.txt create mode 100644 plugins/display/brightnessadjwidget.cpp create mode 100644 plugins/display/brightnessadjwidget.h create mode 100644 plugins/display/brightnessmodel.cpp create mode 100644 plugins/display/brightnessmodel.h create mode 100644 plugins/display/brightnesswidget.cpp create mode 100644 plugins/display/brightnesswidget.h create mode 100644 plugins/display/collaborationdevmodel.cpp create mode 100644 plugins/display/collaborationdevmodel.h create mode 100644 plugins/display/devcollaborationwidget.cpp create mode 100644 plugins/display/devcollaborationwidget.h create mode 100644 plugins/display/devitemdelegate.cpp create mode 100644 plugins/display/devitemdelegate.h create mode 100644 plugins/display/display.json create mode 100644 plugins/display/displayplugin.cpp create mode 100644 plugins/display/displayplugin.h create mode 100644 plugins/display/displaysettingwidget.cpp create mode 100644 plugins/display/displaysettingwidget.h create mode 100644 plugins/display/resource/ICON_Device_Headphone.svg create mode 100644 plugins/display/resource/ICON_Device_Headphone_dark.svg create mode 100644 plugins/display/resource/ICON_Device_Laptop.svg create mode 100644 plugins/display/resource/ICON_Device_Laptop_dark.svg create mode 100644 plugins/display/resource/brightness.svg create mode 100644 plugins/display/resource/brightnesshigh.svg create mode 100644 plugins/display/resource/brightnesslow.svg create mode 100644 plugins/display/resource/broadcast.svg create mode 100644 plugins/display/resource/display.qrc diff --git a/plugins/display/CMakeLists.txt b/plugins/display/CMakeLists.txt new file mode 100644 index 000000000..a727f2557 --- /dev/null +++ b/plugins/display/CMakeLists.txt @@ -0,0 +1,51 @@ + +set(PLUGIN_NAME "display") + +project(${PLUGIN_NAME}) + +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + +# Sources files +file(GLOB_RECURSE SRCS "*.h" "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "../../frame/util/imageutil.h" + "../../frame/util/imageutil.cpp" + "../../frame/util/statebutton.h" + "../../frame/util/statebutton.cpp" + "../../frame/util/horizontalseperator.h" + "../../frame/util/horizontalseperator.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp") + +find_package(PkgConfig REQUIRED) +find_package(Qt5Widgets REQUIRED) +find_package(Qt5Svg REQUIRED) +find_package(Qt5DBus REQUIRED) +find_package(DtkWidget REQUIRED) + +pkg_check_modules(XCB_EWMH REQUIRED xcb-ewmh x11 xcursor) +pkg_check_modules(QGSettings REQUIRED gsettings-qt) + +add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") +add_library(${PLUGIN_NAME} SHARED ${SRCS} ./resource/display.qrc) +set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../quick-trays) +target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} + ${QGSettings_INCLUDE_DIRS} + ../../interfaces + ../../widgets + ../../frame + ../../frame/qtdbusextended + ./dbusinterface/generation_dbus_interface + componments) + +target_link_libraries(${PLUGIN_NAME} PRIVATE + ${XCB_EWMH_LIBRARIES} + ${DtkWidget_LIBRARIES} + ${QGSettings_LIBRARIES} + ${Qt5DBus_LIBRARIES} + ${Qt5Widgets_LIBRARIES} + ${Qt5Svg_LIBRARIES} +) + +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/quick-trays) diff --git a/plugins/display/brightnessadjwidget.cpp b/plugins/display/brightnessadjwidget.cpp new file mode 100644 index 000000000..1b339a977 --- /dev/null +++ b/plugins/display/brightnessadjwidget.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "brightnessadjwidget.h" +#include "brightnessmodel.h" +#include "slidercontainer.h" +#include "imageutil.h" + +#include + +const int ItemSpacing = 5; + +BrightnessAdjWidget::BrightnessAdjWidget(QWidget *parent) + : QWidget(parent) + , m_mainLayout(new QVBoxLayout(this)) + , m_brightnessModel(new BrightnessModel(this)) +{ + m_mainLayout->setMargin(0); + m_mainLayout->setSpacing(ItemSpacing); + + loadBrightnessItem(); +} + +void BrightnessAdjWidget::loadBrightnessItem() +{ + QList monitors = m_brightnessModel->monitors(); + int itemHeight = monitors.count() > 1 ? 56 : 30; + + for (BrightMonitor *monitor : monitors) { + SliderContainer *sliderContainer = new SliderContainer(this); + if (monitors.count() > 1) + sliderContainer->setTitle(monitor->name()); + + QPixmap leftPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesslow", QSize(20, 20)); + QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesshigh", QSize(20, 20)); + sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon,leftPixmap, QSize(), 12); + sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 12); + + sliderContainer->setFixedWidth(310); + sliderContainer->setFixedHeight(itemHeight); + sliderContainer->updateSliderValue(monitor->brightness()); + + SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); + sliderContainer->setSliderProxyStyle(proxy); + m_mainLayout->addWidget(sliderContainer); + + connect(monitor, &BrightMonitor::brightnessChanged, sliderContainer, &SliderContainer::updateSliderValue); + connect(sliderContainer, &SliderContainer::sliderValueChanged, monitor, &BrightMonitor::setBrightness); + } + + QMargins margins = this->contentsMargins(); + setFixedHeight(margins.top() + margins.bottom() + monitors.count() * itemHeight + monitors.count() * ItemSpacing); +} + diff --git a/plugins/display/brightnessadjwidget.h b/plugins/display/brightnessadjwidget.h new file mode 100644 index 000000000..74482c7d8 --- /dev/null +++ b/plugins/display/brightnessadjwidget.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef BRIGHTNESS_ADJUSTMENT_WIDGET_H +#define BRIGHTNESS_ADJUSTMENT_WIDGET_H + +#include + +class QVBoxLayout; +class BrightnessModel; + +/*! + * \brief The BrightnessAdjWidget class + * 显示器亮度调整页面 + */ +class BrightnessAdjWidget : public QWidget +{ + Q_OBJECT +public: + explicit BrightnessAdjWidget(QWidget *parent = nullptr); + +private: + void loadBrightnessItem(); + +private: + QVBoxLayout *m_mainLayout; + BrightnessModel *m_brightnessModel; +}; + + +#endif // BRIGHTNESS_ADJUSTMENT_WIDGET_H diff --git a/plugins/display/brightnessmodel.cpp b/plugins/display/brightnessmodel.cpp new file mode 100644 index 000000000..e7c024bce --- /dev/null +++ b/plugins/display/brightnessmodel.cpp @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * kirigaya + * Hualet + * + * Maintainer: sbw + * kirigaya + * Hualet + * + * 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 . + */ + +#include "brightnessmodel.h" + +#include +#include +#include +#include +#include +#include + +static const QString serviceName("com.deepin.daemon.Display"); +static const QString servicePath("/com/deepin/daemon/Display"); +static const QString serviceInterface("com.deepin.daemon.Display"); +static const QString propertiesInterface("org.freedesktop.DBus.Properties"); + +BrightnessModel::BrightnessModel(QObject *parent) + : QObject(parent) +{ + QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + // 读取所有的屏幕的信息 + QString primaryScreenName = dbusInter.property("Primary").value(); + QList paths = dbusInter.property("Monitors").value>(); + for (QDBusObjectPath path : paths) { + BrightMonitor *monitor = new BrightMonitor(path.path(), this); + monitor->setPrimary(primaryScreenName == monitor->name()); + m_monitor << monitor; + } + } + + connect(qApp, &QApplication::primaryScreenChanged, this, &BrightnessModel::primaryScreenChanged); +} + +BrightnessModel::~BrightnessModel() +{ +} + +QList BrightnessModel::monitors() +{ + return m_monitor; +} + +BrightMonitor *BrightnessModel::primaryMonitor() const +{ + for (BrightMonitor *monitor : m_monitor) { + if (monitor->isPrimary()) + return monitor; + } + + return nullptr; +} + +void BrightnessModel::primaryScreenChanged(QScreen *screen) +{ + BrightMonitor *defaultMonitor = nullptr; + for (BrightMonitor *monitor : m_monitor) { + monitor->setPrimary(monitor->name() == screen->name()); + if (monitor->isPrimary()) + defaultMonitor = monitor; + } + + if (defaultMonitor) + Q_EMIT primaryChanged(defaultMonitor); +} + +/** + * @brief monitor + */ +BrightMonitor::BrightMonitor(QString path, QObject *parent) + : QObject(parent) + , m_path(path) + , m_brightness(100) + , m_enabled(false) + , m_isPrimary(false) +{ + QDBusInterface dbusInter(serviceName, path, serviceInterface + QString(".Monitor"), QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + // 读取所有的屏幕的信息 + m_name = dbusInter.property("Name").toString(); + m_brightness = static_cast(dbusInter.property("Brightness").toDouble() * 100); + m_enabled = dbusInter.property("Enabled").toBool(); + } + + QDBusConnection::sessionBus().connect(serviceName, path, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); +} + +BrightMonitor::~BrightMonitor() +{ +} + +void BrightMonitor::setPrimary(bool primary) +{ + m_isPrimary = primary; +} + +int BrightMonitor::brightness() +{ + return m_brightness; +} + +bool BrightMonitor::enabled() +{ + return m_enabled; +} + +QString BrightMonitor::name() +{ + return m_name; +} + +bool BrightMonitor::isPrimary() +{ + return m_isPrimary; +} + +void BrightMonitor::setBrightness(int value) +{ + callMethod("SetBrightness", { m_name, static_cast(value * 0.01) }); +} + +void BrightMonitor::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != QString("%1.Monitor").arg(serviceInterface)) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Brightness")) { + int brightness = static_cast(changedProps.value("Brightness").value() * 100); + if (brightness != m_brightness) { + m_brightness = brightness; + Q_EMIT brightnessChanged(brightness); + } + } + if (changedProps.contains("Name")) { + QString name = changedProps.value("Name").value(); + if (name != m_name) { + m_name = name; + Q_EMIT nameChanged(name); + } + } + if (changedProps.contains("Enabled")) { + bool enabled = changedProps.value("Enabled").value(); + if (enabled != m_enabled) { + m_enabled = enabled; + Q_EMIT enabledChanged(enabled); + } + } +} + +QDBusMessage BrightMonitor::callMethod(const QString &methodName, const QList &argument) +{ + QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); + if (dbusInter.isValid()) { + QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); + reply.waitForFinished(); + return reply.reply(); + } + + return QDBusMessage(); +} diff --git a/plugins/display/brightnessmodel.h b/plugins/display/brightnessmodel.h new file mode 100644 index 000000000..b9c0c022b --- /dev/null +++ b/plugins/display/brightnessmodel.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2011 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef BRIGHTNESSMODEL_H +#define BRIGHTNESSMODEL_H + +#include + +class BrightMonitor; +class QDBusMessage; +class QScreen; + +class BrightnessModel : public QObject +{ + Q_OBJECT + +public: + explicit BrightnessModel(QObject *parent = nullptr); + ~BrightnessModel(); + + QList monitors(); + BrightMonitor *primaryMonitor() const; + +Q_SIGNALS: + void primaryChanged(BrightMonitor *); + +protected Q_SLOTS: + void primaryScreenChanged(QScreen *screen); + +private: + QList m_monitor; +}; + +class BrightMonitor : public QObject +{ + Q_OBJECT + +public: + explicit BrightMonitor(QString path, QObject *parent); + ~BrightMonitor(); + +Q_SIGNALS: + void brightnessChanged(int); + void nameChanged(QString); + void enabledChanged(bool); + +public: + void setPrimary(bool primary); + int brightness(); + bool enabled(); + QString name(); + bool isPrimary(); + +public slots: + void setBrightness(int value); + void onPropertyChanged(const QDBusMessage &msg); + +private: + QDBusMessage callMethod(const QString &methodName, const QList &argument); + +private: + QString m_path; + QString m_name; + int m_brightness; + bool m_enabled; + bool m_isPrimary; +}; + +#endif // DISPLAYMODEL_H diff --git a/plugins/display/brightnesswidget.cpp b/plugins/display/brightnesswidget.cpp new file mode 100644 index 000000000..2c148e2ac --- /dev/null +++ b/plugins/display/brightnesswidget.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "brightnesswidget.h" +#include "brightnessmodel.h" +#include "imageutil.h" +#include "slidercontainer.h" + +#include +#include + +#define BACKSIZE 36 +#define IMAGESIZE 18 + +BrightnessWidget::BrightnessWidget(BrightnessModel *model, QWidget *parent) + : QWidget(parent) + , m_sliderContainer(new SliderContainer(this)) + , m_model(model) +{ + initUi(); + initConnection(); +} + +BrightnessWidget::~BrightnessWidget() +{ +} + +void BrightnessWidget::showEvent(QShowEvent *event) +{ + QWidget::showEvent(event); + + // 显示的时候更新一下slider的主屏幕亮度值 + updateSliderValue(); + Q_EMIT visibleChanged(true); +} + +void BrightnessWidget::hideEvent(QHideEvent *event) +{ + QWidget::hideEvent(event); + + Q_EMIT visibleChanged(true); +} + +void BrightnessWidget::initUi() +{ + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(15, 0, 12, 0); + + QPixmap leftPixmap = ImageUtil::loadSvg(":/brightness.svg", QSize(IMAGESIZE, IMAGESIZE)); + QPixmap rightPixmap = ImageUtil::loadSvg(":/ICON_Device_Laptop.svg", QSize(IMAGESIZE, IMAGESIZE)); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); + m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); + + // 需求要求调节范围是10%-100%,且调节幅度为1% + m_sliderContainer->setRange(10, 100); + m_sliderContainer->setPageStep(1); + + SliderProxyStyle *style = new SliderProxyStyle; + m_sliderContainer->setSliderProxyStyle(style); + + mainLayout->addWidget(m_sliderContainer); +} + +void BrightnessWidget::initConnection() +{ + connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { + BrightMonitor *monitor = m_model->primaryMonitor(); + if (monitor) + monitor->setBrightness(value); + }); + + connect(m_sliderContainer, &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &position) { + if (position == SliderContainer::IconPosition::RightIcon) + Q_EMIT brightClicked(); + }); + + updateSliderValue(); +} + +void BrightnessWidget::updateSliderValue() +{ + BrightMonitor *monitor = m_model->primaryMonitor(); + if (monitor) { + m_sliderContainer->updateSliderValue(monitor->brightness()); + } +} diff --git a/plugins/display/brightnesswidget.h b/plugins/display/brightnesswidget.h new file mode 100644 index 000000000..78a4cf77d --- /dev/null +++ b/plugins/display/brightnesswidget.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef BRIGHTNESSWIDGET_H +#define BRIGHTNESSWIDGET_H + +#include + +DWIDGET_USE_NAMESPACE + +class SliderContainer; +class BrightnessModel; +class BrightMonitor; + +class BrightnessWidget : public QWidget +{ + Q_OBJECT + +public: + explicit BrightnessWidget(BrightnessModel *model, QWidget *parent = nullptr); + ~BrightnessWidget() override; + +Q_SIGNALS: + void visibleChanged(bool); + void brightClicked(); + +protected: + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + +private: + void initUi(); + void initConnection(); + void updateSliderValue(); + +private: + SliderContainer *m_sliderContainer; + BrightnessModel *m_model; +}; + +#endif // LIGHTSETTINGWIDGET_H diff --git a/plugins/display/collaborationdevmodel.cpp b/plugins/display/collaborationdevmodel.cpp new file mode 100644 index 000000000..6305ec88a --- /dev/null +++ b/plugins/display/collaborationdevmodel.cpp @@ -0,0 +1,267 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "collaborationdevmodel.h" + +#include +#include +#include +#include +#include +#include + +#include + +DGUI_USE_NAMESPACE +DCORE_USE_NAMESPACE + +static const QString CollaborationService = "com.deepin.Cooperation"; +static const QString CollaborationPath = "/com/deepin/Cooperation"; +static const QString CollaborationInterface = "com.deepin.Cooperation"; +static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties"; + +CollaborationDevModel::CollaborationDevModel(QObject *parent) + : QObject(parent) + , m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this)) +{ + if (m_colDbusInter->isValid()) { + QList paths = m_colDbusInter->property("Machines").value>(); + for (const QDBusObjectPath& path : paths) { + CollaborationDevice *device = new CollaborationDevice(path.path(), this); + if (device->isValid()) + m_devices[path.path()] = device; + else + device->deleteLater(); + } + } else { + qWarning() << CollaborationService << " is invalid"; + } + + m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); +} + +void CollaborationDevModel::checkServiceValid() +{ + if (!m_colDbusInter->isValid()) { + for (CollaborationDevice *device : m_devices) { + device->deleteLater(); + } + m_devices.clear(); + Q_EMIT devicesChanged(); + } +} + +QList CollaborationDevModel::devices() const +{ + return m_devices.values(); +} + +void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != CollaborationInterface) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Machines")) { + QList paths = m_colDbusInter->property("Machines").value>(); + QStringList devPaths; + for (const QDBusObjectPath& path : paths) { + devPaths << path.path(); + } + updateDevice(devPaths); + } +} + +void CollaborationDevModel::updateDevice(const QStringList &devPaths) +{ + if (devPaths.isEmpty()) { + qDeleteAll(m_devices); + m_devices.clear(); + } else { + // 清除已不存在的设备 + QMapIterator it(m_devices); + while (it.hasNext()) { + it.next(); + if (!devPaths.contains(it.key())) { + it.value()->deleteLater(); + m_devices.remove(it.key()); + } + } + + // 添加新增设备 + for (const QString &path : devPaths) { + if (!m_devices.contains(path)) { + CollaborationDevice *device = new CollaborationDevice(path, this); + if (device->isValid()) + m_devices[path] = device; + else + device->deleteLater(); + } + } + } + + emit devicesChanged(); +} + +CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath) +{ + return m_devices.value(machinePath, nullptr); +} + +CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent) + : QObject(parent) + , m_path(devPath) + , m_OS(-1) + , m_isPaired(false) + , m_isCooperated(false) + , m_isValid(false) + , m_isCooperating(false) + , m_devDbusInter(new QDBusInterface(CollaborationService, devPath, CollaborationInterface + QString(".Machine"), + QDBusConnection::sessionBus(), this)) +{ + if (m_devDbusInter->isValid()) { + m_name = m_devDbusInter->property("Name").toString(); + m_OS = m_devDbusInter->property("OS").toInt(); + m_isPaired = m_devDbusInter->property("Paired").toBool(); + m_isCooperated = m_devDbusInter->property("Cooperating").toBool(); + m_uuid = m_devDbusInter->property("UUID").toString(); + m_isValid = true; + } else { + qWarning() << "CollaborationDevice devPath:" << devPath << " is invalid and get properties failed"; + } + + m_devDbusInter->connection().connect(CollaborationService, m_path, ColPropertiesInterface, "PropertiesChanged", + this, SLOT(onPropertyChanged(QDBusMessage))); +} + +bool CollaborationDevice::isValid() const +{ + return m_isValid; +} + +QString CollaborationDevice::name() const +{ + return m_name; +} + +QString CollaborationDevice::uuid() const +{ + return m_uuid; +} + +QString CollaborationDevice::machinePath() const +{ + return m_path; +} + +QString CollaborationDevice::deviceIcon() const +{ + switch (m_OS) { + case DeviceType::Android: { + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/ICON_Device_Headphone_dark.svg"); + + return QString(":/icons/resources/ICON_Device_Headphone.svg"); + } + default: { + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/ICON_Device_Laptop_dark.svg"); + + return QString(":/icons/resources/ICON_Device_Laptop.svg"); + } + } +} + +bool CollaborationDevice::isPaired() const +{ + return m_isPaired; +} + +bool CollaborationDevice::isCooperated() const +{ + return m_isCooperated; +} + +void CollaborationDevice::setDeviceIsCooperating(bool isCooperating) +{ + m_isCooperating = isCooperating; +} + +void CollaborationDevice::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != QString("%1.Machine").arg(CollaborationInterface)) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Paired")) { + bool isPaired = changedProps.value("Paired").value(); + m_isPaired = isPaired; + if (isPaired && m_isCooperating) { + // paired 成功之后再去请求cooperate + requestCooperate(); + } + + if (!isPaired){ + Q_EMIT pairedStateChanged(false); + } + } else if (changedProps.contains("Cooperating")) { + m_isCooperated = changedProps.value("Cooperating").value(); + + Q_EMIT pairedStateChanged(m_isCooperated); + } +} + +void CollaborationDevice::requestCooperate() const +{ + callMethod("RequestCooperate"); +} + +void CollaborationDevice::disconnectDevice() const +{ + callMethod("Disconnect"); +} + +void CollaborationDevice::pair() const +{ + callMethod("Pair"); +} + +QDBusMessage CollaborationDevice::callMethod(const QString &methodName) const +{ + if (m_devDbusInter->isValid()) { + QDBusMessage msg = m_devDbusInter->call(methodName); + qInfo() << "CollaborationDevice callMethod:" << methodName << " " << msg.errorMessage(); + return msg; + } + + qWarning() << "CollaborationDevice callMethod: " << methodName << " failed"; + return QDBusMessage(); +} diff --git a/plugins/display/collaborationdevmodel.h b/plugins/display/collaborationdevmodel.h new file mode 100644 index 000000000..013624211 --- /dev/null +++ b/plugins/display/collaborationdevmodel.h @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef COLLABORATION_DEV_MODEL_H +#define COLLABORATION_DEV_MODEL_H + +#include +#include + +class QTimer; +class QDBusInterface; +class QDBusMessage; +class CollaborationDevice; + +/*! + * \brief The CollaborationDevModel class + * 协同设备model + */ +class CollaborationDevModel : public QObject +{ + Q_OBJECT +public: + explicit CollaborationDevModel(QObject *parent = nullptr); + +signals: + void devicesChanged(); + +public: + void checkServiceValid(); + + QList devices() const; + CollaborationDevice *getDevice(const QString &machinePath); + +private slots: + void onPropertyChanged(const QDBusMessage &msg); + +private: + void updateDevice(const QStringList &devPaths); + +private: + QDBusInterface *m_colDbusInter; + // machine path : device object + QMap m_devices; + +}; + +/*! + * \brief The CollaborationDevice class + * 协同设备类 + */ +class CollaborationDevice : public QObject +{ + Q_OBJECT +public: + explicit CollaborationDevice(const QString &devPath, QObject *parent = nullptr); + +signals: + void pairedStateChanged(bool); + +public: + bool isValid() const; + void pair() const; + void requestCooperate() const; + void disconnectDevice() const; + + QString name() const; + QString uuid() const; + QString machinePath() const; + QString deviceIcon() const; + bool isPaired() const; + bool isCooperated() const; + void setDeviceIsCooperating(bool isCooperating); + +private slots: + void onPropertyChanged(const QDBusMessage &msg); + +private: + QDBusMessage callMethod(const QString &methodName) const; + +private: + enum DeviceType { + Other = 0, + UOS, + Linux, + Windows, + MacOS, + Android + }; + + QString m_path; + QString m_name; + QString m_uuid; + int m_OS; + + bool m_isPaired; + bool m_isCooperated; + bool m_isValid; + + // 标记任务栏点击触发协同连接 + bool m_isCooperating; + + QDBusInterface *m_devDbusInter; +}; + +#endif // COLLABORATION_DEV_MODEL_H diff --git a/plugins/display/devcollaborationwidget.cpp b/plugins/display/devcollaborationwidget.cpp new file mode 100644 index 000000000..12706a6ee --- /dev/null +++ b/plugins/display/devcollaborationwidget.cpp @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "devcollaborationwidget.h" +#include "collaborationdevmodel.h" +#include "devitemdelegate.h" + +#include + +#include +#include +#include +#include +#include + +#define TITLE_HEIGHT 16 +#define ITEM_WIDTH 310 +#define ITEM_HEIGHT 36 +#define LISTVIEW_ITEM_SPACE 5 +#define PER_DEGREE 14 + +DevCollaborationWidget::DevCollaborationWidget(QWidget *parent) + : QWidget(parent) + , m_deviceModel(new CollaborationDevModel(this)) + , m_deviceListView(new DListView(this)) + , m_viewItemModel(new QStandardItemModel(m_deviceListView)) + , m_refreshTimer(new QTimer(this)) +{ + initUI(); + loadDevice(); + + connect(m_deviceModel, &CollaborationDevModel::devicesChanged, this, &DevCollaborationWidget::loadDevice); + connect(m_deviceListView, &DListView::clicked, this, &DevCollaborationWidget::itemClicked); + connect(m_refreshTimer, &QTimer::timeout, this, &DevCollaborationWidget::refreshViewItem); +} + +void DevCollaborationWidget::showEvent(QShowEvent *event) +{ + m_deviceModel->checkServiceValid(); + + QWidget::showEvent(event); +} + +void DevCollaborationWidget::resizeEvent(QResizeEvent *event) +{ + Q_EMIT sizeChanged(); + + QWidget::resizeEvent(event); +} + +void DevCollaborationWidget::initUI() +{ + m_deviceListView->setModel(m_viewItemModel); + + QLabel *title = new QLabel(tr("Cross-end Collaboration"), this); + title->setFixedHeight(TITLE_HEIGHT); + + QHBoxLayout *hLayout = new QHBoxLayout(); + hLayout->setContentsMargins(10, 0, 0, 0); + hLayout->addWidget(title); + + QVBoxLayout *mainLayout = new QVBoxLayout(); + mainLayout->setMargin(0); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + mainLayout->addLayout(hLayout); + mainLayout->addWidget(m_deviceListView); + + setLayout(mainLayout); + + m_deviceListView->setContentsMargins(0, 0, 0, 0); + m_deviceListView->setFrameShape(QFrame::NoFrame); + m_deviceListView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + m_deviceListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_deviceListView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + m_deviceListView->setResizeMode(QListView::Adjust); + m_deviceListView->setViewportMargins(0, 0, 0, 0); + m_deviceListView->setSpacing(LISTVIEW_ITEM_SPACE); + m_deviceListView->setEditTriggers(QAbstractItemView::NoEditTriggers); + m_deviceListView->setItemDelegate(new DevItemDelegate(this)); +} + +void DevCollaborationWidget::loadDevice() +{ + if (!m_deviceListView->count()) { + for (CollaborationDevice *device : m_deviceModel->devices()) { + addItem(device); + } + } else { + updateDeviceListView(); + } + + if(!m_deviceListView->count()) { + m_deviceListView->hide(); + } else { + if (!m_deviceListView->isVisible()) + m_deviceListView->setVisible(true); + + m_deviceListView->setFixedSize(ITEM_WIDTH, m_deviceListView->count() * ITEM_HEIGHT + LISTVIEW_ITEM_SPACE * (m_deviceListView->count() * 2)); + } + + resetWidgetSize(); +} + +void DevCollaborationWidget::addItem(const CollaborationDevice *device) +{ + if (!device) + return; + + QStandardItem *item = new QStandardItem(); + DevItemDelegate::DevItemData data; + data.checkedIconPath = device->deviceIcon(); // TODO + data.text = device->name(); + data.iconPath = device->deviceIcon(); + int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; + + item->setData(QVariant::fromValue(data), DevItemDelegate::StaticDataRole); + item->setData(device->machinePath(), DevItemDelegate::MachinePathDataRole); + item->setData(0, DevItemDelegate::DegreeDataRole); + item->setData(resultState, DevItemDelegate::ResultDataRole); + + m_viewItemModel->appendRow(item); + m_deviceItemMap[device->machinePath()] = item; + + connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged); +} + +void DevCollaborationWidget::updateDeviceListView() +{ + QList devices = m_deviceModel->devices(); + if (devices.isEmpty()) { + m_deviceListView->removeItems(0, m_deviceListView->count()); + m_deviceItemMap.clear(); + m_connectingDevices.clear(); + return; + } + + // 删除不存在设备 + for (int row = 0; row < m_deviceListView->count(); row++) { + QStandardItem *item = m_viewItemModel->item(row); + if (!item) + continue; + + QString machinePath = item->data(DevItemDelegate::MachinePathDataRole).toString(); + if (m_deviceModel->getDevice(machinePath)) + continue; + + m_deviceListView->removeItem(row); + + if (m_deviceItemMap.contains(machinePath)) { + m_deviceItemMap.remove(machinePath); + } + + if (m_connectingDevices.contains(machinePath)) { + m_connectingDevices.removeAll(machinePath); + } + } + + // 处理新增 + for (CollaborationDevice *device : devices) { + if (!m_deviceItemMap.contains(device->machinePath())) { + addItem(device); + } + } +} + +void DevCollaborationWidget::resetWidgetSize() +{ + int height = TITLE_HEIGHT + (m_deviceListView->count() ? m_deviceListView->height() : 0); + + setFixedSize(ITEM_WIDTH, height); +} + +void DevCollaborationWidget::itemClicked(const QModelIndex &index) +{ + QString machinePath = index.data(DevItemDelegate::MachinePathDataRole).toString(); + CollaborationDevice *device = m_deviceModel->getDevice(machinePath); + if (!device) + return; + + if (!device->isPaired()) { + device->setDeviceIsCooperating(true); + device->pair(); + if (!m_connectingDevices.contains(machinePath)) + m_connectingDevices.append(machinePath); + } else if (!device->isCooperated()) { + device->requestCooperate(); + if (!m_connectingDevices.contains(machinePath)) + m_connectingDevices.append(machinePath); + } else if (device->isCooperated()) { + device->disconnectDevice(); + if (m_connectingDevices.contains(machinePath)) + m_connectingDevices.removeOne(machinePath); + } + + if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive()) + m_refreshTimer->start(80); +} + +void DevCollaborationWidget::itemStatusChanged() +{ + CollaborationDevice *device = qobject_cast(sender()); + if (!device) + return; + + device->setDeviceIsCooperating(false); + QString machinePath = device->machinePath(); + if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { + // 更新item的连接状态 + int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; + m_deviceItemMap[machinePath]->setData(resultState, DevItemDelegate::ResultDataRole); + if (device->isCooperated() || !device->isPaired()) + m_deviceItemMap[machinePath]->setData(0, DevItemDelegate::DegreeDataRole); + + m_deviceListView->update(m_deviceItemMap[machinePath]->index()); + + if ((resultState == DevItemDelegate::Connected || !device->isPaired()) && m_connectingDevices.contains(machinePath)) { + m_connectingDevices.removeAll(machinePath); + } + } +} + +void DevCollaborationWidget::refreshViewItem() +{ + if (m_connectingDevices.isEmpty()) { + m_refreshTimer->stop(); + return; + } + + for (const QString &machinePath : m_connectingDevices) { + if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { + int degree = m_deviceItemMap[machinePath]->data(DevItemDelegate::DegreeDataRole).toInt(); + degree += PER_DEGREE; // 递进值 + m_deviceItemMap[machinePath]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole); + m_deviceItemMap[machinePath]->setData(degree, DevItemDelegate::DegreeDataRole); + m_deviceListView->update(m_deviceItemMap[machinePath]->index()); + } + } +} diff --git a/plugins/display/devcollaborationwidget.h b/plugins/display/devcollaborationwidget.h new file mode 100644 index 000000000..421208e00 --- /dev/null +++ b/plugins/display/devcollaborationwidget.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef DEVICE_COLLABORATION_WIDGET_H +#define DEVICE_COLLABORATION_WIDGET_H + +#include +#include + +DWIDGET_USE_NAMESPACE + +class CollaborationDevice; +class CollaborationDevModel; + +/*! + * \brief The DevCollaborationWidget class + * 设备跨端协同子页面 + */ +class DevCollaborationWidget : public QWidget +{ + Q_OBJECT +public: + explicit DevCollaborationWidget(QWidget *parent = nullptr); + +signals: + void sizeChanged(); + +protected: + void showEvent(QShowEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + +private slots: + void loadDevice(); + void itemClicked(const QModelIndex &index); + void itemStatusChanged(); + void refreshViewItem(); + +private: + void initUI(); + void updateDeviceListView(); + + void addItem(const CollaborationDevice *device); + void resetWidgetSize(); + +private: + CollaborationDevModel *m_deviceModel; + DListView *m_deviceListView; + QStandardItemModel *m_viewItemModel; + QMap m_deviceItemMap; + QStringList m_connectingDevices; + + QTimer *m_refreshTimer; +}; + +#endif // DEVICE_COLLABORATION_WIDGET_H diff --git a/plugins/display/devitemdelegate.cpp b/plugins/display/devitemdelegate.cpp new file mode 100644 index 000000000..73e50d222 --- /dev/null +++ b/plugins/display/devitemdelegate.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "devitemdelegate.h" + +#include +#include +#include + +#include + +#define RADIUS_VALUE 10 +#define ITEM_SPACE 20 +#define ICON_WIDTH 16 +#define ICON_HEIGHT 16 +#define TEXT_RECT_HEIGHT 20 +#define ITEM_HEIGHT 36 +#define INDICATOR_SHADOW_OFFSET 10 + +DevItemDelegate::DevItemDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ + +} + +void DevItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + if (!index.isValid()) + return; + + painter->setRenderHint(QPainter::Antialiasing); + QVariant var = index.data(StaticDataRole); + DevItemData itemData = var.value(); + QRect rect = option.rect; + QPen pen; + pen.setWidth(2); + + // 鼠标悬停 + if (option.state.testFlag(QStyle::State_MouseOver)) { + pen.setColor(QColor("#EBECED")); + painter->setPen(pen); + painter->setBrush(QColor("#EBECED")); + painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); + } + + // 选中背景(连接上和选中) + int result = index.data(ResultDataRole).toInt(); + if (option.state.testFlag(QStyle::State_Selected) && result == Connected) { + pen.setColor(QColor("#0081FF")); + painter->setPen(pen); + painter->setBrush(QColor("#0081FF")); + painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); + } else { + // 绘制默认背景 + pen.setColor(QColor("#EBECED")); + painter->setPen(pen); + painter->setBrush(QColor("#EBECED")); + painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); + } + + bool selected = (option.state.testFlag(QStyle::State_Selected) && result == Connected); + + // 绘制Icon + QString imagePath = selected ? itemData.checkedIconPath : itemData.iconPath; + QRect iconRect = QRect(rect.left() + ITEM_SPACE, rect.top() + rect.height() / 2 - ICON_HEIGHT / 2, + ICON_WIDTH, ICON_HEIGHT); + painter->drawImage(iconRect, QImage(imagePath)); + + // 绘制text + QFont font = Dtk::Widget::DFontSizeManager::instance()->t4(); + painter->setFont(font); + pen.setColor(selected ? Qt::white : Qt::black); + painter->setPen(pen); + + int textRectWidth = rect.width() - ITEM_SPACE - iconRect.width() - iconRect.width() - ITEM_SPACE; + QRect textRect = QRect(iconRect.right() + ITEM_SPACE, rect.top() + 2, + textRectWidth, rect.height()); + + QFontMetrics fm(font); + QString itemText = fm.elidedText(itemData.text, Qt::ElideRight, textRectWidth); + painter->drawText(textRect, itemText); + + switch (result) { + case ResultState::Connected: + drawResultState(painter, rect); + break; + case ResultState::Connecting: + drawWaitingState(painter, rect, index.data(DegreeDataRole).toInt()); + break; + default: + break; + } +} + +QSize DevItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(index) + return QSize(option.rect.width(), ITEM_HEIGHT); +} + +void DevItemDelegate::drawWaitingState(QPainter *painter, const QRect &rect, int degree) const +{ + int left = rect.width() - ITEM_SPACE; + int top = rect.top() + rect.height() / 2 - ICON_HEIGHT / 2; + QRect newRect(left, top, ICON_WIDTH, ICON_HEIGHT); + + painter->setRenderHint(QPainter::Antialiasing, true); + QList> indicatorColors; + for (int i = 0; i < 3; i++) + indicatorColors << createDefaultIndicatorColorList(QColor("#0081FF")); + + double radius = 16 * 0.66; + auto center = QRectF(newRect).center(); + auto indicatorRadius = radius / 2 / 2 * 1.1; + auto indicatorDegreeDelta = 360 / indicatorColors.count(); + + for (int i = 0; i < indicatorColors.count(); ++i) { + QList colors = indicatorColors.value(i); + for (int j = 0; j < colors.count(); ++j) { + double degreeCurrent = degree - j * INDICATOR_SHADOW_OFFSET + indicatorDegreeDelta * i; + auto x = (radius - indicatorRadius) * qCos(qDegreesToRadians(degreeCurrent)); + auto y = (radius - indicatorRadius) * qSin(qDegreesToRadians(degreeCurrent)); + + x = center.x() + x; + y = center.y() + y; + auto tl = QPointF(x - 1 * indicatorRadius, y - 1 * indicatorRadius); + QRectF rf(tl.x(), tl.y(), indicatorRadius * 2, indicatorRadius * 2); + + QPainterPath path; + path.addEllipse(rf); + + painter->fillPath(path, colors.value(j)); + } + } +} + +void DevItemDelegate::drawResultState(QPainter *painter, const QRect &rect) const +{ + // 绘制对勾,14x12 + int left = rect.width() - ITEM_SPACE; + int top = rect.top() + rect.height() / 2 - 6; + + QPainterPath path; + path.moveTo(left, top + 6); + path.lineTo(left + 4, top + 11); + path.lineTo(left + 12, top + 1); + + painter->drawPath(path); +} + +QList DevItemDelegate::createDefaultIndicatorColorList(QColor color) const +{ + QList colors; + QList opacitys; + opacitys << 100 << 30 << 15 << 10 << 5 << 4 << 3 << 2 << 1; + for (int i = 0; i < opacitys.count(); ++i) { + color.setAlpha(255 * opacitys.value(i) / 100); + colors << color; + } + + return colors; +} diff --git a/plugins/display/devitemdelegate.h b/plugins/display/devitemdelegate.h new file mode 100644 index 000000000..e97d3455a --- /dev/null +++ b/plugins/display/devitemdelegate.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef DEVITEMDELEGATE_H +#define DEVITEMDELEGATE_H + +#include + +/*! + * \brief The DevItemDelegate class + */ +class DevItemDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + enum DevItemDataRole { + StaticDataRole = Qt::UserRole + 1, // 静态信息 + MachinePathDataRole = Qt::UserRole + 2, // machinePath, 可唯一代表一个设备 + DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数 + ResultDataRole = Qt::UserRole + 4 // 连接结果 + }; + + enum ResultState { + None, + Connecting, + Connected + }; + + struct DevItemData { + QString checkedIconPath; + QString iconPath; + QString text; + }; + +public: + explicit DevItemDelegate(QObject *parent = nullptr); + +protected: + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; + +private: + void drawWaitingState(QPainter *painter, const QRect &rect, int degree) const; + void drawResultState(QPainter *painter, const QRect &rect) const; + QList createDefaultIndicatorColorList(QColor color) const; +}; + +Q_DECLARE_METATYPE(DevItemDelegate::DevItemData) + +#endif // DEVITEMDELEGATE_H diff --git a/plugins/display/display.json b/plugins/display/display.json new file mode 100644 index 000000000..bec81f0da --- /dev/null +++ b/plugins/display/display.json @@ -0,0 +1,3 @@ +{ + "api": "2.0.0" +} diff --git a/plugins/display/displayplugin.cpp b/plugins/display/displayplugin.cpp new file mode 100644 index 000000000..86258b1a5 --- /dev/null +++ b/plugins/display/displayplugin.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#include "displayplugin.h" +#include "brightnesswidget.h" +#include "displaysettingwidget.h" +#include "brightnesswidget.h" +#include "brightnessmodel.h" + +#include "../../widgets/tipswidget.h" +#include "../../frame/util/utils.h" + +#include + +#include +#include + +#include + +#define PLUGIN_STATE_KEY "enable" +#define TIME_FORMAT_KEY "Use24HourFormat" +using namespace Dock; +DisplayPlugin::DisplayPlugin(QObject *parent) + : QObject(parent) + , m_displayWidget(nullptr) + , m_displaySettingWidget(nullptr) + , m_displayTips(nullptr) + , m_model(new BrightnessModel(this)) +{ +} + +const QString DisplayPlugin::pluginName() const +{ + return "display"; +} + +const QString DisplayPlugin::pluginDisplayName() const +{ + return tr("brightness"); +} + +void DisplayPlugin::init(PluginProxyInterface *proxyInter) +{ + if (m_proxyInter == proxyInter) + return; + + m_proxyInter = proxyInter; + m_displayTips.reset(new TipsWidget); + m_displayWidget.reset(new BrightnessWidget(m_model)); + m_displayWidget->setFixedHeight(60); + m_displaySettingWidget.reset(new DisplaySettingWidget); + + m_proxyInter->itemAdded(this, pluginName()); + + connect(m_displayWidget.data(), &BrightnessWidget::brightClicked, this, [ this ] { + m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); + }); +} + +QWidget *DisplayPlugin::itemWidget(const QString &itemKey) +{ + if (itemKey == QUICK_ITEM_KEY) { + return m_displayWidget.data(); + } + + return nullptr; +} + +QWidget *DisplayPlugin::itemTipsWidget(const QString &itemKey) +{ + Q_UNUSED(itemKey); + + return m_displayTips.data(); +} + +QWidget *DisplayPlugin::itemPopupApplet(const QString &itemKey) +{ + if (itemKey == QUICK_ITEM_KEY) + return m_displaySettingWidget.data(); + + return nullptr; +} + +PluginFlags DisplayPlugin::flags() const +{ + return PluginFlag::Type_Common | PluginFlag::Quick_Full; +} diff --git a/plugins/display/displayplugin.h b/plugins/display/displayplugin.h new file mode 100644 index 000000000..ed1fe4064 --- /dev/null +++ b/plugins/display/displayplugin.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: sbw + * + * Maintainer: sbw + * + * 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 . + */ + +#ifndef DISPLAYPLUGIN_H +#define DISPLAYPLUGIN_H + +#include "pluginsiteminterface.h" + +#include +#include +#include + +namespace Dock{ +class TipsWidget; +} + +class BrightnessWidget; +class BrightnessModel; +class DisplaySettingWidget; + +class DisplayPlugin : public QObject, PluginsItemInterface +{ + Q_OBJECT + Q_INTERFACES(PluginsItemInterface) + Q_PLUGIN_METADATA(IID "com.deepin.dock.PluginsItemInterface" FILE "display.json") + +public: + explicit DisplayPlugin(QObject *parent = nullptr); + + const QString pluginName() const override; + const QString pluginDisplayName() const override; + void init(PluginProxyInterface *proxyInter) override; + + QWidget *itemWidget(const QString &itemKey) override; + QWidget *itemTipsWidget(const QString &itemKey) override; + QWidget *itemPopupApplet(const QString &itemKey) override; + + PluginFlags flags() const override; + +private: + QScopedPointer m_displayWidget; + QScopedPointer m_displaySettingWidget; + QScopedPointer m_displayTips; + BrightnessModel *m_model; +}; + +#endif // DATETIMEPLUGIN_H diff --git a/plugins/display/displaysettingwidget.cpp b/plugins/display/displaysettingwidget.cpp new file mode 100644 index 000000000..f27d1e21f --- /dev/null +++ b/plugins/display/displaysettingwidget.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#include "displaysettingwidget.h" +#include "brightnessadjwidget.h" +#include "devcollaborationwidget.h" + +#include +#include + +#include + +const int ItemSpacing = 10; + +DisplaySettingWidget::DisplaySettingWidget(QWidget *parent) + : QWidget(parent) + , m_brightnessAdjWidget(new BrightnessAdjWidget(this)) + , m_collaborationWidget(new DevCollaborationWidget(this)) + , m_settingBtn(new QPushButton(tr("Display setting"), this)) +{ + initUI(); + + connect(m_settingBtn, &QPushButton::clicked, this, [ this ](){ + DDBusSender().service("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .method("ShowPage").arg(QString("display")).call(); + hide(); + }); +} + +void DisplaySettingWidget::initUI() +{ + setContentsMargins(0, 10, 0, 30); + QVBoxLayout *mainLayout = new QVBoxLayout(); + mainLayout->setMargin(0); + mainLayout->setSpacing(ItemSpacing); + + mainLayout->addWidget(m_brightnessAdjWidget); + mainLayout->addWidget(m_collaborationWidget); + mainLayout->addWidget(m_settingBtn); + mainLayout->addStretch(); + + setLayout(mainLayout); + + resizeWidgetHeight(); + connect(m_collaborationWidget, &DevCollaborationWidget::sizeChanged, + this, &DisplaySettingWidget::resizeWidgetHeight); +} + +void DisplaySettingWidget::resizeWidgetHeight() +{ + QMargins margins = this->contentsMargins(); + setFixedHeight(margins.top() + margins.bottom() + m_brightnessAdjWidget->height() + + m_collaborationWidget->height() + m_settingBtn->height() + ItemSpacing * 2); +} diff --git a/plugins/display/displaysettingwidget.h b/plugins/display/displaysettingwidget.h new file mode 100644 index 000000000..9ea0b8fc4 --- /dev/null +++ b/plugins/display/displaysettingwidget.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. + * + * Author: zhaoyingzhen + * + * Maintainer: zhaoyingzhen + * + * 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 . + */ +#ifndef DISPLAY_SETTING_WIDGET_H +#define DISPLAY_SETTING_WIDGET_H + +#include + +class QPushButton; +class BrightnessAdjWidget; +class DevCollaborationWidget; + +/*! + * \brief The DisplaySettingWidget class + * 显示设置页面,快捷设置面板-->亮度调节栏右边显示按钮-->此页面 + */ +class DisplaySettingWidget : public QWidget +{ + Q_OBJECT +public: + explicit DisplaySettingWidget(QWidget *parent = nullptr); + +private: + void initUI(); + void resizeWidgetHeight(); + +private: + BrightnessAdjWidget *m_brightnessAdjWidget; // 亮度调整 + DevCollaborationWidget *m_collaborationWidget; // 跨端协同 + QPushButton *m_settingBtn; // 设置按钮 +}; + + +#endif // DISPLAY_SETTING_WIDGET_H diff --git a/plugins/display/resource/ICON_Device_Headphone.svg b/plugins/display/resource/ICON_Device_Headphone.svg new file mode 100644 index 000000000..c2aeaccf2 --- /dev/null +++ b/plugins/display/resource/ICON_Device_Headphone.svg @@ -0,0 +1,17 @@ + + + -mockplus- + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/display/resource/ICON_Device_Headphone_dark.svg b/plugins/display/resource/ICON_Device_Headphone_dark.svg new file mode 100644 index 000000000..7c797d1e1 --- /dev/null +++ b/plugins/display/resource/ICON_Device_Headphone_dark.svg @@ -0,0 +1,17 @@ + + + -mockplus- + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/display/resource/ICON_Device_Laptop.svg b/plugins/display/resource/ICON_Device_Laptop.svg new file mode 100644 index 000000000..115314c7c --- /dev/null +++ b/plugins/display/resource/ICON_Device_Laptop.svg @@ -0,0 +1,17 @@ + + + -mockplus- + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/display/resource/ICON_Device_Laptop_dark.svg b/plugins/display/resource/ICON_Device_Laptop_dark.svg new file mode 100644 index 000000000..3ba0d45f1 --- /dev/null +++ b/plugins/display/resource/ICON_Device_Laptop_dark.svg @@ -0,0 +1,17 @@ + + + -mockplus- + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/display/resource/brightness.svg b/plugins/display/resource/brightness.svg new file mode 100644 index 000000000..31d4f9830 --- /dev/null +++ b/plugins/display/resource/brightness.svg @@ -0,0 +1,15 @@ + + + ICON / MenuItem / Brightness+ + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/display/resource/brightnesshigh.svg b/plugins/display/resource/brightnesshigh.svg new file mode 100644 index 000000000..baeb9afcd --- /dev/null +++ b/plugins/display/resource/brightnesshigh.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/display/resource/brightnesslow.svg b/plugins/display/resource/brightnesslow.svg new file mode 100644 index 000000000..c5a11a167 --- /dev/null +++ b/plugins/display/resource/brightnesslow.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/display/resource/broadcast.svg b/plugins/display/resource/broadcast.svg new file mode 100644 index 000000000..f45b1ae57 --- /dev/null +++ b/plugins/display/resource/broadcast.svg @@ -0,0 +1,15 @@ + + + ICON / MenuItem / Broadcast + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/display/resource/display.qrc b/plugins/display/resource/display.qrc new file mode 100644 index 000000000..0994b934f --- /dev/null +++ b/plugins/display/resource/display.qrc @@ -0,0 +1,12 @@ + + + brightness.svg + brightnesshigh.svg + brightnesslow.svg + broadcast.svg + ICON_Device_Headphone_dark.svg + ICON_Device_Headphone.svg + ICON_Device_Laptop_dark.svg + ICON_Device_Laptop.svg + + From 7ad0475c6d168ec6a3c48b981024700ce853c060 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 13:27:56 +0800 Subject: [PATCH 168/257] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=AD=E5=AF=B9=E6=98=BE=E7=A4=BA=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=9A=84=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除亮度设置和相关的引用代码 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-220489.html Change-Id: I7c8f0e93d6b69a92242f3809aca2f6d3ac74fac5 --- frame/item/components/fullquickitem.cpp | 4 - frame/item/item.qrc | 9 +- .../item/resources/ICON_Device_Headphone.svg | 17 -- .../resources/ICON_Device_Headphone_dark.svg | 17 -- frame/item/resources/ICON_Device_Laptop.svg | 17 -- .../resources/ICON_Device_Laptop_dark.svg | 17 -- frame/item/resources/brightness.svg | 15 - frame/item/resources/brightnesshigh.svg | 3 - frame/item/resources/brightnesslow.svg | 3 - frame/model/brightnessmodel.cpp | 190 ------------- frame/model/brightnessmodel.h | 87 ------ frame/model/collaborationdevmodel.cpp | 267 ------------------ frame/model/collaborationdevmodel.h | 122 -------- .../window/components/brightnessadjwidget.cpp | 71 ----- frame/window/components/brightnessadjwidget.h | 48 ---- frame/window/components/brightnesswidget.cpp | 103 ------- frame/window/components/brightnesswidget.h | 58 ---- .../components/devcollaborationwidget.cpp | 256 ----------------- .../components/devcollaborationwidget.h | 72 ----- frame/window/components/devitemdelegate.cpp | 179 ------------ frame/window/components/devitemdelegate.h | 67 ----- .../components/displaysettingwidget.cpp | 73 ----- .../window/components/displaysettingwidget.h | 51 ---- frame/window/components/mediawidget.cpp | 1 - frame/window/quickpluginwindow.cpp | 26 +- frame/window/quickpluginwindow.h | 2 +- frame/window/quicksettingcontainer.cpp | 38 +-- frame/window/quicksettingcontainer.h | 5 - plugins/CMakeLists.txt | 1 + plugins/sound/sounddeviceswidget.cpp | 1 - plugins/sound/soundwidget.cpp | 1 - widgets/slidercontainer.cpp | 1 - 32 files changed, 20 insertions(+), 1802 deletions(-) delete mode 100644 frame/item/resources/ICON_Device_Headphone.svg delete mode 100644 frame/item/resources/ICON_Device_Headphone_dark.svg delete mode 100644 frame/item/resources/ICON_Device_Laptop.svg delete mode 100644 frame/item/resources/ICON_Device_Laptop_dark.svg delete mode 100644 frame/item/resources/brightness.svg delete mode 100644 frame/item/resources/brightnesshigh.svg delete mode 100644 frame/item/resources/brightnesslow.svg delete mode 100644 frame/model/brightnessmodel.cpp delete mode 100644 frame/model/brightnessmodel.h delete mode 100644 frame/model/collaborationdevmodel.cpp delete mode 100644 frame/model/collaborationdevmodel.h delete mode 100644 frame/window/components/brightnessadjwidget.cpp delete mode 100644 frame/window/components/brightnessadjwidget.h delete mode 100644 frame/window/components/brightnesswidget.cpp delete mode 100644 frame/window/components/brightnesswidget.h delete mode 100644 frame/window/components/devcollaborationwidget.cpp delete mode 100644 frame/window/components/devcollaborationwidget.h delete mode 100644 frame/window/components/devitemdelegate.cpp delete mode 100644 frame/window/components/devitemdelegate.h delete mode 100644 frame/window/components/displaysettingwidget.cpp delete mode 100644 frame/window/components/displaysettingwidget.h diff --git a/frame/item/components/fullquickitem.cpp b/frame/item/components/fullquickitem.cpp index b83fddc29..014dab01c 100644 --- a/frame/item/components/fullquickitem.cpp +++ b/frame/item/components/fullquickitem.cpp @@ -55,10 +55,6 @@ void FullQuickItem::initUi() m_effectWidget->setBlurRectXRadius(8); m_effectWidget->setBlurRectYRadius(8); - QIcon icon = pluginItem()->icon(DockPart::QuickPanel); - if (icon.isNull()) - return; - // 如果图标不为空 if (!m_centerWidget) return; diff --git a/frame/item/item.qrc b/frame/item/item.qrc index 789855e93..88004c5cb 100644 --- a/frame/item/item.qrc +++ b/frame/item/item.qrc @@ -71,8 +71,6 @@ resources/week5.svg resources/week6.svg resources/week7.svg - resources/brightnesshigh.svg - resources/brightnesslow.svg resources/audio-volume-high-dark.svg resources/audio-volume-high.svg resources/audio-volume-low-dark.svg @@ -81,14 +79,9 @@ resources/audio-volume-muted-dark.svg resources/audio-volume-muted.svg resources/audio-volume-medium-dark.svg - resources/brightness.svg resources/laptop.svg resources/volume.svg - resources/broadcast.svg - resources/ICON_Device_Headphone_dark.svg - resources/ICON_Device_Headphone.svg - resources/ICON_Device_Laptop_dark.svg - resources/ICON_Device_Laptop.svg resources/dcc_dock_plug_in.svg + resources/broadcast.svg diff --git a/frame/item/resources/ICON_Device_Headphone.svg b/frame/item/resources/ICON_Device_Headphone.svg deleted file mode 100644 index c2aeaccf2..000000000 --- a/frame/item/resources/ICON_Device_Headphone.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - -mockplus- - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frame/item/resources/ICON_Device_Headphone_dark.svg b/frame/item/resources/ICON_Device_Headphone_dark.svg deleted file mode 100644 index 7c797d1e1..000000000 --- a/frame/item/resources/ICON_Device_Headphone_dark.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - -mockplus- - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frame/item/resources/ICON_Device_Laptop.svg b/frame/item/resources/ICON_Device_Laptop.svg deleted file mode 100644 index 115314c7c..000000000 --- a/frame/item/resources/ICON_Device_Laptop.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - -mockplus- - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frame/item/resources/ICON_Device_Laptop_dark.svg b/frame/item/resources/ICON_Device_Laptop_dark.svg deleted file mode 100644 index 3ba0d45f1..000000000 --- a/frame/item/resources/ICON_Device_Laptop_dark.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - -mockplus- - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frame/item/resources/brightness.svg b/frame/item/resources/brightness.svg deleted file mode 100644 index 31d4f9830..000000000 --- a/frame/item/resources/brightness.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - ICON / MenuItem / Brightness+ - - - - - - - - - - - - \ No newline at end of file diff --git a/frame/item/resources/brightnesshigh.svg b/frame/item/resources/brightnesshigh.svg deleted file mode 100644 index baeb9afcd..000000000 --- a/frame/item/resources/brightnesshigh.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frame/item/resources/brightnesslow.svg b/frame/item/resources/brightnesslow.svg deleted file mode 100644 index c5a11a167..000000000 --- a/frame/item/resources/brightnesslow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frame/model/brightnessmodel.cpp b/frame/model/brightnessmodel.cpp deleted file mode 100644 index e7c024bce..000000000 --- a/frame/model/brightnessmodel.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * kirigaya - * Hualet - * - * Maintainer: sbw - * kirigaya - * Hualet - * - * 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 . - */ - -#include "brightnessmodel.h" - -#include -#include -#include -#include -#include -#include - -static const QString serviceName("com.deepin.daemon.Display"); -static const QString servicePath("/com/deepin/daemon/Display"); -static const QString serviceInterface("com.deepin.daemon.Display"); -static const QString propertiesInterface("org.freedesktop.DBus.Properties"); - -BrightnessModel::BrightnessModel(QObject *parent) - : QObject(parent) -{ - QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - // 读取所有的屏幕的信息 - QString primaryScreenName = dbusInter.property("Primary").value(); - QList paths = dbusInter.property("Monitors").value>(); - for (QDBusObjectPath path : paths) { - BrightMonitor *monitor = new BrightMonitor(path.path(), this); - monitor->setPrimary(primaryScreenName == monitor->name()); - m_monitor << monitor; - } - } - - connect(qApp, &QApplication::primaryScreenChanged, this, &BrightnessModel::primaryScreenChanged); -} - -BrightnessModel::~BrightnessModel() -{ -} - -QList BrightnessModel::monitors() -{ - return m_monitor; -} - -BrightMonitor *BrightnessModel::primaryMonitor() const -{ - for (BrightMonitor *monitor : m_monitor) { - if (monitor->isPrimary()) - return monitor; - } - - return nullptr; -} - -void BrightnessModel::primaryScreenChanged(QScreen *screen) -{ - BrightMonitor *defaultMonitor = nullptr; - for (BrightMonitor *monitor : m_monitor) { - monitor->setPrimary(monitor->name() == screen->name()); - if (monitor->isPrimary()) - defaultMonitor = monitor; - } - - if (defaultMonitor) - Q_EMIT primaryChanged(defaultMonitor); -} - -/** - * @brief monitor - */ -BrightMonitor::BrightMonitor(QString path, QObject *parent) - : QObject(parent) - , m_path(path) - , m_brightness(100) - , m_enabled(false) - , m_isPrimary(false) -{ - QDBusInterface dbusInter(serviceName, path, serviceInterface + QString(".Monitor"), QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - // 读取所有的屏幕的信息 - m_name = dbusInter.property("Name").toString(); - m_brightness = static_cast(dbusInter.property("Brightness").toDouble() * 100); - m_enabled = dbusInter.property("Enabled").toBool(); - } - - QDBusConnection::sessionBus().connect(serviceName, path, propertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); -} - -BrightMonitor::~BrightMonitor() -{ -} - -void BrightMonitor::setPrimary(bool primary) -{ - m_isPrimary = primary; -} - -int BrightMonitor::brightness() -{ - return m_brightness; -} - -bool BrightMonitor::enabled() -{ - return m_enabled; -} - -QString BrightMonitor::name() -{ - return m_name; -} - -bool BrightMonitor::isPrimary() -{ - return m_isPrimary; -} - -void BrightMonitor::setBrightness(int value) -{ - callMethod("SetBrightness", { m_name, static_cast(value * 0.01) }); -} - -void BrightMonitor::onPropertyChanged(const QDBusMessage &msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != QString("%1.Monitor").arg(serviceInterface)) - return; - - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - if (changedProps.contains("Brightness")) { - int brightness = static_cast(changedProps.value("Brightness").value() * 100); - if (brightness != m_brightness) { - m_brightness = brightness; - Q_EMIT brightnessChanged(brightness); - } - } - if (changedProps.contains("Name")) { - QString name = changedProps.value("Name").value(); - if (name != m_name) { - m_name = name; - Q_EMIT nameChanged(name); - } - } - if (changedProps.contains("Enabled")) { - bool enabled = changedProps.value("Enabled").value(); - if (enabled != m_enabled) { - m_enabled = enabled; - Q_EMIT enabledChanged(enabled); - } - } -} - -QDBusMessage BrightMonitor::callMethod(const QString &methodName, const QList &argument) -{ - QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); - if (dbusInter.isValid()) { - QDBusPendingCall reply = dbusInter.asyncCallWithArgumentList(methodName, argument); - reply.waitForFinished(); - return reply.reply(); - } - - return QDBusMessage(); -} diff --git a/frame/model/brightnessmodel.h b/frame/model/brightnessmodel.h deleted file mode 100644 index b9c0c022b..000000000 --- a/frame/model/brightnessmodel.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ - -#ifndef BRIGHTNESSMODEL_H -#define BRIGHTNESSMODEL_H - -#include - -class BrightMonitor; -class QDBusMessage; -class QScreen; - -class BrightnessModel : public QObject -{ - Q_OBJECT - -public: - explicit BrightnessModel(QObject *parent = nullptr); - ~BrightnessModel(); - - QList monitors(); - BrightMonitor *primaryMonitor() const; - -Q_SIGNALS: - void primaryChanged(BrightMonitor *); - -protected Q_SLOTS: - void primaryScreenChanged(QScreen *screen); - -private: - QList m_monitor; -}; - -class BrightMonitor : public QObject -{ - Q_OBJECT - -public: - explicit BrightMonitor(QString path, QObject *parent); - ~BrightMonitor(); - -Q_SIGNALS: - void brightnessChanged(int); - void nameChanged(QString); - void enabledChanged(bool); - -public: - void setPrimary(bool primary); - int brightness(); - bool enabled(); - QString name(); - bool isPrimary(); - -public slots: - void setBrightness(int value); - void onPropertyChanged(const QDBusMessage &msg); - -private: - QDBusMessage callMethod(const QString &methodName, const QList &argument); - -private: - QString m_path; - QString m_name; - int m_brightness; - bool m_enabled; - bool m_isPrimary; -}; - -#endif // DISPLAYMODEL_H diff --git a/frame/model/collaborationdevmodel.cpp b/frame/model/collaborationdevmodel.cpp deleted file mode 100644 index 6305ec88a..000000000 --- a/frame/model/collaborationdevmodel.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#include "collaborationdevmodel.h" - -#include -#include -#include -#include -#include -#include - -#include - -DGUI_USE_NAMESPACE -DCORE_USE_NAMESPACE - -static const QString CollaborationService = "com.deepin.Cooperation"; -static const QString CollaborationPath = "/com/deepin/Cooperation"; -static const QString CollaborationInterface = "com.deepin.Cooperation"; -static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties"; - -CollaborationDevModel::CollaborationDevModel(QObject *parent) - : QObject(parent) - , m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this)) -{ - if (m_colDbusInter->isValid()) { - QList paths = m_colDbusInter->property("Machines").value>(); - for (const QDBusObjectPath& path : paths) { - CollaborationDevice *device = new CollaborationDevice(path.path(), this); - if (device->isValid()) - m_devices[path.path()] = device; - else - device->deleteLater(); - } - } else { - qWarning() << CollaborationService << " is invalid"; - } - - m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); -} - -void CollaborationDevModel::checkServiceValid() -{ - if (!m_colDbusInter->isValid()) { - for (CollaborationDevice *device : m_devices) { - device->deleteLater(); - } - m_devices.clear(); - Q_EMIT devicesChanged(); - } -} - -QList CollaborationDevModel::devices() const -{ - return m_devices.values(); -} - -void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != CollaborationInterface) - return; - - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - if (changedProps.contains("Machines")) { - QList paths = m_colDbusInter->property("Machines").value>(); - QStringList devPaths; - for (const QDBusObjectPath& path : paths) { - devPaths << path.path(); - } - updateDevice(devPaths); - } -} - -void CollaborationDevModel::updateDevice(const QStringList &devPaths) -{ - if (devPaths.isEmpty()) { - qDeleteAll(m_devices); - m_devices.clear(); - } else { - // 清除已不存在的设备 - QMapIterator it(m_devices); - while (it.hasNext()) { - it.next(); - if (!devPaths.contains(it.key())) { - it.value()->deleteLater(); - m_devices.remove(it.key()); - } - } - - // 添加新增设备 - for (const QString &path : devPaths) { - if (!m_devices.contains(path)) { - CollaborationDevice *device = new CollaborationDevice(path, this); - if (device->isValid()) - m_devices[path] = device; - else - device->deleteLater(); - } - } - } - - emit devicesChanged(); -} - -CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath) -{ - return m_devices.value(machinePath, nullptr); -} - -CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent) - : QObject(parent) - , m_path(devPath) - , m_OS(-1) - , m_isPaired(false) - , m_isCooperated(false) - , m_isValid(false) - , m_isCooperating(false) - , m_devDbusInter(new QDBusInterface(CollaborationService, devPath, CollaborationInterface + QString(".Machine"), - QDBusConnection::sessionBus(), this)) -{ - if (m_devDbusInter->isValid()) { - m_name = m_devDbusInter->property("Name").toString(); - m_OS = m_devDbusInter->property("OS").toInt(); - m_isPaired = m_devDbusInter->property("Paired").toBool(); - m_isCooperated = m_devDbusInter->property("Cooperating").toBool(); - m_uuid = m_devDbusInter->property("UUID").toString(); - m_isValid = true; - } else { - qWarning() << "CollaborationDevice devPath:" << devPath << " is invalid and get properties failed"; - } - - m_devDbusInter->connection().connect(CollaborationService, m_path, ColPropertiesInterface, "PropertiesChanged", - this, SLOT(onPropertyChanged(QDBusMessage))); -} - -bool CollaborationDevice::isValid() const -{ - return m_isValid; -} - -QString CollaborationDevice::name() const -{ - return m_name; -} - -QString CollaborationDevice::uuid() const -{ - return m_uuid; -} - -QString CollaborationDevice::machinePath() const -{ - return m_path; -} - -QString CollaborationDevice::deviceIcon() const -{ - switch (m_OS) { - case DeviceType::Android: { - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - return QString(":/icons/resources/ICON_Device_Headphone_dark.svg"); - - return QString(":/icons/resources/ICON_Device_Headphone.svg"); - } - default: { - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - return QString(":/icons/resources/ICON_Device_Laptop_dark.svg"); - - return QString(":/icons/resources/ICON_Device_Laptop.svg"); - } - } -} - -bool CollaborationDevice::isPaired() const -{ - return m_isPaired; -} - -bool CollaborationDevice::isCooperated() const -{ - return m_isCooperated; -} - -void CollaborationDevice::setDeviceIsCooperating(bool isCooperating) -{ - m_isCooperating = isCooperating; -} - -void CollaborationDevice::onPropertyChanged(const QDBusMessage &msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != QString("%1.Machine").arg(CollaborationInterface)) - return; - - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - if (changedProps.contains("Paired")) { - bool isPaired = changedProps.value("Paired").value(); - m_isPaired = isPaired; - if (isPaired && m_isCooperating) { - // paired 成功之后再去请求cooperate - requestCooperate(); - } - - if (!isPaired){ - Q_EMIT pairedStateChanged(false); - } - } else if (changedProps.contains("Cooperating")) { - m_isCooperated = changedProps.value("Cooperating").value(); - - Q_EMIT pairedStateChanged(m_isCooperated); - } -} - -void CollaborationDevice::requestCooperate() const -{ - callMethod("RequestCooperate"); -} - -void CollaborationDevice::disconnectDevice() const -{ - callMethod("Disconnect"); -} - -void CollaborationDevice::pair() const -{ - callMethod("Pair"); -} - -QDBusMessage CollaborationDevice::callMethod(const QString &methodName) const -{ - if (m_devDbusInter->isValid()) { - QDBusMessage msg = m_devDbusInter->call(methodName); - qInfo() << "CollaborationDevice callMethod:" << methodName << " " << msg.errorMessage(); - return msg; - } - - qWarning() << "CollaborationDevice callMethod: " << methodName << " failed"; - return QDBusMessage(); -} diff --git a/frame/model/collaborationdevmodel.h b/frame/model/collaborationdevmodel.h deleted file mode 100644 index 013624211..000000000 --- a/frame/model/collaborationdevmodel.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#ifndef COLLABORATION_DEV_MODEL_H -#define COLLABORATION_DEV_MODEL_H - -#include -#include - -class QTimer; -class QDBusInterface; -class QDBusMessage; -class CollaborationDevice; - -/*! - * \brief The CollaborationDevModel class - * 协同设备model - */ -class CollaborationDevModel : public QObject -{ - Q_OBJECT -public: - explicit CollaborationDevModel(QObject *parent = nullptr); - -signals: - void devicesChanged(); - -public: - void checkServiceValid(); - - QList devices() const; - CollaborationDevice *getDevice(const QString &machinePath); - -private slots: - void onPropertyChanged(const QDBusMessage &msg); - -private: - void updateDevice(const QStringList &devPaths); - -private: - QDBusInterface *m_colDbusInter; - // machine path : device object - QMap m_devices; - -}; - -/*! - * \brief The CollaborationDevice class - * 协同设备类 - */ -class CollaborationDevice : public QObject -{ - Q_OBJECT -public: - explicit CollaborationDevice(const QString &devPath, QObject *parent = nullptr); - -signals: - void pairedStateChanged(bool); - -public: - bool isValid() const; - void pair() const; - void requestCooperate() const; - void disconnectDevice() const; - - QString name() const; - QString uuid() const; - QString machinePath() const; - QString deviceIcon() const; - bool isPaired() const; - bool isCooperated() const; - void setDeviceIsCooperating(bool isCooperating); - -private slots: - void onPropertyChanged(const QDBusMessage &msg); - -private: - QDBusMessage callMethod(const QString &methodName) const; - -private: - enum DeviceType { - Other = 0, - UOS, - Linux, - Windows, - MacOS, - Android - }; - - QString m_path; - QString m_name; - QString m_uuid; - int m_OS; - - bool m_isPaired; - bool m_isCooperated; - bool m_isValid; - - // 标记任务栏点击触发协同连接 - bool m_isCooperating; - - QDBusInterface *m_devDbusInter; -}; - -#endif // COLLABORATION_DEV_MODEL_H diff --git a/frame/window/components/brightnessadjwidget.cpp b/frame/window/components/brightnessadjwidget.cpp deleted file mode 100644 index 1b339a977..000000000 --- a/frame/window/components/brightnessadjwidget.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#include "brightnessadjwidget.h" -#include "brightnessmodel.h" -#include "slidercontainer.h" -#include "imageutil.h" - -#include - -const int ItemSpacing = 5; - -BrightnessAdjWidget::BrightnessAdjWidget(QWidget *parent) - : QWidget(parent) - , m_mainLayout(new QVBoxLayout(this)) - , m_brightnessModel(new BrightnessModel(this)) -{ - m_mainLayout->setMargin(0); - m_mainLayout->setSpacing(ItemSpacing); - - loadBrightnessItem(); -} - -void BrightnessAdjWidget::loadBrightnessItem() -{ - QList monitors = m_brightnessModel->monitors(); - int itemHeight = monitors.count() > 1 ? 56 : 30; - - for (BrightMonitor *monitor : monitors) { - SliderContainer *sliderContainer = new SliderContainer(this); - if (monitors.count() > 1) - sliderContainer->setTitle(monitor->name()); - - QPixmap leftPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesslow", QSize(20, 20)); - QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesshigh", QSize(20, 20)); - sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon,leftPixmap, QSize(), 12); - sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 12); - - sliderContainer->setFixedWidth(310); - sliderContainer->setFixedHeight(itemHeight); - sliderContainer->updateSliderValue(monitor->brightness()); - - SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); - sliderContainer->setSliderProxyStyle(proxy); - m_mainLayout->addWidget(sliderContainer); - - connect(monitor, &BrightMonitor::brightnessChanged, sliderContainer, &SliderContainer::updateSliderValue); - connect(sliderContainer, &SliderContainer::sliderValueChanged, monitor, &BrightMonitor::setBrightness); - } - - QMargins margins = this->contentsMargins(); - setFixedHeight(margins.top() + margins.bottom() + monitors.count() * itemHeight + monitors.count() * ItemSpacing); -} - diff --git a/frame/window/components/brightnessadjwidget.h b/frame/window/components/brightnessadjwidget.h deleted file mode 100644 index 74482c7d8..000000000 --- a/frame/window/components/brightnessadjwidget.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#ifndef BRIGHTNESS_ADJUSTMENT_WIDGET_H -#define BRIGHTNESS_ADJUSTMENT_WIDGET_H - -#include - -class QVBoxLayout; -class BrightnessModel; - -/*! - * \brief The BrightnessAdjWidget class - * 显示器亮度调整页面 - */ -class BrightnessAdjWidget : public QWidget -{ - Q_OBJECT -public: - explicit BrightnessAdjWidget(QWidget *parent = nullptr); - -private: - void loadBrightnessItem(); - -private: - QVBoxLayout *m_mainLayout; - BrightnessModel *m_brightnessModel; -}; - - -#endif // BRIGHTNESS_ADJUSTMENT_WIDGET_H diff --git a/frame/window/components/brightnesswidget.cpp b/frame/window/components/brightnesswidget.cpp deleted file mode 100644 index 4966f7e49..000000000 --- a/frame/window/components/brightnesswidget.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "brightnesswidget.h" -#include "brightnessmodel.h" -#include "imageutil.h" -#include "slidercontainer.h" - -#include -#include - -#define BACKSIZE 36 -#define IMAGESIZE 18 - -BrightnessWidget::BrightnessWidget(BrightnessModel *model, QWidget *parent) - : DBlurEffectWidget(parent) - , m_sliderContainer(new SliderContainer(this)) - , m_model(model) -{ - initUi(); - initConnection(); -} - -BrightnessWidget::~BrightnessWidget() -{ -} - -SliderContainer *BrightnessWidget::sliderContainer() -{ - return m_sliderContainer; -} - -void BrightnessWidget::showEvent(QShowEvent *event) -{ - DBlurEffectWidget::showEvent(event); - - // 显示的时候更新一下slider的主屏幕亮度值 - updateSliderValue(); - Q_EMIT visibleChanged(true); -} - -void BrightnessWidget::hideEvent(QHideEvent *event) -{ - DBlurEffectWidget::hideEvent(event); - - Q_EMIT visibleChanged(true); -} - -void BrightnessWidget::initUi() -{ - QHBoxLayout *mainLayout = new QHBoxLayout(this); - mainLayout->setContentsMargins(15, 0, 12, 0); - - QPixmap leftPixmap = ImageUtil::loadSvg(":/icons/resources/brightness.svg", QSize(IMAGESIZE, IMAGESIZE)); - QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/ICON_Device_Laptop.svg", QSize(IMAGESIZE, IMAGESIZE)); - m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); - m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); - - // 需求要求调节范围是10%-100%,且调节幅度为1% - m_sliderContainer->setRange(10, 100); - m_sliderContainer->setPageStep(1); - - SliderProxyStyle *style = new SliderProxyStyle; - m_sliderContainer->setSliderProxyStyle(style); - - mainLayout->addWidget(m_sliderContainer); -} - -void BrightnessWidget::initConnection() -{ - connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { - BrightMonitor *monitor = m_model->primaryMonitor(); - if (monitor) - monitor->setBrightness(value); - }); - - updateSliderValue(); -} - -void BrightnessWidget::updateSliderValue() -{ - BrightMonitor *monitor = m_model->primaryMonitor(); - if (monitor) { - m_sliderContainer->updateSliderValue(monitor->brightness()); - } -} diff --git a/frame/window/components/brightnesswidget.h b/frame/window/components/brightnesswidget.h deleted file mode 100644 index c8ca44721..000000000 --- a/frame/window/components/brightnesswidget.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef BRIGHTNESSWIDGET_H -#define BRIGHTNESSWIDGET_H - -#include - -DWIDGET_USE_NAMESPACE - -class SliderContainer; -class BrightnessModel; -class BrightMonitor; - -class BrightnessWidget : public DBlurEffectWidget -{ - Q_OBJECT - -public: - explicit BrightnessWidget(BrightnessModel *model, QWidget *parent = nullptr); - ~BrightnessWidget() override; - SliderContainer *sliderContainer(); - -Q_SIGNALS: - void visibleChanged(bool); - -protected: - void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; - -private: - void initUi(); - void initConnection(); - void updateSliderValue(); - -private: - SliderContainer *m_sliderContainer; - BrightnessModel *m_model; -}; - -#endif // LIGHTSETTINGWIDGET_H diff --git a/frame/window/components/devcollaborationwidget.cpp b/frame/window/components/devcollaborationwidget.cpp deleted file mode 100644 index 12706a6ee..000000000 --- a/frame/window/components/devcollaborationwidget.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#include "devcollaborationwidget.h" -#include "collaborationdevmodel.h" -#include "devitemdelegate.h" - -#include - -#include -#include -#include -#include -#include - -#define TITLE_HEIGHT 16 -#define ITEM_WIDTH 310 -#define ITEM_HEIGHT 36 -#define LISTVIEW_ITEM_SPACE 5 -#define PER_DEGREE 14 - -DevCollaborationWidget::DevCollaborationWidget(QWidget *parent) - : QWidget(parent) - , m_deviceModel(new CollaborationDevModel(this)) - , m_deviceListView(new DListView(this)) - , m_viewItemModel(new QStandardItemModel(m_deviceListView)) - , m_refreshTimer(new QTimer(this)) -{ - initUI(); - loadDevice(); - - connect(m_deviceModel, &CollaborationDevModel::devicesChanged, this, &DevCollaborationWidget::loadDevice); - connect(m_deviceListView, &DListView::clicked, this, &DevCollaborationWidget::itemClicked); - connect(m_refreshTimer, &QTimer::timeout, this, &DevCollaborationWidget::refreshViewItem); -} - -void DevCollaborationWidget::showEvent(QShowEvent *event) -{ - m_deviceModel->checkServiceValid(); - - QWidget::showEvent(event); -} - -void DevCollaborationWidget::resizeEvent(QResizeEvent *event) -{ - Q_EMIT sizeChanged(); - - QWidget::resizeEvent(event); -} - -void DevCollaborationWidget::initUI() -{ - m_deviceListView->setModel(m_viewItemModel); - - QLabel *title = new QLabel(tr("Cross-end Collaboration"), this); - title->setFixedHeight(TITLE_HEIGHT); - - QHBoxLayout *hLayout = new QHBoxLayout(); - hLayout->setContentsMargins(10, 0, 0, 0); - hLayout->addWidget(title); - - QVBoxLayout *mainLayout = new QVBoxLayout(); - mainLayout->setMargin(0); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(0); - mainLayout->addLayout(hLayout); - mainLayout->addWidget(m_deviceListView); - - setLayout(mainLayout); - - m_deviceListView->setContentsMargins(0, 0, 0, 0); - m_deviceListView->setFrameShape(QFrame::NoFrame); - m_deviceListView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - m_deviceListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_deviceListView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - m_deviceListView->setResizeMode(QListView::Adjust); - m_deviceListView->setViewportMargins(0, 0, 0, 0); - m_deviceListView->setSpacing(LISTVIEW_ITEM_SPACE); - m_deviceListView->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_deviceListView->setItemDelegate(new DevItemDelegate(this)); -} - -void DevCollaborationWidget::loadDevice() -{ - if (!m_deviceListView->count()) { - for (CollaborationDevice *device : m_deviceModel->devices()) { - addItem(device); - } - } else { - updateDeviceListView(); - } - - if(!m_deviceListView->count()) { - m_deviceListView->hide(); - } else { - if (!m_deviceListView->isVisible()) - m_deviceListView->setVisible(true); - - m_deviceListView->setFixedSize(ITEM_WIDTH, m_deviceListView->count() * ITEM_HEIGHT + LISTVIEW_ITEM_SPACE * (m_deviceListView->count() * 2)); - } - - resetWidgetSize(); -} - -void DevCollaborationWidget::addItem(const CollaborationDevice *device) -{ - if (!device) - return; - - QStandardItem *item = new QStandardItem(); - DevItemDelegate::DevItemData data; - data.checkedIconPath = device->deviceIcon(); // TODO - data.text = device->name(); - data.iconPath = device->deviceIcon(); - int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; - - item->setData(QVariant::fromValue(data), DevItemDelegate::StaticDataRole); - item->setData(device->machinePath(), DevItemDelegate::MachinePathDataRole); - item->setData(0, DevItemDelegate::DegreeDataRole); - item->setData(resultState, DevItemDelegate::ResultDataRole); - - m_viewItemModel->appendRow(item); - m_deviceItemMap[device->machinePath()] = item; - - connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged); -} - -void DevCollaborationWidget::updateDeviceListView() -{ - QList devices = m_deviceModel->devices(); - if (devices.isEmpty()) { - m_deviceListView->removeItems(0, m_deviceListView->count()); - m_deviceItemMap.clear(); - m_connectingDevices.clear(); - return; - } - - // 删除不存在设备 - for (int row = 0; row < m_deviceListView->count(); row++) { - QStandardItem *item = m_viewItemModel->item(row); - if (!item) - continue; - - QString machinePath = item->data(DevItemDelegate::MachinePathDataRole).toString(); - if (m_deviceModel->getDevice(machinePath)) - continue; - - m_deviceListView->removeItem(row); - - if (m_deviceItemMap.contains(machinePath)) { - m_deviceItemMap.remove(machinePath); - } - - if (m_connectingDevices.contains(machinePath)) { - m_connectingDevices.removeAll(machinePath); - } - } - - // 处理新增 - for (CollaborationDevice *device : devices) { - if (!m_deviceItemMap.contains(device->machinePath())) { - addItem(device); - } - } -} - -void DevCollaborationWidget::resetWidgetSize() -{ - int height = TITLE_HEIGHT + (m_deviceListView->count() ? m_deviceListView->height() : 0); - - setFixedSize(ITEM_WIDTH, height); -} - -void DevCollaborationWidget::itemClicked(const QModelIndex &index) -{ - QString machinePath = index.data(DevItemDelegate::MachinePathDataRole).toString(); - CollaborationDevice *device = m_deviceModel->getDevice(machinePath); - if (!device) - return; - - if (!device->isPaired()) { - device->setDeviceIsCooperating(true); - device->pair(); - if (!m_connectingDevices.contains(machinePath)) - m_connectingDevices.append(machinePath); - } else if (!device->isCooperated()) { - device->requestCooperate(); - if (!m_connectingDevices.contains(machinePath)) - m_connectingDevices.append(machinePath); - } else if (device->isCooperated()) { - device->disconnectDevice(); - if (m_connectingDevices.contains(machinePath)) - m_connectingDevices.removeOne(machinePath); - } - - if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive()) - m_refreshTimer->start(80); -} - -void DevCollaborationWidget::itemStatusChanged() -{ - CollaborationDevice *device = qobject_cast(sender()); - if (!device) - return; - - device->setDeviceIsCooperating(false); - QString machinePath = device->machinePath(); - if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { - // 更新item的连接状态 - int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; - m_deviceItemMap[machinePath]->setData(resultState, DevItemDelegate::ResultDataRole); - if (device->isCooperated() || !device->isPaired()) - m_deviceItemMap[machinePath]->setData(0, DevItemDelegate::DegreeDataRole); - - m_deviceListView->update(m_deviceItemMap[machinePath]->index()); - - if ((resultState == DevItemDelegate::Connected || !device->isPaired()) && m_connectingDevices.contains(machinePath)) { - m_connectingDevices.removeAll(machinePath); - } - } -} - -void DevCollaborationWidget::refreshViewItem() -{ - if (m_connectingDevices.isEmpty()) { - m_refreshTimer->stop(); - return; - } - - for (const QString &machinePath : m_connectingDevices) { - if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { - int degree = m_deviceItemMap[machinePath]->data(DevItemDelegate::DegreeDataRole).toInt(); - degree += PER_DEGREE; // 递进值 - m_deviceItemMap[machinePath]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole); - m_deviceItemMap[machinePath]->setData(degree, DevItemDelegate::DegreeDataRole); - m_deviceListView->update(m_deviceItemMap[machinePath]->index()); - } - } -} diff --git a/frame/window/components/devcollaborationwidget.h b/frame/window/components/devcollaborationwidget.h deleted file mode 100644 index 421208e00..000000000 --- a/frame/window/components/devcollaborationwidget.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#ifndef DEVICE_COLLABORATION_WIDGET_H -#define DEVICE_COLLABORATION_WIDGET_H - -#include -#include - -DWIDGET_USE_NAMESPACE - -class CollaborationDevice; -class CollaborationDevModel; - -/*! - * \brief The DevCollaborationWidget class - * 设备跨端协同子页面 - */ -class DevCollaborationWidget : public QWidget -{ - Q_OBJECT -public: - explicit DevCollaborationWidget(QWidget *parent = nullptr); - -signals: - void sizeChanged(); - -protected: - void showEvent(QShowEvent *event) override; - void resizeEvent(QResizeEvent *event) override; - -private slots: - void loadDevice(); - void itemClicked(const QModelIndex &index); - void itemStatusChanged(); - void refreshViewItem(); - -private: - void initUI(); - void updateDeviceListView(); - - void addItem(const CollaborationDevice *device); - void resetWidgetSize(); - -private: - CollaborationDevModel *m_deviceModel; - DListView *m_deviceListView; - QStandardItemModel *m_viewItemModel; - QMap m_deviceItemMap; - QStringList m_connectingDevices; - - QTimer *m_refreshTimer; -}; - -#endif // DEVICE_COLLABORATION_WIDGET_H diff --git a/frame/window/components/devitemdelegate.cpp b/frame/window/components/devitemdelegate.cpp deleted file mode 100644 index 73e50d222..000000000 --- a/frame/window/components/devitemdelegate.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#include "devitemdelegate.h" - -#include -#include -#include - -#include - -#define RADIUS_VALUE 10 -#define ITEM_SPACE 20 -#define ICON_WIDTH 16 -#define ICON_HEIGHT 16 -#define TEXT_RECT_HEIGHT 20 -#define ITEM_HEIGHT 36 -#define INDICATOR_SHADOW_OFFSET 10 - -DevItemDelegate::DevItemDelegate(QObject *parent) - : QStyledItemDelegate(parent) -{ - -} - -void DevItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - if (!index.isValid()) - return; - - painter->setRenderHint(QPainter::Antialiasing); - QVariant var = index.data(StaticDataRole); - DevItemData itemData = var.value(); - QRect rect = option.rect; - QPen pen; - pen.setWidth(2); - - // 鼠标悬停 - if (option.state.testFlag(QStyle::State_MouseOver)) { - pen.setColor(QColor("#EBECED")); - painter->setPen(pen); - painter->setBrush(QColor("#EBECED")); - painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); - } - - // 选中背景(连接上和选中) - int result = index.data(ResultDataRole).toInt(); - if (option.state.testFlag(QStyle::State_Selected) && result == Connected) { - pen.setColor(QColor("#0081FF")); - painter->setPen(pen); - painter->setBrush(QColor("#0081FF")); - painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); - } else { - // 绘制默认背景 - pen.setColor(QColor("#EBECED")); - painter->setPen(pen); - painter->setBrush(QColor("#EBECED")); - painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE); - } - - bool selected = (option.state.testFlag(QStyle::State_Selected) && result == Connected); - - // 绘制Icon - QString imagePath = selected ? itemData.checkedIconPath : itemData.iconPath; - QRect iconRect = QRect(rect.left() + ITEM_SPACE, rect.top() + rect.height() / 2 - ICON_HEIGHT / 2, - ICON_WIDTH, ICON_HEIGHT); - painter->drawImage(iconRect, QImage(imagePath)); - - // 绘制text - QFont font = Dtk::Widget::DFontSizeManager::instance()->t4(); - painter->setFont(font); - pen.setColor(selected ? Qt::white : Qt::black); - painter->setPen(pen); - - int textRectWidth = rect.width() - ITEM_SPACE - iconRect.width() - iconRect.width() - ITEM_SPACE; - QRect textRect = QRect(iconRect.right() + ITEM_SPACE, rect.top() + 2, - textRectWidth, rect.height()); - - QFontMetrics fm(font); - QString itemText = fm.elidedText(itemData.text, Qt::ElideRight, textRectWidth); - painter->drawText(textRect, itemText); - - switch (result) { - case ResultState::Connected: - drawResultState(painter, rect); - break; - case ResultState::Connecting: - drawWaitingState(painter, rect, index.data(DegreeDataRole).toInt()); - break; - default: - break; - } -} - -QSize DevItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - Q_UNUSED(index) - return QSize(option.rect.width(), ITEM_HEIGHT); -} - -void DevItemDelegate::drawWaitingState(QPainter *painter, const QRect &rect, int degree) const -{ - int left = rect.width() - ITEM_SPACE; - int top = rect.top() + rect.height() / 2 - ICON_HEIGHT / 2; - QRect newRect(left, top, ICON_WIDTH, ICON_HEIGHT); - - painter->setRenderHint(QPainter::Antialiasing, true); - QList> indicatorColors; - for (int i = 0; i < 3; i++) - indicatorColors << createDefaultIndicatorColorList(QColor("#0081FF")); - - double radius = 16 * 0.66; - auto center = QRectF(newRect).center(); - auto indicatorRadius = radius / 2 / 2 * 1.1; - auto indicatorDegreeDelta = 360 / indicatorColors.count(); - - for (int i = 0; i < indicatorColors.count(); ++i) { - QList colors = indicatorColors.value(i); - for (int j = 0; j < colors.count(); ++j) { - double degreeCurrent = degree - j * INDICATOR_SHADOW_OFFSET + indicatorDegreeDelta * i; - auto x = (radius - indicatorRadius) * qCos(qDegreesToRadians(degreeCurrent)); - auto y = (radius - indicatorRadius) * qSin(qDegreesToRadians(degreeCurrent)); - - x = center.x() + x; - y = center.y() + y; - auto tl = QPointF(x - 1 * indicatorRadius, y - 1 * indicatorRadius); - QRectF rf(tl.x(), tl.y(), indicatorRadius * 2, indicatorRadius * 2); - - QPainterPath path; - path.addEllipse(rf); - - painter->fillPath(path, colors.value(j)); - } - } -} - -void DevItemDelegate::drawResultState(QPainter *painter, const QRect &rect) const -{ - // 绘制对勾,14x12 - int left = rect.width() - ITEM_SPACE; - int top = rect.top() + rect.height() / 2 - 6; - - QPainterPath path; - path.moveTo(left, top + 6); - path.lineTo(left + 4, top + 11); - path.lineTo(left + 12, top + 1); - - painter->drawPath(path); -} - -QList DevItemDelegate::createDefaultIndicatorColorList(QColor color) const -{ - QList colors; - QList opacitys; - opacitys << 100 << 30 << 15 << 10 << 5 << 4 << 3 << 2 << 1; - for (int i = 0; i < opacitys.count(); ++i) { - color.setAlpha(255 * opacitys.value(i) / 100); - colors << color; - } - - return colors; -} diff --git a/frame/window/components/devitemdelegate.h b/frame/window/components/devitemdelegate.h deleted file mode 100644 index e97d3455a..000000000 --- a/frame/window/components/devitemdelegate.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#ifndef DEVITEMDELEGATE_H -#define DEVITEMDELEGATE_H - -#include - -/*! - * \brief The DevItemDelegate class - */ -class DevItemDelegate : public QStyledItemDelegate -{ - Q_OBJECT -public: - enum DevItemDataRole { - StaticDataRole = Qt::UserRole + 1, // 静态信息 - MachinePathDataRole = Qt::UserRole + 2, // machinePath, 可唯一代表一个设备 - DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数 - ResultDataRole = Qt::UserRole + 4 // 连接结果 - }; - - enum ResultState { - None, - Connecting, - Connected - }; - - struct DevItemData { - QString checkedIconPath; - QString iconPath; - QString text; - }; - -public: - explicit DevItemDelegate(QObject *parent = nullptr); - -protected: - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; - -private: - void drawWaitingState(QPainter *painter, const QRect &rect, int degree) const; - void drawResultState(QPainter *painter, const QRect &rect) const; - QList createDefaultIndicatorColorList(QColor color) const; -}; - -Q_DECLARE_METATYPE(DevItemDelegate::DevItemData) - -#endif // DEVITEMDELEGATE_H diff --git a/frame/window/components/displaysettingwidget.cpp b/frame/window/components/displaysettingwidget.cpp deleted file mode 100644 index f27d1e21f..000000000 --- a/frame/window/components/displaysettingwidget.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#include "displaysettingwidget.h" -#include "brightnessadjwidget.h" -#include "devcollaborationwidget.h" - -#include -#include - -#include - -const int ItemSpacing = 10; - -DisplaySettingWidget::DisplaySettingWidget(QWidget *parent) - : QWidget(parent) - , m_brightnessAdjWidget(new BrightnessAdjWidget(this)) - , m_collaborationWidget(new DevCollaborationWidget(this)) - , m_settingBtn(new QPushButton(tr("Display setting"), this)) -{ - initUI(); - - connect(m_settingBtn, &QPushButton::clicked, this, [ this ](){ - DDBusSender().service("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") - .method("ShowPage").arg(QString("display")).call(); - hide(); - }); -} - -void DisplaySettingWidget::initUI() -{ - setContentsMargins(0, 10, 0, 30); - QVBoxLayout *mainLayout = new QVBoxLayout(); - mainLayout->setMargin(0); - mainLayout->setSpacing(ItemSpacing); - - mainLayout->addWidget(m_brightnessAdjWidget); - mainLayout->addWidget(m_collaborationWidget); - mainLayout->addWidget(m_settingBtn); - mainLayout->addStretch(); - - setLayout(mainLayout); - - resizeWidgetHeight(); - connect(m_collaborationWidget, &DevCollaborationWidget::sizeChanged, - this, &DisplaySettingWidget::resizeWidgetHeight); -} - -void DisplaySettingWidget::resizeWidgetHeight() -{ - QMargins margins = this->contentsMargins(); - setFixedHeight(margins.top() + margins.bottom() + m_brightnessAdjWidget->height() + - m_collaborationWidget->height() + m_settingBtn->height() + ItemSpacing * 2); -} diff --git a/frame/window/components/displaysettingwidget.h b/frame/window/components/displaysettingwidget.h deleted file mode 100644 index 9ea0b8fc4..000000000 --- a/frame/window/components/displaysettingwidget.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd. - * - * Author: zhaoyingzhen - * - * Maintainer: zhaoyingzhen - * - * 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 . - */ -#ifndef DISPLAY_SETTING_WIDGET_H -#define DISPLAY_SETTING_WIDGET_H - -#include - -class QPushButton; -class BrightnessAdjWidget; -class DevCollaborationWidget; - -/*! - * \brief The DisplaySettingWidget class - * 显示设置页面,快捷设置面板-->亮度调节栏右边显示按钮-->此页面 - */ -class DisplaySettingWidget : public QWidget -{ - Q_OBJECT -public: - explicit DisplaySettingWidget(QWidget *parent = nullptr); - -private: - void initUI(); - void resizeWidgetHeight(); - -private: - BrightnessAdjWidget *m_brightnessAdjWidget; // 亮度调整 - DevCollaborationWidget *m_collaborationWidget; // 跨端协同 - QPushButton *m_settingBtn; // 设置按钮 -}; - - -#endif // DISPLAY_SETTING_WIDGET_H diff --git a/frame/window/components/mediawidget.cpp b/frame/window/components/mediawidget.cpp index 3c7c18d70..cebf1a28a 100644 --- a/frame/window/components/mediawidget.cpp +++ b/frame/window/components/mediawidget.cpp @@ -18,7 +18,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "brightnessmodel.h" #include "mediawidget.h" #include diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index e2b9fd5f9..e3416949a 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -306,33 +306,37 @@ void QuickPluginWindow::onRequestUpdate() QPoint QuickPluginWindow::popupPoint(QWidget *widget) const { - if (!widget) - return pos(); + QWidget *itemWidget = widget; + if (!itemWidget && m_mainLayout->count() > 0) + itemWidget = m_mainLayout->itemAt(0)->widget(); - QPoint pointCurrent = widget->mapToGlobal(QPoint(0, 0)); + if (!itemWidget) + return QPoint(); + + QPoint pointCurrent = itemWidget->mapToGlobal(QPoint(0, 0)); switch (m_position) { case Dock::Position::Bottom: { // 在下方的时候,Y坐标设置在顶层窗口的y值,保证下方对齐 - pointCurrent.setX(pointCurrent.x() + widget->width() / 2); + pointCurrent.setX(pointCurrent.x() + itemWidget->width() / 2); pointCurrent.setY(topLevelWidget()->y()); break; } case Dock::Position::Top: { // 在上面的时候,Y坐标设置为任务栏的下方,保证上方对齐 - pointCurrent.setX(pointCurrent.x() + widget->width() / 2); + pointCurrent.setX(pointCurrent.x() + itemWidget->width() / 2); pointCurrent.setY(topLevelWidget()->y() + topLevelWidget()->height()); break; } case Dock::Position::Left: { // 在左边的时候,X坐标设置在顶层窗口的最右侧,保证左对齐 pointCurrent.setX(topLevelWidget()->x() + topLevelWidget()->width()); - pointCurrent.setY(pointCurrent.y() + widget->height() / 2); + pointCurrent.setY(pointCurrent.y() + itemWidget->height() / 2); break; } case Dock::Position::Right: { // 在右边的时候,X坐标设置在顶层窗口的最左侧,保证右对齐 pointCurrent.setX(topLevelWidget()->x()); - pointCurrent.setY(pointCurrent.y() + widget->height() / 2); + pointCurrent.setY(pointCurrent.y() + itemWidget->height() / 2); } } return pointCurrent; @@ -351,7 +355,7 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do void QuickPluginWindow::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) { - showPopup(getDockItemByPlugin(itemInter), itemInter->itemPopupApplet(itemKey)); + showPopup(getDockItemByPlugin(itemInter), itemInter, itemInter->itemPopupApplet(itemKey)); } void QuickPluginWindow::startDrag() @@ -414,9 +418,9 @@ QuickDockItem *QuickPluginWindow::getActiveDockItem(QPoint point) const return selectWidget; } -void QuickPluginWindow::showPopup(QuickDockItem *item, QWidget *childPage) +void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *itemInter, QWidget *childPage) { - if (!isVisible() || !item) + if (!isVisible()) return; bool canBack = true; @@ -442,7 +446,7 @@ void QuickPluginWindow::showPopup(QuickDockItem *item, QWidget *childPage) } QuickSettingContainer *container = static_cast(popWindow->getContent()); - container->showPage(childPage, item->pluginItem(), canBack); + container->showPage(childPage, itemInter, canBack); } int QuickPluginWindow::getDropIndex(QPoint point) diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index be2c66a11..7cf39a454 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -80,7 +80,7 @@ private: QPoint popupPoint(QWidget *widget) const; QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); QuickDockItem *getActiveDockItem(QPoint point) const; - void showPopup(QuickDockItem *item, QWidget *childPage = nullptr); + void showPopup(QuickDockItem *item, PluginsItemInterface *itemInter = nullptr, QWidget *childPage = nullptr); private: QBoxLayout *m_mainLayout; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 88df9adba..660c541c7 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -19,17 +19,14 @@ * along with this program. If not, see . */ #include "quicksettingcontainer.h" -#include "brightnessmodel.h" #include "quicksettingcontroller.h" #include "pluginsiteminterface.h" #include "quicksettingitem.h" #include "mediawidget.h" #include "dockpopupwindow.h" -#include "brightnesswidget.h" #include "slidercontainer.h" #include "pluginchildpage.h" #include "utils.h" -#include "displaysettingwidget.h" #include #include @@ -75,9 +72,6 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_mainlayout(new QVBoxLayout(m_mainWidget)) , m_pluginLoader(QuickSettingController::instance()) , m_playerWidget(new MediaWidget(m_componentWidget)) - , m_brightnessModel(new BrightnessModel(this)) - , m_brihtnessWidget(new BrightnessWidget(m_brightnessModel, m_componentWidget)) - , m_displaySettingWidget(new DisplaySettingWidget(this)) , m_childPage(new PluginChildPage(this)) , m_dragInfo(new struct QuickDragInfo) , m_childShowPlugin(nullptr) @@ -95,7 +89,7 @@ QuickSettingContainer::~QuickSettingContainer() void QuickSettingContainer::showPage(QWidget *widget, PluginsItemInterface *pluginInter, bool canBack) { - if (widget) { + if (widget && pluginInter && widget != m_mainWidget) { m_childShowPlugin = pluginInter; m_childPage->setTitle(pluginInter->pluginDisplayName()); m_childPage->setCanBack(canBack); @@ -161,17 +155,6 @@ void QuickSettingContainer::setPosition(Position position) } } -void QuickSettingContainer::showPage(QWidget *widget, const QString &title, bool canBack) -{ - m_childShowPlugin = nullptr; - m_childPage->setTitle(title); - m_childPage->setCanBack(canBack); - m_childPage->pushWidget(widget); - m_switchLayout->setCurrentWidget(m_childPage); - - onResizeView(); -} - bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) { switch (event->type()) { @@ -361,10 +344,8 @@ void QuickSettingContainer::initUi() // 添加音乐播放插件 m_playerWidget->setFixedHeight(ITEMHEIGHT); - m_brihtnessWidget->setFixedHeight(ITEMHEIGHT); setWidgetStyle(m_playerWidget); - setWidgetStyle(m_brihtnessWidget); m_mainlayout->setSpacing(ITEMSPACE); m_mainlayout->setContentsMargins(ITEMSPACE, ITEMSPACE, ITEMSPACE, ITEMSPACE); @@ -383,7 +364,6 @@ void QuickSettingContainer::initUi() ctrlLayout->setSpacing(ITEMSPACE); ctrlLayout->addWidget(m_playerWidget); - ctrlLayout->addWidget(m_brihtnessWidget); m_mainlayout->addWidget(m_componentWidget); // 加载所有的插件 @@ -404,8 +384,6 @@ void QuickSettingContainer::initUi() onResizeView(); setFixedWidth(ITEMWIDTH * 4 + (ITEMSPACE * 5)); }, Qt::QueuedConnection); - - m_displaySettingWidget->setVisible(false); } void QuickSettingContainer::initConnection() @@ -420,15 +398,8 @@ void QuickSettingContainer::initConnection() connect(m_pluginLoader, &QuickSettingController::pluginUpdated, this, &QuickSettingContainer::onPluginUpdated); connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); - connect(m_brihtnessWidget, &BrightnessWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); - connect(m_brihtnessWidget->sliderContainer(), &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition &iconPosition) { - if (iconPosition == SliderContainer::RightIcon) { - // 点击右侧的按钮,弹出具体的调节的界面 - showPage(m_displaySettingWidget, tr("brightness"), true); - } - }); connect(m_childPage, &PluginChildPage::back, this, [ this ] { - m_switchLayout->setCurrentWidget(m_mainWidget); + showPage(m_mainWidget); }); connect(m_childPage, &PluginChildPage::closeSelf, this, [ this ] { if (!m_childPage->isBack()) @@ -464,11 +435,6 @@ void QuickSettingContainer::onResizeView() fullItemHeight += m_playerWidget->height(); widgetCount++; } - if (m_brihtnessWidget->isVisible()) { - fullItemHeight += m_brihtnessWidget->height(); - widgetCount++; - } - m_componentWidget->setFixedHeight(fullItemHeight + (widgetCount - 1) * ITEMSPACE); setFixedHeight(ITEMSPACE * 3 + m_pluginWidget->height() + m_componentWidget->height()); diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 160243a8f..15247d1d0 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -62,7 +62,6 @@ protected: explicit QuickSettingContainer(QWidget *parent = nullptr); ~QuickSettingContainer() override; - void showPage(QWidget *widget, const QString &title, bool canBack = false); private Q_SLOTS: void onPluginRemove(PluginsItemInterface *itemInter); @@ -93,10 +92,6 @@ private: QVBoxLayout *m_mainlayout; QuickSettingController *m_pluginLoader; MediaWidget *m_playerWidget; - BrightnessModel *m_brightnessModel; - BrightnessWidget *m_brihtnessWidget; - - DisplaySettingWidget *m_displaySettingWidget; PluginChildPage *m_childPage; QuickDragInfo *m_dragInfo; QList m_quickSettings; diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 298eeda5d..b14acef0b 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -3,6 +3,7 @@ add_subdirectory("shutdown") add_subdirectory("power") add_subdirectory("sound") +add_subdirectory("display") #add_subdirectory("tray") add_subdirectory("trash") add_subdirectory("keyboard-layout") diff --git a/plugins/sound/sounddeviceswidget.cpp b/plugins/sound/sounddeviceswidget.cpp index 3c0e49daa..9fcfa7264 100644 --- a/plugins/sound/sounddeviceswidget.cpp +++ b/plugins/sound/sounddeviceswidget.cpp @@ -19,7 +19,6 @@ * along with this program. If not, see . */ #include "sounddeviceswidget.h" -#include "brightnessmodel.h" #include "settingdelegate.h" #include "imageutil.h" #include "slidercontainer.h" diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 49528e92d..74e969932 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -19,7 +19,6 @@ * along with this program. If not, see . */ #include "soundwidget.h" -#include "brightnessmodel.h" #include "imageutil.h" #include "imageutil.h" #include "slidercontainer.h" diff --git a/widgets/slidercontainer.cpp b/widgets/slidercontainer.cpp index 2e5739cb6..faa893977 100644 --- a/widgets/slidercontainer.cpp +++ b/widgets/slidercontainer.cpp @@ -19,7 +19,6 @@ * along with this program. If not, see . */ -#include "brightnessmodel.h" #include "slidercontainer.h" #include From fe06c5c91a3e5339c71422581e7cfbd156903927 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 15:58:35 +0800 Subject: [PATCH 169/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E4=B8=8B=E6=97=A0=E6=B3=95=E6=8B=96=E5=8A=A8=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调用系统的拖动光标的设置 Log: Influence: 进入wayland,鼠标移动到任务栏边缘,观察鼠标形状是否改变,能否正常调整任务栏尺寸 Task: https://pms.uniontech.com/task-view-220523.html Change-Id: Ife47a0d22b62342d10a4ee5113bceef5f0494328 --- frame/window/components/dragwidget.cpp | 31 +------------------------- frame/window/components/dragwidget.h | 3 --- 2 files changed, 1 insertion(+), 33 deletions(-) diff --git a/frame/window/components/dragwidget.cpp b/frame/window/components/dragwidget.cpp index 38aef59c9..baafb055a 100644 --- a/frame/window/components/dragwidget.cpp +++ b/frame/window/components/dragwidget.cpp @@ -86,10 +86,7 @@ void DragWidget::mouseReleaseEvent(QMouseEvent *) void DragWidget::enterEvent(QEvent *) { - if (Utils::IS_WAYLAND_DISPLAY) - updateCursor(); - else - QApplication::setOverrideCursor(cursor()); + QApplication::setOverrideCursor(cursor()); } void DragWidget::leaveEvent(QEvent *) @@ -97,29 +94,3 @@ void DragWidget::leaveEvent(QEvent *) QApplication::setOverrideCursor(Qt::ArrowCursor); } -void DragWidget::updateCursor() -{ - QString theme = Utils::SettingValue("com.deepin.xsettings", "/com/deepin/xsettings/", "gtk-cursor-theme-name", "bloom").toString(); - int cursorSize = Utils::SettingValue("com.deepin.xsettings", "/com/deepin/xsettings/", "gtk-cursor-theme-size", 24).toInt(); - Dock::Position position = static_cast(qApp->property("position").toInt()); - - static QString lastTheme; - static int lastPosition = -1; - static int lastCursorSize = -1; - if (theme != lastTheme || position != lastPosition || cursorSize != lastCursorSize) { - lastTheme = theme; - lastPosition = position; - lastCursorSize = cursorSize; - const char* cursorName = (position == Dock::Position::Bottom || position == Dock::Position::Top) ? "v_double_arrow" : "h_double_arrow"; - QCursor *newCursor = ImageUtil::loadQCursorFromX11Cursor(theme.toStdString().c_str(), cursorName, cursorSize); - if (!newCursor) - return; - - setCursor(*newCursor); - static QCursor *lastCursor = nullptr; - if (lastCursor) - delete lastCursor; - - lastCursor = newCursor; - } -} diff --git a/frame/window/components/dragwidget.h b/frame/window/components/dragwidget.h index d19f9a2af..81e1f85c1 100644 --- a/frame/window/components/dragwidget.h +++ b/frame/window/components/dragwidget.h @@ -46,9 +46,6 @@ protected: void enterEvent(QEvent *) override; void leaveEvent(QEvent *) override; -private: - void updateCursor(); - private: bool m_dragStatus; QPoint m_resizePoint; From 9ebbd85dde1d5d25276cd7f2808ea22bc8d83098 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 17:31:27 +0800 Subject: [PATCH 170/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E6=B2=A1=E6=9C=89=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E5=9B=BE=E6=A0=87=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在快捷面板图标中增加updateShow方法,在插件更新的时候,调用该方法来更新界面 Log: Influence: 执行快捷面板中的截图图标,观察图标是否发生变化 Task: https://pms.uniontech.com/task-view-220599.html Change-Id: I252fdd4f562e7da4d6a8033ae0ce5ddbb5b233f3 --- frame/item/components/fullquickitem.cpp | 6 +++ frame/item/components/fullquickitem.h | 1 + frame/item/components/multiquickitem.cpp | 60 ++++++++++++++--------- frame/item/components/multiquickitem.h | 7 ++- frame/item/components/singlequickitem.cpp | 26 ++++++---- frame/item/components/singlequickitem.h | 1 + frame/item/quicksettingitem.h | 1 + frame/window/quicksettingcontainer.cpp | 2 +- 8 files changed, 71 insertions(+), 33 deletions(-) diff --git a/frame/item/components/fullquickitem.cpp b/frame/item/components/fullquickitem.cpp index 014dab01c..406629bc5 100644 --- a/frame/item/components/fullquickitem.cpp +++ b/frame/item/components/fullquickitem.cpp @@ -36,6 +36,12 @@ FullQuickItem::~FullQuickItem() m_centerWidget->setParent(nullptr); } +void FullQuickItem::updateShow() +{ + if (m_centerWidget) + m_centerWidget->update(); +} + QuickSettingItem::QuickSettingType FullQuickItem::type() const { return QuickSettingItem::QuickSettingType::Full; diff --git a/frame/item/components/fullquickitem.h b/frame/item/components/fullquickitem.h index f734d313a..98b4795a9 100644 --- a/frame/item/components/fullquickitem.h +++ b/frame/item/components/fullquickitem.h @@ -30,6 +30,7 @@ class FullQuickItem : public QuickSettingItem public: FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); ~FullQuickItem() override; + void updateShow() override; QuickSettingType type() const override; diff --git a/frame/item/components/multiquickitem.cpp b/frame/item/components/multiquickitem.cpp index 0f79438a2..e6eda1de2 100644 --- a/frame/item/components/multiquickitem.cpp +++ b/frame/item/components/multiquickitem.cpp @@ -33,7 +33,9 @@ static QSize expandSize = QSize(20, 20); MultiQuickItem::MultiQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) : QuickSettingItem(pluginInter, parent) - , m_selfDefine(false) + , m_iconWidget(nullptr) + , m_nameLabel(nullptr) + , m_stateLabel(nullptr) { initUi(); } @@ -45,6 +47,21 @@ MultiQuickItem::~MultiQuickItem() itemWidget->setParent(nullptr); } +void MultiQuickItem::updateShow() +{ + if (m_iconWidget && m_nameLabel && m_stateLabel) { + m_iconWidget->update(); + m_nameLabel->setText(QFontMetrics(m_nameLabel->font()).elidedText(pluginItem()->pluginDisplayName(), Qt::TextElideMode::ElideRight, m_nameLabel->width())); + m_stateLabel->setText(QFontMetrics(m_stateLabel->font()).elidedText(pluginItem()->description(), Qt::TextElideMode::ElideRight, m_stateLabel->width())); + } else { + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) { + // 如果插件没有返回图标的显示,则获取插件的itemWidget + itemWidget->update(); + } + } +} + QuickSettingItem::QuickSettingType MultiQuickItem::type() const { return QuickSettingItem::QuickSettingType::Multi; @@ -52,7 +69,7 @@ QuickSettingItem::QuickSettingType MultiQuickItem::type() const bool MultiQuickItem::eventFilter(QObject *obj, QEvent *event) { - if (m_selfDefine) { + if (m_iconWidget) { if (event->type() == QEvent::MouseButtonRelease) { if (obj->objectName() == "expandLabel") { // 如果是鼠标的按下事件 @@ -75,9 +92,9 @@ bool MultiQuickItem::eventFilter(QObject *obj, QEvent *event) if (!labelWidget) return QuickSettingItem::eventFilter(obj, event); - if (labelWidget->objectName() == "nameLabel") { + if (labelWidget == m_nameLabel) { labelWidget->setText(QFontMetrics(labelWidget->font()).elidedText(pluginItem()->pluginDisplayName(), Qt::TextElideMode::ElideRight, labelWidget->width())); - } else if (labelWidget->objectName() == "stateLabel") { + } else if (labelWidget == m_stateLabel) { labelWidget->setText(QFontMetrics(labelWidget->font()).elidedText(pluginItem()->description(), Qt::TextElideMode::ElideRight, labelWidget->width())); } } @@ -111,38 +128,38 @@ void MultiQuickItem::initUi() iconLayout->setSpacing(0); iconLayout->setAlignment(Qt::AlignCenter); - QWidget *iconWidget = new QuickIconWidget(pluginItem(), itemKey(), iconWidgetParent); - iconWidget->setFixedSize(BGSIZE, BGSIZE); - iconLayout->addWidget(iconWidget); + m_iconWidget = new QuickIconWidget(pluginItem(), itemKey(), iconWidgetParent); + m_iconWidget->setFixedSize(BGSIZE, BGSIZE); + iconLayout->addWidget(m_iconWidget); mainLayout->addWidget(iconWidgetParent); mainLayout->addSpacing(10); // 添加中间的名称部分 QWidget *textWidget = new QWidget(this); - QLabel *nameLabel = new QLabel(textWidget); - QLabel *stateLabel = new QLabel(textWidget); - nameLabel->setObjectName("nameLabel"); - stateLabel->setObjectName("stateLabel"); + m_nameLabel = new QLabel(textWidget); + m_stateLabel = new QLabel(textWidget); + m_nameLabel->setObjectName("nameLabel"); + m_stateLabel->setObjectName("stateLabel"); // 设置图标和文字的属性 QFont nameFont = DFontSizeManager::instance()->t6(); nameFont.setBold(true); QPalette pe; pe.setColor(QPalette::WindowText, Qt::black); - nameLabel->setPalette(pe); - stateLabel->setPalette(pe); - nameLabel->setFont(nameFont); - stateLabel->setFont(DFontSizeManager::instance()->t10()); - nameLabel->setText(pluginItem()->pluginDisplayName()); - stateLabel->setText(pluginItem()->description()); - nameLabel->installEventFilter(this); - stateLabel->installEventFilter(this); + m_nameLabel->setPalette(pe); + m_stateLabel->setPalette(pe); + m_nameLabel->setFont(nameFont); + m_stateLabel->setFont(DFontSizeManager::instance()->t10()); + m_nameLabel->setText(pluginItem()->pluginDisplayName()); + m_stateLabel->setText(pluginItem()->description()); + m_nameLabel->installEventFilter(this); + m_stateLabel->installEventFilter(this); QVBoxLayout *textLayout = new QVBoxLayout(textWidget); textLayout->setContentsMargins(0, 0, 0, 0); textLayout->setSpacing(0); - textLayout->addWidget(nameLabel); - textLayout->addWidget(stateLabel); + textLayout->addWidget(m_nameLabel); + textLayout->addWidget(m_stateLabel); textLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); mainLayout->addWidget(textWidget); @@ -160,7 +177,6 @@ void MultiQuickItem::initUi() pe.setBrush(QPalette::Window, Qt::transparent); expandLabel->setPalette(pe); mainLayout->addWidget(expandWidgetParent); - m_selfDefine = true; } } diff --git a/frame/item/components/multiquickitem.h b/frame/item/components/multiquickitem.h index 26e6b3b0d..0b03f8f29 100644 --- a/frame/item/components/multiquickitem.h +++ b/frame/item/components/multiquickitem.h @@ -23,6 +23,8 @@ #include +class QuickIconWidget; + class MultiQuickItem : public QuickSettingItem { Q_OBJECT @@ -30,6 +32,7 @@ class MultiQuickItem : public QuickSettingItem public: MultiQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); ~MultiQuickItem() override; + void updateShow() override; QuickSettingType type() const override; @@ -41,7 +44,9 @@ private: QString expandFileName() const; private: - bool m_selfDefine; + QuickIconWidget *m_iconWidget; + QLabel *m_nameLabel; + QLabel *m_stateLabel; }; /** diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp index 61b796bb4..c544a1fc0 100644 --- a/frame/item/components/singlequickitem.cpp +++ b/frame/item/components/singlequickitem.cpp @@ -58,15 +58,7 @@ void SingleQuickItem::mouseReleaseEvent(QMouseEvent *event) void SingleQuickItem::resizeEvent(QResizeEvent *event) { - if (property("paint").toBool()) { - QLabel *imageLabel = findChildLabel(this, "imageLabel"); - if (imageLabel) { - // 更新图像 - imageLabel->setPixmap(pixmap()); - } - updatePluginName(findChildLabel(this, "textLabel")); - } - + updateShow(); QuickSettingItem::resizeEvent(event); } @@ -181,3 +173,19 @@ void SingleQuickItem::updatePluginName(QLabel *textLabel) text = ftm.elidedText(text, Qt::TextElideMode::ElideRight, textLabel->width()); textLabel->setText(text); } + +void SingleQuickItem::updateShow() +{ + if (property("paint").toBool()) { + QLabel *imageLabel = findChildLabel(this, "imageLabel"); + if (imageLabel) { + // 更新图像 + imageLabel->setPixmap(pixmap()); + } + updatePluginName(findChildLabel(this, "textLabel")); + } else { + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) + itemWidget->update(); + } +} diff --git a/frame/item/components/singlequickitem.h b/frame/item/components/singlequickitem.h index fad3f86a3..db6d862df 100644 --- a/frame/item/components/singlequickitem.h +++ b/frame/item/components/singlequickitem.h @@ -32,6 +32,7 @@ public: ~SingleQuickItem() override; QuickSettingType type() const override; + void updateShow() override; protected: void mouseReleaseEvent(QMouseEvent *event) override; diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 962114883..4767a74e4 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -43,6 +43,7 @@ public: PluginsItemInterface *pluginItem() const; ItemType itemType() const override; virtual const QPixmap dragPixmap(); + virtual void updateShow() {} const QString itemKey() const; virtual QuickSettingType type() const = 0; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 660c541c7..8a62a2f11 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -452,7 +452,7 @@ void QuickSettingContainer::onPluginUpdated(PluginsItemInterface *itemInter, con if (settingItem->pluginItem() != itemInter) continue; - settingItem->update(); + settingItem->updateShow(); break; } } From 5ad52ae4078063994a405c90af43d591689bf3b7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 19:24:43 +0800 Subject: [PATCH 171/257] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9E=E6=88=96?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=98=BE=E7=A4=BA=E5=B1=8F=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=B7=BB=E5=8A=A0=E6=88=96=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加显示屏变化的信号,当新增或删除显示屏的时候,根据信号来移除或新增插件 Log: Influence: 拔出显示屏后再插入显示屏,观察任务栏快捷面板中的亮度设置插件是否发生变化 Task: https://pms.uniontech.com/task-view-220489.html Change-Id: If093e8c2de7e6574be7cdecd5f44f7b379cfb886 --- plugins/display/brightnessmodel.cpp | 59 +++++++++++++++++++++++----- plugins/display/brightnessmodel.h | 7 ++++ plugins/display/brightnesswidget.cpp | 8 ---- plugins/display/brightnesswidget.h | 2 - plugins/display/displayplugin.cpp | 16 +++++--- plugins/display/displayplugin.h | 2 +- 6 files changed, 69 insertions(+), 25 deletions(-) diff --git a/plugins/display/brightnessmodel.cpp b/plugins/display/brightnessmodel.cpp index e7c024bce..9d05e97f1 100644 --- a/plugins/display/brightnessmodel.cpp +++ b/plugins/display/brightnessmodel.cpp @@ -43,16 +43,12 @@ BrightnessModel::BrightnessModel(QObject *parent) QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus()); if (dbusInter.isValid()) { // 读取所有的屏幕的信息 - QString primaryScreenName = dbusInter.property("Primary").value(); - QList paths = dbusInter.property("Monitors").value>(); - for (QDBusObjectPath path : paths) { - BrightMonitor *monitor = new BrightMonitor(path.path(), this); - monitor->setPrimary(primaryScreenName == monitor->name()); - m_monitor << monitor; - } - } + m_primaryScreenName = dbusInter.property("Primary").value(); + m_monitor = readMonitors(dbusInter.property("Monitors").value>()); - connect(qApp, &QApplication::primaryScreenChanged, this, &BrightnessModel::primaryScreenChanged); + QDBusConnection::sessionBus().connect(serviceName, servicePath, propertiesInterface, + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); + } } BrightnessModel::~BrightnessModel() @@ -87,6 +83,51 @@ void BrightnessModel::primaryScreenChanged(QScreen *screen) Q_EMIT primaryChanged(defaultMonitor); } +void BrightnessModel::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName != serviceInterface) + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + if (changedProps.contains("Primary")) { + m_primaryScreenName = changedProps.value("Primary").toString(); + BrightMonitor *defaultMonitor = nullptr; + for (BrightMonitor *monitor : m_monitor) { + monitor->setPrimary(monitor->name() == m_primaryScreenName); + if (monitor->isPrimary()) + defaultMonitor = monitor; + } + + if (defaultMonitor) + Q_EMIT primaryChanged(defaultMonitor); + } else if (changedProps.contains("Monitors")) { + int oldSize = m_monitor.size(); + qDeleteAll(m_monitor); + m_monitor = readMonitors(changedProps.value("Monitors").value>()); + if (oldSize == 1 && m_monitor.size() == 0) { + Q_EMIT screenVisibleChanged(false); + } else if (oldSize == 0 && m_monitor.size() == 1) { + Q_EMIT screenVisibleChanged(true); + } + } +} + +QList BrightnessModel::readMonitors(const QList &paths) +{ + QList monitors; + for (QDBusObjectPath path : paths) { + BrightMonitor *monitor = new BrightMonitor(path.path(), this); + monitor->setPrimary(m_primaryScreenName == monitor->name()); + monitors << monitor; + } + return monitors; +} + /** * @brief monitor */ diff --git a/plugins/display/brightnessmodel.h b/plugins/display/brightnessmodel.h index b9c0c022b..ca569f3fc 100644 --- a/plugins/display/brightnessmodel.h +++ b/plugins/display/brightnessmodel.h @@ -22,6 +22,7 @@ #ifndef BRIGHTNESSMODEL_H #define BRIGHTNESSMODEL_H +#include #include class BrightMonitor; @@ -41,12 +42,18 @@ public: Q_SIGNALS: void primaryChanged(BrightMonitor *); + void screenVisibleChanged(bool); protected Q_SLOTS: void primaryScreenChanged(QScreen *screen); + void onPropertyChanged(const QDBusMessage &msg); + +private: + QList readMonitors(const QList &paths); private: QList m_monitor; + QString m_primaryScreenName; }; class BrightMonitor : public QObject diff --git a/plugins/display/brightnesswidget.cpp b/plugins/display/brightnesswidget.cpp index 2c148e2ac..a25d66558 100644 --- a/plugins/display/brightnesswidget.cpp +++ b/plugins/display/brightnesswidget.cpp @@ -48,14 +48,6 @@ void BrightnessWidget::showEvent(QShowEvent *event) // 显示的时候更新一下slider的主屏幕亮度值 updateSliderValue(); - Q_EMIT visibleChanged(true); -} - -void BrightnessWidget::hideEvent(QHideEvent *event) -{ - QWidget::hideEvent(event); - - Q_EMIT visibleChanged(true); } void BrightnessWidget::initUi() diff --git a/plugins/display/brightnesswidget.h b/plugins/display/brightnesswidget.h index 78a4cf77d..881d0b892 100644 --- a/plugins/display/brightnesswidget.h +++ b/plugins/display/brightnesswidget.h @@ -38,12 +38,10 @@ public: ~BrightnessWidget() override; Q_SIGNALS: - void visibleChanged(bool); void brightClicked(); protected: void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; private: void initUi(); diff --git a/plugins/display/displayplugin.cpp b/plugins/display/displayplugin.cpp index 86258b1a5..ba4d82a0a 100644 --- a/plugins/display/displayplugin.cpp +++ b/plugins/display/displayplugin.cpp @@ -35,15 +35,13 @@ #include -#define PLUGIN_STATE_KEY "enable" -#define TIME_FORMAT_KEY "Use24HourFormat" using namespace Dock; DisplayPlugin::DisplayPlugin(QObject *parent) : QObject(parent) , m_displayWidget(nullptr) , m_displaySettingWidget(nullptr) , m_displayTips(nullptr) - , m_model(new BrightnessModel(this)) + , m_model(nullptr) { } @@ -64,15 +62,23 @@ void DisplayPlugin::init(PluginProxyInterface *proxyInter) m_proxyInter = proxyInter; m_displayTips.reset(new TipsWidget); - m_displayWidget.reset(new BrightnessWidget(m_model)); + m_model.reset(new BrightnessModel); + m_displayWidget.reset(new BrightnessWidget(m_model.data())); m_displayWidget->setFixedHeight(60); m_displaySettingWidget.reset(new DisplaySettingWidget); - m_proxyInter->itemAdded(this, pluginName()); + if (m_model->monitors().size() > 0) + m_proxyInter->itemAdded(this, pluginName()); connect(m_displayWidget.data(), &BrightnessWidget::brightClicked, this, [ this ] { m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); }); + connect(m_model.data(), &BrightnessModel::screenVisibleChanged, this, [ this ](bool visible) { + if (visible) + m_proxyInter->itemAdded(this, pluginName()); + else + m_proxyInter->itemRemoved(this, pluginName()); + }); } QWidget *DisplayPlugin::itemWidget(const QString &itemKey) diff --git a/plugins/display/displayplugin.h b/plugins/display/displayplugin.h index ed1fe4064..6c197a1fc 100644 --- a/plugins/display/displayplugin.h +++ b/plugins/display/displayplugin.h @@ -59,7 +59,7 @@ private: QScopedPointer m_displayWidget; QScopedPointer m_displaySettingWidget; QScopedPointer m_displayTips; - BrightnessModel *m_model; + QScopedPointer m_model; }; #endif // DATETIMEPLUGIN_H From 3edc83802be17e670bf4c77b71b638108a1163e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Tue, 29 Nov 2022 11:25:12 +0800 Subject: [PATCH 172/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9F=B3?= =?UTF-8?q?=E9=87=8F=E5=A2=9E=E5=BC=BA=E6=9C=AA=E5=93=8D=E5=BA=94=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 初始化时,音量的最大值不应该固定为100,应该根据音量增强是否开启自动变更 Log: 修复音量增强未响应的问题 Influence: 任务栏-音量-音量增强 Bug: https://pms.uniontech.com/bug-view-171869.html Change-Id: I4eaeb0a3ba571f798cd0d5d430f0388e66999955 --- plugins/sound/soundwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 74e969932..b5d27d46f 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -70,7 +70,7 @@ void SoundWidget::initUi() QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 12); m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); - m_sliderContainer->setRange(0, 100); + m_sliderContainer->setRange(0, std::round(m_dbusAudio->maxUIVolume() * 100.00)); m_sliderContainer->setPageStep(2); SliderProxyStyle *proxy = new SliderProxyStyle; From 6d14fd1be7c1752a9730e6fbdd6ec6b271e84540 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 30 Nov 2022 12:19:06 +0800 Subject: [PATCH 173/257] =?UTF-8?q?feat:=20=E5=B0=86=E9=9F=B3=E4=B9=90?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=8A=9F=E8=83=BD=E6=8F=90=E5=8F=96=E4=B8=BA?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E7=9A=84=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将dock中的音乐播放功能提取为音乐插件 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-220489.html Change-Id: Ie58d1645fff08332a03398aa8ce9cb0e90f16ad2 --- plugins/media/CMakeLists.txt | 51 ++++++ plugins/media/media.json | 3 + plugins/media/mediaplayermodel.cpp | 252 +++++++++++++++++++++++++++++ plugins/media/mediaplayermodel.h | 124 ++++++++++++++ plugins/media/mediaplugin.cpp | 87 ++++++++++ plugins/media/mediaplugin.h | 57 +++++++ plugins/media/mediawidget.cpp | 203 +++++++++++++++++++++++ plugins/media/mediawidget.h | 92 +++++++++++ 8 files changed, 869 insertions(+) create mode 100644 plugins/media/CMakeLists.txt create mode 100644 plugins/media/media.json create mode 100644 plugins/media/mediaplayermodel.cpp create mode 100644 plugins/media/mediaplayermodel.h create mode 100644 plugins/media/mediaplugin.cpp create mode 100644 plugins/media/mediaplugin.h create mode 100644 plugins/media/mediawidget.cpp create mode 100644 plugins/media/mediawidget.h diff --git a/plugins/media/CMakeLists.txt b/plugins/media/CMakeLists.txt new file mode 100644 index 000000000..792279e08 --- /dev/null +++ b/plugins/media/CMakeLists.txt @@ -0,0 +1,51 @@ + +set(PLUGIN_NAME "media") + +project(${PLUGIN_NAME}) + +generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) + +# Sources files +file(GLOB_RECURSE SRCS "*.h" "*.cpp" + "../../widgets/*.h" + "../../widgets/*.cpp" + "../../frame/util/imageutil.h" + "../../frame/util/imageutil.cpp" + "../../frame/util/statebutton.h" + "../../frame/util/statebutton.cpp" + "../../frame/util/horizontalseperator.h" + "../../frame/util/horizontalseperator.cpp" + "../../frame/qtdbusextended/*.h" + "../../frame/qtdbusextended/*.cpp") + +find_package(PkgConfig REQUIRED) +find_package(Qt5Widgets REQUIRED) +find_package(Qt5Svg REQUIRED) +find_package(Qt5DBus REQUIRED) +find_package(DtkWidget REQUIRED) + +pkg_check_modules(XCB_EWMH REQUIRED xcb-ewmh x11 xcursor) +pkg_check_modules(QGSettings REQUIRED gsettings-qt) + +add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") +add_library(${PLUGIN_NAME} SHARED ${SRCS}) +set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../quick-trays) +target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} + ${QGSettings_INCLUDE_DIRS} + ../../interfaces + ../../widgets + ../../frame + ../../frame/qtdbusextended + ./dbusinterface/generation_dbus_interface + componments) + +target_link_libraries(${PLUGIN_NAME} PRIVATE + ${XCB_EWMH_LIBRARIES} + ${DtkWidget_LIBRARIES} + ${QGSettings_LIBRARIES} + ${Qt5DBus_LIBRARIES} + ${Qt5Widgets_LIBRARIES} + ${Qt5Svg_LIBRARIES} +) + +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/quick-trays) diff --git a/plugins/media/media.json b/plugins/media/media.json new file mode 100644 index 000000000..bec81f0da --- /dev/null +++ b/plugins/media/media.json @@ -0,0 +1,3 @@ +{ + "api": "2.0.0" +} diff --git a/plugins/media/mediaplayermodel.cpp b/plugins/media/mediaplayermodel.cpp new file mode 100644 index 000000000..786e43508 --- /dev/null +++ b/plugins/media/mediaplayermodel.cpp @@ -0,0 +1,252 @@ +#include "mediaplayermodel.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MediaPlayerModel::MediaPlayerModel(QObject *parent) + : QObject(parent) + , m_isActived(false) + , m_mediaInter(nullptr) +{ + initMediaPlayer(); +} + +MediaPlayerModel::~MediaPlayerModel() +{ +} + +bool MediaPlayerModel::isActived() +{ + return m_isActived; +} + +bool MediaPlayerModel::canGoNext() +{ + return m_mediaInter ? m_mediaInter->canGoNext() : false; +} + +bool MediaPlayerModel::canGoPrevious() +{ + return m_mediaInter ? m_mediaInter->canGoPrevious() : false; +} + +bool MediaPlayerModel::canPause() +{ + return m_mediaInter ? m_mediaInter->canPause() : false; +} + +MediaPlayerModel::PlayStatus MediaPlayerModel::status() +{ + if (!m_isActived || !m_mediaInter) + return PlayStatus::Stop; + + return convertStatus(m_mediaInter->playbackStatus()); +} + +const QString MediaPlayerModel::name() +{ + if (m_mediaInter) { + Dict data = m_mediaInter->metadata(); + return data["xesam:title"].toString(); + } + + return QString(); +} + +const QString MediaPlayerModel::iconUrl() +{ + if (m_mediaInter) { + Dict data = m_mediaInter->metadata(); + return data["mpris:artUrl"].toString(); + } + + return QString(); +} + +const QString MediaPlayerModel::album() +{ + if (m_mediaInter) { + Dict data = m_mediaInter->metadata(); + return data["xesam:album"].toString(); + } + + return QString(); +} + +const QString MediaPlayerModel::artist() +{ + if (m_mediaInter) { + Dict data = m_mediaInter->metadata(); + return data["xesam:artist"].toString(); + } + + return QString(); +} + +void MediaPlayerModel::setStatus(const MediaPlayerModel::PlayStatus &stat) +{ + if (!m_mediaInter) + return; + + switch (stat) { + case MediaPlayerModel::PlayStatus::Play: { + m_mediaInter->Play(); + break; + } + case MediaPlayerModel::PlayStatus::Stop: { + m_mediaInter->Stop(); + break; + } + case MediaPlayerModel::PlayStatus::Pause: { + m_mediaInter->Pause(); + break; + } + default: break; + } +} + +void MediaPlayerModel::playNext() +{ + if (m_mediaInter) + m_mediaInter->Next(); +} + +void MediaPlayerModel::initMediaPlayer() +{ + QDBusInterface dbusInter("org.freedesktop.DBus", "/", "org.freedesktop.DBus", QDBusConnection::sessionBus(), this); + QDBusPendingCall call = dbusInter.asyncCall("ListNames"); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); + connect(watcher, &QDBusPendingCallWatcher::finished, [ = ] { + m_serviceName.clear(); + if (call.isError()) + return; + + QDBusReply reply = call.reply(); + const QStringList &serviceList = reply.value(); + + for (const QString &serv : serviceList) { + if (!serv.startsWith("org.mpris.MediaPlayer2")) + continue; + + QDBusInterface serviceInterface(serv, "/org/mpris/MediaPlayer2", + "org.mpris.MediaPlayer2.Player", QDBusConnection::sessionBus(), this); + // 如果开启了谷歌浏览器的后台服务(org.mpris.MediaPlayer2.chromium.instance17352) + // 也符合名称要求,但是它不是音乐服务,此时需要判断是否存在这个属性 + QVariant v = serviceInterface.property("CanPlay"); + if (!v.isValid() || !v.value()) + continue; + + m_serviceName = serv; + break; + } + + if (!m_serviceName.isEmpty()) { + m_isActived = true; + + m_mediaInter = new MediaPlayerInterface(m_serviceName, "/org/mpris/MediaPlayer2", QDBusConnection::sessionBus(), this); + connect(m_mediaInter, &MediaPlayerInterface::PlaybackStatusChanged, this, [ this ] { + Q_EMIT statusChanged(convertStatus(m_mediaInter->playbackStatus())); + }); + connect(m_mediaInter, &MediaPlayerInterface::MetadataChanged, this, &MediaPlayerModel::metadataChanged); + Dict v = m_mediaInter->metadata(); + m_name = v.value("xesam:title").toString(); + m_icon = v.value("mpris:artUrl").toString(); + m_album = v.value("xesam:album").toString(); + m_artist = v.value("xesam:artist").toString(); + Q_EMIT startStop(m_isActived); + return; + } + + QDBusConnectionInterface *dbusInterface = QDBusConnection::sessionBus().interface(); + connect(dbusInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, + [ = ](const QString &name, const QString &, const QString &newOwner) { + if (name.startsWith("org.mpris.MediaPlayer2")) { + // 启动了音乐播放 + m_isActived = !newOwner.isEmpty(); + if (m_isActived) { + m_serviceName = name; + m_mediaInter = new MediaPlayerInterface(m_serviceName, "/org/mpris/MediaPlayer2", QDBusConnection::sessionBus(), this); + connect(m_mediaInter, &MediaPlayerInterface::PlaybackStatusChanged, this, [ this ] { + Q_EMIT statusChanged(convertStatus(m_mediaInter->playbackStatus())); + }); + connect(m_mediaInter, &MediaPlayerInterface::MetadataChanged, this, &MediaPlayerModel::metadataChanged); + Dict v = m_mediaInter->metadata(); + m_name = v.value("xesam:title").toString(); + m_icon = v.value("mpris:artUrl").toString(); + m_album = v.value("xesam:album").toString(); + m_artist = v.value("xesam:artist").toString(); + } else { + if (!m_serviceName.isEmpty()) { + delete m_mediaInter; + m_mediaInter = nullptr; + } + m_serviceName.clear(); + } + Q_EMIT startStop(m_isActived); + } + }); + connect(dbusInterface, &QDBusConnectionInterface::serviceUnregistered, this, + [ = ](const QString &service) { + if (service.startsWith("org.mpris.MediaPlayer2")) { + // 启动了音乐播放 + m_serviceName.clear(); + m_isActived = false; + Q_EMIT startStop(m_isActived); + } + }); + }); + connect(watcher, &QDBusPendingCallWatcher::finished, watcher, &QDBusPendingCallWatcher::deleteLater); +} + +MediaPlayerModel::PlayStatus MediaPlayerModel::convertStatus(const QString &stat) +{ + if (stat == "Paused") + return PlayStatus::Pause; + if (stat == "Playing") + return PlayStatus::Play; + if (stat == "Stopped") + return PlayStatus::Stop; + + return PlayStatus::Unknow; +} + +MediaPlayerInterface::MediaPlayerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, "org.mpris.MediaPlayer2.Player", connection, parent) +{ + QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); +} + +MediaPlayerInterface::~MediaPlayerInterface() +{ + QDBusConnection::sessionBus().disconnect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(const QDBusMessage &))); +} + +void MediaPlayerInterface::onPropertyChanged(const QDBusMessage &msg) +{ + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName !="org.mpris.MediaPlayer2.Player") + return; + + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + QStringList keys = changedProps.keys(); + foreach(const QString &prop, keys) { + const QMetaObject* self = metaObject(); + for (int i = self->propertyOffset(); i < self->propertyCount(); ++i) { + QMetaProperty p = self->property(i); + if (p.name() == prop) { + Q_EMIT p.notifySignal().invoke(this); + } + } + } +} diff --git a/plugins/media/mediaplayermodel.h b/plugins/media/mediaplayermodel.h new file mode 100644 index 000000000..ce560d8a6 --- /dev/null +++ b/plugins/media/mediaplayermodel.h @@ -0,0 +1,124 @@ +#ifndef MEDIAPLAYERMODEL_H +#define MEDIAPLAYERMODEL_H + +#include +#include +#include + +typedef QMap Dict; +Q_DECLARE_METATYPE(Dict) + +class QDBusMessage; +class QDBusConnection; +class MediaPlayerInterface; + +class MediaPlayerModel : public QObject +{ + Q_OBJECT + +public: + enum PlayStatus { + Unknow = 0, + Play, + Pause, + Stop + }; + +public: + explicit MediaPlayerModel(QObject *parent = nullptr); + ~MediaPlayerModel(); + + bool isActived(); + bool canGoNext(); + bool canGoPrevious(); + bool canPause(); + + PlayStatus status(); + const QString name(); + const QString iconUrl(); + const QString album(); + const QString artist(); + + void setStatus(const PlayStatus &stat); + void playNext(); + +Q_SIGNALS: + void startStop(bool); + void statusChanged(const PlayStatus &); + void metadataChanged(); + +private: + void initMediaPlayer(); + PlayStatus convertStatus(const QString &stat); + +private: + bool m_isActived; + QString m_serviceName; + QString m_name; + QString m_icon; + QString m_album; + QString m_artist; + MediaPlayerInterface *m_mediaInter; +}; + +class MediaPlayerInterface : public QDBusAbstractInterface +{ + Q_OBJECT + +public: + MediaPlayerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); + ~MediaPlayerInterface(); + +public: + inline QDBusPendingReply<> Play() { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Play"), argumentList); + } + + inline QDBusPendingReply<> Stop() { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Stop"), argumentList); + } + + inline QDBusPendingReply<> Pause() { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Pause"), argumentList); + } + + inline QDBusPendingReply<> Next() { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Next"), argumentList); + } + + Q_PROPERTY(Dict Metadata READ metadata NOTIFY MetadataChanged) + inline Dict metadata() const + { return qvariant_cast(property("Metadata")); } + + Q_PROPERTY(bool CanGoNext READ canGoNext NOTIFY CanGoNextChanged) + inline bool canGoNext() const + { return qvariant_cast< bool >(property("CanGoNext")); } + + Q_PROPERTY(bool CanGoPrevious READ canGoPrevious NOTIFY CanGoPreviousChanged) + inline bool canGoPrevious() const + { return qvariant_cast< bool >(property("CanGoPrevious")); } + + Q_PROPERTY(bool CanPause READ canPause NOTIFY CanPauseChanged) + inline bool canPause() const + { return qvariant_cast< bool >(property("CanPause")); } + + Q_PROPERTY(QString PlaybackStatus READ playbackStatus NOTIFY PlaybackStatusChanged) + inline QString playbackStatus() const + { return qvariant_cast< QString >(property("PlaybackStatus")); } + +Q_SIGNALS: + void MetadataChanged(); + void CanGoNextChanged(); + void CanGoPreviousChanged(); + void CanPauseChanged(); + void PlaybackStatusChanged(); + +private Q_SLOTS: + void onPropertyChanged(const QDBusMessage &msg); +}; + +#endif // MEDIAPLAYERLISTENER_H diff --git a/plugins/media/mediaplugin.cpp b/plugins/media/mediaplugin.cpp new file mode 100644 index 000000000..4a721302c --- /dev/null +++ b/plugins/media/mediaplugin.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#include "mediaplugin.h" +#include "mediawidget.h" +#include "mediaplayermodel.h" + +MediaPlugin::MediaPlugin(QObject *parent) + : QObject(parent) + , m_mediaWidget(nullptr) + , m_model(nullptr) +{ +} + +const QString MediaPlugin::pluginName() const +{ + return "media"; +} + +const QString MediaPlugin::pluginDisplayName() const +{ + return tr("media"); +} + +void MediaPlugin::init(PluginProxyInterface *proxyInter) +{ + if (m_proxyInter == proxyInter) + return; + + m_proxyInter = proxyInter; + + m_model.reset(new MediaPlayerModel); + m_mediaWidget.reset(new MediaWidget(m_model.data())); + m_mediaWidget->setFixedHeight(60); + m_mediaWidget->setVisible(m_model->isActived()); + + if (m_model->isActived()) + m_proxyInter->itemAdded(this, pluginName()); + + connect(m_model.data(), &MediaPlayerModel::startStop, this, [ this ](bool visible) { + if (visible) + m_proxyInter->itemAdded(this, pluginName()); + else + m_proxyInter->itemRemoved(this, pluginName()); + }); +} + +QWidget *MediaPlugin::itemWidget(const QString &itemKey) +{ + if (itemKey == QUICK_ITEM_KEY) + return m_mediaWidget.data(); + + return nullptr; +} + +QWidget *MediaPlugin::itemTipsWidget(const QString &itemKey) +{ + return nullptr; +} + +QWidget *MediaPlugin::itemPopupApplet(const QString &itemKey) +{ + return nullptr; +} + +PluginFlags MediaPlugin::flags() const +{ + return PluginFlag::Type_Common | PluginFlag::Quick_Full; +} diff --git a/plugins/media/mediaplugin.h b/plugins/media/mediaplugin.h new file mode 100644 index 000000000..ec3bfeb77 --- /dev/null +++ b/plugins/media/mediaplugin.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef MEDIAPLUGIN_H +#define MEDIAPLUGIN_H + +#include "pluginsiteminterface.h" + +namespace Dock{ +class TipsWidget; +} +class MediaWidget; +class MediaPlayerModel; + +class MediaPlugin : public QObject, PluginsItemInterface +{ + Q_OBJECT + Q_INTERFACES(PluginsItemInterface) + Q_PLUGIN_METADATA(IID "com.deepin.dock.PluginsItemInterface" FILE "media.json") + +public: + explicit MediaPlugin(QObject *parent = nullptr); + + const QString pluginName() const override; + const QString pluginDisplayName() const override; + void init(PluginProxyInterface *proxyInter) override; + + QWidget *itemWidget(const QString &itemKey) override; + QWidget *itemTipsWidget(const QString &itemKey) override; + QWidget *itemPopupApplet(const QString &itemKey) override; + + PluginFlags flags() const override; + +private: + QScopedPointer m_mediaWidget; + QScopedPointer m_model; +}; + +#endif // DATETIMEPLUGIN_H diff --git a/plugins/media/mediawidget.cpp b/plugins/media/mediawidget.cpp new file mode 100644 index 000000000..b392f3a2a --- /dev/null +++ b/plugins/media/mediawidget.cpp @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "mediawidget.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +#define PAUSEHEIGHT 21 +#define PLAYHEIGHT 18 + +MediaWidget::MediaWidget(MediaPlayerModel *model, QWidget *parent) + : QWidget(parent) + , m_model(model) + , m_musicIcon(new QLabel(this)) + , m_musicName(new QLabel(this)) + , m_musicSinger(new QLabel(this)) + , m_pausePlayButton(new MusicButton(this)) + , m_nextButton(new MusicButton(this)) +{ + initUi(); + initConnection(); +} + +MediaWidget::~MediaWidget() +{ +} + +void MediaWidget::statusChanged(const MediaPlayerModel::PlayStatus &newStatus) +{ + switch (newStatus) { + case MediaPlayerModel::PlayStatus::Play: { + m_pausePlayButton->setButtonType(MusicButton::ButtonType::Pause); + break; + } + case MediaPlayerModel::PlayStatus::Stop: + case MediaPlayerModel::PlayStatus::Pause: { + m_pausePlayButton->setButtonType(MusicButton::ButtonType::Playing); + break; + } + default: break; + } +} + +void MediaWidget::onPlayClicked() +{ + // 设置当前的播放状态 + if (m_model->status() == MediaPlayerModel::PlayStatus::Play) + m_model->setStatus(MediaPlayerModel::PlayStatus::Pause); + else + m_model->setStatus(MediaPlayerModel::PlayStatus::Play); +} + +void MediaWidget::onNext() +{ + // 播放下一曲 + m_model->playNext(); +} + +void MediaWidget::initUi() +{ + m_pausePlayButton->setFixedWidth(20); + m_nextButton->setFixedWidth(20); + + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(20, 0, 20, 0); + mainLayout->addWidget(m_musicIcon); + + QWidget *infoWidget = new QWidget(this); + QVBoxLayout *infoLayout = new QVBoxLayout(infoWidget); + infoLayout->addWidget(m_musicName); + infoLayout->addWidget(m_musicSinger); + mainLayout->addWidget(infoWidget); + mainLayout->addStretch(); + mainLayout->addWidget(m_pausePlayButton); + mainLayout->addSpacing(25); + mainLayout->addWidget(m_nextButton); + + m_musicIcon->setFixedSize(32, 32); + m_musicName->setFont(DFontSizeManager::instance()->t8()); + m_musicSinger->setFont(DFontSizeManager::instance()->t10()); +} + +void MediaWidget::initConnection() +{ + connect(m_model, &MediaPlayerModel::startStop, this, [ this ](bool startOrStop) { + m_nextButton->setEnabled(m_model->canGoNext()); + onUpdateMediaInfo(); + statusChanged(m_model->status()); + }); + connect(m_model, &MediaPlayerModel::metadataChanged, this, &MediaWidget::onUpdateMediaInfo); + connect(m_model, &MediaPlayerModel::statusChanged, this, &MediaWidget::statusChanged); + connect(m_pausePlayButton, &MusicButton::clicked, this, &MediaWidget::onPlayClicked); + connect(m_nextButton, &MusicButton::clicked, this, &MediaWidget::onNext); + + m_pausePlayButton->setButtonType(m_model->status() == MediaPlayerModel::PlayStatus::Play ? + MusicButton::ButtonType::Pause : MusicButton::ButtonType::Playing); + m_nextButton->setButtonType(MusicButton::ButtonType::Next); +} + +void MediaWidget::onUpdateMediaInfo() +{ + m_musicName->setText(m_model->name()); + QString file = m_model->iconUrl(); + if (file.startsWith("file:///")) + file.replace("file:///", "/"); + m_musicIcon->setPixmap(QPixmap(file).scaled(m_musicIcon->size())); + m_musicSinger->setText(m_model->artist()); +} + +/** + * @brief 音乐播放的相关按钮 + * @param parent + */ + +MusicButton::MusicButton(QWidget *parent) + : QWidget(parent) +{ + installEventFilter(this); +} + +MusicButton::~MusicButton() +{ +} + +int MusicButton::getIconHeight() const +{ + switch (m_buttonType) { + case ButtonType::Pause: + return PAUSEHEIGHT; + case ButtonType::Next: + case ButtonType::Playing: + return PLAYHEIGHT; + } + + return PLAYHEIGHT; +} + +void MusicButton::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + +#define ICOMMARGIN 6 +#define ICONSPACE 2 + + int ctrlHeight = getIconHeight(); + + int width = this->width(); + int height = this->height(); + int startX = 2; + int startY = (height - ctrlHeight) / 2; + QPainter painter(this); + painter.save(); + painter.setRenderHint(QPainter::Antialiasing); + painter.setPen(Qt::black); + painter.setBrush(Qt::black); + if (m_buttonType == ButtonType::Pause) { + painter.drawRect(QRect(startX, startY, ICOMMARGIN, ctrlHeight)); + painter.drawRect(QRect(width - ICOMMARGIN - ICONSPACE, startY, ICOMMARGIN, ctrlHeight)); + } else { + QPainterPath trianglePath; + trianglePath.moveTo(startX, startY); + trianglePath.lineTo(width - ICOMMARGIN, height / 2); + trianglePath.lineTo(startX, startY + ctrlHeight); + trianglePath.lineTo(startX, startY); + painter.drawPath(trianglePath); + if (m_buttonType == ButtonType::Next) + painter.drawRect(width - ICOMMARGIN, startY, 2, ctrlHeight); + } + painter.restore(); +} + +void MusicButton::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event); + Q_EMIT clicked(); +} diff --git a/plugins/media/mediawidget.h b/plugins/media/mediawidget.h new file mode 100644 index 000000000..cad32072b --- /dev/null +++ b/plugins/media/mediawidget.h @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef MEDIAWIDGET_H +#define MEDIAWIDGET_H + +#include "mediaplayermodel.h" + +#include + +class QLabel; +class MusicButton; +class MediaPlayerModel; + +DWIDGET_USE_NAMESPACE + +class MediaWidget : public QWidget +{ + Q_OBJECT + +public: + explicit MediaWidget(MediaPlayerModel *model, QWidget *parent = nullptr); + ~MediaWidget() override; + +private Q_SLOTS: + void statusChanged(const MediaPlayerModel::PlayStatus &newStatus); + void onPlayClicked(); + void onNext(); + void onUpdateMediaInfo(); + +private: + void initUi(); + void initConnection(); + +private: + MediaPlayerModel *m_model; + QLabel *m_musicIcon; + QLabel *m_musicName; + QLabel *m_musicSinger; + MusicButton *m_pausePlayButton; + MusicButton *m_nextButton; +}; + +// 音乐播放按钮 +class MusicButton : public QWidget +{ + Q_OBJECT + +Q_SIGNALS: + void clicked(); + +public: + enum ButtonType { Playing = 0, Pause, Next }; + +public: + MusicButton(QWidget *parent = Q_NULLPTR); + ~MusicButton() override; + + inline void setButtonType(const ButtonType &bt) { + m_buttonType = bt; + update(); + } + +protected: + void paintEvent(QPaintEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + +private: + int getIconHeight() const; + +private: + ButtonType m_buttonType; +}; + +#endif // MEDIAWIDGER_H From f11366a27d750985459766e44f41a80da8778406 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 30 Nov 2022 12:21:19 +0800 Subject: [PATCH 174/257] =?UTF-8?q?fix:=20dock=E4=BB=A3=E7=A0=81=E4=B8=AD?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E9=9F=B3=E4=B9=90=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 从dock代码中移除音乐插件,适配不同插件的显示 Log: Influence: 打开音乐播放器,任务栏快捷面板中显示音乐播放面板 Task: https://pms.uniontech.com/task-view-220489.html Change-Id: Ib52383990489336bb6213b79963b151d4e1a7a14 --- frame/item/components/fullquickitem.cpp | 13 ++ frame/item/components/fullquickitem.h | 2 + frame/item/components/multiquickitem.cpp | 10 + frame/item/components/multiquickitem.h | 3 + frame/item/components/singlequickitem.cpp | 13 +- frame/item/components/singlequickitem.h | 4 + frame/item/quicksettingitem.h | 1 + frame/model/mediaplayermodel.cpp | 259 ---------------------- frame/model/mediaplayermodel.h | 126 ----------- frame/window/components/mediawidget.cpp | 213 ------------------ frame/window/components/mediawidget.h | 97 -------- frame/window/quickpluginmodel.cpp | 6 + frame/window/quicksettingcontainer.cpp | 70 ++++-- frame/window/quicksettingcontainer.h | 4 +- plugins/CMakeLists.txt | 1 + plugins/display/display.json | 3 +- plugins/sound/sound.json | 1 + 17 files changed, 103 insertions(+), 723 deletions(-) delete mode 100644 frame/model/mediaplayermodel.cpp delete mode 100644 frame/model/mediaplayermodel.h delete mode 100644 frame/window/components/mediawidget.cpp delete mode 100644 frame/window/components/mediawidget.h diff --git a/frame/item/components/fullquickitem.cpp b/frame/item/components/fullquickitem.cpp index 406629bc5..0fdfafac9 100644 --- a/frame/item/components/fullquickitem.cpp +++ b/frame/item/components/fullquickitem.cpp @@ -24,6 +24,7 @@ FullQuickItem::FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) : QuickSettingItem(pluginInter, parent) , m_centerWidget(pluginInter->itemWidget(QUICK_ITEM_KEY)) + , m_centerParentWidget(nullptr) , m_effectWidget(new DBlurEffectWidget(this)) { initUi(); @@ -42,6 +43,12 @@ void FullQuickItem::updateShow() m_centerWidget->update(); } +void FullQuickItem::detachPlugin() +{ + if (m_centerWidget) + m_centerWidget->setParent(m_centerParentWidget); +} + QuickSettingItem::QuickSettingType FullQuickItem::type() const { return QuickSettingItem::QuickSettingType::Full; @@ -65,6 +72,9 @@ void FullQuickItem::initUi() if (!m_centerWidget) return; + m_centerWidget->setVisible(true); + m_centerParentWidget = m_centerWidget->parentWidget(); + QHBoxLayout *layout = new QHBoxLayout(m_effectWidget); layout->setContentsMargins(0, 0, 0, 0); layout->setAlignment(Qt::AlignHCenter); @@ -79,6 +89,9 @@ void FullQuickItem::initUi() void FullQuickItem::resizeSelf() { + if (!m_centerWidget) + return; + m_effectWidget->setFixedHeight(m_centerWidget->height()); setFixedHeight(m_centerWidget->height()); } diff --git a/frame/item/components/fullquickitem.h b/frame/item/components/fullquickitem.h index 98b4795a9..16082a09e 100644 --- a/frame/item/components/fullquickitem.h +++ b/frame/item/components/fullquickitem.h @@ -31,6 +31,7 @@ public: FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); ~FullQuickItem() override; void updateShow() override; + void detachPlugin() override; QuickSettingType type() const override; @@ -43,6 +44,7 @@ private: private: QWidget *m_centerWidget; + QWidget *m_centerParentWidget; DBlurEffectWidget *m_effectWidget; }; diff --git a/frame/item/components/multiquickitem.cpp b/frame/item/components/multiquickitem.cpp index e6eda1de2..9e8d1a4fa 100644 --- a/frame/item/components/multiquickitem.cpp +++ b/frame/item/components/multiquickitem.cpp @@ -36,6 +36,7 @@ MultiQuickItem::MultiQuickItem(PluginsItemInterface *const pluginInter, QWidget , m_iconWidget(nullptr) , m_nameLabel(nullptr) , m_stateLabel(nullptr) + , m_itemWidgetParent(nullptr) { initUi(); } @@ -62,6 +63,13 @@ void MultiQuickItem::updateShow() } } +void MultiQuickItem::detachPlugin() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget && itemWidget->parentWidget() == this) + itemWidget->setParent(m_itemWidgetParent); +} + QuickSettingItem::QuickSettingType MultiQuickItem::type() const { return QuickSettingItem::QuickSettingType::Multi; @@ -107,8 +115,10 @@ void MultiQuickItem::initUi() { QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); if (pluginItem()->icon(DockPart::QuickPanel).isNull() && itemWidget) { + m_itemWidgetParent = itemWidget->parentWidget(); // 如果插件没有返回图标的显示,则获取插件的itemWidget QHBoxLayout *mainLayout = new QHBoxLayout(this); + itemWidget->setVisible(true); itemWidget->setParent(this); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->addWidget(itemWidget); diff --git a/frame/item/components/multiquickitem.h b/frame/item/components/multiquickitem.h index 0b03f8f29..cd20f3125 100644 --- a/frame/item/components/multiquickitem.h +++ b/frame/item/components/multiquickitem.h @@ -24,6 +24,7 @@ #include class QuickIconWidget; +class QWidget; class MultiQuickItem : public QuickSettingItem { @@ -33,6 +34,7 @@ public: MultiQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); ~MultiQuickItem() override; void updateShow() override; + void detachPlugin() override; QuickSettingType type() const override; @@ -47,6 +49,7 @@ private: QuickIconWidget *m_iconWidget; QLabel *m_nameLabel; QLabel *m_stateLabel; + QWidget *m_itemWidgetParent; }; /** diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp index c544a1fc0..02c0fd475 100644 --- a/frame/item/components/singlequickitem.cpp +++ b/frame/item/components/singlequickitem.cpp @@ -29,15 +29,13 @@ SingleQuickItem::SingleQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) : QuickSettingItem(pluginInter, parent) + , m_itemParentWidget(nullptr) { initUi(); } SingleQuickItem::~SingleQuickItem() { - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (itemWidget) - itemWidget->setParent(nullptr); } QuickSettingItem::QuickSettingType SingleQuickItem::type() const @@ -80,10 +78,12 @@ QWidget *SingleQuickItem::iconWidget(QWidget *parent) // 如果图标为空,则将获取itemWidget作为它的显示 QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); if (itemWidget) { + m_itemParentWidget = itemWidget->parentWidget(); QHBoxLayout *layout = new QHBoxLayout(widget); layout->setContentsMargins(0, 0, 0 ,0); itemWidget->setParent(widget); layout->addWidget(itemWidget); + itemWidget->setVisible(true); childIsEmpty = false; } } @@ -189,3 +189,10 @@ void SingleQuickItem::updateShow() itemWidget->update(); } } + +void SingleQuickItem::detachPlugin() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget && !property("paint").toBool()) + itemWidget->setParent(m_itemParentWidget); +} diff --git a/frame/item/components/singlequickitem.h b/frame/item/components/singlequickitem.h index db6d862df..dd0a6f657 100644 --- a/frame/item/components/singlequickitem.h +++ b/frame/item/components/singlequickitem.h @@ -33,6 +33,7 @@ public: QuickSettingType type() const override; void updateShow() override; + void detachPlugin() override; protected: void mouseReleaseEvent(QMouseEvent *event) override; @@ -44,6 +45,9 @@ private: QPixmap pixmap() const; QLabel *findChildLabel(QWidget *parent, const QString &childObjectName) const; void updatePluginName(QLabel *textLabel); + +private: + QWidget *m_itemParentWidget; }; #endif // SINGLEQUICKITEM_H diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 4767a74e4..dd7dec259 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -44,6 +44,7 @@ public: ItemType itemType() const override; virtual const QPixmap dragPixmap(); virtual void updateShow() {} + virtual void detachPlugin() {} const QString itemKey() const; virtual QuickSettingType type() const = 0; diff --git a/frame/model/mediaplayermodel.cpp b/frame/model/mediaplayermodel.cpp deleted file mode 100644 index 32dd6041e..000000000 --- a/frame/model/mediaplayermodel.cpp +++ /dev/null @@ -1,259 +0,0 @@ -#include "mediaplayermodel.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -MediaPlayerModel::MediaPlayerModel(QObject *parent) - : QObject(parent) - , m_isActived(false) - , m_mediaInter(nullptr) -{ - initMediaPlayer(); -} - -MediaPlayerModel::~MediaPlayerModel() -{ -} - -MediaPlayerModel *MediaPlayerModel::instance() -{ - static MediaPlayerModel instance; - return &instance; -} - -bool MediaPlayerModel::isActived() -{ - return m_isActived; -} - -bool MediaPlayerModel::canGoNext() -{ - return m_mediaInter ? m_mediaInter->canGoNext() : false; -} - -bool MediaPlayerModel::canGoPrevious() -{ - return m_mediaInter ? m_mediaInter->canGoPrevious() : false; -} - -bool MediaPlayerModel::canPause() -{ - - return m_mediaInter ? m_mediaInter->canPause() : false; -} - -MediaPlayerModel::PlayStatus MediaPlayerModel::status() -{ - if (!m_isActived || !m_mediaInter) - return PlayStatus::Stop; - - return convertStatus(m_mediaInter->playbackStatus()); -} - -const QString MediaPlayerModel::name() -{ - if (m_mediaInter) { - Dict data = m_mediaInter->metadata(); - return data["xesam:title"].toString(); - } - - return QString(); -} - -const QString MediaPlayerModel::iconUrl() -{ - if (m_mediaInter) { - Dict data = m_mediaInter->metadata(); - return data["mpris:artUrl"].toString(); - } - - return QString(); -} - -const QString MediaPlayerModel::album() -{ - if (m_mediaInter) { - Dict data = m_mediaInter->metadata(); - return data["xesam:album"].toString(); - } - - return QString(); -} - -const QString MediaPlayerModel::artist() -{ - if (m_mediaInter) { - Dict data = m_mediaInter->metadata(); - return data["xesam:artist"].toString(); - } - - return QString(); -} - -void MediaPlayerModel::setStatus(const MediaPlayerModel::PlayStatus &stat) -{ - if (!m_mediaInter) - return; - - switch (stat) { - case MediaPlayerModel::PlayStatus::Play: { - m_mediaInter->Play(); - break; - } - case MediaPlayerModel::PlayStatus::Stop: { - m_mediaInter->Stop(); - break; - } - case MediaPlayerModel::PlayStatus::Pause: { - m_mediaInter->Pause(); - break; - } - default: break; - } -} - -void MediaPlayerModel::playNext() -{ - if (m_mediaInter) - m_mediaInter->Next(); -} - -void MediaPlayerModel::initMediaPlayer() -{ - QDBusInterface dbusInter("org.freedesktop.DBus", "/", "org.freedesktop.DBus", QDBusConnection::sessionBus(), this); - QDBusPendingCall call = dbusInter.asyncCall("ListNames"); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, [ = ] { - m_serviceName.clear(); - if (call.isError()) - return; - - QDBusReply reply = call.reply(); - const QStringList &serviceList = reply.value(); - - for (const QString &serv : serviceList) { - if (!serv.startsWith("org.mpris.MediaPlayer2")) - continue; - - QDBusInterface serviceInterface(serv, "/org/mpris/MediaPlayer2", - "org.mpris.MediaPlayer2.Player", QDBusConnection::sessionBus(), this); - // 如果开启了谷歌浏览器的后台服务(org.mpris.MediaPlayer2.chromium.instance17352) - // 也符合名称要求,但是它不是音乐服务,此时需要判断是否存在这个属性 - QVariant v = serviceInterface.property("CanPlay"); - if (!v.isValid() || !v.value()) - continue; - - m_serviceName = serv; - break; - } - - if (!m_serviceName.isEmpty()) { - m_isActived = true; - - m_mediaInter = new MediaPlayerInterface(m_serviceName, "/org/mpris/MediaPlayer2", QDBusConnection::sessionBus(), this); - connect(m_mediaInter, &MediaPlayerInterface::PlaybackStatusChanged, this, [ this ] { - Q_EMIT statusChanged(convertStatus(m_mediaInter->playbackStatus())); - }); - connect(m_mediaInter, &MediaPlayerInterface::MetadataChanged, this, &MediaPlayerModel::metadataChanged); - Dict v = m_mediaInter->metadata(); - m_name = v.value("xesam:title").toString(); - m_icon = v.value("mpris:artUrl").toString(); - m_album = v.value("xesam:album").toString(); - m_artist = v.value("xesam:artist").toString(); - Q_EMIT startStop(true); - return; - } - - QDBusConnectionInterface *dbusInterface = QDBusConnection::sessionBus().interface(); - connect(dbusInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, - [ = ](const QString &name, const QString &, const QString &newOwner) { - if (name.startsWith("org.mpris.MediaPlayer2")) { - // 启动了音乐播放 - m_isActived = !newOwner.isEmpty(); - if (m_isActived) { - m_serviceName = name; - m_mediaInter = new MediaPlayerInterface(m_serviceName, "/org/mpris/MediaPlayer2", QDBusConnection::sessionBus(), this); - connect(m_mediaInter, &MediaPlayerInterface::PlaybackStatusChanged, this, [ this ] { - Q_EMIT statusChanged(convertStatus(m_mediaInter->playbackStatus())); - }); - connect(m_mediaInter, &MediaPlayerInterface::MetadataChanged, this, &MediaPlayerModel::metadataChanged); - Dict v = m_mediaInter->metadata(); - m_name = v.value("xesam:title").toString(); - m_icon = v.value("mpris:artUrl").toString(); - m_album = v.value("xesam:album").toString(); - m_artist = v.value("xesam:artist").toString(); - } else { - if (!m_serviceName.isEmpty()) { - delete m_mediaInter; - m_mediaInter = nullptr; - } - m_serviceName.clear(); - } - Q_EMIT startStop(m_isActived); - } - }); - connect(dbusInterface, &QDBusConnectionInterface::serviceUnregistered, this, - [ = ](const QString &service) { - if (service.startsWith("org.mpris.MediaPlayer2")) { - // 启动了音乐播放 - m_serviceName.clear(); - m_isActived = false; - Q_EMIT startStop(m_isActived); - } - }); - }); - connect(watcher, &QDBusPendingCallWatcher::finished, watcher, &QDBusPendingCallWatcher::deleteLater); -} - -MediaPlayerModel::PlayStatus MediaPlayerModel::convertStatus(const QString &stat) -{ - if (stat == "Paused") - return PlayStatus::Pause; - if (stat == "Playing") - return PlayStatus::Play; - if (stat == "Stopped") - return PlayStatus::Stop; - - return PlayStatus::Unknow; -} - -MediaPlayerInterface::MediaPlayerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, "org.mpris.MediaPlayer2.Player", connection, parent) -{ - QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); -} - -MediaPlayerInterface::~MediaPlayerInterface() -{ - QDBusConnection::sessionBus().disconnect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); -} - -void MediaPlayerInterface::onPropertyChanged(const QDBusMessage& msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName !="org.mpris.MediaPlayer2.Player") - return; - - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - QStringList keys = changedProps.keys(); - foreach(const QString &prop, keys) { - const QMetaObject* self = metaObject(); - for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) { - QMetaProperty p = self->property(i); - if (p.name() == prop) { - Q_EMIT p.notifySignal().invoke(this); - } - } - } -} diff --git a/frame/model/mediaplayermodel.h b/frame/model/mediaplayermodel.h deleted file mode 100644 index 880ea2270..000000000 --- a/frame/model/mediaplayermodel.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef MEDIAPLAYERMODEL_H -#define MEDIAPLAYERMODEL_H - -#include -#include -#include - -typedef QMap Dict; -Q_DECLARE_METATYPE(Dict) - -class QDBusMessage; -class QDBusConnection; -class MediaPlayerInterface; - -class MediaPlayerModel : public QObject -{ - Q_OBJECT - -public: - enum PlayStatus { - Unknow = 0, - Play, - Pause, - Stop - }; - -public: - static MediaPlayerModel *instance(); - bool isActived(); - bool canGoNext(); - bool canGoPrevious(); - bool canPause(); - - PlayStatus status(); - const QString name(); - const QString iconUrl(); - const QString album(); - const QString artist(); - - void setStatus(const PlayStatus &stat); - void playNext(); - -Q_SIGNALS: - void startStop(bool); - void statusChanged(const PlayStatus &); - void metadataChanged(); - -protected: - explicit MediaPlayerModel(QObject *parent = nullptr); - ~MediaPlayerModel(); - -private: - void initMediaPlayer(); - PlayStatus convertStatus(const QString &stat); - -private: - bool m_isActived; - QString m_serviceName; - QString m_name; - QString m_icon; - QString m_album; - QString m_artist; - MediaPlayerInterface *m_mediaInter; -}; - -class MediaPlayerInterface : public QDBusAbstractInterface -{ - Q_OBJECT - -Q_SIGNALS: - void MetadataChanged(); - void CanGoNextChanged(); - void CanGoPreviousChanged(); - void CanPauseChanged(); - void PlaybackStatusChanged(); - -public: - MediaPlayerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); - ~MediaPlayerInterface(); - -public: - inline QDBusPendingReply<> Play() { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("Play"), argumentList); - } - - inline QDBusPendingReply<> Stop() { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("Stop"), argumentList); - } - - inline QDBusPendingReply<> Pause() { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("Pause"), argumentList); - } - - inline QDBusPendingReply<> Next() { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("Next"), argumentList); - } - - Q_PROPERTY(Dict Metadata READ metadata NOTIFY MetadataChanged) - inline Dict metadata() const - { return qvariant_cast(property("Metadata")); } - - Q_PROPERTY(bool CanGoNext READ canGoNext NOTIFY CanGoNextChanged) - inline bool canGoNext() const - { return qvariant_cast< bool >(property("CanGoNext")); } - - Q_PROPERTY(bool CanGoPrevious READ canGoPrevious NOTIFY CanGoPreviousChanged) - inline bool canGoPrevious() const - { return qvariant_cast< bool >(property("CanGoPrevious")); } - - Q_PROPERTY(bool CanPause READ canPause NOTIFY CanPauseChanged) - inline bool canPause() const - { return qvariant_cast< bool >(property("CanPause")); } - - Q_PROPERTY(QString PlaybackStatus READ playbackStatus NOTIFY PlaybackStatusChanged) - inline QString playbackStatus() const - { return qvariant_cast< QString >(property("PlaybackStatus")); } - -private Q_SLOTS: - void onPropertyChanged(const QDBusMessage& msg); -}; - -#endif // MEDIAPLAYERLISTENER_H diff --git a/frame/window/components/mediawidget.cpp b/frame/window/components/mediawidget.cpp deleted file mode 100644 index cebf1a28a..000000000 --- a/frame/window/components/mediawidget.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "mediawidget.h" - -#include - -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -MediaWidget::MediaWidget(QWidget *parent) - : DBlurEffectWidget(parent) - , m_musicIcon(new QLabel(this)) - , m_musicName(new QLabel(this)) - , m_musicSinger(new QLabel(this)) - , m_pausePlayButton(new MusicButton(this)) - , m_nextButton(new MusicButton(this)) -{ - initUi(); - initConnection(); -} - -MediaWidget::~MediaWidget() -{ -} - -void MediaWidget::showEvent(QShowEvent *event) -{ - DBlurEffectWidget::showEvent(event); - Q_EMIT visibleChanged(true); -} - -void MediaWidget::hideEvent(QHideEvent *event) -{ - DBlurEffectWidget::hideEvent(event); - Q_EMIT visibleChanged(false); -} - -void MediaWidget::statusChanged(const MediaPlayerModel::PlayStatus &newStatus) -{ - switch (newStatus) { - case MediaPlayerModel::PlayStatus::Play: { - m_pausePlayButton->setButtonType(MusicButton::ButtonType::Pause); - break; - } - case MediaPlayerModel::PlayStatus::Stop: - case MediaPlayerModel::PlayStatus::Pause: { - m_pausePlayButton->setButtonType(MusicButton::ButtonType::Playing); - break; - } - default: break; - } -} - -void MediaWidget::onPlayClicked() -{ - // 设置当前的播放状态 - MediaPlayerModel *player = MediaPlayerModel::instance(); - if (player->status() == MediaPlayerModel::PlayStatus::Play) - player->setStatus(MediaPlayerModel::PlayStatus::Pause); - else - player->setStatus(MediaPlayerModel::PlayStatus::Play); -} - -void MediaWidget::onNext() -{ - // 播放下一曲 - MediaPlayerModel *player = MediaPlayerModel::instance(); - player->playNext(); -} - -void MediaWidget::initUi() -{ - m_pausePlayButton->setFixedWidth(20); - m_nextButton->setFixedWidth(20); - - QHBoxLayout *mainLayout = new QHBoxLayout(this); - mainLayout->setContentsMargins(20, 0, 20, 0); - mainLayout->addWidget(m_musicIcon); - - QWidget *infoWidget = new QWidget(this); - QVBoxLayout *infoLayout = new QVBoxLayout(infoWidget); - infoLayout->addWidget(m_musicName); - infoLayout->addWidget(m_musicSinger); - mainLayout->addWidget(infoWidget); - mainLayout->addWidget(m_pausePlayButton); - mainLayout->addSpacing(25); - mainLayout->addWidget(m_nextButton); - - m_musicIcon->setFixedSize(32, 32); - m_musicName->setFont(DFontSizeManager::instance()->t8()); - m_musicSinger->setFont(DFontSizeManager::instance()->t10()); - setVisible(MediaPlayerModel::instance()->isActived()); -} - -void MediaWidget::initConnection() -{ - MediaPlayerModel *mediaPlayer = MediaPlayerModel::instance(); - connect(mediaPlayer, &MediaPlayerModel::startStop, this, [ this, mediaPlayer ](bool startOrStop) { - setVisible(startOrStop); - m_nextButton->setEnabled(mediaPlayer->canGoNext()); - onUpdateMediaInfo(); - statusChanged(mediaPlayer->status()); - }); - connect(mediaPlayer, &MediaPlayerModel::metadataChanged, this, &MediaWidget::onUpdateMediaInfo); - connect(mediaPlayer, &MediaPlayerModel::statusChanged, this, &MediaWidget::statusChanged); - connect(m_pausePlayButton, &MusicButton::clicked, this, &MediaWidget::onPlayClicked); - connect(m_nextButton, &MusicButton::clicked, this, &MediaWidget::onNext); - - m_pausePlayButton->setButtonType(mediaPlayer->status() == MediaPlayerModel::PlayStatus::Play ? - MusicButton::ButtonType::Pause : MusicButton::ButtonType::Playing); - m_nextButton->setButtonType(MusicButton::ButtonType::Next); -} - -void MediaWidget::onUpdateMediaInfo() -{ - MediaPlayerModel *mediaPlayer = MediaPlayerModel::instance(); - m_musicName->setText(mediaPlayer->name()); - QString file = mediaPlayer->iconUrl(); - if (file.startsWith("file:///")) - file.replace("file:///", "/"); - m_musicIcon->setPixmap(QPixmap(file).scaled(m_musicIcon->size())); - m_musicSinger->setText(mediaPlayer->artist()); -} - -/** - * @brief 音乐播放的相关按钮 - * @param parent - */ - -MusicButton::MusicButton(QWidget *parent) - : QWidget(parent) -{ - installEventFilter(this); -} - -MusicButton::~MusicButton() -{ -} - -int MusicButton::getIconHeight() const -{ - switch (m_buttonType) { - case ButtonType::Pause: - return 21; - case ButtonType::Next: - case ButtonType::Playing: - return 18; - } - - return 18; -} - -void MusicButton::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - int ctrlHeight = getIconHeight(); - - int width = this->width(); - int height = this->height(); - int startX = 2; - int startY = (height - ctrlHeight) / 2; - QColor color(0, 0, 0); - QPainter painter(this); - painter.save(); - painter.setRenderHint(QPainter::Antialiasing); - painter.setPen(color); - painter.setBrush(color); - if (m_buttonType == ButtonType::Pause) { - painter.drawRect(QRect(startX, startY, 6, ctrlHeight)); - painter.drawRect(QRect(width - 6 - 2, startY, 6, ctrlHeight)); - } else { - QPainterPath trianglePath; - trianglePath.moveTo(startX, startY); - trianglePath.lineTo(width - 6, height / 2); - trianglePath.lineTo(startX, startY + ctrlHeight); - trianglePath.lineTo(startX, startY); - painter.drawPath(trianglePath); - if (m_buttonType == ButtonType::Next) - painter.drawRect(width - 6, startY, 2, ctrlHeight); - } - painter.restore(); -} - -void MusicButton::mouseReleaseEvent(QMouseEvent *event) -{ - Q_UNUSED(event); - Q_EMIT clicked(); -} diff --git a/frame/window/components/mediawidget.h b/frame/window/components/mediawidget.h deleted file mode 100644 index 4d9b59146..000000000 --- a/frame/window/components/mediawidget.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef MEDIAWIDGET_H -#define MEDIAWIDGET_H - -#include "mediaplayermodel.h" - -#include - -class QLabel; -class MusicButton; - -DWIDGET_USE_NAMESPACE - -class MediaWidget : public DBlurEffectWidget -{ - Q_OBJECT - -public: - explicit MediaWidget(QWidget *parent = nullptr); - ~MediaWidget() override; - -Q_SIGNALS: - void visibleChanged(bool); - -protected: - void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; - -private Q_SLOTS: - void statusChanged(const MediaPlayerModel::PlayStatus &newStatus); - void onPlayClicked(); - void onNext(); - void onUpdateMediaInfo(); - -private: - void initUi(); - void initConnection(); - -private: - QLabel *m_musicIcon; - QLabel *m_musicName; - QLabel *m_musicSinger; - MusicButton *m_pausePlayButton; - MusicButton *m_nextButton; -}; - -// 音乐播放按钮 -class MusicButton : public QWidget -{ - Q_OBJECT - -Q_SIGNALS: - void clicked(); - -public: - enum ButtonType { Playing = 0, Pause, Next }; - -public: - MusicButton(QWidget *parent = Q_NULLPTR); - ~MusicButton() override; - - inline void setButtonType(const ButtonType &bt) { - m_buttonType = bt; - update(); - } - -protected: - void paintEvent(QPaintEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - -private: - int getIconHeight() const; - -private: - ButtonType m_buttonType; -}; - -#endif // MEDIAWIDGER_H diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index 5c5d75596..052885f69 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -23,6 +23,8 @@ #include "quicksettingcontroller.h" #include "settingconfig.h" +#include + static QStringList fixedPluginNames { "network", "sound", "power" }; #define PLUGINNAMEKEY "Dock_Quick_Plugin_Name" @@ -166,6 +168,10 @@ void QuickPluginModel::initConnection() if (plugAttr != QuickSettingController::PluginAttribute::Quick) return; + QWidget *quickWidget = itemInter->itemWidget(QUICK_ITEM_KEY); + if (quickWidget && !quickWidget->parentWidget()) + quickWidget->setVisible(false); + // 用来读取已经固定在下方的插件 if (!m_dockedPluginIndex.contains(itemInter->pluginName())) return; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 8a62a2f11..34f6b6519 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -22,7 +22,6 @@ #include "quicksettingcontroller.h" #include "pluginsiteminterface.h" #include "quicksettingitem.h" -#include "mediawidget.h" #include "dockpopupwindow.h" #include "slidercontainer.h" #include "pluginchildpage.h" @@ -71,7 +70,6 @@ QuickSettingContainer::QuickSettingContainer(QWidget *parent) , m_componentWidget(new QWidget(m_mainWidget)) , m_mainlayout(new QVBoxLayout(m_mainWidget)) , m_pluginLoader(QuickSettingController::instance()) - , m_playerWidget(new MediaWidget(m_componentWidget)) , m_childPage(new PluginChildPage(this)) , m_dragInfo(new struct QuickDragInfo) , m_childShowPlugin(nullptr) @@ -208,6 +206,7 @@ void QuickSettingContainer::appendPlugin(PluginsItemInterface *itemInter, bool n if (quickItem->type() == QuickSettingItem::QuickSettingType::Full) { // 插件位置占据整行,例如声音、亮度和音乐等 m_componentWidget->layout()->addWidget(quickItem); + updateFullItemLayout(); } else if (needLayout) { // 插件占据两行或者一行 updateItemLayout(); @@ -226,6 +225,7 @@ void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) return; QuickSettingItem *removeItem = *removeItemIter; + removeItem->detachPlugin(); if (removeItem->type() == QuickSettingItem::QuickSettingType::Full) m_componentWidget->layout()->removeWidget(removeItem); @@ -238,6 +238,7 @@ void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) showPage(nullptr); updateItemLayout(); + updateFullItemLayout(); onResizeView(); } @@ -319,6 +320,7 @@ void QuickSettingContainer::updateItemLayout() int usedColumn = (type == QuickSettingItem::QuickSettingType::Multi ? 2 : 1); QList quickPlugins = quickSettings[type]; for (QuickSettingItem *quickItem : quickPlugins) { + quickItem->setVisible(true); m_pluginLayout->addWidget(quickItem, row, column, 1, usedColumn); column += usedColumn; if (column >= COLUMNCOUNT) { @@ -334,19 +336,48 @@ void QuickSettingContainer::updateItemLayout() insertQuickSetting(QuickSettingItem::QuickSettingType::Single, row, column); } +void QuickSettingContainer::updateFullItemLayout() +{ + while (m_componentWidget->layout()->count() > 0) + m_componentWidget->layout()->takeAt(0); + + QuickSettingController *quickController = QuickSettingController::instance(); + QList fullItems; + QMap fullItemOrder; + for (QuickSettingItem *item : m_quickSettings) { + if (item->type() != QuickSettingItem::QuickSettingType::Full) + continue; + + fullItems << item; + int order = -1; + QJsonObject metaData = quickController->metaData(item->pluginItem()); + if (metaData.contains("order")) + order = metaData.value("order").toInt(); + + fullItemOrder[item] = order; + } + + std::sort(fullItems.begin(), fullItems.end(), [ fullItemOrder ](QuickSettingItem *item1, QuickSettingItem *item2) { + int order1 = fullItemOrder.value(item1, -1); + int order2 = fullItemOrder.value(item2, -1); + if (order1 == order2) + return true; + if (order1 == -1) + return false; + if (order2 == -1) + return true; + + return order1 < order2; + }); + + for (QuickSettingItem *item : fullItems) { + item->setVisible(true); + m_componentWidget->layout()->addWidget(item); + } +} + void QuickSettingContainer::initUi() { - auto setWidgetStyle = [](DBlurEffectWidget *widget) { - widget->setMaskColor(QColor(239, 240, 245)); - widget->setBlurRectXRadius(8); - widget->setBlurRectYRadius(8); - }; - - // 添加音乐播放插件 - m_playerWidget->setFixedHeight(ITEMHEIGHT); - - setWidgetStyle(m_playerWidget); - m_mainlayout->setSpacing(ITEMSPACE); m_mainlayout->setContentsMargins(ITEMSPACE, ITEMSPACE, ITEMSPACE, ITEMSPACE); @@ -362,8 +393,7 @@ void QuickSettingContainer::initUi() QVBoxLayout *ctrlLayout = new QVBoxLayout(m_componentWidget); ctrlLayout->setContentsMargins(0, 0, 0, 0); ctrlLayout->setSpacing(ITEMSPACE); - - ctrlLayout->addWidget(m_playerWidget); + ctrlLayout->setDirection(QBoxLayout::BottomToTop); m_mainlayout->addWidget(m_componentWidget); // 加载所有的插件 @@ -378,8 +408,10 @@ void QuickSettingContainer::initUi() setAcceptDrops(true); QMetaObject::invokeMethod(this, [ = ] { - if (plugins.size() > 0) + if (plugins.size() > 0) { updateItemLayout(); + updateFullItemLayout(); + } // 设置当前窗口的大小 onResizeView(); setFixedWidth(ITEMWIDTH * 4 + (ITEMSPACE * 5)); @@ -397,7 +429,6 @@ void QuickSettingContainer::initConnection() connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); connect(m_pluginLoader, &QuickSettingController::pluginUpdated, this, &QuickSettingContainer::onPluginUpdated); - connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView); connect(m_childPage, &PluginChildPage::back, this, [ this ] { showPage(m_mainWidget); }); @@ -430,11 +461,6 @@ void QuickSettingContainer::onResizeView() rowCount++; m_pluginWidget->setFixedHeight(ITEMHEIGHT * rowCount + ITEMSPACE * (rowCount - 1)); - - if (m_playerWidget->isVisible()) { - fullItemHeight += m_playerWidget->height(); - widgetCount++; - } m_componentWidget->setFixedHeight(fullItemHeight + (widgetCount - 1) * ITEMSPACE); setFixedHeight(ITEMSPACE * 3 + m_pluginWidget->height() + m_componentWidget->height()); diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 15247d1d0..149fb259d 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -32,7 +32,6 @@ class DockItem; class QVBoxLayout; class QuickSettingController; -class MediaWidget; class BrightnessModel; class BrightnessWidget; class QuickSettingItem; @@ -76,6 +75,8 @@ private: void initConnection(); // 调整控件位置 void updateItemLayout(); + // 调整全列插件的位置 + void updateFullItemLayout(); // 获取拖动图标的热点 QPoint hotSpot(const QPixmap &pixmap); // 插入插件 @@ -91,7 +92,6 @@ private: QWidget *m_componentWidget; QVBoxLayout *m_mainlayout; QuickSettingController *m_pluginLoader; - MediaWidget *m_playerWidget; PluginChildPage *m_childPage; QuickDragInfo *m_dragInfo; QList m_quickSettings; diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index b14acef0b..3d57fffe6 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -4,6 +4,7 @@ add_subdirectory("shutdown") add_subdirectory("power") add_subdirectory("sound") add_subdirectory("display") +add_subdirectory("media") #add_subdirectory("tray") add_subdirectory("trash") add_subdirectory("keyboard-layout") diff --git a/plugins/display/display.json b/plugins/display/display.json index bec81f0da..f7c723543 100644 --- a/plugins/display/display.json +++ b/plugins/display/display.json @@ -1,3 +1,4 @@ { - "api": "2.0.0" + "api": "2.0.0", + "order": 2 } diff --git a/plugins/sound/sound.json b/plugins/sound/sound.json index 181aef926..bc8b72a9c 100644 --- a/plugins/sound/sound.json +++ b/plugins/sound/sound.json @@ -1,4 +1,5 @@ { "api": "2.0.0", + "order": 1, "depends-daemon-dbus-service": "org.deepin.daemon.Audio1" } From 224066836a39277fba4635ee17b1ea28d3d5f427 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 30 Nov 2022 09:34:31 +0800 Subject: [PATCH 175/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=AD=E5=BF=83=E6=98=BE=E7=A4=BA=E5=A4=9A=E6=9D=A1?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E6=8E=A7=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:插件在多次调用itemAdded方法,导致条件到列表中的控件重复 修改:过滤掉重复加载的插件,保证同一个插件在控制中心只显示一次 Log: Influence: 控制中心-个性化,观察蓝牙或者任务栏等插件是否只显示一次 Bug: https://pms.uniontech.com/bug-view-171581.html Change-Id: I52912c0c51159df1f84ed16dcbe891c346a6bfaa --- frame/util/abstractpluginscontroller.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index 4f143a562..3f632ed5b 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -86,6 +86,10 @@ void AbstractPluginsController::removeValue(PluginsItemInterface *const itemInte void AbstractPluginsController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { PluginsItemInterface *pluginItem = getPluginInterface(itemInter); + + if (m_pluginExists.contains(pluginItem)) + return; + PluginAdapter *pluginAdapter = dynamic_cast(pluginItem); if (pluginAdapter) pluginAdapter->setItemKey(itemKey); From 8cb6cb89d75501e8c46727774568b829d325118e Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 30 Nov 2022 11:13:45 +0800 Subject: [PATCH 176/257] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=9B=9E?= =?UTF-8?q?=E6=94=B6=E7=AB=99=E5=92=8C=E7=94=B5=E6=BA=90=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=9C=A8=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E7=9A=84=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=92=8C=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 响应DConfig配置文件的变化,根据当前新增或删除的配置来新增或删除插件 Log: Influence: 从控制中心勾选或者取消勾选回收站和电源插件,观察任务栏的变化 Task: https://pms.uniontech.com/task-view-216841.html Change-Id: Ia79ae924180d07e1b11f26bd119c83a8932cb80d --- frame/controller/proxyplugincontroller.cpp | 5 ++ frame/controller/proxyplugincontroller.h | 2 + frame/controller/toolapphelper.cpp | 81 +++++++++++++++++----- frame/controller/toolapphelper.h | 9 ++- frame/item/pluginsitem.cpp | 20 +++--- frame/util/abstractpluginscontroller.cpp | 60 +++++++++++++++- frame/util/abstractpluginscontroller.h | 20 ++++-- frame/window/docktraywindow.cpp | 19 ++++- frame/window/docktraywindow.h | 2 + frame/window/mainpanelcontrol.cpp | 6 +- frame/window/traymanagerwindow.cpp | 20 ++++-- 11 files changed, 194 insertions(+), 50 deletions(-) diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index d9a529b65..ff690f7d3 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -137,6 +137,11 @@ ProxyPluginController::ProxyPluginController(QObject *parent) QMetaObject::invokeMethod(this, &ProxyPluginController::startLoader, Qt::QueuedConnection); } +bool ProxyPluginController::pluginIsLoaded(PluginsItemInterface *itemInter) +{ + return m_pluginsItems.contains(itemInter); +} + QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const itemInter) { QMap > &plugin = pluginsMap(); diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index e52f738bb..6ed951f51 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -51,6 +51,8 @@ protected: explicit ProxyPluginController(QObject *parent = nullptr); ~ProxyPluginController() override {} + bool pluginIsLoaded(PluginsItemInterface *itemInter) override; + void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; diff --git a/frame/controller/toolapphelper.cpp b/frame/controller/toolapphelper.cpp index 500f0445d..630dedf18 100644 --- a/frame/controller/toolapphelper.cpp +++ b/frame/controller/toolapphelper.cpp @@ -31,6 +31,7 @@ ToolAppHelper::ToolAppHelper(QWidget *toolAreaWidget, QObject *parent) : QObject(parent) , m_toolAreaWidget(toolAreaWidget) , m_displayMode(DisplayMode::Efficient) + , m_position(Dock::Position::Bottom) { connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { if (pluginAttr != QuickSettingController::PluginAttribute::Tool) @@ -38,27 +39,28 @@ ToolAppHelper::ToolAppHelper(QWidget *toolAreaWidget, QObject *parent) pluginItemAdded(itemInter); }); + connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ = ](PluginsItemInterface *itemInter) { + pluginItemRemoved(itemInter); + }); QList pluginItems = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Tool); for (PluginsItemInterface *pluginItem : pluginItems) pluginItemAdded(pluginItem); + + updateToolArea(); } void ToolAppHelper::setDisplayMode(DisplayMode displayMode) { m_displayMode = displayMode; - updateWidgetStatus(); moveToolWidget(); + updateWidgetStatus(); } -void ToolAppHelper::removePluginItem(DockItem *dockItem) +void ToolAppHelper::setPosition(Position position) { - removeToolArea(dockItem); - - if (m_toolAreaWidget->layout()->count() == 0 && toolIsVisible()) - updateWidgetStatus(); - - Q_EMIT requestUpdate(); + m_toolAreaWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + m_position = position; } bool ToolAppHelper::toolIsVisible() const @@ -78,11 +80,12 @@ void ToolAppHelper::appendToToolArea(int index, DockItem *dockItem) Q_EMIT requestUpdate(); } -bool ToolAppHelper::removeToolArea(DockItem *dockItem) +bool ToolAppHelper::removeToolArea(PluginsItemInterface *itemInter) { QBoxLayout *boxLayout = static_cast(m_toolAreaWidget->layout()); for (int i = 0; i < boxLayout->count(); i++) { - if (boxLayout->itemAt(i)->widget() == dockItem) { + PluginsItem *dockItem = qobject_cast(boxLayout->itemAt(i)->widget()); + if (dockItem && dockItem->pluginItem() == itemInter) { boxLayout->removeWidget(dockItem); return true; } @@ -115,6 +118,38 @@ void ToolAppHelper::moveToolWidget() } } +void ToolAppHelper::updateToolArea() +{ + bool oldVisible = m_toolAreaWidget->isVisible(); + QLayout *layout = m_toolAreaWidget->layout(); + if (m_position == Dock::Position::Bottom || m_position == Dock::Position::Top) { + int size = 0; + for (int i = 0; i < layout->count(); i++) { + PluginsItem *dockItem = qobject_cast(layout->itemAt(i)->widget()); + if (!dockItem) + continue; + + size += dockItem->width(); + } + m_toolAreaWidget->setFixedWidth(size); + m_toolAreaWidget->setVisible(size > 0); + } else { + int size = 0; + for (int i = 0; i < layout->count(); i++) { + PluginsItem *dockItem = qobject_cast(layout->itemAt(i)->widget()); + if (!dockItem) + continue; + + size += dockItem->height(); + } + m_toolAreaWidget->setFixedHeight(size); + m_toolAreaWidget->setVisible(size > 0); + } + bool isVisible = m_toolAreaWidget->isVisible(); + if (oldVisible != isVisible) + Q_EMIT toolVisibleChanged(isVisible); +} + void ToolAppHelper::updateWidgetStatus() { bool oldVisible = toolIsVisible(); @@ -130,13 +165,9 @@ void ToolAppHelper::updateWidgetStatus() Q_EMIT toolVisibleChanged(visible); } -bool ToolAppHelper::pluginInTool(DockItem *dockItem) const +bool ToolAppHelper::pluginInTool(PluginsItemInterface *itemInter) const { - PluginsItem *pluginItem = qobject_cast(dockItem); - if (!pluginItem) - return false; - - return (QuickSettingController::instance()->pluginAttribute(pluginItem->pluginItem()) == QuickSettingController::PluginAttribute::Tool); + return (QuickSettingController::instance()->pluginAttribute(itemInter) == QuickSettingController::PluginAttribute::Tool); } void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter) @@ -145,9 +176,23 @@ void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter) return; QuickSettingController *quickController = QuickSettingController::instance(); - PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter); - if (pluginInTool(pluginItem)) + if (pluginInTool(itemInter)) { + PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter); appendToToolArea(0, pluginItem); + updateToolArea(); + Q_EMIT requestUpdate(); + } +} + +void ToolAppHelper::pluginItemRemoved(PluginsItemInterface *itemInter) +{ + QuickSettingController *quickController = QuickSettingController::instance(); + if (pluginInTool(itemInter)) { + PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter); + removeToolArea(pluginItem->pluginItem()); + updateToolArea(); + Q_EMIT requestUpdate(); + } } bool ToolAppHelper::pluginExists(PluginsItemInterface *itemInter) const diff --git a/frame/controller/toolapphelper.h b/frame/controller/toolapphelper.h index ee152dafc..768b93a31 100644 --- a/frame/controller/toolapphelper.h +++ b/frame/controller/toolapphelper.h @@ -41,7 +41,7 @@ public: explicit ToolAppHelper(QWidget *toolAreaWidget, QObject *parent = nullptr); void setDisplayMode(DisplayMode displayMode); - void removePluginItem(DockItem *dockItem); + void setPosition(Dock::Position position); bool toolIsVisible() const; Q_SIGNALS: @@ -50,17 +50,20 @@ Q_SIGNALS: private: void appendToToolArea(int index, DockItem *dockItem); - bool removeToolArea(DockItem *dockItem); + bool removeToolArea(PluginsItemInterface *itemInter); void moveToolWidget(); + void updateToolArea(); void updateWidgetStatus(); - bool pluginInTool(DockItem *dockItem) const; + bool pluginInTool(PluginsItemInterface *itemInter) const; void pluginItemAdded(PluginsItemInterface *itemInter); + void pluginItemRemoved(PluginsItemInterface *itemInter); bool pluginExists(PluginsItemInterface *itemInter) const; private: QWidget *m_toolAreaWidget; DisplayMode m_displayMode; + Dock::Position m_position; QList m_sequentPluginItems; }; diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index c50355178..abb8e7027 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -48,17 +48,19 @@ PluginsItem::PluginsItem(PluginsItemInterface *const pluginInter, const QString { qDebug() << "load plugins item: " << pluginInter->pluginName() << itemKey << m_centralWidget; - m_centralWidget->setParent(this); - m_centralWidget->setVisible(true); - m_centralWidget->setObjectName(pluginInter->pluginName() + "-centralwidget"); - m_centralWidget->installEventFilter(this); + if (m_centralWidget) { + m_centralWidget->setParent(this); + m_centralWidget->setVisible(true); + m_centralWidget->setObjectName(pluginInter->pluginName() + "-centralwidget"); + m_centralWidget->installEventFilter(this); - QBoxLayout *hLayout = new QHBoxLayout; - hLayout->addWidget(m_centralWidget); - hLayout->setSpacing(0); - hLayout->setMargin(0); + QBoxLayout *hLayout = new QHBoxLayout; + hLayout->addWidget(m_centralWidget); + hLayout->setSpacing(0); + hLayout->setMargin(0); - setLayout(hLayout); + setLayout(hLayout); + } setAccessibleName(pluginInter->pluginName()); setAttribute(Qt::WA_TranslucentBackground); diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index 3f632ed5b..5d6d4f6ac 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -24,6 +24,7 @@ #include "pluginsiteminterface_v20.h" #include "pluginadapter.h" #include "utils.h" +#include "settingconfig.h" #include #include @@ -49,6 +50,7 @@ AbstractPluginsController::AbstractPluginsController(QObject *parent) refreshPluginSettings(); + connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &AbstractPluginsController::onConfigChanged); connect(m_dockDaemonInter, &DockInter::PluginSettingsSynced, this, &AbstractPluginsController::refreshPluginSettings, Qt::QueuedConnection); } @@ -95,7 +97,9 @@ void AbstractPluginsController::itemAdded(PluginsItemInterface * const itemInter pluginAdapter->setItemKey(itemKey); m_pluginExists << pluginItem; - pluginItemAdded(pluginItem, itemKey); + m_pluginItemKeyMap[pluginItem] = itemKey; + if (canAddedPlugin(pluginItem)) + pluginItemAdded(pluginItem, itemKey); } void AbstractPluginsController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) @@ -106,6 +110,7 @@ void AbstractPluginsController::itemUpdate(PluginsItemInterface * const itemInte void AbstractPluginsController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) { m_pluginExists.removeOne(itemInter); + m_pluginItemKeyMap.remove(itemInter); pluginItemRemoved(getPluginInterface(itemInter), itemKey); } @@ -483,3 +488,56 @@ bool AbstractPluginsController::eventFilter(QObject *o, QEvent *e) return false; } + +bool AbstractPluginsController::canAddRemove(PluginsItemInterface *plugin) const +{ + if (!plugin->flags() & PluginFlag::Attribute_CanSetting) + return false; + + if (plugin->flags() & PluginFlag::Type_Tool) + return true; + + if (plugin->flags() & PluginFlag::Type_System) + return true; + + return false; +} + +bool AbstractPluginsController::canAddedPlugin(PluginsItemInterface *plugin) const +{ + if (!canAddRemove(plugin)) + return true; + + const QStringList configPlugins = SETTINGCONFIG->value("Dock_Quick_Plugin_Name").toStringList(); + return configPlugins.contains(plugin->pluginName()); +} + +void AbstractPluginsController::onConfigChanged(const QString &key, const QVariant &value) +{ + QStringList pluginNames = value.toStringList(); + if (key == "Dock_Quick_Plugin_Name") { + // 这里只处理工具插件(回收站)和系统插件(电源插件) + for (PluginsItemInterface *plugin : pluginCurrent()) { + if (!canAddRemove(plugin)) + continue; + + const QString itemKey = m_pluginItemKeyMap.value(plugin); + if (!pluginNames.contains(plugin->pluginName()) && pluginIsLoaded(plugin)) { + // 如果当前配置中不包含当前插件,但是当前插件已经加载,那么就移除该插件 + pluginItemRemoved(plugin, itemKey); + QWidget *itemWidget = plugin->itemWidget(itemKey); + if (itemWidget) + itemWidget->setVisible(false); + } else if (pluginNames.contains(plugin->pluginName()) && !pluginIsLoaded(plugin)) { + // 如果当前配置中包含当前插件,但是当前插件并未加载,那么就加载该插件 + pluginItemAdded(plugin, itemKey); + // 只有工具插件是通过QWidget的方式进行显示的,因此,这里只处理工具插件 + if (plugin->flags() & PluginFlag::Type_Tool) { + QWidget *itemWidget = plugin->itemWidget(itemKey); + if (itemWidget) + itemWidget->setVisible(true); + } + } + } + } +} diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index a366c0426..028ca6909 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -62,6 +62,17 @@ public: Q_SIGNALS: void pluginLoaderFinished(); +protected: + virtual bool pluginIsLoaded(PluginsItemInterface *itemInter) { return true; } + + QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; + PluginsItemInterface *pluginInterAt(const QString &itemKey); + PluginsItemInterface *pluginInterAt(QObject *destItem); + bool eventFilter(QObject *o, QEvent *e) override; + + bool canAddRemove(PluginsItemInterface *plugin) const; + bool canAddedPlugin(PluginsItemInterface *plugin) const; + private: // implements PluginProxyInterface void saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) override; @@ -74,15 +85,8 @@ private: void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; - PluginsItemInterface *getPluginInterface(PluginsItemInterface * const itemInter); -protected: - QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; - PluginsItemInterface *pluginInterAt(const QString &itemKey); - PluginsItemInterface *pluginInterAt(QObject *destItem); - bool eventFilter(QObject *o, QEvent *e) override; - protected Q_SLOTS: void startLoader(PluginLoader *loader); @@ -92,6 +96,7 @@ private slots: void loadPlugin(const QString &pluginFile); void initPlugin(PluginsItemInterface *interface); void refreshPluginSettings(); + void onConfigChanged(const QString &key, const QVariant &value); private: QDBusConnectionInterface *m_dbusDaemonInterface; @@ -103,6 +108,7 @@ private: // filepath, interface, loaded QMap, bool> m_pluginLoadMap; QList m_pluginExists; + QMap m_pluginItemKeyMap; QJsonObject m_pluginSettingsObject; QMap m_pluginAdapterMap; diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 761e8a2c1..32eb4a0de 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -45,6 +45,7 @@ DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent) , m_position(Dock::Position::Bottom) , m_displayMode(Dock::DisplayMode::Efficient) , m_mainBoxLayout(new QBoxLayout(QBoxLayout::Direction::RightToLeft, this)) + , m_frontWidget(new QWidget(this)) , m_toolWidget(new QWidget(this)) , m_toolLayout(new QBoxLayout(QBoxLayout::RightToLeft, m_toolWidget)) , m_toolLineLabel(new QLabel(this)) @@ -78,6 +79,7 @@ void DockTrayWindow::setDisplayMode(const Dock::DisplayMode &displayMode) { m_displayMode = displayMode; moveToolPlugin(); + updateToolWidget(); // 如果当前模式为高效模式,则设置当前的trayView为其计算位置的参照 if (displayMode == Dock::DisplayMode::Efficient) ExpandIconWidget::popupTrayView()->setReferGridView(m_trayView); @@ -131,6 +133,9 @@ void DockTrayWindow::resizeEvent(QResizeEvent *event) void DockTrayWindow::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); + if (!m_toolLineLabel->isVisible()) + return; + QPainter painter(this); QColor color; if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { @@ -271,6 +276,13 @@ void DockTrayWindow::moveToolPlugin() } } +void DockTrayWindow::updateToolWidget() +{ + m_toolWidget->setVisible(m_toolLayout->count() > 0); + m_toolLineLabel->setVisible(m_toolLayout->count() > 0); + m_frontWidget->setVisible(m_toolLayout->count() > 0); +} + void DockTrayWindow::initUi() { m_toolLayout->setContentsMargins(0, 0, 0, 0); @@ -279,7 +291,7 @@ void DockTrayWindow::initUi() m_systemPuginWidget->setDisplayMode(Dock::DisplayMode::Efficient); m_mainBoxLayout->setContentsMargins(0, 0, 0, 0); m_mainBoxLayout->setSpacing(0); - m_mainBoxLayout->addSpacing(FRONTSPACING); + m_mainBoxLayout->addWidget(m_frontWidget); m_mainBoxLayout->addWidget(m_toolWidget); m_mainBoxLayout->addSpacing(SPLITESPACE); m_mainBoxLayout->addWidget(m_toolLineLabel); @@ -293,6 +305,7 @@ void DockTrayWindow::initUi() m_toolLineLabel->setFixedSize(0, 0); m_mainBoxLayout->addStretch(); + updateToolWidget(); } void DockTrayWindow::initConnection() @@ -353,6 +366,7 @@ void DockTrayWindow::onUpdateComponentSize() case Dock::Position::Left: case Dock::Position::Right: m_toolLineLabel->setFixedSize(width() * 0.6, SPLITERSIZE); + m_frontWidget->setFixedSize(QWIDGETSIZE_MAX, FRONTSPACING); m_dateTimeWidget->setFixedSize(QWIDGETSIZE_MAX, m_dateTimeWidget->suitableSize().height()); m_systemPuginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPuginWidget->suitableSize().height()); m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, m_quickIconWidget->suitableSize().height()); @@ -361,6 +375,7 @@ void DockTrayWindow::onUpdateComponentSize() case Dock::Position::Top: case Dock::Position::Bottom: m_toolLineLabel->setFixedSize(SPLITERSIZE, height() * 0.6); + m_frontWidget->setFixedSize(FRONTSPACING, QWIDGETSIZE_MAX); m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_systemPuginWidget->setFixedSize(m_systemPuginWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); @@ -380,6 +395,7 @@ void DockTrayWindow::onItemAdded(PluginsItemInterface *itemInter) pluginItem->setVisible(true); m_toolLayout->addWidget(pluginItem); + updateToolWidget(); Q_EMIT requestUpdate(); } @@ -396,6 +412,7 @@ void DockTrayWindow::onItemRemove(PluginsItemInterface *itemInter) continue; m_toolLayout->removeWidget(pluginItem); + updateToolWidget(); Q_EMIT requestUpdate(); break; diff --git a/frame/window/docktraywindow.h b/frame/window/docktraywindow.h index 4f12df02b..981ea1a6c 100644 --- a/frame/window/docktraywindow.h +++ b/frame/window/docktraywindow.h @@ -68,6 +68,7 @@ private: void resizeTool() const; bool pluginExists(PluginsItemInterface *itemInter) const; void moveToolPlugin(); + void updateToolWidget(); private Q_SLOTS: void onUpdateComponentSize(); @@ -80,6 +81,7 @@ private: Dock::Position m_position; Dock::DisplayMode m_displayMode; QBoxLayout *m_mainBoxLayout; + QWidget *m_frontWidget; QWidget *m_toolWidget; QBoxLayout *m_toolLayout; QLabel *m_toolLineLabel; diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index f56395710..3918c2cac 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -371,6 +371,7 @@ void MainPanelControl::setPositonValue(Dock::Position position) m_position = position; m_tray->setPositon(position); + m_toolHelper->setPosition(position); QMetaObject::invokeMethod(this, &MainPanelControl::updateMainPanelLayout, Qt::QueuedConnection); } @@ -428,9 +429,6 @@ void MainPanelControl::removeItem(DockItem *item) case DockItem::Placeholder: m_recentHelper->removeAppItem(item); break; - case DockItem::Plugins: - m_toolHelper->removePluginItem(item); - break; case DockItem::AppMultiWindow: m_multiHelper->removeMultiWindow(static_cast(item)); break; @@ -908,7 +906,6 @@ DockItem *MainPanelControl::dropTargetItem(DockItem *sourceItem, QPoint point) return targetItem; } - void MainPanelControl::updateDisplayMode() { updateModeChange(); @@ -918,7 +915,6 @@ void MainPanelControl::updateDisplayMode() void MainPanelControl::updateModeChange() { m_toolAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion); - m_toolSonAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion); onRecentVisibleChanged(m_recentHelper->recentIsVisible()); onDockAppVisibleChanged(m_recentHelper->dockAppIsVisible()); onToolVisibleChanged(m_toolHelper->toolIsVisible()); diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 8facb65f0..3440f8ae2 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -177,14 +177,22 @@ QSize TrayManagerWindow::suitableSize(const Dock::Position &position) const { QMargins m = m_mainLayout->contentsMargins(); if (position == Dock::Position::Top || position == Dock::Position::Bottom) { - return QSize(appDatetimeSize(position) + - m_systemPluginWidget->suitableSize(position).width() + m_mainLayout->spacing() + - m.left() + m.right(), QWIDGETSIZE_MAX); + int width = appDatetimeSize(position); + int systemWidgetWidth = m_systemPluginWidget->suitableSize(position).width(); + if (systemWidgetWidth > 0) { + width += systemWidgetWidth + m_mainLayout->spacing(); + } + width += m.left() + m.right(); + return QSize(width, QWIDGETSIZE_MAX); } - return QSize(QWIDGETSIZE_MAX, appDatetimeSize(position) + - m_systemPluginWidget->suitableSize(position).height() + m_mainLayout->spacing() + - m.top() + m.bottom()); + int height = appDatetimeSize(position); + int systemWidgetHeight = m_systemPluginWidget->suitableSize(position).height(); + if (systemWidgetHeight > 0) { + height += systemWidgetHeight + m_mainLayout->spacing(); + } + height += m.top() + m.bottom(); + return QSize(QWIDGETSIZE_MAX, height); } // 用于返回需要绘制的圆形区域 From 7a254eb8eaff92fa085ec655d96a5cf07ca0d623 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 30 Nov 2022 13:40:40 +0800 Subject: [PATCH 177/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E4=B8=8B=E6=99=BA=E8=83=BD=E9=9A=90=E8=97=8F=E5=81=B6=E5=B0=94?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在改变隐藏模式的时候,无需检测鼠标位置即可 Log: Influence: 进入wayland,任务栏设置为智能隐藏,从任务栏打开一个窗口,观察智能隐藏是否有效果 Bug: https://pms.uniontech.com/bug-view-154513.html Change-Id: I959ba137ae383cd81fb4c5b6df0750a814372581 --- frame/util/multiscreenworker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index b42a6f6ff..314e63aa1 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -302,7 +302,7 @@ void MultiScreenWorker::onHideStateChanged(int state) Q_EMIT requestPlayAnimation(currentScreen, m_position, Dock::AniAction::Show); } else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) { // 最后一个参数,当任务栏的隐藏状态发生变化的时候(从一直显示变成一直隐藏或者智能隐藏),需要考虑鼠标是否在任务栏上,如果在任务栏上,此时无需执行隐藏动画 - Q_EMIT requestPlayAnimation(currentScreen, m_position, Dock::AniAction::Hide, true); + Q_EMIT requestPlayAnimation(currentScreen, m_position, Dock::AniAction::Hide); } } From bd9beca6effcc0ac22e1ba249b305ea9b2bb1772 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 30 Nov 2022 16:25:50 +0800 Subject: [PATCH 178/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland?= =?UTF-8?q?=E4=B8=8B=E9=AB=98=E6=95=88=E6=A8=A1=E5=BC=8F=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8Fstruct=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在wayland环境下,如果任务栏状态为智能隐藏或者一直隐藏,那么在高效模式下,任务栏距离边缘的距离如果为0,会导致在WindowManager类中设置窗管_d_dwayland_dockstrut属性失效,因此,此处将动画位置距离边缘设置为1,此时就不会出现_d_dwayland_dockstrut属性失效的情况 Log: 修复wayland下高效模式任务栏执行动画过程中窗体大小变化的问题 Influence: 进入wayland-任务栏设置为一直隐藏或智能隐藏,窗体最大化,让任务栏显示隐藏,观察任务栏窗体是否发生变化 Bug: https://pms.uniontech.com/bug-view-150637.html Change-Id: I4cb554f9ba0a1a4b8b481cdfa9fc6d4d1ccfbd75 --- frame/window/mainwindowbase.cpp | 41 +++++++++++++++++++++++++++++++-- frame/window/mainwindowbase.h | 1 + 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index d6e170bce..a6f361e19 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -173,6 +173,43 @@ int MainWindowBase::getBorderRadius() const return qMin(MAX_MIN_RADIUS_DIFFVALUE, qMax(size - MIN_RADIUS_WINDOWSIZE, 0)) + MIN_RADIUS; } +QRect MainWindowBase::getAnimationRect(const QRect &sourceRect, const Dock::Position &pos) const +{ + if (!Utils::IS_WAYLAND_DISPLAY + || m_multiScreenWorker->hideMode() == HideMode::KeepShowing + || m_multiScreenWorker->displayMode() == Dock::DisplayMode::Fashion) + return sourceRect; + + // 在wayland环境下,如果任务栏状态为智能隐藏或者一直隐藏,那么在高效模式下,任务栏距离边缘的距离如果为0 + // 会导致在WindowManager类中设置窗管的_d_dwayland_dockstrut属性失效,因此,此处将动画位置距离边缘设置为1 + // 此时就不会出现_d_dwayland_dockstrut属性失效的情况(1个像素并不影响动画效果) + // 在时尚模式下无需做这个设置,因为时尚模式下距离边缘的距离为10 + QRect animationRect = sourceRect; + switch (pos) { + case Dock::Position::Bottom: { + animationRect.setTop(animationRect.top() - 1); + animationRect.setHeight(sourceRect.height()); + break; + } + case Dock::Position::Left: { + animationRect.setLeft(1); + animationRect.setWidth(sourceRect.width()); + break; + } + case Dock::Position::Top: { + animationRect.setTop(1); + animationRect.setHeight(sourceRect.height()); + break; + } + case Dock::Position::Right: { + animationRect.setLeft(animationRect.left() - 1); + animationRect.setWidth(sourceRect.width()); + break; + } + } + return animationRect; +} + /** * @brief MainWindow::onMainWindowSizeChanged 任务栏拖拽过程中会不停调用此方法更新自身大小 * @param offset 拖拽时的坐标偏移量 @@ -462,8 +499,8 @@ QVariantAnimation *MainWindowBase::createAnimation(QScreen *screen, const Dock:: * 正常屏幕情况下是没有这个问题的 */ QRect mainwindowRect = geometry(); - const QRect dockShowRect = getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Show); - const QRect &dockHideRect = getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Hide); + const QRect dockShowRect = getAnimationRect(getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Show), pos); + const QRect &dockHideRect = getAnimationRect(getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Hide), pos); if (act == Dock::AniAction::Show) { if (pos == Position::Top || pos == Position::Bottom) { if (qAbs(dockShowRect.height() - mainwindowRect.height()) <= 1 diff --git a/frame/window/mainwindowbase.h b/frame/window/mainwindowbase.h index ff528f49d..b12ef219f 100644 --- a/frame/window/mainwindowbase.h +++ b/frame/window/mainwindowbase.h @@ -92,6 +92,7 @@ private: void updateDragGeometry(); int getBorderRadius() const; + QRect getAnimationRect(const QRect &sourceRect, const Dock::Position &pos) const; private Q_SLOTS: void onMainWindowSizeChanged(QPoint offset); From d4522035cf0a6064cc613fee34030abf2cb4a6b7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 2 Dec 2022 13:51:33 +0800 Subject: [PATCH 179/257] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=BC=80=E5=8F=91=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文档的最新接口的说明以及示例代码 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-221667.html Change-Id: Ief0a7122727bfa3171a0b60ff86dc027013d9b4a --- .../home_monitor/homemonitorplugin.cpp | 35 +++-- .../home_monitor/homemonitorplugin.h | 6 +- .../plugin-guide/plugins-developer-guide.md | 145 +++++++++++++++--- 3 files changed, 153 insertions(+), 33 deletions(-) diff --git a/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp b/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp index 0400a7ce3..586429222 100644 --- a/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp +++ b/plugins/plugin-guide/home_monitor/homemonitorplugin.cpp @@ -151,16 +151,9 @@ QIcon HomeMonitorPlugin::icon(const DockPart &) return pixMapIcon; } -PluginsItemInterface::PluginStatus HomeMonitorPlugin::status() const +PluginsItemInterface::PluginMode HomeMonitorPlugin::status() const { - return PluginStatus::Active; -} - -bool HomeMonitorPlugin::isPrimary() const -{ - // 如果当前插件是在快捷设置区域最上方显示的大图标且可以展开查看详情的,则返回true - // 否则,返回false - return false; + return PluginMode::Active; } QString HomeMonitorPlugin::description() const @@ -168,8 +161,30 @@ QString HomeMonitorPlugin::description() const // 当isPrimary()返回值为true的时候,这个值用于返回在大图标下面的状态信息, // 例如,如果当前图标是网络图标,下面则显示连接的网络信息,或者如果是其他的图标,下面显示连接的 // 状态等(开启或者关闭) - if (status() == PluginStatus::Active) + if (status() == PluginMode::Active) return tr("Enabled"); return tr("Disabled"); } + +QIcon HomeMonitorPlugin::icon(const DockPart &dockPart, int themeType) +{ + if (dockPart == DockPart::QuickShow) { + QIcon icon; + return icon; + } + + return QIcon(); +} + +PluginFlags HomeMonitorPlugin::flags() const +{ + // 返回的插件为Type_Common-快捷区域插件, Quick_Multi快捷插件显示两列的那种,例如网络和蓝牙 + // Attribute_CanDrag该插件在任务栏上支持拖动,Attribute_CanInsert该插件支持在其前面插入其他的图标 + // Attribute_CanSetting该插件支持在控制中心设置显示或隐藏 + return PluginFlags::Type_Common + | PluginFlags::Quick_Multi + | PluginFlags::Attribute_CanDrag + | PluginFlags::Attribute_CanInsert + | PluginFlags::Attribute_CanSetting; +} diff --git a/plugins/plugin-guide/home_monitor/homemonitorplugin.h b/plugins/plugin-guide/home_monitor/homemonitorplugin.h index 1fab8bcd5..d2b322a64 100644 --- a/plugins/plugin-guide/home_monitor/homemonitorplugin.h +++ b/plugins/plugin-guide/home_monitor/homemonitorplugin.h @@ -32,10 +32,12 @@ public: void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; QIcon icon(const DockPart &) override; - PluginStatus status() const override; - bool isPrimary() const override; + PluginMode status() const override; QString description() const override; + QIcon icon(const DockPart &dockPart, int themeType) override; + PluginFlags flags() const override; + private: InformationWidget *m_pluginWidget; QLabel *m_tipsWidget; diff --git a/plugins/plugin-guide/plugins-developer-guide.md b/plugins/plugin-guide/plugins-developer-guide.md index 80c841828..a54ce3c78 100644 --- a/plugins/plugin-guide/plugins-developer-guide.md +++ b/plugins/plugin-guide/plugins-developer-guide.md @@ -53,10 +53,10 @@ PluginsItemInterface 中定义的接口除了displayMode 和 position(历史 |refreshIcon | 当插件控件的图标需要更新时此接口被调用| |displayMode | 用于插件主动获取 dde-dock 当前的显示模式| |position | 用于插件主动获取 dde-dock 当前的位置| -|icon | 用于返回当前插件在快捷设置面板、快捷设置图标区域,系统插件显示区域等的图标,正常状态下显示的图标即可 | +|icon | 用于返回当前插件在快捷设置面板、快捷设置图标区域,系统插件显示区域等和不同的系统主题(主题黑色,主题白色)的图标,正常状态下显示的图标即可 | |status | 用于返回当前快捷设置插件的状态,激活状态还是禁用状态 | -|isPrimary | 用于标记当前快捷设置的插件是否为主插件(图标占两个图标位置) | |description | 用于返回插件的描述(快捷设置面板中isPrimary为true的时候有用) | +|flags | 用于返回插件的属性,例如插件显示的位置,插件占几列,插件是否支持拖动等 | ### PluginProxyInterface @@ -226,7 +226,7 @@ install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) ``` json { - "api": "1.2" + "api": "2.0.0" } ``` @@ -234,11 +234,23 @@ install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) ``` json { - "api": "1.2", + "api": "2.0.0", "depends-daemon-dbus-service": "com.deepin.daemon.Network" } ``` +当插件在快捷面板中展示的时候,不同的插件之间支持按照一定的顺序进行排序,dock在加载该插件的时候会检查该插件的元数据文件中是否存在order字段,如果存在该字段,就会按照该字段指定的顺序进行排序,如果不存在该字段,那么该插件就会插入到已经指定该字段的插件的后面,同时按照加载的先后顺序进行排序 + +```json +{ + "api": "2.0.0", + "order": 1, + "depends-daemon-dbus-service": "org.deepin.daemon.Audio1" +} +``` + + + ### 插件核心类 `homemonitorplugin.h` 声明了类 `HomeMonitorPlugin`,它继承(实现)了前面提到的 `PluginItemInterface`,这代表了它是一个实现了 dde-dock 接口的插件。 @@ -272,6 +284,11 @@ public: // 返回插件的 widget QWidget *itemWidget(const QString &itemKey) override; + PluginMode status() const override; + QString description() const override; + + QIcon icon(const DockPart &dockPart, int themeType) override; + PluginFlags flags() const override; }; #endif // HOMEMONITORPLUGIN_H @@ -306,6 +323,29 @@ QWidget *HomeMonitorPlugin::itemWidget(const QString &itemKey) // 但是不会有任何东西被添加到 dde-dock 上 return nullptr; } + + +QIcon HomeMonitorPlugin::icon(const DockPart &dockPart, int themeType) +{ + if (dockPart == DockPart::QuickShow) { + QIcon icon; + return icon; + } + + return QIcon(); +} + +PluginFlags HomeMonitorPlugin::flags() const +{ + // 返回的插件为Type_Common-快捷区域插件, Quick_Multi快捷插件显示两列的那种,例如网络和蓝牙 + // Attribute_CanDrag该插件在任务栏上支持拖动,Attribute_CanInsert该插件支持在其前面插入其他的图标 + // Attribute_CanSetting该插件支持在控制中心设置显示或隐藏 + return PluginFlags::Type_Common + | PluginFlags::Quick_Multi + | PluginFlags::Attribute_CanDrag + | PluginFlags::Attribute_CanInsert + | PluginFlags::Attribute_CanSetting; +} ``` ## 测试插件加载 @@ -506,20 +546,55 @@ void HomeMonitorPlugin::init(PluginProxyInterface *proxyInter) } ``` -在调用 `itemAdded` 之后,dde-dock 会在合适的时机调用插件的`itemWidget`接口以获取需要显示的控件。如果插件提供了多个主控件到 dde-dock 上,那么插件核心类应该在 itemWidget 接口中分析参数 itemKey,并返回与之对应的控件对象,当插件只有一个可显示项目时,itemKey 可以忽略 (但不建议忽略)。 +在调用 `itemAdded` 之后,dde-dock 会将该控件在任务栏插件区域显示出来,在展开快捷面板的时候,会将该插件的大图标显示在快捷面板上,快捷面板上显示的内容可以通过如下两种方式来显示 + +1、调用插件类的icon方法、status方法、description方法来获取插件的显示的图标、文本描述和状态等 + +```c++ +QIcon icon(const DockPart &dockPart, int themeType); +// 其中,判断dockPart==DockPart::QuickPanel,此时显示在快捷面板上面的图标,themeType表示主题类型,对应于dtk中的DGuiApplicationHelper::ColorType类型的枚举值,分别表示黑色或白色的主题,根据不同的主题返回不同的图标 +PluginMode status() const; +// 插件当前的状态,返回值为激活、禁用和没有激活状态,任务栏会根据这个值将图标自动变成不同的颜色 +QString description() const; +// 插件的描述,这个一般是在插件区域显示的文本,例如网络插件,这个返回当前连接的网络的名称等 + +// 在点击快捷面板的这个插件的图标的时候,会自动执行插件返回的命令字符串,见以下函数 +const QString itemCommand(const QString &itemKey); + +// 在插件需要改变图标或文字的时候,请调用PluginProxyInterface类的updateDockInfo方法,第一个参数传入this即可,如下 +void updateDockInfo(PluginsItemInterface *const, const DockPart &); +// updateDockInfo为代理类PluginProxyInterface的方法DockPart为需要刷新的位置 +``` + +2、第一个方法的灵活性不是太好,因此建议使用第二种方法 ``` c++ QWidget *HomeMonitorPlugin::itemWidget(const QString &itemKey) { - Q_UNUSED(itemKey); - - return m_pluginWidget; + if (itemKey == QUICK_ITEM_KEY) + return m_pluginWidget; + + return nullptr; } +判断itemKey == QUICK_ITEM_KEY(QUICK_ITEM_KEY为插件基类中定义的一个宏),返回在快捷面板区域的展示。一般在该插件需要在快捷面板区域响应复杂的操作,例如蓝牙插件或网络插件需要通过该面板进行开关等操作,此时建议用这种方法 ``` -现在再根据“测试插件加载”一节中的步骤,编译、安装、重启 dde-dock,就可以看到主控件在 dde-dock 面板上出现了,如下图所示: +任务栏使用哪种显示方式的逻辑是,先通过第一种方法中的获取图标的接口,判断是否存在图标,如果存在图标,就用第一种方法来显示,如果不存在,就用第二种方法来显示 -![central-widget](images/central-widget.png) +任务栏插件 图标的显示 + +在任务栏上不同的插件都会有自己的图标,在不同的主题下显示的图标也不相同,不同的位置显示的图标也会有所区别,因此我们需要实现如下的接口 + +```c++ +QIcon icon(const DockPart &dockPart, int themeType); +其中dockPart表示该插件图标所在的位置,有如下取值 +enum class DockPart { + QuickShow = 0, // 快捷插件显示区域 + QuickPanel, // 快捷面板的图标 + SystemPanel, // 系统插件显示区域(例如电源插件) + DCCSetting // 显示在控制中心个性化设置的图标 +}; +``` ## 支持禁用插件 @@ -585,12 +660,6 @@ void HomeMonitorPlugin::init(PluginProxyInterface *proxyInter) } ``` -重新编译、安装、重启 dde-dock,然后 dde-dock 面板上点击鼠标右键查看“插件”子菜单就会看到空白项,点击它将禁用插件,再次点击则启用插件。 - -不过为什么是空白项呢?是因为有一个接口还没有实现:pluginDisplayName - -在相应文件中分别添加如下内容,来修复这个问题: - ``` c++ // homemonitorplugin.h @@ -668,8 +737,6 @@ QWidget *HomeMonitorPlugin::itemTipsWidget(const QString &itemKey) dde-dock 在发现鼠标悬停在插件的控件上时就会调用这个接口拿到相应的控件并显示出来。 -![tips-widget](images/tips-widget.png) - ## 支持 applet 上面的 tips 显示的控件在鼠标移开之后就会消失,如果插件需要长时间显示一个窗体及时鼠标离开也会保持显示状态来做一些提示或功能的话那就需要使用 applet,applet 控件在左键点击后显示,点击控件以外的其他地方后消失。 @@ -706,6 +773,13 @@ void HomeMonitorPlugin::init(PluginProxyInterface *proxyInter) } ``` +如果需要点击快捷面板中的图标弹出applet,需要调用一下接口 + +```c++ +void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible); +// 其中,itemInter传入this, itemKey在此处传入一个制定的字符串,那么在下方的itemPopupApplet接口的方法中就需要根据这个指定的itemKey返回对应的QWidget来显示,visible传true +``` + 接着实现 applet 相关的接口 itemPopupApplet: ``` c++ @@ -734,9 +808,7 @@ QWidget *HomeMonitorPlugin::itemPopupApplet(const QString &itemKey) } ``` -编译,安装,重启 dde-dock 之后点击主控件即可看到弹出的 applet 控件。 -![applet-widget](images/applet-widget.png) ## 支持右键菜单 @@ -797,6 +869,37 @@ void HomeMonitorPlugin::invokedMenuItem(const QString &itemKey, const QString &m 编译,安装,重启 dde-dock 之后右键点击主控件即可看到弹出右键菜单。 -![context-menu](images/context-menu.png) +## 插件类型和属性 + +在flag接口中返回当前插件的位置和属性的信息,实现如下接口 + +```c++ +PluginFlags HomeMonitorPlugin::flags() const; +{ + return PluginFlag::Type_Common + | Quick_Multi + | Attribute_CanDrag + | Attribute_CanInsert + | Attribute_CanSetting; +} +// 返回值有如下 +enum PluginFlag { + Type_NoneFlag = 0x1, // 插件类型-没有任何的属性,不在任何地方显示 + Type_Common = 0x2, // 插件类型-快捷插件区 + Type_Tool = 0x4, // 插件类型-工具插件,例如回收站 + Type_System = 0x8, // 插件类型-系统插件,例如关机插件 + Type_Tray = 0x10, // 插件类型-托盘区,例如U盘插件 + Type_Fixed = 0x20, // 插件类型-固定区域,例如多任务视图和显示桌面 + Quick_Single = 0x40, // 当插件类型为Common时,快捷插件区域只有一列的那种插件 + Quick_Multi = 0x80, // 当插件类型为Common时,快捷插件区占两列的那种插件 + Quick_Full = 0x100, // 当插件类型为Common时,快捷插件区占用4列的那种插件,例如声音、亮度设置和音乐等 + Attribute_CanDrag = 0x200, // 插件属性-是否支持拖动 + Attribute_CanInsert = 0x400, // 插件属性-是否支持在其前面插入其他的插件,普通的快捷插件是支持的 + Attribute_CanSetting = 0x800, // 插件属性-是否可以在控制中心设置显示或隐藏 + + FlagMask = 0xffffffff // 掩码 +}; +// 在此根据自己插件的类型返回相应的属性,这里可以是组合,但是插件类型的组合只能是其中的一种,快捷插件区域的显示列也只能是其中一种,插件的属性可以混合显示 +``` 至此,一个包含基本功能的插件就完成了。 From 40d13df340af15ed70f3e9ebbddec2e75677d1d1 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 1 Dec 2022 10:17:37 +0800 Subject: [PATCH 180/257] =?UTF-8?q?feat:=20=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E9=80=82=E9=85=8D=E4=B8=8D=E5=90=8C=E4=B8=BB=E9=A2=98=E7=9A=84?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根据当前主题获取不同颜色的图标 Log: Influence: 切换不同的主题,观察图标是否发生变化 Task: https://pms.uniontech.com/task-view-222025.html Change-Id: I751218f21bda4052d0bc60a46895660a4f7aad8b --- frame/item/components/multiquickitem.cpp | 4 ++-- frame/item/components/singlequickitem.cpp | 5 +++-- frame/item/quicksettingitem.cpp | 2 +- frame/window/quickpluginwindow.cpp | 2 +- frame/window/systempluginwindow.cpp | 4 +++- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/frame/item/components/multiquickitem.cpp b/frame/item/components/multiquickitem.cpp index 9e8d1a4fa..b5aea75b3 100644 --- a/frame/item/components/multiquickitem.cpp +++ b/frame/item/components/multiquickitem.cpp @@ -114,7 +114,7 @@ bool MultiQuickItem::eventFilter(QObject *obj, QEvent *event) void MultiQuickItem::initUi() { QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (pluginItem()->icon(DockPart::QuickPanel).isNull() && itemWidget) { + if (pluginItem()->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()).isNull() && itemWidget) { m_itemWidgetParent = itemWidget->parentWidget(); // 如果插件没有返回图标的显示,则获取插件的itemWidget QHBoxLayout *mainLayout = new QHBoxLayout(this); @@ -251,7 +251,7 @@ QColor QuickIconWidget::foregroundColor() const QPixmap QuickIconWidget::pluginIcon(bool contailGrab) const { - QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); + QIcon icon = m_pluginInter->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()); if (icon.isNull() && contailGrab) { // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp index 02c0fd475..d88f903d4 100644 --- a/frame/item/components/singlequickitem.cpp +++ b/frame/item/components/singlequickitem.cpp @@ -22,6 +22,7 @@ #include "pluginsiteminterface.h" #include +#include #define ICONHEIGHT 24 #define ICONWIDTH 24 @@ -73,7 +74,7 @@ QWidget *SingleQuickItem::iconWidget(QWidget *parent) // 显示图标的窗体 QWidget *widget = new QWidget(parent); bool childIsEmpty = true; - QIcon icon = pluginItem()->icon(DockPart::QuickPanel); + QIcon icon = pluginItem()->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()); if (icon.isNull()) { // 如果图标为空,则将获取itemWidget作为它的显示 QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); @@ -118,7 +119,7 @@ QWidget *SingleQuickItem::iconWidget(QWidget *parent) QPixmap SingleQuickItem::pixmap() const { // 如果快捷面板区域的图标为空,那么就获取itemWidget的截图 - QIcon icon = pluginItem()->icon(DockPart::QuickPanel); + QIcon icon = pluginItem()->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()); if (icon.isNull()) { QWidget *itemWidget = pluginItem()->itemWidget(itemKey()); if (itemWidget) { diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 36b960e20..07b930e77 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -72,7 +72,7 @@ DockItem::ItemType QuickSettingItem::itemType() const const QPixmap QuickSettingItem::dragPixmap() { - QPixmap pm = m_pluginInter->icon(DockPart::QuickPanel).pixmap(ICONWIDTH, ICONHEIGHT); + QPixmap pm = m_pluginInter->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()).pixmap(ICONWIDTH, ICONHEIGHT); QPainter pa(&pm); pa.setPen(foregroundColor()); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index e3416949a..54c52290a 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -74,7 +74,7 @@ typedef struct DragInfo{ if (!dockItem) return QPixmap(); - QPixmap pixmap = dockItem->pluginItem()->icon(DockPart::QuickShow).pixmap(QSize(ITEMSIZE, ITEMSIZE)); + QPixmap pixmap = dockItem->pluginItem()->icon(DockPart::QuickShow, DGuiApplicationHelper::instance()->themeType()).pixmap(QSize(ITEMSIZE, ITEMSIZE)); if (!pixmap.isNull()) return pixmap; diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index e01164ae2..91c92b3e6 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -24,6 +24,8 @@ #include "quicksettingcontroller.h" #include +#include + #include #include #include @@ -243,7 +245,7 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); - QIcon icon = m_pluginInter->icon(DockPart::SystemPanel); + QIcon icon = m_pluginInter->icon(DockPart::SystemPanel, DGuiApplicationHelper::instance()->themeType()); QRect rctPixmap(rect()); if (needShowText()) { From 7b11668d0468360b0258e56da7861a047d23c11f Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 1 Dec 2022 12:38:38 +0800 Subject: [PATCH 181/257] =?UTF-8?q?fix:=20=E6=8F=92=E4=BB=B6=E9=80=82?= =?UTF-8?q?=E9=85=8D=E4=B8=8D=E5=90=8C=E4=B8=BB=E9=A2=98=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现根据主题返回不同图标的接口 Log: Influence: 切换主题,观察任务栏的图标和控制中心个性化中的图标是否发生了变化 Task: https://pms.uniontech.com/task-view-222025.html Change-Id: Ib5420a963da4d5f6b4ed7c3e4927890bd80118e4 --- plugins/onboard/onboardplugin.cpp | 19 ++++++++++++++++--- plugins/onboard/onboardplugin.h | 2 +- plugins/power/powerplugin.cpp | 7 ++----- plugins/power/powerplugin.h | 2 +- plugins/power/powerstatuswidget.cpp | 9 ++++++--- plugins/power/powerstatuswidget.h | 6 +++++- plugins/shutdown/shutdownplugin.cpp | 29 +++++++++++++++++++++++++++++ plugins/shutdown/shutdownplugin.h | 1 + plugins/trash/trashplugin.cpp | 16 ++++++++++++++-- 9 files changed, 75 insertions(+), 16 deletions(-) diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index f0cbb04c3..8a9204d02 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -25,11 +25,16 @@ #include "org_deepin_dde_daemon_dock.h" #include "org_deepin_dde_daemon_dock_entry.h" +#include + #include #include +#include #define PLUGIN_STATE_KEY "enable" +DGUI_USE_NAMESPACE + using DBusDock = org::deepin::dde::daemon::Dock1; using DockEntryInter = org::deepin::dde::daemon::dock1::Entry; @@ -165,10 +170,18 @@ void OnboardPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -QIcon OnboardPlugin::icon(const DockPart &dockPart) +QIcon OnboardPlugin::icon(const DockPart &dockPart, int themeType) { - if (dockPart == DockPart::DCCSetting) - return QIcon(":/icons/icon/dcc_keyboard.svg"); + if (dockPart == DockPart::DCCSetting) { + if (themeType == DGuiApplicationHelper::ColorType::LightType) + return QIcon(":/icons/icon/dcc_keyboard.svg"); + + QPixmap pixmap(":/icons/icon/dcc_keyboard.svg"); + QPainter pa(&pixmap); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pixmap.rect(), Qt::white); + return pixmap; + } if (dockPart == DockPart::QuickPanel) return m_onboardItem->iconPixmap(24); diff --git a/plugins/onboard/onboardplugin.h b/plugins/onboard/onboardplugin.h index ca79e2463..a8d17de36 100644 --- a/plugins/onboard/onboardplugin.h +++ b/plugins/onboard/onboardplugin.h @@ -58,7 +58,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; - QIcon icon(const DockPart &dockPart) override; + QIcon icon(const DockPart &dockPart, int themeType) override; PluginStatus status() const override; QString description() const override; diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index b4f7faf9a..56f123b1d 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -174,14 +174,11 @@ void PowerPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -QIcon PowerPlugin::icon(const DockPart &dockPart) +QIcon PowerPlugin::icon(const DockPart &dockPart, int themeType) { // 电池插件不显示在快捷面板上,因此此处返回空图标 - if (dockPart == DockPart::QuickPanel) - return QIcon(); - static QIcon batteryIcon; - const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(); + const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(themeType); batteryIcon.detach(); batteryIcon.addPixmap(pixmap); return batteryIcon; diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index 17979b7a0..b1d1f594c 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -57,7 +57,7 @@ public: int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; - QIcon icon(const DockPart &dockPart) override; + QIcon icon(const DockPart &dockPart, int themeType) override; PluginFlags flags() const override; private: diff --git a/plugins/power/powerstatuswidget.cpp b/plugins/power/powerstatuswidget.cpp index 98927316f..3943489d5 100644 --- a/plugins/power/powerstatuswidget.cpp +++ b/plugins/power/powerstatuswidget.cpp @@ -54,7 +54,10 @@ void PowerStatusWidget::paintEvent(QPaintEvent *e) { Q_UNUSED(e); - const QPixmap icon = getBatteryIcon(); + int themeType = DGuiApplicationHelper::instance()->themeType(); + if (height() <= PLUGIN_BACKGROUND_MIN_SIZE && themeType == DGuiApplicationHelper::LightType) + themeType = DGuiApplicationHelper::DarkType; + const QPixmap icon = getBatteryIcon(themeType); const auto ratio = devicePixelRatioF(); QPainter painter(this); @@ -63,7 +66,7 @@ void PowerStatusWidget::paintEvent(QPaintEvent *e) painter.drawPixmap(rf.center() - rfp.center() / ratio, icon); } -QPixmap PowerStatusWidget::getBatteryIcon() +QPixmap PowerStatusWidget::getBatteryIcon(int themeType) { const BatteryPercentageMap data = m_powerInter->batteryPercentage(); const uint value = uint(qMin(100.0, qMax(0.0, data.value("Display")))); @@ -108,7 +111,7 @@ QPixmap PowerStatusWidget::getBatteryIcon() .arg(plugged ? "plugged-symbolic" : "symbolic"); } - if (height() <= PLUGIN_BACKGROUND_MIN_SIZE && DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + if (themeType == DGuiApplicationHelper::ColorType::LightType) iconStr.append(PLUGIN_MIN_ICON_NAME); const auto ratio = devicePixelRatioF(); diff --git a/plugins/power/powerstatuswidget.h b/plugins/power/powerstatuswidget.h index 370e02a23..986d17371 100644 --- a/plugins/power/powerstatuswidget.h +++ b/plugins/power/powerstatuswidget.h @@ -24,8 +24,12 @@ #include +#include + #define POWER_KEY "power" +DGUI_USE_NAMESPACE + class DBusPower; // from https://upower.freedesktop.org/docs/Device.html#Device:State @@ -43,7 +47,7 @@ class PowerStatusWidget : public QWidget public: explicit PowerStatusWidget(QWidget *parent = 0); - QPixmap getBatteryIcon(); + QPixmap getBatteryIcon(int themeType); public Q_SLOTS: void refreshIcon(); diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index d1dc7cee6..8e44f91b0 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -27,9 +27,11 @@ #include #include +#include #include #include +#include #define PLUGIN_STATE_KEY "enable" #define GSETTING_SHOW_SUSPEND "showSuspend" @@ -38,6 +40,7 @@ #define GSETTING_SHOW_LOCK "showLock" DCORE_USE_NAMESPACE +DGUI_USE_NAMESPACE using namespace Dock; ShutdownPlugin::ShutdownPlugin(QObject *parent) @@ -312,6 +315,32 @@ QIcon ShutdownPlugin::icon(const DockPart &dockPart) return shutdownIcon; } +QIcon ShutdownPlugin::icon(const DockPart &dockPart, int themeType) +{ + if (dockPart == DockPart::DCCSetting) { + if (themeType == DGuiApplicationHelper::ColorType::LightType) + return QIcon(":/icons/resources/icons/dcc_shutdown.svg"); + + QPixmap pixmap(":/icons/resources/icons/dcc_shutdown.svg"); + QPainter pa(&pixmap); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pixmap.rect(), Qt::white); + + return pixmap; + } + + QString iconName = "system-shutdown"; + + if (themeType == DGuiApplicationHelper::LightType) + iconName.append(PLUGIN_MIN_ICON_NAME); + + const auto ratio = qApp->devicePixelRatio(); + QPixmap pixmap; + pixmap = QIcon::fromTheme(iconName, QIcon::fromTheme(":/icons/resources/icons/system-shutdown.svg")).pixmap(QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE) * ratio); + pixmap.setDevicePixelRatio(ratio); + return pixmap; +} + PluginFlags ShutdownPlugin::flags() const { return PluginFlag::Type_System | PluginFlag::Attribute_CanSetting; diff --git a/plugins/shutdown/shutdownplugin.h b/plugins/shutdown/shutdownplugin.h index aac7b11e5..f7415aac7 100644 --- a/plugins/shutdown/shutdownplugin.h +++ b/plugins/shutdown/shutdownplugin.h @@ -62,6 +62,7 @@ public: void pluginSettingsChanged() override; QIcon icon(const DockPart &dockPart) override; + QIcon icon(const DockPart &dockPart, int themeType) override; PluginFlags flags() const override; // 休眠待机配置,保持和sessionshell一致 diff --git a/plugins/trash/trashplugin.cpp b/plugins/trash/trashplugin.cpp index 0add94fc3..2e6e5d05c 100644 --- a/plugins/trash/trashplugin.cpp +++ b/plugins/trash/trashplugin.cpp @@ -29,10 +29,14 @@ #include #include +#include + +#include #define PLUGIN_STATE_KEY "enable" DWIDGET_USE_NAMESPACE +DGUI_USE_NAMESPACE using namespace Dock; @@ -190,8 +194,16 @@ void TrashPlugin::pluginSettingsChanged() QIcon TrashPlugin::icon(const DockPart &dockPart, int themeType) { - if (dockPart == DockPart::DCCSetting) - return QIcon(":/icons/dcc_trash.svg"); + if (dockPart == DockPart::DCCSetting) { + if (themeType == DGuiApplicationHelper::ColorType::LightType) + return QIcon(":/icons/dcc_trash.svg"); + + QPixmap pixmap(":/icons/dcc_trash.svg"); + QPainter pa(&pixmap); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pixmap.rect(), Qt::white); + return pixmap; + } return QIcon(); } From 4c4d06310ba281af58528387d939e4de958027ae Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 1 Dec 2022 19:36:53 +0800 Subject: [PATCH 182/257] =?UTF-8?q?fix:=20=E5=8E=BB=E6=8E=89=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E4=B8=AD=E8=AF=BB=E5=8F=96=E7=A6=81=E7=94=A8=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E6=8F=92=E4=BB=B6=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 需求:在新的需求中,通过从控制中心中勾选或者取消勾选插件的显示功能,不再从系统中移除插件,插件中无需通过配置的功能来决定是否加载插件,而变成在插件内部根据当前插件是否需要加载来决定是否加载,例如蓝牙,只要系统中存在蓝牙,就始终加载蓝牙插件 Log: 插件始终都要加载 Influence: 插入蓝牙观察是否有蓝牙图标 Bug: https://pms.uniontech.com/bug-view-175085.html Change-Id: I1a07ce0d6bd658a03e349e94283768082794684d --- plugins/airplane-mode/airplanemodeplugin.cpp | 13 ++-- plugins/airplane-mode/airplanemodeplugin.h | 1 - plugins/bluetooth/bluetoothplugin.cpp | 34 +--------- plugins/bluetooth/bluetoothplugin.h | 6 -- .../bluetooth/componments/bluetoothapplet.cpp | 8 ++- plugins/multitasking/multitaskingplugin.cpp | 64 ++----------------- plugins/multitasking/multitaskingplugin.h | 10 --- plugins/power/powerplugin.cpp | 40 ++---------- plugins/power/powerplugin.h | 4 -- 9 files changed, 21 insertions(+), 159 deletions(-) diff --git a/plugins/airplane-mode/airplanemodeplugin.cpp b/plugins/airplane-mode/airplanemodeplugin.cpp index 78aad6936..fd28e5990 100644 --- a/plugins/airplane-mode/airplanemodeplugin.cpp +++ b/plugins/airplane-mode/airplanemodeplugin.cpp @@ -45,26 +45,21 @@ const QString AirplaneModePlugin::pluginDisplayName() const void AirplaneModePlugin::init(PluginProxyInterface *proxyInter) { + if (m_proxyInter == proxyInter) + return; + m_proxyInter = proxyInter; - if (!pluginIsDisable()) - m_proxyInter->itemAdded(this, AIRPLANEMODE_KEY); + m_proxyInter->itemAdded(this, AIRPLANEMODE_KEY); refreshAirplaneEnableState(); } void AirplaneModePlugin::pluginStateSwitched() { - m_proxyInter->saveValue(this, STATE_KEY, pluginIsDisable()); - refreshAirplaneEnableState(); } -bool AirplaneModePlugin::pluginIsDisable() -{ - return !m_proxyInter->getValue(this, STATE_KEY, true).toBool(); -} - QWidget *AirplaneModePlugin::itemWidget(const QString &itemKey) { if (itemKey == AIRPLANEMODE_KEY) { diff --git a/plugins/airplane-mode/airplanemodeplugin.h b/plugins/airplane-mode/airplanemodeplugin.h index 4d7b95a2c..7e0662873 100644 --- a/plugins/airplane-mode/airplanemodeplugin.h +++ b/plugins/airplane-mode/airplanemodeplugin.h @@ -40,7 +40,6 @@ public: void init(PluginProxyInterface *proxyInter) Q_DECL_OVERRIDE; void pluginStateSwitched() Q_DECL_OVERRIDE; bool pluginIsAllowDisable() Q_DECL_OVERRIDE { return true; } - bool pluginIsDisable() Q_DECL_OVERRIDE; QWidget *itemWidget(const QString &itemKey) Q_DECL_OVERRIDE; QWidget *itemTipsWidget(const QString &itemKey) Q_DECL_OVERRIDE; int itemSortKey(const QString &itemKey) Q_DECL_OVERRIDE; diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index 4c1c5fe51..f1e751169 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -60,35 +60,19 @@ void BluetoothPlugin::init(PluginProxyInterface *proxyInter) m_bluetoothWidget.reset(new BluetoothMainWidget(m_adapterManager)); connect(m_bluetoothItem.data(), &BluetoothItem::justHasAdapter, [&] { - m_enableState = true; - refreshPluginItemsVisible(); + m_proxyInter->itemAdded(this, BLUETOOTH_KEY); }); connect(m_bluetoothItem.data(), &BluetoothItem::noAdapter, [&] { - m_enableState = false; - refreshPluginItemsVisible(); + m_proxyInter->itemRemoved(this, BLUETOOTH_KEY); }); connect(m_bluetoothWidget.data(), &BluetoothMainWidget::requestExpand, this, [ = ] { m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); }); - m_enableState = m_bluetoothItem->hasAdapter(); - - if (!pluginIsDisable()) + if (m_bluetoothItem->hasAdapter()) m_proxyInter->itemAdded(this, BLUETOOTH_KEY); } -void BluetoothPlugin::pluginStateSwitched() -{ - m_proxyInter->saveValue(this, STATE_KEY, pluginIsDisable()); - - refreshPluginItemsVisible(); -} - -bool BluetoothPlugin::pluginIsDisable() -{ - return !m_proxyInter->getValue(this, STATE_KEY, m_enableState).toBool(); -} - QWidget *BluetoothPlugin::itemWidget(const QString &itemKey) { if (itemKey == BLUETOOTH_KEY) { @@ -151,11 +135,6 @@ void BluetoothPlugin::refreshIcon(const QString &itemKey) } } -void BluetoothPlugin::pluginSettingsChanged() -{ - refreshPluginItemsVisible(); -} - QIcon BluetoothPlugin::icon(const DockPart &dockPart) { if (dockPart == DockPart::QuickPanel) @@ -201,10 +180,3 @@ PluginFlags BluetoothPlugin::flags() const | PluginFlag::Attribute_CanSetting; } -void BluetoothPlugin::refreshPluginItemsVisible() -{ - if (pluginIsDisable()) - m_proxyInter->itemRemoved(this, BLUETOOTH_KEY); - else - m_proxyInter->itemAdded(this, BLUETOOTH_KEY); -} diff --git a/plugins/bluetooth/bluetoothplugin.h b/plugins/bluetooth/bluetoothplugin.h index c8508acdf..77f11f20c 100644 --- a/plugins/bluetooth/bluetoothplugin.h +++ b/plugins/bluetooth/bluetoothplugin.h @@ -44,9 +44,7 @@ public: const QString pluginName() const override; const QString pluginDisplayName() const override; void init(PluginProxyInterface *proxyInter) override; - void pluginStateSwitched() override; bool pluginIsAllowDisable() override { return true; } - bool pluginIsDisable() override; QWidget *itemWidget(const QString &itemKey) override; QWidget *itemTipsWidget(const QString &itemKey) override; QWidget *itemPopupApplet(const QString &itemKey) override; @@ -54,7 +52,6 @@ public: int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; void refreshIcon(const QString &itemKey) override; - void pluginSettingsChanged() override; QIcon icon(const DockPart &) override; QIcon icon(const DockPart &dockPart, int themeType) override; @@ -62,9 +59,6 @@ public: QString description() const override; PluginFlags flags() const override; -private: - void refreshPluginItemsVisible(); - private: AdaptersManager *m_adapterManager; QScopedPointer m_bluetoothItem; diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index a4beb4667..bd5077f8f 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -186,11 +186,10 @@ AdaptersManager *BluetoothApplet::adaptersManager() void BluetoothApplet::onAdapterAdded(Adapter *adapter) { - if (!m_adapterItems.size()) { - emit justHasAdapter(); - } + bool needJustHasAdapter = (m_adapterItems.size() == 0); if (m_adapterItems.contains(adapter->id())) { onAdapterRemoved(m_adapterItems.value(adapter->id())->adapter()); + needJustHasAdapter = (m_adapterItems.size() == 0); } BluetoothAdapterItem *adapterItem = new BluetoothAdapterItem(adapter, this); @@ -207,6 +206,9 @@ void BluetoothApplet::onAdapterAdded(Adapter *adapter) m_contentLayout->insertWidget(m_contentLayout->count() - 1, adapterItem, Qt::AlignTop | Qt::AlignVCenter); updateBluetoothPowerState(); updateSize(); + + if (needJustHasAdapter) + emit justHasAdapter(); } void BluetoothApplet::onAdapterRemoved(Adapter *adapter) diff --git a/plugins/multitasking/multitaskingplugin.cpp b/plugins/multitasking/multitaskingplugin.cpp index 70d750151..a8b5c7858 100644 --- a/plugins/multitasking/multitaskingplugin.cpp +++ b/plugins/multitasking/multitaskingplugin.cpp @@ -33,7 +33,6 @@ DGUI_USE_NAMESPACE using namespace Dock; MultitaskingPlugin::MultitaskingPlugin(QObject *parent) : QObject(parent) - , m_pluginLoaded(false) , m_multitaskingWidget(nullptr) , m_tipsLabel(new TipsWidget) { @@ -41,10 +40,10 @@ MultitaskingPlugin::MultitaskingPlugin(QObject *parent) m_tipsLabel->setObjectName("multitasking"); connect(DWindowManagerHelper::instance(), &DWindowManagerHelper::hasCompositeChanged, this, [ = ] { - if (!m_proxyInter || !m_pluginLoaded) + if (!m_proxyInter) return; - if (DWindowManagerHelper::instance()->hasComposite() && !pluginIsDisable()) + if (DWindowManagerHelper::instance()->hasComposite()) m_proxyInter->itemAdded(this, PLUGIN_KEY); else m_proxyInter->itemRemoved(this, PLUGIN_KEY); @@ -80,24 +79,13 @@ QWidget *MultitaskingPlugin::itemTipsWidget(const QString &itemKey) void MultitaskingPlugin::init(PluginProxyInterface *proxyInter) { m_proxyInter = proxyInter; + m_multitaskingWidget.reset(new MultitaskingWidget); - if (!pluginIsDisable()) { - loadPlugin(); + if (DWindowManagerHelper::instance()->hasComposite()) { + m_proxyInter->itemAdded(this, pluginName()); } } -void MultitaskingPlugin::pluginStateSwitched() -{ - m_proxyInter->saveValue(this, PLUGIN_STATE_KEY, pluginIsDisable()); - - refreshPluginItemsVisible(); -} - -bool MultitaskingPlugin::pluginIsDisable() -{ - return !m_proxyInter->getValue(this, PLUGIN_STATE_KEY, true).toBool(); -} - const QString MultitaskingPlugin::itemCommand(const QString &itemKey) { if (itemKey == PLUGIN_KEY) @@ -174,11 +162,6 @@ void MultitaskingPlugin::setSortKey(const QString &itemKey, const int order) m_proxyInter->saveValue(this, key, order); } -void MultitaskingPlugin::pluginSettingsChanged() -{ - refreshPluginItemsVisible(); -} - PluginsItemInterface::PluginType MultitaskingPlugin::type() { return PluginType::Fixed; @@ -188,40 +171,3 @@ PluginFlags MultitaskingPlugin::flags() const { return PluginFlag::Type_Fixed; } - -void MultitaskingPlugin::updateVisible() -{ - if (pluginIsDisable() || !DWindowManagerHelper::instance()->hasComposite()) { - m_proxyInter->itemRemoved(this, PLUGIN_KEY); - } else { - m_proxyInter->itemAdded(this, PLUGIN_KEY); - } -} - -void MultitaskingPlugin::loadPlugin() -{ - if (m_pluginLoaded) { - return; - } - - m_pluginLoaded = true; - - m_multitaskingWidget.reset(new MultitaskingWidget); - - m_proxyInter->itemAdded(this, pluginName()); - - updateVisible(); -} - -void MultitaskingPlugin::refreshPluginItemsVisible() -{ - if (pluginIsDisable()) { - m_proxyInter->itemRemoved(this, PLUGIN_KEY); - } else { - if (!m_pluginLoaded) { - loadPlugin(); - return; - } - updateVisible(); - } -} diff --git a/plugins/multitasking/multitaskingplugin.h b/plugins/multitasking/multitaskingplugin.h index 9da4037c0..0903ac5a8 100644 --- a/plugins/multitasking/multitaskingplugin.h +++ b/plugins/multitasking/multitaskingplugin.h @@ -42,9 +42,7 @@ public: const QString pluginName() const override; const QString pluginDisplayName() const override; void init(PluginProxyInterface *proxyInter) override; - void pluginStateSwitched() override; bool pluginIsAllowDisable() override { return true; } - bool pluginIsDisable() override; QWidget *itemWidget(const QString &itemKey) override; QWidget *itemTipsWidget(const QString &itemKey) override; const QString itemCommand(const QString &itemKey) override; @@ -53,18 +51,10 @@ public: void refreshIcon(const QString &itemKey) override; int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; - void pluginSettingsChanged() override; PluginType type() override; PluginFlags flags() const override; private: - void updateVisible(); - void loadPlugin(); - void refreshPluginItemsVisible(); - -private: - bool m_pluginLoaded; - QScopedPointer m_multitaskingWidget; QScopedPointer m_tipsLabel; }; diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index 56f123b1d..fb0889536 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -93,21 +93,7 @@ void PowerPlugin::init(PluginProxyInterface *proxyInter) { m_proxyInter = proxyInter; - if (!pluginIsDisable()) { - loadPlugin(); - } -} - -void PowerPlugin::pluginStateSwitched() -{ - m_proxyInter->saveValue(this, PLUGIN_STATE_KEY, pluginIsDisable()); - - refreshPluginItemsVisible(); -} - -bool PowerPlugin::pluginIsDisable() -{ - return !m_proxyInter->getValue(this, PLUGIN_STATE_KEY, true).toBool(); + loadPlugin(); } const QString PowerPlugin::itemCommand(const QString &itemKey) @@ -169,11 +155,6 @@ void PowerPlugin::setSortKey(const QString &itemKey, const int order) m_proxyInter->saveValue(this, key, order); } -void PowerPlugin::pluginSettingsChanged() -{ - refreshPluginItemsVisible(); -} - QIcon PowerPlugin::icon(const DockPart &dockPart, int themeType) { // 电池插件不显示在快捷面板上,因此此处返回空图标 @@ -197,10 +178,10 @@ void PowerPlugin::updateBatteryVisible() { const bool exist = !m_powerInter->batteryPercentage().isEmpty(); - if (!exist) - m_proxyInter->itemRemoved(this, POWER_KEY); - else if (exist && !pluginIsDisable()) + if (exist) m_proxyInter->itemAdded(this, POWER_KEY); + else + m_proxyInter->itemRemoved(this, POWER_KEY); } void PowerPlugin::loadPlugin() @@ -239,19 +220,6 @@ void PowerPlugin::loadPlugin() onGSettingsChanged("showtimetofull"); } -void PowerPlugin::refreshPluginItemsVisible() -{ - if (pluginIsDisable()) { - m_proxyInter->itemRemoved(this, POWER_KEY); - } else { - if (!m_pluginLoaded) { - loadPlugin(); - return; - } - updateBatteryVisible(); - } -} - void PowerPlugin::onGSettingsChanged(const QString &key) { if (key != "showtimetofull") { diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index b1d1f594c..b522b93b7 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -46,9 +46,7 @@ public: const QString pluginName() const override; const QString pluginDisplayName() const override; void init(PluginProxyInterface *proxyInter) override; - void pluginStateSwitched() override; bool pluginIsAllowDisable() override { return true; } - bool pluginIsDisable() override; QWidget *itemWidget(const QString &itemKey) override; QWidget *itemTipsWidget(const QString &itemKey) override; const QString itemCommand(const QString &itemKey) override; @@ -56,14 +54,12 @@ public: void refreshIcon(const QString &itemKey) override; int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; - void pluginSettingsChanged() override; QIcon icon(const DockPart &dockPart, int themeType) override; PluginFlags flags() const override; private: void updateBatteryVisible(); void loadPlugin(); - void refreshPluginItemsVisible(); void onGSettingsChanged(const QString &key); void refreshTipsData(); From 077d6f056fe768ccf750ace3c8b97656034922cc Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 1 Dec 2022 20:49:27 +0800 Subject: [PATCH 183/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=8B=96=E5=87=BA=E6=89=98=E7=9B=98?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=90=8E=E6=89=98=E7=9B=98=E4=B8=8D=E5=BC=B9?= =?UTF-8?q?=E5=87=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.当图标只剩下一个的时候,遍历获取展开图标错误 2.在系统图标删除之前,需要将内置的插件返回的widget的parent设置为nullptr,防止在系统图标删除的时候把插件的widget给删除了 3、在拖动图标的过程中,不从原来的系统中删除原来的图标,再释放后,再将原来的图标删除 Log: Influence: 从任务栏拖动微信或企业微信,观察托盘是否弹出 Bug: https://pms.uniontech.com/bug-view-171497.html Change-Id: Iacbfe3406112e92a68d268beaaea3c1a3c3afe7c --- frame/window/docktraywindow.cpp | 2 - frame/window/tray/tray_delegate.cpp | 4 +- frame/window/tray/tray_gridview.cpp | 45 ++++++++++++++--- frame/window/tray/tray_gridview.h | 2 +- frame/window/tray/tray_model.cpp | 50 ++++++++++--------- frame/window/tray/tray_model.h | 6 +-- .../window/tray/widgets/expandiconwidget.cpp | 3 +- .../window/tray/widgets/systempluginitem.cpp | 18 +++++-- frame/window/tray/widgets/systempluginitem.h | 1 + frame/window/traymanagerwindow.cpp | 1 - 10 files changed, 86 insertions(+), 46 deletions(-) diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 32eb4a0de..b1cc9e55f 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -318,8 +318,6 @@ void DockTrayWindow::initConnection() connect(m_model, &TrayModel::rowCountChanged, this, &DockTrayWindow::onUpdateComponentSize); connect(m_model, &TrayModel::rowCountChanged, m_trayView, &TrayGridView::onUpdateEditorView); connect(m_model, &TrayModel::requestRefreshEditor, m_trayView, &TrayGridView::onUpdateEditorView); - connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); - connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onUpdateComponentSize); connect(m_trayView, &TrayGridView::dragFinished, this, [ this ] { // 如果拖拽结束,则隐藏托盘 Q_EMIT m_delegate->requestDrag(false); diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index 3945e8d57..7b0359d73 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -151,7 +151,7 @@ void TrayDelegate::setEditorData(QWidget *editor, const QModelIndex &index) cons { BaseTrayWidget *widget = static_cast(editor); if (widget) { - widget->setNeedShow(true); + widget->setNeedShow(!index.data(TrayModel::Blank).toBool()); } } @@ -222,7 +222,7 @@ ExpandIconWidget *TrayDelegate::expandWidget() if (!dataModel) return nullptr; - for (int i = 0; i < dataModel->rowCount() - 1; i++) { + for (int i = 0; i < dataModel->rowCount(); i++) { QModelIndex index = dataModel->index(i, 0); ExpandIconWidget *widget = qobject_cast(m_listView->indexWidget(index)); if (widget) diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index 35c55e82a..2df7a6f10 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -388,6 +388,26 @@ const QModelIndex TrayGridView::getIndexFromPos(QPoint currentPoint) const return QModelIndex(); } +bool TrayGridView::mouseInDock() +{ + QPoint mousePosition = QCursor::pos(); + QRect dockRect(topLevelWidget()->pos(), topLevelWidget()->size()); + switch (m_positon) { + case Dock::Position::Bottom: { + return mousePosition.y() > dockRect.top(); + } + case Dock::Position::Left: { + return mousePosition.x() < dockRect.right(); + } + case Dock::Position::Top: { + return mousePosition.y() < dockRect.bottom(); + } + case Dock::Position::Right: { + return mousePosition.x() > dockRect.left(); + } + } +} + void TrayGridView::handleDropEvent(QDropEvent *e) { setState(DListView::NoState); @@ -492,7 +512,7 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) listModel->setDragKey(modelIndex.data(TrayModel::Role::KeyRole).toString()); listModel->setDragingIndex(modelIndex); // 删除当前的图标 - WinInfo winInfo = listModel->takeIndex(modelIndex); + WinInfo winInfo = listModel->getWinInfo(modelIndex); Qt::DropAction dropAct = drag->exec(supportedActions); @@ -504,12 +524,15 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) if (listModel->isIconTray()) { // 如果当前是从托盘区域释放,按照原来的流程走 QPropertyAnimation *posAni = new QPropertyAnimation(pixLabel, "pos", pixLabel); - connect(posAni, &QPropertyAnimation::finished, [ this, listModel, pixLabel, modelIndex, winInfo ] () { + connect(posAni, &QPropertyAnimation::finished, [ this, listModel, pixLabel, winInfo ] () { pixLabel->hide(); pixLabel->deleteLater(); listModel->setDragKey(QString()); - listModel->insertRow(modelIndex.row(), winInfo); clearDragModelIndex(); + QModelIndex dropIndex = indexAt(m_dropPos); + // 拖转完成后,将拖动的图标插入到新的位置 + //listModel->moveToIndex(winInfo, dropIndex.row()); + listModel->dropSwap(dropIndex.row()); listModel->setExpandVisible(!TrayModel::getIconModel()->isEmpty()); m_dropPos = QPoint(); @@ -518,7 +541,7 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) onUpdateEditorView(); Q_EMIT dragFinished(); }); - + // 拖拽完成后,将当前拖拽的item从原来的列表中移除,后来会根据实际情况将item插入到特定的列表中 posAni->setEasingCurve(QEasingCurve::Linear); posAni->setDuration(m_aniDuringTime); posAni->setStartValue((QCursor::pos() - QPoint(0, pixLabel->height() / 2))); @@ -528,19 +551,25 @@ bool TrayGridView::beginDrag(Qt::DropActions supportedActions) Q_EMIT dragFinished(); } else { - // 如果当前是从任务栏区域释放,则将释放后的图标放到托盘 listModel->setDragKey(QString()); clearDragModelIndex(); TrayModel *trayModel = TrayModel::getIconModel(); - trayModel->addRow(winInfo); + if (!mouseInDock()) { + listModel->removeWinInfo(winInfo); + trayModel->addRow(winInfo); + trayModel->saveConfig(-1, winInfo); + } + // 如果是任务栏的的托盘区,则更新是否显示展开入口 + listModel->setExpandVisible(trayModel->rowCount() > 0, false); m_dragPos = QPoint(); m_dropPos = QPoint(); - - trayModel->saveConfig(-1, winInfo); Q_EMIT dragFinished(); } } else { + // 拖拽完成后,将当前拖拽的item从原来的列表中移除,后来会根据实际情况将item插入到特定的列表中 + listModel->removeWinInfo(winInfo); + // 这里是将图标从一个区域移动到另外一个区域 listModel->setDragKey(QString()); clearDragModelIndex(); if (listModel->isIconTray()) { diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h index 3951de3c6..60dc54762 100644 --- a/frame/window/tray/tray_gridview.h +++ b/frame/window/tray/tray_gridview.h @@ -51,7 +51,6 @@ public Q_SLOTS: void onUpdateEditorView(); Q_SIGNALS: - void requestRemove(const QString &); void dragLeaved(); void dragEntered(); void dragFinished(); @@ -76,6 +75,7 @@ private: void initUi(); void createAnimation(const int pos, const bool moveNext, const bool isLastAni); const QModelIndex getIndexFromPos(QPoint currentPoint) const; + bool mouseInDock(); private: QEasingCurve::Type m_aniCurveType; diff --git a/frame/window/tray/tray_model.cpp b/frame/window/tray/tray_model.cpp index 4ef2876b7..fccc210b3 100644 --- a/frame/window/tray/tray_model.cpp +++ b/frame/window/tray/tray_model.cpp @@ -93,19 +93,16 @@ void TrayModel::dropSwap(int newPos) if (!m_dragModelIndex.isValid()) return; - removeRows(m_dragModelIndex.row(), 1, QModelIndex()); - dropInsert(newPos); + int row = m_dragModelIndex.row(); - emit QAbstractItemModel::dataChanged(m_dragModelIndex, m_dropModelIndex); -} + if (row < m_winInfos.size()) + m_dragInfo = m_winInfos.takeAt(row); -void TrayModel::dropInsert(int newPos) -{ - beginInsertRows(QModelIndex(), newPos, newPos); WinInfo name = m_dragInfo; m_winInfos.insert(newPos, name); - // 更新输入法的位置 - endInsertRows(); + + emit QAbstractItemModel::dataChanged(m_dragModelIndex, m_dropModelIndex); + requestRefreshEditor(); } void TrayModel::clearDragDropIndex() @@ -115,7 +112,6 @@ void TrayModel::clearDragDropIndex() m_dragModelIndex = m_dropModelIndex = QModelIndex(); - Q_EMIT requestRefreshEditor(); emit QAbstractItemModel::dataChanged(startIndex, endIndex); emit QAbstractItemModel::dataChanged(endIndex, startIndex); } @@ -125,7 +121,6 @@ void TrayModel::setDragingIndex(const QModelIndex index) m_dragModelIndex = index; m_dropModelIndex = index; - Q_EMIT requestRefreshEditor(); emit QAbstractListModel::dataChanged(index, index); } @@ -278,7 +273,6 @@ QVariant TrayModel::data(const QModelIndex &index, int role) const bool TrayModel::removeRows(int row, int count, const QModelIndex &parent) { Q_UNUSED(count); - Q_UNUSED(parent); if (m_winInfos.size() - 1 < row) return false; @@ -353,20 +347,13 @@ void TrayModel::clear() Q_EMIT rowCountChanged(); } -WinInfo TrayModel::takeIndex(const QModelIndex &index) +WinInfo TrayModel::getWinInfo(const QModelIndex &index) { int row = index.row(); if (row < 0 || row >= m_winInfos.size()) return WinInfo(); - WinInfo win = m_winInfos[row]; - beginResetModel(); - m_winInfos.removeAt(row); - endResetModel(); - - Q_EMIT rowCountChanged(); - - return win; + return m_winInfos[row]; } void TrayModel::onXEmbedTrayAdded(quint32 winId) @@ -462,6 +449,21 @@ void TrayModel::saveConfig(int index, const WinInfo &winInfo) SETTINGCONFIG->setValue(DOCKQUICKTRAYNAME, m_fixedTrayNames); } +void TrayModel::removeWinInfo(WinInfo winInfo) +{ + for (const WinInfo &info : m_winInfos) { + if (winInfo == info) { + int index = m_winInfos.indexOf(info); + beginRemoveRows(QModelIndex(), index, index); + m_winInfos.removeOne(info); + endRemoveRows(); + + Q_EMIT rowCountChanged(); + break; + } + } +} + bool TrayModel::inTrayConfig(const QString itemKey) const { if (m_isTrayIcon) { @@ -640,7 +642,7 @@ void TrayModel::onIndicatorAdded(const QString &indicatorName) const QString &itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); for (const WinInfo &info : m_winInfos) { - if (info.key == itemKey) + if (info.itemKey == itemKey) return; } @@ -648,7 +650,7 @@ void TrayModel::onIndicatorAdded(const QString &indicatorName) WinInfo info; info.type = Incicator; info.key = itemKey; - info.itemKey = IndicatorTrayItem::toIndicatorKey(indicatorName); + info.itemKey = itemKey; m_winInfos.append(info); sortItems(); @@ -754,7 +756,7 @@ void TrayModel::onSettingChanged(const QString &key, const QVariant &value) void TrayModel::removeRow(const QString &itemKey) { for (const WinInfo &info : m_winInfos) { - if (info.key == itemKey) { + if (info.itemKey == itemKey) { int index = m_winInfos.indexOf(info); beginRemoveRows(QModelIndex(), index, index); m_winInfos.removeOne(info); diff --git a/frame/window/tray/tray_model.h b/frame/window/tray/tray_model.h index 7eb6e25a6..a3713a830 100644 --- a/frame/window/tray/tray_model.h +++ b/frame/window/tray/tray_model.h @@ -91,7 +91,6 @@ public: static TrayModel *getIconModel(); void dropSwap(int newPos); - void dropInsert(int newPos); void clearDragDropIndex(); void setDragingIndex(const QModelIndex index); @@ -111,8 +110,9 @@ public: bool isEmpty() const; void clear(); - WinInfo takeIndex(const QModelIndex &index); + WinInfo getWinInfo(const QModelIndex &index); void saveConfig(int index, const WinInfo &winInfo); + void removeWinInfo(WinInfo winInfo); Q_SIGNALS: void requestUpdateIcon(quint32); @@ -121,7 +121,6 @@ Q_SIGNALS: void requestRefreshEditor(); public Q_SLOTS: - void removeRow(const QString &itemKey); void addRow(WinInfo info); void insertRow(int index, WinInfo info); @@ -152,6 +151,7 @@ protected: Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; private: + void removeRow(const QString &itemKey); bool exist(const QString &itemKey); QString fileNameByServiceName(const QString &serviceName) const; bool isTypeWriting(const QString &servicePath) const; diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 4e34c59d8..77a3cbe5b 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -171,7 +171,6 @@ TrayGridWidget *ExpandIconWidget::popupTrayView() connect(trayDelegate, &TrayDelegate::removeRow, trayView, [ = ](const QModelIndex &index) { trayView->model()->removeRow(index.row(),index.parent()); }); - connect(trayView, &TrayGridView::requestRemove, trayModel, &TrayModel::removeRow); connect(trayModel, &TrayModel::requestOpenEditor, trayView, [ trayView ](const QModelIndex &index) { trayView->openPersistentEditor(index); }); @@ -335,7 +334,7 @@ ExpandIconWidget *TrayGridWidget::expandWidget() const if (!dataModel) return nullptr; - for (int i = 0; i < dataModel->rowCount() - 1; i++) { + for (int i = 0; i < dataModel->rowCount(); i++) { QModelIndex index = dataModel->index(i, 0); ExpandIconWidget *widget = qobject_cast(m_referGridView->indexWidget(index)); if (widget) diff --git a/frame/window/tray/widgets/systempluginitem.cpp b/frame/window/tray/widgets/systempluginitem.cpp index bc21dca9b..29a98b906 100644 --- a/frame/window/tray/widgets/systempluginitem.cpp +++ b/frame/window/tray/widgets/systempluginitem.cpp @@ -47,9 +47,11 @@ SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, cons { qDebug() << "load tray plugins item: " << m_pluginInter->pluginName() << itemKey << m_centralWidget; - m_centralWidget->setParent(this); - m_centralWidget->setVisible(true); - m_centralWidget->installEventFilter(this); + if (m_centralWidget) { + m_centralWidget->setParent(this); + m_centralWidget->setVisible(true); + m_centralWidget->installEventFilter(this); + } QBoxLayout *hLayout = new QHBoxLayout(this); hLayout->addWidget(m_centralWidget); @@ -89,6 +91,8 @@ SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, cons m_popupAdjustDelayTimer->setInterval(10); m_popupAdjustDelayTimer->setSingleShot(true); + installEventFilter(this); + connect(m_popupTipsDelayTimer, &QTimer::timeout, this, &SystemPluginItem::showHoverTips); connect(m_popupAdjustDelayTimer, &QTimer::timeout, this, &SystemPluginItem::updatePopupPosition, Qt::QueuedConnection); connect(m_contextMenu, &QMenu::triggered, this, &SystemPluginItem::menuActionClicked); @@ -188,6 +192,14 @@ bool SystemPluginItem::event(QEvent *event) return BaseTrayWidget::event(event); } +bool SystemPluginItem::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == this && event->type() == QEvent::DeferredDelete) + m_centralWidget->setParent(nullptr); + + return BaseTrayWidget::eventFilter(watched, event); +} + void SystemPluginItem::enterEvent(QEvent *event) { if (checkGSettingsControl()) { diff --git a/frame/window/tray/widgets/systempluginitem.h b/frame/window/tray/widgets/systempluginitem.h index 7e1fa28ec..cba056d27 100644 --- a/frame/window/tray/widgets/systempluginitem.h +++ b/frame/window/tray/widgets/systempluginitem.h @@ -67,6 +67,7 @@ signals: protected: bool event(QEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; void enterEvent(QEvent *event) override; void leaveEvent(QEvent *event) override; void mousePressEvent(QMouseEvent *event) override; diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 3440f8ae2..031fb166a 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -270,7 +270,6 @@ void TrayManagerWindow::initUi() void TrayManagerWindow::initConnection() { - connect(m_trayView, &TrayGridView::requestRemove, m_model, &TrayModel::removeRow); connect(m_model, &TrayModel::rowCountChanged, this, &TrayManagerWindow::onTrayCountChanged); connect(m_model, &TrayModel::rowCountChanged, m_trayView, &TrayGridView::onUpdateEditorView); connect(m_model, &TrayModel::requestRefreshEditor, m_trayView, &TrayGridView::onUpdateEditorView); From b698b07dde56a58d2d6ae9235a6bcf370c5e20e5 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 2 Dec 2022 15:41:34 +0800 Subject: [PATCH 184/257] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、icon接口中增加主题参数默认值 2、删除以前的不带主题的icon接口 3、PluginStatus改为PluginMode 4、插件接口类中增加eventHandler虚函数 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-222025.html Change-Id: I03c8ec09b96faf12f5ab15c8223da8dacae3e4ff --- frame/dbus/dbusdockadaptors.cpp | 2 +- frame/dbus/dbusdockadaptors.h | 2 +- frame/item/components/multiquickitem.cpp | 8 ++++---- frame/item/components/singlequickitem.cpp | 4 ++-- frame/item/quicksettingitem.cpp | 6 +++--- frame/pluginadapter/pluginadapter.cpp | 6 +++--- frame/pluginadapter/pluginadapter.h | 4 ++-- frame/window/quickpluginwindow.cpp | 4 ++-- frame/window/systempluginwindow.cpp | 2 +- interfaces/pluginsiteminterface.h | 22 +++++++++++++--------- plugins/bluetooth/bluetoothplugin.cpp | 17 ++++------------- plugins/bluetooth/bluetoothplugin.h | 5 ++--- plugins/onboard/onboardplugin.cpp | 6 +++--- plugins/onboard/onboardplugin.h | 4 ++-- plugins/power/powerplugin.cpp | 2 +- plugins/power/powerplugin.h | 2 +- plugins/shutdown/shutdownplugin.cpp | 12 +----------- plugins/shutdown/shutdownplugin.h | 3 +-- plugins/sound/sounditem.cpp | 2 +- plugins/sound/sounditem.h | 2 +- plugins/sound/soundplugin.cpp | 9 ++------- plugins/sound/soundplugin.h | 5 ++--- plugins/trash/trashplugin.cpp | 2 +- plugins/trash/trashplugin.h | 2 +- 24 files changed, 55 insertions(+), 78 deletions(-) diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index d22e17c1c..3416512cd 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -321,7 +321,7 @@ QList DBusDockAdaptors::localPlugins() const return QuickSettingController::instance()->pluginInSettings(); } -QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize, int colorType) const +QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize, DGuiApplicationHelper::ColorType colorType) const { auto iconSize = [](const QIcon &icon) { QList iconSizes = icon.availableSizes(); diff --git a/frame/dbus/dbusdockadaptors.h b/frame/dbus/dbusdockadaptors.h index 9a443a87b..57527b455 100644 --- a/frame/dbus/dbusdockadaptors.h +++ b/frame/dbus/dbusdockadaptors.h @@ -136,7 +136,7 @@ signals: private: bool isPluginValid(const QString &name); QList localPlugins() const; - QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize, int colorType) const; + QIcon getSettingIcon(PluginsItemInterface *plugin, QSize &pixmapSize, DGuiApplicationHelper::ColorType colorType) const; private: QGSettings *m_gsettings; diff --git a/frame/item/components/multiquickitem.cpp b/frame/item/components/multiquickitem.cpp index b5aea75b3..38fdf1fb4 100644 --- a/frame/item/components/multiquickitem.cpp +++ b/frame/item/components/multiquickitem.cpp @@ -114,7 +114,7 @@ bool MultiQuickItem::eventFilter(QObject *obj, QEvent *event) void MultiQuickItem::initUi() { QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (pluginItem()->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()).isNull() && itemWidget) { + if (pluginItem()->icon(DockPart::QuickPanel).isNull() && itemWidget) { m_itemWidgetParent = itemWidget->parentWidget(); // 如果插件没有返回图标的显示,则获取插件的itemWidget QHBoxLayout *mainLayout = new QHBoxLayout(this); @@ -240,10 +240,10 @@ QColor QuickIconWidget::foregroundColor() const { DPalette dpa = DPaletteHelper::instance()->palette(this); // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 - if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) + if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Active) return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); - if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Deactive) + if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Deactive) return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); @@ -251,7 +251,7 @@ QColor QuickIconWidget::foregroundColor() const QPixmap QuickIconWidget::pluginIcon(bool contailGrab) const { - QIcon icon = m_pluginInter->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()); + QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); if (icon.isNull() && contailGrab) { // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp index d88f903d4..0ec6bf72e 100644 --- a/frame/item/components/singlequickitem.cpp +++ b/frame/item/components/singlequickitem.cpp @@ -74,7 +74,7 @@ QWidget *SingleQuickItem::iconWidget(QWidget *parent) // 显示图标的窗体 QWidget *widget = new QWidget(parent); bool childIsEmpty = true; - QIcon icon = pluginItem()->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()); + QIcon icon = pluginItem()->icon(DockPart::QuickPanel); if (icon.isNull()) { // 如果图标为空,则将获取itemWidget作为它的显示 QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); @@ -119,7 +119,7 @@ QWidget *SingleQuickItem::iconWidget(QWidget *parent) QPixmap SingleQuickItem::pixmap() const { // 如果快捷面板区域的图标为空,那么就获取itemWidget的截图 - QIcon icon = pluginItem()->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()); + QIcon icon = pluginItem()->icon(DockPart::QuickPanel); if (icon.isNull()) { QWidget *itemWidget = pluginItem()->itemWidget(itemKey()); if (itemWidget) { diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 07b930e77..12b93785b 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -72,7 +72,7 @@ DockItem::ItemType QuickSettingItem::itemType() const const QPixmap QuickSettingItem::dragPixmap() { - QPixmap pm = m_pluginInter->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()).pixmap(ICONWIDTH, ICONHEIGHT); + QPixmap pm = m_pluginInter->icon(DockPart::QuickPanel).pixmap(ICONWIDTH, ICONHEIGHT); QPainter pa(&pm); pa.setPen(foregroundColor()); @@ -118,10 +118,10 @@ QColor QuickSettingItem::foregroundColor() const { DPalette dpa = DPaletteHelper::instance()->palette(this); // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 - if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active) + if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Active) return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); - if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Deactive) + if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Deactive) return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp index ed00d9a53..80c39e021 100644 --- a/frame/pluginadapter/pluginadapter.cpp +++ b/frame/pluginadapter/pluginadapter.cpp @@ -163,7 +163,7 @@ PluginsItemInterface::PluginSizePolicy PluginAdapter::pluginSizePolicy() const return PluginsItemInterface::PluginSizePolicy::Custom; } -QIcon PluginAdapter::icon(const DockPart &dockPart) +QIcon PluginAdapter::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); if (!itemWidget) @@ -185,9 +185,9 @@ QIcon PluginAdapter::icon(const DockPart &dockPart) return QIcon(); } -PluginsItemInterface::PluginStatus PluginAdapter::status() const +PluginsItemInterface::PluginMode PluginAdapter::status() const { - return PluginStatus::Active; + return PluginMode::Active; } QString PluginAdapter::description() const diff --git a/frame/pluginadapter/pluginadapter.h b/frame/pluginadapter/pluginadapter.h index c60b8eb8c..04dbb3c28 100644 --- a/frame/pluginadapter/pluginadapter.h +++ b/frame/pluginadapter/pluginadapter.h @@ -65,8 +65,8 @@ public: PluginType type() override; PluginSizePolicy pluginSizePolicy() const override; - QIcon icon(const DockPart &dockPart) override; - PluginStatus status() const override; + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; + PluginMode status() const override; QString description() const override; PluginFlags flags() const override; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 54c52290a..bf0b58212 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -74,7 +74,7 @@ typedef struct DragInfo{ if (!dockItem) return QPixmap(); - QPixmap pixmap = dockItem->pluginItem()->icon(DockPart::QuickShow, DGuiApplicationHelper::instance()->themeType()).pixmap(QSize(ITEMSIZE, ITEMSIZE)); + QPixmap pixmap = dockItem->pluginItem()->icon(DockPart::QuickShow).pixmap(QSize(ITEMSIZE, ITEMSIZE)); if (!pixmap.isNull()) return pixmap; @@ -714,7 +714,7 @@ void QuickDockItem::hideEvent(QHideEvent *event) QPixmap QuickDockItem::iconPixmap() const { int pixmapSize = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); - QIcon icon = m_pluginItem->icon(DockPart::QuickShow, DGuiApplicationHelper::instance()->themeType()); + QIcon icon = m_pluginItem->icon(DockPart::QuickShow); if (!icon.isNull()) return icon.pixmap(pixmapSize, pixmapSize); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 91c92b3e6..f8d739348 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -245,7 +245,7 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); - QIcon icon = m_pluginInter->icon(DockPart::SystemPanel, DGuiApplicationHelper::instance()->themeType()); + QIcon icon = m_pluginInter->icon(DockPart::SystemPanel); QRect rctPixmap(rect()); if (needShowText()) { diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 4957db431..a50daca7d 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -24,9 +24,13 @@ #include "pluginproxyinterface.h" +#include + #include #include +DGUI_USE_NAMESPACE + // 任务栏的部件位置 enum class DockPart { QuickShow = 0, // 快捷插件显示区域 @@ -81,7 +85,7 @@ public: Custom = 1 << 1 // The custom }; - enum PluginStatus { + enum PluginMode { Deactive = 0, Active, Disabled @@ -282,17 +286,11 @@ public: /// virtual PluginSizePolicy pluginSizePolicy() const { return System; } - /// - /// the icon display on plugin panel - /// - /// - virtual QIcon icon(const DockPart &) { return QIcon(); } - /// /// the plugin status /// /// - virtual PluginStatus status() const { return PluginStatus::Deactive; } + virtual PluginMode status() const { return PluginMode::Deactive; } /// /// return the detail value, it will display in the center @@ -304,7 +302,7 @@ public: /// the icon for the plugin /// themeType {0:UnknownType 1:LightType 2:DarkType} /// - virtual QIcon icon(const DockPart &dockPart, int themeType) { return icon(dockPart); } + virtual QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType = DGuiApplicationHelper::instance()->themeType()) { return QIcon(); } /// /// \brief m_proxyInter @@ -312,6 +310,12 @@ public: /// virtual PluginFlags flags() const { return PluginFlag::Type_Common | PluginFlag::Quick_Single | PluginFlag::Attribute_CanDrag | PluginFlag::Attribute_CanInsert | PluginFlag::Attribute_CanSetting; } + /// + /// \brief m_proxyInter + /// + /// + virtual bool eventHandler(QEvent *event) { return false; } + protected: /// /// \brief m_proxyInter diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index f1e751169..e95d9809d 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -135,16 +135,7 @@ void BluetoothPlugin::refreshIcon(const QString &itemKey) } } -QIcon BluetoothPlugin::icon(const DockPart &dockPart) -{ - if (dockPart == DockPart::QuickPanel) - return QIcon(); - - static QIcon icon(":/bluetooth-active-symbolic.svg"); - return icon; -} - -QIcon BluetoothPlugin::icon(const DockPart &dockPart, int themeType) +QIcon BluetoothPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { if (dockPart == DockPart::QuickPanel) return QIcon(); @@ -155,12 +146,12 @@ QIcon BluetoothPlugin::icon(const DockPart &dockPart, int themeType) return QIcon(":/bluetooth-active-symbolic-dark.svg"); } -PluginsItemInterface::PluginStatus BluetoothPlugin::status() const +PluginsItemInterface::PluginMode BluetoothPlugin::status() const { if (m_bluetoothItem.data()->isPowered()) - return PluginStatus::Active; + return PluginMode::Active; - return PluginStatus::Deactive; + return PluginMode::Deactive; } QString BluetoothPlugin::description() const diff --git a/plugins/bluetooth/bluetoothplugin.h b/plugins/bluetooth/bluetoothplugin.h index 77f11f20c..065b779c0 100644 --- a/plugins/bluetooth/bluetoothplugin.h +++ b/plugins/bluetooth/bluetoothplugin.h @@ -53,9 +53,8 @@ public: void setSortKey(const QString &itemKey, const int order) override; void refreshIcon(const QString &itemKey) override; - QIcon icon(const DockPart &) override; - QIcon icon(const DockPart &dockPart, int themeType) override; - PluginStatus status() const override; + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; + PluginMode status() const override; QString description() const override; PluginFlags flags() const override; diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index 8a9204d02..986108160 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -170,7 +170,7 @@ void OnboardPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -QIcon OnboardPlugin::icon(const DockPart &dockPart, int themeType) +QIcon OnboardPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { if (dockPart == DockPart::DCCSetting) { if (themeType == DGuiApplicationHelper::ColorType::LightType) @@ -189,9 +189,9 @@ QIcon OnboardPlugin::icon(const DockPart &dockPart, int themeType) return m_onboardItem->iconPixmap(20); } -PluginsItemInterface::PluginStatus OnboardPlugin::status() const +PluginsItemInterface::PluginMode OnboardPlugin::status() const { - return PluginsItemInterface::PluginStatus::Active; + return PluginsItemInterface::PluginMode::Active; } QString OnboardPlugin::description() const diff --git a/plugins/onboard/onboardplugin.h b/plugins/onboard/onboardplugin.h index a8d17de36..920a589b1 100644 --- a/plugins/onboard/onboardplugin.h +++ b/plugins/onboard/onboardplugin.h @@ -58,8 +58,8 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; - QIcon icon(const DockPart &dockPart, int themeType) override; - PluginStatus status() const override; + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; + PluginMode status() const override; QString description() const override; private: diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index fb0889536..652c03b66 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -155,7 +155,7 @@ void PowerPlugin::setSortKey(const QString &itemKey, const int order) m_proxyInter->saveValue(this, key, order); } -QIcon PowerPlugin::icon(const DockPart &dockPart, int themeType) +QIcon PowerPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { // 电池插件不显示在快捷面板上,因此此处返回空图标 static QIcon batteryIcon; diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index b522b93b7..b03a66283 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -54,7 +54,7 @@ public: void refreshIcon(const QString &itemKey) override; int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; - QIcon icon(const DockPart &dockPart, int themeType) override; + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; PluginFlags flags() const override; private: diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index 8e44f91b0..69896f9a6 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -305,17 +305,7 @@ void ShutdownPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -QIcon ShutdownPlugin::icon(const DockPart &dockPart) -{ - if (dockPart == DockPart::DCCSetting) - return QIcon(":/icons/resources/icons/dcc_shutdown.svg"); - - QIcon shutdownIcon; - shutdownIcon.addPixmap(m_shutdownWidget->loadPixmap()); - return shutdownIcon; -} - -QIcon ShutdownPlugin::icon(const DockPart &dockPart, int themeType) +QIcon ShutdownPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { if (dockPart == DockPart::DCCSetting) { if (themeType == DGuiApplicationHelper::ColorType::LightType) diff --git a/plugins/shutdown/shutdownplugin.h b/plugins/shutdown/shutdownplugin.h index f7415aac7..bbc7ecdb4 100644 --- a/plugins/shutdown/shutdownplugin.h +++ b/plugins/shutdown/shutdownplugin.h @@ -61,8 +61,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void pluginSettingsChanged() override; - QIcon icon(const DockPart &dockPart) override; - QIcon icon(const DockPart &dockPart, int themeType) override; + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; PluginFlags flags() const override; // 休眠待机配置,保持和sessionshell一致 diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 4f952d3b8..9c93c637f 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -254,7 +254,7 @@ QPixmap SoundItem::pixmap() const return m_iconPixmap; } -QPixmap SoundItem::pixmap(int colorType) const +QPixmap SoundItem::pixmap(DGuiApplicationHelper::ColorType colorType) const { const Dock::DisplayMode displayMode = Dock::DisplayMode::Efficient; diff --git a/plugins/sound/sounditem.h b/plugins/sound/sounditem.h index b1fdb79c2..31e1a2b9e 100644 --- a/plugins/sound/sounditem.h +++ b/plugins/sound/sounditem.h @@ -51,7 +51,7 @@ public: void refreshIcon(); void refreshTips(const int volume, const bool force = false); QPixmap pixmap() const; - QPixmap pixmap(int colorType) const; + QPixmap pixmap(DGuiApplicationHelper::ColorType colorType) const; signals: void requestContextMenu() const; diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 60df9c6ff..62775c9ff 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -145,17 +145,12 @@ void SoundPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -QIcon SoundPlugin::icon(const DockPart &) -{ - return m_soundItem->pixmap(); -} - -QIcon SoundPlugin::icon(const DockPart &dockPart, int themeType) +QIcon SoundPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { return m_soundItem->pixmap(themeType); } -PluginsItemInterface::PluginStatus SoundPlugin::status() const +PluginsItemInterface::PluginMode SoundPlugin::status() const { return SoundPlugin::Active; } diff --git a/plugins/sound/soundplugin.h b/plugins/sound/soundplugin.h index 566c8666a..7b9a2be42 100644 --- a/plugins/sound/soundplugin.h +++ b/plugins/sound/soundplugin.h @@ -51,9 +51,8 @@ public: void setSortKey(const QString &itemKey, const int order) override; void refreshIcon(const QString &itemKey) override; void pluginSettingsChanged() override; - QIcon icon(const DockPart &) override; - QIcon icon(const DockPart &dockPart, int themeType) override; - PluginStatus status() const override; + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; + PluginMode status() const override; PluginFlags flags() const override; private: diff --git a/plugins/trash/trashplugin.cpp b/plugins/trash/trashplugin.cpp index 2e6e5d05c..273c4bdbe 100644 --- a/plugins/trash/trashplugin.cpp +++ b/plugins/trash/trashplugin.cpp @@ -192,7 +192,7 @@ void TrashPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -QIcon TrashPlugin::icon(const DockPart &dockPart, int themeType) +QIcon TrashPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { if (dockPart == DockPart::DCCSetting) { if (themeType == DGuiApplicationHelper::ColorType::LightType) diff --git a/plugins/trash/trashplugin.h b/plugins/trash/trashplugin.h index b986f8ec7..0d76ad836 100644 --- a/plugins/trash/trashplugin.h +++ b/plugins/trash/trashplugin.h @@ -62,7 +62,7 @@ public: void setSortKey(const QString &itemKey, const int order) override; void displayModeChanged(const Dock::DisplayMode displayMode) override; void pluginSettingsChanged() override; - QIcon icon(const DockPart &dockPart, int themeType) override; + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; PluginFlags flags() const override; private: From c35bee0c65470b41f82a58b4ccecf5a8b4fa11bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Thu, 1 Dec 2022 17:12:28 +0800 Subject: [PATCH 185/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9F=B3?= =?UTF-8?q?=E9=87=8F=E8=B0=83=E8=8A=82=E6=8E=A7=E4=BB=B6=E5=B9=85=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 音量调节幅度为2%,这里的控件上次修改时漏掉了 亮度调节也有类似的问题,一并修复 Log: 修复音量调节控件幅度不正确的问题 Influence: 音量控件调节幅度 Bug: https://pms.uniontech.com/bug-view-172417.html Change-Id: I945698a16b8ad19dee8d22e71cc639ca68204946 --- plugins/display/brightnessadjwidget.cpp | 4 +++- plugins/sound/sounddeviceswidget.cpp | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/display/brightnessadjwidget.cpp b/plugins/display/brightnessadjwidget.cpp index 1b339a977..19b10e82c 100644 --- a/plugins/display/brightnessadjwidget.cpp +++ b/plugins/display/brightnessadjwidget.cpp @@ -52,7 +52,9 @@ void BrightnessAdjWidget::loadBrightnessItem() QPixmap rightPixmap = ImageUtil::loadSvg(":/icons/resources/brightnesshigh", QSize(20, 20)); sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon,leftPixmap, QSize(), 12); sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 12); - + // 需求要求调节范围是10%-100%,且调节幅度为1% + sliderContainer->setRange(10, 100); + sliderContainer->setPageStep(1); sliderContainer->setFixedWidth(310); sliderContainer->setFixedHeight(itemHeight); sliderContainer->updateSliderValue(monitor->brightness()); diff --git a/plugins/sound/sounddeviceswidget.cpp b/plugins/sound/sounddeviceswidget.cpp index 9fcfa7264..d2c9ba3e6 100644 --- a/plugins/sound/sounddeviceswidget.cpp +++ b/plugins/sound/sounddeviceswidget.cpp @@ -112,6 +112,8 @@ void SoundDevicesWidget::initUi() SliderProxyStyle *proxy = new SliderProxyStyle(SliderProxyStyle::Normal); m_sliderContainer->setSliderProxyStyle(proxy); + m_sliderContainer->setRange(0, std::round(m_soundInter->maxUIVolume() * 100.00)); + m_sliderContainer->setPageStep(2); sliderLayout->addWidget(m_sliderContainer); QHBoxLayout *topLayout = new QHBoxLayout(this); @@ -212,7 +214,9 @@ void SoundDevicesWidget::initConnection() connect(m_delegate, &SettingDelegate::selectIndexChanged, this, &SoundDevicesWidget::onSelectIndexChanged); connect(m_soundInter, &DBusAudio::PortEnabledChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); connect(m_soundInter, &DBusAudio::CardsWithoutUnavailableChanged, this, &SoundDevicesWidget::onAudioDevicesChanged); - + connect(m_soundInter, &DBusAudio::MaxUIVolumeChanged, this, [ = ] (double maxValue) { + m_sliderContainer->setRange(0, std::round(maxValue * 100.00)); + }); connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { m_sinkInter->SetVolume(value * 0.01, true); }); From 13988c0b2af84965945f714518e10eeac8a5fee5 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 2 Dec 2022 18:30:35 +0800 Subject: [PATCH 186/257] =?UTF-8?q?feat:=20=E5=A3=B0=E9=9F=B3=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=BB=9A=E8=BD=AE=E8=B0=83=E8=8A=82=E9=9F=B3=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 适配插件接口的eventHandler事件,响应对滚轮的处理,让其来调节音量 Log: Influence: 将鼠标放在任务栏声音图标上,滚动滚轮,观察音量大小是否调节 Bug: https://pms.uniontech.com/bug-view-172417.html Change-Id: I82cf58f652568f4152083973ba8328a39f496656 --- frame/window/quickpluginwindow.cpp | 10 +++++++ frame/window/quickpluginwindow.h | 1 + plugins/sound/soundplugin.cpp | 42 ++++++++++++++++++++++++++++++ plugins/sound/soundplugin.h | 1 + 4 files changed, 54 insertions(+) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index bf0b58212..3262feccd 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -711,6 +711,14 @@ void QuickDockItem::hideEvent(QHideEvent *event) } } +bool QuickDockItem::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == this) + return m_pluginItem->eventHandler(event); + + return QWidget::eventFilter(watched, event); +} + QPixmap QuickDockItem::iconPixmap() const { int pixmapSize = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); @@ -749,6 +757,8 @@ void QuickDockItem::initAttribute() Qt::WindowFlags flags = m_popupWindow->windowFlags() | Qt::FramelessWindowHint; m_popupWindow->setWindowFlags(flags); } + + this->installEventFilter(this); } void QuickDockItem::initConnection() diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 7cf39a454..149db0be3 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -109,6 +109,7 @@ protected: void leaveEvent(QEvent *event) override; void showEvent(QShowEvent *event) override; void hideEvent(QHideEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private: QPoint topleftPoint() const; diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 62775c9ff..7b8e9f17b 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -24,6 +24,8 @@ #include "soundwidget.h" #include "sounddeviceswidget.h" +#include + #include #include @@ -164,6 +166,46 @@ PluginFlags SoundPlugin::flags() const | PluginFlag::Attribute_CanSetting; } +bool SoundPlugin::eventHandler(QEvent *event) +{ + // 当前只处理鼠标滚轮事件 + if (event->type() != QEvent::Wheel) + return PluginsItemInterface::eventHandler(event); + + // 获取当前默认的声音设备 + QDBusPendingCall defaultSinkCall = DDBusSender().service("org.deepin.daemon.Audio1") + .path("/org/deepin/daemon/Audio1") + .interface("org.deepin.daemon.Audio1") + .property("DefaultSink").get(); + defaultSinkCall.waitForFinished(); + QDBusReply path = defaultSinkCall.reply(); + const QString defaultSinkPath = path.value().value().path(); + if (defaultSinkPath.isNull()) + return false; + + // 获取当前默认声音设备的音量 + DDBusSender sinkDBus = DDBusSender().service("org.deepin.daemon.Audio1") + .path(defaultSinkPath).interface("org.deepin.daemon.Audio1.Sink"); + QDBusPendingCall volumeCall = sinkDBus.property("Volume").get(); + volumeCall.waitForFinished(); + QDBusReply volumePath = volumeCall.reply(); + double volume = volumePath.value().value(); + + // 根据滚轮的动作来增加音量或者减小音量 + QWheelEvent *wheelEvent = static_cast(event); + if (wheelEvent->angleDelta().y() > 0) { + // 向上滚动,增大音量 + if (volume < 1) + sinkDBus.method("SetVolume").arg(volume + 0.02).arg(true).call(); + } else { + // 向下滚动,调小音量 + if (volume > 0) + sinkDBus.method("SetVolume").arg(volume - 0.02).arg(true).call(); + } + + return true; +} + void SoundPlugin::refreshPluginItemsVisible() { if (pluginIsDisable()) diff --git a/plugins/sound/soundplugin.h b/plugins/sound/soundplugin.h index 7b9a2be42..ad638fbbb 100644 --- a/plugins/sound/soundplugin.h +++ b/plugins/sound/soundplugin.h @@ -54,6 +54,7 @@ public: QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; PluginMode status() const override; PluginFlags flags() const override; + bool eventHandler(QEvent *event) override; private: void refreshPluginItemsVisible(); From 5530675d055df0bf1ac4d6070838e9d069b067a4 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 5 Dec 2022 15:00:22 +0800 Subject: [PATCH 187/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DU=E7=9B=98?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E4=B8=8D=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 老版本的U盘插件没有适配icon接口,需要根据实际情况将itemWidget显示 Log: 修复U盘插件不显示的问题 Influence: 系统中使用v20的U盘插件,插入U盘,查看U盘图标是否显示 Task: https://pms.uniontech.com/task-view-223159.html Change-Id: I7d2e7867203962ced078087c66fbddb7020d30df --- frame/pluginadapter/pluginadapter.cpp | 4 ++ frame/window/quickpluginwindow.cpp | 10 +-- frame/window/quickpluginwindow.h | 1 - .../window/tray/widgets/systempluginitem.cpp | 72 ++++++++++++++++--- frame/window/tray/widgets/systempluginitem.h | 6 +- 5 files changed, 77 insertions(+), 16 deletions(-) diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp index 80c39e021..e987fc2ba 100644 --- a/frame/pluginadapter/pluginadapter.cpp +++ b/frame/pluginadapter/pluginadapter.cpp @@ -172,6 +172,10 @@ QIcon PluginAdapter::icon(const DockPart &dockPart, DGuiApplicationHelper::Color switch (dockPart) { case DockPart::QuickPanel: case DockPart::SystemPanel: { + // 如果是托盘插件,则让他返回空图标,直接将QWidget展示 + if (m_pluginLoader->fileName().contains(TRAY_PATH)) + return QIcon(); + // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 QSize oldSize = itemWidget->size(); itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 3262feccd..a84b50b7e 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -234,10 +234,10 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) break; QMouseEvent *mouseEvent = static_cast(event); - if (m_dragInfo->canDrag(mouseEvent->pos())) { + if (m_dragInfo->canDrag(mouseEvent->pos())) startDrag(); - m_dragInfo->reset(); - } + + m_dragInfo->reset(); break; } case QEvent::Drop: { @@ -694,7 +694,8 @@ void QuickDockItem::showEvent(QShowEvent *event) QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); if (itemWidget && m_mainLayout->indexOf(itemWidget) < 0) { - itemWidget->setFixedSize(ICONWIDTH - 2, ICONHEIGHT - 2); + itemWidget->show(); + itemWidget->setFixedSize(size()); m_mainLayout->addWidget(itemWidget); } } @@ -707,6 +708,7 @@ void QuickDockItem::hideEvent(QHideEvent *event) QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); if (itemWidget && m_mainLayout->indexOf(itemWidget) >= 0) { itemWidget->setParent(m_dockItemParent); + itemWidget->hide(); m_mainLayout->removeWidget(itemWidget); } } diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 149db0be3..f2d10e29d 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -97,7 +97,6 @@ public: explicit QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent = nullptr); ~QuickDockItem(); - void setPositon(Dock::Position position); PluginsItemInterface *pluginItem(); bool canInsert() const; void hideToolTip(); diff --git a/frame/window/tray/widgets/systempluginitem.cpp b/frame/window/tray/widgets/systempluginitem.cpp index 29a98b906..1fc92e3ff 100644 --- a/frame/window/tray/widgets/systempluginitem.cpp +++ b/frame/window/tray/widgets/systempluginitem.cpp @@ -47,18 +47,20 @@ SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, cons { qDebug() << "load tray plugins item: " << m_pluginInter->pluginName() << itemKey << m_centralWidget; + QIcon icon = m_pluginInter->icon(DockPart::SystemPanel); if (m_centralWidget) { - m_centralWidget->setParent(this); - m_centralWidget->setVisible(true); - m_centralWidget->installEventFilter(this); + if (icon.isNull()) { + // 此处先创建一个Layout,在该窗体show的时候将m_centralWidget添加到layout上面 + QBoxLayout *hLayout = new QHBoxLayout(this); + hLayout->setSpacing(0); + hLayout->setMargin(0); + setLayout(hLayout); + m_centralWidget->installEventFilter(this); + } else { + m_centralWidget->setVisible(false); + } } - QBoxLayout *hLayout = new QHBoxLayout(this); - hLayout->addWidget(m_centralWidget); - hLayout->setSpacing(0); - hLayout->setMargin(0); - - setLayout(hLayout); setAccessibleName(m_itemKey); setAttribute(Qt::WA_TranslucentBackground); @@ -194,8 +196,11 @@ bool SystemPluginItem::event(QEvent *event) bool SystemPluginItem::eventFilter(QObject *watched, QEvent *event) { - if (watched == this && event->type() == QEvent::DeferredDelete) + if (watched == this && event->type() == QEvent::DeferredDelete + && m_centralWidget && m_centralWidget->parentWidget()) { m_centralWidget->setParent(nullptr); + m_centralWidget->setVisible(false); + } return BaseTrayWidget::eventFilter(watched, event); } @@ -282,6 +287,43 @@ void SystemPluginItem::showEvent(QShowEvent *event) return BaseTrayWidget::showEvent(event); } +void SystemPluginItem::hideEvent(QHideEvent *event) +{ + if (m_pluginInter->icon(DockPart::SystemPanel).isNull() + && m_centralWidget && m_centralWidget->parentWidget() == this) { + layout()->removeWidget(m_centralWidget); + m_centralWidget->setParent(nullptr); + m_centralWidget->setVisible(false); + } + BaseTrayWidget::hideEvent(event); +} + +void SystemPluginItem::paintEvent(QPaintEvent *event) +{ + QIcon icon = m_pluginInter->icon(DockPart::SystemPanel); + if (icon.isNull()) { + showCentralWidget(); + return BaseTrayWidget::paintEvent(event); + } + + int x = 0; + int y = 0; + QSize iconSize = this->size(); + QList sizes = icon.availableSizes(); + if (sizes.size() > 0) { + QSize availableSize = sizes.first(); + if (iconSize.width() > availableSize.width()) { + x = (iconSize.width() - availableSize.width()) / 2; + y = (iconSize.height() - availableSize.height()) / 2; + iconSize = availableSize; + } + } + + QPixmap pixmap = icon.pixmap(iconSize); + QPainter painter(this); + painter.drawPixmap(QRect(QPoint(x, y), iconSize), pixmap); +} + const QPoint SystemPluginItem::popupMarkPoint() const { QPoint p(topleftPoint()); @@ -480,6 +522,16 @@ void SystemPluginItem::menuActionClicked(QAction *action) invokedMenuItem(action->data().toString(), true); } +void SystemPluginItem::showCentralWidget() +{ + if (!m_pluginInter->icon(DockPart::SystemPanel).isNull() || !m_centralWidget) + return; + + m_centralWidget->setParent(this); + m_centralWidget->setVisible(true); + layout()->addWidget(m_centralWidget); +} + void SystemPluginItem::onContextMenuAccepted() { emit requestRefershWindowVisible(); diff --git a/frame/window/tray/widgets/systempluginitem.h b/frame/window/tray/widgets/systempluginitem.h index cba056d27..593a53d9b 100644 --- a/frame/window/tray/widgets/systempluginitem.h +++ b/frame/window/tray/widgets/systempluginitem.h @@ -31,6 +31,7 @@ class QGSettings; class QMenu; class DockPopupWindow; +class QHBoxLayout; class SystemPluginItem : public BaseTrayWidget { @@ -72,7 +73,9 @@ protected: void leaveEvent(QEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; - void showEvent(QShowEvent* event) override; + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + void paintEvent(QPaintEvent *event) override; protected: const QPoint popupMarkPoint() const; @@ -95,6 +98,7 @@ private: void onGSettingsChanged(const QString &key); bool checkGSettingsControl() const; void menuActionClicked(QAction *action); + void showCentralWidget(); private: bool m_popupShown; From e08e86dbffdc648d5481fa2de9b72c1ceffa489a Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 5 Dec 2022 13:55:03 +0800 Subject: [PATCH 188/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=BB=BB=E5=8A=A1=E6=A0=8F=E4=BD=8D=E7=BD=AE=E5=90=8E?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在调整窗口尺寸的时候,同时设置子窗口的尺寸,更新子窗口的布局,保证子窗口在调整位置后正确显示 Log: Influence: 时尚模式下,将任务栏从下方调整在左侧,观察托盘面板显示是否正常 Task: https://pms.uniontech.com/task-view-218981.html Change-Id: Iaa1f62c93b2ca705e212483eee2cdb5894a5a475 --- frame/window/mainpanelcontrol.cpp | 17 +++-- frame/window/traymainwindow.cpp | 2 + frame/window/windowmanager.cpp | 113 +++++++++++++++--------------- frame/window/windowmanager.h | 3 +- 4 files changed, 66 insertions(+), 69 deletions(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 3918c2cac..15a5dc16f 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -175,6 +175,7 @@ void MainPanelControl::initUI() m_toolSonAreaWidget->setLayout(m_toolSonLayout); m_toolSonLayout->setSpacing(0); m_toolSonLayout->setContentsMargins(0, 0, 0, 0); + m_toolSonLayout->setAlignment(Qt::AlignCenter); m_toolAreaLayout->addWidget(m_toolSonAreaWidget); // 添加托盘区域(包括托盘图标和插件)等 @@ -265,7 +266,7 @@ void MainPanelControl::updateMainPanelLayout() */ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg) { - if(m_position == Position::Top || m_position == Position::Bottom) { + if (m_position == Position::Top || m_position == Position::Bottom) { wdg->setMaximumSize(height(),height()); } else { wdg->setMaximumSize(width(),width()); @@ -349,11 +350,9 @@ void MainPanelControl::updateAppAreaSonWidgetSize() if ((m_position == Position::Top) || (m_position == Position::Bottom)) { m_appAreaSonWidget->setMaximumHeight(height()); m_appAreaSonWidget->setMaximumWidth(m_appAreaWidget->width()); - m_recentAreaWidget->setFixedHeight(height()); } else { m_appAreaSonWidget->setMaximumWidth(width()); m_appAreaSonWidget->setMaximumHeight(m_appAreaWidget->height()); - m_recentAreaWidget->setFixedWidth(width()); } m_appAreaSonWidget->adjustSize(); @@ -1299,9 +1298,9 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) // 时尚模式下计算最近打开应用区域的尺寸 if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - m_recentAreaWidget->setFixedWidth(appItemSize * m_recentLayout->count()); + m_recentAreaWidget->setFixedSize(appItemSize * m_recentLayout->count(), QWIDGETSIZE_MAX); else - m_recentAreaWidget->setFixedHeight(appItemSize * m_recentLayout->count()); + m_recentAreaWidget->setFixedSize(QWIDGETSIZE_MAX, appItemSize * m_recentLayout->count()); } if (m_multiWindowLayout->count() > 0) { @@ -1338,16 +1337,16 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) m_toolSonLayout->itemAt(i)->widget()->setFixedSize(appItemSize, appItemSize); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - m_toolSonAreaWidget->setFixedWidth(appItemSize * m_toolSonLayout->count()); + m_toolSonAreaWidget->setFixedSize(appItemSize * m_toolSonLayout->count(), QWIDGETSIZE_MAX); } else { - m_toolSonAreaWidget->setFixedHeight(appItemSize * m_toolSonLayout->count()); + m_toolSonAreaWidget->setFixedSize(QWIDGETSIZE_MAX, appItemSize * m_toolSonLayout->count()); } } if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - m_toolAreaWidget->setFixedWidth(m_multiWindowWidget->width() + m_toolSonAreaWidget->width()); + m_toolAreaWidget->setFixedSize(m_multiWindowWidget->width() + m_toolSonAreaWidget->width(), QWIDGETSIZE_MAX); else - m_toolAreaWidget->setFixedHeight(m_multiWindowWidget->height() + m_toolSonAreaWidget->height()); + m_toolAreaWidget->setFixedSize(QWIDGETSIZE_MAX, m_multiWindowWidget->height() + m_toolSonAreaWidget->height()); } else { for (int i = 0; i < m_appAreaSonLayout->count(); ++i) { DockItem *dockItem = qobject_cast(m_appAreaSonLayout->itemAt(i)->widget()); diff --git a/frame/window/traymainwindow.cpp b/frame/window/traymainwindow.cpp index d9356e12b..4c5c77b04 100644 --- a/frame/window/traymainwindow.cpp +++ b/frame/window/traymainwindow.cpp @@ -115,6 +115,7 @@ void TrayMainWindow::updateParentGeometry(const Dock::Position &position, const // 引起无限循环,因此,在设置尺寸的时候阻塞信号,防止进入死循环 m_trayManager->blockSignals(true); m_trayManager->setFixedSize(panelRect.size()); + m_trayManager->updateLayout(); m_trayManager->blockSignals(false); } @@ -127,6 +128,7 @@ void TrayMainWindow::resetPanelGeometry() { m_trayManager->setFixedSize(size()); m_trayManager->move(0, 0); + m_trayManager->updateLayout(); } int TrayMainWindow::dockSpace() const diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 58649f53b..536c3f2ff 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -67,7 +67,9 @@ WindowManager::~WindowManager() void WindowManager::addWindow(MainWindowBase *window) { - connect(window, &MainWindowBase::requestUpdate, this, &WindowManager::onRequestUpdate); + connect(window, &MainWindowBase::requestUpdate, this, [ window, this ] { + updateDockGeometry(window->geometry()); + }); window->setPosition(m_multiScreenWorker->position()); window->setDisplayMode(m_multiScreenWorker->displayMode()); @@ -405,6 +407,57 @@ void WindowManager::RegisterDdeSession() } } +void WindowManager::updateDockGeometry(const QRect &rect) +{ + // 如果当前正在执行动画,则无需设置 + if (m_multiScreenWorker->testState(MultiScreenWorker::ChangePositionAnimationStart) + || m_multiScreenWorker->testState(MultiScreenWorker::ShowAnimationStart) + || m_multiScreenWorker->testState(MultiScreenWorker::HideAnimationStart)) + return; + + QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + + for (MainWindowBase *mainWindow : m_topWindows) { + if (!mainWindow->isVisible()) + continue; + + QRect windowShowSize = mainWindow->getDockGeometry(screen, m_multiScreenWorker->position(), + m_multiScreenWorker->displayMode(), Dock::HideState::Show); + switch(m_position) { + case Dock::Position::Top: { + windowShowSize.setHeight(rect.height()); + break; + } + case Dock::Position::Bottom: { + int bottomY = windowShowSize.y() + windowShowSize.height(); + windowShowSize.setY(bottomY - rect.height()); + windowShowSize.setHeight(rect.height()); + break; + } + case Dock::Position::Left: { + windowShowSize.setWidth(rect.width()); + break; + } + case Dock::Position::Right: { + int righyX = windowShowSize.x() + windowShowSize.width(); + windowShowSize.setX(righyX - rect.width()); + windowShowSize.setWidth(rect.width()); + break; + } + } + + mainWindow->blockSignals(true); + mainWindow->raise(); + mainWindow->setFixedSize(windowShowSize.size()); + mainWindow->move(windowShowSize.topLeft()); + mainWindow->resetPanelGeometry(); + mainWindow->blockSignals(false); + } + + // 抛出geometry变化的信号,通知控制中心调整尺寸 + Q_EMIT panelGeometryChanged(); +} + void WindowManager::initConnection() { connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &WindowManager::onDbusNameOwnerChanged); @@ -503,7 +556,7 @@ void WindowManager::onPlayAnimation(const QString &screenName, const Dock::Posit showAniFinish(); if (updatePos) onPositionChanged(m_multiScreenWorker->position()); - m_multiScreenWorker->setStates(MultiScreenWorker::ShowAnimationStart, false); + m_multiScreenWorker->setStates(MultiScreenWorker::ShowAnimationStart, false); break; case Dock::AniAction::Hide: hideAniFinish(); @@ -752,59 +805,3 @@ void WindowManager::onRequestNotifyWindowManager() static_cast(strutEnd)); // 设置任务栏终点坐标(上下为x,左右为y) } } - -void WindowManager::onRequestUpdate() -{ - // 如果当前正在执行动画,则无需设置 - if (m_multiScreenWorker->testState(MultiScreenWorker::ChangePositionAnimationStart) - || m_multiScreenWorker->testState(MultiScreenWorker::ShowAnimationStart) - || m_multiScreenWorker->testState(MultiScreenWorker::HideAnimationStart)) - return; - - QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); - // 查找发送信号的窗口 - MainWindowBase *dragWindow = qobject_cast(sender()); - if (!dragWindow || !screen) - return; - - QRect dragGeometry = dragWindow->geometry(); - for (MainWindowBase *mainWindow : m_topWindows) { - if (!mainWindow->isVisible()) - continue; - - QRect windowShowSize = mainWindow->getDockGeometry(screen, m_multiScreenWorker->position(), - m_multiScreenWorker->displayMode(), Dock::HideState::Show); - switch(m_position) { - case Dock::Position::Top: { - windowShowSize.setHeight(dragGeometry.height()); - break; - } - case Dock::Position::Bottom: { - int bottomY = windowShowSize.y() + windowShowSize.height(); - windowShowSize.setY(bottomY - dragGeometry.height()); - windowShowSize.setHeight(dragGeometry.height()); - break; - } - case Dock::Position::Left: { - windowShowSize.setWidth(dragGeometry.width()); - break; - } - case Dock::Position::Right: { - int righyX = windowShowSize.x() + windowShowSize.width(); - windowShowSize.setX(righyX - dragGeometry.width()); - windowShowSize.setWidth(dragGeometry.width()); - break; - } - } - - mainWindow->blockSignals(true); - mainWindow->raise(); - mainWindow->setFixedSize(windowShowSize.size()); - mainWindow->move(windowShowSize.topLeft()); - mainWindow->resetPanelGeometry(); - mainWindow->blockSignals(false); - } - - // 抛出geometry变化的信号,通知控制中心调整尺寸 - Q_EMIT panelGeometryChanged(); -} diff --git a/frame/window/windowmanager.h b/frame/window/windowmanager.h index 6b33289d5..9cf681899 100644 --- a/frame/window/windowmanager.h +++ b/frame/window/windowmanager.h @@ -67,10 +67,9 @@ private: QRect getDockGeometry(bool withoutScale = false) const; // 计算左右侧加起来的区域大小 void RegisterDdeSession(); + void updateDockGeometry(const QRect &rect); private Q_SLOTS: - void onRequestUpdate(); // 调整尺寸的时候 - void onUpdateDockGeometry(const Dock::HideMode &hideMode); void onPositionChanged(const Dock::Position &position); void onDisplayModeChanged(const Dock::DisplayMode &displayMode); From 3d89a3d4743f1dd90384a24f3a0bc2d68562d64e Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 6 Dec 2022 03:06:17 +0000 Subject: [PATCH 189/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=AD=E5=BF=83=E8=B0=83=E6=95=B4=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F=E5=B0=BA=E5=AF=B8=E7=BC=93=E6=85=A2=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit requestUpdate信号在手动调整的时候已经在合适的时机发出,重复发送会导致在控制中心调整任务栏尺寸的时候引起重复调整导致反应缓慢 Log: 修复控制中心调整任务栏尺寸缓慢显示的问题 Influence: 从控制中心个性化调整任务栏尺寸,观察任务栏的尺寸是否正常调整 Bug: https://pms.uniontech.com/bug-view-171799.html Change-Id: If5692f8cf6569fd2d57c46173f3622c26c222c1f --- frame/window/mainpanelcontrol.cpp | 9 --------- frame/window/mainpanelcontrol.h | 1 - frame/window/mainwindow.cpp | 3 --- 3 files changed, 13 deletions(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 15a5dc16f..45b7eea9d 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -1267,8 +1267,6 @@ void MainPanelControl::resizeDockIcon() calcuDockIconSize(width(), iconSize, tray_item_size); } } - - Q_EMIT requestUpdate(); } void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) @@ -1410,13 +1408,6 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) m_appAreaSonLayout->setContentsMargins(appLeftAndRightMargin, appTopAndBottomMargin, appLeftAndRightMargin, appTopAndBottomMargin); } -void MainPanelControl::onRequestUpdate() -{ - // 在插件区域界面发生变化后(新增插件、删除插件、时间长度变化,新增托盘等),会触发当前的信号,此时当前类 - // 的尺寸还未变化,因此在此处发送requestUpdate信号,通知外面来调整任务栏右侧的大小,同时计算整个任务栏的大小 - Q_EMIT requestUpdate(); -} - void MainPanelControl::onRecentVisibleChanged(bool visible) { m_appSpliter->setVisible(visible); diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 3a84785ca..f7929b601 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -92,7 +92,6 @@ private: PluginsItem *trash() const; private Q_SLOTS: - void onRequestUpdate(); void onRecentVisibleChanged(bool visible); void onDockAppVisibleChanged(bool visible); void onToolVisibleChanged(bool visible); diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index fb4d05462..8e7045720 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -74,8 +74,6 @@ void MainWindow::resizeEvent(QResizeEvent *event) MainWindowBase::resizeEvent(event); m_mainPanel->updatePluginsLayout(); - // 任务栏大小、位置、模式改变都会触发resize,发射大小改变信号,供依赖项目更新位置 - Q_EMIT requestUpdate(); } void MainWindow::initConnections() @@ -108,7 +106,6 @@ void MainWindow::setGeometry(const QRect &rect) return; DBlurEffectWidget::setGeometry(rect); - emit requestUpdate(); } MainWindowBase::DockWindowType MainWindow::windowType() const From 2d958dd670285a3ba02ac8e38a9e3ae84c775914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Fri, 18 Nov 2022 17:08:32 +0800 Subject: [PATCH 190/257] =?UTF-8?q?chore:=20V23=E6=8E=A5=E5=8F=A3=E6=94=B9?= =?UTF-8?q?=E9=80=A0=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit V23接口改造适配 Log: V23接口改造适配 Influence: 无 Task: https://pms.uniontech.com/task-view-207483.html Change-Id: Ide530c023ea41f86fad2e8001ec67f1afaa897ab --- .project | 3 +- CMakeLists.txt | 2 - frame/controller/dockitemmanager.cpp | 14 -- frame/controller/dockitemmanager.h | 4 - frame/controller/recentapphelper.cpp | 174 ------------------ frame/controller/recentapphelper.h | 13 +- frame/dbus/dbusclientmanager.cpp | 28 --- frame/dbus/dbusclientmanager.h | 89 --------- frame/dbus/dbusdisplay.cpp | 2 +- frame/dbus/dbusdisplay.h | 12 +- frame/dbus/dbusdockadaptors.h | 6 +- frame/dbus/dockinterface.cpp | 11 +- frame/dbus/dockinterface.h | 5 +- frame/dbus/entryinterface.cpp | 5 - frame/dbus/entryinterface.h | 6 +- ...ck.xml => org.deepin.dde.daemon.Dock1.xml} | 2 +- ...ink.xml => org.deepin.dde.Audio1.Sink.xml} | 2 +- .../xml/org.deepin.dde.Audio1.xml | 2 +- ...isplay.xml => org.deepin.dde.Display1.xml} | 2 +- .../xml/org.deepin.dde.Gesture1.xml | 2 +- ...ncher.xml => org.deepin.dde.Launcher1.xml} | 0 .../xml/org.deepin.dde.Timedate1.xml | 2 +- ....xml => org.deepin.dde.XEventMonitor1.xml} | 2 +- .../xml/org.deepin.dde.daemon.Dock1.xml | 2 +- frame/display/displaymanager.h | 4 +- frame/item/appitem.cpp | 14 -- frame/item/appitem.h | 7 - frame/item/appmultiitem.cpp | 4 - frame/item/components/appdragwidget.cpp | 4 +- frame/main.cpp | 4 +- frame/util/dbusutil.h | 53 +----- frame/util/dockpopupwindow.h | 4 +- frame/util/menuworker.cpp | 9 - frame/util/multiscreenworker.cpp | 41 +---- frame/util/multiscreenworker.h | 10 +- frame/util/touchsignalmanager.cpp | 2 +- frame/util/touchsignalmanager.h | 4 +- frame/window/components/datetimedisplayer.cpp | 6 +- frame/window/components/datetimedisplayer.h | 4 +- frame/window/mainpanelcontrol.cpp | 3 +- frame/window/tray/dbustraymanager.h | 2 +- .../window/tray/widgets/indicatortrayitem.cpp | 4 +- frame/window/traymanagerwindow.h | 4 +- frame/window/windowmanager.cpp | 4 +- interfaces/constants.h | 6 +- plugins/CMakeLists.txt | 1 - plugins/airplane-mode/airplanemodeitem.cpp | 15 +- plugins/airplane-mode/airplanemodeitem.h | 4 +- ...e.xml => org.deepin.dde.AirplaneMode1.xml} | 2 +- plugins/bluetooth/bluetooth.json | 2 +- plugins/bluetooth/bluetoothitem.cpp | 10 - .../bluetooth/componments/adaptersmanager.cpp | 10 +- .../bluetooth/componments/adaptersmanager.h | 4 +- .../componments/bluetoothadapteritem.cpp | 2 +- .../componments/bluetoothadapteritem.h | 4 +- .../bluetooth/componments/bluetoothapplet.cpp | 12 +- .../bluetooth/componments/bluetoothapplet.h | 4 +- ...e.xml => org.deepin.dde.AirplaneMode1.xml} | 2 +- ...ooth.xml => org.deepin.dde.Bluetooth1.xml} | 2 +- plugins/datetime/datetime.json | 2 +- plugins/datetime/datetimeplugin.cpp | 22 +-- plugins/datetime/datetimewidget.cpp | 2 +- plugins/datetime/datetimewidget.h | 4 +- .../xml/org.deepin.dde.Timedate1.xml | 2 +- plugins/disk-mount/CMakeLists.txt | 26 --- .../dbus/com.deepin.daemon.DiskMount.xml | 31 ---- plugins/disk-mount/dbus/dbusdiskmount.cpp | 30 --- plugins/disk-mount/dbus/dbusdiskmount.h | 113 ------------ plugins/disk-mount/dbus/variant/diskinfo.cpp | 86 --------- plugins/disk-mount/dbus/variant/diskinfo.h | 61 ------ plugins/disk-mount/disk-mount.json | 3 - plugins/disk-mount/diskcontrolitem.cpp | 132 ------------- plugins/disk-mount/diskcontrolitem.h | 59 ------ plugins/disk-mount/diskcontrolwidget.cpp | 100 ---------- plugins/disk-mount/diskcontrolwidget.h | 55 ------ plugins/disk-mount/diskmountplugin.cpp | 144 --------------- plugins/disk-mount/diskmountplugin.h | 66 ------- plugins/disk-mount/diskpluginitem.cpp | 91 --------- plugins/disk-mount/diskpluginitem.h | 58 ------ plugins/disk-mount/imageutil.cpp | 38 ---- plugins/disk-mount/imageutil.h | 34 ---- plugins/disk-mount/resources.qrc | 10 - plugins/disk-mount/resources/icon-small.svg | 13 -- plugins/disk-mount/resources/icon.svg | 28 --- plugins/disk-mount/resources/unknown.svg | 40 ---- .../disk-mount/resources/unmount-hover.png | Bin 449 -> 0 bytes .../disk-mount/resources/unmount-normal.png | Bin 497 -> 0 bytes .../disk-mount/resources/unmount-press.png | Bin 493 -> 0 bytes plugins/display/brightnessmodel.cpp | 6 +- plugins/display/collaborationdevmodel.cpp | 6 +- plugins/keyboard-layout/dbusadaptors.cpp | 17 +- plugins/keyboard-layout/dbusadaptors.h | 8 +- ... org.deepin.dde.InputDevice1.Keyboard.xml} | 2 +- plugins/keyboard-layout/keyboardplugin.cpp | 6 +- plugins/keyboard-layout/keybord_layout.json | 12 +- ... => org.deepin.dde.daemon.Dock1.Entry.xml} | 0 ...ck.xml => org.deepin.dde.daemon.Dock1.xml} | 0 plugins/onboard/onboardplugin.cpp | 4 +- plugins/overlay-warning/CMakeLists.txt | 2 +- ...icy => org.deepin.dde.dock.overlay.policy} | 0 .../overlay-warning-plugin.cpp | 2 +- .../plugin-guide/plugins-developer-guide.md | 6 +- plugins/power/dbus/dbusaccount.cpp | 2 +- plugins/power/dbus/dbusaccount.h | 14 +- plugins/power/dbus/dbuspower.cpp | 4 +- plugins/power/dbus/dbuspower.h | 12 +- ...on.Power.xml => org.deepin.dde.Power1.xml} | 2 +- ...er.xml => org.deepin.dde.SystemPower1.xml} | 2 +- plugins/power/power.json | 2 +- plugins/power/powerplugin.cpp | 16 +- plugins/power/powerplugin.h | 4 +- plugins/shutdown/dbus/dbusaccount.cpp | 2 +- plugins/shutdown/dbus/dbusaccount.h | 14 +- plugins/shutdown/dbus/dbuspowermanager.cpp | 2 +- plugins/shutdown/dbus/dbuspowermanager.h | 8 +- plugins/shutdown/shutdownplugin.cpp | 30 +-- ...ink.xml => org.deepin.dde.Audio1.Sink.xml} | 2 +- .../xml/org.deepin.dde.Audio1.xml | 2 +- plugins/sound/sound.json | 2 +- plugins/sound/soundapplet.cpp | 6 +- plugins/sound/soundapplet.h | 8 +- plugins/sound/sounddeviceswidget.cpp | 6 +- plugins/sound/sounddeviceswidget.h | 8 +- plugins/sound/sounditem.cpp | 10 - plugins/sound/sounditem.h | 4 +- plugins/sound/soundwidget.cpp | 6 +- plugins/sound/soundwidget.h | 8 +- plugins/tray/dbus/dbustraymanager.cpp | 2 +- plugins/tray/dbus/dbustraymanager.h | 2 +- ...er.xml => org.deepin.dde.TrayManager1.xml} | 2 +- .../xml/org.deepin.dde.Gesture1.xml | 2 +- .../xml/org.deepin.dde.daemon.Dock1.xml | 2 +- .../fashiontray/fashiontraywidgetwrapper.h | 4 +- plugins/tray/indicatortraywidget.cpp | 4 +- plugins/tray/snitraywidget.h | 2 +- rpm/dde-dock.spec | 2 +- tests/item/ut_appitem.cpp | 2 +- tests/util/ut_menuworker.cpp | 4 +- 138 files changed, 211 insertions(+), 1971 deletions(-) delete mode 100644 frame/dbus/dbusclientmanager.cpp delete mode 100644 frame/dbus/dbusclientmanager.h rename frame/dbus/{com.deepin.dde.daemon.Dock.xml => org.deepin.dde.daemon.Dock1.xml} (96%) rename frame/dbusinterface/xml/{org.deepin.daemon.Audio.Sink.xml => org.deepin.dde.Audio1.Sink.xml} (96%) rename plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.xml => frame/dbusinterface/xml/org.deepin.dde.Audio1.xml (97%) rename frame/dbusinterface/xml/{org.deepin.daemon.Display.xml => org.deepin.dde.Display1.xml} (98%) rename plugins/tray/dbusinterface/xml/org.deepin.daemon.Gesture.xml => frame/dbusinterface/xml/org.deepin.dde.Gesture1.xml (95%) rename frame/dbusinterface/xml/{org.deepin.dde.Launcher.xml => org.deepin.dde.Launcher1.xml} (100%) rename plugins/datetime/dbusinterface/xml/org.deepin.daemon.Timedate.xml => frame/dbusinterface/xml/org.deepin.dde.Timedate1.xml (98%) rename frame/dbusinterface/xml/{org.deepin.api.XEventMonitor.xml => org.deepin.dde.XEventMonitor1.xml} (96%) rename plugins/tray/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml => frame/dbusinterface/xml/org.deepin.dde.daemon.Dock1.xml (98%) rename plugins/airplane-mode/dbusinterface/xml/{org.deepin.daemon.AirplaneMode.xml => org.deepin.dde.AirplaneMode1.xml} (91%) rename plugins/bluetooth/dbusinterface/xml/{org.deepin.daemon.AirplaneMode.xml => org.deepin.dde.AirplaneMode1.xml} (91%) rename plugins/bluetooth/dbusinterface/xml/{org.deepin.daemon.Bluetooth.xml => org.deepin.dde.Bluetooth1.xml} (99%) rename frame/dbusinterface/xml/org.deepin.daemon.Timedate.xml => plugins/datetime/dbusinterface/xml/org.deepin.dde.Timedate1.xml (98%) delete mode 100644 plugins/disk-mount/CMakeLists.txt delete mode 100644 plugins/disk-mount/dbus/com.deepin.daemon.DiskMount.xml delete mode 100644 plugins/disk-mount/dbus/dbusdiskmount.cpp delete mode 100644 plugins/disk-mount/dbus/dbusdiskmount.h delete mode 100644 plugins/disk-mount/dbus/variant/diskinfo.cpp delete mode 100644 plugins/disk-mount/dbus/variant/diskinfo.h delete mode 100644 plugins/disk-mount/disk-mount.json delete mode 100644 plugins/disk-mount/diskcontrolitem.cpp delete mode 100644 plugins/disk-mount/diskcontrolitem.h delete mode 100644 plugins/disk-mount/diskcontrolwidget.cpp delete mode 100644 plugins/disk-mount/diskcontrolwidget.h delete mode 100644 plugins/disk-mount/diskmountplugin.cpp delete mode 100644 plugins/disk-mount/diskmountplugin.h delete mode 100644 plugins/disk-mount/diskpluginitem.cpp delete mode 100644 plugins/disk-mount/diskpluginitem.h delete mode 100644 plugins/disk-mount/imageutil.cpp delete mode 100644 plugins/disk-mount/imageutil.h delete mode 100644 plugins/disk-mount/resources.qrc delete mode 100644 plugins/disk-mount/resources/icon-small.svg delete mode 100644 plugins/disk-mount/resources/icon.svg delete mode 100644 plugins/disk-mount/resources/unknown.svg delete mode 100644 plugins/disk-mount/resources/unmount-hover.png delete mode 100644 plugins/disk-mount/resources/unmount-normal.png delete mode 100644 plugins/disk-mount/resources/unmount-press.png rename plugins/keyboard-layout/dbusinterface/xml/{org.deepin.daemon.InputDevice.Keyboard.xml => org.deepin.dde.InputDevice1.Keyboard.xml} (96%) rename plugins/onboard/dbusinterface/xml/{org.deepin.dde.daemon.Dock.Entry.xml => org.deepin.dde.daemon.Dock1.Entry.xml} (100%) rename plugins/onboard/dbusinterface/xml/{org.deepin.dde.daemon.Dock.xml => org.deepin.dde.daemon.Dock1.xml} (100%) rename plugins/overlay-warning/{com.deepin.dde.dock.overlay.policy => org.deepin.dde.dock.overlay.policy} (100%) rename plugins/power/dbus/{com.deepin.daemon.Power.xml => org.deepin.dde.Power1.xml} (96%) rename plugins/power/dbusinterface/xml/{org.deepin.system.SystemPower.xml => org.deepin.dde.SystemPower1.xml} (97%) rename plugins/sound/dbusinterface/xml/{org.deepin.daemon.Audio.Sink.xml => org.deepin.dde.Audio1.Sink.xml} (96%) rename frame/dbusinterface/xml/org.deepin.daemon.Audio.xml => plugins/sound/dbusinterface/xml/org.deepin.dde.Audio1.xml (97%) rename plugins/tray/dbus/{com.deepin.dde.TrayManager.xml => org.deepin.dde.TrayManager1.xml} (95%) rename frame/dbusinterface/xml/org.deepin.daemon.Gesture.xml => plugins/tray/dbusinterface/xml/org.deepin.dde.Gesture1.xml (95%) rename frame/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml => plugins/tray/dbusinterface/xml/org.deepin.dde.daemon.Dock1.xml (98%) diff --git a/.project b/.project index 97bc60c00..5199dabb7 100644 --- a/.project +++ b/.project @@ -2,6 +2,5 @@ "type": "homebrew" | "opensource", "3rdparty: ["*.xml"], "ignore": ["CHANGELOG.md", "./debian", "README.md", "./cmake", "technology-overview.md", "CMakeLists.txt", "CMakeLists.txt.user", "./plugins/plugin-guide", "./.tx", "*.qrc", "*.svg", "*.png", "*.qm", "*.ts"], - "license": ["LICENSE"], - "importantFile": ["gschema/com.deepin.dde.dock.module.gschema.xml", "interfaces/constants.h", "interfaces/pluginproxyinterface.h", "interfaces/pluginsiteminterface.h"] + "license": ["LICENSE"] } diff --git a/CMakeLists.txt b/CMakeLists.txt index 7689c1b3f..175e386f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,8 +75,6 @@ endfunction(generation_dbus_interface) file(GLOB INTERFACES "interfaces/*.h") -add_compile_definitions(USE_AM) - #因为单元测试需要直接测试源代码,而主程序代码中include的单元使用了相对路径 #单元测试的CMakeLists和主程序的CMakeLists路径不同,编译单元测试时会提示找不到文件 #因此设置搜索路径 diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index 3c8e39f66..9184cbfae 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -55,17 +55,11 @@ DockItemManager::DockItemManager(QObject *parent) connect(it, &AppItem::requestActivateWindow, m_appInter, &DockInter::ActivateWindow, Qt::QueuedConnection); connect(it, &AppItem::requestPreviewWindow, m_appInter, &DockInter::PreviewWindow); connect(it, &AppItem::requestCancelPreview, m_appInter, &DockInter::CancelPreviewWindow); - -#ifdef USE_AM connect(it, &AppItem::windowCountChanged, this, &DockItemManager::onAppWindowCountChanged); -#endif - connect(this, &DockItemManager::requestUpdateDockItem, it, &AppItem::requestUpdateEntryGeometries); m_itemList.append(it); -#ifdef USE_AM updateMultiItems(it); -#endif } // 托盘区域和插件区域 由DockPluginsController获取 @@ -86,9 +80,7 @@ DockItemManager::DockItemManager(QObject *parent) connect(m_appInter, &DockInter::EntryAdded, this, &DockItemManager::appItemAdded); connect(m_appInter, &DockInter::EntryRemoved, this, static_cast(&DockItemManager::appItemRemoved), Qt::QueuedConnection); connect(m_appInter, &DockInter::ServiceRestarted, this, &DockItemManager::reloadAppItems); -#ifdef USE_AM connect(m_appInter, &DockInter::ShowMultiWindowChanged, this, &DockItemManager::onShowMultiWindowChanged); -#endif DApplication *app = qobject_cast(qApp); if (app) { @@ -225,9 +217,7 @@ void DockItemManager::appItemAdded(const QDBusObjectPath &path, const int index) connect(item, &AppItem::requestActivateWindow, m_appInter, &DockInter::ActivateWindow, Qt::QueuedConnection); connect(item, &AppItem::requestPreviewWindow, m_appInter, &DockInter::PreviewWindow); connect(item, &AppItem::requestCancelPreview, m_appInter, &DockInter::CancelPreviewWindow); -#ifdef USE_AM connect(item, &AppItem::windowCountChanged, this, &DockItemManager::onAppWindowCountChanged); -#endif connect(this, &DockItemManager::requestUpdateDockItem, item, &AppItem::requestUpdateEntryGeometries); m_itemList.insert(insertIndex, item); @@ -239,10 +229,8 @@ void DockItemManager::appItemAdded(const QDBusObjectPath &path, const int index) // 插入dockItem emit itemInserted(itemIndex, item); -#ifdef USE_AM // 向后插入多开窗口 updateMultiItems(item, true); -#endif } void DockItemManager::appItemRemoved(const QString &appId) @@ -385,7 +373,6 @@ void DockItemManager::onPluginLoadFinished() m_loadFinished = true; } -#ifdef USE_AM void DockItemManager::onAppWindowCountChanged() { AppItem *appItem = static_cast(sender()); @@ -496,4 +483,3 @@ void DockItemManager::onShowMultiWindowChanged() } } } -#endif diff --git a/frame/controller/dockitemmanager.h b/frame/controller/dockitemmanager.h index dad07c475..c0e12d798 100644 --- a/frame/controller/dockitemmanager.h +++ b/frame/controller/dockitemmanager.h @@ -67,10 +67,8 @@ private Q_SLOTS: void onPluginItemRemoved(PluginsItemInterface *itemInter); void onPluginUpdate(PluginsItemInterface *itemInter); -#ifdef USE_AM void onAppWindowCountChanged(); void onShowMultiWindowChanged(); -#endif private: explicit DockItemManager(QObject *parent = nullptr); @@ -82,11 +80,9 @@ private: void manageItem(DockItem *item); void pluginItemInserted(PluginsItem *item); -#ifdef USE_AM void updateMultiItems(AppItem *appItem, bool emitSignal = false); bool multiWindowExist(quint32 winId) const; bool needRemoveMultiWindow(AppMultiItem *multiItem) const; -#endif private: DockInter *m_appInter; diff --git a/frame/controller/recentapphelper.cpp b/frame/controller/recentapphelper.cpp index fdeb1ec15..bec585701 100644 --- a/frame/controller/recentapphelper.cpp +++ b/frame/controller/recentapphelper.cpp @@ -42,9 +42,6 @@ void RecentAppHelper::setDisplayMode(Dock::DisplayMode displayMode) { bool lastVisible = dockAppIsVisible(); m_displayMode = displayMode; -#ifndef USE_AM - resetDockItems(); -#endif updateRecentVisible(); updateDockAppVisible(lastVisible); } @@ -52,35 +49,7 @@ void RecentAppHelper::setDisplayMode(Dock::DisplayMode displayMode) // 当在应用区域调整位置的时候,需要重新设置索引 void RecentAppHelper::resetAppInfo() { - #ifndef USE_AM - // 获取应用区域和最近打开区域的app图标 - QList appDockItem = appItems(m_appWidget); - // 获取应用区域图标在原来列表中的位置 - QList dockIndex; - for (DockItem *appItem : appDockItem) - dockIndex << m_sequentDockItems.indexOf(appItem); - - // 按照从小到大排序 - std::sort(dockIndex.begin(), dockIndex.end(), [ = ](int index1, int index2) { return index1 < index2; }); - QMap dockItemIndex; - for (int i = 0; i < appDockItem.size(); i++) { - DockItem *item = appDockItem[i]; - dockItemIndex[item] = dockIndex[i]; - } - - // 替换原来的位置 - for (DockItem *appItem : appDockItem) { - int index = -1; - if (dockItemIndex.contains(appItem)) - index = dockItemIndex.value(appItem); - - if (index >= 0) - m_sequentDockItems[index] = appItem; - else - m_sequentDockItems << appItem; - } -#endif } void RecentAppHelper::addAppItem(int index, DockItem *dockItem) @@ -96,21 +65,7 @@ void RecentAppHelper::addAppItem(int index, DockItem *dockItem) AppItem *appItem = qobject_cast(dockItem); -#ifdef USE_AM connect(appItem, &AppItem::modeChanged, this, &RecentAppHelper::onModeChanged); -#else - connect(dockItem, &QWidget::destroyed, this, [ this, dockItem ] { - if (m_sequentDockItems.contains(dockItem)) - m_sequentDockItems.removeOne(dockItem); - }); - connect(appItem, &AppItem::isDockChanged, this, &RecentAppHelper::onItemChanged); - - // 如果索引值大于0,说明它是插入到固定位置的,否则,则认为它是顺序排列的 - if (index >= 0 && index < m_sequentDockItems.size()) - m_sequentDockItems.insert(index, dockItem); - else - m_sequentDockItems << dockItem; -#endif } void RecentAppHelper::removeAppItem(DockItem *dockItem) @@ -119,10 +74,6 @@ void RecentAppHelper::removeAppItem(DockItem *dockItem) removeRecentAreaItem(dockItem); else removeAppAreaItem(dockItem); -#ifndef USE_AM - AppItem *appItem = qobject_cast(dockItem); - disconnect(appItem, &AppItem::isDockChanged, this, &RecentAppHelper::onItemChanged); -#endif } bool RecentAppHelper::recentIsVisible() const @@ -159,7 +110,6 @@ bool RecentAppHelper::eventFilter(QObject *watched, QEvent *event) return QObject::eventFilter(watched, event); } -#ifdef USE_AM void RecentAppHelper::onModeChanged(int mode) { AppItem *appItem = qobject_cast(sender()); @@ -182,32 +132,14 @@ void RecentAppHelper::onModeChanged(int mode) } updateRecentVisible(); } -#else -void RecentAppHelper::onItemChanged() -{ - bool lastVisible = dockAppIsVisible(); - resetDockItems(); - updateRecentVisible(); - updateDockAppVisible(lastVisible); -} -#endif bool RecentAppHelper::appInRecent(DockItem *item) const { -#ifdef USE_AM AppItem *appItem = qobject_cast(item); if (!appItem) return false; return (appItem->mode() == ENTRY_RECENT); -#else - // 先判断当前是否为时尚模式,只有时尚模式下才支持最近打开的应用 - if (m_displayMode != Dock::DisplayMode::Fashion) - return false; - // 只有当应用没有固定到任务栏上才认为它是最新打开的应用 - AppItem *appItem = qobject_cast(item); - return (appItem && !appItem->isDocked()); -#endif } void RecentAppHelper::addAppAreaItem(int index, DockItem *wdg) @@ -265,112 +197,6 @@ void RecentAppHelper::removeAppAreaItem(DockItem *wdg) updateDockAppVisible(lastVisible); } -#ifndef USE_AM -QList RecentAppHelper::dockItemToAppArea() const -{ - QList dockItems; - if (m_displayMode == Dock::DisplayMode::Efficient) { - // 由特效模式变成高效模式,将所有的最近打开的应用移动到左侧的应用区域 - for (int i = 0; i < m_recentWidget->layout()->count(); i++) { - DockItem *appItem = qobject_cast(m_recentWidget->layout()->itemAt(i)->widget()); - if (!appItem) - continue; - - dockItems << appItem; - } - } else { - // 如果是特效模式下,则查找所有已驻留的应用,将其移动到应用区域 - for (int i = 0; i < m_recentWidget->layout()->count(); i++) { - DockItem *appItem = qobject_cast(m_recentWidget->layout()->itemAt(i)->widget()); - if (!appItem || appInRecent(appItem)) - continue; - - dockItems << appItem; - } - } - - return dockItems; -} - -void RecentAppHelper::resetDockItems() -{ - // 先将所有的最近打开的区域移动到应用区域 - QList recentAppItems = dockItemToAppArea(); - - // 从最近使用应用中移除 - for (DockItem *appItem : recentAppItems) - m_recentWidget->layout()->removeWidget(appItem); - - // 将这些图标添加到应用区域 - QBoxLayout *boxLayout = static_cast(m_appWidget->layout()); - for (DockItem *appItem : recentAppItems) { - int index = getDockItemIndex(appItem, false); - if (index >= 0) - boxLayout->insertWidget(index, appItem); - else - boxLayout->addWidget(appItem); - } - - if (m_displayMode == Dock::DisplayMode::Fashion) { - // 由高效模式变成特效模式后,将左侧未驻留的应用移动到右侧的最近打开应用中 - QList unDockItems; - for (int i = 0; i < m_appWidget->layout()->count() ; i++) { - DockItem *appItem = qobject_cast(m_appWidget->layout()->itemAt(i)->widget()); - if (!appInRecent(appItem)) - continue; - - unDockItems << appItem; - } - - // 从应用区域中删除未驻留的应用 - for (DockItem *appItem : unDockItems) - m_appWidget->layout()->removeWidget(appItem); - - // 将这些图标添加到最近打开区域 - QBoxLayout *recentLayout = static_cast(m_recentWidget->layout()); - for (DockItem *appItem : unDockItems) { - int index = getDockItemIndex(appItem, true); - if (index >= 0) - recentLayout->insertWidget(index, appItem); - else - recentLayout->addWidget(appItem); - } - } -} - -int RecentAppHelper::getDockItemIndex(DockItem *dockItem, bool isRecent) const -{ - // 当从最近区域移动到应用区域的时候,重新计算插入索引值 - if (!m_sequentDockItems.contains(dockItem)) - return -1; - - QList sequeDockItems = m_sequentDockItems; - if (isRecent) { - // 如果是最近打开区域,需要按照时间从小到大排列(先打开的排在前面) - std::sort(sequeDockItems.begin(), sequeDockItems.end(), [](DockItem *item1, DockItem *item2) { - AppItem *appItem1 = qobject_cast(item1); - AppItem *appItem2 = qobject_cast(item2); - if (!appItem1 || !appItem2) - return false; - - return appItem1->appOpenMSecs() < appItem2->appOpenMSecs(); - }); - } - - int index = sequeDockItems.indexOf(dockItem); - // 查找所有在应用区域的图标 - QList dockApps = appItems(isRecent ? m_recentWidget : m_appWidget); - for (int i = index + 1; i < sequeDockItems.size(); i++) { - DockItem *item = sequeDockItems[i]; - int itemIndex = dockApps.indexOf(static_cast(item)); - if (itemIndex >= 0) - return itemIndex; - } - - return -1; -} -#endif - int RecentAppHelper::getEntryIndex(DockItem *dockItem, QWidget *widget) const { AppItem *appItem = qobject_cast(dockItem); diff --git a/frame/controller/recentapphelper.h b/frame/controller/recentapphelper.h index 5b69c51af..d67c038b6 100644 --- a/frame/controller/recentapphelper.h +++ b/frame/controller/recentapphelper.h @@ -66,27 +66,16 @@ private: void removeRecentAreaItem(DockItem *wdg); void removeAppAreaItem(DockItem *wdg); -#ifndef USE_AM - QList dockItemToAppArea() const; - void resetDockItems(); - int getDockItemIndex(DockItem *dockItem, bool isRecent) const; -#endif int getEntryIndex(DockItem *dockItem, QWidget *widget) const; QList appItems(QWidget *widget) const; private Q_SLOTS: -#ifdef USE_AM void onModeChanged(int mode); -#else - void onItemChanged(); -#endif + private: QWidget *m_appWidget; QWidget *m_recentWidget; -#ifndef USE_AM - QList m_sequentDockItems; -#endif Dock::DisplayMode m_displayMode; DockInter *m_dockInter; }; diff --git a/frame/dbus/dbusclientmanager.cpp b/frame/dbus/dbusclientmanager.cpp deleted file mode 100644 index ead7b6905..000000000 --- a/frame/dbus/dbusclientmanager.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusClientManager -p dbusclientmanager dde-dock-ClientManager.xml - * - * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "dbusclientmanager.h" - -/* - * Implementation of interface class DBusClientManager - */ - -DBusClientManager::DBusClientManager(QObject *parent) - : QDBusAbstractInterface("com.deepin.daemon.Dock", "/dde/dock/ClientManager", staticInterfaceName(), QDBusConnection::sessionBus(), parent) -{ - QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); -} - -DBusClientManager::~DBusClientManager() -{ - QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage))); -} - diff --git a/frame/dbus/dbusclientmanager.h b/frame/dbus/dbusclientmanager.h deleted file mode 100644 index 4ccf9b2a0..000000000 --- a/frame/dbus/dbusclientmanager.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusClientManager -p dbusclientmanager dde-dock-ClientManager.xml - * - * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef DBUSCLIENTMANAGER_H_1465195317 -#define DBUSCLIENTMANAGER_H_1465195317 - -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Proxy class for interface dde.dock.ClientManager - */ -class DBusClientManager: public QDBusAbstractInterface -{ - Q_OBJECT - - Q_SLOT void __propertyChanged__(const QDBusMessage& msg) - { - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName !="dde.dock.ClientManager") - return; - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - foreach(const QString &prop, changedProps.keys()) { - const QMetaObject* self = metaObject(); - for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) { - QMetaProperty p = self->property(i); - if (p.name() == prop) { - Q_EMIT p.notifySignal().invoke(this); - } - } - } - } -public: - static inline const char *staticInterfaceName() - { return "dde.dock.ClientManager"; } - -public: - explicit DBusClientManager(QObject *parent = 0); - - ~DBusClientManager(); - -public Q_SLOTS: // METHODS - inline QDBusPendingReply ActivateWindow(uint in0) - { - QList argumentList; - argumentList << QVariant::fromValue(in0); - return asyncCallWithArgumentList(QStringLiteral("ActivateWindow"), argumentList); - } - - inline QDBusPendingReply CloseWindow(uint in0) - { - QList argumentList; - argumentList << QVariant::fromValue(in0); - return asyncCallWithArgumentList(QStringLiteral("CloseWindow"), argumentList); - } - - inline QDBusPendingReply CurrentActiveWindow() - { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("CurrentActiveWindow"), argumentList); - } - -Q_SIGNALS: // SIGNALS - void ActiveWindowChanged(uint activeWinId); -// begin property changed signals -}; - -namespace dde { - namespace dock { - typedef ::DBusClientManager ClientManager; - } -} -#endif diff --git a/frame/dbus/dbusdisplay.cpp b/frame/dbus/dbusdisplay.cpp index 4ab7f5aa4..9cb7adf5d 100644 --- a/frame/dbus/dbusdisplay.cpp +++ b/frame/dbus/dbusdisplay.cpp @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -p DBusDisplay -c DBusDisplay com.deepin.daemon.Display.xml + * Command line was: qdbusxml2cpp -p DBusDisplay -c DBusDisplay org.deepin.dde.Display1.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * diff --git a/frame/dbus/dbusdisplay.h b/frame/dbus/dbusdisplay.h index ced30d75d..e99cdabab 100644 --- a/frame/dbus/dbusdisplay.h +++ b/frame/dbus/dbusdisplay.h @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -p DBusDisplay -c DBusDisplay com.deepin.daemon.Display.xml + * Command line was: qdbusxml2cpp -p DBusDisplay -c DBusDisplay org.deepin.dde.Display1.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -44,7 +44,7 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, DisplayRect &rect QDebug operator<<(QDebug deg, const DisplayRect &rect); /* - * Proxy class for interface com.deepin.daemon.Display + * Proxy class for interface org.deepin.dde.Display1 */ class DBusDisplay: public QDBusAbstractInterface { @@ -56,7 +56,7 @@ class DBusDisplay: public QDBusAbstractInterface if (3 != arguments.count()) return; QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName !="com.deepin.daemon.Display") + if (interfaceName !="org.deepin.dde.Display1") return; QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); QStringList keys = changedProps.keys(); @@ -72,11 +72,11 @@ class DBusDisplay: public QDBusAbstractInterface } public: static inline const char *staticInterfaceName() - { return "com.deepin.daemon.Display"; } + { return "org.deepin.dde.Display1"; } static inline const char *staticServiceName() - { return "com.deepin.daemon.Display"; } + { return "org.deepin.dde.Display1"; } static inline const char *staticObjectPath() - { return "/com/deepin/daemon/Display"; } + { return "/org/deepin/dde/Display1"; } public: explicit DBusDisplay(QObject *parent = 0); diff --git a/frame/dbus/dbusdockadaptors.h b/frame/dbus/dbusdockadaptors.h index 57527b455..18f060e39 100644 --- a/frame/dbus/dbusdockadaptors.h +++ b/frame/dbus/dbusdockadaptors.h @@ -28,7 +28,7 @@ #include /* - * Adaptor class for interface com.deepin.dde.Dock + * Adaptor class for interface org.deepin.dde.Dock1 */ class QGSettings; class WindowManager; @@ -60,9 +60,9 @@ void registerPluginInfoMetaType(); class DBusDockAdaptors: public QDBusAbstractAdaptor { Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "com.deepin.dde.Dock") + Q_CLASSINFO("D-Bus Interface", "org.deepin.dde.Dock1") Q_CLASSINFO("D-Bus Introspection", "" - " \n" + " \n" " \n" " \n" " " diff --git a/frame/dbus/dockinterface.cpp b/frame/dbus/dockinterface.cpp index 8a5ab875f..05f16acd4 100644 --- a/frame/dbus/dockinterface.cpp +++ b/frame/dbus/dockinterface.cpp @@ -21,9 +21,8 @@ #include "dockinterface.h" -#include "com_deepin_dde_daemon_dock.h" +#include "org_deepin_dde_daemon_dock1.h" -#ifdef USE_AM // 因为 types/dockrect.h 文件中定义了DockRect类,而在此处也定义了DockRect, // 所以在此处先加上DOCKRECT_H宏(types/dockrect.h文件中定义的宏)来禁止包含types/dockrect.h头文件 // 否则会出现重复定义的错误 @@ -61,7 +60,7 @@ public: // 窗管中提供的ActiveWindow接口,MinimizeWindow目前还在开发过程中,因此,关于这两个接口暂时使用v23的后端接口 // 等窗管完成了这几个接口后,删除此处v20的接口,改成v23提供的新接口即可 -using DockInter = com::deepin::dde::daemon::Dock; +using DockInter = org::deepin::dde::daemon::Dock1; /** * @brief 任务栏的部分DBUS接口是通过窗管获取的,由于AM后端并未提供窗管的相关接口,因此, * 此处先将窗管的接口集成进来,作为私有类,只提供任务栏接口使用 @@ -106,7 +105,7 @@ private: WM::WM(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) - , m_dockInter(new DockInter("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) + , m_dockInter(new DockInter("org.deepin.dde.daemon.Dock1", "/org/deepin/dde/daemon/Dock1", QDBusConnection::sessionBus(), this)) { } @@ -337,6 +336,4 @@ void Dde_Dock::onPendingCallFinished(QDBusPendingCallWatcher *w) const auto args = d_ptr->m_waittingCalls.take(callName); CallQueued(callName, args); -} - -#endif +} \ No newline at end of file diff --git a/frame/dbus/dockinterface.h b/frame/dbus/dockinterface.h index 21cc0a4fc..44530470a 100644 --- a/frame/dbus/dockinterface.h +++ b/frame/dbus/dockinterface.h @@ -22,8 +22,6 @@ #ifndef DOCK_INTERFACE #define DOCK_INTERFACE -#ifdef USE_AM - #include "types/dockrect.h" #include @@ -36,7 +34,7 @@ #include /* - * Proxy class for interface com.deepin.dde.daemon.Dock + * Proxy class for interface org.deepin.dde.daemon.Dock1 */ class DockPrivate; class WM; @@ -336,6 +334,5 @@ namespace org { } } -#endif // USE_AM #endif // DOCK_INTERFACE diff --git a/frame/dbus/entryinterface.cpp b/frame/dbus/entryinterface.cpp index dd292f4f5..3d7e1e276 100644 --- a/frame/dbus/entryinterface.cpp +++ b/frame/dbus/entryinterface.cpp @@ -24,9 +24,6 @@ /* * Implementation of interface class __Entry */ - -#ifdef USE_AM - void registerWindowListMetaType() { qRegisterMetaType(); @@ -296,5 +293,3 @@ void Dock_Entry::onPendingCallFinished(QDBusPendingCallWatcher *w) const auto args = d_ptr->m_waittingCalls.take(callName); CallQueued(callName, args); } - -#endif diff --git a/frame/dbus/entryinterface.h b/frame/dbus/entryinterface.h index 08f81640c..2c8513bf5 100644 --- a/frame/dbus/entryinterface.h +++ b/frame/dbus/entryinterface.h @@ -22,8 +22,6 @@ #ifndef DOCK_ENTRY_H #define DOCK_ENTRY_H -#ifdef USE_AM - #define WINDOWLIST_H #define WINDOWINFOLIST_H @@ -65,7 +63,7 @@ void registerWindowInfoMetaType(); void registerWindowInfoMapMetaType(); /* - * Proxy class for interface com.deepin.dde.daemon.Dock.Entry + * Proxy class for interface org.deepin.dde.daemon.Dock1.Entry */ class EntryPrivate; @@ -281,6 +279,4 @@ namespace org { } } -#endif // USE_AM - #endif // DOCK_ENTRY_H diff --git a/frame/dbus/com.deepin.dde.daemon.Dock.xml b/frame/dbus/org.deepin.dde.daemon.Dock1.xml similarity index 96% rename from frame/dbus/com.deepin.dde.daemon.Dock.xml rename to frame/dbus/org.deepin.dde.daemon.Dock1.xml index dc10e442b..4b81b9dea 100644 --- a/frame/dbus/com.deepin.dde.daemon.Dock.xml +++ b/frame/dbus/org.deepin.dde.daemon.Dock1.xml @@ -1,4 +1,4 @@ - + diff --git a/frame/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml b/frame/dbusinterface/xml/org.deepin.dde.Audio1.Sink.xml similarity index 96% rename from frame/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml rename to frame/dbusinterface/xml/org.deepin.dde.Audio1.Sink.xml index 347056803..72f6f68b0 100644 --- a/frame/dbusinterface/xml/org.deepin.daemon.Audio.Sink.xml +++ b/frame/dbusinterface/xml/org.deepin.dde.Audio1.Sink.xml @@ -1,4 +1,4 @@ - + diff --git a/plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.xml b/frame/dbusinterface/xml/org.deepin.dde.Audio1.xml similarity index 97% rename from plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.xml rename to frame/dbusinterface/xml/org.deepin.dde.Audio1.xml index 056518152..7fbe4885f 100644 --- a/plugins/sound/dbusinterface/xml/org.deepin.daemon.Audio.xml +++ b/frame/dbusinterface/xml/org.deepin.dde.Audio1.xml @@ -1,4 +1,4 @@ - + diff --git a/frame/dbusinterface/xml/org.deepin.daemon.Display.xml b/frame/dbusinterface/xml/org.deepin.dde.Display1.xml similarity index 98% rename from frame/dbusinterface/xml/org.deepin.daemon.Display.xml rename to frame/dbusinterface/xml/org.deepin.dde.Display1.xml index 7862b7175..c6e6235b8 100644 --- a/frame/dbusinterface/xml/org.deepin.daemon.Display.xml +++ b/frame/dbusinterface/xml/org.deepin.dde.Display1.xml @@ -1,4 +1,4 @@ - + diff --git a/plugins/tray/dbusinterface/xml/org.deepin.daemon.Gesture.xml b/frame/dbusinterface/xml/org.deepin.dde.Gesture1.xml similarity index 95% rename from plugins/tray/dbusinterface/xml/org.deepin.daemon.Gesture.xml rename to frame/dbusinterface/xml/org.deepin.dde.Gesture1.xml index e28032954..de90b4a78 100644 --- a/plugins/tray/dbusinterface/xml/org.deepin.daemon.Gesture.xml +++ b/frame/dbusinterface/xml/org.deepin.dde.Gesture1.xml @@ -1,4 +1,4 @@ - + diff --git a/frame/dbusinterface/xml/org.deepin.dde.Launcher.xml b/frame/dbusinterface/xml/org.deepin.dde.Launcher1.xml similarity index 100% rename from frame/dbusinterface/xml/org.deepin.dde.Launcher.xml rename to frame/dbusinterface/xml/org.deepin.dde.Launcher1.xml diff --git a/plugins/datetime/dbusinterface/xml/org.deepin.daemon.Timedate.xml b/frame/dbusinterface/xml/org.deepin.dde.Timedate1.xml similarity index 98% rename from plugins/datetime/dbusinterface/xml/org.deepin.daemon.Timedate.xml rename to frame/dbusinterface/xml/org.deepin.dde.Timedate1.xml index 935a74c77..f3a46e3bf 100644 --- a/plugins/datetime/dbusinterface/xml/org.deepin.daemon.Timedate.xml +++ b/frame/dbusinterface/xml/org.deepin.dde.Timedate1.xml @@ -1,4 +1,4 @@ - + diff --git a/frame/dbusinterface/xml/org.deepin.api.XEventMonitor.xml b/frame/dbusinterface/xml/org.deepin.dde.XEventMonitor1.xml similarity index 96% rename from frame/dbusinterface/xml/org.deepin.api.XEventMonitor.xml rename to frame/dbusinterface/xml/org.deepin.dde.XEventMonitor1.xml index f19d6af06..633c6c1d6 100644 --- a/frame/dbusinterface/xml/org.deepin.api.XEventMonitor.xml +++ b/frame/dbusinterface/xml/org.deepin.dde.XEventMonitor1.xml @@ -1,4 +1,4 @@ - + diff --git a/plugins/tray/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml b/frame/dbusinterface/xml/org.deepin.dde.daemon.Dock1.xml similarity index 98% rename from plugins/tray/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml rename to frame/dbusinterface/xml/org.deepin.dde.daemon.Dock1.xml index ce2cec070..e41888c48 100644 --- a/plugins/tray/dbusinterface/xml/com.deepin.dde.daemon.Dock.xml +++ b/frame/dbusinterface/xml/org.deepin.dde.daemon.Dock1.xml @@ -1,4 +1,4 @@ - + diff --git a/frame/display/displaymanager.h b/frame/display/displaymanager.h index 009394adf..a09c007f8 100644 --- a/frame/display/displaymanager.h +++ b/frame/display/displaymanager.h @@ -26,9 +26,9 @@ #include "singleton.h" #include "constants.h" -#include "org_deepin_daemon_display.h" +#include "org_deepin_dde_display1.h" -using DisplayInter = com::deepin::daemon::Display; +using DisplayInter = org::deepin::dde::Display1; using namespace Dock; class QScreen; diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index d6ca1547b..187209e16 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -97,11 +97,7 @@ AppItem::AppItem(DockInter *dockInter, const QGSettings *appSettings, const QGSe connect(m_itemEntryInter, &DockEntryInter::IsActiveChanged, this, static_cast(&AppItem::update)); connect(m_itemEntryInter, &DockEntryInter::WindowInfosChanged, this, &AppItem::updateWindowInfos, Qt::QueuedConnection); connect(m_itemEntryInter, &DockEntryInter::IconChanged, this, &AppItem::refreshIcon); -#ifdef USE_AM connect(m_itemEntryInter, &DockEntryInter::ModeChanged, this, &AppItem::modeChanged); -#else - connect(m_itemEntryInter, &DockEntryInter::IsDockedChanged, this, &AppItem::isDockChanged); -#endif connect(m_updateIconGeometryTimer, &QTimer::timeout, this, &AppItem::updateWindowIconGeometries, Qt::QueuedConnection); connect(m_retryObtainIconTimer, &QTimer::timeout, this, &AppItem::refreshIcon, Qt::QueuedConnection); @@ -216,13 +212,11 @@ bool AppItem::splitWindowOnScreen(ScreenSpliter::SplitDirection direction) return m_screenSpliter->split(direction); } -#ifdef USE_AM int AppItem::mode() const { return m_itemEntryInter->mode(); } -#endif DockEntryInter *AppItem::itemEntryInter() const { @@ -296,9 +290,7 @@ void AppItem::paintEvent(QPaintEvent *e) path.addRoundedRect(backgroundRect, 8, 8); // 在没有开启窗口多开的情况下,显示背景色 -#ifdef USE_AM if (!m_dockInter->showMultiWindow()) { -#endif if (m_active) { QColor color = Qt::black; color.setAlpha(255 * 0.8); @@ -312,9 +304,7 @@ void AppItem::paintEvent(QPaintEvent *e) painter.fillPath(path, color); } } -#ifdef USE_AM } -#endif } else { if (!m_windowInfos.isEmpty()) { QPoint p; @@ -407,21 +397,17 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e) qDebug() << "app item clicked, name:" << m_itemEntryInter->name() << "id:" << m_itemEntryInter->id() << "my-id:" << m_id << "icon:" << m_itemEntryInter->icon(); -#ifdef USE_AM if (m_dockInter->showMultiWindow()) { // 如果开启了多窗口显示,则直接新建一个窗口 m_itemEntryInter->NewInstance(QX11Info::getTimestamp()); } else { -#endif // 如果没有开启新窗口显示,则 m_itemEntryInter->Activate(QX11Info::getTimestamp()); // play launch effect if (m_windowInfos.isEmpty() && DGuiApplicationHelper::isSpecialEffectsEnvironment()) playSwingEffect(); } -#ifdef USE_AM } -#endif } void AppItem::mousePressEvent(QMouseEvent *e) diff --git a/frame/item/appitem.h b/frame/item/appitem.h index 6495718b6..118f505ba 100644 --- a/frame/item/appitem.h +++ b/frame/item/appitem.h @@ -26,7 +26,6 @@ #include "dockitem.h" #include "previewcontainer.h" #include "appdrag.h" -#include "dbusclientmanager.h" #include "../widgets/tipswidget.h" #include "dbusutil.h" @@ -59,9 +58,7 @@ public: void startSplit(const QRect &rect); bool supportSplitWindow(); bool splitWindowOnScreen(ScreenSpliter::SplitDirection direction); -#ifdef USE_AM int mode() const; -#endif DockEntryInter *itemEntryInter() const; inline ItemType itemType() const override { return App; } QPixmap appIcon(){ return m_appIcon; } @@ -80,11 +77,7 @@ signals: void requestUpdateEntryGeometries() const; void windowCountChanged() const; -#ifdef USE_AM void modeChanged(int) const; -#else - void isDockChanged(bool) const; -#endif private: void moveEvent(QMoveEvent *e) override; diff --git a/frame/item/appmultiitem.cpp b/frame/item/appmultiitem.cpp index cabb94260..877ea11a6 100644 --- a/frame/item/appmultiitem.cpp +++ b/frame/item/appmultiitem.cpp @@ -90,9 +90,7 @@ void AppMultiItem::initConnection() void AppMultiItem::onOpen() { -#ifdef USE_AM m_entryInter->ActiveWindow(m_winId); -#endif } void AppMultiItem::onCurrentWindowChanged(uint32_t value) @@ -152,9 +150,7 @@ void AppMultiItem::paintEvent(QPaintEvent *) void AppMultiItem::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { -#ifdef USE_AM m_entryInter->ActiveWindow(m_winId); -#endif } else { QPoint currentPoint = QCursor::pos(); m_menu->exec(currentPoint); diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index 7f1cff367..6c185c5ed 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -24,13 +24,13 @@ #include "utils.h" #include "displaymanager.h" -#include "org_deepin_api_xeventmonitor.h" +#include "org_deepin_dde_xeventmonitor1.h" #define SPLIT_NONE 0 #define SPLIT_LEFT 1 #define SPLIT_RIGHT 2 -using XEventMonitor = ::org::deepin::api::XEventMonitor1; +using XEventMonitor = ::org::deepin::dde::XEventMonitor1; AppDragWidget::AppDragWidget(QWidget *parent) : QGraphicsView(parent) diff --git a/frame/main.cpp b/frame/main.cpp index 16bc9890b..def51f55a 100644 --- a/frame/main.cpp +++ b/frame/main.cpp @@ -241,8 +241,8 @@ int main(int argc, char *argv[]) // 注册任务栏的DBus服务 DBusDockAdaptors adaptor(&windowManager); - QDBusConnection::sessionBus().registerService("com.deepin.dde.Dock"); - QDBusConnection::sessionBus().registerObject("/com/deepin/dde/Dock", "com.deepin.dde.Dock", &windowManager); + QDBusConnection::sessionBus().registerService("org.deepin.dde.Dock1"); + QDBusConnection::sessionBus().registerObject("/org/deepin/dde/Dock1", "org.deepin.dde.Dock1", &windowManager); // 当任务栏以-r参数启动时,设置CANSHOW未false,之后调用launch不显示任务栏 qApp->setProperty("CANSHOW", !parser.isSet(runOption)); diff --git a/frame/util/dbusutil.h b/frame/util/dbusutil.h index f9c8ff4d3..3738a4194 100644 --- a/frame/util/dbusutil.h +++ b/frame/util/dbusutil.h @@ -21,20 +21,14 @@ #ifndef DBUSUTIL_H #define DBUSUTIL_H -#ifdef USE_AM #include "dockinterface.h" #include "entryinterface.h" -#else -#include -#include -#endif -#ifdef USE_AM using DockInter = org::deepin::dde::daemon::DdeDock; using DockEntryInter = org::deepin::dde::daemon::dock::DockEntry; -const QString xEventMonitorService = "org.deepin.api.XEventMonitor1"; -const QString xEventMonitorPath = "/org/deepin/api/XEventMonitor1"; +const QString xEventMonitorService = "org.deepin.dde.XEventMonitor1"; +const QString xEventMonitorPath = "/org/deepin/dde/XEventMonitor1"; const QString launcherService = "org.deepin.dde.Launcher1"; const QString launcherPath = "/org/deepin/dde/Launcher1"; @@ -44,53 +38,22 @@ const QString controllCenterService = "org.deepin.dde.ControlCenter1"; const QString controllCenterPath = "/org/deepin/dde/ControlCenter1"; const QString controllCenterInterface = "org.deepin.dde.ControlCenter1"; -const QString notificationService = "com.deepin.dde.Notification"; -const QString notificationPath = "/com/deepin/dde/Notification"; -const QString notificationInterface = "com.deepin.dde.Notification"; +const QString notificationService = "org.deepin.dde.Notification1"; +const QString notificationPath = "/org/deepin/dde/Notification1"; +const QString notificationInterface = "org.deepin.dde.Notification1"; -const QString sessionManagerService = "com.deepin.SessionManager"; -const QString sessionManagerPath = "/com/deepin/SessionManager"; -const QString sessionManagerInterface = "com.deepin.SessionManager"; -#else -using DockInter = com::deepin::dde::daemon::Dock; -using DockEntryInter = com::deepin::dde::daemon::dock::Entry; - -const QString xEventMonitorService = "com.deepin.api.XEventMonitor"; -const QString xEventMonitorPath = "/com/deepin/api/XEventMonitor"; - -const QString launcherService = "com.deepin.dde.Launcher"; -const QString launcherPath = "/com/deepin/dde/Launcher"; -const QString launcherInterface = "com.deepin.dde.Launcher"; - -const QString controllCenterService = "com.deepin.dde.ControlCenter"; -const QString controllCenterPath = "/com/deepin/dde/ControlCenter"; -const QString controllCenterInterface = "com.deepin.dde.ControlCenter"; - -const QString notificationService = "com.deepin.dde.Notification"; -const QString notificationPath = "/com/deepin/dde/Notification"; -const QString notificationInterface = "com.deepin.dde.Notification"; - -const QString sessionManagerService = "com.deepin.SessionManager"; -const QString sessionManagerPath = "/com/deepin/SessionManager"; -const QString sessionManagerInterface = "com.deepin.SessionManager"; -#endif +const QString sessionManagerService = "org.deepin.dde.SessionManager1"; +const QString sessionManagerPath = "/org/deepin/dde/SessionManager1"; +const QString sessionManagerInterface = "org.deepin.dde.SessionManager1"; inline const QString dockServiceName() { -#ifdef USE_AM return QString("org.deepin.dde.daemon.Dock1"); -#else - return QString("com.deepin.dde.daemon.Dock"); -#endif } inline const QString dockServicePath() { -#ifdef USE_AM return QString("/org/deepin/dde/daemon/Dock1"); -#else - return QString("/com/deepin/dde/daemon/Dock"); -#endif } #endif // DBUSUTIL_H diff --git a/frame/util/dockpopupwindow.h b/frame/util/dockpopupwindow.h index 81b1af7a1..c96695be4 100644 --- a/frame/util/dockpopupwindow.h +++ b/frame/util/dockpopupwindow.h @@ -22,7 +22,7 @@ #ifndef DOCKPOPUPWINDOW_H #define DOCKPOPUPWINDOW_H -#include "org_deepin_api_xeventmonitor.h" +#include "org_deepin_dde_xeventmonitor1.h" #include #include @@ -31,7 +31,7 @@ DWIDGET_USE_NAMESPACE DGUI_USE_NAMESPACE -using XEventMonitor = ::org::deepin::api::XEventMonitor1; +using XEventMonitor = org::deepin::dde::XEventMonitor1; class DockPopupWindow : public Dtk::Widget::DArrowRectangle { diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index a260fabfe..91e18dcd2 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -155,21 +155,12 @@ void MenuWorker::createMenu(QMenu *settingsMenu) void MenuWorker::onDockSettingsTriggered() { -#ifdef USE_AM DDBusSender().service(controllCenterService) .path(controllCenterPath) .interface(controllCenterInterface) .method("ShowPage") .arg(QString("personalization/desktop/dock")) .call(); -#else - DDBusSender().service(controllCenterService) - .path("controllCenterPath") - .interface(controllCenterInterface) - .method("ShowPage") - .arg(QString("personalization/dock")) - .call(); -#endif } void MenuWorker::exec() diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 314e63aa1..e24141166 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -113,35 +113,6 @@ void MultiScreenWorker::onAutoHideChanged(const bool autoHide) } } -#ifndef USE_AM -void MultiScreenWorker::handleDbusSignal(QDBusMessage msg) -{ - QList arguments = msg.arguments(); - // 参数固定长度 - if (3 != arguments.count()) - return; - - // 返回的数据中,这一部分对应的是数据发送方的interfacename,可判断是否是自己需要的服务 - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != DockInter::staticInterfaceName()) - return; - - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - QStringList keys = changedProps.keys(); - foreach (const QString &prop, keys) { - if (prop == "Position") { - onPositionChanged(changedProps.value(prop).toInt()); - } else if (prop == "DisplayMode") { - onDisplayModeChanged(changedProps.value(prop).toInt()); - } else if (prop == "HideMode") { - onHideModeChanged(changedProps.value(prop).toInt()); - } else if (prop == "HideState") { - onHideStateChanged(changedProps.value(prop).toInt()); - } - } -} -#endif - void MultiScreenWorker::onRegionMonitorChanged(int x, int y, const QString &key) { if (m_registerKey != key || testState(MousePress)) @@ -601,18 +572,10 @@ void MultiScreenWorker::initConnection() connect(m_launcherInter, static_cast(&DBusLuncher::VisibleChanged), this, [ = ](bool value) { setStates(LauncherDisplay, value); }); -#ifdef USE_AM connect(m_dockInter, &DockInter::PositionChanged, this, &MultiScreenWorker::onPositionChanged); connect(m_dockInter, &DockInter::DisplayModeChanged, this, &MultiScreenWorker::onDisplayModeChanged); connect(m_dockInter, &DockInter::HideModeChanged, this, &MultiScreenWorker::onHideModeChanged); connect(m_dockInter, &DockInter::HideStateChanged, this, &MultiScreenWorker::onHideStateChanged); -#else - QDBusConnection::sessionBus().connect(dockServiceName(), dockServicePath(), - "org.freedesktop.DBus.Properties", - "PropertiesChanged", - "sa{sv}as", - this, SLOT(handleDbusSignal(QDBusMessage))); -#endif connect(this, &MultiScreenWorker::requestUpdatePosition, this, &MultiScreenWorker::onRequestUpdatePosition); connect(this, &MultiScreenWorker::requestUpdateMonitorInfo, this, &MultiScreenWorker::onRequestUpdateMonitorInfo); @@ -734,7 +697,7 @@ void MultiScreenWorker::resetDockScreen() /** * @brief checkDaemonDockService - * 避免com.deepin.dde.daemon.Dock服务比dock晚启动,导致dock启动后的状态错误 + * org.deepin.dde.daemon.Dock1服务比dock晚启动,导致dock启动后的状态错误 */ void MultiScreenWorker::checkDaemonDockService() { @@ -828,7 +791,7 @@ bool MultiScreenWorker::isCursorOut(int x, int y) /** * @brief checkDaemonXEventMonitorService - * 避免com.deepin.api.XEventMonitor服务比dock晚启动,导致dock启动后的状态错误 + * org.deepin.dde.XEventMonitor1服务比dock晚启动,导致dock启动后的状态错误 */ void MultiScreenWorker::checkXEventMonitorService() { diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index 2ae61f496..dc5b517ad 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -28,8 +28,8 @@ #include "xcb_misc.h" #include "dbusutil.h" -#include "org_deepin_api_xeventmonitor.h" -#include "org_deepin_dde_launcher.h" +#include "org_deepin_dde_xeventmonitor1.h" +#include "org_deepin_dde_launcher1.h" #include @@ -53,7 +53,7 @@ DGUI_USE_NAMESPACE #define DRAG_AREA_SIZE (5) #define DOCKSPACE (WINDOWMARGIN * 2) -using XEventMonitor = ::org::deepin::api::XEventMonitor1; +using XEventMonitor = ::org::deepin::dde::XEventMonitor1; using DBusLuncher = ::org::deepin::dde::Launcher1; using namespace Dock; @@ -129,10 +129,6 @@ public slots: void onAutoHideChanged(const bool autoHide); void onRequestUpdateRegionMonitor(); -#ifndef USE_AM - void handleDbusSignal(QDBusMessage); -#endif - private slots: // Region Monitor void onRegionMonitorChanged(int x, int y, const QString &key); diff --git a/frame/util/touchsignalmanager.cpp b/frame/util/touchsignalmanager.cpp index 1b8f7328e..f866818f5 100644 --- a/frame/util/touchsignalmanager.cpp +++ b/frame/util/touchsignalmanager.cpp @@ -11,7 +11,7 @@ TouchSignalManager *TouchSignalManager::m_touchManager = nullptr; TouchSignalManager::TouchSignalManager(QObject *parent) : QObject(parent) - , m_gestureInter(new Gesture("com.deepin.daemon.Gesture", "/com/deepin/daemon/Gesture", QDBusConnection::systemBus(), this)) + , m_gestureInter(new Gesture("org.deepin.dde.Gesture1", "/org/deepin/dde/Gesture1", QDBusConnection::systemBus(), this)) , m_dragIconPressed(false) { // 处理后端触屏信号 diff --git a/frame/util/touchsignalmanager.h b/frame/util/touchsignalmanager.h index 3cd09fd7e..188f93e3f 100644 --- a/frame/util/touchsignalmanager.h +++ b/frame/util/touchsignalmanager.h @@ -22,11 +22,11 @@ #ifndef TOUCHSIGNALMANAGER_H #define TOUCHSIGNALMANAGER_H -#include "org_deepin_daemon_gesture.h" +#include "org_deepin_dde_gesture1.h" #include -using Gesture = com::deepin::daemon::Gesture1; +using Gesture = org::deepin::dde::Gesture1; class TouchSignalManager : public QObject { diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index aa6f2310b..a4144cd07 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -44,7 +44,7 @@ static QMap timeFormat{{0, "h:mm"}, {1, "hh:mm"}}; DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent) : QWidget (parent) - , m_timedateInter(new Timedate("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", QDBusConnection::sessionBus(), this)) + , m_timedateInter(new Timedate("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", QDBusConnection::sessionBus(), this)) , m_position(Dock::Position::Bottom) , m_dateFont(DFontSizeManager::instance()->t10()) , m_tipsWidget(new Dock::TipsWidget(this)) @@ -156,9 +156,9 @@ void DateTimeDisplayer::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event); - DDBusSender().service("org.deepin.dde.Widgets") + DDBusSender().service("org.deepin.dde.Widgets1") .path("/") - .interface("org.deepin.dde.Widgets") + .interface("org.deepin.dde.Widgets1") .method("Toggle").call(); } diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index 37fa224f9..d21ea6cdd 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -23,7 +23,7 @@ #include "constants.h" -#include "org_deepin_daemon_timedate.h" +#include "org_deepin_dde_timedate1.h" #include #include @@ -33,7 +33,7 @@ namespace Dock { class TipsWidget; } class DockPopupWindow; class QMenu; -using Timedate = org::deepin::daemon::Timedate1; +using Timedate = org::deepin::dde::Timedate1; class DateTimeDisplayer : public QWidget { diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 45b7eea9d..4fe441b9b 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -319,10 +319,9 @@ void MainPanelControl::dockRecentApp(DockItem *dockItem) return; // 如果控制中心设置不开启最近应用,则不让其驻留 -#ifdef USE_AM if (!m_dockInter->showRecent()) return; -#endif + // 如果控制中心开启了最近应用并且当前应用是未驻留应用,则可以驻留 if (!appItem->isDocked()) appItem->requestDock(); diff --git a/frame/window/tray/dbustraymanager.h b/frame/window/tray/dbustraymanager.h index f47136cb5..bdf313b95 100644 --- a/frame/window/tray/dbustraymanager.h +++ b/frame/window/tray/dbustraymanager.h @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager org.deepin.dde.TrayManager.xml + * Command line was: qdbusxml2cpp -c DBusTrayManager -p dbustraymanager org.deepin.dde.TrayManager1.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * diff --git a/frame/window/tray/widgets/indicatortrayitem.cpp b/frame/window/tray/widgets/indicatortrayitem.cpp index b37a9a81c..361882edc 100644 --- a/frame/window/tray/widgets/indicatortrayitem.cpp +++ b/frame/window/tray/widgets/indicatortrayitem.cpp @@ -57,8 +57,8 @@ IndicatorTrayItem::IndicatorTrayItem(const QString &indicatorName, QWidget *pare setLayout(layout); // register dbus - auto path = QString("/com/deepin/dde/Dock/Indicator/") + m_indicatorName; - auto interface = QString("com.deepin.dde.Dock.Indicator.") + m_indicatorName; + auto path = QString("/org/deepin/dde/Dock1/Indicator/") + m_indicatorName; + auto interface = QString("org.deepin.dde.Dock1.Indicator.") + m_indicatorName; auto sessionBus = QDBusConnection::sessionBus(); sessionBus.registerObject(path, interface, diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 7631dc43a..9f49601f2 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -24,7 +24,7 @@ #include "constants.h" #include "dbusutil.h" -#include "org_deepin_daemon_timedate.h" +#include "org_deepin_dde_timedate1.h" #include @@ -33,7 +33,7 @@ namespace Dtk { namespace Gui { class DRegionMonitor; }; using namespace Dtk::Widget; -using Timedate = org::deepin::daemon::Timedate1; +using Timedate = org::deepin::dde::Timedate1; class QuickPluginWindow; class QBoxLayout; diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 536c3f2ff..7d9b2975d 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -115,7 +115,7 @@ void WindowManager::sendNotifications() QStringList actionButton; actionButton << "reload" << tr("Exit Safe Mode"); QVariantMap hints; - hints["x-deepin-action-reload"] = QString("dbus-send,--session,--dest=com.deepin.dde.Dock,--print-reply,/com/deepin/dde/Dock,com.deepin.dde.Dock.ReloadPlugins"); + hints["x-deepin-action-reload"] = QString("dbus-send,--session,--dest=org.deepin.dde.Dock1,--print-reply,/org/deepin/dde/Dock1,org.deepin.dde.Dock1.ReloadPlugins"); // 在进入安全模式时,执行此DBUS耗时25S左右,导致任务栏显示阻塞,所以使用线程调用 QtConcurrent::run(QThreadPool::globalInstance(), [ = ] { DDBusSender() @@ -655,7 +655,7 @@ void WindowManager::onChangeDockPosition(QString fromScreen, QString toScreen, c void WindowManager::onRequestUpdateFrontendGeometry() { QRect rect = getDockGeometry(true); - // 向com.deepin.dde.daemon.Dock的SetFrontendWindowRect接口设置区域时,此区域的高度或宽度不能为0,否则会导致其HideState属性循环切换,造成任务栏循环显示或隐藏 + // org.deepin.dde.daemon.Dock1的SetFrontendWindowRect接口设置区域时,此区域的高度或宽度不能为0,否则会导致其HideState属性循环切换,造成任务栏循环显示或隐藏 if (rect.width() == 0 || rect.height() == 0) return; diff --git a/interfaces/constants.h b/interfaces/constants.h index 08a8b8b3b..9def9a1e5 100644 --- a/interfaces/constants.h +++ b/interfaces/constants.h @@ -70,11 +70,7 @@ enum DisplayMode { enum HideMode { KeepShowing = 0, KeepHidden = 1, -#ifdef USE_AM - SmartHide = 2, -#else - SmartHide = 3, -#endif + SmartHide = 2 }; #define PROP_POSITION "Position" diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 3d57fffe6..7f830eb24 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,5 +1,4 @@ #add_subdirectory("datetime") -#add_subdirectory("disk-mount") add_subdirectory("shutdown") add_subdirectory("power") add_subdirectory("sound") diff --git a/plugins/airplane-mode/airplanemodeitem.cpp b/plugins/airplane-mode/airplanemodeitem.cpp index 7147307c3..29c3ca882 100644 --- a/plugins/airplane-mode/airplanemodeitem.cpp +++ b/plugins/airplane-mode/airplanemodeitem.cpp @@ -43,8 +43,8 @@ AirplaneModeItem::AirplaneModeItem(QWidget *parent) : QWidget(parent) , m_tipsLabel(new Dock::TipsWidget(this)) , m_applet(new AirplaneModeApplet(this)) - , m_airplaneModeInter(new DBusAirplaneMode("org.deepin.daemon.AirplaneMode1", - "/org/deepin/daemon/AirplaneMode1", + , m_airplaneModeInter(new DBusAirplaneMode("org.deepin.dde.AirplaneMode1", + "/org/deepin/dde/AirplaneMode1", QDBusConnection::systemBus(), this)) { @@ -113,7 +113,6 @@ void AirplaneModeItem::invokeMenuItem(const QString menuId, const bool checked) if (menuId == SHIFT) m_airplaneModeInter->Enable(!m_airplaneModeInter->enabled()); else if (menuId == SETTINGS) -#ifdef USE_AM DDBusSender() .service("org.deepin.dde.ControlCenter1") .interface("org.deepin.dde.ControlCenter1") @@ -122,16 +121,6 @@ void AirplaneModeItem::invokeMenuItem(const QString menuId, const bool checked) .arg(QString("network")) .arg(QString("Airplane Mode")) .call(); -#else - DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowPage")) - .arg(QString("network")) - .arg(QString("Airplane Mode")) - .call(); -#endif */ } diff --git a/plugins/airplane-mode/airplanemodeitem.h b/plugins/airplane-mode/airplanemodeitem.h index 8517d475d..6987aed0b 100644 --- a/plugins/airplane-mode/airplanemodeitem.h +++ b/plugins/airplane-mode/airplanemodeitem.h @@ -23,11 +23,11 @@ #ifndef AIRPLANEMODEITEM_H #define AIRPLANEMODEITEM_H -#include "org_deepin_daemon_airplanemode.h" +#include "org_deepin_dde_airplanemode1.h" #include -using DBusAirplaneMode = org::deepin::daemon::AirplaneMode1; +using DBusAirplaneMode = org::deepin::dde::AirplaneMode1; namespace Dock { class TipsWidget; diff --git a/plugins/airplane-mode/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml b/plugins/airplane-mode/dbusinterface/xml/org.deepin.dde.AirplaneMode1.xml similarity index 91% rename from plugins/airplane-mode/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml rename to plugins/airplane-mode/dbusinterface/xml/org.deepin.dde.AirplaneMode1.xml index b558d3014..31a4284b4 100644 --- a/plugins/airplane-mode/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml +++ b/plugins/airplane-mode/dbusinterface/xml/org.deepin.dde.AirplaneMode1.xml @@ -1,4 +1,4 @@ - + diff --git a/plugins/bluetooth/bluetooth.json b/plugins/bluetooth/bluetooth.json index 8400bab79..eb60829b1 100644 --- a/plugins/bluetooth/bluetooth.json +++ b/plugins/bluetooth/bluetooth.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "org.deepin.daemon.Bluetooth1" + "depends-daemon-dbus-service": "org.deepin.dde.Bluetooth1" } diff --git a/plugins/bluetooth/bluetoothitem.cpp b/plugins/bluetooth/bluetoothitem.cpp index daf706d0f..d025eb19b 100644 --- a/plugins/bluetooth/bluetoothitem.cpp +++ b/plugins/bluetooth/bluetoothitem.cpp @@ -119,7 +119,6 @@ void BluetoothItem::invokeMenuItem(const QString menuId, const bool checked) if (menuId == SHIFT) { m_applet->setAdapterPowered(!m_adapterPowered); } else if (menuId == SETTINGS) { -#ifdef USE_AM DDBusSender() .service("org.deepin.dde.ControlCenter1") .interface("org.deepin.dde.ControlCenter1") @@ -127,15 +126,6 @@ void BluetoothItem::invokeMenuItem(const QString menuId, const bool checked) .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); -#else - DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowPage")) - .arg(QString("bluetooth")) - .call(); -#endif } } diff --git a/plugins/bluetooth/componments/adaptersmanager.cpp b/plugins/bluetooth/componments/adaptersmanager.cpp index 3307e1165..3c4c266f5 100644 --- a/plugins/bluetooth/componments/adaptersmanager.cpp +++ b/plugins/bluetooth/componments/adaptersmanager.cpp @@ -31,8 +31,8 @@ AdaptersManager::AdaptersManager(QObject *parent) : QObject(parent) - , m_bluetoothInter(new DBusBluetooth("org.deepin.daemon.Bluetooth1", - "/org/deepin/daemon/Bluetooth1", + , m_bluetoothInter(new DBusBluetooth("org.deepin.dde.Bluetooth1", + "/org/deepin/dde/Bluetooth1", QDBusConnection::sessionBus(), this)) { @@ -65,9 +65,9 @@ AdaptersManager::AdaptersManager(QObject *parent) }); #endif - QDBusInterface inter("org.deepin.daemon.Bluetooth1", - "/org/deepin/daemon/Bluetooth1", - "org.deepin.daemon.Bluetooth1", + QDBusInterface inter("org.deepin.dde.Bluetooth1", + "/org/deepin/dde/Bluetooth1", + "org.deepin.dde.Bluetooth1", QDBusConnection::sessionBus()); QDBusReply reply = inter.call(QDBus::Block, "GetAdapters"); const QString replyStr = reply.value(); diff --git a/plugins/bluetooth/componments/adaptersmanager.h b/plugins/bluetooth/componments/adaptersmanager.h index 598cb53e5..223d9d684 100644 --- a/plugins/bluetooth/componments/adaptersmanager.h +++ b/plugins/bluetooth/componments/adaptersmanager.h @@ -23,8 +23,8 @@ #ifndef ADAPTERSMANAGER_H #define ADAPTERSMANAGER_H -#include "org_deepin_daemon_bluetooth.h" -using DBusBluetooth = org::deepin::daemon::Bluetooth1; +#include "org_deepin_dde_bluetooth1.h" +using DBusBluetooth = org::deepin::dde::Bluetooth1; class Adapter; class Device; diff --git a/plugins/bluetooth/componments/bluetoothadapteritem.cpp b/plugins/bluetooth/componments/bluetoothadapteritem.cpp index 77f563160..697d5c21e 100644 --- a/plugins/bluetooth/componments/bluetoothadapteritem.cpp +++ b/plugins/bluetooth/componments/bluetoothadapteritem.cpp @@ -150,7 +150,7 @@ BluetoothAdapterItem::BluetoothAdapterItem(Adapter *adapter, QWidget *parent) , m_itemDelegate(new DStyledItemDelegate(m_deviceListview)) , m_deviceModel(new QStandardItemModel(m_deviceListview)) , m_refreshBtn(new RefreshButton(this)) - , m_bluetoothInter(new DBusBluetooth("org.deepin.daemon.Bluetooth1", "/org/deepin/daemon/Bluetooth1", QDBusConnection::sessionBus(), this)) + , m_bluetoothInter(new DBusBluetooth("org.deepin.dde.Bluetooth1", "/org/deepin/dde/Bluetooth1", QDBusConnection::sessionBus(), this)) , m_showUnnamedDevices(false) , m_seperator(new HorizontalSeperator(this)) { diff --git a/plugins/bluetooth/componments/bluetoothadapteritem.h b/plugins/bluetooth/componments/bluetoothadapteritem.h index b26408a5b..489c63ea4 100644 --- a/plugins/bluetooth/componments/bluetoothadapteritem.h +++ b/plugins/bluetooth/componments/bluetoothadapteritem.h @@ -32,9 +32,9 @@ #include #include -#include "org_deepin_daemon_bluetooth.h" +#include "org_deepin_dde_bluetooth1.h" -using DBusBluetooth = org::deepin::daemon::Bluetooth1; +using DBusBluetooth = org::deepin::dde::Bluetooth1; DWIDGET_USE_NAMESPACE diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index bd5077f8f..550721711 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -121,7 +121,7 @@ BluetoothApplet::BluetoothApplet(AdaptersManager *adapterManager, QWidget *paren , m_mainLayout(new QVBoxLayout(this)) , m_contentLayout(new QVBoxLayout(m_contentWidget)) , m_seperator(new HorizontalSeperator(this)) - , m_airPlaneModeInter(new DBusAirplaneMode("org.deepin.daemon.AirplaneMode1", "/org/deepin/daemon/AirplaneMode1", QDBusConnection::systemBus(), this)) + , m_airPlaneModeInter(new DBusAirplaneMode("org.deepin.dde.AirplaneMode1", "/org/deepin/dde/AirplaneMode1", QDBusConnection::systemBus(), this)) , m_airplaneModeEnable(false) { initUi(); @@ -283,7 +283,6 @@ void BluetoothApplet::initConnect() connect(m_adaptersManager, &AdaptersManager::adapterIncreased, this, &BluetoothApplet::onAdapterAdded); connect(m_adaptersManager, &AdaptersManager::adapterDecreased, this, &BluetoothApplet::onAdapterRemoved); connect(m_settingLabel, &SettingLabel::clicked, this, [ = ] { -#ifdef USE_AM DDBusSender() .service("org.deepin.dde.ControlCenter1") .interface("org.deepin.dde.ControlCenter1") @@ -291,15 +290,6 @@ void BluetoothApplet::initConnect() .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); -#else - DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowPage")) - .arg(QString("bluetooth")) - .call(); -#endif }); connect(DApplicationHelper::instance(), &DApplicationHelper::themeTypeChanged, this, &BluetoothApplet::updateIconTheme); connect(m_airPlaneModeInter, &DBusAirplaneMode::EnabledChanged, this, &BluetoothApplet::setAirplaneModeEnabled); diff --git a/plugins/bluetooth/componments/bluetoothapplet.h b/plugins/bluetooth/componments/bluetoothapplet.h index ccf8f9c8d..2eada4c6f 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.h +++ b/plugins/bluetooth/componments/bluetoothapplet.h @@ -29,7 +29,7 @@ #include -#include "org_deepin_daemon_airplanemode.h" +#include "org_deepin_dde_airplanemode1.h" class QVBoxLayout; class QHBoxLayout; @@ -48,7 +48,7 @@ DWIDGET_END_NAMESPACE DWIDGET_USE_NAMESPACE -using DBusAirplaneMode = org::deepin::daemon::AirplaneMode1; +using DBusAirplaneMode = org::deepin::dde::AirplaneMode1; class SettingLabel : public QWidget { diff --git a/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml b/plugins/bluetooth/dbusinterface/xml/org.deepin.dde.AirplaneMode1.xml similarity index 91% rename from plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml rename to plugins/bluetooth/dbusinterface/xml/org.deepin.dde.AirplaneMode1.xml index b558d3014..31a4284b4 100644 --- a/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.AirplaneMode.xml +++ b/plugins/bluetooth/dbusinterface/xml/org.deepin.dde.AirplaneMode1.xml @@ -1,4 +1,4 @@ - + diff --git a/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.Bluetooth.xml b/plugins/bluetooth/dbusinterface/xml/org.deepin.dde.Bluetooth1.xml similarity index 99% rename from plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.Bluetooth.xml rename to plugins/bluetooth/dbusinterface/xml/org.deepin.dde.Bluetooth1.xml index 289f981c5..2060c2fa1 100644 --- a/plugins/bluetooth/dbusinterface/xml/org.deepin.daemon.Bluetooth.xml +++ b/plugins/bluetooth/dbusinterface/xml/org.deepin.dde.Bluetooth1.xml @@ -1,4 +1,4 @@ - + diff --git a/plugins/datetime/datetime.json b/plugins/datetime/datetime.json index 783887388..b69248a3b 100644 --- a/plugins/datetime/datetime.json +++ b/plugins/datetime/datetime.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "depends-daemon-dbus-service": "org.deepin.daemon.Timedate1" + "depends-daemon-dbus-service": "org.deepin.dde.Timedate1" } diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index 99716be84..de63bdf82 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -42,7 +42,7 @@ DatetimePlugin::DatetimePlugin(QObject *parent) , m_pluginLoaded(false) { QDBusConnection sessionBus = QDBusConnection::sessionBus(); - sessionBus.connect("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(propertiesChanged())); + sessionBus.connect("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(propertiesChanged())); } PluginsItemInterface::PluginSizePolicy DatetimePlugin::pluginSizePolicy() const @@ -149,7 +149,7 @@ const QString DatetimePlugin::itemCommand(const QString &itemKey) { Q_UNUSED(itemKey); - return "dbus-send --print-reply --dest=org.deepin.dde.Widgets / org.deepin.dde.Widgets.Toggle"; + return "dbus-send --print-reply --dest=org.deepin.dde.Widgets1 /org/deepin/dde/Widgets1 org.deepin.dde.Widgets1.Toggle"; } const QString DatetimePlugin::itemContextMenu(const QString &itemKey) @@ -190,7 +190,6 @@ void DatetimePlugin::invokedMenuItem(const QString &itemKey, const QString &menu Q_UNUSED(checked) if (menuId == "open") { -#ifdef USE_AM DDBusSender() .service("org.deepin.dde.ControlCenter1") .interface("org.deepin.dde.ControlCenter1") @@ -198,15 +197,6 @@ void DatetimePlugin::invokedMenuItem(const QString &itemKey, const QString &menu .method(QString("ShowPage")) .arg(QString("datetime")) .call(); -#else - DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .method(QString("ShowPage")) - .arg(QString("datetime")) - .call(); -#endif } else { const bool value = timedateInterface()->property(TIME_FORMAT_KEY).toBool(); timedateInterface()->setProperty(TIME_FORMAT_KEY, !value); @@ -268,11 +258,11 @@ void DatetimePlugin::propertiesChanged() QDBusInterface* DatetimePlugin::timedateInterface() { if (!m_interface) { - if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.deepin.daemon.Timedate1")) { - m_interface = new QDBusInterface("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", "org.deepin.daemon.Timedate1", QDBusConnection::sessionBus(), this); + if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.deepin.dde.Timedate1")) { + m_interface = new QDBusInterface("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", "org.deepin.dde.Timedate1", QDBusConnection::sessionBus(), this); } else { - const QString path = QString("/org/deepin/daemon/Accounts/User%1").arg(QString::number(getuid())); - QDBusInterface * systemInterface = new QDBusInterface("org.deepin.daemon.Accounts1", path, "org.deepin.daemon.Accounts.User", + const QString path = QString("/org/deepin/dde/Accounts1/User%1").arg(QString::number(getuid())); + QDBusInterface * systemInterface = new QDBusInterface("org.deepin.dde.Accounts1", path, "org.deepin.dde.Accounts1.User", QDBusConnection::systemBus(), this); return systemInterface; } diff --git a/plugins/datetime/datetimewidget.cpp b/plugins/datetime/datetimewidget.cpp index 8d34940ce..dfbcb0e77 100644 --- a/plugins/datetime/datetimewidget.cpp +++ b/plugins/datetime/datetimewidget.cpp @@ -40,7 +40,7 @@ DatetimeWidget::DatetimeWidget(QWidget *parent) : QWidget(parent) , m_24HourFormat(false) , m_timeOffset(false) - , m_timedateInter(new Timedate("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", QDBusConnection::sessionBus(), this)) + , m_timedateInter(new Timedate("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", QDBusConnection::sessionBus(), this)) , m_shortDateFormat("yyyy-MM-dd") , m_shortTimeFormat("hh:mm") { diff --git a/plugins/datetime/datetimewidget.h b/plugins/datetime/datetimewidget.h index 21a2e60bf..f1faa02e1 100644 --- a/plugins/datetime/datetimewidget.h +++ b/plugins/datetime/datetimewidget.h @@ -22,11 +22,11 @@ #ifndef DATETIMEWIDGET_H #define DATETIMEWIDGET_H -#include "org_deepin_daemon_timedate.h" +#include "org_deepin_dde_timedate1.h" #include -using Timedate = org::deepin::daemon::Timedate1; +using Timedate = org::deepin::dde::Timedate1; class DatetimeWidget : public QWidget { diff --git a/frame/dbusinterface/xml/org.deepin.daemon.Timedate.xml b/plugins/datetime/dbusinterface/xml/org.deepin.dde.Timedate1.xml similarity index 98% rename from frame/dbusinterface/xml/org.deepin.daemon.Timedate.xml rename to plugins/datetime/dbusinterface/xml/org.deepin.dde.Timedate1.xml index 935a74c77..f3a46e3bf 100644 --- a/frame/dbusinterface/xml/org.deepin.daemon.Timedate.xml +++ b/plugins/datetime/dbusinterface/xml/org.deepin.dde.Timedate1.xml @@ -1,4 +1,4 @@ - + diff --git a/plugins/disk-mount/CMakeLists.txt b/plugins/disk-mount/CMakeLists.txt deleted file mode 100644 index e9ec9bb55..000000000 --- a/plugins/disk-mount/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ - -set(PLUGIN_NAME "disk-mount") - -project(${PLUGIN_NAME}) - -# Sources files -file(GLOB SRCS "*.h" "*.cpp") - -find_package(PkgConfig REQUIRED) -find_package(Qt5Widgets REQUIRED) -find_package(Qt5Svg REQUIRED) -find_package(Qt5DBus REQUIRED) -find_package(DtkWidget REQUIRED) - -add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") -add_library(${PLUGIN_NAME} SHARED ${SRCS} resources.qrc) -set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../) -target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ../../interfaces) -target_link_libraries(${PLUGIN_NAME} PRIVATE - ${DtkWidget_LIBRARIES} - ${Qt5Widgets_LIBRARIES} - ${Qt5Svg_LIBRARIES} - ${Qt5DBus_LIBRARIES} -) - -install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) diff --git a/plugins/disk-mount/dbus/com.deepin.daemon.DiskMount.xml b/plugins/disk-mount/dbus/com.deepin.daemon.DiskMount.xml deleted file mode 100644 index f0ad16d00..000000000 --- a/plugins/disk-mount/dbus/com.deepin.daemon.DiskMount.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/disk-mount/dbus/dbusdiskmount.cpp b/plugins/disk-mount/dbus/dbusdiskmount.cpp deleted file mode 100644 index faa781e8f..000000000 --- a/plugins/disk-mount/dbus/dbusdiskmount.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusDiskMount -p dbusdiskmount com.deepin.daemon.DiskMount.xml - * - * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "dbusdiskmount.h" - -/* - * Implementation of interface class DBusDiskMount - */ - -DBusDiskMount::DBusDiskMount(QObject *parent) - : QDBusAbstractInterface("com.deepin.daemon.DiskMount", "/com/deepin/daemon/DiskMount", staticInterfaceName(), QDBusConnection::sessionBus(), parent) -{ - DiskInfo::registerMetaType(); - - QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); -} - -DBusDiskMount::~DBusDiskMount() -{ - QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage))); -} - diff --git a/plugins/disk-mount/dbus/dbusdiskmount.h b/plugins/disk-mount/dbus/dbusdiskmount.h deleted file mode 100644 index 63c21d6c5..000000000 --- a/plugins/disk-mount/dbus/dbusdiskmount.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusDiskMount -p dbusdiskmount com.deepin.daemon.DiskMount.xml - * - * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef DBUSDISKMOUNT_H_1468893654 -#define DBUSDISKMOUNT_H_1468893654 - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "variant/diskinfo.h" - -/* - * Proxy class for interface com.deepin.daemon.DiskMount - */ -class DBusDiskMount: public QDBusAbstractInterface -{ - Q_OBJECT - - Q_SLOT void __propertyChanged__(const QDBusMessage& msg) - { - QList arguments = msg.arguments(); - if (3 != arguments.count()) - return; - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName !="com.deepin.daemon.DiskMount") - return; - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - foreach(const QString &prop, changedProps.keys()) { - const QMetaObject* self = metaObject(); - for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) { - QMetaProperty p = self->property(i); - if (p.name() == prop) { - Q_EMIT p.notifySignal().invoke(this); - } - } - } - } -public: - static inline const char *staticInterfaceName() - { return "com.deepin.daemon.DiskMount"; } - -public: - explicit DBusDiskMount(QObject *parent = 0); - - ~DBusDiskMount(); - - Q_PROPERTY(DiskInfoList DiskList READ diskList NOTIFY DiskListChanged) - inline DiskInfoList diskList() const - { return qvariant_cast< DiskInfoList >(property("DiskList")); } - -public Q_SLOTS: // METHODS - inline QDBusPendingReply<> Eject(const QString &in0) - { - QList argumentList; - argumentList << QVariant::fromValue(in0); - return asyncCallWithArgumentList(QStringLiteral("Eject"), argumentList); - } - - inline QDBusPendingReply ListDisk() - { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("ListDisk"), argumentList); - } - - inline QDBusPendingReply<> Mount(const QString &in0) - { - QList argumentList; - argumentList << QVariant::fromValue(in0); - return asyncCallWithArgumentList(QStringLiteral("Mount"), argumentList); - } - - inline QDBusPendingReply QueryDisk(const QString &in0) - { - QList argumentList; - argumentList << QVariant::fromValue(in0); - return asyncCallWithArgumentList(QStringLiteral("QueryDisk"), argumentList); - } - - inline QDBusPendingReply<> Unmount(const QString &diskId) - { - QList argumentList; - argumentList << QVariant::fromValue(diskId); - return asyncCallWithArgumentList(QStringLiteral("Unmount"), argumentList); - } - -Q_SIGNALS: // SIGNALS - void Changed(int in0, const QString &in1); - void Error(const QString &uuid, const QString &info); -// begin property changed signals -void DiskListChanged(); -}; - -namespace com { - namespace deepin { - namespace daemon { - typedef ::DBusDiskMount DiskMount; - } - } -} -#endif diff --git a/plugins/disk-mount/dbus/variant/diskinfo.cpp b/plugins/disk-mount/dbus/variant/diskinfo.cpp deleted file mode 100644 index cbc34b8f2..000000000 --- a/plugins/disk-mount/dbus/variant/diskinfo.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "diskinfo.h" - -DiskInfo::DiskInfo() -{ - -} - -void DiskInfo::registerMetaType() -{ - qRegisterMetaType("DiskInfo"); - qDBusRegisterMetaType(); - - qRegisterMetaType("DiskInfoList"); - qDBusRegisterMetaType(); -} - -QDebug operator<<(QDebug debug, const DiskInfo &info) -{ - debug << info.m_id << info.m_name << info.m_type << info.m_path << info.m_mountPoint << info.m_icon; - debug << '\t' << info.m_unmountable << '\t' << info.m_ejectable; - debug << '\t' << info.m_usedSize << '\t' << info.m_totalSize; - debug << endl; - - return debug; -} - -const QDataStream &operator>>(QDataStream &args, DiskInfo &info) -{ - args >> info.m_id >> info.m_name >> info.m_type >> info.m_path >> info.m_mountPoint >> info.m_icon; - args >> info.m_unmountable >> info.m_ejectable; - args >> info.m_usedSize >> info.m_totalSize; - - return args; -} - -const QDBusArgument &operator>>(const QDBusArgument &args, DiskInfo &info) -{ - args.beginStructure(); - args >> info.m_id >> info.m_name >> info.m_type >> info.m_path >> info.m_mountPoint >> info.m_icon; - args >> info.m_unmountable >> info.m_ejectable; - args >> info.m_usedSize >> info.m_totalSize; - args.endStructure(); - - return args; -} - -QDataStream &operator<<(QDataStream &args, const DiskInfo &info) -{ - args << info.m_id << info.m_name << info.m_type << info.m_path << info.m_mountPoint << info.m_icon; - args << info.m_unmountable << info.m_ejectable; - args << info.m_usedSize << info.m_totalSize; - - return args; -} - -QDBusArgument &operator<<(QDBusArgument &args, const DiskInfo &info) -{ - args.beginStructure(); - args << info.m_id << info.m_name << info.m_type << info.m_path << info.m_mountPoint << info.m_icon; - args << info.m_unmountable << info.m_ejectable; - args << info.m_usedSize << info.m_totalSize; - args.endStructure(); - - return args; -} diff --git a/plugins/disk-mount/dbus/variant/diskinfo.h b/plugins/disk-mount/dbus/variant/diskinfo.h deleted file mode 100644 index fc5282261..000000000 --- a/plugins/disk-mount/dbus/variant/diskinfo.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef DISKINFO_H -#define DISKINFO_H - -#include -#include -#include - -class DiskInfo -{ -public: - DiskInfo(); - static void registerMetaType(); - - friend QDebug operator<<(QDebug debug, const DiskInfo &info); - friend QDBusArgument &operator<<(QDBusArgument &args, const DiskInfo &info); - friend QDataStream &operator<<(QDataStream &args, const DiskInfo &info); - friend const QDBusArgument &operator>>(const QDBusArgument &args, DiskInfo &info); - friend const QDataStream &operator>>(QDataStream &args, DiskInfo &info); - -public: - QString m_id; - QString m_name; - QString m_type; - QString m_path; - QString m_mountPoint; - QString m_icon; - - bool m_unmountable; - bool m_ejectable; - - quint64 m_usedSize; - quint64 m_totalSize; -}; - -typedef QList DiskInfoList; - -Q_DECLARE_METATYPE(DiskInfo) -Q_DECLARE_METATYPE(DiskInfoList) - -#endif // DISKINFO_H diff --git a/plugins/disk-mount/disk-mount.json b/plugins/disk-mount/disk-mount.json deleted file mode 100644 index bec81f0da..000000000 --- a/plugins/disk-mount/disk-mount.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "2.0.0" -} diff --git a/plugins/disk-mount/diskcontrolitem.cpp b/plugins/disk-mount/diskcontrolitem.cpp deleted file mode 100644 index 3485e3ba8..000000000 --- a/plugins/disk-mount/diskcontrolitem.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "diskcontrolitem.h" - -#include -#include - -DWIDGET_USE_NAMESPACE - -DiskControlItem::DiskControlItem(const DiskInfo &info, QWidget *parent) - : QFrame(parent), - - m_unknowIcon(":/icons/resources/unknown.svg"), - - m_diskIcon(new QLabel), - m_diskName(new QLabel), - m_diskCapacity(new QLabel), - m_capacityValueBar(new QProgressBar), - m_unmountButton(new DImageButton) -{ -// QIcon::setThemeName("deepin"); - - m_diskName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - m_diskName->setStyleSheet("color:white;"); - - m_diskCapacity->setStyleSheet("color:rgba(255, 255, 255, .6);"); - - m_capacityValueBar->setTextVisible(false); - m_capacityValueBar->setFixedHeight(2); - m_capacityValueBar->setStyleSheet("QProgressBar {" - "border:none;" - "background-color:rgba(255, 255, 255, .1);" - "}" - "QProgressBar::chunk {" - "background-color:rgba(255, 255, 255, .8);" - "}"); - - m_unmountButton->setNormalPic(":/icons/resources/unmount-normal.png"); - m_unmountButton->setHoverPic(":/icons/resources/unmount-hover.png"); - m_unmountButton->setPressPic(":/icons/resources/unmount-press.png"); - m_unmountButton->setStyleSheet("margin-top:12px;"); - - QVBoxLayout *infoLayout = new QVBoxLayout; - infoLayout->addWidget(m_diskName); - infoLayout->addWidget(m_diskCapacity); - infoLayout->setSpacing(0); - infoLayout->setContentsMargins(3, 6, 0, 8); - - QHBoxLayout *unmountLayout = new QHBoxLayout; - unmountLayout->addLayout(infoLayout); - unmountLayout->addWidget(m_unmountButton); - unmountLayout->setSpacing(0); - unmountLayout->setMargin(0); - - QVBoxLayout *progressLayout = new QVBoxLayout; - progressLayout->addLayout(unmountLayout); - progressLayout->addWidget(m_capacityValueBar); - progressLayout->setSpacing(0); - progressLayout->setContentsMargins(10, 0, 0, 5); - - QHBoxLayout *centralLayout = new QHBoxLayout; - centralLayout->addWidget(m_diskIcon); - centralLayout->addLayout(progressLayout); - centralLayout->setSpacing(0); - centralLayout->setContentsMargins(0, 0, 5, 0); - - setLayout(centralLayout); - setObjectName("DiskItem"); - setStyleSheet("QFrame #DiskItem:hover {" - "background-color:rgba(255, 255, 255, .1);" - "border-radius:4px;" - "}"); - - connect(m_unmountButton, &DImageButton::clicked, [this] {emit requestUnmount(m_info.m_id);}); - - updateInfo(info); -} - -void DiskControlItem::updateInfo(const DiskInfo &info) -{ - m_info = info; - - m_diskIcon->setPixmap(QIcon::fromTheme(info.m_icon, m_unknowIcon).pixmap(48, 48)); - if (!info.m_name.isEmpty()) - m_diskName->setText(info.m_name); - else - m_diskName->setText(tr("Unknown device")); - if (info.m_totalSize) - m_diskCapacity->setText(QString("%1/%2").arg(formatDiskSize(info.m_usedSize)).arg(formatDiskSize(info.m_totalSize))); - else if (info.m_name.isEmpty()) - m_diskCapacity->clear(); - else - m_diskCapacity->setText(tr("Unknown volume")); - m_capacityValueBar->setMinimum(0); - m_capacityValueBar->setMaximum(std::max(1ull, info.m_totalSize)); - m_capacityValueBar->setValue(info.m_usedSize); -} - -const QString DiskControlItem::formatDiskSize(const quint64 size) const -{ - const quint64 mSize = 1000; - const quint64 gSize = mSize * 1000; - const quint64 tSize = gSize * 1000; - - if (size >= tSize) - return QString::number(double(size) / tSize, 'f', 2) + 'T'; - else if (size >= gSize) - return QString::number(double(size) / gSize, 'f', 2) + "G"; - else if (size >= mSize) - return QString::number(double(size) / mSize, 'f', 1) + "M"; - else - return QString::number(size) + "K"; -} diff --git a/plugins/disk-mount/diskcontrolitem.h b/plugins/disk-mount/diskcontrolitem.h deleted file mode 100644 index a9da2421c..000000000 --- a/plugins/disk-mount/diskcontrolitem.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef DISKCONTROLITEM_H -#define DISKCONTROLITEM_H - -#include "dbus/dbusdiskmount.h" - -#include - -#include -#include -#include -#include - -class DiskControlItem : public QFrame -{ - Q_OBJECT - -public: - explicit DiskControlItem(const DiskInfo &info, QWidget *parent = 0); - -signals: - void requestUnmount(const QString &diskId) const; - -private slots: - void updateInfo(const DiskInfo &info); - const QString formatDiskSize(const quint64 size) const; - -private: - DiskInfo m_info; - QIcon m_unknowIcon; - - QLabel *m_diskIcon; - QLabel *m_diskName; - QLabel *m_diskCapacity; - QProgressBar *m_capacityValueBar; - Dtk::Widget::DImageButton *m_unmountButton; -}; - -#endif // DISKCONTROLITEM_H diff --git a/plugins/disk-mount/diskcontrolwidget.cpp b/plugins/disk-mount/diskcontrolwidget.cpp deleted file mode 100644 index 09c82fc5b..000000000 --- a/plugins/disk-mount/diskcontrolwidget.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "diskcontrolwidget.h" -#include "diskcontrolitem.h" - -#define WIDTH 300 - -DiskControlWidget::DiskControlWidget(QWidget *parent) - : QScrollArea(parent), - - m_centralLayout(new QVBoxLayout), - m_centralWidget(new QWidget), - - m_diskInter(new DBusDiskMount(this)) -{ - m_centralWidget->setLayout(m_centralLayout); - m_centralWidget->setFixedWidth(WIDTH); - - setWidget(m_centralWidget); - setFixedWidth(WIDTH); - setFrameStyle(QFrame::NoFrame); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setStyleSheet("background-color:transparent;"); - - connect(m_diskInter, &DBusDiskMount::DiskListChanged, this, &DiskControlWidget::diskListChanged); - connect(m_diskInter, &DBusDiskMount::Error, this, &DiskControlWidget::unmountFinished); - - QMetaObject::invokeMethod(this, "diskListChanged", Qt::QueuedConnection); -} - -void DiskControlWidget::unmountAll() -{ - for (auto disk : m_diskInfoList) - unmountDisk(disk.m_id); -} - -void DiskControlWidget::diskListChanged() -{ - DiskInfoList diskList = m_diskInter->diskList(); - - while (QLayoutItem *item = m_centralLayout->takeAt(0)) - { - delete item->widget(); - delete item; - } - - int mountedCount = 0; - for (auto info : diskList) - { - if (info.m_mountPoint.isEmpty()) - continue; - else - ++mountedCount; - - DiskControlItem *item = new DiskControlItem(info, this); - - connect(item, &DiskControlItem::requestUnmount, this, &DiskControlWidget::unmountDisk); - - m_centralLayout->addWidget(item); - m_diskInfoList.append(info); - } - - emit diskCountChanged(mountedCount); - - const int contentHeight = mountedCount * 70; - const int maxHeight = std::min(contentHeight, 70 * 6); - - m_centralWidget->setFixedHeight(contentHeight); - setFixedHeight(maxHeight); -} - -void DiskControlWidget::unmountDisk(const QString &diskId) const -{ - m_diskInter->Unmount(diskId); -} - -void DiskControlWidget::unmountFinished(const QString &uuid, const QString &info) -{ - qDebug() << uuid << info; -} diff --git a/plugins/disk-mount/diskcontrolwidget.h b/plugins/disk-mount/diskcontrolwidget.h deleted file mode 100644 index ea8144aac..000000000 --- a/plugins/disk-mount/diskcontrolwidget.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef DISKCONTROLWIDGET_H -#define DISKCONTROLWIDGET_H - -#include "dbus/dbusdiskmount.h" - -#include -#include - -class DiskControlWidget : public QScrollArea -{ - Q_OBJECT - -public: - explicit DiskControlWidget(QWidget *parent = 0); - - void unmountAll(); - -signals: - void diskCountChanged(const int count) const; - -private slots: - void diskListChanged(); - void unmountDisk(const QString &diskId) const; - void unmountFinished(const QString &uuid, const QString &info); - -private: - QVBoxLayout *m_centralLayout; - QWidget *m_centralWidget; - DBusDiskMount *m_diskInter; - - DiskInfoList m_diskInfoList; -}; - -#endif // DISKCONTROLWIDGET_H diff --git a/plugins/disk-mount/diskmountplugin.cpp b/plugins/disk-mount/diskmountplugin.cpp deleted file mode 100644 index e21a6906e..000000000 --- a/plugins/disk-mount/diskmountplugin.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "diskmountplugin.h" - -#define OPEN "open" -#define UNMOUNT_ALL "unmount_all" - -DiskMountPlugin::DiskMountPlugin(QObject *parent) - : QObject(parent), - - m_pluginAdded(false), - - m_tipsLabel(new QLabel), - m_diskPluginItem(new DiskPluginItem), - m_diskControlApplet(nullptr) -{ - m_diskPluginItem->setVisible(false); - - m_tipsLabel->setObjectName("diskmount"); - m_tipsLabel->setVisible(false); - m_tipsLabel->setText(tr("Disk")); - m_tipsLabel->setStyleSheet("color:white;" - "padding:5px 10px;"); - - connect(m_diskPluginItem, &DiskPluginItem::requestContextMenu, [this] {m_proxyInter->requestContextMenu(this, QString());}); -} - -const QString DiskMountPlugin::pluginName() const -{ - return "disk-mount"; -} - -void DiskMountPlugin::init(PluginProxyInterface *proxyInter) -{ - m_proxyInter = proxyInter; - - initCompoments(); - m_diskPluginItem->setDockDisplayMode(displayMode()); -} - -QWidget *DiskMountPlugin::itemWidget(const QString &itemKey) -{ - Q_UNUSED(itemKey); - - return m_diskPluginItem; -} - -QWidget *DiskMountPlugin::itemTipsWidget(const QString &itemKey) -{ - Q_UNUSED(itemKey); - - return m_tipsLabel; -} - -QWidget *DiskMountPlugin::itemPopupApplet(const QString &itemKey) -{ - Q_UNUSED(itemKey); - - return m_diskControlApplet; -} - -const QString DiskMountPlugin::itemContextMenu(const QString &itemKey) -{ - Q_UNUSED(itemKey); - - QList items; - items.reserve(2); - - QMap open; - open["itemId"] = OPEN; - open["itemText"] = tr("Open"); - open["isActive"] = true; - items.push_back(open); - - QMap unmountAll; - unmountAll["itemId"] = UNMOUNT_ALL; - unmountAll["itemText"] = tr("Unmount all"); - unmountAll["isActive"] = true; - items.push_back(unmountAll); - - QMap menu; - menu["items"] = items; - menu["checkableMenu"] = false; - menu["singleCheck"] = false; - - return QJsonDocument::fromVariant(menu).toJson(); -} - -void DiskMountPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) -{ - Q_UNUSED(itemKey) - Q_UNUSED(checked) - - if (menuId == OPEN) - QProcess::startDetached("gvfs-open", QStringList() << "computer://"); - else if (menuId == UNMOUNT_ALL) - m_diskControlApplet->unmountAll(); -} - -void DiskMountPlugin::initCompoments() -{ - m_diskControlApplet = new DiskControlWidget; - m_diskControlApplet->setObjectName("dist-mount"); - m_diskControlApplet->setVisible(false); - - connect(m_diskControlApplet, &DiskControlWidget::diskCountChanged, this, &DiskMountPlugin::diskCountChanged); -} - -void DiskMountPlugin::displayModeChanged(const Dock::DisplayMode mode) -{ - m_diskPluginItem->setDockDisplayMode(mode); -} - -void DiskMountPlugin::diskCountChanged(const int count) -{ - if (m_pluginAdded == bool(count)) - return; - - m_pluginAdded = bool(count); - - if (m_pluginAdded) - m_proxyInter->itemAdded(this, QString()); - else - m_proxyInter->itemRemoved(this, QString()); -} diff --git a/plugins/disk-mount/diskmountplugin.h b/plugins/disk-mount/diskmountplugin.h deleted file mode 100644 index 046ba35a5..000000000 --- a/plugins/disk-mount/diskmountplugin.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef DISKMOUNTPLUGIN_H -#define DISKMOUNTPLUGIN_H - -#include - -#include "pluginsiteminterface.h" -#include "diskcontrolwidget.h" -#include "diskpluginitem.h" - -class DiskMountPlugin : public QObject, PluginsItemInterface -{ - Q_OBJECT - Q_INTERFACES(PluginsItemInterface) - Q_PLUGIN_METADATA(IID "com.deepin.dock.PluginsItemInterface" FILE "disk-mount.json") - -public: - explicit DiskMountPlugin(QObject *parent = 0); - - const QString pluginName() const; - void init(PluginProxyInterface *proxyInter); - - QWidget *itemWidget(const QString &itemKey); - QWidget *itemTipsWidget(const QString &itemKey); - QWidget *itemPopupApplet(const QString &itemKey); - - const QString itemContextMenu(const QString &itemKey); - void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked); - -private: - void initCompoments(); - - void displayModeChanged(const Dock::DisplayMode mode); - -private slots: - void diskCountChanged(const int count); - -private: - bool m_pluginAdded; - - QLabel *m_tipsLabel; - DiskPluginItem *m_diskPluginItem; - DiskControlWidget *m_diskControlApplet; -}; - -#endif // DISKMOUNTPLUGIN_H diff --git a/plugins/disk-mount/diskpluginitem.cpp b/plugins/disk-mount/diskpluginitem.cpp deleted file mode 100644 index 4dc2454a4..000000000 --- a/plugins/disk-mount/diskpluginitem.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "diskpluginitem.h" -#include "imageutil.h" - -#include -#include -#include -#include - -DiskPluginItem::DiskPluginItem(QWidget *parent) - : QWidget(parent), - m_displayMode(Dock::Efficient) -{ -// QIcon::setThemeName("deepin"); -} - -void DiskPluginItem::setDockDisplayMode(const Dock::DisplayMode mode) -{ - m_displayMode = mode; - - updateIcon(); -} - -void DiskPluginItem::paintEvent(QPaintEvent *e) -{ - QWidget::paintEvent(e); - - QPainter painter(this); - const QRectF &rf = QRectF(rect()); - const QRectF &rfp = QRectF(m_icon.rect()); - painter.drawPixmap(rf.center() - rfp.center(), m_icon); -} - -void DiskPluginItem::resizeEvent(QResizeEvent *e) -{ - QWidget::resizeEvent(e); - - updateIcon(); -} - -void DiskPluginItem::mousePressEvent(QMouseEvent *e) -{ - if (e->button() != Qt::RightButton) - return QWidget::mousePressEvent(e); - - const QPoint p(e->pos() - rect().center()); - if (p.manhattanLength() < std::min(width(), height()) * 0.8 * 0.5) - { - emit requestContextMenu(); - return; - } - - QWidget::mousePressEvent(e); -} - -QSize DiskPluginItem::sizeHint() const -{ - return QSize(26, 26); -} - -void DiskPluginItem::updateIcon() -{ - if (m_displayMode == Dock::Efficient) -// m_icon = ImageUtil::loadSvg(":/icons/resources/icon-small.svg", 16); - m_icon = QIcon::fromTheme("drive-removable-dock-symbolic").pixmap(16, 16); - else -// m_icon = ImageUtil::loadSvg(":/icons/resources/icon.svg", std::min(width(), height()) * 0.8); - m_icon = QIcon::fromTheme("drive-removable-dock").pixmap(std::min(width(), height()) * 0.8, std::min(width(), height()) * 0.8); - - update(); -} diff --git a/plugins/disk-mount/diskpluginitem.h b/plugins/disk-mount/diskpluginitem.h deleted file mode 100644 index bd0ca2648..000000000 --- a/plugins/disk-mount/diskpluginitem.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef DISKPLUGINITEM_H -#define DISKPLUGINITEM_H - -#include "constants.h" - -#include -#include - -class DiskPluginItem : public QWidget -{ - Q_OBJECT - -public: - explicit DiskPluginItem(QWidget *parent = 0); - -signals: - void requestContextMenu() const; - -public slots: - void setDockDisplayMode(const Dock::DisplayMode mode); - -protected: - void paintEvent(QPaintEvent *e); - void resizeEvent(QResizeEvent *e); - void mousePressEvent(QMouseEvent *e); - QSize sizeHint() const; - -private: - void updateIcon(); - -private: - Dock::DisplayMode m_displayMode; - - QPixmap m_icon; -}; - -#endif // DISKPLUGINITEM_H diff --git a/plugins/disk-mount/imageutil.cpp b/plugins/disk-mount/imageutil.cpp deleted file mode 100644 index 2ff32f629..000000000 --- a/plugins/disk-mount/imageutil.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "imageutil.h" - -#include - -const QPixmap ImageUtil::loadSvg(const QString &path, const int size) -{ - QPixmap pixmap(size, size); - QSvgRenderer renderer(path); - pixmap.fill(Qt::transparent); - - QPainter painter; - painter.begin(&pixmap); - renderer.render(&painter); - painter.end(); - - return pixmap; -} diff --git a/plugins/disk-mount/imageutil.h b/plugins/disk-mount/imageutil.h deleted file mode 100644 index 59c90c06d..000000000 --- a/plugins/disk-mount/imageutil.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef IMAGEUTIL_H -#define IMAGEUTIL_H - -#include -#include - -class ImageUtil -{ -public: - static const QPixmap loadSvg(const QString &path, const int size); -}; - -#endif // IMAGEUTIL_H diff --git a/plugins/disk-mount/resources.qrc b/plugins/disk-mount/resources.qrc deleted file mode 100644 index f36bff8c2..000000000 --- a/plugins/disk-mount/resources.qrc +++ /dev/null @@ -1,10 +0,0 @@ - - - resources/icon-small.svg - resources/icon.svg - resources/unmount-press.png - resources/unmount-normal.png - resources/unmount-hover.png - resources/unknown.svg - - diff --git a/plugins/disk-mount/resources/icon-small.svg b/plugins/disk-mount/resources/icon-small.svg deleted file mode 100644 index 549ca8a0e..000000000 --- a/plugins/disk-mount/resources/icon-small.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - drive_harddisk_usb_symbolic_active_16px - Created with Sketch. - - - - - - - - \ No newline at end of file diff --git a/plugins/disk-mount/resources/icon.svg b/plugins/disk-mount/resources/icon.svg deleted file mode 100644 index 952b644bf..000000000 --- a/plugins/disk-mount/resources/icon.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - 磁盘挂载-48px - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/plugins/disk-mount/resources/unknown.svg b/plugins/disk-mount/resources/unknown.svg deleted file mode 100644 index 8156620ab..000000000 --- a/plugins/disk-mount/resources/unknown.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - drive-unknown - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/plugins/disk-mount/resources/unmount-hover.png b/plugins/disk-mount/resources/unmount-hover.png deleted file mode 100644 index 863e17ac03dfed09eee3213abce398b5d6c219e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc0wmQNuC@UwmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{(xPW%SycQqqjCt=%lBMV~EE2sgpPI9x@Pct=G8}Xuwdtfl<`AtH<#upGb%4 zB_)-x1!tHhDqUQ<$e35ehO6bHD&wKmHP6@o`29zj)#Ie*iVqc9Ttz{pii?-|`lh+| z@y@^T;GUEA?xJm%zAv1nTKsO=WZU%#d*7;bmY&YmD!OcCI8nt-#@AllHRRq5*89Pa zw+MuWtUIG4Hu198j{q5usLglVZ0A2Py_T=%ca~x16^p6sOD{PKO!NEg7=Ndn{hqt; zt?wxs{bm0xegZwETH+c}l9E`GYL#4+3Zxi}3=GY5 z4a{{7Ekg_qtV}JejEuDnEUXL+0_PTop=ij>PsvQH#H~T$!0A^&4Gf;HelF{r5}E*y CaGZJo diff --git a/plugins/disk-mount/resources/unmount-normal.png b/plugins/disk-mount/resources/unmount-normal.png deleted file mode 100644 index 77feec2ea7b4a1ae0bb8217dee61d0d42ebfb4da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc0wmQNuC@UwmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{(xPW%SycQqqjCt=%=TPV~EE2sgpPQ9X1eX+rK*`=}gEoo2Jh~H&@%Z+;8Wd z%2>9@!$(6QPEpJwr{j&FlcYluN1DRcH)2bl&i`}2)^5K4wg*pzc-neIBwlQYklY^m zF~aZUqzK!oTNqzV5oN7ky>ME7K!a?~6XgO{Z3foq??ZM!Q~K0;+A-EivURP^3FGa7 zYf3tk7HRJ(WIe#E?^x0q=yT<+n;m0Hig0Px6rBxQ_x#$qw^%a8NcHQp&fgmhE1#U3 z9dbufUFO`Hr Bv?~Ar diff --git a/plugins/disk-mount/resources/unmount-press.png b/plugins/disk-mount/resources/unmount-press.png deleted file mode 100644 index a3e0692cd9b6a2d234b8d343dd249ca3acb8b03c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc0wmQNuC@UwmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{(xPW%SycQqqjCt=&PrTV~EE2sgn);m<yO zDABKvH*A-SL`&PO%NZMm92nJ%&g&(b@-{fFP|MTTF^+5JGI{aOt!1+R&u6yXrjDYM zZ4*x$GvxnKxoGKT7+K!GiCN&h(d#Q3sZQ~!vd_0Y)jT=HOYo$)d}i{dMZHTV6ddn4 z{UfwZJH_D4i=C3*wldET|E+i-T0V902OC7#SFv=^B{p8d`=J w8d#ZHSQ!~>8(3Hw7zEBO4nxt9o1c=IR*74K!hzGTfEpM)UHx3vIVCg!00qUXoB#j- diff --git a/plugins/display/brightnessmodel.cpp b/plugins/display/brightnessmodel.cpp index 9d05e97f1..b560d8548 100644 --- a/plugins/display/brightnessmodel.cpp +++ b/plugins/display/brightnessmodel.cpp @@ -32,9 +32,9 @@ #include #include -static const QString serviceName("com.deepin.daemon.Display"); -static const QString servicePath("/com/deepin/daemon/Display"); -static const QString serviceInterface("com.deepin.daemon.Display"); +static const QString serviceName("org.deepin.dde.Display1"); +static const QString servicePath("/org/deepin/dde/Display1"); +static const QString serviceInterface("org.deepin.dde.Display1"); static const QString propertiesInterface("org.freedesktop.DBus.Properties"); BrightnessModel::BrightnessModel(QObject *parent) diff --git a/plugins/display/collaborationdevmodel.cpp b/plugins/display/collaborationdevmodel.cpp index 6305ec88a..e9bbe3609 100644 --- a/plugins/display/collaborationdevmodel.cpp +++ b/plugins/display/collaborationdevmodel.cpp @@ -32,9 +32,9 @@ DGUI_USE_NAMESPACE DCORE_USE_NAMESPACE -static const QString CollaborationService = "com.deepin.Cooperation"; -static const QString CollaborationPath = "/com/deepin/Cooperation"; -static const QString CollaborationInterface = "com.deepin.Cooperation"; +static const QString CollaborationService = "org.deepin.dde.Cooperation1"; +static const QString CollaborationPath = "/org/deepin/dde/Cooperation1"; +static const QString CollaborationInterface = "org.deepin.dde.Cooperation1"; static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties"; CollaborationDevModel::CollaborationDevModel(QObject *parent) diff --git a/plugins/keyboard-layout/dbusadaptors.cpp b/plugins/keyboard-layout/dbusadaptors.cpp index 1ecdfc82d..2c1cd39d4 100644 --- a/plugins/keyboard-layout/dbusadaptors.cpp +++ b/plugins/keyboard-layout/dbusadaptors.cpp @@ -25,10 +25,10 @@ DBusAdaptors::DBusAdaptors(QObject *parent) : QDBusAbstractAdaptor(parent), - m_keyboard(new Keyboard("com.deepin.daemon.InputDevices", - "/com/deepin/daemon/InputDevice/Keyboard", + m_keyboard(new Keyboard("org.deepin.dde.InputDevices1", + "/org/deepin/dde/InputDevice1/Keyboard", QDBusConnection::sessionBus(), this)), - m_menu(new QMenu()), + m_menu(new QMenu()), m_gsettings(Utils::ModuleSettingsPtr("keyboard", QByteArray(), this)) { m_keyboard->setSync(false); @@ -173,7 +173,6 @@ void DBusAdaptors::refreshMenuSelection() void DBusAdaptors::handleActionTriggered(QAction *action) { if (action == m_addLayoutAction) { -#ifdef USE_AM DDBusSender() .service("org.deepin.dde.ControlCenter1") .interface("org.deepin.dde.ControlCenter1") @@ -182,16 +181,6 @@ void DBusAdaptors::handleActionTriggered(QAction *action) .arg(QString("keyboard")) .arg(QString("Keyboard Layout/Add Keyboard Layout")) .call(); -#else - DDBusSender() - .service("com.deepin.dde.ControlCenter") - .interface("com.deepin.dde.ControlCenter") - .path("/com/deepin/dde/ControlCenter") - .method("ShowPage") - .arg(QString("keyboard")) - .arg(QString("Keyboard Layout/Add Keyboard Layout")) - .call(); -#endif } const QString layout = action->objectName(); diff --git a/plugins/keyboard-layout/dbusadaptors.h b/plugins/keyboard-layout/dbusadaptors.h index 99d345cec..befa7d2d1 100644 --- a/plugins/keyboard-layout/dbusadaptors.h +++ b/plugins/keyboard-layout/dbusadaptors.h @@ -22,17 +22,17 @@ #include #include -#include "org_deepin_daemon_inputdevice_keyboard.h" +#include "org_deepin_dde_inputdevice1_keyboard.h" -using Keyboard = org::deepin::daemon::inputdevice::Keyboard1; +using Keyboard = org::deepin::dde::inputdevice1::Keyboard1; class QGSettings; class DBusAdaptors : public QDBusAbstractAdaptor { Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "com.deepin.dde.Keyboard") + Q_CLASSINFO("D-Bus Interface", "org.deepin.dde.Dock1.KeyboardLayout") // Q_CLASSINFO("D-Bus Introspection", "" -// " \n" +// " \n" // " \n" // " " // " " diff --git a/plugins/keyboard-layout/dbusinterface/xml/org.deepin.daemon.InputDevice.Keyboard.xml b/plugins/keyboard-layout/dbusinterface/xml/org.deepin.dde.InputDevice1.Keyboard.xml similarity index 96% rename from plugins/keyboard-layout/dbusinterface/xml/org.deepin.daemon.InputDevice.Keyboard.xml rename to plugins/keyboard-layout/dbusinterface/xml/org.deepin.dde.InputDevice1.Keyboard.xml index d37690b89..633c33581 100644 --- a/plugins/keyboard-layout/dbusinterface/xml/org.deepin.daemon.InputDevice.Keyboard.xml +++ b/plugins/keyboard-layout/dbusinterface/xml/org.deepin.dde.InputDevice1.Keyboard.xml @@ -1,5 +1,5 @@ - + diff --git a/plugins/keyboard-layout/keyboardplugin.cpp b/plugins/keyboard-layout/keyboardplugin.cpp index dba1ef731..eb9f24b5e 100644 --- a/plugins/keyboard-layout/keyboardplugin.cpp +++ b/plugins/keyboard-layout/keyboardplugin.cpp @@ -44,7 +44,7 @@ void KeyboardPlugin::init(PluginProxyInterface *proxyInter) m_proxyInter = proxyInter; if (!m_dbusAdaptors) { - QString serverName = "com.deepin.daemon.InputDevices"; + QString serverName = "org.deepin.dde.InputDevices1"; QDBusConnectionInterface *ifc = QDBusConnection::sessionBus().interface(); if (!ifc->isServiceRegistered(serverName)) { @@ -60,8 +60,8 @@ void KeyboardPlugin::init(PluginProxyInterface *proxyInter) m_dbusAdaptors = new DBusAdaptors(this); } - QDBusConnection::sessionBus().registerService("com.deepin.dde.Keyboard"); - QDBusConnection::sessionBus().registerObject("/com/deepin/dde/Keyboard", "com.deepin.dde.Keyboard", this); + QDBusConnection::sessionBus().registerService("org.deepin.dde.Dock1.KeyboardLayout"); + QDBusConnection::sessionBus().registerObject("/org/deepin/dde/Dock1/KeyboardLayout", "org.deepin.dde.Dock1.KeyboardLayout", this); } } diff --git a/plugins/keyboard-layout/keybord_layout.json b/plugins/keyboard-layout/keybord_layout.json index ca5193e33..ade26475f 100644 --- a/plugins/keyboard-layout/keybord_layout.json +++ b/plugins/keyboard-layout/keybord_layout.json @@ -1,17 +1,17 @@ { "data": { "text": { - "dbus_service": "com.deepin.dde.Keyboard", - "dbus_path": "/com/deepin/dde/Keyboard", - "dbus_interface": "com.deepin.dde.Keyboard", + "dbus_service": "org.deepin.dde.Dock1.KeyboardLayout", + "dbus_path": "/org/deepin/dde/Dock1/KeyboardLayout", + "dbus_interface": "org.deepin.dde.Dock1.KeyboardLayout", "dbus_properties": "layout" } }, "action": { "trigger": { - "dbus_service": "com.deepin.dde.Keyboard", - "dbus_path": "/com/deepin/dde/Keyboard", - "dbus_interface": "com.deepin.dde.Keyboard", + "dbus_service": "org.deepin.dde.Dock1.KeyboardLayout", + "dbus_path": "/org/deepin/dde/Dock1/KeyboardLayout", + "dbus_interface": "org.deepin.dde.Dock1.KeyboardLayout", "dbus_method": "onClicked" } } diff --git a/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.Entry.xml b/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock1.Entry.xml similarity index 100% rename from plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.Entry.xml rename to plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock1.Entry.xml diff --git a/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.xml b/plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock1.xml similarity index 100% rename from plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock.xml rename to plugins/onboard/dbusinterface/xml/org.deepin.dde.daemon.Dock1.xml diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index 986108160..1274b663c 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -22,8 +22,8 @@ #include "onboardplugin.h" #include "../widgets/tipswidget.h" -#include "org_deepin_dde_daemon_dock.h" -#include "org_deepin_dde_daemon_dock_entry.h" +#include "org_deepin_dde_daemon_dock1.h" +#include "org_deepin_dde_daemon_dock1_entry.h" #include diff --git a/plugins/overlay-warning/CMakeLists.txt b/plugins/overlay-warning/CMakeLists.txt index 6041f163e..7f0d65ad7 100644 --- a/plugins/overlay-warning/CMakeLists.txt +++ b/plugins/overlay-warning/CMakeLists.txt @@ -28,5 +28,5 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) # policy kit -install(FILES com.deepin.dde.dock.overlay.policy +install(FILES org.deepin.dde.dock.overlay.policy DESTINATION share/polkit-1/actions/) diff --git a/plugins/overlay-warning/com.deepin.dde.dock.overlay.policy b/plugins/overlay-warning/org.deepin.dde.dock.overlay.policy similarity index 100% rename from plugins/overlay-warning/com.deepin.dde.dock.overlay.policy rename to plugins/overlay-warning/org.deepin.dde.dock.overlay.policy diff --git a/plugins/overlay-warning/overlay-warning-plugin.cpp b/plugins/overlay-warning/overlay-warning-plugin.cpp index 504ec497a..229144d15 100644 --- a/plugins/overlay-warning/overlay-warning-plugin.cpp +++ b/plugins/overlay-warning/overlay-warning-plugin.cpp @@ -31,7 +31,7 @@ #define PLUGIN_STATE_KEY "enable" #define OverlayFileSystemType "overlay" -#define AuthAgentDbusService "com.deepin.Polkit1AuthAgent" +#define AuthAgentDbusService "org.deepin.dde.Polkit1.AuthAgent" DWIDGET_USE_NAMESPACE diff --git a/plugins/plugin-guide/plugins-developer-guide.md b/plugins/plugin-guide/plugins-developer-guide.md index a54ce3c78..fde7dbce7 100644 --- a/plugins/plugin-guide/plugins-developer-guide.md +++ b/plugins/plugin-guide/plugins-developer-guide.md @@ -230,12 +230,12 @@ install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) } ``` -另外(可选的)还支持指定一个 dbus 服务,dock 在加载插件时会检查此插件所依赖的 dbus 服务,如果服务没有启动则不会初始化这个插件,直到服务启动,如下表示依赖 dbus 地址为 "com.deepin.daemon.Network" 的 dbus 服务。 +另外(可选的)还支持指定一个 dbus 服务,dock 在加载插件时会检查此插件所依赖的 dbus 服务,如果服务没有启动则不会初始化这个插件,直到服务启动,如下表示依赖 dbus 地址为 "org.deepin.dde.Network1" 的 dbus 服务。 ``` json { "api": "2.0.0", - "depends-daemon-dbus-service": "com.deepin.daemon.Network" + "depends-daemon-dbus-service": "org.deepin.dde.Network1" } ``` @@ -245,7 +245,7 @@ install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) { "api": "2.0.0", "order": 1, - "depends-daemon-dbus-service": "org.deepin.daemon.Audio1" + "depends-daemon-dbus-service": "org.deepin.dde.Audio1" } ``` diff --git a/plugins/power/dbus/dbusaccount.cpp b/plugins/power/dbus/dbusaccount.cpp index bf0b3173e..3597ae66f 100644 --- a/plugins/power/dbus/dbusaccount.cpp +++ b/plugins/power/dbus/dbusaccount.cpp @@ -21,7 +21,7 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount org.deepin.daemon.Accounts.xml + * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount org.deepin.dde.Accounts1.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * diff --git a/plugins/power/dbus/dbusaccount.h b/plugins/power/dbus/dbusaccount.h index a722bd55d..b8f8e8126 100644 --- a/plugins/power/dbus/dbusaccount.h +++ b/plugins/power/dbus/dbusaccount.h @@ -21,7 +21,7 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount org.deepin.daemon.Accounts.xml + * Command line was: qdbusxml2cpp -c DBusAccount -p dbusaccount org.deepin.dde.Accounts1.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -42,7 +42,7 @@ #include /* - * Proxy class for interface org.deepin.daemon.Accounts1 + * Proxy class for interface org.deepin.dde.Accounts1 */ class DBusAccount: public QDBusAbstractInterface { @@ -55,7 +55,7 @@ class DBusAccount: public QDBusAbstractInterface return; } QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != "org.deepin.daemon.Accounts1") { + if (interfaceName != "org.deepin.dde.Accounts1") { return; } QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); @@ -72,11 +72,11 @@ class DBusAccount: public QDBusAbstractInterface } public: static inline const char *staticService() - { return "org.deepin.daemon.Accounts1"; } + { return "org.deepin.dde.Accounts1"; } static inline const char *staticInterfacePath() - { return "/org/deepin/daemon/Accounts1"; } + { return "/org/deepin/dde/Accounts1"; } static inline const char *staticInterfaceName() - { return "org.deepin.daemon.Accounts1"; } + { return "org.deepin.dde.Accounts1"; } public: explicit DBusAccount(QObject *parent = 0); @@ -90,7 +90,7 @@ public: //namespace com { // namespace deepin { -// namespace daemon { +// namespace dde { // typedef ::DBusAccount Accounts; // } // } diff --git a/plugins/power/dbus/dbuspower.cpp b/plugins/power/dbus/dbuspower.cpp index 1c952860c..ababc6e45 100644 --- a/plugins/power/dbus/dbuspower.cpp +++ b/plugins/power/dbus/dbuspower.cpp @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusPower -p dbuspower org.deepin.daemon.Power.xml + * Command line was: qdbusxml2cpp -c DBusPower -p dbuspower org.deepin.dde.Power1.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -16,7 +16,7 @@ */ DBusPower::DBusPower(QObject *parent) - : QDBusAbstractInterface("org.deepin.daemon.Power1", "/org/deepin/daemon/Power1", staticInterfaceName(), QDBusConnection::sessionBus(), parent) + : QDBusAbstractInterface("org.deepin.dde.Power1", "/org/deepin/dde/Power1", staticInterfaceName(), QDBusConnection::sessionBus(), parent) { qRegisterMetaType("BatteryStateMap"); qDBusRegisterMetaType(); diff --git a/plugins/power/dbus/dbuspower.h b/plugins/power/dbus/dbuspower.h index 646c857c7..1f0417b1f 100644 --- a/plugins/power/dbus/dbuspower.h +++ b/plugins/power/dbus/dbuspower.h @@ -1,6 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusPower -p dbuspower org.deepin.daemon.Power.xml + * Command line was: qdbusxml2cpp -c DBusPower -p dbuspower org.deepin.dde.Power1.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -26,7 +26,7 @@ Q_DECLARE_METATYPE(BatteryPercentageMap) Q_DECLARE_METATYPE(BatteryStateMap) /* - * Proxy class for interface org.deepin.daemon.Power + * Proxy class for interface org.deepin.dde.Power1 */ class DBusPower: public QDBusAbstractInterface { @@ -38,7 +38,7 @@ class DBusPower: public QDBusAbstractInterface if (3 != arguments.count()) return; QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName !="org.deepin.daemon.Power1") + if (interfaceName !="org.deepin.dde.Power1") return; QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); foreach(const QString &prop, changedProps.keys()) { @@ -53,7 +53,7 @@ class DBusPower: public QDBusAbstractInterface } public: static inline const char *staticInterfaceName() - { return "org.deepin.daemon.Power1"; } + { return "org.deepin.dde.Power1"; } public: explicit DBusPower(QObject *parent = 0); @@ -82,8 +82,8 @@ void BatteryStateChanged(); namespace org { namespace deepin { - namespace daemon { - typedef ::DBusPower Power1; + namespace dde { + typedef ::DBusPower SessionPower1; } } } diff --git a/plugins/power/dbus/com.deepin.daemon.Power.xml b/plugins/power/dbus/org.deepin.dde.Power1.xml similarity index 96% rename from plugins/power/dbus/com.deepin.daemon.Power.xml rename to plugins/power/dbus/org.deepin.dde.Power1.xml index af034c1f2..9589fe74c 100644 --- a/plugins/power/dbus/com.deepin.daemon.Power.xml +++ b/plugins/power/dbus/org.deepin.dde.Power1.xml @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index e24141166..ec9dad4ea 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -60,6 +60,7 @@ MultiScreenWorker::MultiScreenWorker(QObject *parent) , m_touchEventInter(new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus(), this)) , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) , m_launcherInter(new DBusLuncher(launcherService, launcherPath, QDBusConnection::sessionBus(), this)) + , m_appearanceInter(new Appearance("org.deepin.dde.Appearance1", "/org/deepin/dde/Appearance1", QDBusConnection::sessionBus(), this)) , m_monitorUpdateTimer(new QTimer(this)) , m_delayWakeTimer(new QTimer(this)) , m_position(Dock::Position::Bottom) @@ -591,7 +592,7 @@ void MultiScreenWorker::initUI() onPositionChanged(dockInter()->position()); onDisplayModeChanged(dockInter()->displayMode()); onHideModeChanged(dockInter()->hideMode()); - onOpacityChanged(m_dockInter->opacity()); + onOpacityChanged(m_appearanceInter->opacity()); } void MultiScreenWorker::initDockMode() @@ -707,7 +708,10 @@ void MultiScreenWorker::checkDaemonDockService() emit requestUpdateFrontendGeometry(); }); - connect(dockInter, &DockInter::OpacityChanged, this, &MultiScreenWorker::onOpacityChanged); + connect(m_appearanceInter, &Appearance::Changed, this, [ this ](const QString &ty, const QString &value) { + if (ty == "windowopacity") + onOpacityChanged(value.toDouble()); + }); connect(dockInter, &DockInter::WindowSizeEfficientChanged, this, &MultiScreenWorker::onWindowSizeChanged); connect(dockInter, &DockInter::WindowSizeFashionChanged, this, &MultiScreenWorker::onWindowSizeChanged); }; @@ -732,7 +736,7 @@ void MultiScreenWorker::checkDaemonDockService() onDisplayModeChanged(dockInter()->displayMode()); onHideModeChanged(dockInter()->hideMode()); onHideStateChanged(dockInter()->hideState()); - onOpacityChanged(m_dockInter->opacity()); + onOpacityChanged(m_appearanceInter->opacity()); disconnect(ifc); } diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index dc5b517ad..ee276598b 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -30,6 +30,7 @@ #include "org_deepin_dde_xeventmonitor1.h" #include "org_deepin_dde_launcher1.h" +#include "org_deepin_dde_appearance1.h" #include @@ -55,6 +56,7 @@ DGUI_USE_NAMESPACE using XEventMonitor = ::org::deepin::dde::XEventMonitor1; using DBusLuncher = ::org::deepin::dde::Launcher1; +using Appearance = org::deepin::dde::Appearance1; using namespace Dock; class QVariantAnimation; @@ -191,6 +193,7 @@ private: // DBus interface DockInter *m_dockInter; DBusLuncher *m_launcherInter; + Appearance *m_appearanceInter; // update monitor info QTimer *m_monitorUpdateTimer; From 75a9312fcb5ed3658da70b9dc5f1c27b13f9e984 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Tue, 13 Dec 2022 11:02:20 +0800 Subject: [PATCH 197/257] =?UTF-8?q?fix:=20=E9=80=82=E9=85=8D=E5=8D=8F?= =?UTF-8?q?=E5=90=8C=E5=90=8E=E7=AB=AF=E6=8E=A5=E5=8F=A3=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 协同后端修改导致问题。 Log: Bug: https://pms.uniontech.com/bug-view-176323.html Influence: 协同设备列表显示 Change-Id: I804ce4c3f8d8dab8f3c998664fa742b3f18aa67b --- plugins/display/collaborationdevmodel.cpp | 38 +++++++++++----------- plugins/display/collaborationdevmodel.h | 6 ++-- plugins/display/devcollaborationwidget.cpp | 8 ++--- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/plugins/display/collaborationdevmodel.cpp b/plugins/display/collaborationdevmodel.cpp index e9bbe3609..89cadfe65 100644 --- a/plugins/display/collaborationdevmodel.cpp +++ b/plugins/display/collaborationdevmodel.cpp @@ -135,7 +135,7 @@ CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent : QObject(parent) , m_path(devPath) , m_OS(-1) - , m_isPaired(false) + , m_isConnected(false) , m_isCooperated(false) , m_isValid(false) , m_isCooperating(false) @@ -145,8 +145,8 @@ CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent if (m_devDbusInter->isValid()) { m_name = m_devDbusInter->property("Name").toString(); m_OS = m_devDbusInter->property("OS").toInt(); - m_isPaired = m_devDbusInter->property("Paired").toBool(); - m_isCooperated = m_devDbusInter->property("Cooperating").toBool(); + m_isConnected = m_devDbusInter->property("Connected").toBool(); + m_isCooperated = m_devDbusInter->property("DeviceSharing").toBool(); m_uuid = m_devDbusInter->property("UUID").toString(); m_isValid = true; } else { @@ -182,22 +182,22 @@ QString CollaborationDevice::deviceIcon() const switch (m_OS) { case DeviceType::Android: { if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - return QString(":/icons/resources/ICON_Device_Headphone_dark.svg"); + return QString(":/ICON_Device_Headphone_dark.svg"); - return QString(":/icons/resources/ICON_Device_Headphone.svg"); + return QString(":/ICON_Device_Headphone.svg"); } default: { if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - return QString(":/icons/resources/ICON_Device_Laptop_dark.svg"); + return QString(":/ICON_Device_Laptop_dark.svg"); - return QString(":/icons/resources/ICON_Device_Laptop.svg"); + return QString(":/ICON_Device_Laptop.svg"); } } } -bool CollaborationDevice::isPaired() const +bool CollaborationDevice::isConnected() const { - return m_isPaired; + return m_isConnected; } bool CollaborationDevice::isCooperated() const @@ -221,19 +221,19 @@ void CollaborationDevice::onPropertyChanged(const QDBusMessage &msg) return; QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - if (changedProps.contains("Paired")) { - bool isPaired = changedProps.value("Paired").value(); - m_isPaired = isPaired; - if (isPaired && m_isCooperating) { + if (changedProps.contains("Connected")) { + bool isConnected = changedProps.value("Connected").value(); + m_isConnected = isConnected; + if (isConnected && m_isCooperating) { // paired 成功之后再去请求cooperate requestCooperate(); } - if (!isPaired){ + if (!isConnected){ Q_EMIT pairedStateChanged(false); } - } else if (changedProps.contains("Cooperating")) { - m_isCooperated = changedProps.value("Cooperating").value(); + } else if (changedProps.contains("DeviceSharing")) { + m_isCooperated = changedProps.value("DeviceSharing").value(); Q_EMIT pairedStateChanged(m_isCooperated); } @@ -241,7 +241,7 @@ void CollaborationDevice::onPropertyChanged(const QDBusMessage &msg) void CollaborationDevice::requestCooperate() const { - callMethod("RequestCooperate"); + callMethod("RequestDeviceSharing"); } void CollaborationDevice::disconnectDevice() const @@ -249,9 +249,9 @@ void CollaborationDevice::disconnectDevice() const callMethod("Disconnect"); } -void CollaborationDevice::pair() const +void CollaborationDevice::connect() const { - callMethod("Pair"); + callMethod("Connect"); } QDBusMessage CollaborationDevice::callMethod(const QString &methodName) const diff --git a/plugins/display/collaborationdevmodel.h b/plugins/display/collaborationdevmodel.h index 013624211..6313d04dc 100644 --- a/plugins/display/collaborationdevmodel.h +++ b/plugins/display/collaborationdevmodel.h @@ -76,7 +76,7 @@ signals: public: bool isValid() const; - void pair() const; + void connect() const; void requestCooperate() const; void disconnectDevice() const; @@ -84,7 +84,7 @@ public: QString uuid() const; QString machinePath() const; QString deviceIcon() const; - bool isPaired() const; + bool isConnected() const; bool isCooperated() const; void setDeviceIsCooperating(bool isCooperating); @@ -109,7 +109,7 @@ private: QString m_uuid; int m_OS; - bool m_isPaired; + bool m_isConnected; bool m_isCooperated; bool m_isValid; diff --git a/plugins/display/devcollaborationwidget.cpp b/plugins/display/devcollaborationwidget.cpp index 12706a6ee..cc3568fdd 100644 --- a/plugins/display/devcollaborationwidget.cpp +++ b/plugins/display/devcollaborationwidget.cpp @@ -195,9 +195,9 @@ void DevCollaborationWidget::itemClicked(const QModelIndex &index) if (!device) return; - if (!device->isPaired()) { + if (!device->isConnected()) { device->setDeviceIsCooperating(true); - device->pair(); + device->connect(); if (!m_connectingDevices.contains(machinePath)) m_connectingDevices.append(machinePath); } else if (!device->isCooperated()) { @@ -226,12 +226,12 @@ void DevCollaborationWidget::itemStatusChanged() // 更新item的连接状态 int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; m_deviceItemMap[machinePath]->setData(resultState, DevItemDelegate::ResultDataRole); - if (device->isCooperated() || !device->isPaired()) + if (device->isCooperated() || !device->isConnected()) m_deviceItemMap[machinePath]->setData(0, DevItemDelegate::DegreeDataRole); m_deviceListView->update(m_deviceItemMap[machinePath]->index()); - if ((resultState == DevItemDelegate::Connected || !device->isPaired()) && m_connectingDevices.contains(machinePath)) { + if ((resultState == DevItemDelegate::Connected || !device->isConnected()) && m_connectingDevices.contains(machinePath)) { m_connectingDevices.removeAll(machinePath); } } From 541cdf60e77bfde78a46835c2cc6a34a3b3973d5 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 12 Dec 2022 10:30:44 +0000 Subject: [PATCH 198/257] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E4=BB=8E?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E9=9D=A2=E6=9D=BF=E6=8B=96=E5=8A=A8=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E9=A9=BB=E7=95=99=E5=88=B0=E4=BB=BB=E5=8A=A1=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加从快捷面板拖动应用到任务栏的功能 Log: Influence: 从快捷面板拖动图标到任务栏,观察是否驻留在任务栏 Bug: https://pms.uniontech.com/bug-view-171517.html Change-Id: I3351be282ef8d3afbb55f227fc6ae8ce16c78a97 --- frame/CMakeLists.txt | 1 + frame/drag/quickdragcore.cpp | 147 +++++++++++++++++++ frame/drag/quickdragcore.h | 53 +++++++ frame/item/components/singlequickitem.cpp | 9 +- frame/item/quicksettingitem.cpp | 24 +--- frame/window/docktraywindow.cpp | 2 +- frame/window/quickpluginmodel.cpp | 106 ++++++++++++-- frame/window/quickpluginmodel.h | 2 + frame/window/quickpluginwindow.cpp | 168 +++++++++++++++------- frame/window/quickpluginwindow.h | 10 +- frame/window/quicksettingcontainer.cpp | 36 ++--- frame/window/quicksettingcontainer.h | 15 -- frame/window/traymanagerwindow.cpp | 2 +- 13 files changed, 435 insertions(+), 140 deletions(-) create mode 100644 frame/drag/quickdragcore.cpp create mode 100644 frame/drag/quickdragcore.h diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index fc38f7f11..949a9dbdf 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -73,6 +73,7 @@ target_include_directories(${BIN_NAME} PUBLIC window/components window/tray window/tray/widgets + drag xcb ../plugins/tray ../plugins/show-desktop diff --git a/frame/drag/quickdragcore.cpp b/frame/drag/quickdragcore.cpp new file mode 100644 index 000000000..d4325f57c --- /dev/null +++ b/frame/drag/quickdragcore.cpp @@ -0,0 +1,147 @@ +#include "quickdragcore.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QuickPluginMimeData::QuickPluginMimeData(PluginsItemInterface *item, QDrag *drag) + : QMimeData() + , m_item(item) + , m_drag(drag) +{ +} + +QuickPluginMimeData::~QuickPluginMimeData() +{ +} + +PluginsItemInterface *QuickPluginMimeData::pluginItemInterface() const +{ + return m_item; +} + +QDrag *QuickPluginMimeData::drag() const +{ + return m_drag; +} + +/** + * @brief 拖动图标的窗口,可以根据实际情况设置动态图标 + * @param dragSource + */ +QuickIconDrag::QuickIconDrag(QObject *dragSource, const QPixmap &pixmap) + : QDrag(dragSource) + , m_imageWidget(new QWidget) + , m_timer(new QTimer(this)) + , m_sourcePixmap(pixmap) + , m_hotPoint(QPoint(0, 0)) +{ + m_timer->setInterval(10); + connect(m_timer, &QTimer::timeout, this, &QuickIconDrag::onDragMove); + m_timer->start(); + + m_imageWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); + m_imageWidget->setAttribute(Qt::WA_TransparentForMouseEvents); + m_imageWidget->installEventFilter(this); + useSourcePixmap(); +} + +QuickIconDrag::~QuickIconDrag() +{ + m_imageWidget->deleteLater(); +} + +void QuickIconDrag::updatePixmap(QPixmap pixmap) +{ + if (m_sourcePixmap == pixmap) + return; + + m_pixmap = pixmap; + m_useSourcePixmap = false; + m_imageWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); + m_imageWidget->setFixedSize(pixmap.size()); + m_imageWidget->show(); + m_imageWidget->raise(); + m_imageWidget->update(); +} + +void QuickIconDrag::useSourcePixmap() +{ + m_useSourcePixmap = true; + m_imageWidget->setFixedSize(m_sourcePixmap.size()); + m_imageWidget->show(); + m_imageWidget->raise(); + m_imageWidget->update(); +} + +void QuickIconDrag::setDragHotPot(QPoint point) +{ + m_hotPoint = point; + m_imageWidget->update(); +} + +bool QuickIconDrag::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_imageWidget) { + switch (event->type()) { + case QEvent::Paint: { + QPixmap pixmap = m_useSourcePixmap ? m_sourcePixmap : m_pixmap; + QPainter painter(m_imageWidget); + painter.drawPixmap(QPoint(0, 0), pixmap); + + QPixmap pixmapMask(m_imageWidget->size()); + pixmapMask.fill(Qt::transparent); + QPainter painterMask(&pixmapMask); + QPainterPath path; + path.addRoundedRect(pixmapMask.rect(), 8, 8); + painterMask.fillPath(path, Qt::white); + painterMask.setRenderHint(QPainter::Antialiasing, true); + painterMask.setCompositionMode(QPainter::CompositionMode_Source); + painterMask.drawPixmap(0, 0, pixmap); + painterMask.setCompositionMode(QPainter::CompositionMode_DestinationIn); + QColor maskColor(Qt::black); + maskColor.setAlpha(150); + painterMask.fillRect(pixmapMask.rect(), maskColor); + painterMask.end(); + + // 绘制圆角 + QBitmap radiusMask(m_imageWidget->size()); + radiusMask.fill(); + QPainter radiusPainter(&radiusMask); + radiusPainter.setPen(Qt::NoPen); + radiusPainter.setBrush(Qt::black); + radiusPainter.setRenderHint(QPainter::Antialiasing); + radiusPainter.drawRoundedRect(radiusMask.rect(), 8, 8); + m_imageWidget->setMask(radiusMask); + + painter.end(); + break; + } + default: + break; + } + } + return QDrag::eventFilter(watched, event); +} + +QPoint QuickIconDrag::currentPoint() const +{ + QPoint mousePos = QCursor::pos(); + if (m_useSourcePixmap) + return mousePos - m_hotPoint; + + QSize pixmapSize = m_pixmap.size(); + return (mousePos - QPoint(pixmapSize.width() * (m_hotPoint.x() / m_sourcePixmap.width()) + , pixmapSize.height() * (m_hotPoint.y() / m_sourcePixmap.height()))); +} + +void QuickIconDrag::onDragMove() +{ + m_imageWidget->move(currentPoint()); +} diff --git a/frame/drag/quickdragcore.h b/frame/drag/quickdragcore.h new file mode 100644 index 000000000..0eee58dc2 --- /dev/null +++ b/frame/drag/quickdragcore.h @@ -0,0 +1,53 @@ +#ifndef QUICKDRAGCORE_H +#define QUICKDRAGCORE_H + +#include +#include +#include + +class PluginsItemInterface; +class QTimer; + +class QuickPluginMimeData : public QMimeData +{ + Q_OBJECT + +public: + explicit QuickPluginMimeData(PluginsItemInterface *item, QDrag *drag); + ~QuickPluginMimeData(); + PluginsItemInterface *pluginItemInterface() const; + QDrag *drag() const; + +private: + PluginsItemInterface *m_item; + QDrag *m_drag; +}; + +class QuickIconDrag : public QDrag +{ + Q_OBJECT + +public: + explicit QuickIconDrag(QObject *dragSource, const QPixmap &pixmap); + ~QuickIconDrag(); + void updatePixmap(QPixmap pixmap); + void useSourcePixmap(); + void setDragHotPot(QPoint point); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + QPoint currentPoint() const; + +private Q_SLOTS: + void onDragMove(); + +private: + QWidget *m_imageWidget; + QTimer *m_timer; + QPixmap m_sourcePixmap; + QPixmap m_pixmap; + QPoint m_hotPoint; + bool m_useSourcePixmap; +}; + +#endif // QUICKDRAGCORE_H diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp index 0ec6bf72e..695adf347 100644 --- a/frame/item/components/singlequickitem.cpp +++ b/frame/item/components/singlequickitem.cpp @@ -120,13 +120,8 @@ QPixmap SingleQuickItem::pixmap() const { // 如果快捷面板区域的图标为空,那么就获取itemWidget的截图 QIcon icon = pluginItem()->icon(DockPart::QuickPanel); - if (icon.isNull()) { - QWidget *itemWidget = pluginItem()->itemWidget(itemKey()); - if (itemWidget) { - itemWidget->setFixedSize(24, 24); - icon = itemWidget->grab(); - } - } + if (icon.isNull()) + return QPixmap(); int pixmapWidth = width(); int pixmapHeight = height(); diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 12b93785b..cbe791138 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -34,6 +34,8 @@ #include #include #include +#include +#include #define ICONWIDTH 24 #define ICONHEIGHT 24 @@ -72,27 +74,7 @@ DockItem::ItemType QuickSettingItem::itemType() const const QPixmap QuickSettingItem::dragPixmap() { - QPixmap pm = m_pluginInter->icon(DockPart::QuickPanel).pixmap(ICONWIDTH, ICONHEIGHT); - - QPainter pa(&pm); - pa.setPen(foregroundColor()); - pa.setCompositionMode(QPainter::CompositionMode_SourceIn); - pa.fillRect(pm.rect(), foregroundColor()); - - QPixmap pmRet(ICONWIDTH + ICONSPACE + FONTSIZE * 2, ICONHEIGHT + ICONSPACE + FONTSIZE * 2); - pmRet.fill(Qt::transparent); - QPainter paRet(&pmRet); - paRet.drawPixmap(QPoint((ICONSPACE + FONTSIZE * 2) / 2, 0), pm); - paRet.setPen(pa.pen()); - - QFont ft; - ft.setPixelSize(FONTSIZE); - paRet.setFont(ft); - QTextOption option; - option.setAlignment(Qt::AlignTop | Qt::AlignHCenter); - paRet.drawText(QRect(QPoint(0, ICONHEIGHT + ICONSPACE), - QPoint(pmRet.width(), pmRet.height())), m_pluginInter->pluginDisplayName(), option); - return pmRet; + return grab(); } const QString QuickSettingItem::itemKey() const diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index b1cc9e55f..a70fb1e9d 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -29,6 +29,7 @@ #include "pluginsitem.h" #include "quicksettingcontainer.h" #include "expandiconwidget.h" +#include "quickdragcore.h" #include @@ -313,7 +314,6 @@ void DockTrayWindow::initConnection() connect(m_systemPuginWidget, &SystemPluginWindow::itemChanged, this, &DockTrayWindow::onUpdateComponentSize); connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &DockTrayWindow::onUpdateComponentSize); connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, &DockTrayWindow::onUpdateComponentSize); - connect(m_quickIconWidget, &QuickPluginWindow::requestDrop, this, &DockTrayWindow::onDropIcon); connect(m_systemPuginWidget, &SystemPluginWindow::requestDrop, this, &DockTrayWindow::onDropIcon); connect(m_model, &TrayModel::rowCountChanged, this, &DockTrayWindow::onUpdateComponentSize); connect(m_model, &TrayModel::rowCountChanged, m_trayView, &TrayGridView::onUpdateEditorView); diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index 052885f69..190871af5 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -25,7 +25,6 @@ #include -static QStringList fixedPluginNames { "network", "sound", "power" }; #define PLUGINNAMEKEY "Dock_Quick_Plugin_Name" QuickPluginModel *QuickPluginModel::instance() @@ -40,17 +39,15 @@ void QuickPluginModel::addPlugin(PluginsItemInterface *itemInter, int index) if (QuickSettingController::instance()->pluginAttribute(itemInter) != QuickSettingController::PluginAttribute::Quick) return; - if (index < 0) { - // 如果索引值小于0,则认为它插在最后面 - index = m_dockedPluginIndex.size(); - } - - // 如果插入的插件在原来的插件列表中存在,并且位置相同,则不做任何的处理 - int oldIndex = m_dockedPluginIndex.contains(itemInter->pluginName()); + // 获取当前插件在插件区的位置索引(所有在任务栏上显示的插件) + int oldIndex = getCurrentIndex(itemInter); + // 计算插入之前的顺序 if (oldIndex == index && m_dockedPluginsItems.contains(itemInter)) return; - m_dockedPluginIndex[itemInter->pluginName()] = index; + // 根据插件区域的位置计算新的索引值 + int newIndex = generaIndex(index, oldIndex); + m_dockedPluginIndex[itemInter->pluginName()] = newIndex; if (!m_dockedPluginsItems.contains(itemInter)) { m_dockedPluginsItems << itemInter; // 保存配置到dConfig中 @@ -83,10 +80,10 @@ QList QuickPluginModel::dockedPluginItems() const QList dockedItems; QList activedItems; for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { - if (fixedPluginNames.contains(itemInter->pluginName())) - dockedItems << itemInter; - else + if (isFixed(itemInter)) activedItems << itemInter; + else + dockedItems << itemInter; } std::sort(dockedItems.begin(), dockedItems.end(), [ this ](PluginsItemInterface *item1, PluginsItemInterface *item2) { return m_dockedPluginIndex.value(item1->pluginName()) < m_dockedPluginIndex.value(item2->pluginName()); @@ -104,7 +101,7 @@ bool QuickPluginModel::isDocked(PluginsItemInterface *itemInter) const bool QuickPluginModel::isFixed(PluginsItemInterface *itemInter) const { - return fixedPluginNames.contains(itemInter->pluginName()); + return !(itemInter->flags() & PluginFlag::Attribute_CanInsert); } QuickPluginModel::QuickPluginModel(QObject *parent) @@ -206,3 +203,86 @@ void QuickPluginModel::saveConfig() }); SETTINGCONFIG->setValue(PLUGINNAMEKEY, plugins); } + +int QuickPluginModel::getCurrentIndex(PluginsItemInterface *itemInter) +{ + QList dockedPluginsItems = m_dockedPluginsItems; + std::sort(dockedPluginsItems.begin(), dockedPluginsItems.end(), [ this ](PluginsItemInterface *plugin1, PluginsItemInterface *plugin2) { + return m_dockedPluginIndex.value(plugin1->pluginName()) < m_dockedPluginIndex.value(plugin2->pluginName()); + }); + return dockedPluginItems().indexOf(itemInter); +} + +int QuickPluginModel::generaIndex(int insertIndex, int oldIndex) +{ + int newIndex = insertIndex; + if (oldIndex < 0) { + newIndex = insertIndex + 1; + // 如果该插件在列表中存在,则需要将原来的索引值加一 + if (insertIndex < 0) { + // 如果新插入的索引值为-1,则表示需要插入到末尾的位置,此时需要从索引值中找到最大值 + int lastIndex = -1; + for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { + int index = m_dockedPluginIndex.value(itemInter->pluginName()); + if (lastIndex < index) + lastIndex = index; + } + newIndex = lastIndex + 1; + } + if (m_dockedPluginIndex.values().contains(newIndex)) { + // 遍历map列表,检查列表中是否存在等于新索引的插件,如果存在,将其后面的索引值向后加一 + for (auto it = m_dockedPluginIndex.begin(); it != m_dockedPluginIndex.end(); it++) { + if (it.value() < newIndex) + continue; + + m_dockedPluginIndex[it.key()] = it.value() + 1; + } + } + } else { + newIndex = insertIndex; + // 如果该插件已经存在于下面的列表中,则分两种情况 + if (insertIndex < 0) { + // 如果插入在末尾,则计算最大值 + if (m_dockedPluginIndex.size() > 0) { + int maxIndex = m_dockedPluginIndex.first(); + for (auto it = m_dockedPluginIndex.begin(); it != m_dockedPluginIndex.end(); it++) { + if (maxIndex < it.value()) + maxIndex = it.value(); + } + return maxIndex; + } + return 0; + } + if (insertIndex > oldIndex) { + int minIndex = NGROUPS_MAX; + // 新的位置的索引值大于原来位置的索引值,则认为插入在原来的任务栏的后面,将前面的插件的索引值减去1 + for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { + int pluginDockIndex = getCurrentIndex(itemInter); + qInfo() << itemInter->pluginDisplayName() << m_dockedPluginIndex[itemInter->pluginName()] << pluginDockIndex; + if (pluginDockIndex > oldIndex) { + if (pluginDockIndex <= insertIndex) { + int tmpIndex = m_dockedPluginIndex[itemInter->pluginName()]; + if (tmpIndex < minIndex) + minIndex = tmpIndex; + } + m_dockedPluginIndex[itemInter->pluginName()]--; + } + qInfo() << itemInter->pluginDisplayName() << m_dockedPluginIndex[itemInter->pluginName()]; + } + + if (minIndex != NGROUPS_MAX) + newIndex = minIndex; + } else { + // 新的位置索引小于原来的索引值,则认为是插在任务栏的前面,将任务栏后面的插件的索引值加一 + for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { + int pluginDockIndex = getCurrentIndex(itemInter); + if (pluginDockIndex >= insertIndex) { + m_dockedPluginIndex[itemInter->pluginName()]++; + } + qInfo() << itemInter->pluginDisplayName() << m_dockedPluginIndex[itemInter->pluginName()]; + } + } + } + + return newIndex; +} diff --git a/frame/window/quickpluginmodel.h b/frame/window/quickpluginmodel.h index f028ef7de..a9a06f886 100644 --- a/frame/window/quickpluginmodel.h +++ b/frame/window/quickpluginmodel.h @@ -60,6 +60,8 @@ private: void initConnection(); void initConfig(); void saveConfig(); + int getCurrentIndex(PluginsItemInterface *itemInter); + int generaIndex(int sourceIndex, int oldIndex); private: QList m_dockedPluginsItems; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index a84b50b7e..bdd8f5ff1 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -26,6 +26,7 @@ #include "appdrag.h" #include "proxyplugincontroller.h" #include "quickpluginmodel.h" +#include "quickdragcore.h" #include #include @@ -39,6 +40,7 @@ #include #include #include +#include #define ITEMSIZE 22 #define ITEMSPACE 6 @@ -66,8 +68,8 @@ typedef struct DragInfo{ if (!dragPixmap()) return false; - return (qAbs(currentPoint.x() - dragPoint.x()) >= 5 || - qAbs(currentPoint.y() - dragPoint.y()) >= 5); + return (qAbs(currentPoint.x() - dragPoint.x()) >= 1 || + qAbs(currentPoint.y() - dragPoint.y()) >= 1); } QPixmap dragPixmap() const { @@ -94,10 +96,12 @@ QuickPluginWindow::QuickPluginWindow(QWidget *parent) , m_mainLayout(new QBoxLayout(QBoxLayout::RightToLeft, this)) , m_position(Dock::Position::Bottom) , m_dragInfo(new DragInfo) + , m_dragEnterMimeData(nullptr) { initUi(); initConnection(); + topLevelWidget()->installEventFilter(this); installEventFilter(this); setAcceptDrops(true); setMouseTracking(true); @@ -197,6 +201,22 @@ PluginsItemInterface *QuickPluginWindow::findQuickSettingItem(const QPoint &mous bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) { + if (watched == topLevelWidget()) { + switch (event->type()) { + case QEvent::DragEnter: { + QDragEnterEvent *dragEvent = static_cast(event); + dragEnterEvent(dragEvent); + break; + } + case QEvent::DragLeave: { + QDragLeaveEvent *dragEvent = static_cast(event); + dragLeaveEvent(dragEvent); + break; + } + default: + break; + } + } switch (event->type()) { case QEvent::MouseButtonPress: { QMouseEvent *mouseEvent = static_cast(event); @@ -223,7 +243,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) if (m_dragInfo->canDrag(mouseEvent->pos())) break; - showPopup(qobject_cast(watched)); + showPopup(m_dragInfo->dockItem); } while (false); m_dragInfo->reset(); @@ -241,7 +261,13 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) break; } case QEvent::Drop: { - Q_EMIT requestDrop(static_cast(event)); + m_dragEnterMimeData = nullptr; + QDropEvent *dropEvent = static_cast(event); + if (qobject_cast(dropEvent->source())) { + const QuickPluginMimeData *mimeData = qobject_cast(dropEvent->mimeData()); + if (mimeData) + dragPlugin(mimeData->pluginItemInterface()); + } break; } default: @@ -250,6 +276,35 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) return QWidget::eventFilter(watched, event); } +void QuickPluginWindow::dragEnterEvent(QDragEnterEvent *event) +{ + m_dragEnterMimeData = const_cast(qobject_cast(event->mimeData())); + if (m_dragEnterMimeData) { + QIcon icon = m_dragEnterMimeData->pluginItemInterface()->icon(DockPart::QuickShow); + QuickIconDrag *drag = qobject_cast(m_dragEnterMimeData->drag()); + if (drag && !icon.isNull()) { + QPixmap pixmap = icon.pixmap(QSize(16, 16)); + drag->updatePixmap(pixmap); + } + event->accept(); + } else { + event->ignore(); + } +} + +void QuickPluginWindow::dragLeaveEvent(QDragLeaveEvent *event) +{ + if (m_dragEnterMimeData) { + QPoint mousePos = topLevelWidget()->mapFromGlobal(QCursor::pos()); + QuickIconDrag *drag = static_cast(m_dragEnterMimeData->drag()); + if (!topLevelWidget()->rect().contains(mousePos) && drag) { + static_cast(m_dragEnterMimeData->drag())->useSourcePixmap(); + } + m_dragEnterMimeData = nullptr; + } + event->accept(); +} + void QuickPluginWindow::onRequestUpdate() { bool countChanged = false; @@ -364,24 +419,22 @@ void QuickPluginWindow::startDrag() return; PluginsItemInterface *moveItem = m_dragInfo->dockItem->pluginItem(); - AppDrag *drag = new AppDrag(this, new QuickDragWidget); - QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem); + //AppDrag *drag = new AppDrag(this, new QuickDragWidget); + QDrag *drag = new QDrag(this); + QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem, drag); drag->setMimeData(mimedata); - drag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size())); QPixmap dragPixmap = m_dragInfo->dragPixmap(); drag->setPixmap(dragPixmap); - drag->setHotSpot(QPoint(0, 0)); + drag->setHotSpot(dragPixmap.rect().center()); + //connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, &QuickPluginWindow::onPluginDropItem); + //connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, &QuickPluginWindow::onPluginDragMove); - connect(drag->appDragWidget(), &AppDragWidget::requestSplitWindow, this, [ this, moveItem ] { - QuickPluginModel::instance()->removePlugin(moveItem); - Q_EMIT itemCountChanged(); - }); - - connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, &QuickPluginWindow::onPluginDropItem); - connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, &QuickPluginWindow::onPluginDragMove); - - drag->exec(Qt::MoveAction | Qt::CopyAction); + drag->exec(Qt::CopyAction); + // 获取当前鼠标在任务栏快捷图标区域的位置 + QPoint currentPoint = mapFromGlobal(QCursor::pos()); + // 获取区域图标插入的位置 + QuickPluginModel::instance()->addPlugin(mimedata->pluginItemInterface(), getDropIndex(currentPoint)); } QuickDockItem *QuickPluginWindow::getDockItemByPlugin(PluginsItemInterface *item) @@ -447,62 +500,69 @@ void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *ite QuickSettingContainer *container = static_cast(popWindow->getContent()); container->showPage(childPage, itemInter, canBack); + popWindow->raise(); +} + +QList QuickPluginWindow::quickDockItems() +{ + QList dockItems; + for (int i = 0; i < m_mainLayout->count(); i++) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + QuickDockItem *dockedItem = qobject_cast(layoutItem->widget()); + if (!dockedItem) + continue; + + dockItems << dockedItem; + } + + return dockItems; } int QuickPluginWindow::getDropIndex(QPoint point) { + QList dockedItems = quickDockItems(); QuickDockItem *targetItem = getActiveDockItem(point); if (targetItem) { - for (int i = 0; i < m_mainLayout->count(); i++) { - QLayoutItem *layoutItem = m_mainLayout->itemAt(i); - if (!layoutItem) - continue; - - if (layoutItem->widget() == targetItem) + for (int i = 0; i < dockedItems.count(); i++) { + if (dockedItems[i] == targetItem) return i; } return -1; } - // 上下方向从右向左排列 + QList dockItemInter = QuickPluginModel::instance()->dockedPluginItems(); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - for (int i = 0; i < m_mainLayout->count() - 1; i++) { - QLayoutItem *layoutBefore = m_mainLayout->itemAt(i); - QLayoutItem *layoutItem = m_mainLayout->itemAt(i + 1); - if (!layoutBefore || !layoutItem) - continue; - - QuickDockItem *dockBeforeItem = qobject_cast(layoutBefore->widget()); - QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); - if (dockItem->canInsert()) + // 上下方向从右向左排列 + for (int i = 0; i < dockItemInter.count() - 1; i++) { + QuickDockItem *dockBeforeItem = dockedItems[i]; + QuickDockItem *dockItem = dockedItems[i + 1]; + if (!dockItem->canInsert()) continue; if (dockBeforeItem->geometry().x() > point.x() && dockItem->geometry().right() < point.x()) return i; } - } - for (int i = 0; i < m_mainLayout->count() - 1; i++) { - QLayoutItem *layoutBefore = m_mainLayout->itemAt(i); - QLayoutItem *layoutItem = m_mainLayout->itemAt(i + 1); - if (!layoutBefore || !layoutItem) - continue; + } else { + // 左右方向从下向上排列 + for (int i = 0; i < dockItemInter.count() - 1; i++) { + QuickDockItem *dockBeforeItem = dockedItems[i]; + QuickDockItem *dockItem = dockedItems[i + 1]; + if (!dockItem->canInsert()) + continue; - QuickDockItem *dockBeforeItem = qobject_cast(layoutBefore->widget()); - if (dockBeforeItem->canInsert()) - break; - - QuickDockItem *dockItem = qobject_cast(layoutItem->widget()); - - // 从上向下排列 - if (dockBeforeItem->geometry().bottom() < point.y() && dockItem->geometry().top() > point.y()) - return i; + if (dockBeforeItem->geometry().bottom() > point.y() && dockItem->geometry().top() < point.y()) + return i; + } } // 如果都没有找到,直接插入到最后 return -1; } -void QuickPluginWindow::onPluginDropItem(QDropEvent *event) +/*void QuickPluginWindow::onPluginDropItem(QDropEvent *event) { const QuickPluginMimeData *data = qobject_cast(event->mimeData()); if (!data) @@ -512,7 +572,7 @@ void QuickPluginWindow::onPluginDropItem(QDropEvent *event) QPoint currentPoint = mapFromGlobal(QCursor::pos()); // 获取区域图标插入的位置 QuickPluginModel::instance()->addPlugin(data->pluginItemInterface(), getDropIndex(currentPoint)); -} +}*/ void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) { @@ -549,6 +609,11 @@ void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) event->accept(); } +void QuickPluginWindow::dragMoveEvent(QDragMoveEvent *event) +{ + event->accept(); +} + void QuickPluginWindow::initConnection() { QuickPluginModel *model = QuickPluginModel::instance(); @@ -571,7 +636,6 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QString &it , m_contextMenu(new QMenu(this)) , m_tipParent(nullptr) , m_mainLayout(nullptr) - , m_canInsert(QuickSettingController::instance()->hasFlag(pluginItem, PluginFlag::Attribute_CanInsert)) , m_dockItemParent(nullptr) { initUi(); @@ -595,7 +659,7 @@ PluginsItemInterface *QuickDockItem::pluginItem() bool QuickDockItem::canInsert() const { - return m_canInsert; + return (m_pluginItem->flags() & PluginFlag::Attribute_CanInsert); } void QuickDockItem::hideToolTip() diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index f2d10e29d..563541ef9 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -36,6 +36,7 @@ class QBoxLayout; class QuickDockItem; class DockPopupWindow; class QMenu; +class QuickPluginMimeData; enum class DockPart; namespace Dtk { namespace Gui { class DRegionMonitor; } @@ -59,14 +60,16 @@ public: Q_SIGNALS: void itemCountChanged(); - void requestDrop(QDropEvent *dropEvent); protected: bool eventFilter(QObject *watched, QEvent *event) override; + void dragEnterEvent(QDragEnterEvent *event) override; + void dragLeaveEvent(QDragLeaveEvent *event) override; + void dragMoveEvent(QDragMoveEvent *event) override; private Q_SLOTS: void onRequestUpdate(); - void onPluginDropItem(QDropEvent *event); + //void onPluginDropItem(QDropEvent *event); void onPluginDragMove(QDragMoveEvent *event); void onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart); void onRequestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); @@ -81,11 +84,13 @@ private: QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); QuickDockItem *getActiveDockItem(QPoint point) const; void showPopup(QuickDockItem *item, PluginsItemInterface *itemInter = nullptr, QWidget *childPage = nullptr); + QList quickDockItems(); private: QBoxLayout *m_mainLayout; Dock::Position m_position; struct DragInfo *m_dragInfo; + QuickPluginMimeData *m_dragEnterMimeData; }; // 用于在任务栏上显示的插件 @@ -131,7 +136,6 @@ private: QMenu *m_contextMenu; QWidget *m_tipParent; QHBoxLayout *m_mainLayout; - bool m_canInsert; QWidget *m_dockItemParent; }; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp index 34f6b6519..0c110cea9 100644 --- a/frame/window/quicksettingcontainer.cpp +++ b/frame/window/quicksettingcontainer.cpp @@ -26,6 +26,7 @@ #include "slidercontainer.h" #include "pluginchildpage.h" #include "utils.h" +#include "quickdragcore.h" #include #include @@ -35,6 +36,9 @@ #include #include #include +#include +#include +#include DWIDGET_USE_NAMESPACE @@ -132,8 +136,7 @@ DockPopupWindow *QuickSettingContainer::popWindow() m_popWindow->setArrowHeight(10); m_popWindow->setArrowDirection(getDirection(m_position)); m_popWindow->setContent(new QuickSettingContainer(m_popWindow)); - if (Utils::IS_WAYLAND_DISPLAY) - m_popWindow->setWindowFlags(m_popWindow->windowFlags() | Qt::FramelessWindowHint); + m_popWindow->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); return m_popWindow; } @@ -181,17 +184,6 @@ bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) return QWidget::eventFilter(watched, event); } -QPoint QuickSettingContainer::hotSpot(const QPixmap &pixmap) -{ - if (m_position == Dock::Position::Left) - return QPoint(0, pixmap.height()); - - if (m_position == Dock::Position::Top) - return QPoint(pixmap.width(), 0); - - return QPoint(pixmap.width(), pixmap.height()); -} - void QuickSettingContainer::appendPlugin(PluginsItemInterface *itemInter, bool needLayout) { QuickSettingItem *quickItem = QuickSettingFactory::createQuickWidget(itemInter); @@ -259,24 +251,14 @@ void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) QPoint pointCurrent = event->pos(); if (qAbs(m_dragInfo->dragPosition.x() - pointCurrent.x()) > 5 || qAbs(m_dragInfo->dragPosition.y() - pointCurrent.y()) > 5) { - - QDrag *drag = new QDrag(this); QuickSettingItem *moveItem = qobject_cast(m_dragInfo->dragItem); - QuickPluginMimeData *mimedata = new QuickPluginMimeData(m_dragInfo->pluginInter); + QuickIconDrag *drag = new QuickIconDrag(this, moveItem->dragPixmap()); + QuickPluginMimeData *mimedata = new QuickPluginMimeData(m_dragInfo->pluginInter, drag); drag->setMimeData(mimedata); - if (moveItem) { - QPixmap dragPixmap = moveItem->dragPixmap(); - drag->setPixmap(dragPixmap); - drag->setHotSpot(hotSpot(dragPixmap)); - } else { - // 如果拖动的是声音等插件 - QPixmap dragPixmap = m_dragInfo->dragItem->grab(); - drag->setPixmap(dragPixmap); - drag->setHotSpot(hotSpot(dragPixmap)); - } + drag->setDragHotPot(m_dragInfo->dragPosition); m_dragInfo->reset(); - drag->exec(Qt::MoveAction | Qt::CopyAction); + drag->exec(Qt::CopyAction); } } diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h index 149fb259d..c04941412 100644 --- a/frame/window/quicksettingcontainer.h +++ b/frame/window/quicksettingcontainer.h @@ -77,8 +77,6 @@ private: void updateItemLayout(); // 调整全列插件的位置 void updateFullItemLayout(); - // 获取拖动图标的热点 - QPoint hotSpot(const QPixmap &pixmap); // 插入插件 void appendPlugin(PluginsItemInterface *itemInter, bool needLayout = true); @@ -98,17 +96,4 @@ private: PluginsItemInterface *m_childShowPlugin; }; -class QuickPluginMimeData : public QMimeData -{ - Q_OBJECT - -public: - explicit QuickPluginMimeData(PluginsItemInterface *item) : QMimeData(), m_item(item) {} - ~QuickPluginMimeData() {} - PluginsItemInterface *pluginItemInterface() const { return m_item; } - -private: - PluginsItemInterface *m_item; -}; - #endif // PLUGINCONTAINER_H diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 031fb166a..bce900894 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -28,6 +28,7 @@ #include "systempluginwindow.h" #include "datetimedisplayer.h" #include "expandiconwidget.h" +#include "quickdragcore.h" #include #include @@ -40,7 +41,6 @@ #include #include -#define MAXFIXEDSIZE 999999 #define CRITLCALHEIGHT 42 #define CONTENTSPACE 7 // 高度小于等于这个值的时候,间距最小值 From 477bc099656bdb67ad161800893bbc2afec8ce60 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 8 Dec 2022 08:20:54 +0000 Subject: [PATCH 199/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=87=8D?= =?UTF-8?q?=E5=90=AFAM=E5=90=8E=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=B4=A9?= =?UTF-8?q?=E6=BA=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、重启AM后,需要重新更新每个子部件的dockInter,因为这些字部件的dockInter是从MultiScreenWorker类中获取的,而MultiScreenWorker类中的dockInter已经被释放重新获取了; 2、重新启动AM后,由于任务栏会重新执行positionChanged的方法,在这个过程中会执行300毫秒的动画,在动画执行完成后,会判断当前服务是否重启过,如果重启过服务,则重新刷新界面 Log: 修复重启AM后任务栏崩溃的问题 Influence: 重启AM服务,观察任务栏是否重启 Task: https://pms.uniontech.com/task-view-225201.html Change-Id: I1d5337fe7a0101450dfce7338d32aad73c14f697 --- frame/controller/recentapphelper.cpp | 5 ++++ frame/controller/recentapphelper.h | 1 + frame/util/menuworker.cpp | 4 +-- frame/util/menuworker.h | 2 +- frame/util/multiscreenworker.cpp | 41 ++++++++++++---------------- frame/util/multiscreenworker.h | 4 ++- frame/window/mainpanelcontrol.cpp | 6 ++++ frame/window/mainpanelcontrol.h | 1 + frame/window/mainwindow.cpp | 18 ++++++++++++ frame/window/mainwindow.h | 3 ++ frame/window/mainwindowbase.cpp | 7 ++--- frame/window/mainwindowbase.h | 3 +- frame/window/windowmanager.cpp | 25 ++++++++++++++++- frame/window/windowmanager.h | 3 ++ 14 files changed, 89 insertions(+), 34 deletions(-) diff --git a/frame/controller/recentapphelper.cpp b/frame/controller/recentapphelper.cpp index bec585701..a0c576bd1 100644 --- a/frame/controller/recentapphelper.cpp +++ b/frame/controller/recentapphelper.cpp @@ -87,6 +87,11 @@ bool RecentAppHelper::dockAppIsVisible() const || m_appWidget->layout()->count() > 0); } +void RecentAppHelper::updateDockInter(DockInter *dockInter) +{ + m_dockInter = dockInter; +} + bool RecentAppHelper::eventFilter(QObject *watched, QEvent *event) { if (watched == m_appWidget || watched == m_recentWidget) { diff --git a/frame/controller/recentapphelper.h b/frame/controller/recentapphelper.h index d67c038b6..3c71ceb38 100644 --- a/frame/controller/recentapphelper.h +++ b/frame/controller/recentapphelper.h @@ -47,6 +47,7 @@ public: void removeAppItem(DockItem *dockItem); bool recentIsVisible() const; bool dockAppIsVisible() const; + void updateDockInter(DockInter *dockInter); Q_SIGNALS: void requestUpdate(); diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index 91e18dcd2..560c7fa7c 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -32,9 +32,9 @@ #define DIS_INS DisplayManager::instance() -MenuWorker::MenuWorker(QObject *parent) +MenuWorker::MenuWorker(DockInter *dockInter, QObject *parent) : QObject(parent) - , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) + , m_dockInter(dockInter) { } diff --git a/frame/util/menuworker.h b/frame/util/menuworker.h index f62d47fa7..cf7909ca9 100644 --- a/frame/util/menuworker.h +++ b/frame/util/menuworker.h @@ -35,7 +35,7 @@ class MenuWorker : public QObject { Q_OBJECT public: - explicit MenuWorker(QObject *parent = nullptr); + explicit MenuWorker(DockInter *dockInter, QObject *parent = nullptr); void exec(); diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index ec9dad4ea..c86cf5c68 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -63,16 +63,15 @@ MultiScreenWorker::MultiScreenWorker(QObject *parent) , m_appearanceInter(new Appearance("org.deepin.dde.Appearance1", "/org/deepin/dde/Appearance1", QDBusConnection::sessionBus(), this)) , m_monitorUpdateTimer(new QTimer(this)) , m_delayWakeTimer(new QTimer(this)) - , m_position(Dock::Position::Bottom) - , m_hideMode(Dock::HideMode::KeepShowing) - , m_hideState(Dock::HideState::Show) - , m_displayMode(Dock::DisplayMode::Efficient) + , m_position(Dock::Position(-1)) + , m_hideMode(Dock::HideMode(-1)) + , m_hideState(Dock::HideState(-1)) + , m_displayMode(Dock::DisplayMode(-1)) , m_state(AutoHide) { initConnection(); initMembers(); initDockMode(); - initUI(); QMetaObject::invokeMethod(this, &MultiScreenWorker::initDisplayData, Qt::QueuedConnection); } @@ -252,7 +251,7 @@ void MultiScreenWorker::onHideModeChanged(int hideMode) void MultiScreenWorker::onHideStateChanged(int state) { - if (state == Dock::Unknown) + if (state == m_hideState) return; m_hideState = static_cast(state); @@ -573,11 +572,6 @@ void MultiScreenWorker::initConnection() connect(m_launcherInter, static_cast(&DBusLuncher::VisibleChanged), this, [ = ](bool value) { setStates(LauncherDisplay, value); }); - connect(m_dockInter, &DockInter::PositionChanged, this, &MultiScreenWorker::onPositionChanged); - connect(m_dockInter, &DockInter::DisplayModeChanged, this, &MultiScreenWorker::onDisplayModeChanged); - connect(m_dockInter, &DockInter::HideModeChanged, this, &MultiScreenWorker::onHideModeChanged); - connect(m_dockInter, &DockInter::HideStateChanged, this, &MultiScreenWorker::onHideStateChanged); - connect(this, &MultiScreenWorker::requestUpdatePosition, this, &MultiScreenWorker::onRequestUpdatePosition); connect(this, &MultiScreenWorker::requestUpdateMonitorInfo, this, &MultiScreenWorker::onRequestUpdateMonitorInfo); @@ -587,22 +581,14 @@ void MultiScreenWorker::initConnection() connect(m_monitorUpdateTimer, &QTimer::timeout, this, &MultiScreenWorker::updateDisplay); } -void MultiScreenWorker::initUI() -{ - onPositionChanged(dockInter()->position()); - onDisplayModeChanged(dockInter()->displayMode()); - onHideModeChanged(dockInter()->hideMode()); - onOpacityChanged(m_appearanceInter->opacity()); -} - void MultiScreenWorker::initDockMode() { if (m_dockInter->isValid()) { - m_position = static_cast(m_dockInter->position()); - m_hideMode = static_cast(m_dockInter->hideMode()); - m_hideState = static_cast(m_dockInter->hideState()); - m_displayMode = static_cast(m_dockInter->displayMode()); - m_opacity = m_dockInter->opacity(); + onPositionChanged(dockInter()->position()); + onDisplayModeChanged(dockInter()->displayMode()); + onHideModeChanged(dockInter()->hideMode()); + onHideStateChanged(m_dockInter->hideState()); + onOpacityChanged(m_dockInter->opacity()); DockItem::setDockPosition(m_position); qApp->setProperty(PROP_POSITION, QVariant::fromValue(m_position)); @@ -714,6 +700,10 @@ void MultiScreenWorker::checkDaemonDockService() }); connect(dockInter, &DockInter::WindowSizeEfficientChanged, this, &MultiScreenWorker::onWindowSizeChanged); connect(dockInter, &DockInter::WindowSizeFashionChanged, this, &MultiScreenWorker::onWindowSizeChanged); + connect(dockInter, &DockInter::PositionChanged, this, &MultiScreenWorker::onPositionChanged); + connect(dockInter, &DockInter::DisplayModeChanged, this, &MultiScreenWorker::onDisplayModeChanged); + connect(dockInter, &DockInter::HideModeChanged, this, &MultiScreenWorker::onHideModeChanged); + connect(dockInter, &DockInter::HideStateChanged, this, &MultiScreenWorker::onHideStateChanged); }; QDBusConnectionInterface *ifc = QDBusConnection::sessionBus().interface(); @@ -728,6 +718,9 @@ void MultiScreenWorker::checkDaemonDockService() // connect connectionInit(m_dockInter); + // 通知主窗体服务已经重启了,需要重新获取DockInter + emit serviceRestart(); + // reinit data reInitDisplayData(); diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index ee276598b..283cc379f 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -127,6 +127,9 @@ signals: void requestPlayAnimation(const QString &screenName, const Position &position, const Dock::AniAction &animation, bool containMouse = false, bool updatePos = false); void requestChangeDockPosition(const QString &fromScreen, const QString &toScreen, const Position &fromPos, const Position &toPos); + // 服务重新启动的信号 + void serviceRestart(); + public slots: void onAutoHideChanged(const bool autoHide); void onRequestUpdateRegionMonitor(); @@ -163,7 +166,6 @@ private: void initMembers(); void initDockMode(); void initConnection(); - void initUI(); void initDisplayData(); void reInitDisplayData(); diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 4fe441b9b..fcb206c33 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -971,6 +971,12 @@ void MainPanelControl::updatePluginsLayout() } } +void MainPanelControl::updateDockInter(DockInter *dockInter) +{ + m_dockInter = dockInter; + m_recentHelper->updateDockInter(dockInter); +} + QSize MainPanelControl::suitableSize(const Position &position, int screenSize, double deviceRatio) const { if (screenSize <= 0) diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index f7929b601..061bc776a 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -52,6 +52,7 @@ public: void setDisplayMode(DisplayMode dislayMode); void resizeDockIcon(); void updatePluginsLayout(); + void updateDockInter(DockInter *dockInter); QSize suitableSize(const Position &position, int screenSize, double deviceRatio) const; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 8e7045720..62808c0fe 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -60,6 +60,7 @@ MainWindow::MainWindow(MultiScreenWorker *multiScreenWorker, QWidget *parent) : MainWindowBase(multiScreenWorker, parent) , m_mainPanel(new MainPanelControl(multiScreenWorker->dockInter(), this)) , m_multiScreenWorker(multiScreenWorker) + , m_needUpdateUi(false) { m_mainPanel->setDisplayMode(m_multiScreenWorker->displayMode()); @@ -169,3 +170,20 @@ void MainWindow::resetPanelGeometry() m_mainPanel->setFixedSize(size()); m_mainPanel->move(0, 0); } + +void MainWindow::serviceRestart() +{ + m_mainPanel->updateDockInter(m_multiScreenWorker->dockInter()); + // 在重启服务后,MultiScreenWorker会通知WindowManager类执行PositionChanged动画,在执行此动作过程中 + // 会执行动画,动画需要消耗时间,因此, 在重启服务后,需要标记更新UI,在稍后动画执行结束后,需要重新刷新界面的显示,否则任务栏显示错误 + m_needUpdateUi = true; +} + +void MainWindow::animationFinished(bool showOrHide) +{ + if (m_needUpdateUi) { + // 在动画执行结束后,如果收到需要更新UI的标记,那么则需要重新请求更新界面,在更新结束后,再将更新UI标记为false,那么在下次进来的时候,无需再次更新UI + Q_EMIT requestUpdate(); + m_needUpdateUi = false; + } +} diff --git a/frame/window/mainwindow.h b/frame/window/mainwindow.h index 2301a0931..5f9f83467 100644 --- a/frame/window/mainwindow.h +++ b/frame/window/mainwindow.h @@ -59,6 +59,8 @@ public: void updateParentGeometry(const Dock::Position &pos, const QRect &rect) override; QSize suitableSize(const Dock::Position &pos, const int &screenSize, const double &deviceRatio) const override; void resetPanelGeometry() override; + void serviceRestart() override; + void animationFinished(bool showOrHide) override; private: using QWidget::show; @@ -74,6 +76,7 @@ private: QString m_registerKey; QStringList m_registerKeys; + bool m_needUpdateUi; }; #endif // MAINWINDOW_H diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index a6f361e19..6d35ba432 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -54,7 +54,6 @@ MainWindowBase::MainWindowBase(MultiScreenWorker *multiScreenWorker, QWidget *pa : DBlurEffectWidget(parent) , m_displayMode(Dock::DisplayMode::Efficient) , m_position(Dock::Position::Bottom) - , m_dockInter(multiScreenWorker->dockInter()) , m_dragWidget(new DragWidget(this)) , m_multiScreenWorker(multiScreenWorker) , m_updateDragAreaTimer(new QTimer(this)) @@ -571,9 +570,9 @@ Dock::Position MainWindowBase::position() const int MainWindowBase::windowSize() const { if (m_displayMode == Dock::DisplayMode::Efficient) - return m_dockInter->windowSizeEfficient(); + return m_multiScreenWorker->dockInter()->windowSizeEfficient(); - return m_dockInter->windowSizeFashion(); + return m_multiScreenWorker->dockInter()->windowSizeFashion(); } bool MainWindowBase::isDraging() const @@ -633,7 +632,7 @@ void MainWindowBase::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton && geometry().contains(QCursor::pos())) { m_multiScreenWorker->onAutoHideChanged(false); - MenuWorker menuWorker; + MenuWorker menuWorker(m_multiScreenWorker->dockInter()); menuWorker.exec(); m_multiScreenWorker->onAutoHideChanged(true); } diff --git a/frame/window/mainwindowbase.h b/frame/window/mainwindowbase.h index b12ef219f..0b38cb1d7 100644 --- a/frame/window/mainwindowbase.h +++ b/frame/window/mainwindowbase.h @@ -63,6 +63,8 @@ public: QVariantAnimation *createAnimation(QScreen *screen, const Dock::Position &pos, const Dock::AniAction &act); virtual void resetPanelGeometry() {} // 重置内部区域,为了让内部区域和当前区域始终保持一致 virtual int dockSpace() const; // 与后面窗体之间的间隔 + virtual void serviceRestart() {} // 服务重新启动后的操作 + virtual void animationFinished(bool showOrHide) {} Q_SIGNALS: void requestUpdate(); @@ -105,7 +107,6 @@ private Q_SLOTS: private: Dock::DisplayMode m_displayMode; Dock::Position m_position; - DockInter *m_dockInter; DragWidget *m_dragWidget; MultiScreenWorker *m_multiScreenWorker; QTimer *m_updateDragAreaTimer; diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 7d9b2975d..f65cd4b81 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -325,6 +325,16 @@ void WindowManager::showAniFinish() onRequestNotifyWindowManager(); } +void WindowManager::animationFinish(bool showOrHide) +{ + for (MainWindowBase *mainWindow : m_topWindows) { + if (!mainWindow->isVisible()) + continue; + + mainWindow->animationFinished(showOrHide); + } +} + void WindowManager::hideAniFinish() { DockItem::setDockPosition(m_position); @@ -416,6 +426,8 @@ void WindowManager::updateDockGeometry(const QRect &rect) return; QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + if (!screen || m_position == Dock::Position(-1)) + return; for (MainWindowBase *mainWindow : m_topWindows) { if (!mainWindow->isVisible()) @@ -444,6 +456,7 @@ void WindowManager::updateDockGeometry(const QRect &rect) windowShowSize.setWidth(rect.width()); break; } + default: break; } mainWindow->blockSignals(true); @@ -462,11 +475,12 @@ void WindowManager::initConnection() { connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &WindowManager::onDbusNameOwnerChanged); - connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateDockGeometry, this, &WindowManager::onUpdateDockGeometry); + connect(m_multiScreenWorker, &MultiScreenWorker::serviceRestart, this, &WindowManager::onServiceRestart); connect(m_multiScreenWorker, &MultiScreenWorker::positionChanged, this, &WindowManager::onPositionChanged); connect(m_multiScreenWorker, &MultiScreenWorker::displayModeChanged, this, &WindowManager::onDisplayModeChanged); connect(m_multiScreenWorker, &MultiScreenWorker::requestPlayAnimation, this, &WindowManager::onPlayAnimation); connect(m_multiScreenWorker, &MultiScreenWorker::requestChangeDockPosition, this, &WindowManager::onChangeDockPosition); + connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateDockGeometry, this, &WindowManager::onUpdateDockGeometry); connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateFrontendGeometry, this, &WindowManager::onRequestUpdateFrontendGeometry); connect(m_multiScreenWorker, &MultiScreenWorker::requestNotifyWindowManager, this, &WindowManager::onRequestNotifyWindowManager); connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateFrontendGeometry, DockItemManager::instance(), &DockItemManager::requestUpdateDockItem); @@ -557,12 +571,14 @@ void WindowManager::onPlayAnimation(const QString &screenName, const Dock::Posit if (updatePos) onPositionChanged(m_multiScreenWorker->position()); m_multiScreenWorker->setStates(MultiScreenWorker::ShowAnimationStart, false); + animationFinish(true); break; case Dock::AniAction::Hide: hideAniFinish(); if (updatePos) onPositionChanged(m_multiScreenWorker->position()); m_multiScreenWorker->setStates(MultiScreenWorker::HideAnimationStart, false); + animationFinish(false); break; } }); @@ -642,6 +658,7 @@ void WindowManager::onChangeDockPosition(QString fromScreen, QString toScreen, c // 结束之后需要根据确定需要再隐藏 showAniFinish(); m_multiScreenWorker->setStates(MultiScreenWorker::ChangePositionAnimationStart, false); + animationFinish(true); }); for (QParallelAnimationGroup *ani : animations) { @@ -805,3 +822,9 @@ void WindowManager::onRequestNotifyWindowManager() static_cast(strutEnd)); // 设置任务栏终点坐标(上下为x,左右为y) } } + +void WindowManager::onServiceRestart() +{ + for (MainWindowBase *mainWindow : m_topWindows) + mainWindow->serviceRestart(); +} diff --git a/frame/window/windowmanager.h b/frame/window/windowmanager.h index 9cf681899..438fd38ee 100644 --- a/frame/window/windowmanager.h +++ b/frame/window/windowmanager.h @@ -63,6 +63,7 @@ private: QParallelAnimationGroup *createAnimationGroup(const Dock::AniAction &aniAction, const QString &screenName, const Dock::Position &position) const; void showAniFinish(); + void animationFinish(bool showOrHide); void hideAniFinish(); QRect getDockGeometry(bool withoutScale = false) const; // 计算左右侧加起来的区域大小 @@ -81,6 +82,8 @@ private Q_SLOTS: void onRequestUpdateFrontendGeometry(); void onRequestNotifyWindowManager(); + void onServiceRestart(); + private: MultiScreenWorker *m_multiScreenWorker; QString m_sniHostService; From 5e4c288cea4092eeaad6927361d3409f138df09a Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 12 Dec 2022 09:52:52 +0000 Subject: [PATCH 200/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E9=9A=90=E8=97=8F=E4=B8=8B=E5=88=87=E6=8D=A2=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=98=BE=E7=A4=BA=E9=94=99=E4=B9=B1=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:在切换模式的时候,需要重新计算任务栏的大小,但是由于时尚模式和高效模式下的尺寸不一样,所以在计算图标的时候会以切换之前的尺寸为参考来进行计算,导致计算的结果错误 修复:在切换模式的时候,提前设置任务栏的尺寸(上下为高度,左右为宽度),这样在下次计算图标的时候获取到的尺寸始终是以正确的尺寸进行计算,任务栏显示正常 Log: 修复智能隐藏下切换模式显示错乱 Influence: 任务栏设置为智能隐藏,从高效模式切换到时尚模式,观察任务栏显示是否正常 Bug: https://pms.uniontech.com/bug-view-176321.html Change-Id: Ia66cb3e96d4f42c42acc921315e9457d582a82c1 --- frame/util/multiscreenworker.cpp | 2 +- frame/util/multiscreenworker.h | 1 - frame/util/utils.h | 13 ++++ frame/window/components/datetimedisplayer.cpp | 10 --- frame/window/components/datetimedisplayer.h | 1 - frame/window/docktraywindow.cpp | 2 +- frame/window/mainpanelcontrol.cpp | 10 +-- frame/window/mainwindowbase.cpp | 4 +- frame/window/systempluginwindow.cpp | 76 ++++++++++++------- frame/window/systempluginwindow.h | 8 +- frame/window/traymanagerwindow.cpp | 59 +++++++++----- frame/window/traymanagerwindow.h | 3 +- frame/window/windowmanager.cpp | 2 +- interfaces/constants.h | 1 + 14 files changed, 118 insertions(+), 74 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index c86cf5c68..5dc7b38ef 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -674,7 +674,7 @@ void MultiScreenWorker::resetDockScreen() if (testState(ChangePositionAnimationStart) || testState(HideAnimationStart) || testState(ShowAnimationStart) - || testState(DockIsDraging)) + || Utils::isDraging()) return; DOCK_SCREEN->updateDockedScreen(getValidScreen(position())); diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index 283cc379f..7f0fcaf27 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -86,7 +86,6 @@ public: MousePress = 0x10, // 当前鼠标是否被按下 TouchPress = 0x20, // 当前触摸屏下是否按下 LauncherDisplay = 0x40, // 启动器是否显示 - DockIsDraging = 0x80, // 任务栏正在拖拽 // 如果要添加新的状态,可以在上面添加 RunState_Mask = 0xffffffff, diff --git a/frame/util/utils.h b/frame/util/utils.h index 57da80219..d758b2b77 100644 --- a/frame/util/utils.h +++ b/frame/util/utils.h @@ -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 diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index 13a7c1482..a459ff034 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -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; diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index d21ea6cdd..a0e92b12e 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -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(); diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index a70fb1e9d..eadcc93d1 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -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()) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index fcb206c33..40790035e 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -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(qApp->property(PROP_HIDE_STATE).toInt()); - if (dockSize > DOCK_MAX_SIZE || hideState == HideState::Hide) - dockSize = static_cast((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((m_displayMode == DisplayMode::Efficient ? m_dockInter->windowSizeEfficient() : m_dockInter->windowSizeFashion()) * qApp->devicePixelRatio())); if (m_displayMode == DisplayMode::Efficient) { // 如果是高效模式 if (position == Position::Top || position == Position::Bottom) diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index 6d35ba432..2e8d3d822 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -129,7 +129,7 @@ void MainWindowBase::initConnection() connect(&m_platformWindowHandle, &DPlatformWindowHandle::windowRadiusChanged, m_shadowMaskOptimizeTimer, static_cast(&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()); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index f8d739348..4c19bff53 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -22,6 +22,7 @@ #include "systemplugincontroller.h" #include "systempluginitem.h" #include "quicksettingcontroller.h" +#include "utils.h" #include #include @@ -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(childObject); - if (!item) - continue; - - item->setDisplayMode(displayMode); + QList 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 items = stretchItems(); if (position == Dock::Position::Top || position == Dock::Position::Bottom) { int itemWidth = 0; - for (QObject *childObject : childs) { - StretchPluginsItem *childItem = qobject_cast(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(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 SystemPluginWindow::stretchItems() const +{ + QList items; + QObjectList childObjects = children(); + for (QObject *childObject : childObjects) { + StretchPluginsItem *item = qobject_cast(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; } diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 4e5bdb6d5..e04ecb987 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -23,6 +23,7 @@ #include "constants.h" #include "dockitem.h" +#include "dbusutil.h" #include @@ -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 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 diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index bce900894..05c52d051 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -29,6 +29,7 @@ #include "datetimedisplayer.h" #include "expandiconwidget.h" #include "quickdragcore.h" +#include "utils.h" #include #include @@ -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); diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 9f49601f2..7889a91b8 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -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; // 圆角的值 }; diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index f65cd4b81..71f5480d6 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -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) { diff --git a/interfaces/constants.h b/interfaces/constants.h index 9def9a1e5..bba5352ad 100644 --- a/interfaces/constants.h +++ b/interfaces/constants.h @@ -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 From bbc0ec5ea5c21427edca4333675a73edd43795c6 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 12 Dec 2022 02:21:47 +0000 Subject: [PATCH 201/257] =?UTF-8?q?fix:=20=E7=A4=BE=E5=8C=BA=E7=89=88?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E9=94=AE=E7=9B=98=E5=B8=83=E5=B1=80=E6=8F=92?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修改键盘布局服务的接口 2、Indicator读取布局插件在所有的插件加载完成后进行,否则键盘布局插件对应的服务还未启动 Log: 加载键盘布局插件 Influence: 社区版-观察键盘布局插件 Task: https://pms.uniontech.com/task-view-225011.html Change-Id: I924bd2fa0a8b189af7825546e712482d836ed276 --- frame/controller/quicksettingcontroller.cpp | 4 +++- frame/window/tray/tray_monitor.cpp | 9 ++++++--- plugins/keyboard-layout/dbusadaptors.h | 2 +- .../xml/org.deepin.dde.InputDevice1.Keyboard.xml | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 370ed8ea2..82086f8e9 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -27,7 +27,9 @@ QuickSettingController::QuickSettingController(QObject *parent) : AbstractPluginsController(parent) { // 加载本地插件 - ProxyPluginController::instance(PluginType::QuickPlugin)->addProxyInterface(this); + ProxyPluginController *contoller = ProxyPluginController::instance(PluginType::QuickPlugin); + contoller->addProxyInterface(this); + connect(contoller, &ProxyPluginController::pluginLoaderFinished, this, &QuickSettingController::pluginLoaderFinished); } QuickSettingController::~QuickSettingController() diff --git a/frame/window/tray/tray_monitor.cpp b/frame/window/tray/tray_monitor.cpp index 49860117f..0f9bc64c2 100644 --- a/frame/window/tray/tray_monitor.cpp +++ b/frame/window/tray/tray_monitor.cpp @@ -56,6 +56,12 @@ TrayMonitor::TrayMonitor(QObject *parent) Q_EMIT systemTrayRemoved(itemInter); }); + //-------------------------------Tray Indicator---------------------------------------------// + // Indicators服务是集成在插件中的,因此需要在所有的插件加载完成后再加载Indicators服务 + connect(quickController, &QuickSettingController::pluginLoaderFinished, this, [ this ] { + startLoadIndicators(); + }); + QMetaObject::invokeMethod(this, [ = ] { QList trayPlugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tray); for (PluginsItemInterface *plugin : trayPlugins) { @@ -63,9 +69,6 @@ TrayMonitor::TrayMonitor(QObject *parent) Q_EMIT systemTrayAdded(plugin); } }, Qt::QueuedConnection); - - //-------------------------------Tray Indicator---------------------------------------------// - QMetaObject::invokeMethod(this, "startLoadIndicators", Qt::QueuedConnection); } QList TrayMonitor::trayWinIds() const diff --git a/plugins/keyboard-layout/dbusadaptors.h b/plugins/keyboard-layout/dbusadaptors.h index befa7d2d1..8ad973a35 100644 --- a/plugins/keyboard-layout/dbusadaptors.h +++ b/plugins/keyboard-layout/dbusadaptors.h @@ -24,7 +24,7 @@ #include #include "org_deepin_dde_inputdevice1_keyboard.h" -using Keyboard = org::deepin::dde::inputdevice1::Keyboard1; +using Keyboard = org::deepin::dde::inputdevice1::Keyboard; class QGSettings; class DBusAdaptors : public QDBusAbstractAdaptor diff --git a/plugins/keyboard-layout/dbusinterface/xml/org.deepin.dde.InputDevice1.Keyboard.xml b/plugins/keyboard-layout/dbusinterface/xml/org.deepin.dde.InputDevice1.Keyboard.xml index 633c33581..63d0f886a 100644 --- a/plugins/keyboard-layout/dbusinterface/xml/org.deepin.dde.InputDevice1.Keyboard.xml +++ b/plugins/keyboard-layout/dbusinterface/xml/org.deepin.dde.InputDevice1.Keyboard.xml @@ -1,5 +1,5 @@ - + From d600d61ec650e6499588fad74e2968d50ec491a1 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 12 Dec 2022 06:03:34 +0000 Subject: [PATCH 202/257] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新翻译文案 Log: 更新翻译文案 Influence: 无 Task: https://pms.uniontech.com/task-view-226203.html Change-Id: I02168491f07d3b5de839824d85faa733e2f55dfe --- plugins/bluetooth/bloothadapterwidget.cpp | 4 ++-- plugins/bluetooth/bluetoothmainwidget.cpp | 2 +- plugins/bluetooth/bluetoothplugin.cpp | 4 ++-- plugins/display/devcollaborationwidget.cpp | 2 +- plugins/display/displayplugin.cpp | 2 +- plugins/display/displaysettingwidget.cpp | 2 +- plugins/media/mediaplugin.cpp | 2 +- plugins/shutdown/shutdownplugin.cpp | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/bluetooth/bloothadapterwidget.cpp b/plugins/bluetooth/bloothadapterwidget.cpp index f14503510..3f681ceca 100644 --- a/plugins/bluetooth/bloothadapterwidget.cpp +++ b/plugins/bluetooth/bloothadapterwidget.cpp @@ -30,9 +30,9 @@ BloothAdapterWidget::BloothAdapterWidget(Adapter *adapter, QWidget *parent) : QWidget(parent) , m_adapter(adapter) - , m_myDeviceLabel(new QLabel(tr("my device"), this)) + , m_myDeviceLabel(new QLabel(tr("My Devices"), this)) , m_myDeviceView(new DListView(this)) - , m_otherDeviceLabel(new QLabel(tr("other device"), this)) + , m_otherDeviceLabel(new QLabel(tr("Other Devices"), this)) , m_otherDeviceView(new DListView(this)) , m_myDeviceModel(new QStandardItemModel(this)) , m_otherDeviceModel(new QStandardItemModel(this)) diff --git a/plugins/bluetooth/bluetoothmainwidget.cpp b/plugins/bluetooth/bluetoothmainwidget.cpp index b110bbf58..57f895381 100644 --- a/plugins/bluetooth/bluetoothmainwidget.cpp +++ b/plugins/bluetooth/bluetoothmainwidget.cpp @@ -196,6 +196,6 @@ QString BluetoothMainWidget::bluetoothIcon(bool isOpen) const void BluetoothMainWidget::onAdapterChanged() { bool bluetoothIsOpen = isOpen(); - m_stateLabel->setText(bluetoothIsOpen ? tr("open") : tr("close")); + m_stateLabel->setText(bluetoothIsOpen ? tr("Turn on") : tr("Turn off")); m_iconWidget->update(); } diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index e95d9809d..95190eabc 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -157,9 +157,9 @@ PluginsItemInterface::PluginMode BluetoothPlugin::status() const QString BluetoothPlugin::description() const { if (m_bluetoothItem.data()->isPowered()) - return tr("open"); + return tr("Turn on"); - return tr("close"); + return tr("Turn off"); } PluginFlags BluetoothPlugin::flags() const diff --git a/plugins/display/devcollaborationwidget.cpp b/plugins/display/devcollaborationwidget.cpp index cc3568fdd..1b856cc47 100644 --- a/plugins/display/devcollaborationwidget.cpp +++ b/plugins/display/devcollaborationwidget.cpp @@ -69,7 +69,7 @@ void DevCollaborationWidget::initUI() { m_deviceListView->setModel(m_viewItemModel); - QLabel *title = new QLabel(tr("Cross-end Collaboration"), this); + QLabel *title = new QLabel(tr("PC collaboration"), this); title->setFixedHeight(TITLE_HEIGHT); QHBoxLayout *hLayout = new QHBoxLayout(); diff --git a/plugins/display/displayplugin.cpp b/plugins/display/displayplugin.cpp index ba4d82a0a..41001dba8 100644 --- a/plugins/display/displayplugin.cpp +++ b/plugins/display/displayplugin.cpp @@ -52,7 +52,7 @@ const QString DisplayPlugin::pluginName() const const QString DisplayPlugin::pluginDisplayName() const { - return tr("brightness"); + return "Brightness"; } void DisplayPlugin::init(PluginProxyInterface *proxyInter) diff --git a/plugins/display/displaysettingwidget.cpp b/plugins/display/displaysettingwidget.cpp index f27d1e21f..d80056e7e 100644 --- a/plugins/display/displaysettingwidget.cpp +++ b/plugins/display/displaysettingwidget.cpp @@ -33,7 +33,7 @@ DisplaySettingWidget::DisplaySettingWidget(QWidget *parent) : QWidget(parent) , m_brightnessAdjWidget(new BrightnessAdjWidget(this)) , m_collaborationWidget(new DevCollaborationWidget(this)) - , m_settingBtn(new QPushButton(tr("Display setting"), this)) + , m_settingBtn(new QPushButton(tr("Multi-Screen Collaboration"), this)) { initUI(); diff --git a/plugins/media/mediaplugin.cpp b/plugins/media/mediaplugin.cpp index 4a721302c..60d7dc615 100644 --- a/plugins/media/mediaplugin.cpp +++ b/plugins/media/mediaplugin.cpp @@ -37,7 +37,7 @@ const QString MediaPlugin::pluginName() const const QString MediaPlugin::pluginDisplayName() const { - return tr("media"); + return "Media"; } void MediaPlugin::init(PluginProxyInterface *proxyInter) diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index e9e64d787..1bd30f47c 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -63,7 +63,7 @@ const QString ShutdownPlugin::pluginName() const const QString ShutdownPlugin::pluginDisplayName() const { - return tr("shutdown"); + return tr("Plugged In"); } QWidget *ShutdownPlugin::itemWidget(const QString &itemKey) @@ -79,7 +79,7 @@ QWidget *ShutdownPlugin::itemTipsWidget(const QString &itemKey) // reset text every time to avoid size of LabelWidget not change after // font size be changed in ControlCenter - m_tipsLabel->setText(tr("Power")); + m_tipsLabel->setText(tr("Plugged In")); return m_tipsLabel.data(); } From ef7d5320082e4fdcc3f85562d5bd0e0e768e2c85 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 12 Dec 2022 06:03:34 +0000 Subject: [PATCH 203/257] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新翻译文件 Log: 更新翻译文件 Influence: 查看翻译内容是否为当前系统对应的语言 Task: https://pms.uniontech.com/task-view-226203.html Change-Id: I87711c52e5575497bb531b86b00893f1653a3225 --- .tx/config | 4 +- lupdate.sh | 4 +- translations/dde-dock.ts | 238 +++++++--------- translations/dde-dock_ady.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_af.ts | 299 ++++++++++++------- translations/dde-dock_ak.ts | 303 +++++++++++++------- translations/dde-dock_am_ET.ts | 321 +++++++++++++-------- translations/dde-dock_ar.ts | 238 +++++++--------- translations/dde-dock_ar_EG.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_ast.ts | 323 +++++++++++++-------- translations/dde-dock_az.ts | 240 +++++++--------- translations/dde-dock_bg.ts | 281 +++++++++++------- translations/dde-dock_bn.ts | 281 +++++++++++------- translations/dde-dock_bo.ts | 240 +++++++--------- translations/dde-dock_br.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_ca.ts | 244 +++++++--------- translations/dde-dock_cgg.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_cs.ts | 244 +++++++--------- translations/dde-dock_da.ts | 238 +++++++--------- translations/dde-dock_de.ts | 252 +++++++--------- translations/dde-dock_de_CH.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_el.ts | 238 +++++++--------- translations/dde-dock_en_AU.ts | 236 +++++++-------- translations/dde-dock_en_GB.ts | 305 +++++++++++++------- translations/dde-dock_en_US.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_eo.ts | 299 ++++++++++++------- translations/dde-dock_es.ts | 244 +++++++--------- translations/dde-dock_es_MX.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_et.ts | 411 ++++++++++++++++---------- translations/dde-dock_eu.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_fa.ts | 194 +++++++++---- translations/dde-dock_fi.ts | 244 +++++++--------- translations/dde-dock_fil.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_fr.ts | 250 +++++++--------- translations/dde-dock_gl_ES.ts | 238 +++++++--------- translations/dde-dock_he.ts | 303 +++++++++++++------- translations/dde-dock_hi_IN.ts | 210 +++++++++----- translations/dde-dock_hr.ts | 246 +++++++--------- translations/dde-dock_hu.ts | 250 +++++++--------- translations/dde-dock_hy.ts | 297 ++++++++++++------- translations/dde-dock_id.ts | 323 +++++++++++++-------- translations/dde-dock_it.ts | 248 +++++++--------- translations/dde-dock_ja.ts | 238 +++++++--------- translations/dde-dock_ka.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_kab.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_kk.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_km_KH.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_kn_IN.ts | 321 +++++++++++++-------- translations/dde-dock_ko.ts | 240 +++++++--------- translations/dde-dock_ku.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_ku_IQ.ts | 297 ++++++++++++------- translations/dde-dock_ky.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_ky@Arab.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_la.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_lo.ts | 297 ++++++++++++------- translations/dde-dock_lt.ts | 238 +++++++--------- translations/dde-dock_lv.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_ml.ts | 315 +++++++++++++------- translations/dde-dock_mn.ts | 323 +++++++++++++-------- translations/dde-dock_mr.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_ms.ts | 240 +++++++--------- translations/dde-dock_nb.ts | 327 +++++++++++++-------- translations/dde-dock_ne.ts | 279 +++++++++++------- translations/dde-dock_nl.ts | 240 +++++++--------- translations/dde-dock_pa.ts | 323 +++++++++++++-------- translations/dde-dock_pam.ts | 297 ++++++++++++------- translations/dde-dock_pl.ts | 252 +++++++--------- translations/dde-dock_ps.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_pt.ts | 242 +++++++--------- translations/dde-dock_pt_BR.ts | 262 +++++++---------- translations/dde-dock_ro.ts | 238 +++++++--------- translations/dde-dock_ru.ts | 253 +++++++--------- translations/dde-dock_sc.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_si.ts | 194 +++++++++---- translations/dde-dock_sk.ts | 194 +++++++++---- translations/dde-dock_sl.ts | 246 +++++++--------- translations/dde-dock_sq.ts | 244 +++++++--------- translations/dde-dock_sr.ts | 242 +++++++--------- translations/dde-dock_sv.ts | 281 +++++++++++------- translations/dde-dock_sw.ts | 319 +++++++++++++-------- translations/dde-dock_ta.ts | 299 ++++++++++++------- translations/dde-dock_te.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_th.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_tr.ts | 244 +++++++--------- translations/dde-dock_tzm.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_ug.ts | 240 +++++++--------- translations/dde-dock_uk.ts | 242 +++++++--------- translations/dde-dock_ur.ts | 297 ++++++++++++------- translations/dde-dock_uz.ts | 475 +++++++++++++++++++++++++++++++ translations/dde-dock_vi.ts | 236 +++++++-------- translations/dde-dock_zh_CN.ts | 240 +++++++--------- translations/dde-dock_zh_HK.ts | 262 +++++++---------- translations/dde-dock_zh_TW.ts | 318 +++++++++------------ 93 files changed, 21192 insertions(+), 8289 deletions(-) create mode 100644 translations/dde-dock_ady.ts create mode 100644 translations/dde-dock_ar_EG.ts create mode 100644 translations/dde-dock_br.ts create mode 100644 translations/dde-dock_cgg.ts create mode 100644 translations/dde-dock_de_CH.ts create mode 100644 translations/dde-dock_en_US.ts create mode 100644 translations/dde-dock_es_MX.ts create mode 100644 translations/dde-dock_eu.ts create mode 100644 translations/dde-dock_fil.ts create mode 100644 translations/dde-dock_ka.ts create mode 100644 translations/dde-dock_kab.ts create mode 100644 translations/dde-dock_kk.ts create mode 100644 translations/dde-dock_km_KH.ts create mode 100644 translations/dde-dock_ku.ts create mode 100644 translations/dde-dock_ky.ts create mode 100644 translations/dde-dock_ky@Arab.ts create mode 100644 translations/dde-dock_la.ts create mode 100644 translations/dde-dock_lv.ts create mode 100644 translations/dde-dock_mr.ts create mode 100644 translations/dde-dock_ps.ts create mode 100644 translations/dde-dock_sc.ts create mode 100644 translations/dde-dock_te.ts create mode 100644 translations/dde-dock_th.ts create mode 100644 translations/dde-dock_tzm.ts create mode 100644 translations/dde-dock_uz.ts diff --git a/.tx/config b/.tx/config index ce45604d8..3eee9a38a 100644 --- a/.tx/config +++ b/.tx/config @@ -1,10 +1,10 @@ [main] host = https://www.transifex.com -minimum_perc = 80 -mode = developer [deepin-desktop-environment.dde-dock] file_filter = translations/dde-dock_.ts +minimum_perc = 0 source_file = translations/dde-dock.ts source_lang = en type = QT + diff --git a/lupdate.sh b/lupdate.sh index 8faa1d0b0..993e032b5 100755 --- a/lupdate.sh +++ b/lupdate.sh @@ -2,6 +2,6 @@ cp ".transifexrc" ${HOME}/ lupdate ./ -ts -no-obsolete translations/dde-dock.ts -lupdate ./ -ts -no-obsolete plugins/dcc-dock-plugin/translations/dcc-dock-plugin.ts +#lupdate ./ -ts -no-obsolete plugins/dcc-dock-plugin/translations/dcc-dock-plugin.ts -tx push -s -b m20 +tx push -s -b m23 diff --git a/translations/dde-dock.ts b/translations/dde-dock.ts index 9821722b9..b7d5409cf 100644 --- a/translations/dde-dock.ts +++ b/translations/dde-dock.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Remove + Open + Open + + + + BloothAdapterWidget + + My Devices + My Devices + + + Other Devices + Other Devices @@ -88,12 +99,35 @@ Turned off + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + Turn on + + + Turn off + Turn off + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + Turn on + + + Turn off + Turn off + DBusAdaptors @@ -102,6 +136,21 @@ Add keyboard layout + + DateTimeDisplayer + + 12-hour time + 12-hour time + + + 24-hour time + 24-hour time + + + Time settings + Time settings + + DatetimePlugin @@ -121,6 +170,13 @@ Time settings + + DevCollaborationWidget + + PC collaboration + PC collaboration + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Unknown device - - - Unknown volume - Unknown volume + Multi-Screen Collaboration + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + Enabled - Open - Open - - - Unmount all - Unmount all + Disabled + Disabled @@ -173,21 +221,6 @@ Launcher - - MainWindow - - Exit Safe Mode - Exit Safe Mode - - - Dock - Safe Mode - Dock - Safe Mode - - - The Dock is in safe mode, please exit to show it properly - The Dock is in safe mode, please exit to show it properly - - MenuWorker @@ -243,93 +276,6 @@ Dock settings - - ModuleWidget - - Size - Size - - - Multiple Displays - Multiple Displays - - - Plugin Area - Plugin Area - - - Select which icons appear in the Dock - Select which icons appear in the Dock - - - Fashion mode - Fashion mode - - - Efficient mode - Efficient mode - - - Mode - Mode - - - Top - Top - - - Bottom - Bottom - - - Left - Left - - - Right - Right - - - Location - Location - - - Keep shown - Keep shown - - - Keep hidden - Keep hidden - - - Smart hide - Smart hide - - - Status - Status - - - Small - Small - - - Large - Large - - - Show Dock - Show Dock - - - On screen where the cursor is - On screen where the cursor is - - - Only on main screen - Only on main screen - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Settings - PowerPlugin @@ -358,10 +300,6 @@ Power Power - - Power settings - Power settings - Capacity %1, %2 min remaining Capacity %1, %2 min remaining @@ -395,14 +333,6 @@ Capacity %1, fully charged - - SettingsModule - - Dock - Dock - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Power - Shut down Shut down @@ -452,6 +378,10 @@ Reboot Reboot + + Plugged In + Plugged In + SoundApplet @@ -460,6 +390,17 @@ Device + + SoundDevicesWidget + + Output Device + Output Device + + + Sound settings + Sound settings + + SoundItem @@ -516,4 +457,19 @@ Empty + + WindowManager + + Exit Safe Mode + Exit Safe Mode + + + Dock - Safe Mode + Dock - Safe Mode + + + The Dock is in safe mode, please exit to show it properly + The Dock is in safe mode, please exit to show it properly + + \ No newline at end of file diff --git a/translations/dde-dock_ady.ts b/translations/dde-dock_ady.ts new file mode 100644 index 000000000..4a94e6c3c --- /dev/null +++ b/translations/dde-dock_ady.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_af.ts b/translations/dde-dock_af.ts index 910dec54f..3d441188c 100644 --- a/translations/dde-dock_af.ts +++ b/translations/dde-dock_af.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bloutand + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Bloutand + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bloutand + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk - Skyf + Enabled + - Open - Oop - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + Lanseerder + + + + MenuWorker Fashion Mode @@ -143,17 +272,10 @@ - Plugins + Dock settings - - LauncherItem - - Launcher - Lanseerder - - MultitaskingPlugin @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Netwerk - - OnboardPlugin Onboard - - Settings - - PowerPlugin @@ -189,10 +300,6 @@ Power Krag - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - Krag - Shut down Skakel af - - Restart - Herlaai - Suspend Opskort @@ -267,6 +374,14 @@ Power settings + + Reboot + + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device Toestel + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ Demp - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown - Onbekend - - - Wired connection: %1 - - - - - WirelessItem - - No Network + Exit Safe Mode - Wireless Connection: %1 + Dock - Safe Mode - Connected but no Internet access - - - - - WirelessList - - Wireless Network - Draadlose Netwerk - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_ak.ts b/translations/dde-dock_ak.ts index 9b1c569c6..bab779404 100644 --- a/translations/dde-dock_ak.ts +++ b/translations/dde-dock_ak.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,10 +6,148 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + DBusAdaptors Add keyboard layout + Add keyboard layout + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk + Enabled - Open - Open - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + + + + + MenuWorker Fashion Mode @@ -143,14 +272,7 @@ - Plugins - - - - - LauncherItem - - Launcher + Dock settings @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - Settings - PowerPlugin @@ -189,10 +300,6 @@ Power Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,17 +346,9 @@ ShutdownPlugin - - Power - Power - Shut down - - - - Restart - + Shut down Suspend @@ -249,7 +356,7 @@ Hibernate - + Hibernate Lock @@ -257,7 +364,7 @@ Log out - + Log out Switch account @@ -267,6 +374,14 @@ Power settings + + Reboot + Reboot + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_am_ET.ts b/translations/dde-dock_am_ET.ts index 5f835ba63..b1e14e42a 100644 --- a/translations/dde-dock_am_ET.ts +++ b/translations/dde-dock_am_ET.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + ብሉቱዝ + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + ብሉቱዝ + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + ብሉቱዝ + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ የ ፊደል ገበታ እቅድ መጨመሪያ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,31 +158,23 @@ ቀን እና ሰአት - 12 Hour Time - 12 ሰአት ጊዜ + 12-hour time + - 24 Hour Time - 24 ሰአት ጊዜ + 24-hour time + - Time Settings - ሰአት ማሰናጃ + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - ኔትዎርክ ማስቻያ - - - Disable network - ኔትዎርክ ማሰናከያ - - - Network settings - ኔትዎርክ ማሰናጃ + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - ያልታወቀ አካል - - - Unknown volume - ያልታወቀ መጠን + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - ዲስክ + Enabled + - Open - መክፈቻ - - - Unmount all - ሁሉንም ማውረጃ + Disabled + - DockSettings + LauncherItem + + Launcher + ማስጀመሪያ + + + + MenuWorker Fashion Mode በ ዘመናዊ ዘዴ @@ -143,15 +272,8 @@ ሁኔታው - Plugins - ተሰኪዎች - - - - LauncherItem - - Launcher - ማስጀመሪያ + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - ኔትዎርክ - - OnboardPlugin Onboard - - Settings - ማሰናጃዎች - PowerPlugin @@ -189,10 +300,6 @@ Power ሐይል - - Power settings - ሐይል ማሰናጃ - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - ሞልቷል %1 - Charging %1, %2 min until full @@ -214,11 +317,19 @@ - Charging %1 .... + Capacity %1 - Charged + Charging %1 + በ መሙላት ላይ %1 + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -235,18 +346,10 @@ ShutdownPlugin - - Power - ሐይል - Shut down ማጥፊያ - - Restart - እንደገና ማስጀመሪያ - Suspend ማገጃ @@ -271,6 +374,14 @@ Power settings ሐይል ማሰናጃ + + Reboot + እንደገና ማስነሻ + + + Plugged In + + SoundApplet @@ -278,9 +389,16 @@ Device አካል + + + SoundDevicesWidget - Application - መተግበሪያ + Output Device + + + + Sound settings + @@ -294,12 +412,12 @@ መቀነሻ - Audio Settings - ድምፅ ማሰናጃ + Sound settings + - Current Volume %1 - የ አሁኑ መጠን %1 + Volume %1 + @@ -323,6 +441,10 @@ Trash - %1 files ቆሻሻ - %1 ፋይሎች + + Move to Trash + ወደ ቆሻሻ ማንቀሳቀሻ + TrashWidget @@ -336,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - የ ስርአት ትሪ: - - - - WiredItem - - Unknown - ያልታወቀ + Exit Safe Mode + - Wired connection: %1 - በ ሽቦ ግንኙነት: %1 - - - - WirelessItem - - No Network - ኔትዎርክ የለም + Dock - Safe Mode + - Wireless Connection: %1 - ሽቦ አልባ ኔትዎርክ: %1 - - - Connected but no Internet access + The Dock is in safe mode, please exit to show it properly - - WirelessList - - Wireless Network - ሽቦ አልባ ኔትዎርክ - - - Wireless Network %1 - ሽቦ አልባ ኔትዎርክ: %1 - - \ No newline at end of file diff --git a/translations/dde-dock_ar.ts b/translations/dde-dock_ar.ts index 131e5c46c..7b585aaa9 100644 --- a/translations/dde-dock_ar.ts +++ b/translations/dde-dock_ar.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - إزالة + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ + + BluetoothMainWidget + + Bluetooth + البلوتوث + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth البلوتوث + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ إضافة تخطيط لوحة مفاتيح + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ إعدادات الوقت + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - جهاز غير معروف - - - Unknown volume - مساحة غير معروفة + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - القرص + Enabled + - Open - فتح - - - Unmount all - فصل الكل + Disabled + @@ -173,21 +221,6 @@ المُطلق - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - الحجم - - - Multiple Displays - شاشات متعددة - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - النمط الحداثي - - - Efficient mode - النمط الفعال - - - Mode - النمط - - - Top - أعلى - - - Bottom - أسفل - - - Left - يسار - - - Right - يمين - - - Location - الموقع - - - Keep shown - - - - Keep hidden - اﻹبقاء مخفياً - - - Smart hide - الاخفاء الذكي - - - Status - الحالة - - - Small - صغير - - - Large - كبير - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard لوحة المفاتيح الافتراضية - - Settings - الإعدادات - PowerPlugin @@ -358,10 +300,6 @@ Power الطاقة - - Power settings - إعدادت الطاقة - Capacity %1, %2 min remaining السعة 1%, 2% دقيقة متبقية @@ -395,14 +333,6 @@ - - SettingsModule - - Dock - الرف - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - الطاقة - Shut down إيقاف التشغيل @@ -452,6 +378,10 @@ Reboot إعادة التشغيل + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ الجهاز + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ فارغ + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_ar_EG.ts b/translations/dde-dock_ar_EG.ts new file mode 100644 index 000000000..2366c6f3f --- /dev/null +++ b/translations/dde-dock_ar_EG.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + أغلق + + + Delete + إمسح + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_ast.ts b/translations/dde-dock_ast.ts index a1def8f13..26bbf942e 100644 --- a/translations/dde-dock_ast.ts +++ b/translations/dde-dock_ast.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ Amestar distribución de tecláu + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,31 +158,23 @@ Datetime - 12 Hour Time - 12h + 12-hour time + - 24 Hour Time - 24h + 24-hour time + - Time Settings - Axustes d'hora + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - Habilitar rede - - - Disable network - Deshabilitar rede - - - Network settings - Axustes de rede + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Preséu desconocíu - - - Unknown volume - Volume desconocíu + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Discu + Enabled + - Open - Abrir - - - Unmount all - Desmontar too + Disabled + - DockSettings + LauncherItem + + Launcher + Llanzador + + + + MenuWorker Fashion Mode Mou MacOS @@ -143,15 +272,8 @@ Estáu - Plugins - Complementos - - - - LauncherItem - - Launcher - Llanzador + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Rede - - OnboardPlugin Onboard - - Settings - Axustes - PowerPlugin @@ -189,10 +300,6 @@ Power Enerxía - - Power settings - Axustes d'enerxía - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - Cargóse %1 - Charging %1, %2 min until full @@ -214,11 +317,19 @@ - Charging %1 .... + Capacity %1 - Charged + Charging %1 + Cargando %1 + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -235,18 +346,10 @@ ShutdownPlugin - - Power - Enerxía - Shut down Apagar - - Restart - Reaniciar - Suspend Suspender @@ -271,6 +374,14 @@ Power settings Axustes d'enerxía + + Reboot + Reaniciar + + + Plugged In + + SoundApplet @@ -278,9 +389,16 @@ Device Preséu + + + SoundDevicesWidget - Application - Aplicación + Output Device + + + + Sound settings + @@ -294,12 +412,12 @@ Silenciar - Audio Settings - Axustes d'audiu + Sound settings + - Current Volume %1 - Volume actual %1 + Volume %1 + @@ -323,6 +441,10 @@ Trash - %1 files Papelera - %1 ficheros + + Move to Trash + Mover a la papelera + TrashWidget @@ -332,51 +454,22 @@ Empty - Baleru + Balero - TrayPlugin + WindowManager - System Tray - Bandexa del sistema - - - - WiredItem - - Unknown - Desconozse + Exit Safe Mode + - Wired connection: %1 - Conexón cableada: %1 - - - - WirelessItem - - No Network - Ensin rede + Dock - Safe Mode + - Wireless Connection: %1 - Conexón inalámbrica: %1 - - - Connected but no Internet access + The Dock is in safe mode, please exit to show it properly - - WirelessList - - Wireless Network - Rede inalámbrica - - - Wireless Network %1 - Rede inalámbrica %1 - - \ No newline at end of file diff --git a/translations/dde-dock_az.ts b/translations/dde-dock_az.ts index 2d2856d63..45e67303e 100644 --- a/translations/dde-dock_az.ts +++ b/translations/dde-dock_az.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Silmək + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Söndürüldü + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Klaviatura qatı əlavə etmək + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Vaxt ayarları + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -133,7 +189,7 @@ Delete - Silmək + Sil This action cannot be restored @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Naməlum cihaz - - - Unknown volume - Naməlum həcm + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - - - - Unmount all - Hamısını çıxartmaq + Disabled + @@ -173,21 +221,6 @@ Başladıcı - - MainWindow - - Exit Safe Mode - Təhlükəsiz rejimdən çıxın - - - Dock - Safe Mode - Dok - Təhlükəsiz rejim - - - The Dock is in safe mode, please exit to show it properly - Dok təhlükəsiz rejimdədir, onun düzgün göstərilməsi üçün çıxın - - MenuWorker @@ -243,93 +276,6 @@ Dok panel ayarları - - ModuleWidget - - Size - Ölçü - - - Multiple Displays - Çoxsaylı ekran - - - Plugin Area - Plaqin sahəsi - - - Select which icons appear in the Dock - Dok paneldə görünəcək nişanları seçin - - - Fashion mode - Müasir rejim - - - Efficient mode - Səmərəli rejim - - - Mode - Rejim - - - Top - Yuxarıda - - - Bottom - Aşağıda - - - Left - Sol - - - Right - Sağ - - - Location - Yerləşmə - - - Keep shown - Görünsün - - - Keep hidden - Gizli qalsın - - - Smart hide - Ağıllı gizlənmə - - - Status - Vəziyyəti - - - Small - Kiçik - - - Large - Geniş - - - Show Dock - Dok paneli göstərmək - - - On screen where the cursor is - Kursorun olduğu ekranda - - - Only on main screen - Yalnız əsas ekranda - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Ekran Klaviaturası - - Settings - Tənzimləmələr - PowerPlugin @@ -358,10 +300,6 @@ Power Elektrik qidalanması - - Power settings - Elektrik enerjisi ayarları - Capacity %1, %2 min remaining Tutum %1, %2 dəq qalır @@ -395,14 +333,6 @@ Tutum %1, tam yükləndi - - SettingsModule - - Dock - Dok panel - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Elektrik qidalanması - Shut down Sistemi söndür @@ -452,6 +378,10 @@ Reboot Yenidən başlatmaq + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Avadanlıq + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Boş + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_bg.ts b/translations/dde-dock_bg.ts index 7e85117a1..0f4c2634e 100644 --- a/translations/dde-dock_bg.ts +++ b/translations/dde-dock_bg.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ Приставката %1 не е съвместима със системата. + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ Добавяне на клавиатурна подредба + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -33,18 +171,10 @@ - DeviceItem + DevCollaborationWidget - Enable network - Включи мрежата - - - Disable network - Изключи мрежата - - - Network settings - Настройки на мрежата + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Непознато устройство - - - Unknown volume - Непознат носител + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Диск + Enabled + - Open - Отваряне - - - Unmount all - Демонтирай всички + Disabled + - DockSettings + LauncherItem + + Launcher + Стартер + + + + MenuWorker Fashion Mode Модерен режим @@ -143,15 +272,8 @@ Статус - Plugins - Добавки - - - - LauncherItem - - Launcher - Стартер + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Мрежа - - OnboardPlugin Onboard На борда - - Settings - Настройки - PowerPlugin @@ -189,10 +300,6 @@ Power Захранване - - Power settings - Настройки на захранването - Capacity %1, %2 min remaining Капацитет %1, остават %2 минути @@ -209,10 +316,6 @@ Charging %1, %2 hr %3 min until full Зареждане на %1, %2 ч. %3 мин. до пълно зареждане - - Charged - Зареден - Capacity %1 @@ -243,10 +346,6 @@ ShutdownPlugin - - Power - Захранване - Shut down Изключване @@ -279,6 +378,10 @@ Reboot Рестартиране + + Plugged In + + SoundApplet @@ -286,9 +389,16 @@ Device Устройство + + + SoundDevicesWidget - Application - Приложение + Output Device + + + + Sound settings + @@ -331,6 +441,10 @@ Trash - %1 files Кошче - %1 файла + + Move to Trash + Премести в Кошчето + TrashWidget @@ -344,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - Зона за уведомяване - - - - WiredItem - - Unknown - Неизвестно + Exit Safe Mode + - Wired connection: %1 - Кабелна връзка: %1 - - - - WirelessItem - - No Network - Няма мрежа + Dock - Safe Mode + - Connected but no Internet access - Свързан но няма Интернет връзка - - - Wireless connection: %1 + The Dock is in safe mode, please exit to show it properly - - WirelessList - - Wireless Network - Безжична мрежа - - - Wireless Network %1 - Безжична връзка %1 - - \ No newline at end of file diff --git a/translations/dde-dock_bn.ts b/translations/dde-dock_bn.ts index 7797b0968..712acef74 100644 --- a/translations/dde-dock_bn.ts +++ b/translations/dde-dock_bn.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ %1 প্লাগিনটি সিস্টেমের জন্যে উপযুক্ত নয় + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + ব্লুটুথ + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + ব্লুটুথ + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ কীবোর্ড লেআউট যোগ করুন + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -33,18 +171,10 @@ - DeviceItem + DevCollaborationWidget - Enable network - নেটওয়ার্ক চালু করুন - - - Disable network - নেটওয়ার্ক বন্ধ করুন - - - Network settings - নেটওয়ার্কের সেটিংস + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - অপরিচিত ডিভাইস - - - Unknown volume - অজানা ভলিউম + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - ডিস্ক + Enabled + - Open - খুলুন - - - Unmount all - সবকিছু আনমাউন্ট করুন + Disabled + - DockSettings + LauncherItem + + Launcher + লঞ্চার + + + + MenuWorker Fashion Mode ফ্যাশন মোড @@ -143,15 +272,8 @@ অবস্থা - Plugins - প্লাগইন সমূহ - - - - LauncherItem - - Launcher - লঞ্চার + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - নেটওয়ার্ক - - OnboardPlugin Onboard ওনবোর্ড - - Settings - সেটিংস - PowerPlugin @@ -189,10 +300,6 @@ Power পাওয়ার - - Power settings - পাওয়ার সেটিংস - Capacity %1, %2 min remaining ধারণ ক্ষমতা %1, %2 min বাকি আছে @@ -209,10 +316,6 @@ Charging %1, %2 hr %3 min until full %1 চার্জ হচ্ছে, সম্পূর্ণ হতে %2 hr %3 min বাকি আছে - - Charged - - Capacity %1 @@ -243,10 +346,6 @@ ShutdownPlugin - - Power - পাওয়ার - Shut down বন্ধ করুন @@ -279,6 +378,10 @@ Reboot পুনঃরায় চালু করুন + + Plugged In + + SoundApplet @@ -286,9 +389,16 @@ Device ডিভাইস + + + SoundDevicesWidget - Application - অ্যাপ্লিকেশন + Output Device + + + + Sound settings + @@ -331,6 +441,10 @@ Trash - %1 files %1 ফাইল ট্র্যাশ করুন + + Move to Trash + + TrashWidget @@ -344,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - সিস্টেম ট্রে - - - - WiredItem - - Unknown - অজানা + Exit Safe Mode + - Wired connection: %1 - তারের সংযোগঃ %1 - - - - WirelessItem - - No Network - নেটওয়ার্ক নেই + Dock - Safe Mode + - Connected but no Internet access - সংযুক্ত কিন্তু কোনো ইন্টারনেট এক্সেস নেই - - - Wireless connection: %1 + The Dock is in safe mode, please exit to show it properly - - WirelessList - - Wireless Network - ওয়্যারলেস নেটওয়ার্ক - - - Wireless Network %1 - ওয়্যারলেস নেটওয়ার্ক %1 - - \ No newline at end of file diff --git a/translations/dde-dock_bo.ts b/translations/dde-dock_bo.ts index 9b860f12d..ae1b100e8 100644 --- a/translations/dde-dock_bo.ts +++ b/translations/dde-dock_bo.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - སྤོ་འབུད། + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ སོ་སྔོན་ཁ་རྒྱོབ། + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth སོ་སྔོན། + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ མཐེབ་གཞོང་བཀོད་པ་སྣོན་པ། + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ དུས་ཚོད་སྒྲིག་འགོད། + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - མ་ཤེས་པའི་སྒྲིག་ཆས། - - - Unknown volume - ཤོང་ཚད་མ་ཤེས་པ། + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - སྡུད་སྡེར། + Enabled + - Open - ཁ་ཕྱེ་བ། - - - Unmount all - ཚང་མ་བཤིག་འདོན་བྱེད། + Disabled + @@ -173,21 +221,6 @@ འགོ་སློང་ཆས། - - MainWindow - - Exit Safe Mode - བདེ་འཇགས་དཔེ་རྣམ་ལས་ཕྱིར་དོན་པ། - - - Dock - Safe Mode - ལས་འགན་ཚན་བྱང་གི་བདེ་འཇགས་དཔེ་རྣམ། - - - The Dock is in safe mode, please exit to show it properly - ལས་འགན་ཚན་བྱང་བདེ་འཇགས་དཔེ་རྣམ་ནང་མཛུལ་ཟིན་པས། བདེ་འཇགས་དཔེ་རྣམ་ལས་ཕྱིར་དོན་རྗེས་རྒྱུན་ལྡན་ལྟར་ཤར་ཐུབ། - - MenuWorker @@ -243,93 +276,6 @@ ལས་འགན་ཚན་བྱང་སྒྲིག་འགོད། - - ModuleWidget - - Size - ཆེ་ཆུང་། - - - Multiple Displays - བརྙན་མང་མངོན་སྟོན་སྒྲིག་འགོད། - - - Plugin Area - ལྷུ་ལག་ཁུལ་ཁོངས། - - - Select which icons appear in the Dock - ལས་འགན་ཚན་བྱང་གི་ལྷུ་ལག་ཁུལ་དུ་མངོན་པའི་པར་རིས་འདེམས་པ། - - - Fashion mode - དར་སྲོལ་དཔེ་རྣམ། - - - Efficient mode - ལས་ཆོད་ཆེ་བའི་དཔེ་རྣམ། - - - Mode - དཔེ་རྣམ། - - - Top - གོང་། - - - Bottom - འོག - - - Left - གཡོན། - - - Right - གཡས། - - - Location - གནས་ས། - - - Keep shown - རྟག་ཏུ་མངོན་པ། - - - Keep hidden - རྟག་ཏུ་ཡིབ་པ། - - - Smart hide - རིག་ནུས་གབ་ཡིབ། - - - Status - རྣམ་པ། - - - Small - ཆུང་ངུ། - - - Large - ཆེ་བ། - - - Show Dock - ལས་འགན་ཚན་བྱང་གི་གནས་ས། - - - On screen where the cursor is - ཙི་གུའི་གནས་ཡུལ་ལྟར་མངོན་པ། - - - Only on main screen - བརྙན་ཡོལ་ཨ་མ་ཁོ་ན་མངོན་པ། - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard བརྙན་ཡོལ་མཐེབ་གཞོང་། - - Settings - སྒྲིག་འགོད། - PowerPlugin @@ -358,10 +300,6 @@ Power གློག་ཁུངས་དོ་དམ། - - Power settings - གློག་ཁུངས་སྒིག་འགོད། - Capacity %1, %2 min remaining གློག་ཚད་%1 སྐར་མ་%2ལྷག་འདུག @@ -395,14 +333,6 @@ གློག་ཚད་%1 ཁེངས་ཟིན། - - SettingsModule - - Dock - ལས་འགན་ཚན་བྱང་། - /personalization/Dock - - ShowDesktopPlugin @@ -416,13 +346,9 @@ ShutdownPlugin - - Power - གློག་ཁུངས་དོ་དམ། - Shut down - ཁ་བརྒྱབ། + རྩིས་འཁོར་གློག་གསོད། Suspend @@ -452,6 +378,10 @@ Reboot བསྐྱར་སློང་། + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ སྒྲིག་ཆས། + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ གསལ་ཐོ་གཙང་སེལ། + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_br.ts b/translations/dde-dock_br.ts new file mode 100644 index 000000000..49d169275 --- /dev/null +++ b/translations/dde-dock_br.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + Nullañ + + + Delete + Dilemel + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + Mut + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + Son + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + Digeriñ + + + Empty + Goullo + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_ca.ts b/translations/dde-dock_ca.ts index 360a5b24e..a8addac84 100644 --- a/translations/dde-dock_ca.ts +++ b/translations/dde-dock_ca.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Mode d'avió activat Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Mode d'avió desactivat @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Elimina + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Apagat + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Afegeix una disposició de teclat + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Configuració de l'hora + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Dispositiu desconegut - - - Unknown volume - Volum desconegut + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disc + Enabled + - Open - Obre - - - Unmount all - Desmunta-ho tot + Disabled + @@ -173,21 +221,6 @@ Llançador - - MainWindow - - Exit Safe Mode - Surt del mode segur - - - Dock - Safe Mode - Acoblador - Mode segur - - - The Dock is in safe mode, please exit to show it properly - L'acoblador és en mode segur. Si us plau, sortiu-ne perquè es mostri adequadament. - - MenuWorker @@ -243,93 +276,6 @@ Paràmetres de l'acoblador - - ModuleWidget - - Size - Mida - - - Multiple Displays - Pantalles múltiples - - - Plugin Area - Àrea de connectors - - - Select which icons appear in the Dock - Seleccioneu quines icones apareixen a l'acoblador. - - - Fashion mode - Mode de moda - - - Efficient mode - Mode eficient - - - Mode - Mode - - - Top - Dalt - - - Bottom - A baix - - - Left - A l'esquerra - - - Right - A la dreta - - - Location - Ubicació - - - Keep shown - Mantén-lo visible - - - Keep hidden - Mantén-lo amagat - - - Smart hide - Ocultació intel·ligent - - - Status - Estat - - - Small - petit - - - Large - gros - - - Show Dock - Mostra l'acoblador - - - On screen where the cursor is - A la pantalla el cursor és - - - Only on main screen - Només a la pantalla principal - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Abord - - Settings - Configuració - PowerPlugin @@ -358,10 +300,6 @@ Power Energia - - Power settings - Configuració de l'energia - Capacity %1, %2 min remaining Capacitat: %1, %2 min restants @@ -395,14 +333,6 @@ Capacitat: 1%, completament carregada - - SettingsModule - - Dock - Acoblador - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Energia - Shut down Atura't @@ -438,7 +364,7 @@ Log out - Tanca la sessió + Surt de la sessió Switch account @@ -452,6 +378,10 @@ Reboot Reinicia + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Dispositiu + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Buit + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_cgg.ts b/translations/dde-dock_cgg.ts new file mode 100644 index 000000000..916e9d9d9 --- /dev/null +++ b/translations/dde-dock_cgg.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_cs.ts b/translations/dde-dock_cs.ts index b9c0ef648..df0eedfb1 100644 --- a/translations/dde-dock_cs.ts +++ b/translations/dde-dock_cs.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Odstranit + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Vypnuto + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Přidat rozvržení klávesnice + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Nastavení času + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Neznámé zařízení - - - Unknown volume - Neznámý svazek + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - Otevřít - - - Unmount all - Odpojit vše + Disabled + @@ -173,21 +221,6 @@ Spouštěč - - MainWindow - - Exit Safe Mode - Ukončit náhradní režim - - - Dock - Safe Mode - Panel – náhradní režim - - - The Dock is in safe mode, please exit to show it properly - Dok je v náhradním režimu – ukončete, aby se zobrazil správně - - MenuWorker @@ -243,93 +276,6 @@ Nastavení panelu - - ModuleWidget - - Size - Velikost - - - Multiple Displays - Více displejů - - - Plugin Area - Oblast pluginu - - - Select which icons appear in the Dock - Vyberte, které ikony se zobrazí v Docku - - - Fashion mode - Módní režim - - - Efficient mode - Efektivní režim - - - Mode - Režim - - - Top - Nahoře - - - Bottom - Dole - - - Left - Vlevo - - - Right - Vpravo - - - Location - Umístění - - - Keep shown - Ponechat zobrazený - - - Keep hidden - Ponechat skrytý - - - Smart hide - Chytré skrývání - - - Status - Stav - - - Small - Malý - - - Large - Velký - - - Show Dock - Zobrazit panel - - - On screen where the cursor is - Na obrazovce, kde je ukazovátko - - - Only on main screen - Pouze na hlavní obrazovce - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Na základní desce - - Settings - Nastavení - PowerPlugin @@ -358,13 +300,9 @@ Power Napájení - - Power settings - Nastavení správy napájení - Capacity %1, %2 min remaining - Stav %1, %2 min zbývá + Energie %1, %2 min zbývá Capacity %1, %2 hr %3 min remaining @@ -395,14 +333,6 @@ Kapacita %1, plně nabito - - SettingsModule - - Dock - Panel - /personalization/Dock - - ShowDesktopPlugin @@ -416,13 +346,9 @@ ShutdownPlugin - - Power - Napájení - Shut down - Vypínání + Vypnout Suspend @@ -452,6 +378,10 @@ Reboot Restartovat + + Plugged In + + SoundApplet @@ -460,11 +390,22 @@ Zařízení + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem Unmute - Storno ztlumení + Zrušit ztlumení Mute @@ -516,4 +457,19 @@ Prázdný + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_da.ts b/translations/dde-dock_da.ts index b0bf967e1..b1e721c34 100644 --- a/translations/dde-dock_da.ts +++ b/translations/dde-dock_da.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Fjern + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Tilføj tastaturlayout + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Tidsindstillinger + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Ukendt enhed - - - Unknown volume - Ukendt volumen + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - Åbn - - - Unmount all - Afmonter alle + Disabled + @@ -173,21 +221,6 @@ Programstarter - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Størrelse - - - Multiple Displays - Flere skærme - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Moderne tilstand - - - Efficient mode - Effektiv visning - - - Mode - Tilstand - - - Top - Øverst - - - Bottom - Nederst - - - Left - Venstre - - - Right - Højre - - - Location - Placering - - - Keep shown - - - - Keep hidden - Hold skjult - - - Smart hide - Smart skjuling - - - Status - Status - - - Small - Lille - - - Large - Stor - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Indstillinger - PowerPlugin @@ -358,10 +300,6 @@ Power Strøm - - Power settings - Strømindstillinger - Capacity %1, %2 min remaining Kapacitet %1, %2 minutter tilbage @@ -395,14 +333,6 @@ - - SettingsModule - - Dock - Dok - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Strøm - Shut down Luk ned @@ -452,6 +378,10 @@ Reboot Genstart + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Enhed + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Tomt + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_de.ts b/translations/dde-dock_de.ts index 20583c4b7..ccc6ac5d4 100644 --- a/translations/dde-dock_de.ts +++ b/translations/dde-dock_de.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Flugzeugmodus aktiviert Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Flugzeugmodus deaktiviert @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Entfernen + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Ausgeschaltet + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Tastaturbelegung hinzufügen + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Zeiteinstellungen + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Unbekanntes Gerät - - - Unknown volume - Unbekannter Datenträger + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Festplatte + Enabled + - Open - Öffnen - - - Unmount all - Alle aushängen + Disabled + @@ -173,21 +221,6 @@ Starter - - MainWindow - - Exit Safe Mode - Abgesicherten Modus beenden - - - Dock - Safe Mode - Dock - Abgesicherter Modus - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -196,7 +229,7 @@ Efficient Mode - Leistungs-Modus + Effizienzmodus Top @@ -243,98 +276,11 @@ Dock-Einstellungen - - ModuleWidget - - Size - Größe - - - Multiple Displays - Mehrfachbildschirm - - - Plugin Area - Pluginbereich - - - Select which icons appear in the Dock - Wählen Sie aus, welche Symbole im Dock erscheinen sollen - - - Fashion mode - Design-Modus - - - Efficient mode - Leistungs-Modus - - - Mode - Modus - - - Top - Oben - - - Bottom - Unten - - - Left - Links - - - Right - Rechts - - - Location - Standort - - - Keep shown - Angezeigt lassen - - - Keep hidden - Ausgeblendet lassen - - - Smart hide - Intelligentes Ausblenden - - - Status - Status - - - Small - Klein - - - Large - Groß - - - Show Dock - Dock anzeigen - - - On screen where the cursor is - Auf dem Bildschirm, wo sich der Zeiger befindet - - - Only on main screen - Nur auf dem Hauptbildschirm - - MultitaskingPlugin Multitasking View - Multitask-Ansicht + Multitasking-Ansicht Undock @@ -347,20 +293,12 @@ Onboard Touch-Tastatur - - Settings - Einstellungen - PowerPlugin Power - Energie - - - Power settings - Energieeinstellungen + Ausschalten / Abmelden Capacity %1, %2 min remaining @@ -392,15 +330,7 @@ Capacity %1, fully charged - Kapazität %1, voll aufgeladen - - - - SettingsModule - - Dock - Dock - /personalization/Dock + Kapazität %1, vollständig geladen @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Energie - Shut down Herunterfahren @@ -452,6 +378,10 @@ Reboot Neu starten + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Gerät + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -502,7 +443,7 @@ Move to Trash - In den Mull verschieben + In den Papierkorb verschieben @@ -516,4 +457,19 @@ Leeren + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_de_CH.ts b/translations/dde-dock_de_CH.ts new file mode 100644 index 000000000..dc815b7bf --- /dev/null +++ b/translations/dde-dock_de_CH.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_el.ts b/translations/dde-dock_el.ts index 051625c9b..1a5854286 100644 --- a/translations/dde-dock_el.ts +++ b/translations/dde-dock_el.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Αφαίρεση + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Απενεργοποιήθηκε + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Προσθήκη διάταξης πληκτρολογίου + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Ρυθμίσεις ώρας + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Άγνωστη συσκευή - - - Unknown volume - Άγνωστος τόμος + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Δίσκος + Enabled + - Open - Άνοιγμα - - - Unmount all - Αποπροσάρτηση όλων + Disabled + @@ -173,21 +221,6 @@ Πρόγραμμα εκκίνησης - - MainWindow - - Exit Safe Mode - Έξοδος Ασφαλής Λειτουργίας - - - Dock - Safe Mode - Γραμμή Εργασιών - Ασφαλής Λειτουργία - - - The Dock is in safe mode, please exit to show it properly - Η Γραμμή Εργασιών είναι σε ασφαλή λειτουργία, παρακαλώ αποχωρήστε για να εμφανιστεί σωστά - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Μέγεθος - - - Multiple Displays - Πολλαπλές Οθόνες - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Μοντέρνα λειτουργία - - - Efficient mode - Αποτελεσματική λειτουργία - - - Mode - Λειτουργία - - - Top - Πάνω μέρος - - - Bottom - Κάτω μέρος - - - Left - Αριστερά - - - Right - Δεξιά - - - Location - Τοποθεσία - - - Keep shown - - - - Keep hidden - Κρατήστε κρυφό - - - Smart hide - Έξυπνη απόκρυψη - - - Status - Κατάσταση - - - Small - Μικρό - - - Large - Μεγάλο - - - Show Dock - - - - On screen where the cursor is - Στην οθόνη όπου βρίσκεται ο κέρσορας - - - Only on main screen - Μόνο στην κύρια οθόνη - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Ρυθμίσεις - PowerPlugin @@ -358,10 +300,6 @@ Power Ενέργεια - - Power settings - Ρυθμίσεις ενέργειας - Capacity %1, %2 min remaining Χωρητικότητα %1, απομένουν %2 λεπτά @@ -395,14 +333,6 @@ Χωρητικότητα %1, πλήρης φόρτιση - - SettingsModule - - Dock - Προσθήκη στην γραμμή εργασιών - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Ενέργεια - Shut down Τερματισμός λειτουργίας @@ -452,6 +378,10 @@ Reboot Επανεκκίνηση + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Συσκευή + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Κενό + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_en_AU.ts b/translations/dde-dock_en_AU.ts index 592a41ee6..35c41e40f 100644 --- a/translations/dde-dock_en_AU.ts +++ b/translations/dde-dock_en_AU.ts @@ -44,9 +44,20 @@ - AppDragWidget + AppMultiItem - Remove + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices @@ -88,12 +99,35 @@ Turned off + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Add keyboard layout + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Time settings + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Unknown device - - - Unknown volume - Unknown volume + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - Open - - - Unmount all - Unmount all + Disabled + @@ -173,21 +221,6 @@ Launcher - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Size - - - Multiple Displays - Multiple Displays - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - - - - Efficient mode - - - - Mode - Mode - - - Top - Top - - - Bottom - Bottom - - - Left - Left - - - Right - Right - - - Location - Location - - - Keep shown - - - - Keep hidden - - - - Smart hide - - - - Status - Status - - - Small - - - - Large - - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Settings - PowerPlugin @@ -358,10 +300,6 @@ Power Power - - Power settings - Power settings - Capacity %1, %2 min remaining Capacity %1, %2 min remaining @@ -395,14 +333,6 @@ Capacity %1, fully charged - - SettingsModule - - Dock - Dock - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Power - Shut down Shut down @@ -452,6 +378,10 @@ Reboot Reboot + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Device + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Empty + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_en_GB.ts b/translations/dde-dock_en_GB.ts index a3d61ad40..e193b6530 100644 --- a/translations/dde-dock_en_GB.ts +++ b/translations/dde-dock_en_GB.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk + Enabled - Open - - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + + + + + MenuWorker Fashion Mode Beautiful mode @@ -132,7 +261,7 @@ Mode - + Mode Location @@ -143,14 +272,7 @@ - Plugins - - - - - LauncherItem - - Launcher + Dock settings @@ -165,33 +287,18 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - - PowerPlugin Power - - - - Power settings - + Power Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down Shut down - - Restart - - Suspend @@ -267,6 +374,14 @@ Power settings + + Reboot + Reboot + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -302,7 +424,7 @@ SoundPlugin Sound - + Sound @@ -319,12 +441,16 @@ Trash - %1 files + + Move to Trash + + TrashWidget Open - + Open Empty @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_en_US.ts b/translations/dde-dock_en_US.ts new file mode 100644 index 000000000..f3e8bacec --- /dev/null +++ b/translations/dde-dock_en_US.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + The plugin %1 is not compatible with the system. + + + + AirplaneModeApplet + + Airplane Mode + Airplane Mode + + + + AirplaneModeItem + + Airplane mode enabled + Airplane mode enabled + + + Turn off + Turn off + + + Turn on + Turn on + + + Airplane Mode settings + Airplane Mode settings + + + Airplane mode disabled + Airplane mode disabled + + + + AirplaneModePlugin + + Airplane Mode + Airplane Mode + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + Bluetooth settings + + + + BluetoothItem + + Turn off + Turn off + + + Turn on + Turn on + + + Bluetooth settings + Bluetooth settings + + + %1 connected + %1 connected + + + Connecting... + Connecting... + + + Bluetooth + Bluetooth + + + Turned off + Turned off + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + Add keyboard layout + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + Datetime + + + 12-hour time + 12-hour time + + + 24-hour time + 24-hour time + + + Time settings + Time settings + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + Are you sure you want to empty %1 items? + + + Cancel + Cancel + + + Delete + Delete + + + This action cannot be restored + This action cannot be restored + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + Launcher + + + + MenuWorker + + Fashion Mode + Fashion Mode + + + Efficient Mode + Efficient Mode + + + Top + Top + + + Bottom + Bottom + + + Left + Left + + + Right + Right + + + Keep Shown + Keep Shown + + + Keep Hidden + Keep Hidden + + + Smart Hide + Smart Hide + + + Mode + Mode + + + Location + Location + + + Status + Status + + + Dock settings + Dock settings + + + + MultitaskingPlugin + + Multitasking View + Multitasking View + + + Undock + Undock + + + + OnboardPlugin + + Onboard + Onboard + + + + PowerPlugin + + Power + Power + + + Capacity %1, %2 min remaining + Capacity %1, %2 min remaining + + + Capacity %1, %2 hr %3 min remaining + Capacity %1, %2 hr %3 min remaining + + + Charging %1, %2 min until full + Charging %1, %2 min until full + + + Charging %1, %2 hr %3 min until full + Charging %1, %2 hr %3 min until full + + + Capacity %1 + Capacity %1 + + + Charging %1 + Charging %1 + + + Capacity %1 ... + Capacity %1 ... + + + Capacity %1, fully charged + Capacity %1, fully charged + + + + ShowDesktopPlugin + + Show Desktop + Show Desktop + + + Undock + Undock + + + + ShutdownPlugin + + Shut down + Shut down + + + Suspend + Suspend + + + Hibernate + Hibernate + + + Lock + Lock + + + Log out + Log out + + + Switch account + Switch account + + + Power settings + Power settings + + + Reboot + Reboot + + + Plugged In + + + + + SoundApplet + + Device + Device + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + Unmute + + + Mute + Mute + + + Sound settings + Sound settings + + + Volume %1 + Volume %1 + + + + SoundPlugin + + Sound + Sound + + + + TrashPlugin + + Trash + Trash + + + Trash - %1 file + Trash - %1 file + + + Trash - %1 files + Trash - %1 files + + + Move to Trash + Move to Trash + + + + TrashWidget + + Open + Open + + + Empty + Empty + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_eo.ts b/translations/dde-dock_eo.ts index 7a6a12a66..a60fa3b31 100644 --- a/translations/dde-dock_eo.ts +++ b/translations/dde-dock_eo.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ Aldoni klavararanĝon + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings - Hor-agordoj + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk - Disko - - - Open + Enabled - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + Lanĉilo + + + + MenuWorker Fashion Mode @@ -143,17 +272,10 @@ - Plugins + Dock settings - - LauncherItem - - Launcher - Lanĉilo - - MultitaskingPlugin @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Reto - - OnboardPlugin Onboard - - Settings - Agordoj - PowerPlugin @@ -189,10 +300,6 @@ Power Ŝalto - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - Ŝalto - Shut down Elŝaltiti - - Restart - Rekomenci - Suspend Paŭzigi @@ -267,6 +374,14 @@ Power settings + + Reboot + Restartigi + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device Aparato + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ Muta - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown - Nekonata - - - Wired connection: %1 - - - - - WirelessItem - - No Network + Exit Safe Mode - Wireless Connection: %1 + Dock - Safe Mode - Connected but no Internet access - - - - - WirelessList - - Wireless Network - Senkabla reto - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_es.ts b/translations/dde-dock_es.ts index 19a3d3fc3..a0061250a 100644 --- a/translations/dde-dock_es.ts +++ b/translations/dde-dock_es.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Modo avión activado. Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Modo avión desactivado @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Quitar + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -85,7 +96,22 @@ Turned off - Apagado + Desactivado + + + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + @@ -94,6 +120,14 @@ Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Añadir distribución de teclado + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Ajustes de fecha y hora + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Dispositivo desconocido - - - Unknown volume - Volumen desconocido + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disco + Enabled + - Open - Abrir - - - Unmount all - Desmontar todo + Disabled + @@ -173,21 +221,6 @@ Lanzador - - MainWindow - - Exit Safe Mode - Salir del modo seguro - - - Dock - Safe Mode - Muelle - Modo seguro - - - The Dock is in safe mode, please exit to show it properly - El muelle está en modo seguro, por favor salga para verlo correctamente - - MenuWorker @@ -243,93 +276,6 @@ Ajustes del dock - - ModuleWidget - - Size - Tamaño - - - Multiple Displays - Múltiples pantallas - - - Plugin Area - Área de complementos - - - Select which icons appear in the Dock - Seleccionar los iconos que aparecen en el Dock - - - Fashion mode - Modo elegante - - - Efficient mode - Modo eficiente - - - Mode - modo - - - Top - Arriba - - - Bottom - Abajo - - - Left - Izquierda - - - Right - Derecha - - - Location - Ubicación - - - Keep shown - Mantener visible - - - Keep hidden - Mantener oculto - - - Smart hide - Ocultar inteligentemente - - - Status - Estado - - - Small - Pequeña - - - Large - Grandes - - - Show Dock - Mostrar el muelle - - - On screen where the cursor is - En la pantalla donde está el cursor - - - Only on main screen - Solo en la pantalla principal - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Teclado en pantalla - - Settings - Ajustes - PowerPlugin @@ -358,10 +300,6 @@ Power Energía - - Power settings - Ajustes de energía - Capacity %1, %2 min remaining Capacidad %1, %2 min restante @@ -395,14 +333,6 @@ Capacidad %1, completamente cargada - - SettingsModule - - Dock - Dock - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Apagar - Shut down Apagar @@ -452,6 +378,10 @@ Reboot Reiniciar + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Dispositivo + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Vaciar + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_es_MX.ts b/translations/dde-dock_es_MX.ts new file mode 100644 index 000000000..d6ae36f8d --- /dev/null +++ b/translations/dde-dock_es_MX.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + Cancelar + + + Delete + Eliminar + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + Lanzador + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + Izquierda + + + Right + Derecha + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + Ubicación + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + Energía + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + Apagar + + + Suspend + Suspender + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + Dispositivo + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + Silencio + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + Sonido + + + + TrashPlugin + + Trash + Papelera + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + Mover a la papelera + + + + TrashWidget + + Open + Abrir + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_et.ts b/translations/dde-dock_et.ts index 54de0475a..b129aab35 100644 --- a/translations/dde-dock_et.ts +++ b/translations/dde-dock_et.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -14,36 +137,43 @@ - DatetimePlugin + DateTimeDisplayer - Datetime + 12-hour time - 12 Hour Time + 24-hour time - 24 Hour Time - - - - Time Settings + Time settings - DeviceItem + DatetimePlugin - Enable network + Datetime + Kuupäev ja kellaaeg + + + 12-hour time - Disable network + 24-hour time - Network settings + Time settings + Kellaaja seaded + + + + DevCollaborationWidget + + PC collaboration @@ -55,11 +185,11 @@ Cancel - Tühista + Loobu Delete - + Kustuta This action cannot be restored @@ -67,83 +197,20 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk + Enabled - Open - - - - Unmount all - - - - - DockSettings - - Fashion Mode - - - - Efficient Mode - - - - Top - - - - Bottom - - - - Left - - - - Right - - - - Keep Shown - - - - Keep Hidden - - - - Smart Hide - - - - Mode - - - - Location - - - - Status - - - - Plugins + Disabled @@ -151,6 +218,61 @@ LauncherItem Launcher + Käivitaja + + + + MenuWorker + + Fashion Mode + Moodne režiim + + + Efficient Mode + Efektiivne režiim + + + Top + Üleval + + + Bottom + All + + + Left + Vasakul + + + Right + Paremal + + + Keep Shown + Hoia nähtavana + + + Keep Hidden + Hoia peidetuna + + + Smart Hide + Nutikas peitmine + + + Mode + Režiim + + + Location + Aukoht + + + Status + Staatus + + + Dock settings @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - - PowerPlugin @@ -189,10 +300,6 @@ Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -222,7 +337,7 @@ ShowDesktopPlugin Show Desktop - + Näita töölauda Undock @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down Sule arvuti - - Restart - - Suspend @@ -253,11 +360,11 @@ Lock - + Lukk Log out - + Logi välja Switch account @@ -267,15 +374,30 @@ Power settings + + Reboot + Taaskäivita + + + Plugged In + + SoundApplet Device + Seade + + + + SoundDevicesWidget + + Output Device - Application + Sound settings @@ -283,18 +405,18 @@ SoundItem Unmute - + Eemalda vaigistus Mute - + Vaigista - Audio Settings - + Sound settings + Heli seaded - Current Volume %1 + Volume %1 @@ -302,14 +424,14 @@ SoundPlugin Sound - + Heli TrashPlugin Trash - + Prügikast Trash - %1 file @@ -319,59 +441,34 @@ Trash - %1 files + + Move to Trash + + TrashWidget Open - + Ava Empty - + Tühi - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_eu.ts b/translations/dde-dock_eu.ts new file mode 100644 index 000000000..5c2cd5aa5 --- /dev/null +++ b/translations/dde-dock_eu.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_fa.ts b/translations/dde-dock_fa.ts index 70714a3aa..c88bb4d2c 100644 --- a/translations/dde-dock_fa.ts +++ b/translations/dde-dock_fa.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -7,9 +7,57 @@ - AppDragWidget + AirplaneModeApplet - Remove + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + خاموش کردن + + + Turn on + روشن کردن + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices @@ -51,12 +99,35 @@ + + BluetoothMainWidget + + Bluetooth + بلوتوث + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth بلوتوث + + Turn on + + + + Turn off + + DBusAdaptors @@ -65,6 +136,21 @@ اضافه کردن طرح بندی صفحه کلید + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -84,6 +170,13 @@ تنظیمات زمان + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -104,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - دستگاه ناشناخته - - - Unknown volume - حجم ناشناخته + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - دیسک + Enabled + - Open - باز کردن - - - Unmount all - خارج کردن همه + Disabled + @@ -136,21 +221,6 @@ لانچر - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -202,19 +272,7 @@ وضعیت - Plugins - پلاگین ها - - - Only on main screen - - - - On screen where the cursor is - - - - Show the Dock + Dock settings @@ -235,10 +293,6 @@ Onboard روی صفحه - - Settings - تنظیمات - PowerPlugin @@ -246,10 +300,6 @@ Power منبع قدرت - - Power settings - تنظیمات برق - Capacity %1, %2 min remaining ظرفیت %1, %2 دقیقه باقی مانده است @@ -296,10 +346,6 @@ ShutdownPlugin - - Power - منبع قدرت - Shut down خاموش شدن @@ -332,6 +378,10 @@ Reboot راه اندازی مجدد + + Plugged In + + SoundApplet @@ -340,6 +390,17 @@ دستگاه + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -396,4 +457,19 @@ خالی + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_fi.ts b/translations/dde-dock_fi.ts index 3d578f7d1..9185a88cc 100644 --- a/translations/dde-dock_fi.ts +++ b/translations/dde-dock_fi.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Lentotila käytössä Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Lentotila pois käytöstä @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Poista + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Pois päältä + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Lisää näppäimistön asettelu + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Aika-asetukset + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Tuntematon laite - - - Unknown volume - Tuntematon asema + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Levy + Enabled + - Open - Avaa - - - Unmount all - Irroita kaikki + Disabled + @@ -173,21 +221,6 @@ Käynnistin - - MainWindow - - Exit Safe Mode - Poistu vikasietotilasta - - - Dock - Safe Mode - Paneeli - vikasietotila - - - The Dock is in safe mode, please exit to show it properly - Paneeli on vikasietotilassa. Poistu nähtyäsi sen toimivan oikein - - MenuWorker @@ -243,93 +276,6 @@ Telakan asetukset - - ModuleWidget - - Size - Koko - - - Multiple Displays - Useita näyttöjä - - - Plugin Area - Laajennusalue - - - Select which icons appear in the Dock - Valitse mitkä kuvakkeet näkyvät telakassa - - - Fashion mode - Muodikas - - - Efficient mode - Tehokas - - - Mode - Tila - - - Top - Ylhäällä - - - Bottom - Alhaalla - - - Left - Vasen - - - Right - Oikea - - - Location - Sijainti - - - Keep shown - Näytä aina - - - Keep hidden - Pidä piilossa - - - Smart hide - Älykäs piilotus - - - Status - Tila - - - Small - Pieni - - - Large - Suuri - - - Show Dock - Näytä telakka - - - On screen where the cursor is - Näytöllä, jossa kohdistin on - - - Only on main screen - Vain päänäytöllä - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Näppäimistö - - Settings - Asetukset - PowerPlugin @@ -358,10 +300,6 @@ Power Virta - - Power settings - Asetukset virta - Capacity %1, %2 min remaining Akku %1, %2 min jäljellä @@ -395,14 +333,6 @@ Varaus %1, täyteen ladattu - - SettingsModule - - Dock - Telakka - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Virta - Shut down Sammuta @@ -452,6 +378,10 @@ Reboot Käynnistä + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Laite + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -476,7 +417,7 @@ Volume %1 - Äänitaso: %1 + Voimakkuus: %1 @@ -516,4 +457,19 @@ Tyhjennä + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_fil.ts b/translations/dde-dock_fil.ts new file mode 100644 index 000000000..53d492483 --- /dev/null +++ b/translations/dde-dock_fil.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_fr.ts b/translations/dde-dock_fr.ts index 107249525..823e2695d 100644 --- a/translations/dde-dock_fr.ts +++ b/translations/dde-dock_fr.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Mode avion activé Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Mode avion désactivé @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Retirer + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Eteint + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Ajouter une disposition de clavier + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Réglages de l'heure + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Périphérique inconnu - - - Unknown volume - Partition inconnue + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disque + Enabled + - Open - Ouvrir - - - Unmount all - Tout démonter + Disabled + @@ -173,21 +221,6 @@ Lanceur - - MainWindow - - Exit Safe Mode - Mode sans échec de sortie - - - Dock - Safe Mode - Dock - Mode sans échec - - - The Dock is in safe mode, please exit to show it properly - Le Dock est en mode sans échec, veuillez quitter pour l'afficher correctement - - MenuWorker @@ -240,94 +273,7 @@ Dock settings - - - - - ModuleWidget - - Size - Taille - - - Multiple Displays - Affichages multiples - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Mode dock - - - Efficient mode - Mode étendu - - - Mode - Mode - - - Top - Haut - - - Bottom - Bas - - - Left - Gauche - - - Right - Droite - - - Location - Emplacement - - - Keep shown - - - - Keep hidden - Maintenir caché - - - Smart hide - Masquer intelligemment - - - Status - Statut - - - Small - Petit - - - Large - Grand - - - Show Dock - - - - On screen where the cursor is - Sur l'écran où se trouve le curseur - - - Only on main screen - Uniquement sur l'écran principal + Paramètres du dock @@ -347,10 +293,6 @@ Onboard Clavier virtuel - - Settings - Paramètres - PowerPlugin @@ -358,10 +300,6 @@ Power Alimentation - - Power settings - Options d'alimentation - Capacity %1, %2 min remaining Capacité %1, %2 minutes restantes @@ -395,14 +333,6 @@ Capacité %1, complètement chargé - - SettingsModule - - Dock - Dock - /personalization/Dock - - ShowDesktopPlugin @@ -416,21 +346,17 @@ ShutdownPlugin - - Power - Alimentation - Shut down - Arrêter + Eteindre Suspend - Mise en veille + Mettre en veille Hibernate - Mise en veille prolongée + Mettre en veille prolongée Lock @@ -452,6 +378,10 @@ Reboot Redémarrer + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Périphérique + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Vide + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_gl_ES.ts b/translations/dde-dock_gl_ES.ts index 8884fd4c1..65611f43c 100644 --- a/translations/dde-dock_gl_ES.ts +++ b/translations/dde-dock_gl_ES.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Eliminar + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Desactivado + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Engadir disposición do teclado + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Axustes da hora + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Dispositivo descoñecido - - - Unknown volume - Volume descoñecido + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disco + Enabled + - Open - Abrir - - - Unmount all - Desmontar todo + Disabled + @@ -173,21 +221,6 @@ Lanzador - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Tamaño - - - Multiple Displays - Pantallas múltiple - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Modo moderno - - - Efficient mode - Modo eficiente - - - Mode - Modo - - - Top - Arriba - - - Bottom - Abaixo - - - Left - Esquerda - - - Right - Dereita - - - Location - Localización - - - Keep shown - - - - Keep hidden - Manter oculto - - - Smart hide - Ocultar automaticamente - - - Status - Estado - - - Small - Pequeno - - - Large - Grande - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard A bordo - - Settings - Axustes - PowerPlugin @@ -358,10 +300,6 @@ Power Enerxía - - Power settings - Axustes de enerxía - Capacity %1, %2 min remaining Capacidade %1, %2 minutos restantes @@ -395,14 +333,6 @@ Capacidade %1, totalmente cargada - - SettingsModule - - Dock - Doca - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Enerxía - Shut down Apagar @@ -452,6 +378,10 @@ Reboot Reiniciar + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Dispositivo + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Baleirar + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_he.ts b/translations/dde-dock_he.ts index a36e6b7dd..d64ac8b1a 100644 --- a/translations/dde-dock_he.ts +++ b/translations/dde-dock_he.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk - כונן + Enabled + - Open - פתיחה - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + משגר + + + + MenuWorker Fashion Mode @@ -143,15 +272,8 @@ - Plugins - פלאגינים - - - - LauncherItem - - Launcher - משגר + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - רשת - - OnboardPlugin Onboard - - Settings - הגדרות - PowerPlugin @@ -189,10 +300,6 @@ Power צריכת חשמל - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,25 +346,17 @@ ShutdownPlugin - - Power - צריכת חשמל - Shut down כיבוי - - Restart - אתחול - Suspend השהיה Hibernate - + תרדמת Lock @@ -267,6 +374,14 @@ Power settings + + Reboot + + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device התקן + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ השתקה - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + העבר לאשפה + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown - לא ידוע - - - Wired connection: %1 - - - - - WirelessItem - - No Network + Exit Safe Mode - Wireless Connection: %1 + Dock - Safe Mode - Connected but no Internet access - - - - - WirelessList - - Wireless Network - רשת אלחוטית - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_hi_IN.ts b/translations/dde-dock_hi_IN.ts index ebfe8c4fc..6753a79d5 100644 --- a/translations/dde-dock_hi_IN.ts +++ b/translations/dde-dock_hi_IN.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -7,9 +7,57 @@ - AppDragWidget + AirplaneModeApplet - Remove + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + ऑफ करें + + + Turn on + ऑन करें + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices @@ -51,12 +99,35 @@ + + BluetoothMainWidget + + Bluetooth + ब्लूटुथ + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth ब्लूटूथ + + Turn on + + + + Turn off + + DBusAdaptors @@ -65,6 +136,21 @@ कुंजीपटल अभिन्यास जोड़ें + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -84,6 +170,13 @@ समय सेवाएं + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -100,33 +193,25 @@ This action cannot be restored - इस कार्रवाई को पुनः स्थापित नहीं किया जा सकता है + यह कार्य पूर्ववत नहीं हो सकता है - DiskControlItem + DisplaySettingWidget - Unknown device - अज्ञात डिवाइस - - - Unknown volume - अज्ञात वॉल्यूम + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - डिस्क + Enabled + - Open - खोलें - - - Unmount all - सभी को माउंट से हटाएँ + Disabled + @@ -136,21 +221,6 @@ लॉन्चर - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -202,19 +272,7 @@ स्थिति - Plugins - प्लगिन - - - Only on main screen - - - - On screen where the cursor is - - - - Show the Dock + Dock settings @@ -235,10 +293,6 @@ Onboard ऑनबोर्ड - - Settings - सेटिंग्स - PowerPlugin @@ -246,10 +300,6 @@ Power पॉवर - - Power settings - पॉवर सेटिंग्स - Capacity %1, %2 min remaining क्षमता %1, %2 मिनट शेष @@ -296,10 +346,6 @@ ShutdownPlugin - - Power - पॉवर - Shut down बंद करें @@ -310,7 +356,7 @@ Hibernate - हाइबरनेट + सुप्त करें Lock @@ -322,7 +368,7 @@ Switch account - खाता बदलें + अकाउंट बदलें Power settings @@ -332,12 +378,27 @@ Reboot पुनः आरंभ करें + + Plugged In + + SoundApplet Device - डिवाइस + उपकरण + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + @@ -370,15 +431,15 @@ TrashPlugin Trash - रद्दी + ट्रैश Trash - %1 file - कचरा - %1 फ़ाइल + ट्रैश - %1 फाइल Trash - %1 files - कचरा - %1 फ़ाइलें + ट्रैश - %1 फाइलें Move to Trash @@ -393,7 +454,22 @@ Empty - खाली + खाली करें + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + \ No newline at end of file diff --git a/translations/dde-dock_hr.ts b/translations/dde-dock_hr.ts index a11ab333e..760f9028d 100644 --- a/translations/dde-dock_hr.ts +++ b/translations/dde-dock_hr.ts @@ -10,14 +10,14 @@ AirplaneModeApplet Airplane Mode - + Zrakoplovni način AirplaneModeItem Airplane mode enabled - + Zrakoplovni način rada omogućen Turn off @@ -29,25 +29,36 @@ Airplane Mode settings - + Postavke zrakoplovnog načina rada Airplane mode disabled - + Zrakoplovni način rada onemogućen AirplaneModePlugin Airplane Mode + Zrakoplovni način + + + + AppMultiItem + + Open - AppDragWidget + BloothAdapterWidget - Remove - Ukloni + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Isključeno + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Dodaj raspored tipkovnice + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Postavke vremena + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Nepoznati uređaj - - - Unknown volume - Nepoznata količina + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - Otvori - - - Unmount all - Sve odspoji + Disabled + @@ -173,21 +221,6 @@ Pokretač - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Veličina - - - Multiple Displays - Višestruki zasloni - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Moderan način - - - Efficient mode - Učinkoviti način - - - Mode - Način - - - Top - Gore - - - Bottom - Dolje - - - Left - Lijevo - - - Right - Desno - - - Location - Lokacija - - - Keep shown - Drži prikazano - - - Keep hidden - Drži skriveno - - - Smart hide - Pametno skrivanje - - - Status - Status - - - Small - Maleno - - - Large - Veliko - - - Show Dock - - - - On screen where the cursor is - Na zaslon gdje je pokazivač - - - Only on main screen - Samo na glavni zaslon - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard - - Settings - Postavke - PowerPlugin @@ -358,10 +300,6 @@ Power Energija - - Power settings - Energetske postavke - Capacity %1, %2 min remaining Kapacitet %1, %2 min preostalo @@ -395,14 +333,6 @@ Kapacitet %1, potpuno napunjen - - SettingsModule - - Dock - - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Energija - Shut down Isključi @@ -452,6 +378,10 @@ Reboot Ponovno podigni sustav + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Uređaj + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Prazno + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_hu.ts b/translations/dde-dock_hu.ts index 689736ca9..8b10918e4 100644 --- a/translations/dde-dock_hu.ts +++ b/translations/dde-dock_hu.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Eltávolítás + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Kikapcsolva + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,11 +136,26 @@ Billentyűzetkiosztás megadása + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin Datetime - Dátum és idő + Dátum és Idő 12-hour time @@ -121,11 +170,18 @@ Idő beállításai + + DevCollaborationWidget + + PC collaboration + + + DialogManager Are you sure you want to empty %1 items? - Biztosan törölni akarja a %1 elemet? + Biztosan ki akarja üríteni a %1 elemet? Cancel @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Ismeretlen eszköz - - - Unknown volume - Ismeretlen kötet + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Lemez + Enabled + - Open - Megnyitás - - - Unmount all - Összes lecsatolása + Disabled + @@ -173,21 +221,6 @@ Indító - - MainWindow - - Exit Safe Mode - Kilépés a biztonságos módból - - - Dock - Safe Mode - Dokkoló - Biztonságos mód - - - The Dock is in safe mode, please exit to show it properly - A Dokkoló biztonságos módban van. Kérjük lépjen ki a megfelelő megjelenítéshez - - MenuWorker @@ -243,93 +276,6 @@ Dokkoló beállításai - - ModuleWidget - - Size - Méret - - - Multiple Displays - Többképernyős mód - - - Plugin Area - Bővítmény terület - - - Select which icons appear in the Dock - Válassza ki, hogy mely ikonok jelenjenek meg a dokkolóban - - - Fashion mode - Stílusos mód - - - Efficient mode - Hatékony mód - - - Mode - Mód - - - Top - Fent - - - Bottom - Lent - - - Left - Bal - - - Right - Jobb - - - Location - Hely - - - Keep shown - Megjelenítve tartás - - - Keep hidden - Maradjon rejtett - - - Smart hide - Intelligens elrejtés - - - Status - Állapot - - - Small - Kicsi - - - Large - Nagy - - - Show Dock - Dokkoló mutatása - - - On screen where the cursor is - A képernyőn, ahol a kurzor található - - - Only on main screen - Csak a főképernyőn - - MultitaskingPlugin @@ -347,20 +293,12 @@ Onboard Képernyő billentyűzet - - Settings - Beállítások - PowerPlugin Power - Kikapcsolás - - - Power settings - Energiagazdálkodási beállítások + Energiaellátás Capacity %1, %2 min remaining @@ -395,14 +333,6 @@ Akkumulátor töltöttsége %1, teljesen feltöltve - - SettingsModule - - Dock - Dokkoló - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Kikapcsolás - Shut down Leállítás @@ -452,6 +378,10 @@ Reboot Újraindítás + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Eszköz + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -483,7 +424,7 @@ SoundPlugin Sound - Hang + Hangok @@ -494,11 +435,11 @@ Trash - %1 file - Kukában: %1 fájl + Kukában - %1 fájl Trash - %1 files - Kukában: %1 fájl + Kukában - %1 fájlok Move to Trash @@ -516,4 +457,19 @@ Ürítés + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_hy.ts b/translations/dde-dock_hy.ts index 215dc0165..001fc744e 100644 --- a/translations/dde-dock_hy.ts +++ b/translations/dde-dock_hy.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk + Enabled - Open - - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + Պիտակ + + + + MenuWorker Fashion Mode @@ -143,17 +272,10 @@ - Plugins + Dock settings - - LauncherItem - - Launcher - Պիտակ - - MultitaskingPlugin @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - Կարգավորումներ - PowerPlugin @@ -189,10 +300,6 @@ Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down Անջատել - - Restart - Վերսկսել - Suspend Ընդհատել @@ -267,6 +374,14 @@ Power settings + + Reboot + + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ Անջատել ձայնը - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + Տեղափոխել աղբաման + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown - Անհայտ - - - Wired connection: %1 - - - - - WirelessItem - - No Network + Exit Safe Mode - Wireless Connection: %1 + Dock - Safe Mode - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_id.ts b/translations/dde-dock_id.ts index 64f469a23..d91c024c2 100644 --- a/translations/dde-dock_id.ts +++ b/translations/dde-dock_id.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ Tambah tata letak papan ketik + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,31 +158,23 @@ Tanggalwaktu - 12 Hour Time - Waktu 12 Jam + 12-hour time + - 24 Hour Time - Waktu 24 Jam + 24-hour time + - Time Settings - Pengaturan Waktu + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - Aktifkan jaringan - - - Disable network - Matikan jaringan - - - Network settings - Pengaturan jaringan + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Perangkat tidak diketahui - - - Unknown volume - Volume tidak diketahui + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Diska + Enabled + - Open - Terbuka - - - Unmount all - Lepaskan semua + Disabled + - DockSettings + LauncherItem + + Launcher + Peluncur + + + + MenuWorker Fashion Mode Mode fasion @@ -143,15 +272,8 @@ Status - Plugins - Plugin - - - - LauncherItem - - Launcher - Peluncur + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Jaringan - - OnboardPlugin Onboard Pada papan - - Settings - Pengaturan - PowerPlugin @@ -189,10 +300,6 @@ Power Daya - - Power settings - Pengaturan daya - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - Terisi %1 - Charging %1, %2 min until full @@ -214,11 +317,19 @@ - Charging %1 .... + Capacity %1 - Charged + Charging %1 + Mengisi %1 + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -235,18 +346,10 @@ ShutdownPlugin - - Power - Daya - Shut down Matikan - - Restart - Nyalakan ulang - Suspend Tangguhkan @@ -271,6 +374,14 @@ Power settings Pengaturan daya + + Reboot + Boot ulang + + + Plugged In + + SoundApplet @@ -278,9 +389,16 @@ Device Perangkat + + + SoundDevicesWidget - Application - Aplikasi + Output Device + + + + Sound settings + @@ -294,12 +412,12 @@ Senyap - Audio Settings - Pengaturan Audio + Sound settings + - Current Volume %1 - Volume Saat ini %1 + Volume %1 + @@ -323,6 +441,10 @@ Trash - %1 files Tong sampah - %1 berkas + + Move to Trash + Pindah ke tempat sampah + TrashWidget @@ -336,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - Baki sistem - - - - WiredItem - - Unknown - Tidak diketahui + Exit Safe Mode + - Wired connection: %1 - Koneksi kabel: %1 - - - - WirelessItem - - No Network - Tidak ada jaringan + Dock - Safe Mode + - Wireless Connection: %1 - Koneksi nirkabel: %1 - - - Connected but no Internet access - Terhubung tetapi tidak ada akses Internet - - - - WirelessList - - Wireless Network - Jaringan Nirkabel - - - Wireless Network %1 - Jaringan Nirkabel %1 + The Dock is in safe mode, please exit to show it properly + \ No newline at end of file diff --git a/translations/dde-dock_it.ts b/translations/dde-dock_it.ts index 248614ab3..28b16bb85 100644 --- a/translations/dde-dock_it.ts +++ b/translations/dde-dock_it.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Modalità aereo abilitata Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Modalità aereo disabilitata @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Rimuovi + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Disattivato + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Aggiungi un layout della Tastiera + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Impostazioni orarie + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Dispositivo sconosciuto - - - Unknown volume - Volume sconosciuto + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disco + Enabled + - Open - Apri - - - Unmount all - Smonta tutto + Disabled + @@ -173,21 +221,6 @@ Launcher - - MainWindow - - Exit Safe Mode - Esci dalla modalità provvisoria - - - Dock - Safe Mode - Dock - Modalità provvisoria - - - The Dock is in safe mode, please exit to show it properly - La Dock è in modalità provvisoria, esci per mostrarla in modo tradizionale - - MenuWorker @@ -243,93 +276,6 @@ Impostazioni Dock - - ModuleWidget - - Size - Dimensioni - - - Multiple Displays - Display multipli - - - Plugin Area - Area plugin - - - Select which icons appear in the Dock - Seleziona quali icone appaiono nel Dock - - - Fashion mode - Modalità Fashion - - - Efficient mode - Modalità Efficient - - - Mode - Modalità - - - Top - Top - - - Bottom - Sotto - - - Left - Sinistra - - - Right - Destra - - - Location - Posizione - - - Keep shown - Mostra sempre - - - Keep hidden - Nascondi sempre - - - Smart hide - Nascondi automaticamente - - - Status - Comportamento - - - Small - Piccolo - - - Large - Grande - - - Show Dock - Mostra la Dock - - - On screen where the cursor is - Sullo schermo dove è presente il cursore - - - Only on main screen - Solo sullo schermo principale - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Tastiera - - Settings - Impostazioni - PowerPlugin @@ -358,17 +300,13 @@ Power Alimentazione - - Power settings - Impostazioni Alimentazione - Capacity %1, %2 min remaining - Carica %1, %2 min. rimanenti + Autonomia %1, %2 min. rimanenti Capacity %1, %2 hr %3 min remaining - Carica %1, %2 ore e %3 min. rimanenti + Autonomia %1, %2 ore e %3 min. rimanenti Charging %1, %2 min until full @@ -392,15 +330,7 @@ Capacity %1, fully charged - Carica completa %1 - - - - SettingsModule - - Dock - Dock - /personalization/Dock + Carica completa, capacità %1 @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Alimentazione - Shut down Spegni @@ -452,6 +378,10 @@ Reboot Riavvia + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Dispositivo + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Svuota + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_ja.ts b/translations/dde-dock_ja.ts index a320212d2..86d7e718d 100644 --- a/translations/dde-dock_ja.ts +++ b/translations/dde-dock_ja.ts @@ -44,9 +44,20 @@ - AppDragWidget + AppMultiItem - Remove + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices @@ -88,12 +99,35 @@ オフにしました + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ キーボードレイアウトを追加 + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ 時間設定 + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - 不明なデバイス - - - Unknown volume - 不明なボリューム + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - ディスク + Enabled + - Open - 開く - - - Unmount all - すべてマウント解除 + Disabled + @@ -173,21 +221,6 @@ ランチャー - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - サイズ - - - Multiple Displays - マルチディスプレイ - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - ファッションモード - - - Efficient mode - 効率モード - - - Mode - モード - - - Top - - - - Bottom - - - - Left - - - - Right - - - - Location - 位置 - - - Keep shown - - - - Keep hidden - 隠したままにする - - - Smart hide - スマートハイド - - - Status - 状態 - - - Small - - - - Large - - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - 設定 - PowerPlugin @@ -358,10 +300,6 @@ Power 電源 - - Power settings - 電源の設定 - Capacity %1, %2 min remaining バッテリー残量 %1、残り %2 分 @@ -395,14 +333,6 @@ バッテリー残量 %1、フル充電済み - - SettingsModule - - Dock - ドック - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - 電源 - Shut down シャットダウン @@ -452,6 +378,10 @@ Reboot 再起動 + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ デバイス + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -468,7 +409,7 @@ Mute - 消音 + ミュート Sound settings @@ -516,4 +457,19 @@ + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_ka.ts b/translations/dde-dock_ka.ts new file mode 100644 index 000000000..ebfe77a92 --- /dev/null +++ b/translations/dde-dock_ka.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + გაუქმება + + + Delete + წაშლა + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + მიმზიდველი რეჟიმი + + + Efficient Mode + ეფექტური რეჟიმი + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + კვება + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + ეკრანის ჩვენება + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + გადატვირთვა + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + ხმა + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_kab.ts b/translations/dde-dock_kab.ts new file mode 100644 index 000000000..5cf655a69 --- /dev/null +++ b/translations/dde-dock_kab.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + Sens + + + Turn on + Sermed + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + Iɣewwaren n Bluetooth + + + + BluetoothItem + + Turn off + Sens + + + Turn on + Sermed + + + Bluetooth settings + Iɣewwaren n Bluetooth + + + %1 connected + %1 yettwaqqen + + + Connecting... + Ala yetteqqen... + + + Bluetooth + Bluetooth + + + Turned off + Yensa + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + Rnu taneɣruft n unasiw + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + Iɣewwaren n wakud + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + Sefsex + + + Delete + Kkes + + + This action cannot be restored + Tigawt-agi ulamek ara d-ttwarr + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + Amsekker + + + + MenuWorker + + Fashion Mode + Askar atrar + + + Efficient Mode + Askar amellil + + + Top + Afella + + + Bottom + Adda + + + Left + Azelmaḍ + + + Right + Ayeffus + + + Keep Shown + Eǧǧ-it yettban + + + Keep Hidden + Eǧǧ-it yeffer + + + Smart Hide + + + + Mode + Askar + + + Location + Adig + + + Status + Addad + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + Kkes asekkeṛ + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + Tazmert + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + Sken tanarit + + + Undock + Kkes asekkeṛ + + + + ShutdownPlugin + + Shut down + Sens + + + Suspend + Seḥbes + + + Hibernate + + + + Lock + Sekkeṛ + + + Log out + Ffeɣ + + + Switch account + Snifel amiḍan + + + Power settings + + + + Reboot + Ales asker + + + Plugged In + + + + + SoundApplet + + Device + Ibenk + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + Serreḥ i yimesli + + + Mute + Gzem imesli + + + Sound settings + Iɣewwaren n yimesli + + + Volume %1 + Ableɣ %1 + + + + SoundPlugin + + Sound + Imesli + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + Ldi + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_kk.ts b/translations/dde-dock_kk.ts new file mode 100644 index 000000000..2693a75c0 --- /dev/null +++ b/translations/dde-dock_kk.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + Бас тарту + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + Қорек + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + Дыбыс + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_km_KH.ts b/translations/dde-dock_km_KH.ts new file mode 100644 index 000000000..aad7a5cc0 --- /dev/null +++ b/translations/dde-dock_km_KH.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + បោះបង់ + + + Delete + លុប + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + Fashion Mode + + + Efficient Mode + ម៉ូដប្រសិទ្ធភាព + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + បង្ហាញផ្ទៃតុ + + + Undock + + + + + ShutdownPlugin + + Shut down + បិទ + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + ចាប់ផ្តើមឡើងវិញ + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_kn_IN.ts b/translations/dde-dock_kn_IN.ts index d590664a0..af505a4db 100644 --- a/translations/dde-dock_kn_IN.ts +++ b/translations/dde-dock_kn_IN.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,31 +158,23 @@ ದಿನ-ಸಮಯ - 12 Hour Time - 12 ಘಂಟೆ ಸಮಯ + 12-hour time + - 24 Hour Time - 24 ಘಂಟೆ ಸಮಯ + 24-hour time + - Time Settings - ಸಮಯದ ಸೆಟ್ಟಿಂಗ್ ಗಳು + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - ಜಾಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ - - - Disable network - ಜಾಲವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ - - - Network settings - ಜಾಲ ಸೆಟ್ಟಿಂಗ್ಗಳು + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - ಅಪರಿಚಿತ ಸಾಧನ - - - Unknown volume - ಅಪರಿಚಿತ ಸಂಪುಟ - - - - DiskMountPlugin - - Disk - ಡಿಸ್ಕ್ - - - Open - ತೆರೆಯಿರಿ - - - Unmount all + Multi-Screen Collaboration - DockSettings + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker Fashion Mode ಅಲಂಕೃತ ರೂಪ @@ -143,14 +272,7 @@ - Plugins - - - - - LauncherItem - - Launcher + Dock settings @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - - PowerPlugin @@ -189,10 +300,6 @@ Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down - - Restart - - Suspend @@ -267,6 +374,14 @@ Power settings + + Reboot + + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_ko.ts b/translations/dde-dock_ko.ts index c44a6e0e6..8b0cd8be7 100644 --- a/translations/dde-dock_ko.ts +++ b/translations/dde-dock_ko.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - 제거 + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ 꺼짐 + + BluetoothMainWidget + + Bluetooth + 블루투스 + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth 블루투스 + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ 키보드 레이아웃 추가 + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ 시간 설정 + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - 알 수 없는 장치 - - - Unknown volume - 알 수 없는 볼륨 + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - 디스크 + Enabled + - Open - 열기 - - - Unmount all - 모두 마운트 해제 + Disabled + @@ -173,21 +221,6 @@ 실행도구 - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - 크기 - - - Multiple Displays - 다중 디스플레이 - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - 패션(Fashion) 모드 - - - Efficient mode - 효율 모드 - - - Mode - 모드 - - - Top - 상단 - - - Bottom - 하단 - - - Left - 왼쪽 - - - Right - 오른쪽 - - - Location - 위치 - - - Keep shown - - - - Keep hidden - 숨겨두기 - - - Smart hide - 스마트하이드 - - - Status - 상태 - - - Small - 소형 - - - Large - 대형 - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard 온보드 - - Settings - 설정 - PowerPlugin @@ -358,10 +300,6 @@ Power 전원 - - Power settings - 전원 설정 - Capacity %1, %2 min remaining 용량 %1, %2분 남음 @@ -395,14 +333,6 @@ 용량 %1, 완전히 충전됨 - - SettingsModule - - Dock - 도구집 - /personalization/Dock - - ShowDesktopPlugin @@ -416,13 +346,9 @@ ShutdownPlugin - - Power - 전원 - Shut down - 종료 + 컴퓨터 끄기 Suspend @@ -452,6 +378,10 @@ Reboot 재부팅 + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ 장치 + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ 비우기 + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_ku.ts b/translations/dde-dock_ku.ts new file mode 100644 index 000000000..667178f4f --- /dev/null +++ b/translations/dde-dock_ku.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + Betal Bike + + + Delete + Jê Bibe + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + Hilpekîner + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + Bigire + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + Derkeve + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_ku_IQ.ts b/translations/dde-dock_ku_IQ.ts index 1ae1ae1ca..227ad681b 100644 --- a/translations/dde-dock_ku_IQ.ts +++ b/translations/dde-dock_ku_IQ.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk + Enabled - Open - - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + + + + + MenuWorker Fashion Mode @@ -143,14 +272,7 @@ - Plugins - - - - - LauncherItem - - Launcher + Dock settings @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - Mîheng - PowerPlugin @@ -189,10 +300,6 @@ Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down - - Restart - - Suspend @@ -267,6 +374,14 @@ Power settings + + Reboot + + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ Bêdeng - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_ky.ts b/translations/dde-dock_ky.ts new file mode 100644 index 000000000..848ef5722 --- /dev/null +++ b/translations/dde-dock_ky.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + жокко чыгаруу + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_ky@Arab.ts b/translations/dde-dock_ky@Arab.ts new file mode 100644 index 000000000..ca66b2058 --- /dev/null +++ b/translations/dde-dock_ky@Arab.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + جوققو چىعارۇۇ + + + Delete + ۅچۉرۉۉ + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_la.ts b/translations/dde-dock_la.ts new file mode 100644 index 000000000..30076bc06 --- /dev/null +++ b/translations/dde-dock_la.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_lo.ts b/translations/dde-dock_lo.ts index 5b1a524b7..ba67c5320 100644 --- a/translations/dde-dock_lo.ts +++ b/translations/dde-dock_lo.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ ເພີ່ມຮູບແບບແປ້ນພິມ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk + Enabled - Open - ເປີດ - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + + + + + MenuWorker Fashion Mode @@ -143,14 +272,7 @@ - Plugins - - - - - LauncherItem - - Launcher + Dock settings @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - - PowerPlugin @@ -189,10 +300,6 @@ Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down ປິດ​ເຄື່ອງ - - Restart - - Suspend ຢຸດໄວ້ @@ -267,6 +374,14 @@ Power settings + + Reboot + ເປີດຄືນ + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_lt.ts b/translations/dde-dock_lt.ts index c481c596f..8103714de 100644 --- a/translations/dde-dock_lt.ts +++ b/translations/dde-dock_lt.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Šalinti + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Pridėti klaviatūros išdėstymą + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Laiko nustatymai + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Nežinomas įrenginys - - - Unknown volume - Nežinomas tomas + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Diskas + Enabled + - Open - Atverti - - - Unmount all - Atjungti visus + Disabled + @@ -173,21 +221,6 @@ Leistukas - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Dydis - - - Multiple Displays - Keli ekranai - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Madinga veiksena - - - Efficient mode - Efektyvi veiksena - - - Mode - Veiksena - - - Top - Viršus - - - Bottom - Apačia - - - Left - Kairė - - - Right - Dešinė - - - Location - Vieta - - - Keep shown - - - - Keep hidden - Laikyti paslėptą - - - Smart hide - Išmaniai slėpti - - - Status - Būsena - - - Small - Mažas - - - Large - Didelis - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Nustatymai - PowerPlugin @@ -358,10 +300,6 @@ Power Energija - - Power settings - Energijos nustatymai - Capacity %1, %2 min remaining Talpa %1, liko %2 min. @@ -395,14 +333,6 @@ - - SettingsModule - - Dock - Dokas - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Energija - Shut down Išjungti @@ -452,6 +378,10 @@ Reboot Paleisti iš naujo + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Įrenginys + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Išvalyti + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_lv.ts b/translations/dde-dock_lv.ts new file mode 100644 index 000000000..2f5b44f79 --- /dev/null +++ b/translations/dde-dock_lv.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + Atcelt + + + Delete + Dzēst + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + Izslēgt + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + Izrakstīties + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + Miskaste + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_ml.ts b/translations/dde-dock_ml.ts index fca0deca7..3a56d3104 100644 --- a/translations/dde-dock_ml.ts +++ b/translations/dde-dock_ml.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + ബ്ലൂടൂത്ത് + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + ബ്ലൂടൂത്ത് + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + ബ്ലൂടൂത്ത് + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - അറിയാത്ത ഉപകരണം - - - Unknown volume - അറിയാത്ത വോള്യം - - - - DiskMountPlugin - - Disk - ഡിസ്ക് - - - Open - - - - Unmount all + Multi-Screen Collaboration - DockSettings + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + ലോഞ്ചർ + + + + MenuWorker Fashion Mode ഫാഷൻ രീതി @@ -143,17 +272,10 @@ അവസ്ഥ - Plugins + Dock settings - - LauncherItem - - Launcher - ലോഞ്ചർ - - MultitaskingPlugin @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - - PowerPlugin @@ -189,10 +300,6 @@ Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down നിർത്തുക - - Restart - - Suspend @@ -267,6 +374,14 @@ Power settings + + Reboot + + + + Plugged In + + SoundApplet @@ -274,9 +389,16 @@ Device ഉപകരണം + + + SoundDevicesWidget - Application - പ്രയോഗം + Output Device + + + + Sound settings + @@ -290,11 +412,11 @@ - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_mn.ts b/translations/dde-dock_mn.ts index 20866d697..bb82d3a8a 100644 --- a/translations/dde-dock_mn.ts +++ b/translations/dde-dock_mn.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ %1 нэмэлт нь үйлдэлийн үйлдэлийн системтэй нийцэхгүй байна. + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Блютүүт + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Блютүүт + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Блютүүт + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ Гарын байрлал нэмэх + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,31 +158,23 @@ Огноо - 12 Hour Time - 12 цагаар + 12-hour time + - 24 Hour Time - 24 цагаар + 24-hour time + - Time Settings - Цагны тохиргоо + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - Сүлжээг идэвхижүүлэх - - - Disable network - Сүлжээг идэвхгүй болгох - - - Network settings - Сүлээний тохиргоо + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Тодорхойгүй төхөөрөмж - - - Unknown volume - Тодорхойгүй дууны хэм + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Диск + Enabled + - Open - Нээх - - - Unmount all - Бүгдийг салгах + Disabled + - DockSettings + LauncherItem + + Launcher + Эхлүүлэгч + + + + MenuWorker Fashion Mode Загварлаг горим @@ -143,15 +272,8 @@ Төлөв - Plugins - Нэмэлтүүд - - - - LauncherItem - - Launcher - Эхлүүлэгч + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Сүлжээ - - OnboardPlugin Onboard Дэлгэцийн гар - - Settings - Тохиргоо - PowerPlugin @@ -189,10 +300,6 @@ Power Цэнэг - - Power settings - Цэнэгийн тохиргоо - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - %1 цэнэглэсэн - Charging %1, %2 min until full @@ -214,11 +317,19 @@ - Charging %1 .... + Capacity %1 - Charged + Charging %1 + %1 цэнэглэж байна + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -235,18 +346,10 @@ ShutdownPlugin - - Power - Цэнэг - Shut down Унтраах - - Restart - Дахин эхлүүлэх - Suspend Түр зогсоох @@ -271,6 +374,14 @@ Power settings Цэнэгийн тохиргоо + + Reboot + Дахин ачааллах + + + Plugged In + + SoundApplet @@ -278,9 +389,16 @@ Device Төхөөрөмж + + + SoundDevicesWidget - Application - Програм + Output Device + + + + Sound settings + @@ -294,12 +412,12 @@ Дуу хаах - Audio Settings - Дууны тохиргоо + Sound settings + - Current Volume %1 - Одоогийн дууны хэм %1 + Volume %1 + @@ -323,6 +441,10 @@ Trash - %1 files Хогийн сав - %1 файлтай + + Move to Trash + + TrashWidget @@ -336,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - Системийн тавиур - - - - WiredItem - - Unknown - Тодорхойгүй + Exit Safe Mode + - Wired connection: %1 - Утастай холболт: %1 - - - - WirelessItem - - No Network - Сүлжээ байхгүй + Dock - Safe Mode + - Wireless Connection: %1 - Утасгүй холболт: %1 - - - Connected but no Internet access - Холбогдсон боловч интернетэд холбогдоогүй байна - - - - WirelessList - - Wireless Network - Утасгүй сүлжээ - - - Wireless Network %1 - Утасгүй сүлжээ %1 + The Dock is in safe mode, please exit to show it properly + \ No newline at end of file diff --git a/translations/dde-dock_mr.ts b/translations/dde-dock_mr.ts new file mode 100644 index 000000000..a63512a74 --- /dev/null +++ b/translations/dde-dock_mr.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_ms.ts b/translations/dde-dock_ms.ts index dfabe794f..22a80857b 100644 --- a/translations/dde-dock_ms.ts +++ b/translations/dde-dock_ms.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Buang + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Dimatikan + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Tambah bentangan papan kekunci + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Tetapan waktu + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Peranti tidak diketahui - - - Unknown volume - Volum tidak diketahui + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Cakera + Enabled + - Open - Buka - - - Unmount all - Tanggalkan semua + Disabled + @@ -173,21 +221,6 @@ Pelancar - - MainWindow - - Exit Safe Mode - Keluar dari Mod Selamat - - - Dock - Safe Mode - Labuh - Mod Selamat - - - The Dock is in safe mode, please exit to show it properly - Labuh dalam mod selamat, sila keluar dahulu supaya dapat dipaparkan dengan baik - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Saiz - - - Multiple Displays - Paparan Berbilang - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Mod fesyen - - - Efficient mode - Mod efisyen - - - Mode - Mod - - - Top - Teratas - - - Bottom - Bawah - - - Left - Kiri - - - Right - Kanan - - - Location - Lokasi - - - Keep shown - - - - Keep hidden - Kekal tersembunyi - - - Smart hide - Sembunyi pintar - - - Status - Status - - - Small - Kecil - - - Large - Besar - - - Show Dock - - - - On screen where the cursor is - Atas skrin yang mana kursor berada - - - Only on main screen - Hanya dalam skrin utama - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Atas Papan - - Settings - Tetapan - PowerPlugin @@ -358,10 +300,6 @@ Power Kuasa - - Power settings - Tetapan kuasa - Capacity %1, %2 min remaining Kapasiti %1, %2 min berbaki @@ -395,14 +333,6 @@ Kapasiti %1, sepenuhnya dicas - - SettingsModule - - Dock - Labuh - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Kuasa - Shut down Matikan @@ -438,7 +364,7 @@ Log out - Daftar keluar + Daftar keluar Switch account @@ -452,6 +378,10 @@ Reboot But semula + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Peranti + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Kosong + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_nb.ts b/translations/dde-dock_nb.ts index 7861d9231..69d243d05 100644 --- a/translations/dde-dock_nb.ts +++ b/translations/dde-dock_nb.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ Plugin %1 er ikke kompatibel med systemet + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ Legg til tastaturlayout + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,31 +158,23 @@ Dato og tid - 12 Hour Time - 12 timers klokke + 12-hour time + - 24 Hour Time - 24 timers klokke + 24-hour time + - Time Settings - Tidsinnstillinger + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - Skru på nettverk - - - Disable network - Skru av nettverk - - - Network settings - Nettverksinnstillinger + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Ukjent enhet - - - Unknown volume - Ukjent volum + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - Åpne - - - Unmount all - Avmonter alle + Disabled + - DockSettings + LauncherItem + + Launcher + Starteren + + + + MenuWorker Fashion Mode Fashion Mode @@ -143,15 +272,8 @@ Status - Plugins - Utvidelser - - - - LauncherItem - - Launcher - Starteren + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Nettverk - - OnboardPlugin Onboard Ombord - - Settings - Instillinger - PowerPlugin @@ -189,10 +300,6 @@ Power Strøm - - Power settings - Strøminnstillinger - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - Ladet opp %1 - Charging %1, %2 min until full @@ -214,12 +317,20 @@ - Charging %1 .... + Capacity %1 - Charged - Endret + Charging %1 + Lader %1 + + + Capacity %1 ... + + + + Capacity %1, fully charged + @@ -235,25 +346,17 @@ ShutdownPlugin - - Power - Strøm - Shut down Slå av - - Restart - Restart - Suspend Suspendere Hibernate - Dvalemodus + Dvale Lock @@ -271,6 +374,14 @@ Power settings Strøminnstillinger + + Reboot + Omstart + + + Plugged In + + SoundApplet @@ -278,9 +389,16 @@ Device Enhet + + + SoundDevicesWidget - Application - Applikasjon + Output Device + + + + Sound settings + @@ -294,12 +412,12 @@ Demp - Audio Settings - Lydinnstillinger + Sound settings + - Current Volume %1 - Nåværende Volum %1 + Volume %1 + @@ -323,6 +441,10 @@ Trash - %1 files Søppel - %1 filer + + Move to Trash + Flytt til søpla + TrashWidget @@ -336,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - Oppgavelinje - - - - WiredItem - - Unknown - Ukjent + Exit Safe Mode + - Wired connection: %1 - Kablet tilkobling: %1 - - - - WirelessItem - - No Network - Ingen Nettverk + Dock - Safe Mode + - Wireless Connection: %1 - Trådløs Tilkobling: %1 - - - Connected but no Internet access - Tilkoblet men ingen tilgang til internett - - - - WirelessList - - Wireless Network - Trådløs Nettverk - - - Wireless Network %1 - Trådløst Nettverk: %1 + The Dock is in safe mode, please exit to show it properly + \ No newline at end of file diff --git a/translations/dde-dock_ne.ts b/translations/dde-dock_ne.ts index 179878caa..1c213262a 100644 --- a/translations/dde-dock_ne.ts +++ b/translations/dde-dock_ne.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ प्लगिन %1 प्रणाली मा समर्थित छैन + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + ब्लुटूथ + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + ब्लुटूथ + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ कीबोर्ड थप्नुहोस् + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -33,18 +171,10 @@ - DeviceItem + DevCollaborationWidget - Enable network - नेटवर्क सुचारु गर्नुहोस - - - Disable network - नेटवर्क निस्क्रिय - - - Network settings - नेटवर्क सेटिंग्स + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - अज्ञात उपकरण - - - Unknown volume - अज्ञात भण्डारण आयतन + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - भण्डारण + Enabled + - Open - खोल्नुहोस् - - - Unmount all - सबै निष्कासित गर्नुहोस् + Disabled + - DockSettings + LauncherItem + + Launcher + लन्चर + + + + MenuWorker Fashion Mode आधुनिक शैली @@ -143,15 +272,8 @@ स्थिती - Plugins - प्लगइनहरू - - - - LauncherItem - - Launcher - लन्चर + Dock settings + @@ -165,23 +287,12 @@ हटाउने - - NetworkPlugin - - Network - नेटवर्क - - OnboardPlugin Onboard अन-बोर्ड - - Settings - सेटिंग्स - PowerPlugin @@ -189,10 +300,6 @@ Power पावर - - Power settings - पावर सेटिङहरू - Capacity %1, %2 min remaining क्षमता %1, %2मिनट बाँकी @@ -209,10 +316,6 @@ Charging %1, %2 hr %3 min until full %1 मा चार्ज हुंदै, पुर्ण हुन %2 घण्टा %3 मिनट लाग्छ - - Charged - - Capacity %1 @@ -243,10 +346,6 @@ ShutdownPlugin - - Power - पावर - Shut down बन्द गर्नुहोस् @@ -279,6 +378,10 @@ Reboot रिबुट गर्नुहोस् + + Plugged In + + SoundApplet @@ -286,9 +389,16 @@ Device उपकरण + + + SoundDevicesWidget - Application - Application + Output Device + + + + Sound settings + @@ -331,6 +441,10 @@ Trash - %1 files रद्दीटोकरी -% 1 फाइलहरू + + Move to Trash + + TrashWidget @@ -344,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - प्रणाली ट्रे - - - - WiredItem - - Unknown - अज्ञात - - - Wired connection: %1 - तारको जडान:% 1 - - - - WirelessItem - - No Network - नेटवर्क छैन - - - Connected but no Internet access + Exit Safe Mode - Wireless connection: %1 + Dock - Safe Mode - - - WirelessList - Wireless Network - वायरलेस नेटवर्क - - - Wireless Network %1 - वायरलेस नेटवर्क% 1 + The Dock is in safe mode, please exit to show it properly + \ No newline at end of file diff --git a/translations/dde-dock_nl.ts b/translations/dde-dock_nl.ts index 09054ccb9..b11972674 100644 --- a/translations/dde-dock_nl.ts +++ b/translations/dde-dock_nl.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Verwijderen + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Uitgeschakeld + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Toetsenbordindeling toevoegen + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Tijdinstellingen + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Onbekend apparaat - - - Unknown volume - Onbekende schijf + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Schijf + Enabled + - Open - Openen - - - Unmount all - Alles ontkoppelen + Disabled + @@ -173,21 +221,6 @@ Programmastarter - - MainWindow - - Exit Safe Mode - Veilige modus afsluiten - - - Dock - Safe Mode - Dock - Veilige modus - - - The Dock is in safe mode, please exit to show it properly - Het dock draait in de veilige modus. Sluit af om het dock correct te tonen. - - MenuWorker @@ -243,93 +276,6 @@ Dockinstellingen - - ModuleWidget - - Size - Grootte - - - Multiple Displays - Meerdere beeldschermen - - - Plugin Area - Invoegtoepassingsgebied - - - Select which icons appear in the Dock - Geef aan welke pictogrammen moeten worden getoond op het dock - - - Fashion mode - Moderne modus - - - Efficient mode - Efficiënte modus - - - Mode - Modus - - - Top - Bovenaan - - - Bottom - Onderaan - - - Left - Links - - - Right - Rechts - - - Location - Locatie - - - Keep shown - Altijd tonen - - - Keep hidden - Altijd verbergen - - - Smart hide - Slim verbergen - - - Status - Status - - - Small - Klein - - - Large - Groot - - - Show Dock - Dock tonen - - - On screen where the cursor is - Op het scherm waar de cursor is - - - Only on main screen - Alleen op hoofdscherm - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Instellingen - PowerPlugin @@ -358,10 +300,6 @@ Power Energie - - Power settings - Energie-instellingen - Capacity %1, %2 min remaining Capaciteit: %1 - %2 min resterend @@ -395,14 +333,6 @@ Capaciteit: %1 - volledig opgeladen - - SettingsModule - - Dock - Vastmaken - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Energie - Shut down Afsluiten @@ -452,6 +378,10 @@ Reboot Herstarten + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Apparaat + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -513,7 +454,22 @@ Empty - Leeg + Legen + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + \ No newline at end of file diff --git a/translations/dde-dock_pa.ts b/translations/dde-dock_pa.ts index b0db1435b..cea5d04b0 100644 --- a/translations/dde-dock_pa.ts +++ b/translations/dde-dock_pa.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + ਬਲੂਟੁੱਥ + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + ਬਲੂਟੁੱਥ + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,31 +158,23 @@ ਤਾਰੀਖ ਸਮਾਂ - 12 Hour Time - 12 ਘੰਟਿਆਂ ਵਾਲਾ ਵੇਲਾ + 12-hour time + - 24 Hour Time - 24 ਘੰਟਿਆਂ ਵਾਲਾ ਵੇਲਾ + 24-hour time + - Time Settings - ਸਮਾਂ ਸੈਟਿੰਗਾਂ + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - ਨੈੱਟਵਰਕ ਸਮਰੱਥ ਕਰੋ - - - Disable network - ਨੈੱਟਵਰਕ ਅਸਮਰੱਥ ਕਰੋ - - - Network settings - ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk - ਡਿਸਕ + Enabled + - Open - ਖੋਲ੍ਹੋ - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + ਲਾਂਚਰ + + + + MenuWorker Fashion Mode @@ -143,17 +272,10 @@ - Plugins + Dock settings - - LauncherItem - - Launcher - ਲਾਂਚਰ - - MultitaskingPlugin @@ -165,33 +287,18 @@ - - NetworkPlugin - - Network - ਨੈੱਟਵਰਕ - - OnboardPlugin Onboard ਆਨ-ਬੋਰਡ - - Settings - ਸੈਟਿੰਗਾਂ - PowerPlugin Power - ਪਾਵਰ - - - Power settings - ਪਾਵਰ ਸੈਟਿੰਗਾਂ + ਊਰਜਾ Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - ਪਾਵਰ - Shut down ਬੰਦ ਕਰੋ - - Restart - ਮੁੜ-ਚਾਲੂ ਕਰੋ - Suspend ਸਸਪੈਂਡ ਕਰੋ @@ -253,11 +360,11 @@ Lock - ਤਾਲਾਬੰਦ + ਲਾਕ ਕਰੋ Log out - ਲਾਗ ਆਉਟ + ਲਾਗ ਆਉਟ ਕਰੋ Switch account @@ -267,6 +374,14 @@ Power settings ਪਾਵਰ ਸੈਟਿੰਗਾਂ + + Reboot + ਮੁੜ-ਚਾਲੂ ਕਰੋ + + + Plugged In + + SoundApplet @@ -274,9 +389,16 @@ Device ਡਿਵਾਈਸ + + + SoundDevicesWidget - Application - ਐਪਲੀਕੇਸ਼ਨ + Output Device + + + + Sound settings + @@ -290,11 +412,11 @@ - Audio Settings - ਆਡੀਓ ਸੈਟਿੰਗਾਂ + Sound settings + - Current Volume %1 + Volume %1 @@ -302,7 +424,7 @@ SoundPlugin Sound - + ਆਵਾਜ਼ @@ -319,12 +441,16 @@ Trash - %1 files + + Move to Trash + + TrashWidget Open - + ਖੋਲ੍ਹੋ Empty @@ -332,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - ਸਿਸਟਮ ਟਰੇ - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - ਤਾਰਾ ਵਾਲਾ ਕਨੈਕਸ਼ਨ: %1 - - - - WirelessItem - - No Network - ਕੋਈ ਨੈੱਟਵਰਕ ਨਹੀਂ ਹੈ - - - Wireless Connection: %1 - ਬੇਤਾਰ ਕਨੈਕਸ਼ਨ: %1 - - - Connected but no Internet access + Dock - Safe Mode - - - WirelessList - Wireless Network - ਬੇਤਾਰ ਨੈੱਟਵਰਕ - - - Wireless Network %1 - ਬੇਤਾਰ ਨੈੱਟਵਰਕ: %1 + The Dock is in safe mode, please exit to show it properly + \ No newline at end of file diff --git a/translations/dde-dock_pam.ts b/translations/dde-dock_pam.ts index 258667c99..e40188c82 100644 --- a/translations/dde-dock_pam.ts +++ b/translations/dde-dock_pam.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk + Enabled - Open - Ibuklat - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + + + + + MenuWorker Fashion Mode @@ -143,14 +272,7 @@ - Plugins - - - - - LauncherItem - - Launcher + Dock settings @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - - PowerPlugin @@ -189,10 +300,6 @@ Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down - - Restart - - Suspend @@ -267,6 +374,14 @@ Power settings + + Reboot + + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ I-mute - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_pl.ts b/translations/dde-dock_pl.ts index 3dc81e4d0..e518bdb40 100644 --- a/translations/dde-dock_pl.ts +++ b/translations/dde-dock_pl.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Usuń + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Wyłączony + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Dodaj układ klawiatury + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,11 +170,18 @@ Ustawienia czasu + + DevCollaborationWidget + + PC collaboration + + + DialogManager Are you sure you want to empty %1 items? - Czy na pewno chcesz trwale usunąć %1 przedmiotów? + Czy na pewno chcesz usunąć permanentnie %1 przedmiotów? Cancel @@ -141,51 +197,28 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Nieznane urządzenie - - - Unknown volume - Nieznany wolumin + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Dysk + Enabled + - Open - Otwórz - - - Unmount all - Odmontuj wszystkie + Disabled + LauncherItem Launcher - Launcher - - - - MainWindow - - Exit Safe Mode - Wyjdź z trybu bezpiecznego - - - Dock - Safe Mode - Dok - Tryb bezpieczny - - - The Dock is in safe mode, please exit to show it properly - Dok jest w trybie bezpiecznym, wyjdź z niego aby wyświetlić go poprawnie + Program wywołujący @@ -208,11 +241,11 @@ Left - Do lewej + Lewo Right - Do prawej + Prawo Keep Shown @@ -234,100 +267,13 @@ Location Położenie - - Status - Stan - - - Dock settings - Ustawienia doka - - - - ModuleWidget - - Size - Rozmiar - - - Multiple Displays - Wiele ekranów - - - Plugin Area - Strefa wtyczek - - - Select which icons appear in the Dock - Wybierz, które wtyczki pojawią się w doku - - - Fashion mode - Tryb modny - - - Efficient mode - Tryb wydajny - - - Mode - Tryb - - - Top - Góra - - - Bottom - Dół - - - Left - Lewo - - - Right - Prawo - - - Location - Położenie - - - Keep shown - Zawsze wyświetlaj - - - Keep hidden - Zawsze ukrywaj - - - Smart hide - Inteligentne ukrywanie - Status Status - Small - Mały - - - Large - Ogromny - - - Show Dock - Pokaż dok - - - On screen where the cursor is - Na ekranie, tam gdzie jest kursor - - - Only on main screen - Tylko na ekranie głównym + Dock settings + Ustawienia doku @@ -347,10 +293,6 @@ Onboard Klawiatura ekranowa - - Settings - Ustawienia - PowerPlugin @@ -358,10 +300,6 @@ Power Zasilanie - - Power settings - Ustawienia zasilania - Capacity %1, %2 min remaining Poziom: %1, pozostało: %2min @@ -395,14 +333,6 @@ Pojemność %1, w pełni naładowana - - SettingsModule - - Dock - Dok - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Zasilanie - Shut down Wyłącz @@ -450,7 +376,11 @@ Reboot - Uruchom ponownie + Uruchomienie ponowne + + + Plugged In + @@ -460,6 +390,17 @@ Urządzenie + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Opróżnij + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_ps.ts b/translations/dde-dock_ps.ts new file mode 100644 index 000000000..4d1a72a12 --- /dev/null +++ b/translations/dde-dock_ps.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_pt.ts b/translations/dde-dock_pt.ts index 28204e646..4959d68c1 100644 --- a/translations/dde-dock_pt.ts +++ b/translations/dde-dock_pt.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Modo Avião ativado Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Modo Avião desativado @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Remover + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Desligado + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Adicionar esquema de teclado + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Definições horárias + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Dispositivo desconhecido - - - Unknown volume - Volume desconhecido + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disco + Enabled + - Open - Abrir - - - Unmount all - Desmontar tudo + Disabled + @@ -173,21 +221,6 @@ Lançador - - MainWindow - - Exit Safe Mode - Sair do Modo Seguro - - - Dock - Safe Mode - Doca - Modo Seguro - - - The Dock is in safe mode, please exit to show it properly - A Doca está em modo seguro, saia para a mostrar corretamente - - MenuWorker @@ -243,93 +276,6 @@ Definições da doca - - ModuleWidget - - Size - Tamanho - - - Multiple Displays - Vários ecrãs - - - Plugin Area - Área de plugins - - - Select which icons appear in the Dock - Selecione quais os ícones que aparecem na Doca - - - Fashion mode - Modo Elegante - - - Efficient mode - Modo eficiente - - - Mode - Modo - - - Top - Superior - - - Bottom - Inferior - - - Left - Esquerda - - - Right - Direita - - - Location - Localização - - - Keep shown - Manter visível - - - Keep hidden - Manter ocultada - - - Smart hide - Ocultação inteligente - - - Status - Estado - - - Small - Pequeno - - - Large - Grande - - - Show Dock - Mostrar Doca - - - On screen where the cursor is - No ecrã onde está o cursor - - - Only on main screen - Apenas no ecrã principal - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Definições - PowerPlugin @@ -358,10 +300,6 @@ Power Energia - - Power settings - Definições de energia - Capacity %1, %2 min remaining Capacidade %1, %2 min restantes @@ -395,14 +333,6 @@ Capacidade 1%, totalmente carregada - - SettingsModule - - Dock - Doca - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Energia - Shut down Encerrar @@ -452,6 +378,10 @@ Reboot Reiniciar + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Dispositivo + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Esvaziar + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_pt_BR.ts b/translations/dde-dock_pt_BR.ts index 2e40cf36c..6175122fa 100644 --- a/translations/dde-dock_pt_BR.ts +++ b/translations/dde-dock_pt_BR.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Modo avião ativado Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Modo avião desativado @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Remover + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -69,7 +80,7 @@ Bluetooth settings - Configurações de Bluetooth + Configurações do Bluetooth %1 connected @@ -88,18 +99,56 @@ Desativado + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors Add keyboard layout - Adicionar o layout de teclado + Adicionar layout de teclado + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + @@ -118,7 +167,14 @@ Time settings - Configurações de Data e Hora + Configurações de data e hora + + + + DevCollaborationWidget + + PC collaboration + @@ -137,33 +193,25 @@ This action cannot be restored - Esta ação não pode ser desfeita + Esta ação não pode ser revertida - DiskControlItem + DisplaySettingWidget - Unknown device - Dispositivo desconhecido - - - Unknown volume - Volume desconhecido + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Dispositivos + Enabled + - Open - Abrir - - - Unmount all - Desmontar todos + Disabled + @@ -173,21 +221,6 @@ Lançador - - MainWindow - - Exit Safe Mode - Sair do Modo de Segurança - - - Dock - Safe Mode - Dock - Modo de Segurança - - - The Dock is in safe mode, please exit to show it properly - A Dock está em modo de segurança; saia para exibi-lo corretamente - - MenuWorker @@ -243,93 +276,6 @@ Configurações da Dock - - ModuleWidget - - Size - Tamanho - - - Multiple Displays - Múltiplas telas - - - Plugin Area - Área de plugins - - - Select which icons appear in the Dock - Selecione quais ícones aparecem na Dock - - - Fashion mode - Modo Fashion - - - Efficient mode - Modo Eficiente - - - Mode - Modo - - - Top - Superior - - - Bottom - Inferior - - - Left - Esquerda - - - Right - Direita - - - Location - Local - - - Keep shown - Manter exibindo - - - Keep hidden - Manter oculta - - - Smart hide - Ocultar inteligente - - - Status - Estado - - - Small - Pequeno - - - Large - Grande - - - Show Dock - Exibir Dock - - - On screen where the cursor is - Na tela onde está o cursor - - - Only on main screen - Apenas na tela principal - - MultitaskingPlugin @@ -338,18 +284,14 @@ Undock - Remover da Dock + Remover da dock OnboardPlugin Onboard - Teclado Virtual - - - Settings - Configurações + Teclado virtual @@ -358,10 +300,6 @@ Power Energia - - Power settings - Configurações de energia - Capacity %1, %2 min remaining %1 Carregado - %2m restantes @@ -395,14 +333,6 @@ %1 Carregado - Bateria Cheia - - SettingsModule - - Dock - Dock - /personalization/Dock - - ShowDesktopPlugin @@ -411,15 +341,11 @@ Undock - Remover da Dock + Remover da dock ShutdownPlugin - - Power - Energia - Shut down Desligar @@ -438,7 +364,7 @@ Log out - Encerrar sessão + Sair Switch account @@ -452,6 +378,10 @@ Reboot Reiniciar + + Plugged In + + SoundApplet @@ -460,11 +390,22 @@ Dispositivo + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem Unmute - Com Áudio + Com áudio Mute @@ -472,7 +413,7 @@ Sound settings - Configurações de Som + Configurações de som Volume %1 @@ -516,4 +457,19 @@ Esvaziar + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_ro.ts b/translations/dde-dock_ro.ts index 129288c65..35851daa5 100644 --- a/translations/dde-dock_ro.ts +++ b/translations/dde-dock_ro.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Elimină + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Oprit + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Adăugare aspect tastatură + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Configurări pentru timp + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Dispozitiv necunoscut - - - Unknown volume - Volum necunoscut + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disc + Enabled + - Open - Deschide - - - Unmount all - Demontați-le pe toate + Disabled + @@ -173,21 +221,6 @@ Lansator - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Dimensiune - - - Multiple Displays - Afișaje multiple - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Mod fashion - - - Efficient mode - Mod eficient - - - Mode - Mod - - - Top - Sus - - - Bottom - Jos - - - Left - Stânga - - - Right - Dreapta - - - Location - Locație - - - Keep shown - - - - Keep hidden - Păstraţi ascuns - - - Smart hide - Ascundere inteligentă - - - Status - Stare - - - Small - Mic - - - Large - Mare - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard La bord - - Settings - Setări - PowerPlugin @@ -358,10 +300,6 @@ Power Energie - - Power settings - Setări pentru administrare de energie - Capacity %1, %2 min remaining Capacitate %1, %2 Min rămase @@ -395,14 +333,6 @@ Capacitate %1, complet încărcat - - SettingsModule - - Dock - Dock - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Energie - Shut down Închidere @@ -452,6 +378,10 @@ Reboot Repornire + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Dispozitiv + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Gol + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_ru.ts b/translations/dde-dock_ru.ts index 25dc38e99..9e23e0051 100644 --- a/translations/dde-dock_ru.ts +++ b/translations/dde-dock_ru.ts @@ -10,14 +10,14 @@ AirplaneModeApplet Airplane Mode - + Авиарежим AirplaneModeItem Airplane mode enabled - + Авиарежим включён Turn off @@ -29,25 +29,36 @@ Airplane Mode settings - + Настройки Авиарежима Airplane mode disabled - + Авиарежим выключен AirplaneModePlugin Airplane Mode + Авиарежим + + + + AppMultiItem + + Open - AppDragWidget + BloothAdapterWidget - Remove - Удалить + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Выключен + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Добавить раскладку клавиатуры + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Настройки времени + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,51 +197,28 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Неизвестное устройство - - - Unknown volume - Неизвестный объем + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Диск + Enabled + - Open - Открыть - - - Unmount all - Отмонтировать все + Disabled + LauncherItem Launcher - Выбор Программ - - - - MainWindow - - Exit Safe Mode - Выйти из Безопасного Режима - - - Dock - Safe Mode - Dock - Безопасный Режим - - - The Dock is in safe mode, please exit to show it properly - Dock находится в безопасном режиме, пожалуйста, выйдите, чтобы показать ее нормально + Запуск программ @@ -240,95 +273,7 @@ Dock settings - - - - - ModuleWidget - - Size - Размер - - - Multiple Displays - Несколько Дисплеев - - - Plugin Area - Область Плагина - - - Select which icons appear in the Dock - Выбрать значки появляющиеся в Dock - - - Fashion mode - Стильный режим - - - Efficient mode - Эффективный режим - - - Mode - Режим - - - Top - На верху - - - Bottom - Внизу - - - Left - Слева - - - - Right - Справа - - - Location - Расположение - - - Keep shown - Отображать - - - Keep hidden - Скрывать - - - Smart hide - Умное скрытие - - - Status - Статус - - - Small - Маленький - - - Large - Большой - - - Show Dock - Показывать Dock - - - On screen where the cursor is - На экране, где располагается курсор - - - Only on main screen - Только на главном экране + Настройки Dock @@ -348,10 +293,6 @@ Onboard Экранная Клавиатура - - Settings - Настройки - PowerPlugin @@ -359,10 +300,6 @@ Power Питание - - Power settings - Параметры питания - Capacity %1, %2 min remaining Емкость %1, %2 мин. осталось @@ -396,14 +333,6 @@ Заряд %1, полностью заряжен - - SettingsModule - - Dock - Dock - /personalization/Dock - - ShowDesktopPlugin @@ -417,10 +346,6 @@ ShutdownPlugin - - Power - Питание - Shut down Выключить @@ -431,7 +356,7 @@ Hibernate - Спящий Режим + Спящий режим Lock @@ -453,6 +378,10 @@ Reboot Перезагрузить + + Plugged In + + SoundApplet @@ -461,6 +390,17 @@ Устройство + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -517,4 +457,19 @@ Очистить + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_sc.ts b/translations/dde-dock_sc.ts new file mode 100644 index 000000000..067498af7 --- /dev/null +++ b/translations/dde-dock_sc.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_si.ts b/translations/dde-dock_si.ts index 8c37a61bf..f475774c9 100644 --- a/translations/dde-dock_si.ts +++ b/translations/dde-dock_si.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -7,9 +7,57 @@ - AppDragWidget + AirplaneModeApplet - Remove + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + වසා දමන්න + + + Turn on + ක්‍රියාත්මක කරන්න + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices @@ -51,12 +99,35 @@ වසා දමා ඇත + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth බ්ලූටූත් + + Turn on + + + + Turn off + + DBusAdaptors @@ -65,6 +136,21 @@ යතුරුපුවරු පිරිසැලසුම එක් කරන්න + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -84,6 +170,13 @@ වේලා සැකසුම් + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -104,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - හඳුනානොගත් උපකරණය - - - Unknown volume - හදුනානොගත් කාණ්ඩයකි + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - ඩිස්කය + Enabled + - Open - විවෘත කරන්න - - - Unmount all - සියල්ල ගලවන්න + Disabled + @@ -136,21 +221,6 @@ රදවනය - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -202,19 +272,7 @@ තත්ත්වය - Plugins - ආධාරක යෙදවුම් - - - Only on main screen - - - - On screen where the cursor is - - - - Show the Dock + Dock settings @@ -235,10 +293,6 @@ Onboard පවතින - - Settings - සැකසුම් - PowerPlugin @@ -246,10 +300,6 @@ Power බලය - - Power settings - බල සැකසුම් - Capacity %1, %2 min remaining ධාරිතාව %1, මිනිත්තු %2 ක් ඉතිරි වී ඇත @@ -296,10 +346,6 @@ ShutdownPlugin - - Power - බලය - Shut down වසා දමන්න @@ -332,6 +378,10 @@ Reboot පද්ධතිය නැවත අරඹන්න + + Plugged In + + SoundApplet @@ -340,6 +390,17 @@ උපාංගය + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -396,4 +457,19 @@ හිස් + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_sk.ts b/translations/dde-dock_sk.ts index 1725e084a..0e2ca8585 100644 --- a/translations/dde-dock_sk.ts +++ b/translations/dde-dock_sk.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -7,9 +7,57 @@ - AppDragWidget + AirplaneModeApplet - Remove + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices @@ -51,12 +99,35 @@ + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -65,6 +136,21 @@ Pridať rozloženie klávesnice + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -84,6 +170,13 @@ Nastavenia času + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -104,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Neznáme zariadenie - - - Unknown volume - Neznámy zväzok + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - Otvoriť - - - Unmount all - Odpojiť všetko + Disabled + @@ -136,21 +221,6 @@ Spúšťač - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -202,19 +272,7 @@ Stav - Plugins - Pluginy - - - Only on main screen - - - - On screen where the cursor is - - - - Show the Dock + Dock settings @@ -235,10 +293,6 @@ Onboard Onboard - - Settings - Nastavenia - PowerPlugin @@ -246,10 +300,6 @@ Power Napájanie - - Power settings - Nastavenia napájania - Capacity %1, %2 min remaining Nabíjanie %1, zostávajú %2 min @@ -296,10 +346,6 @@ ShutdownPlugin - - Power - Napájanie - Shut down Vypnúť @@ -332,6 +378,10 @@ Reboot Reštart + + Plugged In + + SoundApplet @@ -340,6 +390,17 @@ Zariadenie + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -396,4 +457,19 @@ Vysypať + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_sl.ts b/translations/dde-dock_sl.ts index c512161da..a7e1ddff9 100644 --- a/translations/dde-dock_sl.ts +++ b/translations/dde-dock_sl.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Odstrani + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Izklopljen + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Dodaj razpored tipk + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Nastavitve časa + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -129,7 +185,7 @@ Cancel - Prekliči + Prekini Delete @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Neznana naprava - - - Unknown volume - Neznan prostor + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - Odpri - - - Unmount all - Odklopi vse + Disabled + @@ -173,21 +221,6 @@ Zaganjalnik - - MainWindow - - Exit Safe Mode - Zapri varni način - - - Dock - Safe Mode - Varni način sidrišča - - - The Dock is in safe mode, please exit to show it properly - Sidrišče deluje v varnem načinu. Izhod za pravilen prikaz - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Velikost - - - Multiple Displays - Več zaslonov - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - - - - Efficient mode - - - - Mode - Način - - - Top - Vrh - - - Bottom - Dno - - - Left - Levo - - - Right - Desno - - - Location - Položaj - - - Keep shown - - - - Keep hidden - - - - Smart hide - - - - Status - Status - - - Small - Majhno - - - Large - Veliko - - - Show Dock - - - - On screen where the cursor is - Na zaslonu s kurzorjem - - - Only on main screen - Zgolj na glavnem zaslonu - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Na plošči - - Settings - Nastavitve - PowerPlugin @@ -358,10 +300,6 @@ Power Napajanje - - Power settings - Nastavitve energijske porabe - Capacity %1, %2 min remaining Zmogljivost %1 za %2 min @@ -395,14 +333,6 @@ Zmogljivost %1 - polno - - SettingsModule - - Dock - Zasidraj - /personalization/Dock - - ShowDesktopPlugin @@ -416,13 +346,9 @@ ShutdownPlugin - - Power - Napajanje - Shut down - Zaustavitev sistema + zaustavitev sistema Suspend @@ -430,7 +356,7 @@ Hibernate - Spanje + spanje Lock @@ -438,7 +364,7 @@ Log out - Izpis + Odjava Switch account @@ -452,6 +378,10 @@ Reboot Ponovni zagon + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Naprava + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Prazno + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_sq.ts b/translations/dde-dock_sq.ts index eed03e9e6..33b5dde0f 100644 --- a/translations/dde-dock_sq.ts +++ b/translations/dde-dock_sq.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Hiqe + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ I çaktivizuar + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Shtoni skemë tastiere + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Rregullime kohe + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Pajisje e panjohur - - - Unknown volume - Vëllim i panjohur + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - Hap - - - Unmount all - Çmontoji krejt + Disabled + @@ -173,21 +221,6 @@ Nisës - - MainWindow - - Exit Safe Mode - Dil nga Mënyra e Parrezik - - - Dock - Safe Mode - Panel - Mënyra e Parrezik - - - The Dock is in safe mode, please exit to show it properly - Paneli gjendet nën Mënyrën e Parrezik, ju lutemi, dilni prej saj, që të shfaqet si duhet - - MenuWorker @@ -243,93 +276,6 @@ Rregullime paneli - - ModuleWidget - - Size - Madhësi - - - Multiple Displays - Shumë Ekrane - - - Plugin Area - Zonë Shtojcash - - - Select which icons appear in the Dock - Përzgjidhni cilat ikona shfaqen te Paneli - - - Fashion mode - Mënyra modë - - - Efficient mode - Mënyra efikasitet - - - Mode - Mënyrë - - - Top - Në Krye - - - Bottom - Në Fund - - - Left - Majtas - - - Right - Djathtas - - - Location - Vendndodhje - - - Keep shown - Mbaje të shfaqur - - - Keep hidden - Mbaje të fshehur - - - Smart hide - Fshehje e mençur - - - Status - Gjendje - - - Small - I vogël - - - Large - I madh - - - Show Dock - Shfaqe Panelin - - - On screen where the cursor is - Në ekranin ku është kursori - - - Only on main screen - Vetëm në ekranin kryesor - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Rregullime - PowerPlugin @@ -358,10 +300,6 @@ Power Energji - - Power settings - Rregullime energjie - Capacity %1, %2 min remaining Kapacitet %1, edhe %2 min @@ -376,7 +314,7 @@ Charging %1, %2 hr %3 min until full - Po ngarkohet %1, edhe %2 hr e %3 min deri sa të jetë plot + Po ngarkohet %1, edhe %2 hr e 3% min deri sa të jetë plot Capacity %1 @@ -395,14 +333,6 @@ Kapacitet 1%, plotësisht e ngarkuar - - SettingsModule - - Dock - Panel - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Energji - Shut down Fike @@ -442,7 +368,7 @@ Switch account - Këmbeni llogari + Ndërroni llogari Power settings @@ -452,6 +378,10 @@ Reboot Rinisu + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Pajisje + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -509,11 +450,26 @@ TrashWidget Open - Hap + Hape Empty E zbrazët + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_sr.ts b/translations/dde-dock_sr.ts index 523e7d86f..a3fbd5e86 100644 --- a/translations/dde-dock_sr.ts +++ b/translations/dde-dock_sr.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Уклони + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Искључен + + BluetoothMainWidget + + Bluetooth + Блутут + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Блутут + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Додај распоред тастатуре + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Подешавање времена + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,51 +197,28 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Непознат уређај - - - Unknown volume - Непознат систем + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Диск + Enabled + - Open - Покрени - - - Unmount all - Демонтирај све + Disabled + LauncherItem Launcher - Покретач Програма - - - - MainWindow - - Exit Safe Mode - Изађи из безбедног режима - - - Dock - Safe Mode - Док - Безбедни режим - - - The Dock is in safe mode, please exit to show it properly - Док је у безбедном режиму, изађите за нормалан приказ + Покретач програма @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Величина - - - Multiple Displays - Вишеструки прикази - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - - - - Efficient mode - - - - Mode - Режим - - - Top - Врх - - - Bottom - Дно - - - Left - Лево - - - Right - Десно - - - Location - Позиција - - - Keep shown - - - - Keep hidden - - - - Smart hide - - - - Status - Стање - - - Small - Мала - - - Large - Велика - - - Show Dock - - - - On screen where the cursor is - На екрану где је показивач - - - Only on main screen - Само на главном екрану - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Онборд - - Settings - Подeшавања - PowerPlugin @@ -358,10 +300,6 @@ Power Напајање - - Power settings - Управљање напајањем - Capacity %1, %2 min remaining Ниво %1, %2 мин преостало @@ -395,14 +333,6 @@ Ниво %1, напуњено - - SettingsModule - - Dock - Закачи - /personalization/Dock - - ShowDesktopPlugin @@ -416,13 +346,9 @@ ShutdownPlugin - - Power - Напајање - Shut down - Искључи + Искључивање Suspend @@ -452,6 +378,10 @@ Reboot Поново покрени + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Уређај + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Испразни + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_sv.ts b/translations/dde-dock_sv.ts index 768a1288b..4b0a55e9b 100644 --- a/translations/dde-dock_sv.ts +++ b/translations/dde-dock_sv.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ Plugin %1 är ej kompatibelt med systemet + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + Bluetooth + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ Lägg till tangentbordslayout + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -33,18 +171,10 @@ - DeviceItem + DevCollaborationWidget - Enable network - Aktivera nätverk - - - Disable network - Inaktivera nätverk - - - Network settings - Nätverks inställingar + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Okänd enhet - - - Unknown volume - Okänd volym + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Hårddisk + Enabled + - Open - Öppna - - - Unmount all - Avmontera alla + Disabled + - DockSettings + LauncherItem + + Launcher + Launcher + + + + MenuWorker Fashion Mode Mode läge @@ -143,15 +272,8 @@ Status - Plugins - Plugin - - - - LauncherItem - - Launcher - Launcher + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Nätverk - - OnboardPlugin Onboard Virtuellt - - Settings - Inställningar - PowerPlugin @@ -189,10 +300,6 @@ Power Stäng av - - Power settings - Ströminställningar - Capacity %1, %2 min remaining Kapacitet %1, %2 min kvarstår @@ -209,10 +316,6 @@ Charging %1, %2 hr %3 min until full Laddar %1, %2 hr %3 min tills fulladdad - - Charged - - Capacity %1 @@ -243,10 +346,6 @@ ShutdownPlugin - - Power - Stäng av - Shut down Stäng av @@ -279,6 +378,10 @@ Reboot Starta om + + Plugged In + + SoundApplet @@ -286,9 +389,16 @@ Device Enhet + + + SoundDevicesWidget - Application - Applikation + Output Device + + + + Sound settings + @@ -331,6 +441,10 @@ Trash - %1 files Skräp %1 filer + + Move to Trash + Flytta till Papperskorg + TrashWidget @@ -344,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - Systemfält - - - - WiredItem - - Unknown - Okänd + Exit Safe Mode + - Wired connection: %1 - Trådanslutning: %1 - - - - WirelessItem - - No Network - Inga nätverk + Dock - Safe Mode + - Connected but no Internet access - Uppkopplad men ingen internet åtkomst - - - Wireless connection: %1 + The Dock is in safe mode, please exit to show it properly - - WirelessList - - Wireless Network - Trådlöst nätverk - - - Wireless Network %1 - Trådlöst nätverk %1 - - \ No newline at end of file diff --git a/translations/dde-dock_sw.ts b/translations/dde-dock_sw.ts index cbb80ed82..50caa55e6 100644 --- a/translations/dde-dock_sw.ts +++ b/translations/dde-dock_sw.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ Ongeza mpangilio ya kibodi + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,31 +158,23 @@ Tarehe na saa - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings - Sifa za saa + Time settings + - DeviceItem + DevCollaborationWidget - Enable network - Wezesha mtandao - - - Disable network - Lemaza mtandao - - - Network settings - Sifa ya mtandao + PC collaboration + @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Kifaa haijulikana - - - Unknown volume - Sauti haijulikana + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Diski + Enabled + - Open - Fungua - - - Unmount all - Pungua yote + Disabled + - DockSettings + LauncherItem + + Launcher + Kizinduzi + + + + MenuWorker Fashion Mode Hali urembo @@ -143,15 +272,8 @@ Hadhi - Plugins - Kijenzi ya maziada - - - - LauncherItem - - Launcher - Kizindua + Dock settings + @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - Mtandao - - OnboardPlugin Onboard Ndani ya - - Settings - Sifa - PowerPlugin @@ -189,10 +300,6 @@ Power Kiwashio - - Power settings - Sifa za kiwashio - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,11 +317,19 @@ - Charging %1 .... + Capacity %1 - Charged + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -235,18 +346,10 @@ ShutdownPlugin - - Power - Kiwashio - Shut down Zima - - Restart - Washa upya - Suspend Ahirisha @@ -271,6 +374,14 @@ Power settings Sifa za kiwashio + + Reboot + Washa upya + + + Plugged In + + SoundApplet @@ -278,9 +389,16 @@ Device Kifaa + + + SoundDevicesWidget - Application - Programu + Output Device + + + + Sound settings + @@ -294,12 +412,12 @@ Zima sauti - Audio Settings - Sifa za sauti + Sound settings + - Current Volume %1 - Sasa, sauti ni %1 + Volume %1 + @@ -323,6 +441,10 @@ Trash - %1 files Taka - 1% faili + + Move to Trash + + TrashWidget @@ -336,47 +458,18 @@ - TrayPlugin + WindowManager - System Tray - Debe ya mfumo - - - - WiredItem - - Unknown - Haijulikana + Exit Safe Mode + - Wired connection: %1 - Muunganisho wa kebo: 1% - - - - WirelessItem - - No Network - Hakuna mtandao + Dock - Safe Mode + - Wireless Connection: %1 - Muunganisho bila kabo: %1 - - - Connected but no Internet access - Imebandikiwa, lakini haiko muunganisho wa wavuti - - - - WirelessList - - Wireless Network - Mtandao wa muunganisho bila kabo - - - Wireless Network %1 - Mtandao wa muunganisho bila kabo %1 + The Dock is in safe mode, please exit to show it properly + \ No newline at end of file diff --git a/translations/dde-dock_ta.ts b/translations/dde-dock_ta.ts index ff3b84961..24b54a786 100644 --- a/translations/dde-dock_ta.ts +++ b/translations/dde-dock_ta.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + புளூடூத் + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + புளூடூத் + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + புளூடூத் + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ விசைப்பலகை அமைப்பைச் சேர்க்கவும் + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk - வட்டு + Enabled + - Open - திற - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + துவக்கி + + + + MenuWorker Fashion Mode @@ -143,17 +272,10 @@ - Plugins + Dock settings - - LauncherItem - - Launcher - துவக்கி - - MultitaskingPlugin @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - பிணையம் - - OnboardPlugin Onboard - - Settings - அமைவுகள் - PowerPlugin @@ -189,10 +300,6 @@ Power மின்திறன் - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - மின்திறன் - Shut down நிறுத்து - - Restart - மறுதொடக்கம் - Suspend தற்காலிகமாக நிறுத்தம் செய்தல் @@ -267,6 +374,14 @@ Power settings + + Reboot + மறுதொடக்கம் + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device கருவி + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ ஒலியடக்கு - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown - தெரியாத - - - Wired connection: %1 - - - - - WirelessItem - - No Network + Exit Safe Mode - Wireless Connection: %1 + Dock - Safe Mode - Connected but no Internet access - - - - - WirelessList - - Wireless Network - கம்பியில்லா இணையம் - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_te.ts b/translations/dde-dock_te.ts new file mode 100644 index 000000000..8361bfc74 --- /dev/null +++ b/translations/dde-dock_te.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_th.ts b/translations/dde-dock_th.ts new file mode 100644 index 000000000..21aafe582 --- /dev/null +++ b/translations/dde-dock_th.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + บลูทูธ + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + บลูทูธ + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + ยกเลิก + + + Delete + ลบ + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + พลังงาน + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + ปิดเครื่อง + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + รีบูต + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + เสียง + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_tr.ts b/translations/dde-dock_tr.ts index 1451ddbc4..ead460b92 100644 --- a/translations/dde-dock_tr.ts +++ b/translations/dde-dock_tr.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - + Uçak modu etkin Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - + Uçak modu devre dışı @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Kaldır + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Kapat + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Klavye düzeni ekle + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Zaman ayarları + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Bilinmeyen aygıt - - - Unknown volume - Bilinmeyen birim + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Disk + Enabled + - Open - - - - Unmount all - Tüm bağı kaldır + Disabled + @@ -173,21 +221,6 @@ Başlatıcı - - MainWindow - - Exit Safe Mode - Güvenli Kipten Çık - - - Dock - Safe Mode - Rıhtım - Güvenli Kip - - - The Dock is in safe mode, please exit to show it properly - Rıhtım güvenli kipte, düzgün şekilde göstermek için lütfen çıkın - - MenuWorker @@ -243,93 +276,6 @@ Rıhtım ayarları - - ModuleWidget - - Size - Boyut - - - Multiple Displays - Çoklu Ekran - - - Plugin Area - Eklenti Alanı - - - Select which icons appear in the Dock - Rıhtım'da hangi simgelerin görüneceğini seçin - - - Fashion mode - Moda Kip - - - Efficient mode - Verimli Kip - - - Mode - Kip - - - Top - Üst - - - Bottom - Alt - - - Left - Sol - - - Right - Sağ - - - Location - Konum - - - Keep shown - Gösterilmeyi sürdür - - - Keep hidden - Gizli tut - - - Smart hide - Akıll gizle - - - Status - Durum - - - Small - Küçük - - - Large - Büyük - - - Show Dock - Rıhtımı Göster - - - On screen where the cursor is - İmlecin bulunduğu ekranda - - - Only on main screen - Sadece ana ekranda - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Ekran Klavyesi - - Settings - Ayarlar - PowerPlugin @@ -358,10 +300,6 @@ Power Güç - - Power settings - Güç ayarları - Capacity %1, %2 min remaining %1 ve azalıyor, %2 dakika kaldı @@ -376,7 +314,7 @@ Charging %1, %2 hr %3 min until full - %1 ve doluyor, tam dolmaya %2 saat %3 dakika kaldı + %1 doluyor, doluma %2 saat %3 dakika var Capacity %1 @@ -395,14 +333,6 @@ Kapasite %1, tam şarjlı - - SettingsModule - - Dock - Rıhtım - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Güç - Shut down Kapat @@ -452,6 +378,10 @@ Reboot Yeniden başlat + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Aygıt + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Boşalt + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_tzm.ts b/translations/dde-dock_tzm.ts new file mode 100644 index 000000000..6918231e5 --- /dev/null +++ b/translations/dde-dock_tzm.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + Tisɣal n ublutut + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + Tisɣal n ublutut + + + %1 connected + + + + Connecting... + Azday... + + + Bluetooth + Ablutut + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + Ablutut + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + Tisɣal n wakud + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + Sser + + + Delete + Kkes + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + Ssexsi + + + Suspend + + + + Hibernate + + + + Lock + Rgel + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + Imesli + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + Ṛẓem + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_ug.ts b/translations/dde-dock_ug.ts index 0c731cbc8..672b51eab 100644 --- a/translations/dde-dock_ug.ts +++ b/translations/dde-dock_ug.ts @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - چىقىرىۋېتىش + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ كۆكچىشنى تاقاش + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth كۆكچىش + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ كۇنۇپكا تاختىسى ئورۇنلاشتۇرۇلۇشى قوشۇش + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ ۋاقىت تەڭشىكى + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - نامەلۇم ئۈسكۈنە - - - Unknown volume - سىغىمى نامەلۇم + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - دېسكا + Enabled + - Open - ئوچۇق - - - Unmount all - ھەممىنى ئۆچۈرۈش + Disabled + @@ -173,21 +221,6 @@ ئۈستەليۈزى قوزغاتقۇچ - - MainWindow - - Exit Safe Mode - بىخەتەر ھالەتتىن چېكىنىش - - - Dock - Safe Mode - ۋەزىپە ئىستونى بىخەتەرلىك ھالىتى - - - The Dock is in safe mode, please exit to show it properly - ۋەزىپە ئىستونى بىخەتەر ھالەتكە كىردى، چېكىنگەندىن كېيىن نورمال كۆرۈنىدۇ - - MenuWorker @@ -243,93 +276,6 @@ ۋەزىپە ئىستونى تەڭشىكى - - ModuleWidget - - Size - چوڭلۇقى - - - Multiple Displays - كۆپ ئېكرانلىق كۆرسىتىش تەڭشىكى - - - Plugin Area - قىستۇرما رايونى - - - Select which icons appear in the Dock - ۋەزىپە ئىستونى قىستۇرما رايونىدا كۆرسىتىلىدىغان سىنبەلگىنى تاللاڭ - - - Fashion mode - مودا ھالەت - - - Efficient mode - يۇقىرى ئۈنۈملۈك ھالەت - - - Mode - ھالىتى - - - Top - ئۈستى - - - Bottom - ئاستى - - - Left - سول - - - Right - ئوڭ - - - Location - ئورنى - - - Keep shown - داۋاملىق كۆرسىتىش - - - Keep hidden - داۋاملىق يوشۇرۇش - - - Smart hide - ئەقلىي يوشۇرۇش - - - Status - ھالىتى - - - Small - كىچىك - - - Large - چوڭ - - - Show Dock - ۋەزىپە ئىستونىنىڭ ئورنى - - - On screen where the cursor is - مائۇسنىڭ ئورنىغا ئەگىشىپ كۆرۈنسۇن - - - Only on main screen - ئاساسىي ئېكراندىلا كۆرۈنسۇن - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard ئېكران كۇنۇپكىسى - - Settings - تەڭشەك - PowerPlugin @@ -358,10 +300,6 @@ Power توك مەنبە - - Power settings - باتارىيە تەڭشىكى - Capacity %1, %2 min remaining توك %1 قالدى، %2 مىنۇت يېتىدۇ @@ -395,14 +333,6 @@ توك%1، توشتى - - SettingsModule - - Dock - ۋەزىپە ئىستونى - /personalization/Dock - - ShowDesktopPlugin @@ -411,15 +341,11 @@ Undock - تۇرغۇنلارنى چىقىرىۋېتىش + چىقىرىۋېتىش ShutdownPlugin - - Power - توك مەنبە - Shut down تاقاش @@ -452,6 +378,10 @@ Reboot قايتا قوزغىتىش + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ ئۈسكۈنە + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ قۇرۇق + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_uk.ts b/translations/dde-dock_uk.ts index 86326f6fd..3dfda71c3 100644 --- a/translations/dde-dock_uk.ts +++ b/translations/dde-dock_uk.ts @@ -3,7 +3,7 @@ AbstractPluginsController The plugin %1 is not compatible with the system. - Плагін %1 не сумісний із системою. + Додаток %1 не сумісний із системою. @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - Видалити + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + @@ -88,12 +99,35 @@ Вимкнено + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Додати розкладку клавіатури + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Параметри часу + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -133,7 +189,7 @@ Delete - Видалити + Вилучити This action cannot be restored @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Невідомий пристрій - - - Unknown volume - Невідомий том + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Диск + Enabled + - Open - Відкрити - - - Unmount all - Відмонтувати все + Disabled + @@ -173,21 +221,6 @@ Запускач - - MainWindow - - Exit Safe Mode - Вийти з безпечного режиму - - - Dock - Safe Mode - Док-станція — безпечний режим - - - The Dock is in safe mode, please exit to show it properly - Док-станція перебуває у безпечному режимі — будь ласка, вийдіть з нього для належного показу - - MenuWorker @@ -243,93 +276,6 @@ Параметри бічної панелі - - ModuleWidget - - Size - Розмір - - - Multiple Displays - Кілька дисплеїв - - - Plugin Area - Область додатків - - - Select which icons appear in the Dock - Виберіть, які піктограми буде показано на бічній панелі - - - Fashion mode - Модний режим - - - Efficient mode - Ефективний режим - - - Mode - Режим - - - Top - Вгорі - - - Bottom - Внизу - - - Left - Ліворуч - - - Right - Праворуч - - - Location - Розташування - - - Keep shown - Показувати постійно - - - Keep hidden - Залишати прихованим - - - Smart hide - Розумне приховування - - - Status - Стан - - - Small - Малий - - - Large - Великий - - - Show Dock - Показувати панель - - - On screen where the cursor is - На екрані, де перебуває вказівник - - - Only on main screen - Лише на головному екрані - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Клавіатура - - Settings - Налаштування - PowerPlugin @@ -358,10 +300,6 @@ Power Живлення - - Power settings - Параметри живлення - Capacity %1, %2 min remaining Батарея %1, %2 хв залишилося @@ -395,14 +333,6 @@ Ємність %1, повністю заряджено - - SettingsModule - - Dock - Панель - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Живлення - Shut down Вимкнути @@ -452,6 +378,10 @@ Reboot Перезавантажити + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Пристрій + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Пусто + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_ur.ts b/translations/dde-dock_ur.ts index c1e56552c..2eb27cc9e 100644 --- a/translations/dde-dock_ur.ts +++ b/translations/dde-dock_ur.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -6,6 +6,129 @@ + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + DBusAdaptors @@ -13,6 +136,21 @@ + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -20,30 +158,22 @@ - 12 Hour Time + 12-hour time - 24 Hour Time + 24-hour time - Time Settings + Time settings - DeviceItem + DevCollaborationWidget - Enable network - - - - Disable network - - - - Network settings + PC collaboration @@ -67,33 +197,32 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - - - - Unknown volume + Multi-Screen Collaboration - DiskMountPlugin + HomeMonitorPlugin - Disk + Enabled - Open - - - - Unmount all + Disabled - DockSettings + LauncherItem + + Launcher + + + + + MenuWorker Fashion Mode @@ -143,14 +272,7 @@ - Plugins - - - - - LauncherItem - - Launcher + Dock settings @@ -165,23 +287,12 @@ - - NetworkPlugin - - Network - - - OnboardPlugin Onboard - - Settings - - PowerPlugin @@ -189,10 +300,6 @@ Power - - Power settings - - Capacity %1, %2 min remaining @@ -201,10 +308,6 @@ Capacity %1, %2 hr %3 min remaining - - Charged %1 - - Charging %1, %2 min until full @@ -214,7 +317,19 @@ - Charging %1 .... + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged @@ -231,18 +346,10 @@ ShutdownPlugin - - Power - - Shut down شٹڈاون - - Restart - ریسٹارٹ - Suspend @@ -267,6 +374,14 @@ Power settings + + Reboot + + + + Plugged In + + SoundApplet @@ -274,8 +389,15 @@ Device + + + SoundDevicesWidget - Application + Output Device + + + + Sound settings @@ -290,11 +412,11 @@ - Audio Settings + Sound settings - Current Volume %1 + Volume %1 @@ -319,6 +441,10 @@ Trash - %1 files + + Move to Trash + + TrashWidget @@ -332,46 +458,17 @@ - TrayPlugin + WindowManager - System Tray - - - - - WiredItem - - Unknown + Exit Safe Mode - Wired connection: %1 - - - - - WirelessItem - - No Network + Dock - Safe Mode - Wireless Connection: %1 - - - - Connected but no Internet access - - - - - WirelessList - - Wireless Network - - - - Wireless Network %1 + The Dock is in safe mode, please exit to show it properly diff --git a/translations/dde-dock_uz.ts b/translations/dde-dock_uz.ts new file mode 100644 index 000000000..44f82725d --- /dev/null +++ b/translations/dde-dock_uz.ts @@ -0,0 +1,475 @@ + + + AbstractPluginsController + + The plugin %1 is not compatible with the system. + + + + + AirplaneModeApplet + + Airplane Mode + + + + + AirplaneModeItem + + Airplane mode enabled + + + + Turn off + + + + Turn on + + + + Airplane Mode settings + + + + Airplane mode disabled + + + + + AirplaneModePlugin + + Airplane Mode + + + + + AppMultiItem + + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices + + + + + BluetoothApplet + + Bluetooth settings + + + + + BluetoothItem + + Turn off + + + + Turn on + + + + Bluetooth settings + + + + %1 connected + + + + Connecting... + + + + Bluetooth + + + + Turned off + + + + + BluetoothMainWidget + + Bluetooth + + + + Turn on + + + + Turn off + + + + + BluetoothPlugin + + Bluetooth + + + + Turn on + + + + Turn off + + + + + DBusAdaptors + + Add keyboard layout + + + + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DatetimePlugin + + Datetime + + + + 12-hour time + + + + 24-hour time + + + + Time settings + + + + + DevCollaborationWidget + + PC collaboration + + + + + DialogManager + + Are you sure you want to empty %1 items? + + + + Cancel + + + + Delete + + + + This action cannot be restored + + + + + DisplaySettingWidget + + Multi-Screen Collaboration + + + + + HomeMonitorPlugin + + Enabled + + + + Disabled + + + + + LauncherItem + + Launcher + + + + + MenuWorker + + Fashion Mode + + + + Efficient Mode + + + + Top + + + + Bottom + + + + Left + + + + Right + + + + Keep Shown + + + + Keep Hidden + + + + Smart Hide + + + + Mode + + + + Location + + + + Status + + + + Dock settings + + + + + MultitaskingPlugin + + Multitasking View + + + + Undock + + + + + OnboardPlugin + + Onboard + + + + + PowerPlugin + + Power + + + + Capacity %1, %2 min remaining + + + + Capacity %1, %2 hr %3 min remaining + + + + Charging %1, %2 min until full + + + + Charging %1, %2 hr %3 min until full + + + + Capacity %1 + + + + Charging %1 + + + + Capacity %1 ... + + + + Capacity %1, fully charged + + + + + ShowDesktopPlugin + + Show Desktop + + + + Undock + + + + + ShutdownPlugin + + Shut down + + + + Suspend + + + + Hibernate + + + + Lock + + + + Log out + + + + Switch account + + + + Power settings + + + + Reboot + + + + Plugged In + + + + + SoundApplet + + Device + + + + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + + + SoundItem + + Unmute + + + + Mute + + + + Sound settings + + + + Volume %1 + + + + + SoundPlugin + + Sound + + + + + TrashPlugin + + Trash + + + + Trash - %1 file + + + + Trash - %1 files + + + + Move to Trash + + + + + TrashWidget + + Open + + + + Empty + + + + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + + \ No newline at end of file diff --git a/translations/dde-dock_vi.ts b/translations/dde-dock_vi.ts index d90a79294..4ff7f60bd 100644 --- a/translations/dde-dock_vi.ts +++ b/translations/dde-dock_vi.ts @@ -44,9 +44,20 @@ - AppDragWidget + AppMultiItem - Remove + Open + + + + + BloothAdapterWidget + + My Devices + + + + Other Devices @@ -88,12 +99,35 @@ Đã tắt + + BluetoothMainWidget + + Bluetooth + Bluetooth + + + Turn on + + + + Turn off + + + BluetoothPlugin Bluetooth Bluetooth + + Turn on + + + + Turn off + + DBusAdaptors @@ -102,6 +136,21 @@ Thêm bố cục bàn phím + + DateTimeDisplayer + + 12-hour time + + + + 24-hour time + + + + Time settings + + + DatetimePlugin @@ -121,6 +170,13 @@ Cài đặt thời gian + + DevCollaborationWidget + + PC collaboration + + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - Thiết bị không xác định - - - Unknown volume - Âm lượng không xác định + Multi-Screen Collaboration + - DiskMountPlugin + HomeMonitorPlugin - Disk - Đĩa + Enabled + - Open - Mở - - - Unmount all - Tháo tất cả + Disabled + @@ -173,21 +221,6 @@ Khởi chạy - - MainWindow - - Exit Safe Mode - - - - Dock - Safe Mode - - - - The Dock is in safe mode, please exit to show it properly - - - MenuWorker @@ -243,93 +276,6 @@ - - ModuleWidget - - Size - Kích thước - - - Multiple Displays - Nhiều màn hình - - - Plugin Area - - - - Select which icons appear in the Dock - - - - Fashion mode - Dạng thời trang - - - Efficient mode - Dạng hiệu quả - - - Mode - Chế độ - - - Top - Trên đỉnh - - - Bottom - Dưới đáy - - - Left - Trái - - - Right - Phải - - - Location - Nơi chốn - - - Keep shown - - - - Keep hidden - Tiếp tục ẩn - - - Smart hide - Ẩn thông minh - - - Status - Tình trạng - - - Small - Nhỏ - - - Large - Lớn - - - Show Dock - - - - On screen where the cursor is - - - - Only on main screen - - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard Onboard - - Settings - Cài đặt - PowerPlugin @@ -358,10 +300,6 @@ Power Năng lượng - - Power settings - Thiết lập năng lượng - Capacity %1, %2 min remaining Năng lượng %1, %2 còn lại @@ -395,14 +333,6 @@ Công suất 1%, sạc đã đầy - - SettingsModule - - Dock - Dock - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - Năng lượng - Shut down Tắt máy @@ -452,6 +378,10 @@ Reboot Khởi động lại + + Plugged In + + SoundApplet @@ -460,6 +390,17 @@ Thiết bị + + SoundDevicesWidget + + Output Device + + + + Sound settings + + + SoundItem @@ -516,4 +457,19 @@ Làm sạch + + WindowManager + + Exit Safe Mode + + + + Dock - Safe Mode + + + + The Dock is in safe mode, please exit to show it properly + + + \ No newline at end of file diff --git a/translations/dde-dock_zh_CN.ts b/translations/dde-dock_zh_CN.ts index 43c76baa3..ecc48d5fc 100644 --- a/translations/dde-dock_zh_CN.ts +++ b/translations/dde-dock_zh_CN.ts @@ -1,4 +1,4 @@ - + AbstractPluginsController @@ -44,10 +44,21 @@ - AppDragWidget + AppMultiItem - Remove - 移除 + Open + 打开 + + + + BloothAdapterWidget + + My Devices + 我的设备 + + + Other Devices + 其他设备 @@ -88,12 +99,35 @@ 蓝牙关闭 + + BluetoothMainWidget + + Bluetooth + 蓝牙 + + + Turn on + 开启 + + + Turn off + 关闭 + + BluetoothPlugin Bluetooth 蓝牙 + + Turn on + 开启 + + + Turn off + 关闭 + DBusAdaptors @@ -102,6 +136,21 @@ 添加键盘布局 + + DateTimeDisplayer + + 12-hour time + 12小时制 + + + 24-hour time + 24小时制 + + + Time settings + 时间设置 + + DatetimePlugin @@ -121,6 +170,13 @@ 时间设置 + + DevCollaborationWidget + + PC collaboration + 电脑协同 + + DialogManager @@ -141,29 +197,21 @@ - DiskControlItem + DisplaySettingWidget - Unknown device - 未知的设备 - - - Unknown volume - 容量未知 + Multi-Screen Collaboration + 电脑协同设置 - DiskMountPlugin + HomeMonitorPlugin - Disk - 磁盘 + Enabled + 启用 - Open - 打开 - - - Unmount all - 卸载全部 + Disabled + 已禁用 @@ -173,21 +221,6 @@ 启动器 - - MainWindow - - Exit Safe Mode - 退出安全模式 - - - Dock - Safe Mode - 任务栏安全模式 - - - The Dock is in safe mode, please exit to show it properly - 任务栏已进入安全模式,退出安全模式后即可正常显示 - - MenuWorker @@ -243,93 +276,6 @@ 任务栏设置 - - ModuleWidget - - Size - 大小 - - - Multiple Displays - 多屏显示设置 - - - Plugin Area - 插件区域 - - - Select which icons appear in the Dock - 选择显示在任务栏插件区域的图标 - - - Fashion mode - 时尚模式 - - - Efficient mode - 高效模式 - - - Mode - 模式 - - - Top - - - - Bottom - - - - Left - - - - Right - - - - Location - 位置 - - - Keep shown - 一直显示 - - - Keep hidden - 一直隐藏 - - - Smart hide - 智能隐藏 - - - Status - 状态 - - - Small - - - - Large - - - - Show Dock - 任务栏位置 - - - On screen where the cursor is - 跟随鼠标位置显示 - - - Only on main screen - 仅主屏显示 - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard 屏幕键盘 - - Settings - 设置 - PowerPlugin @@ -358,10 +300,6 @@ Power 电源 - - Power settings - 电源设置 - Capacity %1, %2 min remaining 电量%1,剩余%2分钟 @@ -395,14 +333,6 @@ 电量%1,已充满 - - SettingsModule - - Dock - 任务栏 - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - 电源 - Shut down 关机 @@ -452,6 +378,10 @@ Reboot 重启 + + Plugged In + 使用电源 + SoundApplet @@ -460,6 +390,17 @@ 设备 + + SoundDevicesWidget + + Output Device + 输出设备 + + + Sound settings + 音量设置 + + SoundItem @@ -516,4 +457,19 @@ 清空 + + WindowManager + + Exit Safe Mode + 退出安全模式 + + + Dock - Safe Mode + 任务栏安全模式 + + + The Dock is in safe mode, please exit to show it properly + 任务栏已进入安全模式,退出安全模式后即可正常显示 + + \ No newline at end of file diff --git a/translations/dde-dock_zh_HK.ts b/translations/dde-dock_zh_HK.ts index a736e82e0..309a2b66d 100644 --- a/translations/dde-dock_zh_HK.ts +++ b/translations/dde-dock_zh_HK.ts @@ -44,17 +44,28 @@ - AppDragWidget + AppMultiItem - Remove - 移除 + Open + 打開 + + + + BloothAdapterWidget + + My Devices + 我的設備 + + + Other Devices + 其他設備 BluetoothApplet Bluetooth settings - 藍牙設置 + 藍牙設定 @@ -69,11 +80,11 @@ Bluetooth settings - 藍牙設置 + 藍牙設定 %1 connected - 已連接%1 + %1 已連接 Connecting... @@ -88,12 +99,35 @@ 藍牙關閉 + + BluetoothMainWidget + + Bluetooth + 藍牙 + + + Turn on + 開啟 + + + Turn off + 關閉 + + BluetoothPlugin Bluetooth 藍牙 + + Turn on + 開啟 + + + Turn off + 關閉 + DBusAdaptors @@ -102,6 +136,21 @@ 添加鍵盤佈局 + + DateTimeDisplayer + + 12-hour time + 12小時制 + + + 24-hour time + 24小時制 + + + Time settings + 時間設定 + + DatetimePlugin @@ -118,7 +167,14 @@ Time settings - 時間設置 + 時間設定 + + + + DevCollaborationWidget + + PC collaboration + 電腦協同 @@ -137,33 +193,25 @@ This action cannot be restored - 這個動作不可復原 + 此操作不可恢復 - DiskControlItem + DisplaySettingWidget - Unknown device - 未知的設備 - - - Unknown volume - 容量未知 + Multi-Screen Collaboration + 電腦協同設置 - DiskMountPlugin + HomeMonitorPlugin - Disk - 磁碟 + Enabled + 啟用 - Open - 打開 - - - Unmount all - 卸載全部 + Disabled + 已禁用 @@ -173,21 +221,6 @@ 啟動器 - - MainWindow - - Exit Safe Mode - 退出安全模式 - - - Dock - Safe Mode - 任務欄安全模式 - - - The Dock is in safe mode, please exit to show it properly - 任務欄已進入安全模式,退出安全模式後即可正常顯示 - - MenuWorker @@ -200,11 +233,11 @@ Top - + Bottom - + Left @@ -243,93 +276,6 @@ 任務欄設置 - - ModuleWidget - - Size - 大小 - - - Multiple Displays - 多屏顯示設置 - - - Plugin Area - 插件區域 - - - Select which icons appear in the Dock - 選擇顯示在任務欄插件區域的圖標 - - - Fashion mode - 時尚模式 - - - Efficient mode - 高效模式 - - - Mode - 模式 - - - Top - - - - Bottom - - - - Left - - - - Right - - - - Location - 位置 - - - Keep shown - 一直顯示 - - - Keep hidden - 一直隱藏 - - - Smart hide - 智能隱藏 - - - Status - 狀態 - - - Small - - - - Large - - - - Show Dock - 任務欄位置 - - - On screen where the cursor is - 跟隨鼠標位置顯示 - - - Only on main screen - 僅主屏顯示 - - MultitaskingPlugin @@ -347,10 +293,6 @@ Onboard 螢幕鍵盤 - - Settings - 設置 - PowerPlugin @@ -358,10 +300,6 @@ Power 電源 - - Power settings - 電源設置 - Capacity %1, %2 min remaining 電量%1,剩餘%2分鐘 @@ -380,7 +318,7 @@ Capacity %1 - 電量 %1 + 電量%1 Charging %1 @@ -395,14 +333,6 @@ 電量%1,已充滿 - - SettingsModule - - Dock - 任務欄 - /personalization/Dock - - ShowDesktopPlugin @@ -416,10 +346,6 @@ ShutdownPlugin - - Power - 電源 - Shut down 關機 @@ -450,14 +376,29 @@ Reboot - 重新啟動 + 重啟 + + + Plugged In + 使用電源 SoundApplet Device - 裝置 + 設備 + + + + SoundDevicesWidget + + Output Device + 輸出設備 + + + Sound settings + 音量設定 @@ -472,7 +413,7 @@ Sound settings - 音量設置 + 音量設定 Volume %1 @@ -502,7 +443,7 @@ Move to Trash - 移動到回收站 + 移至回收站 @@ -516,4 +457,19 @@ 清空 + + WindowManager + + Exit Safe Mode + 退出安全模式 + + + Dock - Safe Mode + 任務欄安全模式 + + + The Dock is in safe mode, please exit to show it properly + 任務欄已進入安全模式,退出安全模式後即可正常顯示 + + \ No newline at end of file diff --git a/translations/dde-dock_zh_TW.ts b/translations/dde-dock_zh_TW.ts index 47352dda8..f22c70ea1 100644 --- a/translations/dde-dock_zh_TW.ts +++ b/translations/dde-dock_zh_TW.ts @@ -3,21 +3,21 @@ AbstractPluginsController The plugin %1 is not compatible with the system. - %1 外掛程式不相容此系統。 + 外掛程式%1和系統版本不相容。 AirplaneModeApplet Airplane Mode - 飛航模式 + 飛行模式 AirplaneModeItem Airplane mode enabled - 飛航模式開啟 + 飛行模式開啟 Turn off @@ -29,25 +29,36 @@ Airplane Mode settings - 飛航模式設定 + 飛行模式設定 Airplane mode disabled - 飛航模式關閉 + 飛行模式關閉 AirplaneModePlugin Airplane Mode - 飛航模式 + 飛行模式 - AppDragWidget + AppMultiItem - Remove - 移除 + Open + 打開 + + + + BloothAdapterWidget + + My Devices + 我的裝置 + + + Other Devices + 其他裝置 @@ -73,7 +84,7 @@ %1 connected - 已連接%1 + %1 已連接 Connecting... @@ -88,44 +99,89 @@ 藍牙關閉 + + BluetoothMainWidget + + Bluetooth + 藍牙 + + + Turn on + 開啟 + + + Turn off + 關閉 + + BluetoothPlugin Bluetooth 藍牙 + + Turn on + 開啟 + + + Turn off + 關閉 + DBusAdaptors Add keyboard layout - 新增鍵盤配置 + 添加鍵盤布局 - DatetimePlugin - - Datetime - 日期時間 - + DateTimeDisplayer 12-hour time - 12 小時制 + 12小時制 24-hour time - 24 小時制 + 24小時制 Time settings 時間設定 + + DatetimePlugin + + Datetime + 時間 + + + 12-hour time + 12小時制 + + + 24-hour time + 24小時制 + + + Time settings + 時間設定 + + + + DevCollaborationWidget + + PC collaboration + 電腦協同 + + DialogManager Are you sure you want to empty %1 items? - 確定清空 %1 個項目? + 您確定要清空回收站裡的%1項內容嗎? Cancel @@ -137,33 +193,25 @@ This action cannot be restored - 此動作無法復原 + 此操作不可復原 - DiskControlItem + DisplaySettingWidget - Unknown device - 未知裝置 - - - Unknown volume - 未知磁碟區 + Multi-Screen Collaboration + 電腦協同設定 - DiskMountPlugin + HomeMonitorPlugin - Disk - 磁碟 + Enabled + 啟用 - Open - 開啟 - - - Unmount all - 全部卸載 + Disabled + 已禁用 @@ -173,21 +221,6 @@ 啟動器 - - MainWindow - - Exit Safe Mode - 退出安全模式 - - - Dock - Safe Mode - 任務欄安全模式 - - - The Dock is in safe mode, please exit to show it properly - 任務欄已進入安全模式,退出安全模式後即可正常顯示 - - MenuWorker @@ -200,27 +233,27 @@ Top - 頂部 + Bottom - 底部 + Left - 左側 + Right - 右側 + Keep Shown - 永遠顯示 + 一直顯示 Keep Hidden - 永遠隱藏 + 一直隱藏 Smart Hide @@ -243,93 +276,6 @@ 任務欄設定 - - ModuleWidget - - Size - 大小 - - - Multiple Displays - 多屏顯示設定 - - - Plugin Area - 外掛程式區域 - - - Select which icons appear in the Dock - 選擇顯示在任務欄外掛程式區域的圖示 - - - Fashion mode - 時尚模式 - - - Efficient mode - 高效模式 - - - Mode - 模式 - - - Top - 頂部 - - - Bottom - 底部 - - - Left - 左側 - - - Right - 右側 - - - Location - 位置 - - - Keep shown - 永遠顯示 - - - Keep hidden - 永遠隱藏 - - - Smart hide - 智慧隱藏 - - - Status - 狀態 - - - Small - - - - Large - - - - Show Dock - 任務欄位置 - - - On screen where the cursor is - 跟隨滑鼠位置顯示 - - - Only on main screen - 僅主屏顯示 - - MultitaskingPlugin @@ -338,7 +284,7 @@ Undock - 解除駐停 + 移除駐留 @@ -347,10 +293,6 @@ Onboard 螢幕鍵盤 - - Settings - 設定 - PowerPlugin @@ -358,33 +300,29 @@ Power 電源 - - Power settings - 電源設定 - Capacity %1, %2 min remaining - 電量 %1,剩餘 %2 分鐘 + 電量%1,剩餘%2分鐘 Capacity %1, %2 hr %3 min remaining - 電量 %1,剩餘 %2 小時 %3 分鐘 + 電量%1,剩餘%2小時%3分鐘 Charging %1, %2 min until full - 正在充電 %1,距離完成尚餘 %2 分鐘 + 正在充電%1,還需%2分鐘 Charging %1, %2 hr %3 min until full - 正在充電 %1,距離完成尚餘 %2 小時 %3 分鐘 + 正在充電%1,還需%2小時%3分鐘 Capacity %1 - 電量 %1 + 電量%1 Charging %1 - %1 正在充電 + 正在充電%1 Capacity %1 ... @@ -395,14 +333,6 @@ 電量%1,已充滿 - - SettingsModule - - Dock - 任務欄 - /personalization/Dock - - ShowDesktopPlugin @@ -411,15 +341,11 @@ Undock - 解除駐停 + 移除駐留 ShutdownPlugin - - Power - 電源 - Shut down 關機 @@ -438,7 +364,7 @@ Log out - 登出 + 註銷 Switch account @@ -450,7 +376,11 @@ Reboot - 重新啟動 + 重啟 + + + Plugged In + 使用電源 @@ -460,6 +390,17 @@ 裝置 + + SoundDevicesWidget + + Output Device + 輸出裝置 + + + Sound settings + 音量設定 + + SoundItem @@ -472,11 +413,11 @@ Sound settings - 音效設定 + 音量設定 Volume %1 - 音量 %1 + 目前音量 %1 @@ -490,30 +431,45 @@ TrashPlugin Trash - 回收桶 + 回收站 Trash - %1 file - 回收桶-%1 個檔案 + 回收站 - %1個文件 Trash - %1 files - 回收桶-%1 個檔案 + 回收站 - %1個文件 Move to Trash - 移動到回收站 + 移至回收站 TrashWidget Open - 開啟 + 打開 Empty 清空 + + WindowManager + + Exit Safe Mode + 退出安全模式 + + + Dock - Safe Mode + 任務欄安全模式 + + + The Dock is in safe mode, please exit to show it properly + 任務欄已進入安全模式,退出安全模式後即可正常顯示 + + \ No newline at end of file From 7a8016abe5ba524934c61b0fea5e707d23eafea4 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 15 Dec 2022 11:59:19 +0800 Subject: [PATCH 204/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E5=88=86=E8=BE=A8=E7=8E=87=E5=BF=AB=E6=8D=B7=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、高缩放率下,图标尺寸需要除以缩放率 2、拖动快捷面板图标到任务栏的时候,设置拖动图标 Log: 修复高分辨率快捷面板显示异常的问题 Influence: 高分辨率,任务栏快捷面板,观察全局搜索图标显示 Bug: https://pms.uniontech.com/bug-view-176421.html Change-Id: Iddd5dfc6851a9d8a3f35be10cdfa780c11862a4c --- frame/drag/quickdragcore.cpp | 7 ++++--- frame/item/components/singlequickitem.cpp | 2 +- frame/pluginadapter/pluginadapter.cpp | 2 +- frame/window/quickpluginwindow.cpp | 8 +++++++- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/frame/drag/quickdragcore.cpp b/frame/drag/quickdragcore.cpp index d4325f57c..e1298f400 100644 --- a/frame/drag/quickdragcore.cpp +++ b/frame/drag/quickdragcore.cpp @@ -9,6 +9,7 @@ #include #include #include +#include QuickPluginMimeData::QuickPluginMimeData(PluginsItemInterface *item, QDrag *drag) : QMimeData() @@ -46,7 +47,7 @@ QuickIconDrag::QuickIconDrag(QObject *dragSource, const QPixmap &pixmap) connect(m_timer, &QTimer::timeout, this, &QuickIconDrag::onDragMove); m_timer->start(); - m_imageWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); + m_imageWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowDoesNotAcceptFocus); m_imageWidget->setAttribute(Qt::WA_TransparentForMouseEvents); m_imageWidget->installEventFilter(this); useSourcePixmap(); @@ -64,7 +65,7 @@ void QuickIconDrag::updatePixmap(QPixmap pixmap) m_pixmap = pixmap; m_useSourcePixmap = false; - m_imageWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); + m_imageWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowDoesNotAcceptFocus | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); m_imageWidget->setFixedSize(pixmap.size()); m_imageWidget->show(); m_imageWidget->raise(); @@ -74,7 +75,7 @@ void QuickIconDrag::updatePixmap(QPixmap pixmap) void QuickIconDrag::useSourcePixmap() { m_useSourcePixmap = true; - m_imageWidget->setFixedSize(m_sourcePixmap.size()); + m_imageWidget->setFixedSize(m_sourcePixmap.size() / qApp->devicePixelRatio()); m_imageWidget->show(); m_imageWidget->raise(); m_imageWidget->update(); diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp index 695adf347..b75d66525 100644 --- a/frame/item/components/singlequickitem.cpp +++ b/frame/item/components/singlequickitem.cpp @@ -134,7 +134,7 @@ QPixmap SingleQuickItem::pixmap() const } } - return icon.pixmap(pixmapWidth, pixmapHeight); + return icon.pixmap(pixmapWidth / qApp->devicePixelRatio(), pixmapHeight / qApp->devicePixelRatio()); } QLabel *SingleQuickItem::findChildLabel(QWidget *parent, const QString &childObjectName) const diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp index e987fc2ba..76c683215 100644 --- a/frame/pluginadapter/pluginadapter.cpp +++ b/frame/pluginadapter/pluginadapter.cpp @@ -178,7 +178,7 @@ QIcon PluginAdapter::icon(const DockPart &dockPart, DGuiApplicationHelper::Color // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 QSize oldSize = itemWidget->size(); - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + itemWidget->setFixedSize(ICONWIDTH / qApp->devicePixelRatio(), ICONHEIGHT / qApp->devicePixelRatio()); QPixmap pixmap = itemWidget->grab(); itemWidget->setFixedSize(oldSize); return pixmap; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index bdd8f5ff1..7897f15d9 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -280,7 +280,13 @@ void QuickPluginWindow::dragEnterEvent(QDragEnterEvent *event) { m_dragEnterMimeData = const_cast(qobject_cast(event->mimeData())); if (m_dragEnterMimeData) { - QIcon icon = m_dragEnterMimeData->pluginItemInterface()->icon(DockPart::QuickShow); + PluginsItemInterface *plugin = m_dragEnterMimeData->pluginItemInterface(); + QIcon icon = plugin->icon(DockPart::QuickShow); + if (icon.isNull()) { + QWidget *widget = plugin->itemWidget(QuickSettingController::instance()->itemKey(plugin)); + if (widget) + icon = widget->grab(); + } QuickIconDrag *drag = qobject_cast(m_dragEnterMimeData->drag()); if (drag && !icon.isNull()) { QPixmap pixmap = icon.pixmap(QSize(16, 16)); From a88f5e6fa19571607202dc4a495d5ed4e963cee4 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 15 Dec 2022 14:39:43 +0800 Subject: [PATCH 205/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E6=97=B6=E5=B0=9A=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 计算图标大小的时候,在不拖动的情况下,直接获取后端的大小,无需乘以缩放率 Log: 修复高缩放率下时尚模式的显示问题 Influence: 高缩放率下,进入时尚模式,观察任务栏是否显示异常 Bug: https://pms.uniontech.com/bug-view-176321.html Change-Id: Ic1c59164f1495dc5e5cbf6f7600dda7aae995ae9 --- frame/window/mainpanelcontrol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 40790035e..efc6531a8 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -988,7 +988,7 @@ QSize MainPanelControl::suitableSize(const Position &position, int screenSize, d // 如果当前任务栏正在调整大小,就以当前任务栏的实际尺寸作为它的尺寸,否则,就以后端存储的尺寸作为它计算宽度(上下)或高度(左右)的参考 int dockSize = Utils::isDraging() ? ((position == Position::Top || position == Position::Bottom) ? height() : width()) - : (static_cast((m_displayMode == DisplayMode::Efficient ? m_dockInter->windowSizeEfficient() : m_dockInter->windowSizeFashion()) * qApp->devicePixelRatio())); + : (static_cast((m_displayMode == DisplayMode::Efficient ? m_dockInter->windowSizeEfficient() : m_dockInter->windowSizeFashion()))); if (m_displayMode == DisplayMode::Efficient) { // 如果是高效模式 if (position == Position::Top || position == Position::Bottom) From 80dfd4a2b8b95051c935b9021617644bfb83682c Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 15 Dec 2022 19:58:43 +0800 Subject: [PATCH 206/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E9=80=9A=E8=BF=87=E7=82=B9=E5=87=BB=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E9=9A=90=E8=97=8F=E5=BF=AB=E6=8D=B7=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 设置不检测的QWidget,当鼠标在不检测的QWidget内部点击的时候,无需关闭当前快捷面板 Log: Influence: 从插件图标打开快捷面板,再次点击该插件图标,观察快捷面板是否隐藏 Bug: https://pms.uniontech.com/bug-view-175201.html Change-Id: Ia523a7a414cdbd9cbd088ab0729e3b01414b8a93 --- frame/util/dockpopupwindow.cpp | 20 ++++++++++ frame/util/dockpopupwindow.h | 3 ++ frame/window/quickpluginwindow.cpp | 60 +++++------------------------- frame/window/quickpluginwindow.h | 4 +- 4 files changed, 33 insertions(+), 54 deletions(-) diff --git a/frame/util/dockpopupwindow.cpp b/frame/util/dockpopupwindow.cpp index 11912ae82..0c97f79a8 100644 --- a/frame/util/dockpopupwindow.cpp +++ b/frame/util/dockpopupwindow.cpp @@ -39,6 +39,7 @@ DockPopupWindow::DockPopupWindow(QWidget *parent) , m_model(false) , m_eventMonitor(new XEventMonitor(xEventMonitorService, xEventMonitorPath, QDBusConnection::sessionBus(), this)) , m_enableMouseRelease(true) + , m_extendWidget(nullptr) { setMargin(0); m_wmHelper = DWindowManagerHelper::instance(); @@ -85,6 +86,11 @@ void DockPopupWindow::setContent(QWidget *content) DArrowRectangle::setContent(content); } +void DockPopupWindow::setExtendWidget(QWidget *widget) +{ + m_extendWidget = widget; +} + void DockPopupWindow::show(const QPoint &pos, const bool model) { m_model = model; @@ -141,6 +147,12 @@ void DockPopupWindow::showEvent(QShowEvent *e) QTimer::singleShot(1, this, &DockPopupWindow::ensureRaised); } +void DockPopupWindow::hideEvent(QHideEvent *event) +{ + m_extendWidget = nullptr; + Dtk::Widget::DArrowRectangle::hideEvent(event); +} + void DockPopupWindow::enterEvent(QEvent *e) { DArrowRectangle::enterEvent(e); @@ -191,6 +203,14 @@ void DockPopupWindow::onButtonPress(int type, int x, int y, const QString &key) if (popupRect.contains(x, y)) return; + if (m_extendWidget) { + // 计算额外添加的区域,如果鼠标的点击点在额外的区域内,也无需隐藏 + QPoint extendPoint = m_extendWidget->mapToGlobal(QPoint(0, 0)); + QRect extendRect(extendPoint * qApp->devicePixelRatio(), m_extendWidget->size() * qApp->devicePixelRatio()); + if (extendRect.contains(QPoint(x, y))) + return; + } + emit accept(); hide(); } diff --git a/frame/util/dockpopupwindow.h b/frame/util/dockpopupwindow.h index c96695be4..0457a3964 100644 --- a/frame/util/dockpopupwindow.h +++ b/frame/util/dockpopupwindow.h @@ -44,6 +44,7 @@ public: bool model() const; void setContent(QWidget *content); + void setExtendWidget(QWidget *widget); public slots: void show(const QPoint &pos, const bool model = false); @@ -60,6 +61,7 @@ signals: protected: void showEvent(QShowEvent *e); + void hideEvent(QHideEvent *event); void enterEvent(QEvent *e); bool eventFilter(QObject *o, QEvent *e); void blockButtonRelease(); @@ -77,6 +79,7 @@ private: QString m_eventKey; DWindowManagerHelper *m_wmHelper; bool m_enableMouseRelease; + QWidget *m_extendWidget; }; #endif // DOCKPOPUPWINDOW_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 7897f15d9..40484ffc8 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -416,7 +416,7 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do void QuickPluginWindow::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) { - showPopup(getDockItemByPlugin(itemInter), itemInter, itemInter->itemPopupApplet(itemKey)); + showPopup(getDockItemByPlugin(itemInter), itemInter, itemInter->itemPopupApplet(itemKey), false); } void QuickPluginWindow::startDrag() @@ -433,8 +433,6 @@ void QuickPluginWindow::startDrag() drag->setPixmap(dragPixmap); drag->setHotSpot(dragPixmap.rect().center()); - //connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, &QuickPluginWindow::onPluginDropItem); - //connect(static_cast(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, &QuickPluginWindow::onPluginDragMove); drag->exec(Qt::CopyAction); // 获取当前鼠标在任务栏快捷图标区域的位置 @@ -477,13 +475,19 @@ QuickDockItem *QuickPluginWindow::getActiveDockItem(QPoint point) const return selectWidget; } -void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *itemInter, QWidget *childPage) +void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *itemInter, QWidget *childPage, bool isClicked) { if (!isVisible()) return; bool canBack = true; DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); + if (isClicked && popWindow->isVisible()) { + // 如果是点击插件,并且该插件曾经打开快捷面板且已经是显示状态,那么就直接隐藏快捷面板 + popWindow->hide(); + return; + } + if (!popWindow->isVisible()) { if (Utils::IS_WAYLAND_DISPLAY) { // TODO: 临时解决方案,如果是wayland环境,toolTip没有消失,因此,此处直接调用接口来隐藏 @@ -500,6 +504,7 @@ void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *ite } } + popWindow->setExtendWidget(item); popWindow->show(popupPoint(item), true); canBack = false; } @@ -568,53 +573,6 @@ int QuickPluginWindow::getDropIndex(QPoint point) return -1; } -/*void QuickPluginWindow::onPluginDropItem(QDropEvent *event) -{ - const QuickPluginMimeData *data = qobject_cast(event->mimeData()); - if (!data) - return; - - // 获取当前鼠标在任务栏快捷图标区域的位置 - QPoint currentPoint = mapFromGlobal(QCursor::pos()); - // 获取区域图标插入的位置 - QuickPluginModel::instance()->addPlugin(data->pluginItemInterface(), getDropIndex(currentPoint)); -}*/ - -void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event) -{ - QPoint currentPoint = mapFromGlobal(QCursor::pos()); - const QuickPluginMimeData *data = qobject_cast(event->mimeData()); - if (!data) - return; - - // 查找移动的 - PluginsItemInterface *sourceItem = data->pluginItemInterface(); - if (!sourceItem) - return; - - QuickDockItem *sourceMoveWidget = getDockItemByPlugin(sourceItem); - QuickDockItem *targetItem = getActiveDockItem(currentPoint); - // 如果未找到要移动的目标位置,或者移动的目标位置是固定插件,或者原插件和目标插件是同一个插件,则不做任何操作 - if (!sourceMoveWidget || !targetItem || sourceMoveWidget == targetItem) - return; - - // 重新对所有的插件进行排序 - QMap allItems; - for (int i = 0; i < m_mainLayout->count(); i++) { - QWidget *childWidget = m_mainLayout->itemAt(i)->widget(); - allItems[childWidget] = i; - } - // 调整列表中的位置 -/* int sourceIndex = m_activeSettingItems.indexOf(sourceItem); - int targetIndex = m_activeSettingItems.indexOf(targetItem->pluginItem()); - if (sourceIndex >= 0) - m_activeSettingItems.move(sourceIndex, targetIndex); - else - m_activeSettingItems.insert(targetIndex, sourceItem); -*/ - event->accept(); -} - void QuickPluginWindow::dragMoveEvent(QDragMoveEvent *event) { event->accept(); diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 563541ef9..64d37f301 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -69,8 +69,6 @@ protected: private Q_SLOTS: void onRequestUpdate(); - //void onPluginDropItem(QDropEvent *event); - void onPluginDragMove(QDragMoveEvent *event); void onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart); void onRequestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); @@ -83,7 +81,7 @@ private: QPoint popupPoint(QWidget *widget) const; QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item); QuickDockItem *getActiveDockItem(QPoint point) const; - void showPopup(QuickDockItem *item, PluginsItemInterface *itemInter = nullptr, QWidget *childPage = nullptr); + void showPopup(QuickDockItem *item, PluginsItemInterface *itemInter = nullptr, QWidget *childPage = nullptr, bool isClicked = true); QList quickDockItems(); private: From 8c03c2c768f2c1567df689f3c9e7e0750dc1c82a Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 16 Dec 2022 10:50:48 +0800 Subject: [PATCH 207/257] =?UTF-8?q?fix:=20=E9=BB=98=E8=AE=A4=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=94=B5=E6=BA=90=E6=8C=89=E9=92=AE=E5=92=8C=E5=9B=9E?= =?UTF-8?q?=E6=94=B6=E7=AB=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 配置中增加电源和回收站 Log: Influence: 新安装系统,观察任务栏上是否有电源和回收站的显示 Task: https://pms.uniontech.com/task-view-216841.html Change-Id: Icb0981a39c2ac27443e8784838f455f98775e87c --- configs/com.deepin.dde.dock.dconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/com.deepin.dde.dock.dconfig.json b/configs/com.deepin.dde.dock.dconfig.json index 1d17aa4d5..70335dd75 100644 --- a/configs/com.deepin.dde.dock.dconfig.json +++ b/configs/com.deepin.dde.dock.dconfig.json @@ -17,7 +17,7 @@ "visibility":"public" }, "Dock_Quick_Plugin_Name": { - "value": ["network", "sound", "power"], + "value": ["network", "sound", "power", "shutdown", "trash"], "serial": 0, "flags": [], "name": "显示在任务栏上的快捷插件", From 35b47881809799edd60e06d55616bc6e19e719af Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 19 Dec 2022 15:05:49 +0800 Subject: [PATCH 208/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E5=9B=BE=E6=A0=87=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 设置qApp的Qt::AA_UseHighDpiPixmaps属性为true,设置高分屏支持 Log: 修复高缩放率下图标显示异常的问题 Influence: 设置高缩放率,观察任务栏图标显示 Bug: https://gerrit.uniontech.com/c/dde-network-core/+/180802 Change-Id: I76b6621c405c4a01d39b68817fe920f8e6671609 --- frame/main.cpp | 2 +- frame/util/imageutil.cpp | 8 ++++---- frame/window/quickpluginwindow.cpp | 2 +- frame/window/systempluginwindow.cpp | 2 +- plugins/bluetooth/bluetoothmainwidget.cpp | 9 +++------ plugins/multitasking/CMakeLists.txt | 3 ++- plugins/multitasking/multitaskingwidget.cpp | 5 +++-- plugins/onboard/onboarditem.cpp | 4 ++-- plugins/overlay-warning/overlaywarningwidget.cpp | 4 ++-- plugins/power/powerstatuswidget.cpp | 4 ++-- plugins/show-desktop/CMakeLists.txt | 3 ++- plugins/show-desktop/showdesktopwidget.cpp | 5 +++-- plugins/shutdown/CMakeLists.txt | 3 ++- plugins/trash/trashwidget.cpp | 4 ++-- 14 files changed, 30 insertions(+), 28 deletions(-) diff --git a/frame/main.cpp b/frame/main.cpp index def51f55a..e302b5bfc 100644 --- a/frame/main.cpp +++ b/frame/main.cpp @@ -189,7 +189,7 @@ int main(int argc, char *argv[]) app.setApplicationVersion("2.0"); app.loadTranslator(); app.setAttribute(Qt::AA_EnableHighDpiScaling, true); - app.setAttribute(Qt::AA_UseHighDpiPixmaps, false); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); // 自动化标记由此开始 QAccessible::installFactory(accessibleFactory); diff --git a/frame/util/imageutil.cpp b/frame/util/imageutil.cpp index 7167bc6b4..4d68778a8 100644 --- a/frame/util/imageutil.cpp +++ b/frame/util/imageutil.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -44,13 +43,14 @@ const QPixmap ImageUtil::loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio) { QIcon icon = QIcon::fromTheme(iconName); + int pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : int(size * ratio); if (!icon.isNull()) { - QPixmap pixmap = icon.pixmap(int(size * ratio), int(size * ratio)); + QPixmap pixmap = icon.pixmap(pixmapSize); pixmap.setDevicePixelRatio(ratio); return pixmap; } - QPixmap pixmap(int(size * ratio), int(size * ratio)); + QPixmap pixmap(pixmapSize, pixmapSize); QString localIcon = QString("%1%2%3").arg(localPath).arg(iconName).arg(iconName.contains(".svg") ? "" : ".svg"); QSvgRenderer renderer(localIcon); pixmap.fill(Qt::transparent); @@ -68,7 +68,7 @@ const QPixmap ImageUtil::loadSvg(const QString &iconName, const QSize size, cons { QIcon icon = QIcon::fromTheme(iconName); if (!icon.isNull()) { - QPixmap pixmap = icon.pixmap(size*ratio); + QPixmap pixmap = icon.pixmap(QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : QSize(size * ratio)); pixmap.setDevicePixelRatio(ratio); return pixmap; } diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 40484ffc8..d5ec6c85f 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -751,7 +751,7 @@ bool QuickDockItem::eventFilter(QObject *watched, QEvent *event) QPixmap QuickDockItem::iconPixmap() const { - int pixmapSize = static_cast(ICONHEIGHT * qApp->devicePixelRatio()); + int pixmapSize = static_cast(ICONHEIGHT * (QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio())); QIcon icon = m_pluginItem->icon(DockPart::QuickShow); if (!icon.isNull()) return icon.pixmap(pixmapSize, pixmapSize); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 4c19bff53..3afc4b0e4 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -281,7 +281,7 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) } // 绘制图标 - int iconSize = static_cast(ICONSIZE * (qApp->devicePixelRatio())); + int iconSize = static_cast(ICONSIZE * (QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio())); painter.drawPixmap(rctPixmap, icon.pixmap(iconSize, iconSize)); } diff --git a/plugins/bluetooth/bluetoothmainwidget.cpp b/plugins/bluetooth/bluetoothmainwidget.cpp index 57f895381..eff4cff24 100644 --- a/plugins/bluetooth/bluetoothmainwidget.cpp +++ b/plugins/bluetooth/bluetoothmainwidget.cpp @@ -30,6 +30,7 @@ #include #include #include +#include DGUI_USE_NAMESPACE DWIDGET_USE_NAMESPACE @@ -166,12 +167,8 @@ void BluetoothMainWidget::initConnection() void BluetoothMainWidget::updateExpandIcon() { - QString expandIconFile = ":/arrow-right"; - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType) - expandIconFile += "-dark"; - expandIconFile += ".svg"; - - m_expandLabel->setPixmap(expandIconFile); + QPixmap enterPixmap = DStyle::standardIcon(style(), DStyle::SP_ArrowEnter).pixmap(QSize(16, 16)); + m_expandLabel->setPixmap(enterPixmap); } bool BluetoothMainWidget::isOpen() const diff --git a/plugins/multitasking/CMakeLists.txt b/plugins/multitasking/CMakeLists.txt index 1c44ec04f..d02f5ab09 100644 --- a/plugins/multitasking/CMakeLists.txt +++ b/plugins/multitasking/CMakeLists.txt @@ -4,7 +4,8 @@ set(PLUGIN_NAME "multitasking") project(${PLUGIN_NAME}) # Sources files -file(GLOB SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp") +file(GLOB SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp" +"../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/multitasking/multitaskingwidget.cpp b/plugins/multitasking/multitaskingwidget.cpp index cdff89cf8..8cd9eb675 100644 --- a/plugins/multitasking/multitaskingwidget.cpp +++ b/plugins/multitasking/multitaskingwidget.cpp @@ -25,6 +25,7 @@ #include #include #include +#include MultitaskingWidget::MultitaskingWidget(QWidget *parent) : QWidget(parent) @@ -46,9 +47,9 @@ void MultitaskingWidget::paintEvent(QPaintEvent *e) QPixmap icon; if (Dock::Fashion == qApp->property(PROP_DISPLAY_MODE).value()) { - icon = QIcon::fromTheme("deepin-multitasking-view", m_icon).pixmap(size() * 0.8 * ratio); + icon = ImageUtil::loadSvg("deepin-multitasking-view", QString(":/icons/"), int(size().width() * 0.8), ratio); } else { - icon = QIcon::fromTheme("deepin-multitasking-view", m_icon).pixmap(size() * 0.7 * ratio); + icon = ImageUtil::loadSvg("deepin-multitasking-view", QString(":/icons/"), int(size().width() * 0.7), ratio); } icon.setDevicePixelRatio(ratio); diff --git a/plugins/onboard/onboarditem.cpp b/plugins/onboard/onboarditem.cpp index b69aaed52..58589f6e8 100644 --- a/plugins/onboard/onboarditem.cpp +++ b/plugins/onboard/onboarditem.cpp @@ -113,8 +113,8 @@ const QPixmap OnboardItem::loadSvg(const QString &fileName, const QSize &size) c { const auto ratio = devicePixelRatioF(); - QPixmap pixmap; - pixmap = QIcon::fromTheme(fileName, m_icon).pixmap(size * ratio); + QSize pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : (size * ratio); + QPixmap pixmap = QIcon::fromTheme(fileName, m_icon).pixmap(pixmapSize); pixmap.setDevicePixelRatio(ratio); return pixmap; diff --git a/plugins/overlay-warning/overlaywarningwidget.cpp b/plugins/overlay-warning/overlaywarningwidget.cpp index 5385bbaf6..e9a46e55c 100644 --- a/plugins/overlay-warning/overlaywarningwidget.cpp +++ b/plugins/overlay-warning/overlaywarningwidget.cpp @@ -67,8 +67,8 @@ const QPixmap OverlayWarningWidget::loadSvg(const QString &fileName, const QSize { const auto ratio = devicePixelRatioF(); - QPixmap pixmap; - pixmap = QIcon::fromTheme(fileName).pixmap(size * ratio); + QSize pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : (size * ratio); + QPixmap pixmap = QIcon::fromTheme(fileName).pixmap(pixmapSize); pixmap.setDevicePixelRatio(ratio); return pixmap; diff --git a/plugins/power/powerstatuswidget.cpp b/plugins/power/powerstatuswidget.cpp index 3943489d5..8ae4049f0 100644 --- a/plugins/power/powerstatuswidget.cpp +++ b/plugins/power/powerstatuswidget.cpp @@ -115,8 +115,8 @@ QPixmap PowerStatusWidget::getBatteryIcon(int themeType) iconStr.append(PLUGIN_MIN_ICON_NAME); const auto ratio = devicePixelRatioF(); - QPixmap pix = QIcon::fromTheme(iconStr, - QIcon::fromTheme(":/batteryicons/resources/batteryicons/" + iconStr + ".svg")).pixmap(QSize(20, 20) * ratio); + QSize pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? QSize(20, 20) : (QSize(20, 20) * ratio); + QPixmap pix = QIcon::fromTheme(iconStr, QIcon::fromTheme(":/batteryicons/resources/batteryicons/" + iconStr + ".svg")).pixmap(pixmapSize); pix.setDevicePixelRatio(ratio); return pix; diff --git a/plugins/show-desktop/CMakeLists.txt b/plugins/show-desktop/CMakeLists.txt index 42e4c412a..c041ba604 100644 --- a/plugins/show-desktop/CMakeLists.txt +++ b/plugins/show-desktop/CMakeLists.txt @@ -4,7 +4,8 @@ set(PLUGIN_NAME "show-desktop") project(${PLUGIN_NAME}) # Sources files -file(GLOB SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp") +file(GLOB SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp" +"../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/show-desktop/showdesktopwidget.cpp b/plugins/show-desktop/showdesktopwidget.cpp index 37f8bf3b1..9abf63e0a 100644 --- a/plugins/show-desktop/showdesktopwidget.cpp +++ b/plugins/show-desktop/showdesktopwidget.cpp @@ -21,6 +21,7 @@ #include "showdesktopwidget.h" #include "showdesktopplugin.h" +#include "imageutil.h" #include #include @@ -44,9 +45,9 @@ void ShowDesktopWidget::paintEvent(QPaintEvent *e) QPixmap icon; if (Dock::Fashion == qApp->property(PROP_DISPLAY_MODE).value()) { - icon = QIcon::fromTheme("deepin-toggle-desktop").pixmap(size() * 0.8 * ratio); + icon = ImageUtil::loadSvg("deepin-toggle-desktop", QString(), int(size().width() * 0.8), ratio); } else { - icon = QIcon::fromTheme("deepin-toggle-desktop").pixmap(size() * 0.7 * ratio); + icon = ImageUtil::loadSvg("deepin-toggle-desktop", QString(), int(size().width() * 0.7), ratio); } icon.setDevicePixelRatio(ratio); diff --git a/plugins/shutdown/CMakeLists.txt b/plugins/shutdown/CMakeLists.txt index 3e436561d..b472c8d44 100644 --- a/plugins/shutdown/CMakeLists.txt +++ b/plugins/shutdown/CMakeLists.txt @@ -4,7 +4,8 @@ set(PLUGIN_NAME "shutdown") project(${PLUGIN_NAME}) # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp") +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/tipswidget.h" "../../widgets/tipswidget.cpp" +"../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/trash/trashwidget.cpp b/plugins/trash/trashwidget.cpp index 48a723dd9..387bc1655 100644 --- a/plugins/trash/trashwidget.cpp +++ b/plugins/trash/trashwidget.cpp @@ -215,11 +215,11 @@ void TrashWidget::updateIcon() size = PLUGIN_BACKGROUND_MAX_SIZE; } - QIcon icon = QIcon::fromTheme(iconString, m_defaulticon); const auto ratio = devicePixelRatioF(); - m_icon = icon.pixmap(size * ratio, size * ratio); + int pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : int(size * ratio); + m_icon = icon.pixmap(pixmapSize, pixmapSize); m_icon.setDevicePixelRatio(ratio); } From 72a72654877dc7a22fcc31b078c0c18e6ee0a582 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 8 Dec 2022 05:19:07 +0000 Subject: [PATCH 209/257] =?UTF-8?q?chore:=20=E9=80=82=E9=85=8D=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=9A=84dtkcore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 最新的dtkcore中已经包含frame/qtdbusextended目录下的所有文件,删除原来的同名文件,同时修改引用的头文件的名称 Log: Influence: 正常编译 Task: https://pms.uniontech.com/task-view-224841.html Change-Id: I53c6ece52dad59874ca560fa63fbd1c456c6adb3 --- frame/dbus/entryinterface.h | 2 +- frame/qtdbusextended/DBusExtended | 1 - .../DBusExtendedAbstractInterface | 1 - frame/qtdbusextended/dbusextended.h | 35 -- .../dbusextendedabstractinterface.cpp | 525 ------------------ .../dbusextendedabstractinterface.h | 103 ---- .../dbusextendedpendingcallwatcher.cpp | 38 -- .../dbusextendedpendingcallwatcher_p.h | 67 --- 8 files changed, 1 insertion(+), 771 deletions(-) delete mode 100644 frame/qtdbusextended/DBusExtended delete mode 100644 frame/qtdbusextended/DBusExtendedAbstractInterface delete mode 100644 frame/qtdbusextended/dbusextended.h delete mode 100644 frame/qtdbusextended/dbusextendedabstractinterface.cpp delete mode 100644 frame/qtdbusextended/dbusextendedabstractinterface.h delete mode 100644 frame/qtdbusextended/dbusextendedpendingcallwatcher.cpp delete mode 100644 frame/qtdbusextended/dbusextendedpendingcallwatcher_p.h diff --git a/frame/dbus/entryinterface.h b/frame/dbus/entryinterface.h index 2c8513bf5..e0af4497e 100644 --- a/frame/dbus/entryinterface.h +++ b/frame/dbus/entryinterface.h @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include typedef QList WindowList; diff --git a/frame/qtdbusextended/DBusExtended b/frame/qtdbusextended/DBusExtended deleted file mode 100644 index 719c49b2a..000000000 --- a/frame/qtdbusextended/DBusExtended +++ /dev/null @@ -1 +0,0 @@ -#include "dbusextended.h" diff --git a/frame/qtdbusextended/DBusExtendedAbstractInterface b/frame/qtdbusextended/DBusExtendedAbstractInterface deleted file mode 100644 index 246af8a14..000000000 --- a/frame/qtdbusextended/DBusExtendedAbstractInterface +++ /dev/null @@ -1 +0,0 @@ -#include "dbusextendedabstractinterface.h" diff --git a/frame/qtdbusextended/dbusextended.h b/frame/qtdbusextended/dbusextended.h deleted file mode 100644 index 6b27aa24b..000000000 --- a/frame/qtdbusextended/dbusextended.h +++ /dev/null @@ -1,35 +0,0 @@ -// -*- c++ -*- - -/*! - * - * Copyright (C) 2015 Jolla Ltd. - * - * Contact: Valerio Valerio - * Author: Andres Gomez - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef QT_DBUS_EXTENDED_H -#define QT_DBUS_EXTENDED_H - -#if defined(QT_DBUS_EXTENDED_LIBRARY) -# define QT_DBUS_EXTENDED_EXPORT Q_DECL_EXPORT -#else -# define QT_DBUS_EXTENDED_EXPORT Q_DECL_IMPORT -#endif - -#endif /* QT_DBUS_EXTENDED_H */ diff --git a/frame/qtdbusextended/dbusextendedabstractinterface.cpp b/frame/qtdbusextended/dbusextendedabstractinterface.cpp deleted file mode 100644 index 54d46f3d3..000000000 --- a/frame/qtdbusextended/dbusextendedabstractinterface.cpp +++ /dev/null @@ -1,525 +0,0 @@ -// -*- c++ -*- - -/*! - * - * Copyright (C) 2015 Jolla Ltd. - * - * Contact: Valerio Valerio - * Author: Andres Gomez - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "dbusextendedpendingcallwatcher_p.h" - -#include - -#include -#include -#include -#include -#include - -#include -#include - - -Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusInterface, ("org.freedesktop.DBus")) -Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusPropertiesInterface, ("org.freedesktop.DBus.Properties")) -Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, dBusPropertiesChangedSignal, ("PropertiesChanged")) -Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, propertyChangedSignature, ("propertyChanged(QString,QVariant)")) -Q_GLOBAL_STATIC_WITH_ARGS(QByteArray, propertyInvalidatedSignature, ("propertyInvalidated(QString)")) - - -DBusExtendedAbstractInterface::DBusExtendedAbstractInterface(const QString &service, const QString &path, const char *interface, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, interface, connection, parent) - , m_sync(true) - , m_useCache(false) - , m_getAllPendingCallWatcher(0) - , m_propertiesChangedConnected(false) -{ - const_cast(connection).connect(QString("org.freedesktop.DBus"), QString("/org/freedesktop/DBus"), QString("org.freedesktop.DBus"), QString("NameOwnerChanged"), this, SLOT(onDBusNameOwnerChanged(QString,QString,QString))); -} - -DBusExtendedAbstractInterface::~DBusExtendedAbstractInterface() -{ -} - -void DBusExtendedAbstractInterface::setSync(bool sync) { setSync(sync, true); } - -/* - * Note: After sync is set to false, it will always return a empty value - * if you call the property's get function directly. So you can only get it - * through the changed signal when you get an property, and it's also a good idea - * to save a cache yourself. - */ - -/* - * 注意: 如果设置 sync 为 false 那么在调用属性的 get 函数获取一个属性时会一直返回空值, - * 解决方法是监听属性的 changed 信号并自行保存一份缓存, 让 changed 信号修改这个缓存 - */ -void DBusExtendedAbstractInterface::setSync(bool sync, bool autoStart) -{ - m_sync = sync; - - // init all properties - if (autoStart && !m_sync && !isValid()) - startServiceProcess(); -} - -void DBusExtendedAbstractInterface::getAllProperties() -{ - m_lastExtendedError = QDBusError(); - - if (!isValid()) { - QString errorMessage = QStringLiteral("This Extended DBus interface is not valid yet."); - m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); - qDebug() << Q_FUNC_INFO << errorMessage; - return; - } - - if (!m_sync && m_getAllPendingCallWatcher) { - // Call already in place, not repeating ... - return; - } - - QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("GetAll")); - msg << interface(); - - if (m_sync) { - QDBusMessage reply = connection().call(msg); - - if (reply.type() != QDBusMessage::ReplyMessage) { - m_lastExtendedError = QDBusError(reply); - qWarning() << Q_FUNC_INFO << m_lastExtendedError.message(); - return; - } - - if (reply.signature() != QLatin1String("a{sv}")) { - QString errorMessage = QStringLiteral("Invalid signature \"%1\" in return from call to %2") - .arg(reply.signature(), - QString(*dBusPropertiesInterface())); - qWarning() << Q_FUNC_INFO << errorMessage; - m_lastExtendedError = QDBusError(QDBusError::InvalidSignature, errorMessage); - return; - } - - QVariantMap value = reply.arguments().at(0).toMap(); - onPropertiesChanged(interface(), value, QStringList()); - } else { - QDBusPendingReply async = connection().asyncCall(msg); - m_getAllPendingCallWatcher = new QDBusPendingCallWatcher(async, this); - - connect(m_getAllPendingCallWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher*))); - return; - } -} - -void DBusExtendedAbstractInterface::connectNotify(const QMetaMethod &signal) -{ - if (signal.methodType() == QMetaMethod::Signal - && (signal.methodSignature() == *propertyChangedSignature() - || signal.methodSignature() == *propertyInvalidatedSignature())) { - if (!m_propertiesChangedConnected) { - QStringList argumentMatch; - argumentMatch << interface(); - connection().connect(service(), path(), *dBusPropertiesInterface(), *dBusPropertiesChangedSignal(), - argumentMatch, QString(), - this, SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); - - m_propertiesChangedConnected = true; - return; - } - } else { - QDBusAbstractInterface::connectNotify(signal); - } -} - -void DBusExtendedAbstractInterface::disconnectNotify(const QMetaMethod &signal) -{ - if (signal.methodType() == QMetaMethod::Signal - && (signal.methodSignature() == *propertyChangedSignature() - || signal.methodSignature() == *propertyInvalidatedSignature())) { - if (m_propertiesChangedConnected - && 0 == receivers(propertyChangedSignature()->constData()) - && 0 == receivers(propertyInvalidatedSignature()->constData())) { - QStringList argumentMatch; - argumentMatch << interface(); - connection().disconnect(service(), path(), *dBusPropertiesInterface(), *dBusPropertiesChangedSignal(), - argumentMatch, QString(), - this, SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); - - m_propertiesChangedConnected = false; - return; - } - } else { - QDBusAbstractInterface::disconnectNotify(signal); - } -} - -QVariant DBusExtendedAbstractInterface::internalPropGet(const char *propname, void *propertyPtr) -{ - m_lastExtendedError = QDBusError(); - - if (m_useCache) { - int propertyIndex = metaObject()->indexOfProperty(propname); - QMetaProperty metaProperty = metaObject()->property(propertyIndex); - return QVariant(metaProperty.userType(), propertyPtr); - } - - if (m_sync) { - QVariant ret = property(propname); - - QMetaType::construct(ret.userType(), propertyPtr, ret.constData()); - - return ret; - } else { - if (!isValid()) { - QString errorMessage = QStringLiteral("This Extended DBus interface is not valid yet."); - m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); - qDebug() << Q_FUNC_INFO << errorMessage; - return QVariant(); - } - - int propertyIndex = metaObject()->indexOfProperty(propname); - - if (-1 == propertyIndex) { - QString errorMessage = QStringLiteral("Got unknown property \"%1\" to read") - .arg(QString::fromLatin1(propname)); - m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); - qWarning() << Q_FUNC_INFO << errorMessage; - return QVariant(); - } - - QMetaProperty metaProperty = metaObject()->property(propertyIndex); - - if (!metaProperty.isReadable()) { - QString errorMessage = QStringLiteral("Property \"%1\" is NOT readable") - .arg(QString::fromLatin1(propname)); - m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); - qWarning() << Q_FUNC_INFO << errorMessage; - return QVariant(); - } - - // is this metatype registered? - const char *expectedSignature = ""; - if (int(metaProperty.type()) != QMetaType::QVariant) { - expectedSignature = QDBusMetaType::typeToSignature(metaProperty.userType()); - if (0 == expectedSignature) { - QString errorMessage = - QStringLiteral("Type %1 must be registered with Qt D-Bus " - "before it can be used to read property " - "%2.%3") - .arg(metaProperty.typeName(), - interface(), - propname); - m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); - qWarning() << Q_FUNC_INFO << errorMessage; - return QVariant(); - } - } - - asyncProperty(propname); - return QVariant(metaProperty.userType(), propertyPtr); - } -} - -void DBusExtendedAbstractInterface::internalPropSet(const char *propname, const QVariant &value, void *propertyPtr) -{ - m_lastExtendedError = QDBusError(); - - if (m_sync) { - setProperty(propname, value); - } else { - if (!isValid()) { - QString errorMessage = QStringLiteral("This interface is not yet valid"); - m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); - qDebug() << Q_FUNC_INFO << errorMessage; - return; - } - - int propertyIndex = metaObject()->indexOfProperty(propname); - - if (-1 == propertyIndex) { - QString errorMessage = QStringLiteral("Got unknown property \"%1\" to write") - .arg(QString::fromLatin1(propname)); - m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); - qWarning() << Q_FUNC_INFO << errorMessage; - return; - } - - QMetaProperty metaProperty = metaObject()->property(propertyIndex); - - if (!metaProperty.isWritable()) { - QString errorMessage = QStringLiteral("Property \"%1\" is NOT writable") - .arg(QString::fromLatin1(propname)); - m_lastExtendedError = QDBusMessage::createError(QDBusError::Failed, errorMessage); - qWarning() << Q_FUNC_INFO << errorMessage; - return; - } - - QVariant variant = QVariant(metaProperty.type(), propertyPtr); - variant = value; - - asyncSetProperty(propname, variant); - } -} - -QVariant DBusExtendedAbstractInterface::asyncProperty(const QString &propertyName) -{ - QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("Get")); - msg << interface() << propertyName; - QDBusPendingReply async = connection().asyncCall(msg); - DBusExtendedPendingCallWatcher *watcher = new DBusExtendedPendingCallWatcher(async, propertyName, QVariant(), this); - - connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(onAsyncPropertyFinished(QDBusPendingCallWatcher*))); - - return QVariant(); -} - -void DBusExtendedAbstractInterface::asyncSetProperty(const QString &propertyName, const QVariant &value) -{ - QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), *dBusPropertiesInterface(), QStringLiteral("Set")); - - msg << interface() << propertyName << QVariant::fromValue(QDBusVariant(value)); - QDBusPendingReply<> async = connection().asyncCall(msg); - DBusExtendedPendingCallWatcher *watcher = new DBusExtendedPendingCallWatcher(async, propertyName, value, this); - - connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(onAsyncSetPropertyFinished(QDBusPendingCallWatcher*))); -} - -void DBusExtendedAbstractInterface::startServiceProcess() -{ - const QString &servName = service(); - - if (isValid()) - { - qWarning() << "Service" << servName << "is already started."; - return; - } - - QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.DBus", "/", *dBusInterface(), QStringLiteral("StartServiceByName")); - msg << servName << quint32(0); - QDBusPendingReply async = connection().asyncCall(msg); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); - - connect(watcher, &QDBusPendingCallWatcher::finished, this, &DBusExtendedAbstractInterface::onStartServiceProcessFinished); -} - -void DBusExtendedAbstractInterface::onStartServiceProcessFinished(QDBusPendingCallWatcher *w) -{ - if (w->isError()) - { - m_lastExtendedError = w->error(); - } else { - m_lastExtendedError = QDBusError(); - } - - QDBusPendingReply reply = *w; - - Q_EMIT serviceStartFinished(reply.value()); - - w->deleteLater(); -} - -void DBusExtendedAbstractInterface::onAsyncPropertyFinished(QDBusPendingCallWatcher *w) -{ - DBusExtendedPendingCallWatcher *watcher = qobject_cast(w); - Q_ASSERT(watcher); - - QDBusPendingReply reply = *watcher; - - if (reply.isError()) { - m_lastExtendedError = reply.error(); - } else { - int propertyIndex = metaObject()->indexOfProperty(watcher->asyncProperty().toLatin1().constData()); - QVariant value = demarshall(interface(), - metaObject()->property(propertyIndex), - reply.value(), - &m_lastExtendedError); - - if (m_lastExtendedError.isValid()) { - Q_EMIT propertyInvalidated(watcher->asyncProperty()); - } else { - Q_EMIT propertyChanged(watcher->asyncProperty(), value); - } - } - - Q_EMIT asyncPropertyFinished(watcher->asyncProperty()); - watcher->deleteLater(); -} - -void DBusExtendedAbstractInterface::onAsyncSetPropertyFinished(QDBusPendingCallWatcher *w) -{ - DBusExtendedPendingCallWatcher *watcher = qobject_cast(w); - Q_ASSERT(watcher); - - QDBusPendingReply<> reply = *watcher; - - if (reply.isError()) { - m_lastExtendedError = reply.error(); - } else { - m_lastExtendedError = QDBusError(); - } - - Q_EMIT asyncSetPropertyFinished(watcher->asyncProperty()); - - // Resetting the property to its previous value after sending the - // finished signal - if (reply.isError()) { - m_lastExtendedError = QDBusError(); - Q_EMIT propertyChanged(watcher->asyncProperty(), watcher->previousValue()); - } - - watcher->deleteLater(); -} - -void DBusExtendedAbstractInterface::onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher *watcher) -{ - m_getAllPendingCallWatcher = 0; - - QDBusPendingReply reply = *watcher; - - if (reply.isError()) { - m_lastExtendedError = reply.error(); - } else { - m_lastExtendedError = QDBusError(); - } - - Q_EMIT asyncGetAllPropertiesFinished(); - - if (!reply.isError()) { - onPropertiesChanged(interface(), reply.value(), QStringList()); - } - - watcher->deleteLater(); -} - -void DBusExtendedAbstractInterface::onPropertiesChanged(const QString& interfaceName, - const QVariantMap& changedProperties, - const QStringList& invalidatedProperties) -{ - if (interfaceName == interface()) { - QVariantMap::const_iterator i = changedProperties.constBegin(); - while (i != changedProperties.constEnd()) { - int propertyIndex = metaObject()->indexOfProperty(i.key().toLatin1().constData()); - - if (-1 == propertyIndex) { - qDebug() << Q_FUNC_INFO << "Got unknown changed property" << i.key(); - } else { - QVariant value = demarshall(interface(), metaObject()->property(propertyIndex), i.value(), &m_lastExtendedError); - - if (m_lastExtendedError.isValid()) { - Q_EMIT propertyInvalidated(i.key()); - } else { - Q_EMIT propertyChanged(i.key(), value); - } - } - - ++i; - } - - QStringList::const_iterator j = invalidatedProperties.constBegin(); - while (j != invalidatedProperties.constEnd()) { - if (-1 == metaObject()->indexOfProperty(j->toLatin1().constData())) { - qDebug() << Q_FUNC_INFO << "Got unknown invalidated property" << *j; - } else { - m_lastExtendedError = QDBusError(); - Q_EMIT propertyInvalidated(*j); - } - - ++j; - } - } -} - -void DBusExtendedAbstractInterface::onDBusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) -{ - if (name == service() && oldOwner.isEmpty()) - { - m_dbusOwner = newOwner; - Q_EMIT serviceValidChanged(true); - } - else if (name == m_dbusOwner && newOwner.isEmpty()) - { - m_dbusOwner.clear(); - Q_EMIT serviceValidChanged(false); - } -} - -QVariant DBusExtendedAbstractInterface::demarshall(const QString &interface, const QMetaProperty &metaProperty, const QVariant &value, QDBusError *error) -{ - Q_ASSERT(metaProperty.isValid()); - Q_ASSERT(error != 0); - - if (value.userType() == metaProperty.userType()) { - // No need demarshalling. Passing back straight away ... - *error = QDBusError(); - return value; - } - - QVariant result = QVariant(metaProperty.userType(), (void*)0); - QString errorMessage; - const char *expectedSignature = QDBusMetaType::typeToSignature(metaProperty.userType()); - - if (value.userType() == qMetaTypeId()) { - // demarshalling a DBus argument ... - QDBusArgument dbusArg = value.value(); - - if (expectedSignature == dbusArg.currentSignature().toLatin1()) { - QDBusMetaType::demarshall(dbusArg, metaProperty.userType(), result.data()); - if (!result.isValid()) { - errorMessage = QStringLiteral("Unexpected failure demarshalling " - "upon PropertiesChanged signal arrival " - "for property `%3.%4' (expected type `%5' (%6))") - .arg(interface, - QString::fromLatin1(metaProperty.name()), - QString::fromLatin1(metaProperty.typeName()), - expectedSignature); - } - } else { - errorMessage = QStringLiteral("Unexpected `user type' (%2) " - "upon PropertiesChanged signal arrival " - "for property `%3.%4' (expected type `%5' (%6))") - .arg(dbusArg.currentSignature(), - interface, - QString::fromLatin1(metaProperty.name()), - QString::fromLatin1(metaProperty.typeName()), - QString::fromLatin1(expectedSignature)); - } - } else { - const char *actualSignature = QDBusMetaType::typeToSignature(value.userType()); - - errorMessage = QStringLiteral("Unexpected `%1' (%2) " - "upon PropertiesChanged signal arrival " - "for property `%3.%4' (expected type `%5' (%6))") - .arg(QString::fromLatin1(value.typeName()), - QString::fromLatin1(actualSignature), - interface, - QString::fromLatin1(metaProperty.name()), - QString::fromLatin1(metaProperty.typeName()), - QString::fromLatin1(expectedSignature)); - } - - if (errorMessage.isEmpty()) { - *error = QDBusError(); - } else { - *error = QDBusMessage::createError(QDBusError::InvalidSignature, errorMessage); - qDebug() << Q_FUNC_INFO << errorMessage; - } - - return result; -} diff --git a/frame/qtdbusextended/dbusextendedabstractinterface.h b/frame/qtdbusextended/dbusextendedabstractinterface.h deleted file mode 100644 index 812d0ae29..000000000 --- a/frame/qtdbusextended/dbusextendedabstractinterface.h +++ /dev/null @@ -1,103 +0,0 @@ -// -*- c++ -*- - -/*! - * - * Copyright (C) 2015 Jolla Ltd. - * - * Contact: Valerio Valerio - * Author: Andres Gomez - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DBUSEXTENDEDABSTRACTINTERFACE_H -#define DBUSEXTENDEDABSTRACTINTERFACE_H - -#include - -#include -#include - -class QDBusPendingCallWatcher; -class DBusExtendedPendingCallWatcher; - -class QT_DBUS_EXTENDED_EXPORT DBusExtendedAbstractInterface: public QDBusAbstractInterface -{ - Q_OBJECT - -public: - virtual ~DBusExtendedAbstractInterface(); - - Q_PROPERTY(bool sync READ sync WRITE setSync) - inline bool sync() const { return m_sync; } - void setSync(bool sync); - void setSync(bool sync, bool autoStart); - - Q_PROPERTY(bool useCache READ useCache WRITE setUseCache) - inline bool useCache() const { return m_useCache; } - inline void setUseCache(bool useCache) { m_useCache = useCache; } - - void getAllProperties(); - inline QDBusError lastExtendedError() const { return m_lastExtendedError; } - -public Q_SLOTS: - void startServiceProcess(); - -protected: - DBusExtendedAbstractInterface(const QString &service, - const QString &path, - const char *interface, - const QDBusConnection &connection, - QObject *parent); - - void connectNotify(const QMetaMethod &signal); - void disconnectNotify(const QMetaMethod &signal); - QVariant internalPropGet(const char *propname, void *propertyPtr); - void internalPropSet(const char *propname, const QVariant &value, void *propertyPtr); - -Q_SIGNALS: - void serviceValidChanged(const bool valid) const; - void serviceStartFinished(const quint32 ret) const; - void propertyChanged(const QString &propertyName, const QVariant &value); - void propertyInvalidated(const QString &propertyName); - void asyncPropertyFinished(const QString &propertyName); - void asyncSetPropertyFinished(const QString &propertyName); - void asyncGetAllPropertiesFinished(); - -private Q_SLOTS: - void onPropertiesChanged(const QString& interfaceName, - const QVariantMap& changedProperties, - const QStringList& invalidatedProperties); - void onDBusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); - void onAsyncPropertyFinished(QDBusPendingCallWatcher *w); - void onAsyncSetPropertyFinished(QDBusPendingCallWatcher *w); - void onAsyncGetAllPropertiesFinished(QDBusPendingCallWatcher *watcher); - void onStartServiceProcessFinished(QDBusPendingCallWatcher *w); - -private: - QVariant asyncProperty(const QString &propertyName); - void asyncSetProperty(const QString &propertyName, const QVariant &value); - static QVariant demarshall(const QString &interface, const QMetaProperty &metaProperty, const QVariant &value, QDBusError *error); - - bool m_sync; - bool m_useCache; - QDBusPendingCallWatcher *m_getAllPendingCallWatcher; - QDBusError m_lastExtendedError; - QString m_dbusOwner; - bool m_propertiesChangedConnected; -}; - -#endif /* DBUSEXTENDEDABSTRACTINTERFACE_H */ diff --git a/frame/qtdbusextended/dbusextendedpendingcallwatcher.cpp b/frame/qtdbusextended/dbusextendedpendingcallwatcher.cpp deleted file mode 100644 index a8404d935..000000000 --- a/frame/qtdbusextended/dbusextendedpendingcallwatcher.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// -*- c++ -*- - -/*! - * - * Copyright (C) 2015 Jolla Ltd. - * - * Contact: Valerio Valerio - * Author: Andres Gomez - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "dbusextendedpendingcallwatcher_p.h" - - -DBusExtendedPendingCallWatcher::DBusExtendedPendingCallWatcher(const QDBusPendingCall &call, const QString &asyncProperty, const QVariant &previousValue, QObject *parent) - : QDBusPendingCallWatcher(call, parent) - , m_asyncProperty(asyncProperty) - , m_previousValue(previousValue) -{ -} - -DBusExtendedPendingCallWatcher::~DBusExtendedPendingCallWatcher() -{ -} diff --git a/frame/qtdbusextended/dbusextendedpendingcallwatcher_p.h b/frame/qtdbusextended/dbusextendedpendingcallwatcher_p.h deleted file mode 100644 index ff7a85da8..000000000 --- a/frame/qtdbusextended/dbusextendedpendingcallwatcher_p.h +++ /dev/null @@ -1,67 +0,0 @@ -// -*- c++ -*- - -/*! - * - * Copyright (C) 2015 Jolla Ltd. - * - * Contact: Valerio Valerio - * Author: Andres Gomez - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -// -// W A R N I N G -// ------------- -// -// This file is not part of the public API. This header file may -// change from version to version without notice, or even be -// removed. -// -// We mean it. -// -// - - -#ifndef DBUSEXTENDEDPENDINGCALLWATCHER_P_H -#define DBUSEXTENDEDPENDINGCALLWATCHER_P_H - -#include -#include - -class DBusExtendedPendingCallWatcher: public QDBusPendingCallWatcher -{ - Q_OBJECT - -public: - explicit DBusExtendedPendingCallWatcher(const QDBusPendingCall &call, - const QString &asyncProperty, - const QVariant &previousValue, - QObject *parent = 0); - ~DBusExtendedPendingCallWatcher(); - - Q_PROPERTY(QString AsyncProperty READ asyncProperty) - inline QString asyncProperty() const { return m_asyncProperty; } - - Q_PROPERTY(QVariant PreviousValue READ previousValue) - inline QVariant previousValue() const { return m_previousValue; } - -private: - QString m_asyncProperty; - QVariant m_previousValue; -}; - -#endif /* DBUSEXTENDEDPENDINGCALLWATCHER_P_H */ From b488d5904756b0b93234107947eb8a408106d2cf Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Tue, 13 Dec 2022 21:16:10 +0800 Subject: [PATCH 210/257] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新版本号 Log: Task: https://pms.uniontech.com/task-view-227573.html Influence: 版本号 Change-Id: Ida227d92a71124a9be325ac19d739cbdb2cfecf0 --- debian/changelog | 108 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/debian/changelog b/debian/changelog index 54c9d3b89..f9d04dc87 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,111 @@ +dde-dock (6.0.5.1) unstable; urgency=medium + + [ TagBuilder ] + * feat: 蓝牙插件适应快捷插件接口(Task: 121387)(Influence: 任务栏-快捷设置-蓝牙) + * fix: 修复高缩放率下启动器位置显示错误和无法设置智能隐藏的问题(Bug: 154513, 157413)(Influence: 前提:屏幕分辨率设置为1.25;1、任务栏设置为智能隐藏,将窗口拖动到任务栏下方,观察任务栏是否隐藏;2、观察启动器的位置是否正确) + * fix: 修复从任务栏拖动图标分屏后鼠标回到任务栏遮罩不消失的问题(Task: 181523)(Influence: 从任务栏拖动图标到桌面,不松手,然后再回到任务栏,观察遮罩是否消失) + * fix: 修复部分托盘无图标的问题(Bug: 160761)(Influence: 安全中心、授权管理等应用的托盘图标) + * fix: 修复跨端协同设备数量变化时列表页面显示不全的问题。(Influence: 跨端协同设备变化时,页面显示。) + * feat: 高效模式增加加载插件的功能(Task: 112073)(Influence: 高效模式下加载插件) + * feat: 适配v20插件加载(Task: 112073)(Influence: 加载v20插件) + * fix: 加载系统托盘插件(Task: 112073)(Influence: 插入U盘,查看托盘区域是否有U盘图标) + * fix: 托盘跟随高效模式调整任务栏位置(Task: 112073)(Influence: 高效模式下,调整任务栏位置,观察托盘区域是否正常) + * fix: 修复任务栏没有加载显示桌面和多任务视图的问题(Task: 112073)(Influence: 任务栏查看是否存在显示桌面和多任务栏视图的插件) + * feat: 图标增加toolTip和菜单(Task: 112073)(Influence: 鼠标放入到托盘区域、快捷插件区域,关机区域,观察是否存在toolTip,右键,观察是否弹出菜单) + * fix: 实现高效模式下托盘和快捷插件拖动功能(Task: 112073)(Influence: 高效模式,从托盘或快捷面板拖动图标到任务栏) + * feat: 快捷面板支持插件控制区域的显示(Task: 208579)(Influence: 快捷面板,观察声音、亮度调整和音乐播放等功能是否显示正常) + * feat: 声音插件适配v23(Task: 210309)(Influence: 观察任务栏是否存在声音插件) + * style: 消除编译警告信息(Task: 96831)(Influence: 无) + * fix: 删除编译警告(Task: 96831)(Influence: 无) + * style: 修改快捷区域key值(Task: 96831)(Influence: 无) + * fix: 修复快捷面板应用打开详细页面位置错误的问题(Task: 211641)(Influence: 从快捷面板展开蓝牙或者网络右侧的展开按钮,观察是否显示正常) + * fix: 解决任务栏跨端协同在paired状态变化后主动请求协同连接的问题。(Influence: 任务栏设备协同连接功能。) + * style: 枚举变量的信号传递去掉引用(Task: 96831)(Influence: 无) + * fix: 修复快捷面板没有刷新最新状态图的问题(Task: 208069)(Influence: 笔记本上打开快捷面板,拔掉电源或插上电源,观察电池状态是否发生变化) + * fix: 修改任务栏加载老版本插件的方式(Task: 112073)(Influence: 任务栏启动的时候,观察老版本的插件(例如U盘插件等其他v20插件)是否正常加载) + * fix: 优化快捷面板显示插件区域的方式(Task: 189527)(Influence: 打开快捷面板,观察插件是否正常显示) + * feat: 完善onboard插件的接口(Task: 212611)(Influence: 快捷面板观察onboard插件是否正常显示) + * fix: 修复时尚模型下图标铺满任务栏的显示问题(Task: 150049)(Influence: 时尚模式下,不断向任务栏添加图标,知道铺满,观察任务栏是否在屏幕可见区域内) + * fix: 适配最新版本的dtk(Task: 213083)(Influence: 无) + * fix: 修复声音设置错误(Task: 210309)(Influence: 打开快捷设置面板,通过滑动条来调整声音,观察声音是否在设置的范围内,同时观察主面板和子面板两边的声音滑动条是否同步) + * fix: 修复鼠标放到任务栏上拖动区域尺寸错误的问题(Task: 213103)(Influence: 任务栏在下方的时候,鼠标放入任务栏上方的位置,观察鼠标形状是否正常) + * fix: 修复关机图标与插件区域间距过大的问题(Task: 112073)(Influence: 高效模式下,观察关机图标与左右侧插件和时间的距离) + * fix: 修复高效模式下关机按钮显示文本的问题(Task: 112073)(Influence: 高效模式下,调整任务栏到最高,观察关机按钮的显示) + * fix: 修复托盘图标显示异常的问题(Task: 213361)(Influence: 观察输入法是否正常显示,将托盘图标从托盘拖动到任务栏,观察该图标是否在展开托盘图标和输入法中间) + * fix: 修复部分命令无法执行的问题(Task: 213403)(Influence: 任务栏关机命令观察是否正常执行) + * fix: 修复wayland下部分托盘的tooltips显示异常(Bug: 157821)(Influence: 进入wayland,打开音乐,鼠标放入到音乐图标上,观察是否正常显示提示消息) + * fix: 修复已打开应用缩略图显示位置偏差(Bug: 165775)(Influence: 鼠标放入到已经打开的应用的上方,观察预览图的位置显示是否正常) + * fix: 修复右键插件区域再单击弹出菜单的问题(Bug: 171559)(Influence: 右键插件区域,再左键,观察插件区域菜单是否正常显示) + * fix: 修复插件右键菜单不响应的问题(Bug: 164381)(Influence: 右键菜单区域,点击某个菜单项,观察是否正常响应) + * fix: 修复任务栏点击时间设置崩溃的问题(Bug: 171511)(Influence: 任务栏右键时间区域,打开时间设置,观察是否正常打开控制中心的时间设置) + * fix: 修复拖动无打开窗口触发分屏后自动打开应用的问题(Bug: 154349)(Influence: 从任务栏拖动一个没有打开窗口的应用,观察是否打开应用(正常情况下不会打开应用),释放鼠标,观察应用图标是否回到任务栏上) + * fix: 修复wayland下打开快捷面板tooltip没有隐藏的问题(Bug: 171551)(Influence: 进入wayland,鼠标放在任务栏的插件上,点击应用弹出快捷面板,观察toolTip是否消失) + * fix: 修复点击快捷面板之外的区域快捷面板不关闭的问题(Bug: 171545, 171583)(Influence: 进入wayland,打开快捷面板,点击快捷面板之外的其他区域,观察快捷面板是否关闭) + * fix: 去掉部分插件的右键菜单(Bug: 171753)(Influence: 右键蓝牙、声音等插件,观察是否有右键菜单) + * fix: 修复任务栏中拖拽图标到桌面区域图标消失的问题(Bug: 171539)(Influence: 将托盘图标从任务栏快速向上拖动,观察任务栏托盘的图标是否还存在) + * style: 修改函数接口调用(Task: 96831)(Influence: 无) + * fix: 同步启动器的修改(Bug: 147753)(Influence: 从启动器应用列表-拖拽到任务栏-回收站-卸载应用功能正常) + * fix: 修复从托盘拖动应用到任务栏上面图标显示异常的问题(Bug: 171493)(Influence: 将安全中心等图标从托盘拖动到任务栏,观察图标是否重复) + * feat: 增加返回给控制中心设置插件和托盘应用的接口(Task: 216841)(Influence: 无) + * fix: 修复移除插件后快捷面板显示异常的问题(Bug: 171579)(Influence: 不断插入或者移除蓝牙设备,观察快捷面板是否显示正常) + * fix: 修复关闭窗口特效下启动器按钮被遮挡的问题(Task: 216977)(Influence: 关闭窗口特效的时候,观察启动器按钮是否正常显示) + * fix: 修复快捷面板弹出位置不准确的问题(Bug: 172213)(Influence: 从任务栏不同的插件图标点击,观察弹出快捷面板的位置) + * fix: 电池插件不显示在快捷面板(Bug: 171713)(Influence: 从笔记本上,打开快捷面板,观察是否存在电池图标) + * fix: 修复高缩放率下无法点击快捷面板的问题(Task: 218215)(Influence: 在1.25倍缩放率下,展开快捷面板,点击网络插件展开按钮,观察是否可以展开) + * fix: 修复蓝牙列表中设备顺序与控制中心不一致的问题(Bug: 171513)(Influence: 打开快捷面板中的蓝牙列表,在多个设备同时存在的情况下,观察设备顺序是否和控制中心一致) + * chore: 设置日志格式(Task: 124695)(Influence: 无) + * fix: 修复音量插件调节最小刻度不是%2的问题(Bug: 172417)(Influence: 音量插件调节) + * fix: 修复亮度插件无法调整到100的问题(Bug: 171869)(Influence: 任务栏-亮度插件调节) + * fix: 修复插件展开列表名称显示错误的问题(Task: 218733)(Influence: 从快捷面板打开网络列表,观察标题是否为网络) + * fix: 修复快捷面板中音量调节不响应音量增强设置的问题(Bug: 171869)(Influence: 任务栏-音量插件-音量增强时的交互) + * fix: 解決协同连接设备时关闭协同服务总开关导致任务栏崩溃的问题。(Bug: 171741)(Influence: 协同连接设备.) + * fix: 从任务栏移除托盘图标后放入托盘区(Bug: 171497, 171539)(Influence: 将图标从任务栏移出,松手后图标自动移到托盘区) + * fix: 增加对控制中心设置不同主题下图标的接口(Bug: 172365)(Influence: 在控制中心切换主题,观察图标是否发生变化) + * fix: 去掉电池的右键菜单(Bug: 171753)(Influence: 右键电池插件,观察是否存在菜单) + * fix: 修复移除蓝牙设备后快捷面板依然显示的问题(Bug: 171533)(Influence: 从电脑上移除蓝牙设备,观察快捷区域和快捷面板是否还有蓝牙图标) + * fix: 修复从控制中心第一次连接需要密码的网络没有弹出网络面板的问题(Bug: 150395)(Influence: 从控制中心第一次连接需要密码的网络,观察任务栏是否显示网络列表) + * fix: 适配v20插件在任务栏的显示(Task: 112073)(Influence: 任务栏显示v20插件) + * fix: 修复插入新的蓝牙设备后其他蓝牙设备自动关闭的问题(Bug: 171477)(Influence: 系统中已经存在一个蓝牙设备,且是打开状态,打开快捷面板,进入蓝牙详情页面,插入新的蓝牙设备,观察之前的蓝牙设备是否自动关闭) + * fix: 修复快捷面板展开后点击任务栏应用无法打开的问题(Bug: 166029)(Influence: 打开快捷面板,再打开任务栏应用,观察是否在关闭快捷面板的同时打开了任务栏的应用) + * fix: 修复任务栏插件音量设备显示错误的问题(Bug: 165853)(Influence: 从任务栏打开音量,进入音量的详情页面,观察是否和控制中心一致) + * fix: 修复快捷面板蓝牙状态显示错误的问题(Bug: 171419)(Influence: 点击蓝牙图标,观察快捷面板蓝牙的打开或者关闭的状态) + * fix: 完善音量功能(Bug: 172429)(Influence: 从控制中心关闭设备,观察任务栏设备状态是否发生变化) + * feat: 插件增加标记(Task: 220099)(Influence: 任务栏插件) + * fix: 插件根据标记来决定插件的类型(Task: 220099)(Influence: 任务栏插件类型) + * feat: 增加display插件(Task: 220489)(Influence: 展开任务栏快捷面板,观察是否有亮度设置相关的功能) + * fix: 移除代码中对显示相关的插件的引用(Task: 220489)(Influence: 无) + * fix: 修复wayland下无法拖动任务栏的问题(Task: 220523)(Influence: 进入wayland,鼠标移动到任务栏边缘,观察鼠标形状是否改变,能否正常调整任务栏尺寸) + * fix: 修复快捷面板没有自动刷新图标的问题(Task: 220599)(Influence: 执行快捷面板中的截图图标,观察图标是否发生变化) + * fix: 新增或移除显示屏插件自动添加或删除(Task: 220489)(Influence: 拔出显示屏后再插入显示屏,观察任务栏快捷面板中的亮度设置插件是否发生变化) + * fix: 修复音量增强未响应的问题(Bug: 171869)(Influence: 任务栏-音量-音量增强) + * feat: 将音乐播放功能提取为单独的插件(Task: 220489)(Influence: 无) + * fix: dock代码中移除音乐插件(Task: 220489)(Influence: 打开音乐播放器,任务栏快捷面板中显示音乐播放面板) + * fix: 修复控制中心显示多条重复控件的问题(Bug: 171581)(Influence: 控制中心-个性化,观察蓝牙或者任务栏等插件是否只显示一次) + * feat: 增加回收站和电源插件在控制中心的显示和隐藏(Task: 216841)(Influence: 从控制中心勾选或者取消勾选回收站和电源插件,观察任务栏的变化) + * fix: 修复wayland下智能隐藏偶尔失效的问题(Bug: 154513)(Influence: 进入wayland,任务栏设置为智能隐藏,从任务栏打开一个窗口,观察智能隐藏是否有效果) + * fix: 修复wayland下高效模式设置任务栏struct失效的问题(Bug: 150637)(Influence: 进入wayland-任务栏设置为一直隐藏或智能隐藏,窗体最大化,让任务栏显示隐藏,观察任务栏窗体是否发生变化) + * docs: 更新插件开发文档(Task: 221667)(Influence: 无) + * feat: 任务栏适配不同主题的插件图标(Task: 222025)(Influence: 切换不同的主题,观察图标是否发生变化) + * fix: 插件适配不同主题图标(Task: 222025)(Influence: 切换主题,观察任务栏的图标和控制中心个性化中的图标是否发生了变化) + * fix: 去掉插件中读取禁用当前插件的配置(Bug: 175085)(Influence: 插入蓝牙观察是否有蓝牙图标) + * fix: 修复从任务栏拖出托盘应用后托盘不弹出的问题(Bug: 171497)(Influence: 从任务栏拖动微信或企业微信,观察托盘是否弹出) + * fix: 修改插件接口(Task: 222025)(Influence: 无) + * fix: 修复音量调节控件幅度不正确的问题(Bug: 172417)(Influence: 音量控件调节幅度) + * feat: 声音插件滚轮调节音量(Bug: 172417)(Influence: 将鼠标放在任务栏声音图标上,滚动滚轮,观察音量大小是否调节) + * fix: 修复U盘插件不显示的问题(Task: 223159)(Influence: 系统中使用v20的U盘插件,插入U盘,查看U盘图标是否显示) + * fix: 修复调整任务栏位置后显示错误的问题(Task: 218981)(Influence: 时尚模式下,将任务栏从下方调整在左侧,观察托盘面板显示是否正常) + * fix: 修复控制中心调整任务栏尺寸缓慢显示的问题(Bug: 171799)(Influence: 从控制中心个性化调整任务栏尺寸,观察任务栏的尺寸是否正常调整) + * chore: V23接口改造适配(Task: 207483)(Influence: 无) + * fix: 点击任务栏时间显示窗口呼出小组件面板(Task: 165407)(Influence: 点击任务栏时间窗口小组件是否显示。) + * fix: 声音调整改成新接口(Bug: 172417)(Influence: 鼠标移动到任务栏的声音图标,滚动鼠标,声音跟着调整) + * fix: 修复无法通过蓝牙主面板开启关闭蓝牙的问题(Bug: 171419)(Influence: 打开快捷面板,点击蓝牙图标,观察蓝牙是否正常开启和关闭) + * fix: 修复黑色背景下蓝牙列表名称颜色显示错误(Bug: 167961)(Influence: 改变主题,观察蓝牙列表设备名称的颜色是否改变) + * fix: 修复反复开关蓝牙导致的崩溃问题(Task: 226123)(Influence: 蓝牙开关功能) + * fix: 修复控制中心调节透明度对任务栏无作用的问题(Task: 226127)(Influence: 任务栏透明度调节) + * fix: 适配协同后端接口变化修改。(Bug: 176323)(Influence: 协同设备列表显示) + + -- zhaoyingzhen Tue, 13 Dec 2022 21:15:48 +0800 + dde-dock (6.0.4) unstable; urgency=medium [ Deepin Packages Builder ] From cb620469e36f903dda39691a5cb048fdfc5e34a0 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 26 Dec 2022 16:30:14 +0800 Subject: [PATCH 211/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=90=91?= =?UTF-8?q?=E4=B8=8A=E6=8B=96=E5=8A=A8=E5=9B=BE=E6=A0=87=E5=BC=95=E8=B5=B7?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=B4=A9=E6=BA=83=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加对drag类型的强判断,如果不为空,则替换图标 Log: 修复向上拖动图标引起任务栏崩溃的问题 Influence: 从任务栏向上拖动快捷图标,观察任务栏是否正常 Bug: https://pms.uniontech.com/bug-view-179427.html Change-Id: I7ec1dbf7403728b0ff1321a6f76dc05e9422868a --- frame/window/quickpluginwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index d5ec6c85f..7efafdf6e 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -302,9 +302,9 @@ void QuickPluginWindow::dragLeaveEvent(QDragLeaveEvent *event) { if (m_dragEnterMimeData) { QPoint mousePos = topLevelWidget()->mapFromGlobal(QCursor::pos()); - QuickIconDrag *drag = static_cast(m_dragEnterMimeData->drag()); + QuickIconDrag *drag = qobject_cast(m_dragEnterMimeData->drag()); if (!topLevelWidget()->rect().contains(mousePos) && drag) { - static_cast(m_dragEnterMimeData->drag())->useSourcePixmap(); + drag->useSourcePixmap(); } m_dragEnterMimeData = nullptr; } From 9619df590c297154a0b991b1c40fd7d2edd307d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Fri, 23 Dec 2022 10:03:32 +0800 Subject: [PATCH 212/257] =?UTF-8?q?fix:=20=E5=A3=B0=E9=9F=B3=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=BB=9A=E8=BD=AE=E8=B0=83=E8=8A=82=E9=9F=B3=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 未考虑音量增强的情况,以及修复音量在1时无法继续减少,在99时无法继续增加的问题 Log: Influence: 将鼠标放在任务栏声音图标上,滚动滚轮,观察音量大小是否调节 Bug: https://pms.uniontech.com/bug-view-172417.html Change-Id: I07878e9c967152698f4c72323b98f1ed19c9c41d --- plugins/sound/soundplugin.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 3313d4c3c..bd97c5d9a 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -191,16 +191,24 @@ bool SoundPlugin::eventHandler(QEvent *event) QDBusReply volumePath = volumeCall.reply(); double volume = volumePath.value().value(); + // 获取当前默认声音设备的最大音量 + DDBusSender audioDBus = DDBusSender().service("org.deepin.dde.Audio1") + .path("/org/deepin/dde/Audio1").interface("org.deepin.dde.Audio1"); + QDBusPendingCall call = audioDBus.property("MaxUIVolume").get(); + call.waitForFinished(); + QDBusReply maxVolumeReply = call.reply(); + double maxVolume = maxVolumeReply.value().value(); + // 根据滚轮的动作来增加音量或者减小音量 QWheelEvent *wheelEvent = static_cast(event); if (wheelEvent->angleDelta().y() > 0) { // 向上滚动,增大音量 - if (volume < 1) - sinkDBus.method("SetVolume").arg(volume + 0.02).arg(true).call(); + if (volume < maxVolume) + sinkDBus.method("SetVolume").arg(qMin(volume + 0.02, maxVolume)).arg(true).call(); } else { // 向下滚动,调小音量 if (volume > 0) - sinkDBus.method("SetVolume").arg(volume - 0.02).arg(true).call(); + sinkDBus.method("SetVolume").arg(qMax(volume - 0.02, 0.0)).arg(true).call(); } return true; From 253d0af770b14d03c15323525bc51a163c0ee5e2 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 23 Dec 2022 17:12:22 +0800 Subject: [PATCH 213/257] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E5=9C=A8=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一些插件无需在控制中心设置,必须在任务栏显示,例如截图计时、快捷插件组合图标等,因此,增加该接口对这类插件的处理 Log: 增加任务栏显示插件的标记 Influence: 截图,观察任务栏是否有计时的图标 Task: https://pms.uniontech.com/task-view-226407.html Bug: https://pms.uniontech.com/bug-view-179083.html Change-Id: Ifaa71182ee1d19633460db76302dc1ad094ab91f --- frame/window/quickpluginmodel.cpp | 5 ++--- interfaces/pluginsiteminterface.h | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index 190871af5..aa70f3b96 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -169,8 +169,8 @@ void QuickPluginModel::initConnection() if (quickWidget && !quickWidget->parentWidget()) quickWidget->setVisible(false); - // 用来读取已经固定在下方的插件 - if (!m_dockedPluginIndex.contains(itemInter->pluginName())) + // 用来读取已经固定在下方的插件或者强制显示的插件 + if (!m_dockedPluginIndex.contains(itemInter->pluginName()) && !(itemInter->flags() & Attribute_ForceDock)) return; m_dockedPluginsItems << itemInter; @@ -279,7 +279,6 @@ int QuickPluginModel::generaIndex(int insertIndex, int oldIndex) if (pluginDockIndex >= insertIndex) { m_dockedPluginIndex[itemInter->pluginName()]++; } - qInfo() << itemInter->pluginDisplayName() << m_dockedPluginIndex[itemInter->pluginName()]; } } } diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index a50daca7d..a04af6c5c 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -54,6 +54,7 @@ enum PluginFlag { Attribute_CanDrag = 0x200, // 插件属性-是否支持拖动 Attribute_CanInsert = 0x400, // 插件属性-是否支持在其前面插入其他的插件,普通的快捷插件是支持的 Attribute_CanSetting = 0x800, // 插件属性-是否可以在控制中心设置显示或隐藏 + Attribute_ForceDock = 0x1000, // 插件属性-强制显示在任务栏上 FlagMask = 0xffffffff // 掩码 }; From 105df289cc412889a211dd22d754a9d0c0056fff Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 27 Dec 2022 15:30:50 +0800 Subject: [PATCH 214/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E6=98=BE=E7=A4=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、开始菜单位置显示错误问题 2、应用图标显示错误问题 Log: 修复高缩放率下的显示问题 Influence: 设置高缩放率,观察开始菜单的位置,任务栏图标占满区域,左右位置,观察任务栏图标是否拥挤 Bug: https://pms.uniontech.com/bug-view-176421.html Change-Id: I038e28df2e9676fbfc8cf3732c6bee5c335f20d3 --- frame/window/mainpanelcontrol.cpp | 1 + frame/window/windowmanager.cpp | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index efc6531a8..c6f6df6d7 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -1255,6 +1255,7 @@ void MainPanelControl::resizeDockIcon() iconSize = (totalLength - yu) / iconCount; } + iconSize = iconSize / qApp->devicePixelRatio(); if ((m_position == Position::Top) || (m_position == Position::Bottom)) { if (iconSize >= height()) { calcuDockIconSize(height(), height(), tray_item_size); diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 71f5480d6..775c2c60d 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -676,8 +677,18 @@ void WindowManager::onRequestUpdateFrontendGeometry() if (rect.width() == 0 || rect.height() == 0) return; + int x = rect.x(); + int y = rect.y(); + QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + if (screen) { + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + x = (screen->handle()->geometry().width() - (rect.width() * qApp->devicePixelRatio())) / 2; + else + y = (screen->handle()->geometry().height() - (rect.height() * qApp->devicePixelRatio())) / 2; + } + DockInter dockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus()); - dockInter.SetFrontendWindowRect(int(rect.x()), int(rect.y()), uint(rect.width()), uint(rect.height())); + dockInter.SetFrontendWindowRect(x, y, uint(rect.width()), uint(rect.height())); } void WindowManager::onRequestNotifyWindowManager() From 4faedb08b8f064ba7f335ea00a6ed2759e20c3ed Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Fri, 30 Dec 2022 16:21:59 +0800 Subject: [PATCH 215/257] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=8D=8F?= =?UTF-8?q?=E5=90=8C=E6=9C=8D=E5=8A=A1=E5=B4=A9=E6=BA=83=E5=90=8E=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=88=97=E8=A1=A8=E4=B8=8D=E6=B8=85=E7=A9=BA=E5=92=8C?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B8=8D=E6=94=B9=E5=8F=98=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加dbus服务watcher,当后台服务崩溃后,清空设备列表。 Log: Bug: https://pms.uniontech.com/bug-view-179595.html Influence: 协同服务崩溃后,设备列表显示及设备状态。 Change-Id: I8464aaac631eb2379475fbfb65eaba3ab063448e --- plugins/display/collaborationdevmodel.cpp | 24 ++++++++++++++++++----- plugins/display/collaborationdevmodel.h | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/plugins/display/collaborationdevmodel.cpp b/plugins/display/collaborationdevmodel.cpp index 89cadfe65..26b016c04 100644 --- a/plugins/display/collaborationdevmodel.cpp +++ b/plugins/display/collaborationdevmodel.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -56,16 +57,19 @@ CollaborationDevModel::CollaborationDevModel(QObject *parent) m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface, "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); + + auto *dbusWatcher = new QDBusServiceWatcher(CollaborationService, m_colDbusInter->connection(), + QDBusServiceWatcher::WatchForUnregistration, this); + connect(dbusWatcher, &QDBusServiceWatcher::serviceUnregistered, this, [this](){ + qWarning() << CollaborationService << "unregistered"; + clear(); + }); } void CollaborationDevModel::checkServiceValid() { if (!m_colDbusInter->isValid()) { - for (CollaborationDevice *device : m_devices) { - device->deleteLater(); - } - m_devices.clear(); - Q_EMIT devicesChanged(); + clear(); } } @@ -126,6 +130,16 @@ void CollaborationDevModel::updateDevice(const QStringList &devPaths) emit devicesChanged(); } +void CollaborationDevModel::clear() +{ + for (CollaborationDevice *device : m_devices) { + device->deleteLater(); + } + m_devices.clear(); + + Q_EMIT devicesChanged(); +} + CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath) { return m_devices.value(machinePath, nullptr); diff --git a/plugins/display/collaborationdevmodel.h b/plugins/display/collaborationdevmodel.h index 6313d04dc..a48a02732 100644 --- a/plugins/display/collaborationdevmodel.h +++ b/plugins/display/collaborationdevmodel.h @@ -53,6 +53,7 @@ private slots: private: void updateDevice(const QStringList &devPaths); + void clear(); private: QDBusInterface *m_colDbusInter; From 05a98ac8b78c82bd4ea52cc65d5edbf4d977bc7f Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 3 Jan 2023 18:05:20 +0800 Subject: [PATCH 216/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E9=AB=98=E6=95=88=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=90=AF=E5=8A=A8=E5=99=A8=E4=BD=8D=E7=BD=AE=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高效模式下,启动器使用自己计算的坐标来处理 Log: 修复高缩放率下高效模式启动器位置错误 Influence: 高缩放率下进入高效模式,观察启动器的位置 Task: https://pms.uniontech.com/task-view-232903.html Change-Id: Ic0a40476e13f7d8fe83f5bf537388e0b4df339e0 --- frame/window/windowmanager.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 775c2c60d..4181ba1eb 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -679,12 +680,14 @@ void WindowManager::onRequestUpdateFrontendGeometry() int x = rect.x(); int y = rect.y(); - QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); - if (screen) { - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - x = (screen->handle()->geometry().width() - (rect.width() * qApp->devicePixelRatio())) / 2; - else - y = (screen->handle()->geometry().height() - (rect.height() * qApp->devicePixelRatio())) / 2; + if (m_displayMode == Dock::DisplayMode::Fashion) { + QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + if (screen) { + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + x = qMax(0, (int)((screen->handle()->geometry().width() - (rect.width() * qApp->devicePixelRatio())) / 2)); + else + y = qMax(0, (int)((screen->handle()->geometry().height() - (rect.height() * qApp->devicePixelRatio())) / 2)); + } } DockInter dockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus()); From 4cf80b7f32bd87652a8fcc5988e28423d1669553 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 30 Dec 2022 19:20:22 +0800 Subject: [PATCH 217/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=88=AA?= =?UTF-8?q?=E5=9B=BE=E6=8F=92=E4=BB=B6=E6=98=BE=E7=A4=BA=E5=B0=BA=E5=AF=B8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 判断插件的尺寸如果是自定义,则设置为插件自己的尺寸 Log: 修复截图插件的显示问题 Influence: 截图-查看截图计时插件是否正常显示 Bug: https://pms.uniontech.com/bug-view-179083.html Change-Id: Ia7f08f78429df68b045c074c3054aca388ae7ce4 --- frame/window/quickpluginwindow.cpp | 84 +++++++++++++++++++++++------- frame/window/quickpluginwindow.h | 5 +- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 7efafdf6e..d019b4e77 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -128,6 +128,7 @@ void QuickPluginWindow::setPositon(Position position) m_position = position; QuickSettingContainer::setPosition(position); + QuickDockItem::setPosition(position); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { m_mainLayout->setDirection(QBoxLayout::RightToLeft); m_mainLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); @@ -169,19 +170,27 @@ QSize QuickPluginWindow::suitableSize() const QSize QuickPluginWindow::suitableSize(const Dock::Position &position) const { - if (position == Dock::Position::Top || position == Dock::Position::Bottom) - return QSize((ITEMSPACE + ICONWIDTH) * m_mainLayout->count() + ITEMSPACE, ITEMSIZE); + if (position == Dock::Position::Top || position == Dock::Position::Bottom) { + int itemWidth = 0; + for (int i = 0; i < m_mainLayout->count(); i++) { + QWidget *itemWidget = m_mainLayout->itemAt(i)->widget(); + if (itemWidget) + itemWidth += itemWidget->width() + ITEMSPACE; + } + itemWidth += ITEMSPACE; - int height = 0; - int itemCount = m_mainLayout->count(); - if (itemCount > 0) { - // 每个图标占据的高度 - height += ICONHEIGHT * itemCount; - // 图标间距占据的高度 - height += ITEMSPACE * itemCount; + return QSize(itemWidth, ITEMSIZE); } - return QSize(ITEMSIZE, height); + int itemHeight = 0; + for (int i = 0; i < m_mainLayout->count(); i++) { + QWidget *itemWidget = m_mainLayout->itemAt(i)->widget(); + if (itemWidget) + itemHeight += itemWidget->height() + ITEMSPACE; + } + itemHeight += ITEMSPACE; + + return QSize(ITEMSIZE, itemHeight); } PluginsItemInterface *QuickPluginWindow::findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems) @@ -346,13 +355,8 @@ void QuickPluginWindow::onRequestUpdate() if (pluginItems.contains(item)) { itemWidget = pluginItems[item]; } else { - QJsonObject metaData; - QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(item); - if (pluginLoader) - metaData = pluginLoader->metaData().value("MetaData").toObject(); - itemWidget = new QuickDockItem(item, quickController->itemKey(item), this); - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + itemWidget->setFixedSize(itemWidget->suitableSize()); itemWidget->installEventFilter(this); itemWidget->setMouseTracking(true); countChanged = true; @@ -409,9 +413,11 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do if (dockPart != DockPart::QuickShow) return; - QuickDockItem *dockItem = getDockItemByPlugin(itemInter); - if (dockItem) - dockItem->update(); + QuickDockItem *quickDockItem = getDockItemByPlugin(itemInter); + if (quickDockItem) { + quickDockItem->setFixedSize(quickDockItem->suitableSize()); + quickDockItem->update(); + } } void QuickPluginWindow::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) @@ -591,11 +597,13 @@ void QuickPluginWindow::initConnection() * @param pluginItem * @param parent */ + +Dock::Position QuickDockItem::m_position(Dock::Position::Bottom); + QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent) : QWidget(parent) , m_pluginItem(pluginItem) , m_itemKey(itemKey) - , m_position(Dock::Position::Bottom) , m_popupWindow(new DockPopupWindow) , m_contextMenu(new QMenu(this)) , m_tipParent(nullptr) @@ -616,6 +624,11 @@ QuickDockItem::~QuickDockItem() m_popupWindow->deleteLater(); } +void QuickDockItem::setPosition(Dock::Position position) +{ + m_position = position; +} + PluginsItemInterface *QuickDockItem::pluginItem() { return m_pluginItem; @@ -631,6 +644,37 @@ void QuickDockItem::hideToolTip() m_popupWindow->hide(); } +QSize QuickDockItem::suitableSize() const +{ + if (m_pluginItem->pluginSizePolicy() == PluginsItemInterface::PluginSizePolicy::Custom) { + QPixmap pixmap = iconPixmap(); + if (!pixmap.isNull()) + return pixmap.size(); + + QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); + if (itemWidget) { + int itemWidth = ICONWIDTH; + int itemHeight = ICONHEIGHT; + QSize itemSize = itemWidget->sizeHint(); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + if (itemSize.width() > 0) + itemWidth = itemSize.width(); + if (itemSize.height() > 0 && itemSize.height() <= topLevelWidget()->height()) + itemHeight = itemSize.height(); + } else { + if (itemSize.width() > 0 && itemSize.width() < topLevelWidget()->width()) + itemWidth = itemSize.width(); + if (itemSize.height() > 0 && itemSize.height() < ICONHEIGHT) + itemHeight = itemSize.height(); + } + + return QSize(itemWidth, itemHeight); + } + } + + return QSize(ICONWIDTH, ICONHEIGHT); +} + void QuickDockItem::paintEvent(QPaintEvent *event) { if (!m_pluginItem) diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 64d37f301..1c2a58b34 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -100,10 +100,13 @@ public: explicit QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent = nullptr); ~QuickDockItem(); + static void setPosition(Dock::Position position); PluginsItemInterface *pluginItem(); bool canInsert() const; void hideToolTip(); + QSize suitableSize() const; + protected: void paintEvent(QPaintEvent *event) override; void mousePressEvent(QMouseEvent *event) override; @@ -129,7 +132,7 @@ private Q_SLOTS: private: PluginsItemInterface *m_pluginItem; QString m_itemKey; - Dock::Position m_position; + static Dock::Position m_position; DockPopupWindow *m_popupWindow; QMenu *m_contextMenu; QWidget *m_tipParent; From fe40557d5ccc18d31a402c9cdc70f637eedadd20 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Thu, 29 Dec 2022 15:13:59 +0800 Subject: [PATCH 218/257] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新版本号为:6.0.6 Log: Task: https://pms.uniontech.com/task-view-227573.html Influence: 版本号 Change-Id: Ibe80900e7b4b914561e0483e643e3d81b05d8b09 --- debian/changelog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debian/changelog b/debian/changelog index f9d04dc87..a0d8e9721 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +dde-dock (6.0.6.1) unstable; urgency=medium + + [ TagBuilder ] + * fix: 修复向上拖动图标引起任务栏崩溃的问题(Bug: 179427)(Influence: 从任务栏向上拖动快捷图标,观察任务栏是否正常) + * fix: 声音插件滚轮调节音量(Bug: 172417)(Influence: 将鼠标放在任务栏声音图标上,滚动滚轮,观察音量大小是否调节) + * fix: 增加强制在任务栏显示插件的接口(Task: 226407)(Bug: 179083)(Influence: 截图,观察任务栏是否有计时的图标) + * fix: 修复高缩放率下显示问题(Bug: 176421)(Influence: 设置高缩放率,观察开始菜单的位置,任务栏图标占满区域,左右位置,观察任务栏图标是否拥挤) + + -- zhaoyingzhen Thu, 29 Dec 2022 15:13:58 +0800 + dde-dock (6.0.5.1) unstable; urgency=medium [ TagBuilder ] From 9612bf2e114255f1d95a7027869db0a74d5fb86b Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 3 Jan 2023 13:23:56 +0800 Subject: [PATCH 219/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=98=BE=E7=A4=BA=E5=B0=BA=E5=AF=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在插件中绘制图像的时候,判断尺寸如果为自定义尺寸,则使用自定义尺寸来计算位置信息 Log: 修复插件的显示问题 Influence: 截图-查看截图计时插件是否正常显示 Bug: https://pms.uniontech.com/bug-view-179083.html Change-Id: I76953a099d67f1a0abfee9afc63f4c1fae59696e --- frame/window/quickpluginwindow.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index d019b4e77..d6d42ed98 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -681,8 +681,13 @@ void QuickDockItem::paintEvent(QPaintEvent *event) return QWidget::paintEvent(event); QPixmap pixmap = iconPixmap(); - QRect pixmapRect = QRect((rect().width() - ICONHEIGHT) / 2, (rect().height() - ICONHEIGHT) / 2, - ICONHEIGHT, ICONHEIGHT); + int width = ICONWIDTH; + int height = ICONHEIGHT; + if (m_pluginItem->pluginSizePolicy() == PluginsItemInterface::PluginSizePolicy::Custom) { + width = pixmap.width(); + height = pixmap.height(); + } + QRect pixmapRect = QRect(QPoint((rect().width() - width) / 2, (rect().height() - height) / 2), pixmap.size()); QPainter painter(this); painter.drawPixmap(pixmapRect, pixmap); From 17c2ba71f02ac6225890b690bc6a930460f696af Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Fri, 30 Dec 2022 16:40:27 +0800 Subject: [PATCH 220/257] =?UTF-8?q?fix:=20=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E5=8D=8F=E5=90=8C=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=AE=89=E5=8D=93?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加设备时过滤安卓设备。 Log: Task: https://pms.uniontech.com/task-view-233323.html Influence: 设备列表不显示安卓设备。 Change-Id: I48bb91b69d8c5f2312f1c6cb961b66d684a2cbf7 --- plugins/display/collaborationdevmodel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/display/collaborationdevmodel.cpp b/plugins/display/collaborationdevmodel.cpp index 26b016c04..4352a4b5a 100644 --- a/plugins/display/collaborationdevmodel.cpp +++ b/plugins/display/collaborationdevmodel.cpp @@ -173,7 +173,8 @@ CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent bool CollaborationDevice::isValid() const { - return m_isValid; + // not show android device + return m_isValid && m_OS != Android; } QString CollaborationDevice::name() const From d736fd0b49ca8f9a4b323b1215966aa18b29bbc6 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 5 Jan 2023 09:22:21 +0800 Subject: [PATCH 221/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E6=A1=88=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、将原来的使用电源修改为电源 2、删除禁用和启动插件接口的响应 3、根据需求,电池不在控制中心显示 Log: 修复文案显示错误 Influence: 任务栏最右侧的电源按钮 Bug: https://pms.uniontech.com/bug-view-180959.html Change-Id: I483619382bf59187c03dae25a1885d59bb5b865a --- plugins/power/powerplugin.cpp | 4 ++-- plugins/shutdown/shutdownplugin.cpp | 24 ++---------------------- plugins/shutdown/shutdownplugin.h | 2 -- 3 files changed, 4 insertions(+), 26 deletions(-) diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index 1a93de74e..473ab772c 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -153,11 +153,11 @@ QIcon PowerPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorTy PluginFlags PowerPlugin::flags() const { - // 电池插件只在任务栏上面展示,不在快捷面板展示,并且可以拖动,可以在其前面插入其他插件,可以在控制中心设置是否显示隐藏 + // 电池插件只在任务栏上面展示,不在快捷面板展示,并且可以拖动,可以在其前面插入其他插件,不能在控制中心设置是否显示隐藏 return PluginFlag::Type_Common | PluginFlag::Attribute_CanDrag | PluginFlag::Attribute_CanInsert - | PluginFlag::Attribute_CanSetting; + | PluginFlag::Attribute_ForceDock; } void PowerPlugin::updateBatteryVisible() diff --git a/plugins/shutdown/shutdownplugin.cpp b/plugins/shutdown/shutdownplugin.cpp index 1bd30f47c..f0c3256ed 100644 --- a/plugins/shutdown/shutdownplugin.cpp +++ b/plugins/shutdown/shutdownplugin.cpp @@ -63,7 +63,7 @@ const QString ShutdownPlugin::pluginName() const const QString ShutdownPlugin::pluginDisplayName() const { - return tr("Plugged In"); + return tr("Power"); } QWidget *ShutdownPlugin::itemWidget(const QString &itemKey) @@ -79,7 +79,7 @@ QWidget *ShutdownPlugin::itemTipsWidget(const QString &itemKey) // reset text every time to avoid size of LabelWidget not change after // font size be changed in ControlCenter - m_tipsLabel->setText(tr("Plugged In")); + m_tipsLabel->setText(tr("Power")); return m_tipsLabel.data(); } @@ -102,8 +102,6 @@ void ShutdownPlugin::init(PluginProxyInterface *proxyInter) void ShutdownPlugin::pluginStateSwitched() { m_proxyInter->saveValue(this, PLUGIN_STATE_KEY, !m_proxyInter->getValue(this, PLUGIN_STATE_KEY, true).toBool()); - - refreshPluginItemsVisible(); } bool ShutdownPlugin::pluginIsDisable() @@ -290,11 +288,6 @@ void ShutdownPlugin::setSortKey(const QString &itemKey, const int order) m_proxyInter->saveValue(this, key, order); } -void ShutdownPlugin::pluginSettingsChanged() -{ - refreshPluginItemsVisible(); -} - QIcon ShutdownPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { if (dockPart == DockPart::DCCSetting) { @@ -402,16 +395,3 @@ bool ShutdownPlugin::checkSwap() return hasSwap; } - -void ShutdownPlugin::refreshPluginItemsVisible() -{ - if (pluginIsDisable()) { - m_proxyInter->itemRemoved(this, pluginName()); - } else { - if (!m_pluginLoaded) { - loadPlugin(); - return; - } - m_proxyInter->itemAdded(this, pluginName()); - } -} diff --git a/plugins/shutdown/shutdownplugin.h b/plugins/shutdown/shutdownplugin.h index bbc7ecdb4..5ea1a1e80 100644 --- a/plugins/shutdown/shutdownplugin.h +++ b/plugins/shutdown/shutdownplugin.h @@ -60,7 +60,6 @@ public: int itemSortKey(const QString &itemKey) override; void setSortKey(const QString &itemKey, const int order) override; - void pluginSettingsChanged() override; QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; PluginFlags flags() const override; @@ -108,7 +107,6 @@ public: private: void loadPlugin(); bool checkSwap(); - void refreshPluginItemsVisible(); private: bool m_pluginLoaded; From 2bfa6acb53bbea454733bbe4a659112b06115563 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 4 Jan 2023 17:42:25 +0800 Subject: [PATCH 222/257] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 电源插件由使用电源改为电源 Log: 更新翻译文件 Influence: 任务栏-电源,观察电源的文本 Bug: https://pms.uniontech.com/bug-view-180959.html Change-Id: I7db971d8433e08ce1921b20b487cf6ae32fc5aca --- .gitignore | 3 ++- translations/dde-dock.ts | 10 ++++---- translations/dde-dock_af.ts | 4 ++-- translations/dde-dock_ak.ts | 2 +- translations/dde-dock_am_ET.ts | 4 ++-- translations/dde-dock_ar.ts | 26 ++++++++++----------- translations/dde-dock_ast.ts | 4 ++-- translations/dde-dock_az.ts | 40 ++++++++++++++++---------------- translations/dde-dock_bg.ts | 4 ++-- translations/dde-dock_bn.ts | 6 ++--- translations/dde-dock_bo.ts | 40 ++++++++++++++++---------------- translations/dde-dock_br.ts | 2 +- translations/dde-dock_ca.ts | 40 ++++++++++++++++---------------- translations/dde-dock_cs.ts | 36 ++++++++++++++--------------- translations/dde-dock_da.ts | 30 ++++++++++++------------ translations/dde-dock_de.ts | 40 ++++++++++++++++---------------- translations/dde-dock_el.ts | 34 +++++++++++++-------------- translations/dde-dock_en_AU.ts | 26 ++++++++++----------- translations/dde-dock_en_GB.ts | 4 ++-- translations/dde-dock_en_US.ts | 42 +++++++++++++++++----------------- translations/dde-dock_eo.ts | 2 +- translations/dde-dock_es.ts | 40 ++++++++++++++++---------------- translations/dde-dock_es_MX.ts | 6 ++--- translations/dde-dock_et.ts | 10 ++++---- translations/dde-dock_eu.ts | 2 +- translations/dde-dock_fa.ts | 22 +++++++++--------- translations/dde-dock_fi.ts | 34 +++++++++++++-------------- translations/dde-dock_fr.ts | 36 ++++++++++++++--------------- translations/dde-dock_gl_ES.ts | 28 +++++++++++------------ translations/dde-dock_he.ts | 4 ++-- translations/dde-dock_hi_IN.ts | 20 ++++++++-------- translations/dde-dock_hr.ts | 30 ++++++++++++------------ translations/dde-dock_hu.ts | 40 ++++++++++++++++---------------- translations/dde-dock_hy.ts | 2 +- translations/dde-dock_id.ts | 4 ++-- translations/dde-dock_it.ts | 36 ++++++++++++++--------------- translations/dde-dock_ja.ts | 30 ++++++++++++------------ translations/dde-dock_ka.ts | 8 +++---- translations/dde-dock_kab.ts | 24 +++++++++---------- translations/dde-dock_kk.ts | 2 +- translations/dde-dock_kn_IN.ts | 2 +- translations/dde-dock_ko.ts | 28 +++++++++++------------ translations/dde-dock_ku.ts | 2 +- translations/dde-dock_ku_IQ.ts | 2 +- translations/dde-dock_lo.ts | 2 +- translations/dde-dock_lt.ts | 26 ++++++++++----------- translations/dde-dock_mn.ts | 4 ++-- translations/dde-dock_ms.ts | 34 +++++++++++++-------------- translations/dde-dock_nb.ts | 4 ++-- translations/dde-dock_ne.ts | 6 ++--- translations/dde-dock_nl.ts | 36 ++++++++++++++--------------- translations/dde-dock_pa.ts | 4 ++-- translations/dde-dock_pam.ts | 4 ++-- translations/dde-dock_pl.ts | 42 +++++++++++++++++----------------- translations/dde-dock_pt.ts | 34 +++++++++++++-------------- translations/dde-dock_pt_BR.ts | 34 +++++++++++++-------------- translations/dde-dock_ro.ts | 28 +++++++++++------------ translations/dde-dock_ru.ts | 36 ++++++++++++++--------------- translations/dde-dock_si.ts | 28 +++++++++++------------ translations/dde-dock_sk.ts | 12 +++++----- translations/dde-dock_sl.ts | 34 +++++++++++++-------------- translations/dde-dock_sq.ts | 38 +++++++++++++++--------------- translations/dde-dock_sr.ts | 34 +++++++++++++-------------- translations/dde-dock_sv.ts | 4 ++-- translations/dde-dock_sw.ts | 2 +- translations/dde-dock_ta.ts | 4 ++-- translations/dde-dock_th.ts | 2 +- translations/dde-dock_tr.ts | 36 ++++++++++++++--------------- translations/dde-dock_tzm.ts | 10 ++++---- translations/dde-dock_ug.ts | 40 ++++++++++++++++---------------- translations/dde-dock_uk.ts | 40 ++++++++++++++++---------------- translations/dde-dock_vi.ts | 26 ++++++++++----------- translations/dde-dock_zh_CN.ts | 4 ++-- translations/dde-dock_zh_HK.ts | 4 ++-- translations/dde-dock_zh_TW.ts | 4 ++-- 75 files changed, 715 insertions(+), 712 deletions(-) diff --git a/.gitignore b/.gitignore index 92a677700..28981b52e 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,5 @@ dde-dock .vscode */dbusinterface/generation_dbus_interface/ -*/*/dbusinterface/generation_dbus_interface/ \ No newline at end of file +*/*/dbusinterface/generation_dbus_interface/ +.transifexrc diff --git a/translations/dde-dock.ts b/translations/dde-dock.ts index b7d5409cf..7889f6a9e 100644 --- a/translations/dde-dock.ts +++ b/translations/dde-dock.ts @@ -1,4 +1,6 @@ - + + + AbstractPluginsController @@ -379,8 +381,8 @@ Reboot - Plugged In - Plugged In + Power + Power @@ -472,4 +474,4 @@ The Dock is in safe mode, please exit to show it properly - \ No newline at end of file + diff --git a/translations/dde-dock_af.ts b/translations/dde-dock_af.ts index 3d441188c..6be97b2a8 100644 --- a/translations/dde-dock_af.ts +++ b/translations/dde-dock_af.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Oop @@ -211,7 +211,7 @@ Disabled - + Deaktiveerd diff --git a/translations/dde-dock_ak.ts b/translations/dde-dock_ak.ts index bab779404..bb715d0c3 100644 --- a/translations/dde-dock_ak.ts +++ b/translations/dde-dock_ak.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Open diff --git a/translations/dde-dock_am_ET.ts b/translations/dde-dock_am_ET.ts index b1e14e42a..07011c750 100644 --- a/translations/dde-dock_am_ET.ts +++ b/translations/dde-dock_am_ET.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + መክፈቻ @@ -211,7 +211,7 @@ Disabled - + ተሰናክሏል diff --git a/translations/dde-dock_ar.ts b/translations/dde-dock_ar.ts index 7b585aaa9..94db7e7e9 100644 --- a/translations/dde-dock_ar.ts +++ b/translations/dde-dock_ar.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + فتح BloothAdapterWidget My Devices - + أجهزتي Other Devices - + أجهزة أخرى @@ -107,11 +107,11 @@ Turn on - + تشغيل Turn off - + ايقاف @@ -122,11 +122,11 @@ Turn on - + تشغيل Turn off - + ايقاف @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + توقيت 12-ساعة 24-hour time - + توقيت 24-ساعة Time settings - + إعدادات الوقت @@ -211,7 +211,7 @@ Disabled - + معطل @@ -380,7 +380,7 @@ Plugged In - + وضع الطاقة @@ -398,7 +398,7 @@ Sound settings - + إعدادات الصوت diff --git a/translations/dde-dock_ast.ts b/translations/dde-dock_ast.ts index 26bbf942e..4b847bb7d 100644 --- a/translations/dde-dock_ast.ts +++ b/translations/dde-dock_ast.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Abrir @@ -211,7 +211,7 @@ Disabled - + Deshabilitau diff --git a/translations/dde-dock_az.ts b/translations/dde-dock_az.ts index 45e67303e..5808ac260 100644 --- a/translations/dde-dock_az.ts +++ b/translations/dde-dock_az.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + BloothAdapterWidget My Devices - + Mənim cihazlarım Other Devices - + Digər cihazlar @@ -107,11 +107,11 @@ Turn on - + Açmaq Turn off - + Söndürmək @@ -122,11 +122,11 @@ Turn on - + Açmaq Turn off - + Söndürmək @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 saat vaxt formatı 24-hour time - + 24 saat vaxt formatı Time settings - + Vaxt ayarları @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + PC ilə əməkdaşlıq @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + Çoxekranlı mübadilə HomeMonitorPlugin Enabled - + Aktivdir Disabled - + Aktiv deyil @@ -380,7 +380,7 @@ Plugged In - + Elektrik şəbəkəsinə qoşulu @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Çıxış cihazı Sound settings - + Səs ayarları @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Təhlükəsiz rejimdən çıxın Dock - Safe Mode - + Dok - Təhlükəsiz rejim The Dock is in safe mode, please exit to show it properly - + Dok təhlükəsiz rejimdədir, onun düzgün göstərilməsi üçün çıxın \ No newline at end of file diff --git a/translations/dde-dock_bg.ts b/translations/dde-dock_bg.ts index 0f4c2634e..d3192c9bf 100644 --- a/translations/dde-dock_bg.ts +++ b/translations/dde-dock_bg.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Отваряне @@ -211,7 +211,7 @@ Disabled - + Изключен diff --git a/translations/dde-dock_bn.ts b/translations/dde-dock_bn.ts index 712acef74..975aadc41 100644 --- a/translations/dde-dock_bn.ts +++ b/translations/dde-dock_bn.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + খুলুন @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + ব্লুটুথ Turn on @@ -211,7 +211,7 @@ Disabled - + অক্ষম diff --git a/translations/dde-dock_bo.ts b/translations/dde-dock_bo.ts index ae1b100e8..7ff883b82 100644 --- a/translations/dde-dock_bo.ts +++ b/translations/dde-dock_bo.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + ཁ་ཕྱེ་བ། BloothAdapterWidget My Devices - + ངའི་སྒྲིག་ཆས། Other Devices - + སྒྲིག་ཆས་གཞན། @@ -103,15 +103,15 @@ BluetoothMainWidget Bluetooth - + སོ་སྔོན། Turn on - + སོ་སྔོན་ཁ་ཕྱེ། Turn off - + སོ་སྔོན་ཁ་རྒྱོབ། @@ -122,11 +122,11 @@ Turn on - + སོ་སྔོན་ཁ་ཕྱེ། Turn off - + སོ་སྔོན་ཁ་རྒྱོབ། @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + ཆུ་ཚོད་12ཀྱི་ལུགས། 24-hour time - + ཆུ་ཚོད་24ཡི་ལུགས། Time settings - + དུས་ཚོད་སྒྲིག་འགོད། @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + གློག་ཀླད་མཐུན་སྦྱོར་སྒྲིག་འགོད། HomeMonitorPlugin Enabled - + འགོ་སློང་། Disabled - + སྤྱོད་མི་ཆོག @@ -380,7 +380,7 @@ Plugged In - + གློག་ཁུངས་སྤྱོད་པ། @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + ཕྱིར་འདྲེན་སྒྲིག་ཆས། Sound settings - + སྐད་གདངས་སྒྲིག་འགོད། @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + བདེ་འཇགས་དཔེ་རྣམ་ལས་ཕྱིར་དོན་པ། Dock - Safe Mode - + ལས་འགན་ཚན་བྱང་གི་བདེ་འཇགས་དཔེ་རྣམ། The Dock is in safe mode, please exit to show it properly - + ལས་འགན་ཚན་བྱང་བདེ་འཇགས་དཔེ་རྣམ་ནང་མཛུལ་ཟིན་པས། བདེ་འཇགས་དཔེ་རྣམ་ལས་ཕྱིར་དོན་རྗེས་རྒྱུན་ལྡན་ལྟར་ཤར་ཐུབ། \ No newline at end of file diff --git a/translations/dde-dock_br.ts b/translations/dde-dock_br.ts index 49d169275..9456acb59 100644 --- a/translations/dde-dock_br.ts +++ b/translations/dde-dock_br.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Digeriñ diff --git a/translations/dde-dock_ca.ts b/translations/dde-dock_ca.ts index a8addac84..e0d717041 100644 --- a/translations/dde-dock_ca.ts +++ b/translations/dde-dock_ca.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Obre BloothAdapterWidget My Devices - + Els meus dispositius Other Devices - + Altres dispositius @@ -107,11 +107,11 @@ Turn on - + Activa Turn off - + Atura @@ -122,11 +122,11 @@ Turn on - + Activa Turn off - + Atura @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 hores 24-hour time - + 24 hores Time settings - + Configuració de l'hora @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + Col·laboració de PC @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + Col·laboració multipantalla HomeMonitorPlugin Enabled - + Habilitat Disabled - + Inhabilitat @@ -380,7 +380,7 @@ Plugged In - + Connectat @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Dispositiu de sortida Sound settings - + Configuració del so @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Surt del mode segur Dock - Safe Mode - + Acoblador - Mode segur The Dock is in safe mode, please exit to show it properly - + L'acoblador està en mode segur. Si us plau, sortiu-ne perquè es mostri adequadament. \ No newline at end of file diff --git a/translations/dde-dock_cs.ts b/translations/dde-dock_cs.ts index df0eedfb1..485a1e44c 100644 --- a/translations/dde-dock_cs.ts +++ b/translations/dde-dock_cs.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Otevřít BloothAdapterWidget My Devices - + Má zařízení Other Devices - + Ostatní zařízení @@ -107,11 +107,11 @@ Turn on - + Zapnout Turn off - + Vypnout @@ -122,11 +122,11 @@ Turn on - + Zapnout Turn off - + Vypnout @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 hodinový čas 24-hour time - + 24 hodinový čas Time settings - + Nastavení času @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + Zapnuto Disabled - + Zakázáno @@ -380,7 +380,7 @@ Plugged In - + Napájení z elektrické sítě @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Výstupní zařízení Sound settings - + Nastavení zvuku @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Ukončit náhradní režim Dock - Safe Mode - + Panel – náhradní režim The Dock is in safe mode, please exit to show it properly - + Dok je v náhradním režimu – ukončete, aby se zobrazil správně \ No newline at end of file diff --git a/translations/dde-dock_da.ts b/translations/dde-dock_da.ts index b1e721c34..0f2465c54 100644 --- a/translations/dde-dock_da.ts +++ b/translations/dde-dock_da.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Åbn BloothAdapterWidget My Devices - + Mine Enheder Other Devices - + Andre Enheder @@ -107,11 +107,11 @@ Turn on - + Tænd Turn off - + Sluk @@ -122,11 +122,11 @@ Turn on - + Tænd Turn off - + Sluk @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-timers klokkeslæt 24-hour time - + 24-timers klokkeslæt Time settings - + Tidsindstillinger @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + Aktiveret Disabled - + Deaktiveret @@ -380,7 +380,7 @@ Plugged In - + Tilsluttet @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Udgående Enhed Sound settings - + Lydindstillinger diff --git a/translations/dde-dock_de.ts b/translations/dde-dock_de.ts index ccc6ac5d4..e33803b13 100644 --- a/translations/dde-dock_de.ts +++ b/translations/dde-dock_de.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Öffnen BloothAdapterWidget My Devices - + Meine Geräte Other Devices - + Andere Geräte @@ -107,11 +107,11 @@ Turn on - + Einschalten Turn off - + Ausschalten @@ -122,11 +122,11 @@ Turn on - + Einschalten Turn off - + Ausschalten @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-Stunden-Zeit 24-hour time - + 24-Stunden-Zeit Time settings - + Zeiteinstellungen @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + PC-Zusammenarbeit @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + Bildschirmübergreifende Zusammenarbeit HomeMonitorPlugin Enabled - + Aktiviert Disabled - + Deaktiviert @@ -380,7 +380,7 @@ Plugged In - + Angeschlossen @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Ausgabegerät Sound settings - + Toneinstellungen @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Abgesicherten Modus beenden Dock - Safe Mode - + Dock - Abgesicherter Modus The Dock is in safe mode, please exit to show it properly - + Das Dock befindet sich im abgesicherten Modus, bitte beenden, um es richtig anzuzeigen \ No newline at end of file diff --git a/translations/dde-dock_el.ts b/translations/dde-dock_el.ts index 1a5854286..475d11d96 100644 --- a/translations/dde-dock_el.ts +++ b/translations/dde-dock_el.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Άνοιγμα BloothAdapterWidget My Devices - + Οι Συσκευές μου Other Devices - + Άλλες Συσκευές @@ -107,11 +107,11 @@ Turn on - + Ενεργοποίηση Turn off - + Απενεργοποίηση @@ -122,11 +122,11 @@ Turn on - + Ενεργοποίηση Turn off - + Απενεργοποίηση @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-ωρη ώρα 24-hour time - + 24-ωρη ώρα Time settings - + Ρυθμίσεις ώρας @@ -211,7 +211,7 @@ Disabled - + Απενεργοποιημένο @@ -380,7 +380,7 @@ Plugged In - + Στην πρίζα @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Συσκευή Εξόδου Sound settings - + Ρυθμίσεις ήχου @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Έξοδος Ασφαλής Λειτουργίας Dock - Safe Mode - + Γραμμή Εργασιών - Ασφαλής Λειτουργία The Dock is in safe mode, please exit to show it properly - + Η Γραμμή Εργασιών είναι σε ασφαλή λειτουργία, παρακαλώ αποχωρήστε για να εμφανιστεί σωστά \ No newline at end of file diff --git a/translations/dde-dock_en_AU.ts b/translations/dde-dock_en_AU.ts index 35c41e40f..c620297ee 100644 --- a/translations/dde-dock_en_AU.ts +++ b/translations/dde-dock_en_AU.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Open BloothAdapterWidget My Devices - + My Devices Other Devices - + Other Devices @@ -107,11 +107,11 @@ Turn on - + Turn on Turn off - + Turn off @@ -122,11 +122,11 @@ Turn on - + Turn on Turn off - + Turn off @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-hour time 24-hour time - + 24-hour time Time settings - + Time settings @@ -211,7 +211,7 @@ Disabled - + Disabled @@ -380,7 +380,7 @@ Plugged In - + Plugged In @@ -398,7 +398,7 @@ Sound settings - + Sound settings diff --git a/translations/dde-dock_en_GB.ts b/translations/dde-dock_en_GB.ts index e193b6530..3ed822c51 100644 --- a/translations/dde-dock_en_GB.ts +++ b/translations/dde-dock_en_GB.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Open @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on diff --git a/translations/dde-dock_en_US.ts b/translations/dde-dock_en_US.ts index f3e8bacec..a97b5ae6e 100644 --- a/translations/dde-dock_en_US.ts +++ b/translations/dde-dock_en_US.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Open BloothAdapterWidget My Devices - + My Devices Other Devices - + Other Devices @@ -103,15 +103,15 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on - + Turn on Turn off - + Turn off @@ -122,11 +122,11 @@ Turn on - + Turn on Turn off - + Turn off @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-hour time 24-hour time - + 24-hour time Time settings - + Time settings @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + PC collaboration @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + Multi-Screen Collaboration HomeMonitorPlugin Enabled - + Enabled Disabled - + Disabled @@ -380,7 +380,7 @@ Plugged In - + Plugged In @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Output Device Sound settings - + Sound settings @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Exit Safe Mode Dock - Safe Mode - + Dock - Safe Mode The Dock is in safe mode, please exit to show it properly - + The Dock is in safe mode, please exit to show it properly \ No newline at end of file diff --git a/translations/dde-dock_eo.ts b/translations/dde-dock_eo.ts index a60fa3b31..23cfcce07 100644 --- a/translations/dde-dock_eo.ts +++ b/translations/dde-dock_eo.ts @@ -211,7 +211,7 @@ Disabled - + Malŝaltita diff --git a/translations/dde-dock_es.ts b/translations/dde-dock_es.ts index a0061250a..c6fc8f427 100644 --- a/translations/dde-dock_es.ts +++ b/translations/dde-dock_es.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Abrir BloothAdapterWidget My Devices - + Mis dispositivos Other Devices - + Otros dispositivos @@ -107,11 +107,11 @@ Turn on - + Activar Turn off - + Desactivar @@ -122,11 +122,11 @@ Turn on - + Activar Turn off - + Desactivar @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Formato de 12 horas 24-hour time - + Formato de 24 horas Time settings - + Ajustes de fecha y hora @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + Colaboración de PC @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + Colaboración multipantalla HomeMonitorPlugin Enabled - + Activado Disabled - + Desactivado @@ -380,7 +380,7 @@ Plugged In - + Enchufado @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Dispositivo de salida Sound settings - + Ajustes de sonido @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Salir del modo seguro Dock - Safe Mode - + Muelle - Modo seguro The Dock is in safe mode, please exit to show it properly - + El muelle está en modo seguro, por favor salga para verlo correctamente \ No newline at end of file diff --git a/translations/dde-dock_es_MX.ts b/translations/dde-dock_es_MX.ts index d6ae36f8d..c42736e14 100644 --- a/translations/dde-dock_es_MX.ts +++ b/translations/dde-dock_es_MX.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Abrir @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on @@ -211,7 +211,7 @@ Disabled - + Deshabilitado diff --git a/translations/dde-dock_et.ts b/translations/dde-dock_et.ts index b129aab35..5773ae29f 100644 --- a/translations/dde-dock_et.ts +++ b/translations/dde-dock_et.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Ava @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on @@ -148,7 +148,7 @@ Time settings - + Kellaaja seaded @@ -380,7 +380,7 @@ Plugged In - + Võrgutoitel @@ -398,7 +398,7 @@ Sound settings - + Heli seaded diff --git a/translations/dde-dock_eu.ts b/translations/dde-dock_eu.ts index 5c2cd5aa5..9b96058b4 100644 --- a/translations/dde-dock_eu.ts +++ b/translations/dde-dock_eu.ts @@ -337,7 +337,7 @@ ShowDesktopPlugin Show Desktop - + Erakutsi mahaigaina Undock diff --git a/translations/dde-dock_fa.ts b/translations/dde-dock_fa.ts index c88bb4d2c..23e517c77 100644 --- a/translations/dde-dock_fa.ts +++ b/translations/dde-dock_fa.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + باز کردن @@ -107,11 +107,11 @@ Turn on - + روشن کردن Turn off - + خاموش کردن @@ -122,11 +122,11 @@ Turn on - + روشن کردن Turn off - + خاموش کردن @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + زمان 12-ساعته 24-hour time - + زمان 24-ساعته Time settings - + تنظیمات زمان @@ -211,7 +211,7 @@ Disabled - + غیر فعال @@ -380,7 +380,7 @@ Plugged In - + متصل شده به برق @@ -398,7 +398,7 @@ Sound settings - + تنظیمات صدا diff --git a/translations/dde-dock_fi.ts b/translations/dde-dock_fi.ts index 9185a88cc..56d0c3b66 100644 --- a/translations/dde-dock_fi.ts +++ b/translations/dde-dock_fi.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Avaa BloothAdapterWidget My Devices - + Omat laitteet Other Devices - + Muut laitteet @@ -107,11 +107,11 @@ Turn on - + Kytke käyttöön Turn off - + Poista käytöstä @@ -122,11 +122,11 @@ Turn on - + Kytke käyttöön Turn off - + Poista käytöstä @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12h aika 24-hour time - + 24h aika Time settings - + Aika-asetukset @@ -211,7 +211,7 @@ Disabled - + Suljettu @@ -380,7 +380,7 @@ Plugged In - + Kytketty @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Ulostulon laite Sound settings - + Ääniasetukset @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Poistu vikasietotilasta Dock - Safe Mode - + Paneeli - vikasietotila The Dock is in safe mode, please exit to show it properly - + Paneeli on vikasietotilassa. Poistu nähtyäsi sen toimivan oikein \ No newline at end of file diff --git a/translations/dde-dock_fr.ts b/translations/dde-dock_fr.ts index 823e2695d..d5914c562 100644 --- a/translations/dde-dock_fr.ts +++ b/translations/dde-dock_fr.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Ouvrir BloothAdapterWidget My Devices - + Mes appareils Other Devices - + Autres appareils @@ -107,11 +107,11 @@ Turn on - + Allumer Turn off - + Éteindre @@ -122,11 +122,11 @@ Turn on - + Allumer Turn off - + Éteindre @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Affichage 12 heures 24-hour time - + Affichage 24 heures Time settings - + Réglages de l'heure @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + Activé Disabled - + Désactivé @@ -380,7 +380,7 @@ Plugged In - + Branché @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Périphérique de sortie Sound settings - + Paramètres sonores @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Mode sans échec de sortie Dock - Safe Mode - + Dock - Mode sans échec The Dock is in safe mode, please exit to show it properly - + Le Dock est en mode sans échec, veuillez quitter pour l'afficher correctement \ No newline at end of file diff --git a/translations/dde-dock_gl_ES.ts b/translations/dde-dock_gl_ES.ts index 65611f43c..732d76e21 100644 --- a/translations/dde-dock_gl_ES.ts +++ b/translations/dde-dock_gl_ES.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Abrir BloothAdapterWidget My Devices - + Os meus dispositivos Other Devices - + Outros dispositivos @@ -107,11 +107,11 @@ Turn on - + Acender Turn off - + Apagar @@ -122,11 +122,11 @@ Turn on - + Acender Turn off - + Apagar @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + formato 12 horas 24-hour time - + formato 24 horas Time settings - + Axustes da hora @@ -211,7 +211,7 @@ Disabled - + Desactivado @@ -380,7 +380,7 @@ Plugged In - + Enchufado @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Dispositivo de saída Sound settings - + Configuración do son diff --git a/translations/dde-dock_he.ts b/translations/dde-dock_he.ts index d64ac8b1a..0339b287f 100644 --- a/translations/dde-dock_he.ts +++ b/translations/dde-dock_he.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + פתיחה @@ -211,7 +211,7 @@ Disabled - + מושבת diff --git a/translations/dde-dock_hi_IN.ts b/translations/dde-dock_hi_IN.ts index 6753a79d5..80ccf9dc3 100644 --- a/translations/dde-dock_hi_IN.ts +++ b/translations/dde-dock_hi_IN.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + खोलें @@ -107,11 +107,11 @@ Turn on - + ऑन करें Turn off - + ऑफ करें @@ -122,11 +122,11 @@ Turn on - + ऑन करें Turn off - + ऑफ करें @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 घंटे का समय 24-hour time - + 24 घंटे का समय Time settings - + समय सेवाएं @@ -211,7 +211,7 @@ Disabled - + बंद किया हुआ है @@ -398,7 +398,7 @@ Sound settings - + ध्वनि सेटिंग्स diff --git a/translations/dde-dock_hr.ts b/translations/dde-dock_hr.ts index 760f9028d..e821f9879 100644 --- a/translations/dde-dock_hr.ts +++ b/translations/dde-dock_hr.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Otvori BloothAdapterWidget My Devices - + Moji uređaji Other Devices - + Ostali uređaji @@ -107,11 +107,11 @@ Turn on - + Uključi Turn off - + Isključi @@ -122,11 +122,11 @@ Turn on - + Uključi Turn off - + Isključi @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-satno vrijeme 24-hour time - + 24-satno vrijeme Time settings - + Postavke vremena @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + Omogućeno Disabled - + Onemogućeno @@ -380,7 +380,7 @@ Plugged In - + Priključeno @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Izlazni uređaj Sound settings - + Postavke zvuka diff --git a/translations/dde-dock_hu.ts b/translations/dde-dock_hu.ts index 8b10918e4..df8e06bef 100644 --- a/translations/dde-dock_hu.ts +++ b/translations/dde-dock_hu.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Megnyitás BloothAdapterWidget My Devices - + Eszközeim Other Devices - + Egyéb eszközök @@ -107,11 +107,11 @@ Turn on - + Bekapcsolás Turn off - + Kikapcsolás @@ -122,11 +122,11 @@ Turn on - + Bekapcsolás Turn off - + Kikapcsolás @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 órás időformátum 24-hour time - + 24 órás időformátum Time settings - + Idő beállításai @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + PC együttműködés @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + Többképernyős együttműködés HomeMonitorPlugin Enabled - + Engedélyezve Disabled - + Letiltva @@ -380,7 +380,7 @@ Plugged In - + Áramforráshoz csatlakoztatva @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Kimeneti eszköz Sound settings - + Hang beállítások @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Kilépés a biztonságos módból Dock - Safe Mode - + Dokkoló - Biztonságos mód The Dock is in safe mode, please exit to show it properly - + A Dokkoló biztonságos módban van. Kérjük lépjen ki a megfelelő megjelenítéshez \ No newline at end of file diff --git a/translations/dde-dock_hy.ts b/translations/dde-dock_hy.ts index 001fc744e..b4d8ae30e 100644 --- a/translations/dde-dock_hy.ts +++ b/translations/dde-dock_hy.ts @@ -211,7 +211,7 @@ Disabled - + Անջատված է diff --git a/translations/dde-dock_id.ts b/translations/dde-dock_id.ts index d91c024c2..55258a510 100644 --- a/translations/dde-dock_id.ts +++ b/translations/dde-dock_id.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Buka @@ -211,7 +211,7 @@ Disabled - + Nonaktifkan diff --git a/translations/dde-dock_it.ts b/translations/dde-dock_it.ts index 28b16bb85..477e41fb8 100644 --- a/translations/dde-dock_it.ts +++ b/translations/dde-dock_it.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Apri BloothAdapterWidget My Devices - + I miei dispositivi Other Devices - + Altri dispositivi @@ -107,11 +107,11 @@ Turn on - + Attiva Turn off - + Disattiva @@ -122,11 +122,11 @@ Turn on - + Attiva Turn off - + Disattiva @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Formato 12 ore 24-hour time - + Formato 24 ore Time settings - + Impostazioni orarie @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + Attivo Disabled - + Disabilitato @@ -380,7 +380,7 @@ Plugged In - + Collegato al caricabatteria @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Dispositivo output Sound settings - + Impostazioni audio @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Esci dalla modalità provvisoria Dock - Safe Mode - + Dock - Modalità provvisoria The Dock is in safe mode, please exit to show it properly - + La Dock è in modalità provvisoria, esci per mostrarla in modo tradizionale \ No newline at end of file diff --git a/translations/dde-dock_ja.ts b/translations/dde-dock_ja.ts index 86d7e718d..d6cefc3fc 100644 --- a/translations/dde-dock_ja.ts +++ b/translations/dde-dock_ja.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + 開く BloothAdapterWidget My Devices - + お使いのデバイス Other Devices - + 他のデバイス @@ -107,11 +107,11 @@ Turn on - + オンにする Turn off - + オフにする @@ -122,11 +122,11 @@ Turn on - + オンにする Turn off - + オフにする @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12時間表示 24-hour time - + 24時間表示 Time settings - + 時間設定 @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + 有効 Disabled - + 無効 @@ -380,7 +380,7 @@ Plugged In - + 電源接続時 @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + 出力デバイス Sound settings - + サウンドの設定 diff --git a/translations/dde-dock_ka.ts b/translations/dde-dock_ka.ts index ebfe77a92..c3e93fc6b 100644 --- a/translations/dde-dock_ka.ts +++ b/translations/dde-dock_ka.ts @@ -54,11 +54,11 @@ BloothAdapterWidget My Devices - + ჩემი მოწყობილობები Other Devices - + სხვა მოწყობილობები @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on @@ -211,7 +211,7 @@ Disabled - + გაუქმებულია diff --git a/translations/dde-dock_kab.ts b/translations/dde-dock_kab.ts index 5cf655a69..b3de2f876 100644 --- a/translations/dde-dock_kab.ts +++ b/translations/dde-dock_kab.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Ldi BloothAdapterWidget My Devices - + Ibenkan-inu Other Devices - + Ibenkan-nniḍen @@ -103,15 +103,15 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on - + Sermed Turn off - + Sens @@ -122,11 +122,11 @@ Turn on - + Sermed Turn off - + Sens @@ -148,7 +148,7 @@ Time settings - + Iɣewwaren n wakud @@ -211,7 +211,7 @@ Disabled - + Yensa @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Ibenk n tuffɣa Sound settings - + Iɣewwaren n yimesli diff --git a/translations/dde-dock_kk.ts b/translations/dde-dock_kk.ts index 2693a75c0..68c0aa31b 100644 --- a/translations/dde-dock_kk.ts +++ b/translations/dde-dock_kk.ts @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on diff --git a/translations/dde-dock_kn_IN.ts b/translations/dde-dock_kn_IN.ts index af505a4db..eb9292b32 100644 --- a/translations/dde-dock_kn_IN.ts +++ b/translations/dde-dock_kn_IN.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + ತೆರೆಯಿರಿ diff --git a/translations/dde-dock_ko.ts b/translations/dde-dock_ko.ts index 8b0cd8be7..f401ce1dc 100644 --- a/translations/dde-dock_ko.ts +++ b/translations/dde-dock_ko.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + 열기 BloothAdapterWidget My Devices - + 내 장치 Other Devices - + 기타 장치 @@ -107,11 +107,11 @@ Turn on - + 켜기 Turn off - + 끄기 @@ -122,11 +122,11 @@ Turn on - + 켜기 Turn off - + 끄기 @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 시간 24-hour time - + 24시간 Time settings - + 시간 설정 @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + 활성상태 Disabled - + 사용안함 @@ -380,7 +380,7 @@ Plugged In - + 연결됨 @@ -398,7 +398,7 @@ Sound settings - + 사운드 설정 diff --git a/translations/dde-dock_ku.ts b/translations/dde-dock_ku.ts index 667178f4f..8fec1e232 100644 --- a/translations/dde-dock_ku.ts +++ b/translations/dde-dock_ku.ts @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on diff --git a/translations/dde-dock_ku_IQ.ts b/translations/dde-dock_ku_IQ.ts index 227ad681b..bd66c8756 100644 --- a/translations/dde-dock_ku_IQ.ts +++ b/translations/dde-dock_ku_IQ.ts @@ -211,7 +211,7 @@ Disabled - + ناچالاککراو diff --git a/translations/dde-dock_lo.ts b/translations/dde-dock_lo.ts index ba67c5320..2d692bc80 100644 --- a/translations/dde-dock_lo.ts +++ b/translations/dde-dock_lo.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + ເປີດ diff --git a/translations/dde-dock_lt.ts b/translations/dde-dock_lt.ts index 8103714de..d9e01d160 100644 --- a/translations/dde-dock_lt.ts +++ b/translations/dde-dock_lt.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Atverti BloothAdapterWidget My Devices - + Mano įrenginiai Other Devices - + Kiti įrenginiai @@ -107,11 +107,11 @@ Turn on - + Įjungti Turn off - + Išjungti @@ -122,11 +122,11 @@ Turn on - + Įjungti Turn off - + Išjungti @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 valandų laikas 24-hour time - + 24 valandų laikas Time settings - + Laiko nustatymai @@ -211,7 +211,7 @@ Disabled - + Išjungta @@ -380,7 +380,7 @@ Plugged In - + Elektros maitinimas @@ -398,7 +398,7 @@ Sound settings - + Garso nustatymai diff --git a/translations/dde-dock_mn.ts b/translations/dde-dock_mn.ts index bb82d3a8a..fe09342bc 100644 --- a/translations/dde-dock_mn.ts +++ b/translations/dde-dock_mn.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Нээх @@ -211,7 +211,7 @@ Disabled - + Идэвхигүй болсон diff --git a/translations/dde-dock_ms.ts b/translations/dde-dock_ms.ts index 22a80857b..3f22bf174 100644 --- a/translations/dde-dock_ms.ts +++ b/translations/dde-dock_ms.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Buka BloothAdapterWidget My Devices - + Peranti Saya Other Devices - + Peranti Lain @@ -107,11 +107,11 @@ Turn on - + Hidupkan Turn off - + Matikan @@ -122,11 +122,11 @@ Turn on - + Hidupkan Turn off - + Matikan @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Waktu 12-jam 24-hour time - + Waktu 24-jam Time settings - + Tetapan waktu @@ -211,7 +211,7 @@ Disabled - + Dilumpuhkan @@ -380,7 +380,7 @@ Plugged In - + Dipalam masuk @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Peranti output Sound settings - + Tetapan bunyi @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Keluar dari Mod Selamat Dock - Safe Mode - + Labuh - Mod Selamat The Dock is in safe mode, please exit to show it properly - + Labuh dalam mod selamat, sila keluar dahulu supaya dapat dipaparkan dengan baik \ No newline at end of file diff --git a/translations/dde-dock_nb.ts b/translations/dde-dock_nb.ts index 69d243d05..aee65f4cc 100644 --- a/translations/dde-dock_nb.ts +++ b/translations/dde-dock_nb.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Åpne @@ -211,7 +211,7 @@ Disabled - + Deaktiver diff --git a/translations/dde-dock_ne.ts b/translations/dde-dock_ne.ts index 1c213262a..160d8ec64 100644 --- a/translations/dde-dock_ne.ts +++ b/translations/dde-dock_ne.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + खोल्नुहोस् @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + ब्लुटूथ Turn on @@ -211,7 +211,7 @@ Disabled - + अक्षम diff --git a/translations/dde-dock_nl.ts b/translations/dde-dock_nl.ts index b11972674..0f2c127eb 100644 --- a/translations/dde-dock_nl.ts +++ b/translations/dde-dock_nl.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Openen BloothAdapterWidget My Devices - + Mijn apparaten Other Devices - + Andere apparaten @@ -107,11 +107,11 @@ Turn on - + Inschakelen Turn off - + Uitschakelen @@ -122,11 +122,11 @@ Turn on - + Inschakelen Turn off - + Uitschakelen @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-uursklok 24-hour time - + 24-uursklok Time settings - + Tijdinstellingen @@ -200,7 +200,7 @@ DisplaySettingWidget Multi-Screen Collaboration - + Samenwerken op meerdere schermen @@ -211,7 +211,7 @@ Disabled - + Uitgeschakeld @@ -380,7 +380,7 @@ Plugged In - + Op netstroom @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Uitvoerapparaat Sound settings - + Geluidsinstellingen @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Veilige modus afsluiten Dock - Safe Mode - + Dock - Veilige modus The Dock is in safe mode, please exit to show it properly - + Het dock draait in de veilige modus. Sluit af om het dock correct te tonen. \ No newline at end of file diff --git a/translations/dde-dock_pa.ts b/translations/dde-dock_pa.ts index cea5d04b0..ac1035e5e 100644 --- a/translations/dde-dock_pa.ts +++ b/translations/dde-dock_pa.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + ਖੋਲ੍ਹੋ @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + ਬਲੂਟੁੱਥ Turn on diff --git a/translations/dde-dock_pam.ts b/translations/dde-dock_pam.ts index e40188c82..c98053988 100644 --- a/translations/dde-dock_pam.ts +++ b/translations/dde-dock_pam.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Ibuklat @@ -211,7 +211,7 @@ Disabled - + Eya magsilbi diff --git a/translations/dde-dock_pl.ts b/translations/dde-dock_pl.ts index e518bdb40..0c34e5533 100644 --- a/translations/dde-dock_pl.ts +++ b/translations/dde-dock_pl.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Otwórz BloothAdapterWidget My Devices - + Moje urządzenia Other Devices - + Inne urządzenia @@ -84,7 +84,7 @@ %1 connected - Podłączono %1 + %1 połączono Connecting... @@ -107,11 +107,11 @@ Turn on - + Włącz Turn off - + Wyłącz @@ -122,11 +122,11 @@ Turn on - + Włącz Turn off - + Wyłącz @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Format 12-godzinny 24-hour time - + Format 24-godzinny Time settings - + Ustawienia czasu @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + Kolaboracja PC @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + Kolaboracja wieloekranowa HomeMonitorPlugin Enabled - + Włączone Disabled - + Wyłączone @@ -380,7 +380,7 @@ Plugged In - + Podłączony @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Urządzenie wyjściowe Sound settings - + Ustawienia dźwięku @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Wyjdź z trybu bezpiecznego Dock - Safe Mode - + Dok - Tryb bezpieczny The Dock is in safe mode, please exit to show it properly - + Dok jest w trybie bezpiecznym, wyjdź z niego, aby wyświetlić go poprawnie \ No newline at end of file diff --git a/translations/dde-dock_pt.ts b/translations/dde-dock_pt.ts index 4959d68c1..6cbc9fac6 100644 --- a/translations/dde-dock_pt.ts +++ b/translations/dde-dock_pt.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Abrir BloothAdapterWidget My Devices - + Os meus dispositivos Other Devices - + Outros Dispositivos @@ -107,11 +107,11 @@ Turn on - + Ligar Turn off - + Desligar @@ -122,11 +122,11 @@ Turn on - + Ligar Turn off - + Desligar @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 horas 24-hour time - + 24 horas Time settings - + Definições horárias @@ -211,7 +211,7 @@ Disabled - + Desativado @@ -380,7 +380,7 @@ Plugged In - + Ligado @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Dispositivo de saída Sound settings - + Definições de som @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Sair do Modo Seguro Dock - Safe Mode - + Doca - Modo Seguro The Dock is in safe mode, please exit to show it properly - + A Doca está em modo seguro, saia para a mostrar corretamente \ No newline at end of file diff --git a/translations/dde-dock_pt_BR.ts b/translations/dde-dock_pt_BR.ts index 6175122fa..dd955f71b 100644 --- a/translations/dde-dock_pt_BR.ts +++ b/translations/dde-dock_pt_BR.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Abrir BloothAdapterWidget My Devices - + Meus dispositivos Other Devices - + Outros dispositivos @@ -107,11 +107,11 @@ Turn on - + Ativar Turn off - + Desativar @@ -122,11 +122,11 @@ Turn on - + Ativar Turn off - + Desativar @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Formato de 12 horas 24-hour time - + Formato de 24 horas Time settings - + Configurações de data e hora @@ -211,7 +211,7 @@ Disabled - + Desativado @@ -380,7 +380,7 @@ Plugged In - + No Carregador @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Dispositivo de Saída Sound settings - + Configurações de som @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Sair do Modo de Segurança Dock - Safe Mode - + Dock - Modo de Segurança The Dock is in safe mode, please exit to show it properly - + A Dock está em modo de segurança; saia para exibi-lo corretamente \ No newline at end of file diff --git a/translations/dde-dock_ro.ts b/translations/dde-dock_ro.ts index 35851daa5..f604f050d 100644 --- a/translations/dde-dock_ro.ts +++ b/translations/dde-dock_ro.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Deschide BloothAdapterWidget My Devices - + Dispozitivele mele Other Devices - + Alte dispozitive @@ -107,11 +107,11 @@ Turn on - + Pornește Turn off - + Oprește @@ -122,11 +122,11 @@ Turn on - + Pornește Turn off - + Oprește @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Format 12-ore 24-hour time - + Format 24-ore Time settings - + Configurări pentru timp @@ -211,7 +211,7 @@ Disabled - + Dezactivat @@ -380,7 +380,7 @@ Plugged In - + Conectat @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Dispozitiv de ieșire Sound settings - + Setări Sunet diff --git a/translations/dde-dock_ru.ts b/translations/dde-dock_ru.ts index 9e23e0051..056b737d7 100644 --- a/translations/dde-dock_ru.ts +++ b/translations/dde-dock_ru.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Открыть BloothAdapterWidget My Devices - + Мои устройства Other Devices - + Другие устройства @@ -107,11 +107,11 @@ Turn on - + Включить Turn off - + Выключить @@ -122,11 +122,11 @@ Turn on - + Включить Turn off - + Выключить @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-часовой формат времени 24-hour time - + 24-часовой формат времени Time settings - + Настройки времени @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + Включено Disabled - + Отключено @@ -380,7 +380,7 @@ Plugged In - + От сети @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Выходное устройство Sound settings - + Настройки звука @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Выйти из Безопасного Режима Dock - Safe Mode - + Dock - Безопасный Режим The Dock is in safe mode, please exit to show it properly - + Dock находится в безопасном режиме, пожалуйста, выйдите, чтобы показать ее нормально \ No newline at end of file diff --git a/translations/dde-dock_si.ts b/translations/dde-dock_si.ts index f475774c9..a32ab6866 100644 --- a/translations/dde-dock_si.ts +++ b/translations/dde-dock_si.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + විවෘත කරන්න BloothAdapterWidget My Devices - + මගේ උපාංග Other Devices - + වෙනත් උපාංග @@ -103,15 +103,15 @@ BluetoothMainWidget Bluetooth - + බ්ලූටූත් Turn on - + ක්‍රියාත්මක කරන්න Turn off - + වසා දමන්න @@ -122,11 +122,11 @@ Turn on - + ක්‍රියාත්මක කරන්න Turn off - + වසා දමන්න @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + පැය-12 වේලාව 24-hour time - + පැය-24 වේලාව Time settings - + වේලා සැකසුම් @@ -211,7 +211,7 @@ Disabled - + අක්‍රීයයි @@ -380,7 +380,7 @@ Plugged In - + සම්බන්ධ කර ඇත @@ -398,7 +398,7 @@ Sound settings - + ශබ්ද සැකසුම් diff --git a/translations/dde-dock_sk.ts b/translations/dde-dock_sk.ts index 0e2ca8585..1dd02a272 100644 --- a/translations/dde-dock_sk.ts +++ b/translations/dde-dock_sk.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Otvoriť @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-hodinový čas 24-hour time - + 24-hodinový čas Time settings - + Nastavenia času @@ -211,7 +211,7 @@ Disabled - + Zakázané @@ -398,7 +398,7 @@ Sound settings - + Nastavenia zvuku diff --git a/translations/dde-dock_sl.ts b/translations/dde-dock_sl.ts index a7e1ddff9..2df6c47b2 100644 --- a/translations/dde-dock_sl.ts +++ b/translations/dde-dock_sl.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Odpri BloothAdapterWidget My Devices - + Moje naprave Other Devices - + Druge naprave @@ -107,11 +107,11 @@ Turn on - + Vklopi Turn off - + Izklopi @@ -122,11 +122,11 @@ Turn on - + Vklopi Turn off - + Izklopi @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 urni čas 24-hour time - + 24 urni čas Time settings - + Nastavitve časa @@ -211,7 +211,7 @@ Disabled - + Onemogočeno @@ -380,7 +380,7 @@ Plugged In - + Priključeno na el.omrežje @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Izhodna naprava Sound settings - + Nastavitve zvoka @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Zapri varni način Dock - Safe Mode - + Varni način sidrišča The Dock is in safe mode, please exit to show it properly - + Sidrišče deluje v varnem načinu. Izhod za pravilen prikaz \ No newline at end of file diff --git a/translations/dde-dock_sq.ts b/translations/dde-dock_sq.ts index 33b5dde0f..a5598702c 100644 --- a/translations/dde-dock_sq.ts +++ b/translations/dde-dock_sq.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Hape BloothAdapterWidget My Devices - + Pajisjet e Mia Other Devices - + Pajisje të Tjera @@ -103,15 +103,15 @@ BluetoothMainWidget Bluetooth - + Bluetooth Turn on - + Aktivizoje Turn off - + Çaktivizoje @@ -122,11 +122,11 @@ Turn on - + Aktivizoje Turn off - + Çaktivizoje @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Orë 12-orëshe 24-hour time - + Orë 24-orëshe Time settings - + Rregullime kohe @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + E aktivizuar Disabled - + Çaktivizuar @@ -380,7 +380,7 @@ Plugged In - + Në Prizë @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Pajisje Në Dalje Sound settings - + Rregullime zëri @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Dil nga Mënyra e Parrezik Dock - Safe Mode - + Panel - Mënyra e Parrezik The Dock is in safe mode, please exit to show it properly - + Paneli gjendet nën Mënyrën e Parrezik, ju lutemi, dilni prej saj, që të shfaqet si duhet \ No newline at end of file diff --git a/translations/dde-dock_sr.ts b/translations/dde-dock_sr.ts index a3fbd5e86..7172fbc5c 100644 --- a/translations/dde-dock_sr.ts +++ b/translations/dde-dock_sr.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Покрени BloothAdapterWidget My Devices - + Моји уређаји Other Devices - + Остали уређаји @@ -107,11 +107,11 @@ Turn on - + Укључи Turn off - + Искључи @@ -122,11 +122,11 @@ Turn on - + Укључи Turn off - + Искључи @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-часовно време 24-hour time - + 24-часовно време Time settings - + Подешавање времена @@ -211,7 +211,7 @@ Disabled - + Онемогућенo @@ -380,7 +380,7 @@ Plugged In - + Прикључен @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Излазни уређај Sound settings - + Подешавање звука @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Изађи из безбедног режима Dock - Safe Mode - + Док - Безбедни режим The Dock is in safe mode, please exit to show it properly - + Док је у безбедном режиму, изађите за нормалан приказ \ No newline at end of file diff --git a/translations/dde-dock_sv.ts b/translations/dde-dock_sv.ts index 4b0a55e9b..adf1a9f0f 100644 --- a/translations/dde-dock_sv.ts +++ b/translations/dde-dock_sv.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Öppna @@ -211,7 +211,7 @@ Disabled - + Inaktiverad diff --git a/translations/dde-dock_sw.ts b/translations/dde-dock_sw.ts index 50caa55e6..decd5dadf 100644 --- a/translations/dde-dock_sw.ts +++ b/translations/dde-dock_sw.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + Fungua diff --git a/translations/dde-dock_ta.ts b/translations/dde-dock_ta.ts index 24b54a786..4854b7931 100644 --- a/translations/dde-dock_ta.ts +++ b/translations/dde-dock_ta.ts @@ -47,7 +47,7 @@ AppMultiItem Open - + திற @@ -211,7 +211,7 @@ Disabled - + முடக்கப்பட்டது diff --git a/translations/dde-dock_th.ts b/translations/dde-dock_th.ts index 21aafe582..9e50064d1 100644 --- a/translations/dde-dock_th.ts +++ b/translations/dde-dock_th.ts @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + บลูทูธ Turn on diff --git a/translations/dde-dock_tr.ts b/translations/dde-dock_tr.ts index ead460b92..c4539cf82 100644 --- a/translations/dde-dock_tr.ts +++ b/translations/dde-dock_tr.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + BloothAdapterWidget My Devices - + Aygıtlarım Other Devices - + Diğer Aygıtlar @@ -107,11 +107,11 @@ Turn on - + Turn off - + Kapat @@ -122,11 +122,11 @@ Turn on - + Turn off - + Kapat @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-saatlik zaman 24-hour time - + 24-saatlik zaman Time settings - + Zaman ayarları @@ -207,11 +207,11 @@ HomeMonitorPlugin Enabled - + Etkin Disabled - + Devre Dışı @@ -380,7 +380,7 @@ Plugged In - + Fişe Takılı @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Çıkış Cihazı Sound settings - + Ses ayarları @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Güvenli Kipten Çık Dock - Safe Mode - + Rıhtım - Güvenli Kip The Dock is in safe mode, please exit to show it properly - + Rıhtım güvenli kipte, düzgün şekilde göstermek için lütfen çıkın \ No newline at end of file diff --git a/translations/dde-dock_tzm.ts b/translations/dde-dock_tzm.ts index 6918231e5..b27c73eac 100644 --- a/translations/dde-dock_tzm.ts +++ b/translations/dde-dock_tzm.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Ṛẓem BloothAdapterWidget My Devices - + Allalen inu Other Devices - + Allalen yaḍnin @@ -103,7 +103,7 @@ BluetoothMainWidget Bluetooth - + Ablutut Turn on @@ -148,7 +148,7 @@ Time settings - + Tisɣal n wakud diff --git a/translations/dde-dock_ug.ts b/translations/dde-dock_ug.ts index 672b51eab..a40279728 100644 --- a/translations/dde-dock_ug.ts +++ b/translations/dde-dock_ug.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + ئوچۇق BloothAdapterWidget My Devices - + ئۈسكۈنەم Other Devices - + باشقا ئۈسكۈنە @@ -103,15 +103,15 @@ BluetoothMainWidget Bluetooth - + كۆكچىش Turn on - + كۆكچىشنى ئېچىش Turn off - + كۆكچىشنى تاقاش @@ -122,11 +122,11 @@ Turn on - + كۆكچىشنى ئېچىش Turn off - + كۆكچىشنى تاقاش @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12 سائەتلىك 24-hour time - + 24 سائەتلىك Time settings - + ۋاقىت تەڭشىكى @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + كومپيۇتېرلار ئارا ھەمكارلىشىش HomeMonitorPlugin Enabled - + قوزغىتىش Disabled - + تاقاق @@ -380,7 +380,7 @@ Plugged In - + توك مەنبەسى ئىشلىتىش @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + چىقىرىش ئۈسكۈنىلىرى Sound settings - + ئاۋاز تەڭشىكى @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + بىخەتەر ھالەتتىن چېكىنىش Dock - Safe Mode - + ۋەزىپە ئىستونى بىخەتەرلىك ھالىتى The Dock is in safe mode, please exit to show it properly - + ۋەزىپە ئىستونى بىخەتەر ھالەتكە كىردى، چېكىنگەندىن كېيىن نورمال كۆرۈنىدۇ \ No newline at end of file diff --git a/translations/dde-dock_uk.ts b/translations/dde-dock_uk.ts index 3dfda71c3..a4ff3e764 100644 --- a/translations/dde-dock_uk.ts +++ b/translations/dde-dock_uk.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Відкрити BloothAdapterWidget My Devices - + Мої пристрої Other Devices - + Інші пристрої @@ -107,11 +107,11 @@ Turn on - + Увімкнути Turn off - + Вимкнути @@ -122,11 +122,11 @@ Turn on - + Увімкнути Turn off - + Вимкнути @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + 12-годинний час 24-hour time - + 24-годинний час Time settings - + Параметри часу @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + Взаємодія ПК @@ -200,18 +200,18 @@ DisplaySettingWidget Multi-Screen Collaboration - + Сумісне використання декількох екранів HomeMonitorPlugin Enabled - + Увімкнено Disabled - + Вимкнено @@ -380,7 +380,7 @@ Plugged In - + Підключено @@ -394,11 +394,11 @@ SoundDevicesWidget Output Device - + Пристрій виведення Sound settings - + Параметри звуку @@ -461,15 +461,15 @@ WindowManager Exit Safe Mode - + Вийти з безпечного режиму Dock - Safe Mode - + Док-станція — безпечний режим The Dock is in safe mode, please exit to show it properly - + Док-станція перебуває у безпечному режимі — будь ласка, вийдіть з нього для належного показу \ No newline at end of file diff --git a/translations/dde-dock_vi.ts b/translations/dde-dock_vi.ts index 4ff7f60bd..3c6e5d725 100644 --- a/translations/dde-dock_vi.ts +++ b/translations/dde-dock_vi.ts @@ -47,18 +47,18 @@ AppMultiItem Open - + Mở BloothAdapterWidget My Devices - + Thiết bị của tôi Other Devices - + Thiết bị khác @@ -107,11 +107,11 @@ Turn on - + Mở Turn off - + Tắt @@ -122,11 +122,11 @@ Turn on - + Mở Turn off - + Tắt @@ -140,15 +140,15 @@ DateTimeDisplayer 12-hour time - + Chế độ 12 giờ 24-hour time - + Chế độ 24 giờ Time settings - + Cài đặt thời gian @@ -211,7 +211,7 @@ Disabled - + Đã ngắt @@ -380,7 +380,7 @@ Plugged In - + Plugged In @@ -398,7 +398,7 @@ Sound settings - + Cài đặt âm thanh diff --git a/translations/dde-dock_zh_CN.ts b/translations/dde-dock_zh_CN.ts index ecc48d5fc..4e98337de 100644 --- a/translations/dde-dock_zh_CN.ts +++ b/translations/dde-dock_zh_CN.ts @@ -379,8 +379,8 @@ 重启 - Plugged In - 使用电源 + Power + 电源 diff --git a/translations/dde-dock_zh_HK.ts b/translations/dde-dock_zh_HK.ts index 309a2b66d..e6a1e7020 100644 --- a/translations/dde-dock_zh_HK.ts +++ b/translations/dde-dock_zh_HK.ts @@ -379,8 +379,8 @@ 重啟 - Plugged In - 使用電源 + Power + 電源 diff --git a/translations/dde-dock_zh_TW.ts b/translations/dde-dock_zh_TW.ts index f22c70ea1..c330be22f 100644 --- a/translations/dde-dock_zh_TW.ts +++ b/translations/dde-dock_zh_TW.ts @@ -379,8 +379,8 @@ 重啟 - Plugged In - 使用電源 + Power + 電源 From c3851717b5b6a0e635ebc60effc1766bb299d540 Mon Sep 17 00:00:00 2001 From: lvpeilong Date: Fri, 6 Jan 2023 16:33:12 +0800 Subject: [PATCH 223/257] chore: update changelog update changelog Log: update changelog Influence: null Task: https://pms.uniontech.com/task-view-235277.html Change-Id: Ibcc7486e7d37a6503dc7cdc4c7b26ae11366291e --- debian/changelog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debian/changelog b/debian/changelog index a0d8e9721..f3863b324 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +dde-dock (6.0.7) unstable; urgency=medium + + [ TagBuilder ] + * fix: 修复插件显示尺寸问题(Bug: 179083)(Influence: 截图-查看截图计时插件是否正常显示) + * fix: 任务栏协同不显示安卓设备。(Task: 233323)(Influence: 设备列表不显示安卓设备。) + * fix: 修复文案显示错误(Bug: 180959)(Influence: 任务栏最右侧的电源按钮) + * fix: 更新翻译文件(Bug: 180959)(Influence: 任务栏-电源,观察电源的文本) + + -- lvpeilong Fri, 06 Jan 2023 16:32:53 +0800 + dde-dock (6.0.6.1) unstable; urgency=medium [ TagBuilder ] From 1175b75aa5eeb1246cd18ed9efa6e7b05002845c Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 11 Jan 2023 09:09:36 +0800 Subject: [PATCH 224/257] =?UTF-8?q?style:=20=E8=A7=A3=E5=86=B3=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E4=B8=8D=E9=80=9A=E8=BF=87=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、gerrit上打包提示DRegionMonitor重复定义导致编译不过,此处加上命名空间 2、删除不用的头文件包含 Log: Influence: gerrit打包 Task: https://pms.uniontech.com/task-view-96831.html Change-Id: Ic5f5c88619193a2b49482c967fff1eca5b784608 --- frame/window/quickpluginwindow.h | 3 +-- frame/window/tray/tray_gridview.cpp | 1 + frame/window/tray/widgets/expandiconwidget.cpp | 8 +++++--- frame/window/traymanagerwindow.cpp | 1 - frame/window/traymanagerwindow.h | 3 +-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 1c2a58b34..7dd7f1006 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -39,8 +39,7 @@ class QMenu; class QuickPluginMimeData; enum class DockPart; -namespace Dtk { namespace Gui { class DRegionMonitor; } - namespace Widget { class DListView; class DStandardItem; } } +namespace Dtk { namespace Widget { class DListView; class DStandardItem; } } using namespace Dtk::Widget; diff --git a/frame/window/tray/tray_gridview.cpp b/frame/window/tray/tray_gridview.cpp index 2df7a6f10..b0d0d4807 100644 --- a/frame/window/tray/tray_gridview.cpp +++ b/frame/window/tray/tray_gridview.cpp @@ -406,6 +406,7 @@ bool TrayGridView::mouseInDock() return mousePosition.x() > dockRect.left(); } } + return false; } void TrayGridView::handleDropEvent(QDropEvent *e) diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index 77a3cbe5b..d6f4b1d36 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -35,6 +35,8 @@ DGUI_USE_NAMESPACE +using RegionMonitor = Dtk::Gui::DRegionMonitor; + ExpandIconWidget::ExpandIconWidget(QWidget *parent, Qt::WindowFlags f) : BaseTrayWidget(parent, f) , m_position(Dock::Position::Bottom) @@ -192,7 +194,7 @@ TrayGridWidget::TrayGridWidget(QWidget *parent) , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) , m_trayGridView(nullptr) , m_referGridView(nullptr) - , m_regionInter(new DRegionMonitor(this)) + , m_regionInter(new RegionMonitor(this)) { initMember(); setAttribute(Qt::WA_TranslucentBackground); @@ -281,14 +283,14 @@ void TrayGridWidget::hideEvent(QHideEvent *event) void TrayGridWidget::initMember() { - connect(m_regionInter, &DRegionMonitor::buttonPress, this, [ = ](const QPoint &mousePos, const int flag) { + connect(m_regionInter, &RegionMonitor::buttonPress, this, [ = ](const QPoint &mousePos, const int flag) { // 如果当前是隐藏,那么在点击任何地方都隐藏 if (!isVisible()) { hide(); return; } - if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) + if ((flag != RegionMonitor::WatchedFlags::Button_Left) && (flag != RegionMonitor::WatchedFlags::Button_Right)) return; QPoint ptPos = parentWidget()->mapToGlobal(this->pos()); diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 05c52d051..e51345368 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -32,7 +32,6 @@ #include "utils.h" #include -#include #include #include diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index 7889a91b8..fb9b170c4 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -28,8 +28,7 @@ #include -namespace Dtk { namespace Gui { class DRegionMonitor; }; - namespace Widget { class DBlurEffectWidget; } } +namespace Dtk { namespace Widget { class DBlurEffectWidget; } } using namespace Dtk::Widget; From 978d7fe738be278aec9cc750804378916bed70dc Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 11 Jan 2023 18:24:37 +0800 Subject: [PATCH 225/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=94=AE?= =?UTF-8?q?=E7=9B=98=E5=B8=83=E5=B1=80=E6=8F=92=E4=BB=B6=E4=B8=8D=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E9=94=AE=E7=9B=98=E5=B8=83=E5=B1=80=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在布局变化信号发生变化后,增加响应布局变化的信号 Log: Influence: 社区版,从控制中心不断新增和删除键盘布局,观察布局插件是否显示隐藏 Task: https://pms.uniontech.com/task-view-225011.html Change-Id: I52af6b3d67836a4e55b280bba3c124adfee0a1c9 --- frame/window/tray/tray_delegate.cpp | 1 + frame/window/tray/widgets/indicatorplugin.cpp | 2 ++ plugins/keyboard-layout/dbusadaptors.cpp | 14 +++++++------- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index 7b0359d73..d97c94711 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -98,6 +98,7 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem IndicatorTrayItem *indicatorWidget = new IndicatorTrayItem(indicateName, parent); TrayModel *dataModel = qobject_cast(m_listView->model()); if (IndicatorTrayItem *sourceIndicatorWidget = dataModel->indicatorWidget(key)) { + connect(indicatorWidget, &IndicatorTrayItem::clicked, sourceIndicatorWidget, &IndicatorTrayItem::clicked); const QByteArray pixmapData = sourceIndicatorWidget->pixmapData(); if (!pixmapData.isEmpty()) indicatorWidget->setPixmapData(pixmapData); diff --git a/frame/window/tray/widgets/indicatorplugin.cpp b/frame/window/tray/widgets/indicatorplugin.cpp index 158113b26..6b71d7415 100644 --- a/frame/window/tray/widgets/indicatorplugin.cpp +++ b/frame/window/tray/widgets/indicatorplugin.cpp @@ -270,6 +270,7 @@ void IndicatorPlugin::textPropertyChanged(const QDBusMessage &message) } d->indicatorTrayWidget->setText(value.toByteArray()); + Q_EMIT delayLoaded(); }); } @@ -289,5 +290,6 @@ void IndicatorPlugin::iconPropertyChanged(const QDBusMessage &message) } d->indicatorTrayWidget->setPixmapData(value.toByteArray()); + Q_EMIT delayLoaded(); }); } diff --git a/plugins/keyboard-layout/dbusadaptors.cpp b/plugins/keyboard-layout/dbusadaptors.cpp index 2c1cd39d4..547f9749a 100644 --- a/plugins/keyboard-layout/dbusadaptors.cpp +++ b/plugins/keyboard-layout/dbusadaptors.cpp @@ -24,12 +24,12 @@ #include DBusAdaptors::DBusAdaptors(QObject *parent) - : QDBusAbstractAdaptor(parent), - m_keyboard(new Keyboard("org.deepin.dde.InputDevices1", + : QDBusAbstractAdaptor(parent) + , m_keyboard(new Keyboard("org.deepin.dde.InputDevices1", "/org/deepin/dde/InputDevice1/Keyboard", - QDBusConnection::sessionBus(), this)), - m_menu(new QMenu()), - m_gsettings(Utils::ModuleSettingsPtr("keyboard", QByteArray(), this)) + QDBusConnection::sessionBus(), this)) + , m_menu(new QMenu) + , m_gsettings(Utils::ModuleSettingsPtr("keyboard", QByteArray(), this)) { m_keyboard->setSync(false); @@ -49,6 +49,7 @@ DBusAdaptors::DBusAdaptors(QObject *parent) DBusAdaptors::~DBusAdaptors() { + delete m_menu; } QString DBusAdaptors::layout() const @@ -178,8 +179,7 @@ void DBusAdaptors::handleActionTriggered(QAction *action) .interface("org.deepin.dde.ControlCenter1") .path("/org/deepin/dde/ControlCenter1") .method("ShowPage") - .arg(QString("keyboard")) - .arg(QString("Keyboard Layout/Add Keyboard Layout")) + .arg(QString("keyboard/keyboardGeneral/keyboardLayout")) .call(); } From 4a2847f03fdd6bdc71a29826e773c5fcb9af9334 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 Jan 2023 13:09:17 +0800 Subject: [PATCH 226/257] =?UTF-8?q?feat:=20=E5=8A=A0=E8=BD=BD=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=B5=81=E7=A8=8B=E7=A7=BB=E5=8A=A8=E5=88=B0=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E9=87=8C=E5=8D=95=E7=8B=AC=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将加载插件的流程和快捷面板的功能移动到单独的插件中,精简任务栏的代码 Log: Influence: 加载插件 Task: https://pms.uniontech.com/task-view-222353.html Change-Id: I9b2fbe4f32c852f6a3535daab87c63741bd8914a --- debian/dde-dock.install | 1 + frame/CMakeLists.txt | 2 +- interfaces/pluginmanagerinterface.h | 44 ++ plugins/CMakeLists.txt | 2 +- plugins/pluginmanager/CMakeLists.txt | 45 ++ .../pluginmanager/dockplugincontroller.cpp | 704 ++++++++++++++++++ plugins/pluginmanager/dockplugincontroller.h | 116 +++ plugins/pluginmanager/iconmanager.cpp | 122 +++ plugins/pluginmanager/iconmanager.h | 52 ++ plugins/pluginmanager/largerquickitem.cpp | 313 ++++++++ plugins/pluginmanager/largerquickitem.h | 82 ++ plugins/pluginmanager/linequickitem.cpp | 105 +++ plugins/pluginmanager/linequickitem.h | 58 ++ .../pluginadapter/pluginadapter.cpp | 209 ++++++ .../pluginadapter/pluginadapter.h | 81 ++ .../pluginadapter/pluginsiteminterface_v20.h | 261 +++++++ plugins/pluginmanager/pluginchildpage.cpp | 146 ++++ plugins/pluginmanager/pluginchildpage.h | 61 ++ plugins/pluginmanager/pluginmanager.cpp | 195 +++++ plugins/pluginmanager/pluginmanager.h | 72 ++ plugins/pluginmanager/pluginmanager.json | 4 + plugins/pluginmanager/pluginmanager.qrc | 5 + .../pluginmanager/quicksettingcontainer.cpp | 415 +++++++++++ plugins/pluginmanager/quicksettingcontainer.h | 94 +++ plugins/pluginmanager/quicksettingitem.cpp | 148 ++++ plugins/pluginmanager/quicksettingitem.h | 69 ++ .../pluginmanager/resources/dock_control.dci | Bin 0 -> 767 bytes plugins/pluginmanager/standardquickitem.cpp | 200 +++++ plugins/pluginmanager/standardquickitem.h | 57 ++ 29 files changed, 3661 insertions(+), 2 deletions(-) create mode 100644 interfaces/pluginmanagerinterface.h create mode 100644 plugins/pluginmanager/CMakeLists.txt create mode 100644 plugins/pluginmanager/dockplugincontroller.cpp create mode 100644 plugins/pluginmanager/dockplugincontroller.h create mode 100644 plugins/pluginmanager/iconmanager.cpp create mode 100644 plugins/pluginmanager/iconmanager.h create mode 100644 plugins/pluginmanager/largerquickitem.cpp create mode 100644 plugins/pluginmanager/largerquickitem.h create mode 100644 plugins/pluginmanager/linequickitem.cpp create mode 100644 plugins/pluginmanager/linequickitem.h create mode 100644 plugins/pluginmanager/pluginadapter/pluginadapter.cpp create mode 100644 plugins/pluginmanager/pluginadapter/pluginadapter.h create mode 100644 plugins/pluginmanager/pluginadapter/pluginsiteminterface_v20.h create mode 100644 plugins/pluginmanager/pluginchildpage.cpp create mode 100644 plugins/pluginmanager/pluginchildpage.h create mode 100644 plugins/pluginmanager/pluginmanager.cpp create mode 100644 plugins/pluginmanager/pluginmanager.h create mode 100644 plugins/pluginmanager/pluginmanager.json create mode 100644 plugins/pluginmanager/pluginmanager.qrc create mode 100644 plugins/pluginmanager/quicksettingcontainer.cpp create mode 100644 plugins/pluginmanager/quicksettingcontainer.h create mode 100644 plugins/pluginmanager/quicksettingitem.cpp create mode 100644 plugins/pluginmanager/quicksettingitem.h create mode 100644 plugins/pluginmanager/resources/dock_control.dci create mode 100644 plugins/pluginmanager/standardquickitem.cpp create mode 100644 plugins/pluginmanager/standardquickitem.h diff --git a/debian/dde-dock.install b/debian/dde-dock.install index 4ea0c2294..f10faa542 100644 --- a/debian/dde-dock.install +++ b/debian/dde-dock.install @@ -1,6 +1,7 @@ usr/share usr/bin etc/dde-dock +usr/lib/dde-dock/plugins/loader/libpluginmanager.so usr/lib/dde-dock/plugins/libshutdown.so usr/lib/dde-dock/plugins/libtrash.so usr/lib/dde-dock/plugins/liboverlay-warning.so diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index 949a9dbdf..dc4b4742a 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -12,7 +12,7 @@ endif() generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface) # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../widgets/*.h" "../widgets/*.cpp") +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../widgets/*.h" "../widgets/*.cpp" "../interfaces/*.h") # Find the library find_package(PkgConfig REQUIRED) diff --git a/interfaces/pluginmanagerinterface.h b/interfaces/pluginmanagerinterface.h new file mode 100644 index 000000000..d20e8fd7b --- /dev/null +++ b/interfaces/pluginmanagerinterface.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2023 ~ 2023 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef PLUGINMANAGERINTERFACE_H +#define PLUGINMANAGERINTERFACE_H + +#include +#include + +class PluginsItemInterface; + +class PluginManagerInterface : public QObject +{ + Q_OBJECT + +public: + virtual QList plugins() const = 0; + virtual QList pluginsInSetting() const = 0; + virtual QList currentPlugins() const = 0; + virtual QString itemKey(PluginsItemInterface *itemInter) const = 0; + virtual QJsonObject metaData(PluginsItemInterface *itemInter) const = 0; + +Q_SIGNALS: + void pluginLoadFinished(); +}; + +#endif // PLUGINMANAGERINTERFACE_H diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 7f830eb24..bb7858de3 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -4,7 +4,7 @@ add_subdirectory("power") add_subdirectory("sound") add_subdirectory("display") add_subdirectory("media") -#add_subdirectory("tray") +add_subdirectory("pluginmanager") add_subdirectory("trash") add_subdirectory("keyboard-layout") add_subdirectory("onboard") diff --git a/plugins/pluginmanager/CMakeLists.txt b/plugins/pluginmanager/CMakeLists.txt new file mode 100644 index 000000000..1a7d5ab00 --- /dev/null +++ b/plugins/pluginmanager/CMakeLists.txt @@ -0,0 +1,45 @@ + +set(PLUGIN_NAME "pluginmanager") + +project(${PLUGIN_NAME}) + +# Sources files +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "*.qrc" "../../frame/drag/quickdragcore.h" "../../frame/drag/quickdragcore.cpp" +"../../frame/util/settingconfig.h" "../../frame/util/settingconfig.cpp" +"../../frame/util/pluginloader.h" "../../frame/util/pluginloader.cpp" +"../../frame/dbus/dockinterface.h" "../../frame/dbus/dockinterface.cpp" +"../../frame/dbusinterface/generation_dbus_interface/org_deepin_dde_daemon_dock1.h" +"../../frame/dbusinterface/generation_dbus_interface/org_deepin_dde_daemon_dock1.cpp" +"../../frame/dbusinterface/types/dockrect.h" +"../../frame/dbusinterface/types/dockrect.cpp" +"../../interfaces/pluginmanagerinterface.h" +) + +find_package(PkgConfig REQUIRED) +find_package(Qt5Widgets REQUIRED) +find_package(Qt5Svg REQUIRED) +find_package(Qt5DBus REQUIRED) +find_package(DtkWidget REQUIRED) +pkg_check_modules(QGSettings REQUIRED gsettings-qt) + +add_library(${PLUGIN_NAME} SHARED ${SRCS}) +set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../loader/) +target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} + ${Qt5DBus_INCLUDE_DIRS} + ${QGSettings_INCLUDE_DIRS} + ./pluginadapter + ../../frame/drag + ../../frame/dbusinterface + ../../frame/dbusinterface/generation_dbus_interface/ + ../../interfaces + ) + +target_link_libraries(${PLUGIN_NAME} PRIVATE + ${DtkWidget_LIBRARIES} + ${Qt5Widgets_LIBRARIES} + ${Qt5Svg_LIBRARIES} + ${Qt5DBus_LIBRARIES} + ${QGSettings_LIBRARIES} +) + +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/loader) diff --git a/plugins/pluginmanager/dockplugincontroller.cpp b/plugins/pluginmanager/dockplugincontroller.cpp new file mode 100644 index 000000000..cdb0b5a94 --- /dev/null +++ b/plugins/pluginmanager/dockplugincontroller.cpp @@ -0,0 +1,704 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#include "dockplugincontroller.h" +#include "pluginsiteminterface.h" +#include "pluginsiteminterface_v20.h" +#include "pluginadapter.h" +#include "utils.h" +#include "settingconfig.h" + +#include +#include + +#include +#include +#include +#include + +#define PLUGININFO "pluginInfo" +#define DOCK_QUICK_PLUGINS "Dock_Quick_Plugins" + +static const QStringList CompatiblePluginApiList { + "1.1.1", + "1.2", + "1.2.1", + "1.2.2", + DOCK_PLUGIN_API_VERSION +}; + +class PluginInfo : public QObject +{ +public: + PluginInfo() : QObject(nullptr), m_loaded(false), m_visible(false) {} + bool m_loaded; + bool m_visible; + QString m_itemKey; +}; + +DockPluginController::DockPluginController(PluginProxyInterface *proxyInter, QObject *parent) + : QObject(parent) + , m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()) + , m_dockDaemonInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) + , m_proxyInter(proxyInter) +{ + qApp->installEventFilter(this); + + refreshPluginSettings(); + + connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &DockPluginController::onConfigChanged); + connect(m_dockDaemonInter, &DockInter::PluginSettingsSynced, this, &DockPluginController::refreshPluginSettings, Qt::QueuedConnection); +} + +DockPluginController::~DockPluginController() +{ + for (auto inter : m_pluginsMap.keys()) { + delete m_pluginsMap.value(inter).value("pluginloader"); + m_pluginsMap[inter]["pluginloader"] = nullptr; + if (m_pluginsMap[inter].contains(PLUGININFO)) + m_pluginsMap[inter][PLUGININFO]->deleteLater(); + m_pluginsMap.remove(inter); + delete inter; + inter = nullptr; + } +} + +QList DockPluginController::plugins() const +{ + return m_pluginsMap.keys(); +} + +QList DockPluginController::pluginsInSetting() const +{ + // 插件有三种状态 + // 1、所有的插件,不管这个插件是否调用itemAdded方法,只要是通过dock加载的插件(换句话说,也就是在/lib/dde-dock/plugins目录下的插件) + // 2、在1的基础上,插件自身调用了itemAdded方法的插件,例如机器上没有蓝牙设备,那么蓝牙插件就不会调用itemAdded方法,这时候就不算 + // 3、在2的基础上,由控制中心来决定那些插件是否在任务栏显示的插件 + // 此处返回的是第二种插件 + QList settingPlugins; + QMap pluginSort; + for (auto it = m_pluginsMap.begin(); it != m_pluginsMap.end(); it++) { + PluginsItemInterface *plugin = it.key(); + qInfo() << plugin->pluginName(); + if (plugin->pluginDisplayName().isEmpty()) + continue; + + QMap pluginMap = it.value(); + // 如果不包含PLUGININFO这个key值,肯定是未加载 + if (!pluginMap.contains(PLUGININFO)) + continue; + + PluginInfo *pluginInfo = static_cast(pluginMap[PLUGININFO]); + if (!pluginInfo->m_loaded) + continue; + + // 这里只需要返回插件为可以在控制中心设置的插件 + if (!(plugin->flags() & PluginFlag::Attribute_CanSetting)) + continue; + + settingPlugins << plugin; + pluginSort[plugin] = plugin->itemSortKey(pluginInfo->m_itemKey); + } + + std::sort(settingPlugins.begin(), settingPlugins.end(), [ pluginSort ](PluginsItemInterface *plugin1, PluginsItemInterface *plugin2) { + return pluginSort[plugin1] < pluginSort[plugin2]; + }); + + return settingPlugins; +} + +QList DockPluginController::currentPlugins() const +{ + QList loadedPlugins; + + QMap pluginSortMap; + for (auto it = m_pluginsMap.begin(); it != m_pluginsMap.end(); it++) { + QMap objectMap = it.value(); + if (!objectMap.contains(PLUGININFO)) + continue; + + PluginInfo *pluginInfo = static_cast(objectMap[PLUGININFO]); + if (!pluginInfo->m_loaded) + continue; + + PluginsItemInterface *plugin = it.key(); + loadedPlugins << plugin; + pluginSortMap[plugin] = plugin->itemSortKey(pluginInfo->m_itemKey); + } + + std::sort(loadedPlugins.begin(), loadedPlugins.end(), [ pluginSortMap ](PluginsItemInterface *pluginItem1, PluginsItemInterface *pluginItem2) { + return pluginSortMap.value(pluginItem1) < pluginSortMap.value(pluginItem2); + }); + return loadedPlugins; +} + +void DockPluginController::saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) +{ + savePluginValue(getPluginInterface(itemInter), key, value); +} + +const QVariant DockPluginController::getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &fallback) +{ + return getPluginValue(getPluginInterface(itemInter), key, fallback); +} + +void DockPluginController::removeValue(PluginsItemInterface *const itemInter, const QStringList &keyList) +{ + removePluginValue(getPluginInterface(itemInter), keyList); +} + +void DockPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + PluginsItemInterface *pluginItem = getPluginInterface(itemInter); + + PluginAdapter *pluginAdapter = dynamic_cast(pluginItem); + if (pluginAdapter) { + // 如果该插件可以正常转换为PluginAdapter插件,表示当前插件是v20插件,为了兼容v20插件 + // 中获取ICON,因此,使用调用插件的itemWidget来截图的方式返回QIcon,所以此处传入itemKey + pluginAdapter->setItemKey(itemKey); + } + + // 如果是通过插件来调用m_proxyInter的 + PluginInfo *pluginInfo = nullptr; + QMap &interfaceData = m_pluginsMap[pluginItem]; + if (interfaceData.contains(PLUGININFO)) { + pluginInfo = static_cast(interfaceData[PLUGININFO]); + // 如果插件已经加载,则无需再次加载(此处保证插件出现重复调用itemAdded的情况) + if (pluginInfo->m_loaded) + return; + } else { + pluginInfo = new PluginInfo; + interfaceData[PLUGININFO] = pluginInfo; + } + pluginInfo->m_itemKey = itemKey; + pluginInfo->m_loaded = true; + + if (pluginCanDock(pluginItem)) + addPluginItem(pluginItem, itemKey); + + Q_EMIT pluginInserted(pluginItem, itemKey); +} + +void DockPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + m_proxyInter->itemUpdate(getPluginInterface(itemInter), itemKey); +} + +void DockPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + PluginsItemInterface *pluginInter = getPluginInterface(itemInter); + // 更新字段中的isLoaded字段,表示当前没有加载 + QMap &interfaceData = m_pluginsMap[pluginInter]; + if (interfaceData.contains(PLUGININFO)) { + PluginInfo *pluginInfo = static_cast(interfaceData[PLUGININFO]); + // 将是否加载的标记修改为未加载 + pluginInfo->m_loaded = false; + } + + removePluginItem(pluginInter, itemKey); + Q_EMIT pluginRemoved(pluginInter); +} + +void DockPluginController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) +{ + m_proxyInter->requestWindowAutoHide(getPluginInterface(itemInter), itemKey, autoHide); +} + +void DockPluginController::requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + m_proxyInter->requestRefreshWindowVisible(getPluginInterface(itemInter), itemKey); +} + +// 请求页面显示或者隐藏,由插件内部来调用,例如在移除蓝牙插件后,如果已经弹出了蓝牙插件的面板,则隐藏面板 +void DockPluginController::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) +{ + PluginsItemInterface *pluginInter = getPluginInterface(itemInter); + Q_EMIT requestAppletVisible(pluginInter, itemKey, visible); + m_proxyInter->requestSetAppletVisible(pluginInter, itemKey, visible); +} + +PluginsItemInterface *DockPluginController::getPluginInterface(PluginsItemInterface * const itemInter) +{ + // 先从事先定义好的map中查找,如果没有找到,就是v23插件,直接返回当前插件的指针 + qulonglong pluginAddr = (qulonglong)itemInter; + if (m_pluginAdapterMap.contains(pluginAddr)) + return m_pluginAdapterMap[pluginAddr]; + + return itemInter; +} + +void DockPluginController::addPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + // 如果这个插件都没有加载,那么此处肯定是无需新增 + if (!m_pluginsMap.contains(itemInter)) + return; + + PluginInfo *pluginInfo = nullptr; + QMap &interfaceData = m_pluginsMap[itemInter]; + // 此处的PLUGININFO的数据已经在前面调用的地方给填充了数据,如果没有获取到这个数据,则无需新增 + if (!interfaceData.contains(PLUGININFO)) + return; + + pluginInfo = static_cast(interfaceData[PLUGININFO]); + pluginInfo->m_visible = true; + + m_proxyInter->itemAdded(itemInter, itemKey); +} + +void DockPluginController::removePluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) +{ + if (!m_pluginsMap.contains(itemInter)) + return; + + // 更新字段中的isLoaded字段,表示当前没有加载 + QMap &interfaceData = m_pluginsMap[itemInter]; + if (!interfaceData.contains(PLUGININFO)) + return; + + PluginInfo *pluginInfo = static_cast(interfaceData[PLUGININFO]); + // 将是否在任务栏显示的标记改为不显示 + pluginInfo->m_visible = false; + m_proxyInter->itemRemoved(itemInter, itemKey); +} + +QString DockPluginController::itemKey(PluginsItemInterface *itemInter) const +{ + if (!m_pluginsMap.contains(itemInter)) + return QString(); + + QMap interfaceData = m_pluginsMap[itemInter]; + if (!interfaceData.contains(PLUGININFO)) + return QString(); + + PluginInfo *pluginInfo = static_cast(interfaceData[PLUGININFO]); + return pluginInfo->m_itemKey; +} + +QJsonObject DockPluginController::metaData(PluginsItemInterface *pluginItem) +{ + if (!m_pluginsMap.contains(pluginItem)) + return QJsonObject(); + + QPluginLoader *pluginLoader = qobject_cast(m_pluginsMap[pluginItem].value("pluginloader")); + + if (!pluginLoader) + return QJsonObject(); + + return pluginLoader->metaData().value("MetaData").toObject(); +} + +void DockPluginController::savePluginValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &value) +{ + // is it necessary? + // refreshPluginSettings(); + + // save to local cache + QJsonObject localObject = m_pluginSettingsObject.value(itemInter->pluginName()).toObject(); + localObject.insert(key, QJsonValue::fromVariant(value)); //Note: QVariant::toJsonValue() not work in Qt 5.7 + + // save to daemon + QJsonObject remoteObject, remoteObjectInter; + remoteObjectInter.insert(key, QJsonValue::fromVariant(value)); //Note: QVariant::toJsonValue() not work in Qt 5.7 + remoteObject.insert(itemInter->pluginName(), remoteObjectInter); + + if (itemInter->type() == PluginsItemInterface::Fixed && key == "enable" && !value.toBool()) { + int fixedPluginCount = 0; + // 遍历FixPlugin插件个数 + for (auto it(m_pluginsMap.begin()); it != m_pluginsMap.end();) { + if (it.key()->type() == PluginsItemInterface::Fixed) { + fixedPluginCount++; + } + ++it; + } + // 修改插件的order值,位置为队尾 + QString name = localObject.keys().last(); + // 此次做一下判断,有可能初始数据不存在pos_*字段,会导致enable字段被修改。或者此处可以循环所有字段是否存在pos_开头的字段? + if (name != key) { + localObject.insert(name, QJsonValue::fromVariant(fixedPluginCount)); //Note: QVariant::toJsonValue() not work in Qt 5.7 + // daemon中同样修改 + remoteObjectInter.insert(name, QJsonValue::fromVariant(fixedPluginCount)); //Note: QVariant::toJsonValue() not work in Qt 5.7 + remoteObject.insert(itemInter->pluginName(), remoteObjectInter); + } + } + + m_pluginSettingsObject.insert(itemInter->pluginName(), localObject); + m_dockDaemonInter->MergePluginSettings(QJsonDocument(remoteObject).toJson(QJsonDocument::JsonFormat::Compact)); +} + +const QVariant DockPluginController::getPluginValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &fallback) +{ + // load from local cache + QVariant v = m_pluginSettingsObject.value(itemInter->pluginName()).toObject().value(key).toVariant(); + if (v.isNull() || !v.isValid()) { + v = fallback; + } + + return v; +} + +void DockPluginController::removePluginValue(PluginsItemInterface * const itemInter, const QStringList &keyList) +{ + if (keyList.isEmpty()) { + m_pluginSettingsObject.remove(itemInter->pluginName()); + } else { + QJsonObject localObject = m_pluginSettingsObject.value(itemInter->pluginName()).toObject(); + for (auto key : keyList) { + localObject.remove(key); + } + m_pluginSettingsObject.insert(itemInter->pluginName(), localObject); + } + + m_dockDaemonInter->RemovePluginSettings(itemInter->pluginName(), keyList); +} + +void DockPluginController::startLoadPlugin(const QStringList &dirs) +{ + QDir dir; + for (const QString &path : dirs) { + if (!dir.exists(path)) + continue; + + startLoader(new PluginLoader(path, this)); + } +} + +bool DockPluginController::isPluginLoaded(PluginsItemInterface *itemInter) +{ + if (!m_pluginsMap.contains(itemInter)) + return false; + + QMap pluginObject = m_pluginsMap.value(itemInter); + if (!pluginObject.contains(PLUGININFO)) + return false; + + PluginInfo *pluginInfo = static_cast(pluginObject.value(PLUGININFO)); + return pluginInfo->m_visible; +} + +QObject *DockPluginController::pluginItemAt(PluginsItemInterface *const itemInter, const QString &itemKey) const +{ + if (!m_pluginsMap.contains(itemInter)) + return nullptr; + + return m_pluginsMap[itemInter][itemKey]; +} + +PluginsItemInterface *DockPluginController::pluginInterAt(const QString &itemKey) +{ + QMapIterator> it(m_pluginsMap); + while (it.hasNext()) { + it.next(); + if (it.value().keys().contains(itemKey)) { + return it.key(); + } + } + + return nullptr; +} + +PluginsItemInterface *DockPluginController::pluginInterAt(QObject *destItem) +{ + QMapIterator> it(m_pluginsMap); + while (it.hasNext()) { + it.next(); + if (it.value().values().contains(destItem)) { + return it.key(); + } + } + + return nullptr; +} + +void DockPluginController::startLoader(PluginLoader *loader) +{ + connect(loader, &PluginLoader::finished, loader, &PluginLoader::deleteLater, Qt::QueuedConnection); + connect(loader, &PluginLoader::pluginFounded, this, [ = ](const QString &pluginFile) { + QPair pair; + pair.first = pluginFile; + pair.second = nullptr; + m_pluginLoadMap.insert(pair, false); + }); + connect(loader, &PluginLoader::pluginFounded, this, &DockPluginController::loadPlugin, Qt::QueuedConnection); + + int delay = Utils::SettingValue("com.deepin.dde.dock", "/com/deepin/dde/dock/", "delay-plugins-time", 0).toInt(); + QTimer::singleShot(delay, loader, [ = ] { loader->start(QThread::LowestPriority); }); +} + +void DockPluginController::displayModeChanged() +{ + const Dock::DisplayMode displayMode = qApp->property(PROP_DISPLAY_MODE).value(); + const auto inters = m_pluginsMap.keys(); + + for (auto inter : inters) + inter->displayModeChanged(displayMode); +} + +void DockPluginController::positionChanged() +{ + const Dock::Position position = qApp->property(PROP_POSITION).value(); + const auto inters = m_pluginsMap.keys(); + + for (auto inter : inters) + inter->positionChanged(position); +} + +void DockPluginController::loadPlugin(const QString &pluginFile) +{ + QPluginLoader *pluginLoader = new QPluginLoader(pluginFile, this); + const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); + const QString &pluginApi = meta.value("api").toString(); + bool pluginIsValid = true; + if (pluginApi.isEmpty() || !CompatiblePluginApiList.contains(pluginApi)) { + qDebug() << objectName() + << "plugin api version not matched! expect versions:" << CompatiblePluginApiList + << ", got version:" << pluginApi + << ", the plugin file is:" << pluginFile; + + pluginIsValid = false; + } + + PluginsItemInterface *interface = qobject_cast(pluginLoader->instance()); + if (!interface) { + // 如果识别当前插件失败,就认为这个插件是v20的插件,将其转换为v20插件接口 + PluginsItemInterface_V20 *interface_v20 = qobject_cast(pluginLoader->instance()); + if (interface_v20) { + // 将v20插件接口通过适配器转换成v23的接口,方便在后面识别 + PluginAdapter *pluginAdapter = new PluginAdapter(interface_v20, pluginLoader); + // 将适配器的地址保存到map列表中,因为适配器自己会调用itemAdded方法,转换成PluginsItemInterface类,但是实际上它 + // 对应的是PluginAdapter类,因此,这个map用于在后面的itemAdded方法中用来查找 + m_pluginAdapterMap[(qulonglong)(interface_v20)] = pluginAdapter; + interface = pluginAdapter; + } + } + + if (!interface) { + qDebug() << objectName() << "load plugin failed!!!" << pluginLoader->errorString() << pluginFile; + + pluginLoader->unload(); + pluginLoader->deleteLater(); + + pluginIsValid = false; + } + + if (!pluginIsValid) { + for (auto &pair : m_pluginLoadMap.keys()) { + if (pair.first == pluginFile) { + m_pluginLoadMap.remove(pair); + } + } + QString notifyMessage(tr("The plugin %1 is not compatible with the system.")); + Dtk::Core::DUtil::DNotifySender(notifyMessage.arg(QFileInfo(pluginFile).fileName())).appIcon("dialog-warning").call(); + return; + } + + if (interface->pluginName() == "multitasking" && (Utils::IS_WAYLAND_DISPLAY || Dtk::Core::DSysInfo::deepinType() == Dtk::Core::DSysInfo::DeepinServer)) { + for (auto &pair : m_pluginLoadMap.keys()) { + if (pair.first == pluginFile) { + m_pluginLoadMap.remove(pair); + } + } + return; + } + + QMapIterator, bool> it(m_pluginLoadMap); + while (it.hasNext()) { + it.next(); + if (it.key().first == pluginFile) { + m_pluginLoadMap.remove(it.key()); + QPair newPair; + newPair.first = pluginFile; + newPair.second = interface; + m_pluginLoadMap.insert(newPair, false); + break; + } + } + + // 保存 PluginLoader 对象指针 + QMap interfaceData; + interfaceData["pluginloader"] = pluginLoader; + m_pluginsMap.insert(interface, interfaceData); + QString dbusService = meta.value("depends-daemon-dbus-service").toString(); + if (!dbusService.isEmpty() && !m_dbusDaemonInterface->isServiceRegistered(dbusService).value()) { + qDebug() << objectName() << dbusService << "daemon has not started, waiting for signal"; + connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, + [ = ](const QString & name, const QString & oldOwner, const QString & newOwner) { + Q_UNUSED(oldOwner); + if (name == dbusService && !newOwner.isEmpty()) { + qDebug() << objectName() << dbusService << "daemon started, init plugin and disconnect"; + initPlugin(interface); + disconnect(m_dbusDaemonInterface); + } + } + ); + return; + } + + // NOTE(justforlxz): 插件的所有初始化工作都在init函数中进行, + // loadPlugin函数是按队列执行的,initPlugin函数会有可能导致 + // 函数执行被阻塞。 + QTimer::singleShot(1, this, [ = ] { + initPlugin(interface); + }); +} + +void DockPluginController::initPlugin(PluginsItemInterface *interface) +{ + if (!interface) + return; + + qDebug() << objectName() << "init plugin: " << interface->pluginName(); + interface->init(this); + + for (const auto &pair : m_pluginLoadMap.keys()) { + if (pair.second == interface) + m_pluginLoadMap.insert(pair, true); + } + + bool loaded = true; + for (int i = 0; i < m_pluginLoadMap.keys().size(); ++i) { + if (!m_pluginLoadMap.values()[i]) { + loaded = false; + break; + } + } + + // 插件全部加载完成 + if (loaded) { + emit pluginLoadFinished(); + } + qDebug() << objectName() << "init plugin finished: " << interface->pluginName(); +} + +void DockPluginController::refreshPluginSettings() +{ + const QString &pluginSettings = m_dockDaemonInter->GetPluginSettings().value(); + if (pluginSettings.isEmpty()) { + qDebug() << "Error! get plugin settings from dbus failed!"; + return; + } + + const QJsonObject &pluginSettingsObject = QJsonDocument::fromJson(pluginSettings.toLocal8Bit()).object(); + if (pluginSettingsObject.isEmpty()) { + return; + } + + // nothing changed + if (pluginSettingsObject == m_pluginSettingsObject) { + return; + } + + for (auto pluginsIt = pluginSettingsObject.constBegin(); pluginsIt != pluginSettingsObject.constEnd(); ++pluginsIt) { + const QString &pluginName = pluginsIt.key(); + const QJsonObject &settingsObject = pluginsIt.value().toObject(); + QJsonObject newSettingsObject = m_pluginSettingsObject.value(pluginName).toObject(); + for (auto settingsIt = settingsObject.constBegin(); settingsIt != settingsObject.constEnd(); ++settingsIt) { + newSettingsObject.insert(settingsIt.key(), settingsIt.value()); + } + // TODO: remove not exists key-values + m_pluginSettingsObject.insert(pluginName, newSettingsObject); + } + + // not notify plugins to refresh settings if this update is not emit by dock daemon + if (sender() != m_dockDaemonInter) { + return; + } + + // notify all plugins to reload plugin settings + for (PluginsItemInterface *pluginInter : m_pluginsMap.keys()) { + pluginInter->pluginSettingsChanged(); + } + + // reload all plugin items for sort order or container + QMap> pluginsMapTemp = m_pluginsMap; + for (auto it = pluginsMapTemp.constBegin(); it != pluginsMapTemp.constEnd(); ++it) { + const QList &itemKeyList = it.value().keys(); + for (auto key : itemKeyList) { + if (key != "pluginloader") { + itemRemoved(it.key(), key); + } + } + for (auto key : itemKeyList) { + if (key != "pluginloader") { + itemAdded(it.key(), key); + } + } + } +} + +bool DockPluginController::eventFilter(QObject *object, QEvent *event) +{ + if (object != qApp || event->type() != QEvent::DynamicPropertyChange) + return false; + + QDynamicPropertyChangeEvent *const dpce = static_cast(event); + const QString propertyName = dpce->propertyName(); + + if (propertyName == PROP_POSITION) + positionChanged(); + else if (propertyName == PROP_DISPLAY_MODE) + displayModeChanged(); + + return false; +} + +bool DockPluginController::pluginCanDock(PluginsItemInterface *plugin) const +{ + // 观察插件是否已经驻留在任务栏上,如果已经驻留在任务栏,则始终显示 + if (plugin->flags() & PluginFlag::Attribute_ForceDock) + return true; + + const QStringList configPlugins = SETTINGCONFIG->value(DOCK_QUICK_PLUGINS).toStringList(); + return configPlugins.contains(plugin->pluginName()); +} + +void DockPluginController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) +{ + m_proxyInter->updateDockInfo(itemInter, part); + Q_EMIT pluginUpdated(itemInter, part); +} + +void DockPluginController::onConfigChanged(const QString &key, const QVariant &value) +{ + if (key != DOCK_QUICK_PLUGINS) + return; + + QStringList pluginNames = value.toStringList(); + // 这里只处理工具插件(回收站)和系统插件(电源插件) + for (PluginsItemInterface *plugin : plugins()) { + QString itemKey = this->itemKey(plugin); + if (!pluginNames.contains(plugin->pluginName()) && isPluginLoaded(plugin)) { + // 如果当前配置中不包含当前插件,但是当前插件已经加载,那么就移除该插件 + removePluginItem(plugin, itemKey); + QWidget *itemWidget = plugin->itemWidget(itemKey); + if (itemWidget) + itemWidget->setVisible(false); + } else if (pluginNames.contains(plugin->pluginName()) && !isPluginLoaded(plugin)) { + // 如果当前配置中包含当前插件,但是当前插件并未加载,那么就加载该插件 + addPluginItem(plugin, itemKey); + // 只有工具插件是通过QWidget的方式进行显示的,因此,这里只处理工具插件 + if (plugin->flags() & PluginFlag::Type_Tool) { + QWidget *itemWidget = plugin->itemWidget(itemKey); + if (itemWidget) + itemWidget->setVisible(true); + } + } + } +} diff --git a/plugins/pluginmanager/dockplugincontroller.h b/plugins/pluginmanager/dockplugincontroller.h new file mode 100644 index 000000000..1aa09c1cc --- /dev/null +++ b/plugins/pluginmanager/dockplugincontroller.h @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef DOCKPLUGINCONTROLLER_H +#define DOCKPLUGINCONTROLLER_H + +#include "pluginproxyinterface.h" +#include "pluginloader.h" +#include "dbusutil.h" + +#include +#include +#include + +class PluginsItemInterface; +class PluginAdapter; + +class DockPluginController : public QObject, protected PluginProxyInterface +{ + Q_OBJECT + +public: + explicit DockPluginController(PluginProxyInterface *proxyInter, QObject *parent = Q_NULLPTR); + ~ DockPluginController() override; + + QList plugins() const; // 所有的插件 + QList pluginsInSetting() const; // 控制中心用于可以设置是否显示或隐藏的插件 + QList currentPlugins() const; // 当前使用的插件 + + QString itemKey(PluginsItemInterface *itemInter) const; + QJsonObject metaData(PluginsItemInterface *pluginItem); + + virtual void savePluginValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value); + virtual const QVariant getPluginValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()); + virtual void removePluginValue(PluginsItemInterface * const itemInter, const QStringList &keyList); + void startLoadPlugin(const QStringList &dirs); + +Q_SIGNALS: + void pluginLoadFinished(); + void pluginInserted(PluginsItemInterface *itemInter, QString); + void pluginRemoved(PluginsItemInterface *itemInter); + void pluginUpdated(PluginsItemInterface *, const DockPart); + void requestAppletVisible(PluginsItemInterface *, const QString &, bool); + +protected: + bool isPluginLoaded(PluginsItemInterface *itemInter); + + QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; + PluginsItemInterface *pluginInterAt(const QString &itemKey); + PluginsItemInterface *pluginInterAt(QObject *destItem); + bool eventFilter(QObject *object, QEvent *event) override; + + bool pluginCanDock(PluginsItemInterface *plugin) const; + void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; + +private: + // implements PluginProxyInterface + void saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) override; + const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override; + void removeValue(PluginsItemInterface * const itemInter, const QStringList &keyList) override; + + void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; + void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; + PluginsItemInterface *getPluginInterface(PluginsItemInterface * const itemInter); + + void addPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey); + void removePluginItem(PluginsItemInterface * const itemInter, const QString &itemKey); + +private Q_SLOTS: + void startLoader(PluginLoader *loader); + void displayModeChanged(); + void positionChanged(); + void loadPlugin(const QString &pluginFile); + void initPlugin(PluginsItemInterface *interface); + void refreshPluginSettings(); + void onConfigChanged(const QString &key, const QVariant &value); + +private: + QDBusConnectionInterface *m_dbusDaemonInterface; + DockInter *m_dockDaemonInter; + + // interface, "pluginloader", PluginLoader指针对象 + QMap> m_pluginsMap; + + // filepath, interface, loaded + QMap, bool> m_pluginLoadMap; + + QJsonObject m_pluginSettingsObject; + QMap m_pluginAdapterMap; + + PluginProxyInterface *m_proxyInter; +}; + +#endif // ABSTRACTPLUGINSCONTROLLER_H diff --git a/plugins/pluginmanager/iconmanager.cpp b/plugins/pluginmanager/iconmanager.cpp new file mode 100644 index 000000000..00f3df502 --- /dev/null +++ b/plugins/pluginmanager/iconmanager.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2023 ~ 2023 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "iconmanager.h" +#include "dockplugincontroller.h" +#include "pluginsiteminterface.h" + +#include + +#include +#include + +#define ITEMSPACE 6 +#define ITEMHEIGHT 16 +#define ITEMWIDTH 18 +static QStringList pluginNames = {"power", "sound", "network"}; + +DGUI_USE_NAMESPACE + +IconManager::IconManager(DockPluginController *pluginController, QObject *parent) + : QObject{parent} + , m_pluginController(pluginController) + , m_size(QSize(ITEMWIDTH, ITEMHEIGHT)) + , m_position(Dock::Position::Bottom) +{ +} + +void IconManager::updateSize(QSize size) +{ + m_size = size; +} + +void IconManager::setPosition(Dock::Position position) +{ + m_position = position; +} + +QPixmap IconManager::pixmap() const +{ + QList plugins; + for (const QString &pluginName : pluginNames) { + PluginsItemInterface *plugin = findPlugin(pluginName); + if (plugin) + plugins << plugin; + } + + if (plugins.size() < 2) { + // 缺省图标 + DDciIcon::Theme theme = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType ? DDciIcon::Light : DDciIcon::Dark; + DDciIcon dciIcon(QString(":/resources/dock_control.dci")); + return dciIcon.pixmap(QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio(), ITEMHEIGHT, theme, DDciIcon::Normal); + } + + // 组合图标 + QPixmap pixmap; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + pixmap = QPixmap(ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1), m_size.height() - 8); + } else { + pixmap = QPixmap(m_size.width() - 8, ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1)); + } + + pixmap.fill(Qt::transparent); + QPainter painter(&pixmap); + painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing); + QColor backColor = DGuiApplicationHelper::ColorType::DarkType == DGuiApplicationHelper::instance()->themeType() ? QColor(20, 20, 20) : Qt::white; + backColor.setAlphaF(0.2); + QPainterPath path; + path.addRoundedRect(pixmap.rect(), 5, 5); + painter.fillPath(path, backColor); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + QPoint pointPixmap(ITEMSPACE, (pixmap.height() - ITEMHEIGHT) / 2); + for (PluginsItemInterface *plugin : plugins) { + QIcon icon = plugin->icon(DockPart::QuickShow); + QPixmap pixmapDraw = icon.pixmap(ITEMHEIGHT, ITEMHEIGHT); + painter.drawPixmap(pointPixmap, pixmapDraw); + pointPixmap.setX(pointPixmap.x() + ITEMWIDTH + ITEMSPACE); + } + } else { + QPoint pointPixmap((pixmap.width() - ITEMWIDTH) / 2, ITEMSPACE); + for (PluginsItemInterface *plugin : plugins) { + QIcon icon = plugin->icon(DockPart::QuickShow); + QPixmap pixmapDraw = icon.pixmap(ITEMHEIGHT, ITEMHEIGHT); + painter.drawPixmap(pointPixmap, pixmapDraw); + pointPixmap.setY(pointPixmap.y() + ITEMWIDTH + ITEMSPACE); + } + } + painter.end(); + return pixmap; +} + +bool IconManager::isFixedPlugin(PluginsItemInterface *plugin) const +{ + return pluginNames.contains(plugin->pluginName()); +} + +PluginsItemInterface *IconManager::findPlugin(const QString &pluginName) const +{ + QList plugins = m_pluginController->currentPlugins(); + for (PluginsItemInterface *plugin : plugins) { + if (plugin->pluginName() == pluginName) + return plugin; + } + + return nullptr; +} diff --git a/plugins/pluginmanager/iconmanager.h b/plugins/pluginmanager/iconmanager.h new file mode 100644 index 000000000..ff5363599 --- /dev/null +++ b/plugins/pluginmanager/iconmanager.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2023 ~ 2023 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef ICONMANAGER_H +#define ICONMANAGER_H + +#include "pluginsiteminterface.h" + +#include +#include + +class DockPluginController; +class PluginsItemInterface; + +class IconManager : public QObject +{ + Q_OBJECT + +public: + explicit IconManager(DockPluginController *pluginController, QObject *parent = nullptr); + void updateSize(QSize size); + void setPosition(Dock::Position position); + QPixmap pixmap() const; + bool isFixedPlugin(PluginsItemInterface *plugin) const; + +private: + PluginsItemInterface *findPlugin(const QString &pluginName) const; + +private: + DockPluginController *m_pluginController; + QSize m_size; + Dock::Position m_position; +}; + +#endif // ICONMANAGER_H diff --git a/plugins/pluginmanager/largerquickitem.cpp b/plugins/pluginmanager/largerquickitem.cpp new file mode 100644 index 000000000..8f805bb4e --- /dev/null +++ b/plugins/pluginmanager/largerquickitem.cpp @@ -0,0 +1,313 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "largerquickitem.h" +#include "pluginsiteminterface.h" + +#include +#include +#include + +#include +#include +#include + +#define BGSIZE 36 +#define ICONWIDTH 24 +#define ICONHEIGHT 24 + +DWIDGET_USE_NAMESPACE + +static QSize expandSize = QSize(20, 20); + +LargerQuickItem::LargerQuickItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) + : QuickSettingItem(pluginInter, itemKey, parent) + , m_iconWidget(nullptr) + , m_nameLabel(nullptr) + , m_stateLabel(nullptr) + , m_itemWidgetParent(nullptr) +{ + initUi(); +} + +LargerQuickItem::~LargerQuickItem() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) + itemWidget->setParent(nullptr); +} + +void LargerQuickItem::doUpdate() +{ + if (m_iconWidget && m_nameLabel && m_stateLabel) { + m_iconWidget->update(); + m_nameLabel->setText(QFontMetrics(m_nameLabel->font()).elidedText(pluginItem()->pluginDisplayName(), Qt::TextElideMode::ElideRight, m_nameLabel->width())); + m_stateLabel->setText(QFontMetrics(m_stateLabel->font()).elidedText(pluginItem()->description(), Qt::TextElideMode::ElideRight, m_stateLabel->width())); + } else { + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) { + // 如果插件没有返回图标的显示,则获取插件的itemWidget + itemWidget->update(); + } + } +} + +void LargerQuickItem::detachPlugin() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget && itemWidget->parentWidget() == this) + itemWidget->setParent(m_itemWidgetParent); +} + +QuickSettingItem::QuickItemStyle LargerQuickItem::type() const +{ + return QuickSettingItem::QuickItemStyle::Larger; +} + +bool LargerQuickItem::eventFilter(QObject *obj, QEvent *event) +{ + if (!m_iconWidget) + return QuickSettingItem::eventFilter(obj, event); + + switch (event->type()) { + case QEvent::MouseButtonRelease: { + if (obj->objectName() == "expandLabel") { + // 如果是鼠标的按下事件 + QWidget *widget = pluginItem()->itemPopupApplet(QUICK_ITEM_KEY); + if (widget) + Q_EMIT requestShowChildWidget(widget); + break; + } + if (obj == this) { + QStringList commandArgumend = pluginItem()->itemCommand(itemKey()).split(" "); + if (commandArgumend.size() == 0) + break; + + QString command = commandArgumend.first(); + commandArgumend.removeFirst(); + QProcess::startDetached(command, commandArgumend); + } + break; + } + case QEvent::Resize: { + QLabel *labelWidget = qobject_cast(obj); + if (!labelWidget) + break; + + if (labelWidget == m_nameLabel) { + labelWidget->setText(QFontMetrics(labelWidget->font()).elidedText(pluginItem()->pluginDisplayName(), Qt::TextElideMode::ElideRight, labelWidget->width())); + break; + } + if (labelWidget == m_stateLabel) { + labelWidget->setText(QFontMetrics(labelWidget->font()).elidedText(pluginItem()->description(), Qt::TextElideMode::ElideRight, labelWidget->width())); + } + break; + } + default: + break; + } + + return QuickSettingItem::eventFilter(obj, event); +} + +void LargerQuickItem::showEvent(QShowEvent *event) +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (pluginItem()->icon(DockPart::QuickPanel).isNull() && itemWidget) { + itemWidget->setParent(this); + itemWidget->setVisible(true); + } +} + +void LargerQuickItem::resizeEvent(QResizeEvent *event) +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (pluginItem()->icon(DockPart::QuickPanel).isNull() && itemWidget) { + itemWidget->setFixedSize(size()); + } + + QuickSettingItem::resizeEvent(event); +} + +void LargerQuickItem::initUi() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (pluginItem()->icon(DockPart::QuickPanel).isNull() && itemWidget) { + m_itemWidgetParent = itemWidget->parentWidget(); + // 如果插件没有返回图标的显示,则获取插件的itemWidget + QHBoxLayout *mainLayout = new QHBoxLayout(this); + itemWidget->setParent(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->addWidget(itemWidget); + itemWidget->setVisible(true); + } else { + // 如果插件获取到插件区域的图标,则让其按照图标来组合显示 + // 如果是占用两排的插件,则用横向Layout + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(10, 0, 10, 0); + mainLayout->setSpacing(0); + mainLayout->addStretch(10); + mainLayout->setAlignment(Qt::AlignCenter); + + // 添加图标 + QWidget *iconWidgetParent = new QWidget(this); + QVBoxLayout *iconLayout = new QVBoxLayout(iconWidgetParent); + iconLayout->setContentsMargins(0, 0, 0, 0); + iconLayout->setSpacing(0); + iconLayout->setAlignment(Qt::AlignCenter); + + m_iconWidget = new QuickIconWidget(pluginItem(), itemKey(), iconWidgetParent); + m_iconWidget->setFixedSize(BGSIZE, BGSIZE); + iconLayout->addWidget(m_iconWidget); + mainLayout->addWidget(iconWidgetParent); + mainLayout->addSpacing(10); + + // 添加中间的名称部分 + QWidget *textWidget = new QWidget(this); + m_nameLabel = new QLabel(textWidget); + m_stateLabel = new QLabel(textWidget); + m_nameLabel->setObjectName("nameLabel"); + m_stateLabel->setObjectName("stateLabel"); + + // 设置图标和文字的属性 + QFont nameFont = DFontSizeManager::instance()->t6(); + nameFont.setBold(true); + QPalette pe; + pe.setColor(QPalette::WindowText, Qt::black); + m_nameLabel->setPalette(pe); + m_stateLabel->setPalette(pe); + m_nameLabel->setFont(nameFont); + m_stateLabel->setFont(DFontSizeManager::instance()->t10()); + m_nameLabel->setText(pluginItem()->pluginDisplayName()); + m_stateLabel->setText(pluginItem()->description()); + m_nameLabel->installEventFilter(this); + m_stateLabel->installEventFilter(this); + + QVBoxLayout *textLayout = new QVBoxLayout(textWidget); + textLayout->setContentsMargins(0, 0, 0, 0); + textLayout->setSpacing(0); + textLayout->addWidget(m_nameLabel); + textLayout->addWidget(m_stateLabel); + textLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + mainLayout->addWidget(textWidget); + + // 添加右侧的展开按钮 + QWidget *expandWidgetParent = new QWidget(this); + QVBoxLayout *expandLayout = new QVBoxLayout(expandWidgetParent); + expandLayout->setSpacing(0); + QLabel *expandLabel = new QLabel(expandWidgetParent); + expandLabel->setObjectName("expandLabel"); + expandLabel->setPixmap(QPixmap(expandFileName())); + expandLabel->setFixedSize(expandSize); + expandLabel->setAutoFillBackground(true); + expandLabel->installEventFilter(this); + expandLayout->addWidget(expandLabel); + pe.setBrush(QPalette::Window, Qt::transparent); + expandLabel->setPalette(pe); + mainLayout->addWidget(expandWidgetParent); + } +} + +QString LargerQuickItem::expandFileName() const +{ + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + return QString(":/icons/resources/arrow-right-dark.svg"); + + return QString(":/icons/resources/arrow-right.svg"); +} + +/** + * @brief QuickIconWidget::QuickIconWidget + * @param pluginInter + * @param parent + * 图标的widget + */ +QuickIconWidget::QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, QWidget *parent) + : QWidget(parent) + , m_pluginInter(pluginInter) + , m_itemKey(itemKey) +{ +} + +void QuickIconWidget::paintEvent(QPaintEvent *event) +{ + QPixmap pixmapIcon = pluginIcon(); + if (pixmapIcon.isNull()) + return QWidget::paintEvent(event); + + pixmapIcon = pluginIcon(true); + QPainter painter(this); + painter.setRenderHint(QPainter::RenderHint::Antialiasing); + painter.setPen(foregroundColor()); + + DPalette dpa = DPaletteHelper::instance()->palette(this); + QPainter pa(&pixmapIcon); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pixmapIcon.rect(), painter.pen().brush()); + // 如果是主图标,则显示阴影背景 + painter.save(); + painter.setPen(Qt::NoPen); + painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); + painter.drawEllipse(rect()); + painter.restore(); + QRect rctIcon((rect().width() - pixmapIcon.width()) / 2, (rect().height() - pixmapIcon.height()) / 2, pixmapIcon.width(), pixmapIcon.height()); + painter.drawPixmap(rctIcon, pixmapIcon); +} + +QColor QuickIconWidget::foregroundColor() const +{ + DPalette dpa = DPaletteHelper::instance()->palette(this); + // TODO 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 + if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Active) + return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); + + if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Deactive) + return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); + + return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); +} + +QPixmap QuickIconWidget::pluginIcon(bool contailGrab) const +{ + QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); + if (icon.isNull() && contailGrab) { + // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 + QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); + if (itemWidget) { + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + return itemWidget->grab(); + } + return QPixmap(); + } + + // 获取icon接口返回的图标 + int pixmapWidth = width(); + int pixmapHeight = height(); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) { + QSize size = iconSizes[0]; + if (size.isValid() && !size.isEmpty() && !size.isNull()) { + pixmapWidth = size.width(); + pixmapHeight = size.height(); + } + } + + return icon.pixmap(pixmapWidth, pixmapHeight); +} diff --git a/plugins/pluginmanager/largerquickitem.h b/plugins/pluginmanager/largerquickitem.h new file mode 100644 index 000000000..43abc83f5 --- /dev/null +++ b/plugins/pluginmanager/largerquickitem.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef LARGERQUICKITEM_H +#define LARGERQUICKITEM_H + +#include + +class QuickIconWidget; +class QWidget; +class QLabel; + +// 插件在快捷面板中的展示样式,这个为大图标,展示为两列的那种,例如网络和蓝牙 +class LargerQuickItem : public QuickSettingItem +{ + Q_OBJECT + +public: + LargerQuickItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + ~LargerQuickItem() override; + void doUpdate() override; + void detachPlugin() override; + + QuickItemStyle type() const override; + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + void showEvent(QShowEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + +private: + void initUi(); + QString expandFileName() const; + +private: + QuickIconWidget *m_iconWidget; + QLabel *m_nameLabel; + QLabel *m_stateLabel; + QWidget *m_itemWidgetParent; +}; + +/** + * @brief The QuickIconWidget class + * 图标的Widget + */ +class QuickIconWidget : public QWidget +{ + Q_OBJECT + +public: + explicit QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, QWidget *parent = Q_NULLPTR); + +protected: + void paintEvent(QPaintEvent *event) override; + +private: + QColor foregroundColor() const; + QPixmap pluginIcon(bool contailGrab = false) const; + +private: + PluginsItemInterface *m_pluginInter; + QString m_itemKey; +}; + +#endif // MULTIQUICKITEM_H diff --git a/plugins/pluginmanager/linequickitem.cpp b/plugins/pluginmanager/linequickitem.cpp new file mode 100644 index 000000000..1966c6e84 --- /dev/null +++ b/plugins/pluginmanager/linequickitem.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "linequickitem.h" +#include "pluginsiteminterface.h" + +#include + +#include + +DWIDGET_USE_NAMESPACE + +LineQuickItem::LineQuickItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) + : QuickSettingItem(pluginInter, itemKey, parent) + , m_centerWidget(pluginInter->itemWidget(QUICK_ITEM_KEY)) + , m_centerParentWidget(nullptr) + , m_effectWidget(new DBlurEffectWidget(this)) +{ + initUi(); + QMetaObject::invokeMethod(this, &LineQuickItem::resizeSelf, Qt::QueuedConnection); +} + +LineQuickItem::~LineQuickItem() +{ + if (m_centerWidget) + m_centerWidget->setParent(nullptr); +} + +void LineQuickItem::doUpdate() +{ + if (m_centerWidget) + m_centerWidget->update(); +} + +void LineQuickItem::detachPlugin() +{ + if (m_centerWidget) + m_centerWidget->setParent(m_centerParentWidget); +} + +QuickSettingItem::QuickItemStyle LineQuickItem::type() const +{ + return QuickSettingItem::QuickItemStyle::Line; +} + +bool LineQuickItem::eventFilter(QObject *obj, QEvent *event) +{ + if (obj == m_centerWidget && event->type() == QEvent::Resize) + resizeSelf(); + + return QuickSettingItem::eventFilter(obj, event); +} + +void LineQuickItem::initUi() +{ + QColor maskColor(Qt::white); + maskColor.setAlphaF(0.8); + m_effectWidget->setMaskColor(maskColor); + m_effectWidget->setBlurRectXRadius(8); + m_effectWidget->setBlurRectYRadius(8); + + // 如果图标不为空 + if (!m_centerWidget) + return; + + m_centerWidget->setVisible(true); + m_centerParentWidget = m_centerWidget->parentWidget(); + + QHBoxLayout *layout = new QHBoxLayout(m_effectWidget); + layout->setContentsMargins(0, 0, 0, 0); + layout->setAlignment(Qt::AlignHCenter); + layout->addWidget(m_centerWidget); + + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->addWidget(m_effectWidget); + + m_centerWidget->installEventFilter(this); +} + +void LineQuickItem::resizeSelf() +{ + if (!m_centerWidget) + return; + + m_effectWidget->setFixedHeight(m_centerWidget->height()); + setFixedHeight(m_centerWidget->height()); +} diff --git a/plugins/pluginmanager/linequickitem.h b/plugins/pluginmanager/linequickitem.h new file mode 100644 index 000000000..e284f37cd --- /dev/null +++ b/plugins/pluginmanager/linequickitem.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef LINEQUICKITEM_H +#define LINEQUICKITEM_H + +#include "quicksettingitem.h" + +namespace Dtk { +namespace Widget { +class DBlurEffectWidget; +} +} + +// 插件在快捷面板中的展示的样式,这个为整行显示的插件,例如声音,亮度调整和音乐播放等 +class LineQuickItem : public QuickSettingItem +{ + Q_OBJECT + +public: + LineQuickItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + ~LineQuickItem() override; + void doUpdate() override; + void detachPlugin() override; + + QuickItemStyle type() const override; + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + +private: + void initUi(); + void resizeSelf(); + +private: + QWidget *m_centerWidget; + QWidget *m_centerParentWidget; + Dtk::Widget::DBlurEffectWidget *m_effectWidget; +}; + +#endif // FULLQUICKITEM_H diff --git a/plugins/pluginmanager/pluginadapter/pluginadapter.cpp b/plugins/pluginmanager/pluginadapter/pluginadapter.cpp new file mode 100644 index 000000000..80c39e021 --- /dev/null +++ b/plugins/pluginmanager/pluginadapter/pluginadapter.cpp @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "pluginadapter.h" + +#include + +#define ICONWIDTH 24 +#define ICONHEIGHT 24 + +PluginAdapter::PluginAdapter(PluginsItemInterface_V20 *pluginInter, QPluginLoader *pluginLoader) + : m_pluginInter(pluginInter) + , m_pluginLoader(pluginLoader) +{ +} + +PluginAdapter::~PluginAdapter() +{ + delete m_pluginInter; +} + +const QString PluginAdapter::pluginName() const +{ + return m_pluginInter->pluginName(); +} + +const QString PluginAdapter::pluginDisplayName() const +{ + return m_pluginInter->pluginDisplayName(); +} + +void PluginAdapter::init(PluginProxyInterface *proxyInter) +{ + m_pluginInter->init(proxyInter); +} + +QWidget *PluginAdapter::itemWidget(const QString &itemKey) +{ + return m_pluginInter->itemWidget(itemKey); +} + +QWidget *PluginAdapter::itemTipsWidget(const QString &itemKey) +{ + return m_pluginInter->itemTipsWidget(itemKey); +} + +QWidget *PluginAdapter::itemPopupApplet(const QString &itemKey) +{ + return m_pluginInter->itemPopupApplet(itemKey); +} + +const QString PluginAdapter::itemCommand(const QString &itemKey) +{ + return m_pluginInter->itemCommand(itemKey); +} + +const QString PluginAdapter::itemContextMenu(const QString &itemKey) +{ + return m_pluginInter->itemContextMenu(itemKey); +} + +void PluginAdapter::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) +{ + m_pluginInter->invokedMenuItem(itemKey, menuId, checked); +} + +int PluginAdapter::itemSortKey(const QString &itemKey) +{ + return m_pluginInter->itemSortKey(itemKey); +} + +void PluginAdapter::setSortKey(const QString &itemKey, const int order) +{ + m_pluginInter->setSortKey(itemKey, order); +} + +bool PluginAdapter::itemAllowContainer(const QString &itemKey) +{ + return m_pluginInter->itemAllowContainer(itemKey); +} + +bool PluginAdapter::itemIsInContainer(const QString &itemKey) +{ + return m_pluginInter->itemIsInContainer(itemKey); +} + +void PluginAdapter::setItemIsInContainer(const QString &itemKey, const bool container) +{ + m_pluginInter->setItemIsInContainer(itemKey, container); +} + +bool PluginAdapter::pluginIsAllowDisable() +{ + return m_pluginInter->pluginIsAllowDisable(); +} + +bool PluginAdapter::pluginIsDisable() +{ + return m_pluginInter->pluginIsDisable(); +} + +void PluginAdapter::pluginStateSwitched() +{ + m_pluginInter->pluginStateSwitched(); +} + +void PluginAdapter::displayModeChanged(const Dock::DisplayMode displayMode) +{ + m_pluginInter->displayModeChanged(displayMode); +} + +void PluginAdapter::positionChanged(const Dock::Position position) +{ + m_pluginInter->positionChanged(position); +} + +void PluginAdapter::refreshIcon(const QString &itemKey) +{ + m_pluginInter->refreshIcon(itemKey); +} + +void PluginAdapter::pluginSettingsChanged() +{ + m_pluginInter->pluginSettingsChanged(); +} + +PluginsItemInterface::PluginType PluginAdapter::type() +{ + switch (m_pluginInter->type()) { + case PluginsItemInterface_V20::PluginType::Fixed: + return PluginsItemInterface::PluginType::Fixed; + case PluginsItemInterface_V20::PluginType::Normal: + return PluginsItemInterface::PluginType::Normal; + } + return PluginsItemInterface::PluginType::Normal; +} + +PluginsItemInterface::PluginSizePolicy PluginAdapter::pluginSizePolicy() const +{ + switch (m_pluginInter->pluginSizePolicy()) { + case PluginsItemInterface_V20::PluginSizePolicy::Custom: + return PluginsItemInterface::PluginSizePolicy::Custom; + case PluginsItemInterface_V20::PluginSizePolicy::System: + return PluginsItemInterface::PluginSizePolicy::System; + } + return PluginsItemInterface::PluginSizePolicy::Custom; +} + +QIcon PluginAdapter::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) +{ + QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); + if (!itemWidget) + return QIcon(); + + switch (dockPart) { + case DockPart::QuickPanel: + case DockPart::SystemPanel: { + // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 + QSize oldSize = itemWidget->size(); + itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); + QPixmap pixmap = itemWidget->grab(); + itemWidget->setFixedSize(oldSize); + return pixmap; + } + default: break; + } + + return QIcon(); +} + +PluginsItemInterface::PluginMode PluginAdapter::status() const +{ + return PluginMode::Active; +} + +QString PluginAdapter::description() const +{ + return m_pluginInter->pluginDisplayName(); +} + +PluginFlags PluginAdapter::flags() const +{ + if (m_pluginLoader->fileName().contains(TRAY_PATH)) + return PluginFlag::Type_Tray | PluginFlag::Attribute_CanDrag | PluginFlag::Attribute_CanInsert; + + return PluginsItemInterface::flags(); +} + +void PluginAdapter::setItemKey(const QString &itemKey) +{ + m_itemKey = itemKey; +} diff --git a/plugins/pluginmanager/pluginadapter/pluginadapter.h b/plugins/pluginmanager/pluginadapter/pluginadapter.h new file mode 100644 index 000000000..49ecd3135 --- /dev/null +++ b/plugins/pluginmanager/pluginadapter/pluginadapter.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef PLUGINADAPTER_H +#define PLUGINADAPTER_H + +#include "pluginsiteminterface.h" +#include "pluginsiteminterface_v20.h" + +#include + +/** 适配器,当加载到v20插件的时候,通过该接口来转成v23接口的插件 + * @brief The PluginAdapter class + */ + +class PluginAdapter : public QObject, public PluginsItemInterface +{ + Q_OBJECT + Q_INTERFACES(PluginsItemInterface) + +public: + PluginAdapter(PluginsItemInterface_V20 *pluginInter, QPluginLoader *pluginLoader); + ~PluginAdapter(); + + const QString pluginName() const override; + const QString pluginDisplayName() const override; + void init(PluginProxyInterface *proxyInter) override; + QWidget *itemWidget(const QString &itemKey) override; + + QWidget *itemTipsWidget(const QString &itemKey) override; + QWidget *itemPopupApplet(const QString &itemKey) override; + const QString itemCommand(const QString &itemKey) override; + const QString itemContextMenu(const QString &itemKey) override; + void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; + int itemSortKey(const QString &itemKey) override; + void setSortKey(const QString &itemKey, const int order) override; + bool itemAllowContainer(const QString &itemKey) override; + bool itemIsInContainer(const QString &itemKey) override; + void setItemIsInContainer(const QString &itemKey, const bool container) override; + + bool pluginIsAllowDisable() override; + bool pluginIsDisable() override; + void pluginStateSwitched() override; + void displayModeChanged(const Dock::DisplayMode displayMode) override; + void positionChanged(const Dock::Position position) override; + void refreshIcon(const QString &itemKey) override; + void pluginSettingsChanged() override; + PluginType type() override; + PluginSizePolicy pluginSizePolicy() const override; + + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType = DGuiApplicationHelper::instance()->themeType()) override; + PluginMode status() const override; + QString description() const override; + PluginFlags flags() const override; + + void setItemKey(const QString &itemKey); + +private: + PluginsItemInterface_V20 *m_pluginInter; + QString m_itemKey; + QPluginLoader *m_pluginLoader; +}; + +#endif // PLUGINADAPTER_H diff --git a/plugins/pluginmanager/pluginadapter/pluginsiteminterface_v20.h b/plugins/pluginmanager/pluginadapter/pluginsiteminterface_v20.h new file mode 100644 index 000000000..913aa0e9d --- /dev/null +++ b/plugins/pluginmanager/pluginadapter/pluginsiteminterface_v20.h @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ + +#ifndef PLUGINSITEMINTERFACE_V20_H +#define PLUGINSITEMINTERFACE_V20_H + +#include "pluginproxyinterface.h" + +#include +#include + +/// +/// \brief The PluginsItemInterface_V20 class +/// the dock plugins item interface, all dock plugins should +/// inheirt this class and override all pure virtual function. +/// +class PluginsItemInterface_V20 +{ +public: + enum PluginType { + Normal, + Fixed + }; + + /** + * @brief Plugin size policy + */ + enum PluginSizePolicy { + System = 1 << 0, // Follow the system + Custom = 1 << 1 // The custom + }; + + /// + /// \brief ~PluginsItemInterface_V20 + /// DON'T try to delete m_proxyInter. + /// + virtual ~PluginsItemInterface_V20() {} + + /// + /// \brief pluginName + /// tell dock the unique plugin id + /// \return + /// + virtual const QString pluginName() const = 0; + virtual const QString pluginDisplayName() const { return QString(); } + + /// + /// \brief init + /// init your plugins, you need to save proxyInter to m_proxyInter + /// member variable. but you shouldn't free this pointer. + /// \param proxyInter + /// DON'T try to delete this pointer. + /// + virtual void init(PluginProxyInterface *proxyInter) = 0; + /// + /// \brief itemWidget + /// your plugin item widget, each item should have a unique key. + /// \param itemKey + /// your widget' unqiue key. + /// \return + /// + virtual QWidget *itemWidget(const QString &itemKey) = 0; + + /// + /// \brief itemTipsWidget + /// override this function if your item want to have a tips. + /// the tips will shown when user hover your item. + /// nullptr will be ignored. + /// \param itemKey + /// \return + /// + virtual QWidget *itemTipsWidget(const QString &itemKey) {Q_UNUSED(itemKey); return nullptr;} + /// + /// \brief itemPopupApplet + /// override this function if your item wants to have an popup applet. + /// the popup applet will shown when user click your item. + /// + /// Tips: + /// dock should receive mouse press/release event to check user mouse operate, + /// if your item filter mouse event, this function will not be called. + /// so if you override mouse event and want to use popup applet, you + /// should pass event to your parent use QWidget::someEvent(e); + /// \param itemKey + /// \return + /// + virtual QWidget *itemPopupApplet(const QString &itemKey) {Q_UNUSED(itemKey); return nullptr;} + /// + /// \brief itemCommand + /// execute spec command when user clicked your item. + /// ensure your command do not get user input. + /// + /// empty string will be ignored. + /// \param itemKey + /// \return + /// + virtual const QString itemCommand(const QString &itemKey) {Q_UNUSED(itemKey); return QString();} + + /// + /// \brief itemContextMenu + /// context menu is shown when RequestPopupMenu called. + /// \param itemKey + /// \return + /// + virtual const QString itemContextMenu(const QString &itemKey) {Q_UNUSED(itemKey); return QString();} + /// + /// \brief invokedMenuItem + /// call if context menu item is clicked + /// \param itemKey + /// \param itemId + /// menu item id + /// \param checked + /// + virtual void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) {Q_UNUSED(itemKey); Q_UNUSED(menuId); Q_UNUSED(checked);} + + /// + /// \brief itemSortKey + /// tell dock where your item wants to put on. + /// + /// this index is start from 1 and + /// 0 for left side + /// -1 for right side + /// \param itemKey + /// \return + /// + virtual int itemSortKey(const QString &itemKey) {Q_UNUSED(itemKey); return 1;} + /// + /// \brief setSortKey + /// save your item new position + /// sort key will be changed when plugins order + /// changed(by user drag-drop) + /// \param itemKey + /// \param order + /// + virtual void setSortKey(const QString &itemKey, const int order) {Q_UNUSED(itemKey); Q_UNUSED(order);} + + /// + /// \brief itemAllowContainer + /// tell dock is your item allow to move into container + /// + /// if your item placed into container, popup tips and popup + /// applet will be disabled. + /// \param itemKey + /// \return + /// + virtual bool itemAllowContainer(const QString &itemKey) {Q_UNUSED(itemKey); return false;} + /// + /// \brief itemIsInContainer + /// tell dock your item is in container, this function + /// called at item init and if your item enable container. + /// \param itemKey + /// \return + /// + virtual bool itemIsInContainer(const QString &itemKey) {Q_UNUSED(itemKey); return false;} + /// + /// \brief setItemIsInContainer + /// save your item new state. + /// this function called when user drag out your item from + /// container or user drop item into container(if your item + /// allow drop into container). + /// \param itemKey + /// \param container + /// + virtual void setItemIsInContainer(const QString &itemKey, const bool container) {Q_UNUSED(itemKey); Q_UNUSED(container);} + + virtual bool pluginIsAllowDisable() { return false; } + virtual bool pluginIsDisable() { return false; } + virtual void pluginStateSwitched() {} + + /// + /// \brief displayModeChanged + /// override this function to receive display mode changed signal + /// \param displayMode + /// + virtual void displayModeChanged(const Dock::DisplayMode displayMode) {Q_UNUSED(displayMode);} + /// + /// \brief positionChanged + /// override this function to receive dock position changed signal + /// \param position + /// + virtual void positionChanged(const Dock::Position position) {Q_UNUSED(position);} + + /// + /// \brief refreshIcon + /// refresh item icon, its triggered when system icon theme changed. + /// \param itemKey + /// item key + /// + virtual void refreshIcon(const QString &itemKey) { Q_UNUSED(itemKey); } + + /// + /// \brief displayMode + /// get current dock display mode + /// \return + /// + inline Dock::DisplayMode displayMode() const + { + return qApp->property(PROP_DISPLAY_MODE).value(); + } + + /// + /// \brief position + /// get current dock position + /// \return + /// + inline Dock::Position position() const + { + return qApp->property(PROP_POSITION).value(); + } + + /// + /// \brief settingsChanged + /// override this function to receive plugin settings changed signal(DeepinSync) + /// + virtual void pluginSettingsChanged() {} + + /// + /// \brief type + /// default plugin add dock right,fixed plugin add to dock fixed area + /// + virtual PluginType type() { return Normal; } + + /// + /// \brief plugin size policy + /// default plugin size policy + /// + virtual PluginSizePolicy pluginSizePolicy() const { return System; } + +protected: + /// + /// \brief m_proxyInter + /// NEVER delete this object. + /// + PluginProxyInterface *m_proxyInter = nullptr; +}; + +QT_BEGIN_NAMESPACE + +#define ModuleInterfaceV20_iid "com.deepin.dock.PluginsItemInterface" + +Q_DECLARE_INTERFACE(PluginsItemInterface_V20, ModuleInterfaceV20_iid) +QT_END_NAMESPACE + +#endif // PLUGINSITEMINTERFACE_H diff --git a/plugins/pluginmanager/pluginchildpage.cpp b/plugins/pluginmanager/pluginchildpage.cpp new file mode 100644 index 000000000..ee8fbe0ff --- /dev/null +++ b/plugins/pluginmanager/pluginchildpage.cpp @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "pluginchildpage.h" + +#include +#include + +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE +DGUI_USE_NAMESPACE + +PluginChildPage::PluginChildPage(QWidget *parent) + : QWidget(parent) + , m_headerWidget(new QWidget(this)) + , m_back(new QPushButton(m_headerWidget)) + , m_title(new QLabel(m_headerWidget)) + , m_container(new QWidget(this)) + , m_topWidget(nullptr) + , m_containerLayout(new QVBoxLayout(m_container)) +{ + initUi(); + initConnection(); +} + +PluginChildPage::~PluginChildPage() +{ +} + +void PluginChildPage::pushWidget(QWidget *widget) +{ + // 首先将界面其他的窗体移除 + for (int i = m_containerLayout->count() - 1; i >= 0; i--) { + QLayoutItem *item = m_containerLayout->itemAt(i); + item->widget()->removeEventFilter(this); + item->widget()->hide(); + m_containerLayout->removeItem(item); + } + m_topWidget = widget; + if (widget) { + widget->installEventFilter(this); + m_containerLayout->addWidget(widget); + widget->show(); + } + QMetaObject::invokeMethod(this, &PluginChildPage::resetHeight, Qt::QueuedConnection); +} + +void PluginChildPage::setTitle(const QString &text) +{ + m_title->setText(text); +} + +void PluginChildPage::initUi() +{ + m_back->setIcon(backPixmap()); + m_back->setFixedWidth(24); + m_back->setFlat(true); + m_title->setAlignment(Qt::AlignCenter); + QHBoxLayout *headerLayout = new QHBoxLayout(m_headerWidget); + headerLayout->setContentsMargins(11, 12, 24 + 11, 12); + headerLayout->setSpacing(0); + headerLayout->addWidget(m_back); + headerLayout->addWidget(m_title); + m_headerWidget->setFixedHeight(48); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + + mainLayout->addWidget(m_headerWidget); + mainLayout->addWidget(m_container); + m_containerLayout->setContentsMargins(11, 0, 11, 0); + m_containerLayout->setSpacing(0); +} + +void PluginChildPage::initConnection() +{ + connect(m_back, &QPushButton::clicked, this, &PluginChildPage::back); +} + +bool PluginChildPage::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_topWidget && event->type() == QEvent::Resize) { + resetHeight(); + } + return QWidget::eventFilter(watched, event); +} + +void PluginChildPage::resetHeight() +{ + QMargins m = m_containerLayout->contentsMargins(); + m_container->setFixedHeight(m.top() + m.bottom() + (m_topWidget ? m_topWidget->height() : 0)); + setFixedHeight(m_headerWidget->height() + m_container->height()); +} + +QPixmap PluginChildPage::backPixmap() const +{ + QPixmap pixmap(16, 16); + pixmap.fill(Qt::transparent); + + // 设置背景色 + QColor backColor; + if (DGuiApplicationHelper::ColorType::DarkType == DGuiApplicationHelper::instance()->themeType()) { + backColor = Qt::black; + backColor.setAlphaF(0.05); + } else { + backColor = Qt::white; + backColor.setAlphaF(0.2); + } + QPainter painter(&pixmap); + painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing); + painter.setPen(Qt::NoPen); + QPainterPath path; + path.addEllipse(pixmap.rect()); + painter.fillPath(path, backColor); + QSize arrowSize(10, 10); + QPixmap arrowPixmap = DStyle::standardIcon(style(), DStyle::SP_ArrowLeave).pixmap(arrowSize); + // 让其居中显示 + QSize backSize = pixmap.size(); + painter.drawPixmap((backSize.width() - arrowSize.width()) / 2, (backSize.height() - arrowSize.height()) / 2, + arrowSize.width(), arrowSize.height(), arrowPixmap); + painter.end(); + return pixmap; +} diff --git a/plugins/pluginmanager/pluginchildpage.h b/plugins/pluginmanager/pluginchildpage.h new file mode 100644 index 000000000..a81c52789 --- /dev/null +++ b/plugins/pluginmanager/pluginchildpage.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef PLUGINCHILDPAGE_H +#define PLUGINCHILDPAGE_H + +#include + +class QPushButton; +class QLabel; +class QVBoxLayout; + +class PluginChildPage : public QWidget +{ + Q_OBJECT + +public: + explicit PluginChildPage(QWidget *parent); + ~PluginChildPage() override; + void pushWidget(QWidget *widget); + void setTitle(const QString &text); + +Q_SIGNALS: + void back(); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + +private: + void initUi(); + void initConnection(); + void resetHeight(); + QPixmap backPixmap() const; + +private: + QWidget *m_headerWidget; + QPushButton *m_back; + QLabel *m_title; + QWidget *m_container; + QWidget *m_topWidget; + QVBoxLayout *m_containerLayout; +}; + +#endif // PLUGINCHILDPAGE_H diff --git a/plugins/pluginmanager/pluginmanager.cpp b/plugins/pluginmanager/pluginmanager.cpp new file mode 100644 index 000000000..4704e29c4 --- /dev/null +++ b/plugins/pluginmanager/pluginmanager.cpp @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2023 ~ 2023 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "pluginmanager.h" +#include "dockplugincontroller.h" +#include "quicksettingcontainer.h" +#include "iconmanager.h" + +#include + +PluginManager::PluginManager(QObject *parent) + : m_dockController(nullptr) + , m_iconManager(nullptr) +{ +} + +const QString PluginManager::pluginName() const +{ + return "pluginManager"; +} + +const QString PluginManager::pluginDisplayName() const +{ + return "pluginManager"; +} + +void PluginManager::init(PluginProxyInterface *proxyInter) +{ + if (m_proxyInter == proxyInter) + return; + + m_proxyInter = proxyInter; + + m_dockController.reset(new DockPluginController(proxyInter)); + m_quickContainer.reset(new QuickSettingContainer(m_dockController.data())); + m_iconManager.reset(new IconManager(m_dockController.data())); + m_iconManager->setPosition(position()); + + connect(m_dockController.data(), &DockPluginController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter) { + if (m_iconManager->isFixedPlugin(itemInter)) { + m_proxyInter->itemUpdate(this, pluginName()); + } + }); + connect(m_dockController.data(), &DockPluginController::pluginUpdated, this, [ this ](PluginsItemInterface *itemInter) { + if (m_iconManager->isFixedPlugin(itemInter)) { + m_proxyInter->itemUpdate(this, pluginName()); + } + }); + connect(m_dockController.data(), &DockPluginController::pluginRemoved, this, [ this ](PluginsItemInterface *itemInter) { + if (m_iconManager->isFixedPlugin(itemInter)) { + m_proxyInter->itemUpdate(this, pluginName()); + } + }); + connect(m_dockController.data(), &DockPluginController::requestAppletVisible, this, [ this ](PluginsItemInterface *itemInter, const QString &itemKey, bool visible) { + if (visible) { + QWidget *appletWidget = itemInter->itemPopupApplet(itemKey); + if (appletWidget) + m_quickContainer->showPage(appletWidget, itemInter); + } else { + // 显示主面板 + m_quickContainer->topLevelWidget()->hide(); + } + }); + connect(m_dockController.data(), &DockPluginController::pluginLoadFinished, this, &PluginManager::pluginLoadFinished); + + // 开始加载插件 + m_dockController->startLoadPlugin(getPluginPaths()); + + m_proxyInter->itemAdded(this, pluginName()); +} + +QWidget *PluginManager::itemWidget(const QString &itemKey) +{ + Q_UNUSED(itemKey); + return nullptr; +} + +QWidget *PluginManager::itemPopupApplet(const QString &itemKey) +{ + if (itemKey == QUICK_ITEM_KEY) { + // 返回快捷面板 + return m_quickContainer.data(); + } + + return nullptr; +} + +QIcon PluginManager::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) +{ + if (dockPart == DockPart::QuickShow) { + return m_iconManager->pixmap(); + } + + return QIcon(); +} + +PluginFlags PluginManager::flags() const +{ + // 当前快捷插件组合区域只支持在快捷区域显示 + return PluginFlag::Type_Common | PluginFlag::Attribute_ForceDock; +} + +PluginsItemInterface::PluginSizePolicy PluginManager::pluginSizePolicy() const +{ + return PluginSizePolicy::Custom; +} + +bool PluginManager::eventHandler(QEvent *event) +{ + if (event->type() == QEvent::Resize) { + QResizeEvent *resizeEvent = static_cast(event); + m_iconManager->updateSize(resizeEvent->size()); + } + return PluginsItemInterface::eventHandler(event); +} + +void PluginManager::positionChanged(const Dock::Position position) +{ + m_iconManager->setPosition(position); + m_proxyInter->itemUpdate(this, pluginName()); +} + +QList PluginManager::plugins() const +{ + return m_dockController->plugins(); +} + +QList PluginManager::pluginsInSetting() const +{ + return m_dockController->pluginsInSetting(); +} + +QList PluginManager::currentPlugins() const +{ + return m_dockController->currentPlugins(); +} + +QString PluginManager::itemKey(PluginsItemInterface *itemInter) const +{ + return m_dockController->itemKey(itemInter); +} + +QJsonObject PluginManager::metaData(PluginsItemInterface *itemInter) const +{ + return m_dockController->metaData(itemInter); +} + +#ifndef QT_DEBUG +static QStringList getPathFromConf(const QString &key) { + QSettings set("/etc/deepin/dde-dock.conf", QSettings::IniFormat); + auto value = set.value(key).toString(); + if (!value.isEmpty()) { + return value.split(':'); + } + + return QStringList(); +} +#endif + +QStringList PluginManager::getPluginPaths() const +{ + QStringList pluginPaths; +#ifdef QT_DEBUG + pluginPaths << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(QUICK_PATH) + << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(PLUGIN_PATH) + << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(TRAY_PATH); +#else + pluginPaths << QString("/usr/lib/dde-dock%1").arg(QUICK_PATH) + << QString("/usr/lib/dde-dock%1").arg(PLUGIN_PATH) + << QString("/usr/lib/dde-dock%1").arg(TRAY_PATH); + + const QStringList pluginsDirs = (getPathFromConf("PATH") << getPathFromConf("SYSTEM_TRAY_PATH")); + if (!pluginsDirs.isEmpty()) + pluginPaths << pluginsDirs; +#endif + + return pluginPaths; +} diff --git a/plugins/pluginmanager/pluginmanager.h b/plugins/pluginmanager/pluginmanager.h new file mode 100644 index 000000000..e054e5ebd --- /dev/null +++ b/plugins/pluginmanager/pluginmanager.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2023 ~ 2023 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef PLUGINMANAGER_H +#define PLUGINMANAGER_H + +#include "pluginsiteminterface.h" +#include "pluginmanagerinterface.h" + +#include + +class DockPluginController; +class QuickSettingContainer; +class IconManager; + +class PluginManager : public PluginManagerInterface, public PluginsItemInterface +{ + Q_OBJECT + Q_INTERFACES(PluginsItemInterface) + Q_PLUGIN_METADATA(IID "com.deepin.dock.PluginsItemInterface" FILE "pluginmanager.json") + +public: + explicit PluginManager(QObject *parent = nullptr); + + const QString pluginName() const override; + const QString pluginDisplayName() const override; + void init(PluginProxyInterface *proxyInter) override; + QWidget *itemWidget(const QString &itemKey) override; + QWidget *itemPopupApplet(const QString &itemKey) override; + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; + PluginFlags flags() const override; + PluginSizePolicy pluginSizePolicy() const override; + +protected: + bool eventHandler(QEvent *event) override; + void positionChanged(const Dock::Position position) override; + +protected: + // 实现PluginManagerInterface接口,用于向dock提供所有已经加载的插件 + QList plugins() const override; + QList pluginsInSetting() const override; + QList currentPlugins() const override; + QString itemKey(PluginsItemInterface *itemInter) const override; + QJsonObject metaData(PluginsItemInterface *itemInter) const override; + +private: + QStringList getPluginPaths() const; + +private: + QSharedPointer m_dockController; + QSharedPointer m_quickContainer; + QSharedPointer m_iconManager; +}; + +#endif // PLUGINMANAGER_H diff --git a/plugins/pluginmanager/pluginmanager.json b/plugins/pluginmanager/pluginmanager.json new file mode 100644 index 000000000..b8397f765 --- /dev/null +++ b/plugins/pluginmanager/pluginmanager.json @@ -0,0 +1,4 @@ +{ + "api": "2.0.0", + "order":0 +} diff --git a/plugins/pluginmanager/pluginmanager.qrc b/plugins/pluginmanager/pluginmanager.qrc new file mode 100644 index 000000000..41792f803 --- /dev/null +++ b/plugins/pluginmanager/pluginmanager.qrc @@ -0,0 +1,5 @@ + + + resources/dock_control.dci + + diff --git a/plugins/pluginmanager/quicksettingcontainer.cpp b/plugins/pluginmanager/quicksettingcontainer.cpp new file mode 100644 index 000000000..fb56a2206 --- /dev/null +++ b/plugins/pluginmanager/quicksettingcontainer.cpp @@ -0,0 +1,415 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "quicksettingcontainer.h" +#include "dockplugincontroller.h" +#include "pluginsiteminterface.h" +#include "quicksettingitem.h" +#include "pluginchildpage.h" +#include "utils.h" +#include "quickdragcore.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +struct QuickDragInfo { + QPoint dragPosition; + QWidget *dragItem = nullptr; + PluginsItemInterface *pluginInter = nullptr; + void reset() { + dragPosition.setX(0); + dragPosition.setY(0); + dragItem = nullptr; + pluginInter = nullptr; + } + bool isNull() { + return !dragItem; + } +} QuickDragInfo; + +#define ITEMWIDTH 70 +#define ITEMHEIGHT 60 +#define ITEMSPACE 10 +#define COLUMNCOUNT 4 + +QuickSettingContainer::QuickSettingContainer(DockPluginController *pluginController, QWidget *parent) + : QWidget(parent) + , m_switchLayout(new QStackedLayout(this)) + , m_mainWidget(new QWidget(this)) + , m_pluginWidget(new QWidget(m_mainWidget)) + , m_pluginLayout(new QGridLayout(m_pluginWidget)) + , m_componentWidget(new QWidget(m_mainWidget)) + , m_mainlayout(new QVBoxLayout(m_mainWidget)) + , m_pluginController(pluginController) + , m_childPage(new PluginChildPage(this)) + , m_dragInfo(new struct QuickDragInfo) + , m_childShowPlugin(nullptr) +{ + initUi(); + initConnection(); + m_childPage->installEventFilter(this); + setMouseTracking(true); +} + +QuickSettingContainer::~QuickSettingContainer() +{ + delete m_dragInfo; +} + +void QuickSettingContainer::showPage(QWidget *widget, PluginsItemInterface *pluginInter) +{ + if (widget && pluginInter && widget != m_mainWidget) { + m_childShowPlugin = pluginInter; + m_childPage->setTitle(pluginInter->pluginDisplayName()); + m_childPage->pushWidget(widget); + m_switchLayout->setCurrentWidget(m_childPage); + } else { + m_childShowPlugin = nullptr; + m_switchLayout->setCurrentIndex(0); + } + + onResizeView(); +} + +bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) +{ + switch (event->type()) { + case QEvent::Resize: { + onResizeView(); + break; + } + case QEvent::MouseButtonPress: { + QMouseEvent *mouseEvent = static_cast(event); + QuickSettingItem *item = qobject_cast(watched); + if (item) { + m_dragInfo->dragPosition = mouseEvent->pos(); + m_dragInfo->dragItem = item; + m_dragInfo->pluginInter = item->pluginItem(); + } + break; + } + case QEvent::MouseButtonRelease: { + m_dragInfo->reset(); + break; + } + default: + break; + } + + return QWidget::eventFilter(watched, event); +} + +void QuickSettingContainer::showEvent(QShowEvent *event) +{ + // 当面板显示的时候,直接默认显示快捷面板的窗口 + QWidget::showEvent(event); + if (m_switchLayout->currentWidget() != m_mainWidget) { + m_childPage->pushWidget(nullptr); + m_switchLayout->setCurrentWidget(m_mainWidget); + onResizeView(); + } +} + +void QuickSettingContainer::appendPlugin(PluginsItemInterface *itemInter, QString itemKey, bool needLayout) +{ + QuickSettingItem *quickItem = QuickSettingFactory::createQuickWidget(itemInter, itemKey); + if (!quickItem) + return; + + quickItem->setParent(m_pluginWidget); + quickItem->setMouseTracking(true); + quickItem->installEventFilter(this); + connect(quickItem, &QuickSettingItem::requestShowChildWidget, this, &QuickSettingContainer::onShowChildWidget); + m_quickSettings << quickItem; + if (quickItem->type() == QuickSettingItem::QuickItemStyle::Line) { + // 插件位置占据整行,例如声音、亮度和音乐等 + m_componentWidget->layout()->addWidget(quickItem); + updateFullItemLayout(); + } else if (needLayout) { + // 插件占据两行或者一行 + updateItemLayout(); + } + + onResizeView(); +} + +void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) +{ + QList::Iterator removeItemIter = std::find_if(m_quickSettings.begin(), m_quickSettings.end(), [ = ](QuickSettingItem *item)->bool { + return item->pluginItem() == itemInter; + }); + + if (removeItemIter == m_quickSettings.end()) + return; + + QuickSettingItem *removeItem = *removeItemIter; + removeItem->detachPlugin(); + + if (removeItem->type() == QuickSettingItem::QuickItemStyle::Line) + m_componentWidget->layout()->removeWidget(removeItem); + else + m_pluginLayout->removeWidget(removeItem); + + m_quickSettings.removeOne(removeItem); + removeItem->deleteLater(); + if (m_childShowPlugin == itemInter) + showPage(nullptr); + + updateItemLayout(); + updateFullItemLayout(); + onResizeView(); +} + +void QuickSettingContainer::onShowChildWidget(QWidget *childWidget) +{ + QuickSettingItem *quickWidget = qobject_cast(sender()); + if (!quickWidget) + return; + + showPage(childWidget, quickWidget->pluginItem()); +} + +void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) +{ + if (m_dragInfo->isNull()) + return; + + QPoint pointCurrent = event->pos(); + if (qAbs(m_dragInfo->dragPosition.x() - pointCurrent.x()) > 5 + || qAbs(m_dragInfo->dragPosition.y() - pointCurrent.y()) > 5) { + QuickSettingItem *moveItem = qobject_cast(m_dragInfo->dragItem); + QuickIconDrag *drag = new QuickIconDrag(this, moveItem->dragPixmap()); + QuickPluginMimeData *mimedata = new QuickPluginMimeData(m_dragInfo->pluginInter, drag); + drag->setMimeData(mimedata); + drag->setDragHotPot(m_dragInfo->dragPosition); + + m_dragInfo->reset(); + drag->exec(Qt::CopyAction); + } +} + +void QuickSettingContainer::updateItemLayout() +{ + // 清空之前的控件,重新添加 + while (m_pluginLayout->count() > 0) + m_pluginLayout->takeAt(0); + + // 将插件按照两列和一列的顺序来进行排序 + QMap> quickSettings; + QMap> orderQuickSettings; + for (QuickSettingItem *item : m_quickSettings) { + QuickSettingItem::QuickItemStyle type = item->type(); + if (type == QuickSettingItem::QuickItemStyle::Line) + continue; + + QJsonObject metaData = m_pluginController->metaData(item->pluginItem()); + if (metaData.contains("order")) + orderQuickSettings[type][item] = metaData.value("order").toInt(); + else + quickSettings[type] << item; + } + // 将需要排序的插件按照顺序插入到原来的数组中 + for (auto itQuick = orderQuickSettings.begin(); itQuick != orderQuickSettings.end(); itQuick++) { + QuickSettingItem::QuickItemStyle type = itQuick.key(); + QMap &orderQuicks = itQuick.value(); + for (auto it = orderQuicks.begin(); it != orderQuicks.end(); it++) { + int index = it.value(); + if (index >= 0 && index < quickSettings[type].size()) + quickSettings[type][index] = it.key(); + else + quickSettings[type] << it.key(); + } + } + auto insertQuickSetting = [ quickSettings, this ](QuickSettingItem::QuickItemStyle type, int &row, int &column) { + if (!quickSettings.contains(type)) + return; + + int usedColumn = (type == QuickSettingItem::QuickItemStyle::Larger ? 2 : 1); + QList quickPlugins = quickSettings[type]; + for (QuickSettingItem *quickItem : quickPlugins) { + quickItem->setVisible(true); + m_pluginLayout->addWidget(quickItem, row, column, 1, usedColumn); + column += usedColumn; + if (column >= COLUMNCOUNT) { + row++; + column = 0; + } + } + }; + + int row = 0; + int column = 0; + insertQuickSetting(QuickSettingItem::QuickItemStyle::Larger, row, column); + insertQuickSetting(QuickSettingItem::QuickItemStyle::Standard, row, column); +} + +void QuickSettingContainer::updateFullItemLayout() +{ + while (m_componentWidget->layout()->count() > 0) + m_componentWidget->layout()->takeAt(0); + + QList fullItems; + QMap fullItemOrder; + for (QuickSettingItem *item : m_quickSettings) { + if (item->type() != QuickSettingItem::QuickItemStyle::Line) + continue; + + fullItems << item; + int order = -1; + QJsonObject metaData = m_pluginController->metaData(item->pluginItem()); + if (metaData.contains("order")) + order = metaData.value("order").toInt(); + + fullItemOrder[item] = order; + } + + std::sort(fullItems.begin(), fullItems.end(), [ fullItemOrder, fullItems ](QuickSettingItem *item1, QuickSettingItem *item2) { + int order1 = fullItemOrder.value(item1, -1); + int order2 = fullItemOrder.value(item2, -1); + if (order1 == order2) { + // 如果两个值相等,就根据他们的加载顺序进行排序 + return fullItems.indexOf(item1) < fullItems.indexOf(item2); + } + if (order1 == -1) + return false; + if (order2 == -1) + return true; + + return order1 < order2; + }); + + for (QuickSettingItem *item : fullItems) { + item->setVisible(true); + m_componentWidget->layout()->addWidget(item); + } +} + +void QuickSettingContainer::initUi() +{ + m_mainlayout->setSpacing(ITEMSPACE); + m_mainlayout->setContentsMargins(ITEMSPACE, ITEMSPACE, ITEMSPACE, ITEMSPACE); + + m_pluginLayout->setContentsMargins(0, 0, 0, 0); + m_pluginLayout->setSpacing(ITEMSPACE); + m_pluginLayout->setAlignment(Qt::AlignLeft); + for (int i = 0; i < COLUMNCOUNT; i++) + m_pluginLayout->setColumnMinimumWidth(i, ITEMWIDTH); + + m_pluginWidget->setLayout(m_pluginLayout); + m_mainlayout->addWidget(m_pluginWidget); + + QVBoxLayout *ctrlLayout = new QVBoxLayout(m_componentWidget); + ctrlLayout->setContentsMargins(0, 0, 0, 0); + ctrlLayout->setSpacing(ITEMSPACE); + ctrlLayout->setDirection(QBoxLayout::BottomToTop); + + m_mainlayout->addWidget(m_componentWidget); + // 加载所有的可以在快捷面板显示的插件 + QList plugins = m_pluginController->currentPlugins(); + for (PluginsItemInterface *plugin : plugins) { + appendPlugin(plugin, m_pluginController->itemKey(plugin), false); + } + + m_switchLayout->addWidget(m_mainWidget); + m_switchLayout->addWidget(m_childPage); + + setMouseTracking(true); + setAcceptDrops(true); + + QMetaObject::invokeMethod(this, [ = ] { + if (plugins.size() > 0) { + updateItemLayout(); + updateFullItemLayout(); + } + // 设置当前窗口的大小 + onResizeView(); + setFixedWidth(ITEMWIDTH * 4 + (ITEMSPACE * 5)); + }, Qt::QueuedConnection); +} + +void QuickSettingContainer::initConnection() +{ + connect(m_pluginController, &DockPluginController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, QString itemKey) { + appendPlugin(itemInter, itemKey); + }); + connect(m_pluginController, &DockPluginController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); + connect(m_pluginController, &DockPluginController::pluginUpdated, this, &QuickSettingContainer::onPluginUpdated); + + connect(m_childPage, &PluginChildPage::back, this, [ this ] { + showPage(m_mainWidget); + }); +} + +// 调整尺寸 +void QuickSettingContainer::onResizeView() +{ + if (m_switchLayout->currentWidget() == m_mainWidget) { + int selfPluginCount = 0; + int fullItemHeight = 0; + int widgetCount = 0; + for (QuickSettingItem *item : m_quickSettings) { + item->setFixedHeight(ITEMHEIGHT); + if (item->type() == QuickSettingItem::QuickItemStyle::Line) { + fullItemHeight += item->height(); + widgetCount++; + continue; + } + // 如果是置顶的插件,则认为它占用两个普通插件的位置 + int increCount = (item->type() == QuickSettingItem::QuickItemStyle::Larger ? 2 : 1); + selfPluginCount += increCount; + } + + int rowCount = selfPluginCount / COLUMNCOUNT; + if (selfPluginCount % COLUMNCOUNT > 0) + rowCount++; + + m_pluginWidget->setFixedHeight(ITEMHEIGHT * rowCount + ITEMSPACE * (rowCount - 1)); + m_componentWidget->setFixedHeight(fullItemHeight + (widgetCount - 1) * ITEMSPACE); + + setFixedHeight(ITEMSPACE * 3 + m_pluginWidget->height() + m_componentWidget->height()); + } else if (m_switchLayout->currentWidget() == m_childPage) { + setFixedHeight(m_childPage->height()); + } +} + +void QuickSettingContainer::onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart) +{ + if (dockPart != DockPart::QuickPanel) + return; + + for (QuickSettingItem *settingItem : m_quickSettings) { + if (settingItem->pluginItem() != itemInter) + continue; + + settingItem->doUpdate(); + break; + } +} diff --git a/plugins/pluginmanager/quicksettingcontainer.h b/plugins/pluginmanager/quicksettingcontainer.h new file mode 100644 index 000000000..cf7ed03cc --- /dev/null +++ b/plugins/pluginmanager/quicksettingcontainer.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef QUICKSETTINGCONTAINER_H +#define QUICKSETTINGCONTAINER_H + +#include "pluginproxyinterface.h" + +#include "dtkwidget_global.h" + +#include + +#include + +class DockItem; +class QVBoxLayout; +class DockPluginController; +class BrightnessModel; +class BrightnessWidget; +class QuickSettingItem; +class QStackedLayout; +class VolumeDevicesWidget; +class QLabel; +class PluginChildPage; +class QGridLayout; +class DisplaySettingWidget; +struct QuickDragInfo; + +DWIDGET_USE_NAMESPACE + +class QuickSettingContainer : public QWidget +{ + Q_OBJECT + +public: + void showPage(QWidget *widget, PluginsItemInterface *pluginInter = nullptr); + explicit QuickSettingContainer(DockPluginController *pluginController, QWidget *parent = nullptr); + ~QuickSettingContainer() override; + +protected: + void mouseMoveEvent(QMouseEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; + void showEvent(QShowEvent *event) override; + +private Q_SLOTS: + void onPluginRemove(PluginsItemInterface *itemInter); + void onShowChildWidget(QWidget *childWidget); + void onResizeView(); + void onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart); + +private: + // 加载UI + void initUi(); + // 初始化槽函数 + void initConnection(); + // 调整控件位置 + void updateItemLayout(); + // 调整全列插件的位置 + void updateFullItemLayout(); + // 插入插件 + void appendPlugin(PluginsItemInterface *itemInter, QString itemKey, bool needLayout = true); + +private: + QStackedLayout *m_switchLayout; + QWidget *m_mainWidget; + QWidget *m_pluginWidget; + QGridLayout *m_pluginLayout; + QWidget *m_componentWidget; + QVBoxLayout *m_mainlayout; + DockPluginController *m_pluginController; + PluginChildPage *m_childPage; + QuickDragInfo *m_dragInfo; + QList m_quickSettings; + PluginsItemInterface *m_childShowPlugin; +}; + +#endif // PLUGINCONTAINER_H diff --git a/plugins/pluginmanager/quicksettingitem.cpp b/plugins/pluginmanager/quicksettingitem.cpp new file mode 100644 index 000000000..2f672f2ee --- /dev/null +++ b/plugins/pluginmanager/quicksettingitem.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "quicksettingitem.h" +#include "pluginsiteminterface.h" +#include "imageutil.h" +#include "largerquickitem.h" +#include "standardquickitem.h" +#include "linequickitem.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +#define ICONWIDTH 24 +#define ICONHEIGHT 24 +#define ICONSPACE 10 +#define RADIUS 8 +#define FONTSIZE 10 + +#define BGWIDTH 128 +#define BGSIZE 36 +#define MARGINLEFTSPACE 10 +#define OPENICONSIZE 12 +#define MARGINRIGHTSPACE 9 + +DWIDGET_USE_NAMESPACE + +QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) + : QWidget(parent) + , m_pluginInter(pluginInter) + , m_itemKey(itemKey) +{ + setAcceptDrops(true); + this->installEventFilter(this); +} + +QuickSettingItem::~QuickSettingItem() +{ +} + +PluginsItemInterface *QuickSettingItem::pluginItem() const +{ + return m_pluginInter; +} + +const QPixmap QuickSettingItem::dragPixmap() +{ + QPixmap pluginPixmap = m_pluginInter->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()).pixmap(ICONWIDTH, ICONHEIGHT); + + QPainter foregroundPainter(&pluginPixmap); + foregroundPainter.setPen(foregroundColor()); + foregroundPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); + foregroundPainter.fillRect(pluginPixmap.rect(), foregroundColor()); + + QPixmap pixmapDrag(ICONWIDTH + ICONSPACE + FONTSIZE * 2, ICONHEIGHT + ICONSPACE + FONTSIZE * 2); + pixmapDrag.fill(Qt::transparent); + QPainter painter(&pixmapDrag); + painter.drawPixmap(QPoint((ICONSPACE + FONTSIZE * 2) / 2, 0), pluginPixmap); + painter.setPen(foregroundPainter.pen()); + + QFont font; + font.setPixelSize(FONTSIZE); + painter.setFont(font); + QTextOption option; + option.setAlignment(Qt::AlignTop | Qt::AlignHCenter); + painter.drawText(QRect(QPoint(0, ICONHEIGHT + ICONSPACE), + QPoint(pixmapDrag.width(), pixmapDrag.height())), m_pluginInter->pluginDisplayName(), option); + return pixmapDrag; +} + +const QString QuickSettingItem::itemKey() const +{ + return m_itemKey; +} + +void QuickSettingItem::paintEvent(QPaintEvent *e) +{ + QWidget::paintEvent(e); + QPainter painter(this); + painter.setRenderHint(QPainter::RenderHint::Antialiasing); + painter.setPen(foregroundColor()); + QPainterPath path; + path.addRoundedRect(rect(), RADIUS, RADIUS); + painter.setClipPath(path); + // 绘制背景色 + QColor backColor(Qt::white); + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::DarkType) { + backColor = Qt::black; + backColor.setAlphaF(0.5); + } + DPalette dpa = DPaletteHelper::instance()->palette(this); + painter.fillRect(rect(), backColor); +} + +QColor QuickSettingItem::foregroundColor() const +{ + DPalette dpa = DPaletteHelper::instance()->palette(this); + // TODO: 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 + if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Active) + return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); + + if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Deactive) + return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); + + return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); +} + +QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter, const QString &itemKey) +{ + // 如果显示在面板的图标或者Widget为空,则不让显示(例如电池插件) + if (!(pluginInter->flags() & PluginFlag::Type_Common)) + return nullptr; + + if (pluginInter->flags() & PluginFlag::Quick_Multi) + return new LargerQuickItem(pluginInter, itemKey); + + if (pluginInter->flags() & PluginFlag::Quick_Full) + return new LineQuickItem(pluginInter, itemKey); + + if (pluginInter->flags() & PluginFlag::Quick_Single) + return new StandardQuickItem(pluginInter, itemKey); + + return nullptr; +} diff --git a/plugins/pluginmanager/quicksettingitem.h b/plugins/pluginmanager/quicksettingitem.h new file mode 100644 index 000000000..53e192256 --- /dev/null +++ b/plugins/pluginmanager/quicksettingitem.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef QUICKSETTINGITEM_H +#define QUICKSETTINGITEM_H + +#include + +class PluginsItemInterface; +class QuickIconWidget; + +class QuickSettingItem : public QWidget +{ + Q_OBJECT + +public: + enum class QuickItemStyle { + Standard = 1, // 插件的UI显示单列 + Larger, // 插件的UI显示双列,例如网络和蓝牙等 + Line // 插件的UI整行显示,例如声音,亮度、音乐播放等 + }; + +public: + QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + ~QuickSettingItem() override; + PluginsItemInterface *pluginItem() const; + virtual const QPixmap dragPixmap(); + virtual void doUpdate() {} + virtual void detachPlugin() {} + const QString itemKey() const; + + virtual QuickItemStyle type() const = 0; + +Q_SIGNALS: + void requestShowChildWidget(QWidget *); + +protected: + void paintEvent(QPaintEvent *e) override; + QColor foregroundColor() const; + +private: + PluginsItemInterface *m_pluginInter; + QString m_itemKey; +}; + +class QuickSettingFactory +{ +public: + static QuickSettingItem *createQuickWidget(PluginsItemInterface *const pluginInter, const QString &itemKey); +}; + +#endif // QUICKSETTINGITEM_H diff --git a/plugins/pluginmanager/resources/dock_control.dci b/plugins/pluginmanager/resources/dock_control.dci new file mode 100644 index 0000000000000000000000000000000000000000..38848da3b7a9e524bdef6b868a5d74784234c883 GIT binary patch literal 767 zcmZ>9_GDmWWME)2G-IFytY?DgX3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyxCj^lAV8_7wV>uO!W;%M zmSpk~R7a4fo7*iQJKWVNAS}Sb=PZz|uYZ7B;Jm^A&-VYbq&>4Hzqdb9?ZJ6KmXpKz zAoD^+hJzjs3Ig&i>`cst2Lmi3JSU}OmCw)p@;CpNK}B7?;NSEI+a@l0He=z>mY+U9 zDy<#QTzO_^z07#Z8BSv{i-sl{=ZqIh=ew;K6sI~Gn_bhn!S-}wv3;^$5hl2nB literal 0 HcmV?d00001 diff --git a/plugins/pluginmanager/standardquickitem.cpp b/plugins/pluginmanager/standardquickitem.cpp new file mode 100644 index 000000000..c38dc016f --- /dev/null +++ b/plugins/pluginmanager/standardquickitem.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#include "standardquickitem.h" +#include "pluginsiteminterface.h" + +#include +#include + +#include +#include +#include + +#define ICONHEIGHT 24 +#define ICONWIDTH 24 +#define TEXTHEIGHT 11 + +DWIDGET_USE_NAMESPACE + +StandardQuickItem::StandardQuickItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) + : QuickSettingItem(pluginInter, itemKey, parent) + , m_itemParentWidget(nullptr) + , m_needPaint(true) +{ + initUi(); +} + +StandardQuickItem::~StandardQuickItem() +{ +} + +QuickSettingItem::QuickItemStyle StandardQuickItem::type() const +{ + return QuickSettingItem::QuickItemStyle::Standard; +} + +void StandardQuickItem::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event); + QStringList commandArgument = pluginItem()->itemCommand(itemKey()).split(" "); + if (commandArgument.size() > 0) { + QString command = commandArgument.first(); + commandArgument.removeFirst(); + QProcess::startDetached(command, commandArgument); + } +} + +void StandardQuickItem::resizeEvent(QResizeEvent *event) +{ + doUpdate(); + QuickSettingItem::resizeEvent(event); +} + +void StandardQuickItem::initUi() +{ + QWidget *topWidget = iconWidget(this); + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(topWidget); + installEventFilter(this); +} + +QWidget *StandardQuickItem::iconWidget(QWidget *parent) +{ + // 显示图标的窗体 + QWidget *widget = new QWidget(parent); + m_needPaint = true; + QIcon icon = pluginItem()->icon(DockPart::QuickPanel); + if (icon.isNull()) { + // 如果图标为空,则将获取itemWidget作为它的显示 + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) { + m_itemParentWidget = itemWidget->parentWidget(); + QHBoxLayout *layout = new QHBoxLayout(widget); + layout->setContentsMargins(0, 0, 0 ,0); + itemWidget->setParent(widget); + layout->addWidget(itemWidget); + itemWidget->setVisible(true); + m_needPaint = false; + } + } + + if (m_needPaint) { + // 如果没有子窗体,则需要添加下方的文字 + QVBoxLayout *layout = new QVBoxLayout(widget); + layout->setAlignment(Qt::AlignVCenter); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + QLabel *imageLabel = new QLabel(widget); + imageLabel->setObjectName("imageLabel"); + imageLabel->setFixedHeight(ICONHEIGHT); + imageLabel->setAlignment(Qt::AlignCenter); + + QLabel *labelText = new QLabel(widget); + labelText->setObjectName("textLabel"); + labelText->setFixedHeight(TEXTHEIGHT); + updatePluginName(labelText); + labelText->setAlignment(Qt::AlignCenter); + labelText->setFont(DFontSizeManager::instance()->t10()); + layout->addWidget(imageLabel); + layout->addSpacing(7); + layout->addWidget(labelText); + } + + return widget; +} + +QPixmap StandardQuickItem::pixmap() const +{ + // 如果快捷面板区域的图标为空,那么就获取itemWidget的截图 + QIcon icon = pluginItem()->icon(DockPart::QuickPanel); + if (icon.isNull()) + return QPixmap(); + + int pixmapWidth = ICONWIDTH; + int pixmapHeight = ICONHEIGHT; + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) { + QSize size = iconSizes[0]; + if (size.isValid() && !size.isEmpty() && !size.isNull()) { + pixmapWidth = size.width(); + pixmapHeight = size.height(); + } + } + + return icon.pixmap(pixmapWidth / qApp->devicePixelRatio(), pixmapHeight / qApp->devicePixelRatio()); +} + +QLabel *StandardQuickItem::findChildLabel(QWidget *parent, const QString &childObjectName) const +{ + QList childrends = parent->children(); + for (QObject *child : childrends) { + QWidget *widget = qobject_cast(child); + if (!widget) + continue; + + QLabel *label = qobject_cast(child); + if (label && widget->objectName() == childObjectName) + return label; + + label = findChildLabel(widget, childObjectName); + if (label) + return label; + } + + return nullptr; +} + +void StandardQuickItem::updatePluginName(QLabel *textLabel) +{ + if (!textLabel) + return; + + QString text = pluginItem()->description(); + if (text.isEmpty()) + text = pluginItem()->pluginDisplayName(); + QFontMetrics ftm(textLabel->font()); + text = ftm.elidedText(text, Qt::TextElideMode::ElideRight, textLabel->width()); + textLabel->setText(text); +} + +void StandardQuickItem::doUpdate() +{ + if (m_needPaint) { + QLabel *imageLabel = findChildLabel(this, "imageLabel"); + if (imageLabel) { + // 更新图像 + imageLabel->setPixmap(pixmap()); + } + updatePluginName(findChildLabel(this, "textLabel")); + } else { + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget) + itemWidget->update(); + } +} + +void StandardQuickItem::detachPlugin() +{ + QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); + if (itemWidget && !m_needPaint) + itemWidget->setParent(m_itemParentWidget); +} diff --git a/plugins/pluginmanager/standardquickitem.h b/plugins/pluginmanager/standardquickitem.h new file mode 100644 index 000000000..74cff3b9d --- /dev/null +++ b/plugins/pluginmanager/standardquickitem.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. + * + * Author: donghualin + * + * Maintainer: donghualin + * + * 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 . + */ +#ifndef STANDARDQUICKITEM_H +#define STANDARDQUICKITEM_H + +#include "quicksettingitem.h" + +class QLabel; + +// 插件在快捷面板中展示的样式,这个为默认,展示一行一列的那种 +class StandardQuickItem : public QuickSettingItem +{ + Q_OBJECT + +public: + StandardQuickItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + ~StandardQuickItem() override; + + QuickItemStyle type() const override; + void doUpdate() override; + void detachPlugin() override; + +protected: + void mouseReleaseEvent(QMouseEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + +private: + void initUi(); + QWidget *iconWidget(QWidget *parent); + QPixmap pixmap() const; + QLabel *findChildLabel(QWidget *parent, const QString &childObjectName) const; + void updatePluginName(QLabel *textLabel); + +private: + QWidget *m_itemParentWidget; + bool m_needPaint; +}; + +#endif // SINGLEQUICKITEM_H From bc840d233d832cddce37a71b1abba8053b21168d Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 Jan 2023 11:06:36 +0800 Subject: [PATCH 227/257] =?UTF-8?q?feat:=20=E5=8A=A0=E8=BD=BD=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加载pluginmanager插件,其他的插件由pluginmanager插件来加载 Log: Influence: 插件加载 Task: https://pms.uniontech.com/task-view-222353.html Change-Id: Ibe3cb59c5e3da27d7547d9bea8e05ebcd03c5a87 --- configs/com.deepin.dde.dock.dconfig.json | 4 +- frame/controller/dockitemmanager.cpp | 3 +- frame/controller/proxyplugincontroller.cpp | 288 ---------------- frame/controller/proxyplugincontroller.h | 93 ----- frame/controller/quicksettingcontroller.cpp | 81 ++--- frame/controller/quicksettingcontroller.h | 18 +- frame/controller/systemplugincontroller.cpp | 172 ---------- frame/controller/systemplugincontroller.h | 66 ---- frame/dbus/dbusdockadaptors.cpp | 7 +- frame/item/quicksettingitem.cpp | 9 +- frame/util/abstractpluginscontroller.cpp | 362 +------------------- frame/util/abstractpluginscontroller.h | 52 +-- frame/util/customevent.cpp | 19 + frame/util/customevent.h | 16 + frame/window/mainwindow.cpp | 1 - frame/window/quickpluginmodel.cpp | 22 +- frame/window/quickpluginwindow.cpp | 19 +- frame/window/quickpluginwindow.h | 2 +- frame/window/systempluginwindow.cpp | 1 - frame/window/windowmanager.cpp | 1 - 20 files changed, 134 insertions(+), 1102 deletions(-) delete mode 100644 frame/controller/proxyplugincontroller.cpp delete mode 100644 frame/controller/proxyplugincontroller.h delete mode 100644 frame/controller/systemplugincontroller.cpp delete mode 100644 frame/controller/systemplugincontroller.h create mode 100644 frame/util/customevent.cpp create mode 100644 frame/util/customevent.h diff --git a/configs/com.deepin.dde.dock.dconfig.json b/configs/com.deepin.dde.dock.dconfig.json index 70335dd75..cc0b41ee0 100644 --- a/configs/com.deepin.dde.dock.dconfig.json +++ b/configs/com.deepin.dde.dock.dconfig.json @@ -16,8 +16,8 @@ "permissions":"readwrite", "visibility":"public" }, - "Dock_Quick_Plugin_Name": { - "value": ["network", "sound", "power", "shutdown", "trash"], + "Dock_Quick_Plugins": { + "value": ["shutdown", "trash"], "serial": 0, "flags": [], "name": "显示在任务栏上的快捷插件", diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index 9184cbfae..ac12394d7 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -27,7 +27,6 @@ #include "utils.h" #include "appmultiitem.h" #include "quicksettingcontroller.h" -#include "proxyplugincontroller.h" #include #include @@ -74,7 +73,7 @@ DockItemManager::DockItemManager(QObject *parent) connect(quickController, &QuickSettingController::pluginRemoved, this, &DockItemManager::onPluginItemRemoved); connect(quickController, &QuickSettingController::pluginUpdated, this, &DockItemManager::onPluginUpdate); - connect(ProxyPluginController::instance(), &ProxyPluginController::pluginLoaderFinished, this, &DockItemManager::onPluginLoadFinished, Qt::QueuedConnection); + connect(quickController, &QuickSettingController::pluginLoaderFinished, this, &DockItemManager::onPluginLoadFinished, Qt::QueuedConnection); // 应用信号 connect(m_appInter, &DockInter::EntryAdded, this, &DockItemManager::appItemAdded); diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp deleted file mode 100644 index ff690f7d3..000000000 --- a/frame/controller/proxyplugincontroller.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "proxyplugincontroller.h" -#include "pluginsiteminterface.h" -#include "constants.h" - -#include - -#ifndef QT_DEBUG -static QStringList getPathFromConf(const QString &key) { - QSettings set("/etc/deepin/dde-dock.conf", QSettings::IniFormat); - auto value = set.value(key).toString(); - if (!value.isEmpty()) { - return value.split(':'); - } - - return QStringList(); -} -#endif - -// 该方法用来设置所有的需要加载的插件的路径信息 -static QMap getPluginPaths() -{ - QMap plugins; - // 添加快捷插件目录 - { - QStringList pluginPaths; - #ifdef QT_DEBUG - pluginPaths << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(QUICK_PATH) - << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(PLUGIN_PATH) - << QString("%1/..%2").arg(qApp->applicationDirPath()).arg(TRAY_PATH); - #else - pluginPaths << QString("/usr/lib/dde-dock%1").arg(QUICK_PATH) - << QString("/usr/lib/dde-dock%1").arg(PLUGIN_PATH) - << QString("/usr/lib/dde-dock%1").arg(TRAY_PATH); - - const QStringList pluginsDirs = (getPathFromConf("QUICK_TRAY_PATH") << getPathFromConf("PATH") << getPathFromConf("SYSTEM_TRAY_PATH")); - if (!pluginsDirs.isEmpty()) - pluginPaths << pluginsDirs; - #endif - plugins[PluginType::QuickPlugin] = pluginPaths; - } - - // 添加系统插件目录 - { - QStringList pluginPaths; - #ifdef QT_DEBUG - pluginPaths << qApp->applicationDirPath() + "/../plugins/system-trays"; - #else - pluginPaths << "/usr/lib/dde-dock/plugins/system-trays"; - - const QStringList &pluginsDirs = getPathFromConf("SYSTEM_TRAY_PATH"); - if (!pluginsDirs.isEmpty()) - pluginPaths << pluginsDirs; - #endif - plugins[PluginType::SystemTrays] = pluginPaths; - } - - return plugins; -} - -// 该方法根据当前加载插件的类型来生成对应的单例的类 -ProxyPluginController *ProxyPluginController::instance(PluginType instanceKey) -{ - // 此处将这些单例对象存储到了qApp里面,而没有存储到本地的静态变量是因为这个对象会在dock进程和tray插件中同时调用, - // 如果存储到内存的临时变量中,他们就是不同的内存地址,获取到的变量就是多个,这样就会导致相同的插件加载多次, - // 而qApp是dock和插件共用的,因此将对象存储到这里是保证能获取到相同的指针对象 - QMap proxyInstances = qApp->property("proxyController").value>(); - if (proxyInstances.contains(instanceKey)) - return proxyInstances.value(instanceKey); - - // 生成单例类,获取加载插件的路径信息 - static QMap pluginLoadInfos = getPluginPaths(); - ProxyPluginController *controller = new ProxyPluginController(); - controller->m_dirs = pluginLoadInfos.contains(instanceKey) ? pluginLoadInfos[instanceKey] : QStringList(); - proxyInstances[instanceKey] = controller; - qApp->setProperty("proxyController", QVariant::fromValue(proxyInstances)); - return controller; -} - -ProxyPluginController *ProxyPluginController::instance(PluginsItemInterface *itemInter) -{ - // 根据插件指针获取对应的代理对象,因为在监听者里可能存在同时加载多个不同目录的插件,用到的就是多实例, - // 添加插件的时候,不知道当前插件是属于哪个实例,因此在此处添加获取对应插件的实例,方便监听者拿到正确的实例 - QVariant proxyProperty = qApp->property("proxyController"); - if (!proxyProperty.canConvert>()) - return nullptr; - - QMap proxyControllers = proxyProperty.value>(); - for (ProxyPluginController *proxyController : proxyControllers) { - const QList &pluginItems = proxyController->m_pluginsItems; - for (PluginsItemInterface *interPair : pluginItems) { - if (interPair == itemInter) - return proxyController; - } - } - - return nullptr; -} - -// 新增要使用的控制器,第二个参数表示当前控制器需要加载的插件名称,为空表示加载所有插件 -void ProxyPluginController::addProxyInterface(AbstractPluginsController *interface) -{ - if (!m_interfaces.contains(interface)) - m_interfaces << interface; -} - -void ProxyPluginController::removeProxyInterface(AbstractPluginsController *interface) -{ - Q_ASSERT(m_interfaces.contains(interface)); - m_interfaces.removeOne(interface); -} - -ProxyPluginController::ProxyPluginController(QObject *parent) - : AbstractPluginsController(parent) -{ - // 只有在非安全模式下才加载插件,安全模式会在等退出安全模式后通过接受事件的方式来加载插件 - if (!qApp->property("safeMode").toBool()) - QMetaObject::invokeMethod(this, &ProxyPluginController::startLoader, Qt::QueuedConnection); -} - -bool ProxyPluginController::pluginIsLoaded(PluginsItemInterface *itemInter) -{ - return m_pluginsItems.contains(itemInter); -} - -QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const itemInter) -{ - QMap > &plugin = pluginsMap(); - if (plugin.contains(itemInter)) - return qobject_cast(plugin[itemInter].value("pluginloader")); - - return nullptr; -} - -QString ProxyPluginController::itemKey(PluginsItemInterface *itemInter) const -{ - if (m_pluginsItemKeys.contains(itemInter)) - return m_pluginsItemKeys.value(itemInter); - - return QString(); -} - -void ProxyPluginController::pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - if (!addPluginItems(itemInter, itemKey)) - return; - - // 获取需要加载当前插件的监听者,然后将当前插件添加到监听者 - QList validController = getValidController(itemInter); - for (AbstractPluginsController *interface : validController) - interface->pluginItemAdded(itemInter, itemKey); -} - -void ProxyPluginController::pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - QList validController = getValidController(itemInter); - for (AbstractPluginsController *interface : validController) - interface->pluginItemUpdate(itemInter, itemKey); -} - -void ProxyPluginController::pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - // 先获取可执行的controller,再移除,因为在判断当前插件是否加载的时候需要用到当前容器中的插件来获取当前代理 - QList validController = getValidController(itemInter); - for (AbstractPluginsController *interface : validController) - interface->pluginItemRemoved(itemInter, itemKey); - - removePluginItem(itemInter); -} - -void ProxyPluginController::requestPluginWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) -{ - QList validController = getValidController(itemInter); - for (AbstractPluginsController *interface : validController) - interface->requestPluginWindowAutoHide(itemInter, itemKey, autoHide); -} - -void ProxyPluginController::requestRefreshPluginWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - QList validController = getValidController(itemInter); - for (AbstractPluginsController *interface : validController) - interface->requestRefreshPluginWindowVisible(itemInter, itemKey); -} - -void ProxyPluginController::requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) -{ - QList validController = getValidController(itemInter); - for (AbstractPluginsController *interface : validController) - interface->requestSetPluginAppletVisible(itemInter, itemKey, visible); -} - -void ProxyPluginController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) -{ - QList validController = getValidController(itemInter); - for (AbstractPluginsController *interface : validController) - interface->updateDockInfo(itemInter, part); -} - -bool ProxyPluginController::eventFilter(QObject *watched, QEvent *event) -{ - if (watched == qApp && event->type() == PluginLoadEvent::eventType()) { - // 如果收到的是重新加载插件的消息(一般是在退出安全模式后),则直接加载插件即可 - startLoader(); - } - - return AbstractPluginsController::eventFilter(watched, event); -} - -QList ProxyPluginController::getValidController(PluginsItemInterface *itemInter) const -{ - QList validController; - for (AbstractPluginsController *interface : m_interfaces) { - if (!interface->needLoad(itemInter)) - continue; - - validController << interface; - } - - return validController; -} - -bool ProxyPluginController::addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - // 如果该插件已经存在,则无需再次插入 - if (m_pluginsItems.contains(itemInter)) - return false; - - m_pluginsItems << itemInter; - m_pluginsItemKeys[itemInter] = itemKey; - return true; -} - -void ProxyPluginController::removePluginItem(PluginsItemInterface * const itemInter) -{ - if (m_pluginsItems.contains(itemInter)) - m_pluginsItems.removeOne(itemInter); - - if (m_pluginsItemKeys.contains(itemInter)) - m_pluginsItemKeys.remove(itemInter); -} - -void ProxyPluginController::startLoader() -{ - QDir dir; - for (const QString &path : m_dirs) { - if (!dir.exists(path)) - continue; - - AbstractPluginsController::startLoader(new PluginLoader(path, this)); - } -} - -// 注册事件类型 -static QEvent::Type pluginEventType = (QEvent::Type)QEvent::registerEventType(QEvent::User + 1001); - -// 事件处理,当收到该事件的时候,加载插件 -PluginLoadEvent::PluginLoadEvent() - : QEvent(pluginEventType) -{ -} - -PluginLoadEvent::~PluginLoadEvent() -{ -} - -QEvent::Type PluginLoadEvent::eventType() -{ - return pluginEventType; -} diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h deleted file mode 100644 index 6ed951f51..000000000 --- a/frame/controller/proxyplugincontroller.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef PROXYPLUGINCONTROLLER_H -#define PROXYPLUGINCONTROLLER_H - -#include "abstractpluginscontroller.h" - -class PluginsItemInterface; -// 加载的插件的类型(1 根目录下的插件 2 快捷设置插件 3 系统插件) -enum class PluginType { - QuickPlugin = 0, - SystemTrays -}; - -// 该类是一个底层用来加载系统插件的类,DockPluginsController和 -// FixedPluginController类都是通过这个类来加载系统插件的 -// 该类做成一个多例,因为理论上一个插件只允许被加载一次,但是对于电源插件来说, -// 电源插件在高效模式和特效模式下都需要显示,因此,此类用于加载插件,然后分发到不同的 -// 上层控制器中 -class ProxyPluginController : public AbstractPluginsController -{ - Q_OBJECT - -public: - static ProxyPluginController *instance(PluginType instanceKey = PluginType::QuickPlugin); - static ProxyPluginController *instance(PluginsItemInterface *itemInter); - void addProxyInterface(AbstractPluginsController *interface); - void removeProxyInterface(AbstractPluginsController *interface); - QPluginLoader *pluginLoader(PluginsItemInterface * const itemInter); - QString itemKey(PluginsItemInterface *itemInter) const; - -protected: - explicit ProxyPluginController(QObject *parent = nullptr); - ~ProxyPluginController() override {} - - bool pluginIsLoaded(PluginsItemInterface *itemInter) override; - - void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; - - void requestPluginWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; - void requestRefreshPluginWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; - - void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; - - bool eventFilter(QObject *watched, QEvent *event) override; - -private: - QList getValidController(PluginsItemInterface *itemInter) const; - bool addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey); - void removePluginItem(PluginsItemInterface * const itemInter); - void startLoader(); - -private: - QList m_interfaces; - QStringList m_dirs; - QList m_pluginsItems; - QMap m_pluginsItemKeys; -}; - -// 该插件用于处理插件的延迟加载,当退出安全模式后,会收到该事件并加载插件 -class PluginLoadEvent : public QEvent -{ -public: - PluginLoadEvent(); - ~PluginLoadEvent() override; - - static Type eventType(); -}; - -Q_DECLARE_METATYPE(PluginType) - -#endif // PROXYPLUGINCONTROLLER_H diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index 82086f8e9..d34e0ddf7 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -20,42 +20,46 @@ */ #include "quicksettingcontroller.h" #include "quicksettingitem.h" -#include "proxyplugincontroller.h" #include "pluginsitem.h" +#include "pluginmanagerinterface.h" + +#include QuickSettingController::QuickSettingController(QObject *parent) : AbstractPluginsController(parent) { - // 加载本地插件 - ProxyPluginController *contoller = ProxyPluginController::instance(PluginType::QuickPlugin); - contoller->addProxyInterface(this); - connect(contoller, &ProxyPluginController::pluginLoaderFinished, this, &QuickSettingController::pluginLoaderFinished); + // 只有在非安全模式下才加载插件,安全模式会在等退出安全模式后通过接受事件的方式来加载插件 + if (!qApp->property("safeMode").toBool()) + QMetaObject::invokeMethod(this, [ = ] { +#ifdef QT_DEBUG + AbstractPluginsController::startLoader(new PluginLoader(QString("%1/..%2").arg(qApp->applicationDirPath()).arg("/plugins/loader"), this)); +#else + AbstractPluginsController::startLoader(new PluginLoader("/usr/lib/dde-dock/plugins/loader", this)); +#endif + }, Qt::QueuedConnection); } QuickSettingController::~QuickSettingController() { - ProxyPluginController::instance(PluginType::QuickPlugin)->removeProxyInterface(this); } -void QuickSettingController::pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) +void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) { // 根据读取到的metaData数据获取当前插件的类型,提供给外部 PluginAttribute pluginAttr = pluginAttribute(itemInter); - m_quickPlugins[pluginAttr] << itemInter; - m_quickPluginsMap[itemInter] = itemKey; emit pluginInserted(itemInter, pluginAttr); } -void QuickSettingController::pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &) +void QuickSettingController::itemUpdate(PluginsItemInterface * const itemInter, const QString &) { updateDockInfo(itemInter, DockPart::QuickPanel); updateDockInfo(itemInter, DockPart::QuickShow); updateDockInfo(itemInter, DockPart::SystemPanel); } -void QuickSettingController::pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &) +void QuickSettingController::itemRemoved(PluginsItemInterface * const itemInter, const QString &) { for (auto it = m_quickPlugins.begin(); it != m_quickPlugins.end(); it++) { QList &plugins = m_quickPlugins[it.key()]; @@ -71,15 +75,13 @@ void QuickSettingController::pluginItemRemoved(PluginsItemInterface * const item break; } - m_quickPluginsMap.remove(itemInter); Q_EMIT pluginRemoved(itemInter); } -void QuickSettingController::requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool show) +void QuickSettingController::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) { // 设置插件列表可见事件 - if (show) - Q_EMIT requestAppletShow(itemInter, itemKey); + Q_EMIT requestAppletVisible(itemInter, itemKey, visible); } void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) @@ -90,32 +92,36 @@ void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInt QuickSettingController::PluginAttribute QuickSettingController::pluginAttribute(PluginsItemInterface * const itemInter) const { // 工具插件,例如回收站 - if (hasFlag(itemInter, PluginFlag::Type_Tool)) + if (itemInter->flags() & PluginFlag::Type_Tool) return PluginAttribute::Tool; // 系统插件,例如关机按钮 - if (hasFlag(itemInter, PluginFlag::Type_System)) + if (itemInter->flags() & PluginFlag::Type_System) return PluginAttribute::System; // 托盘插件,例如磁盘图标 - if (hasFlag(itemInter, PluginFlag::Type_Tray)) + if (itemInter->flags() & PluginFlag::Type_Tray) return PluginAttribute::Tray; // 固定插件,例如显示桌面和多任务试图 - if (hasFlag(itemInter, PluginFlag::Type_Fixed)) + if (itemInter->flags() & PluginFlag::Type_Fixed) return PluginAttribute::Fixed; // 通用插件,一般的插件都是通用插件,就是放在快捷插件区域的那些插件 - if (hasFlag(itemInter, PluginFlag::Type_Common)) + if (itemInter->flags() & PluginFlag::Type_Common) return PluginAttribute::Quick; // 基本插件,不在任务栏上显示的插件 return PluginAttribute::None; } -bool QuickSettingController::hasFlag(PluginsItemInterface *itemInter, PluginFlag flag) const +QString QuickSettingController::itemKey(PluginsItemInterface *pluginItem) const { - return itemInter->flags() & flag; + PluginManagerInterface *pManager = pluginManager(); + if (pManager) + return pManager->itemKey(pluginItem); + + return QString(); } QuickSettingController *QuickSettingController::instance() @@ -129,18 +135,13 @@ QList QuickSettingController::pluginItems(const PluginAt return m_quickPlugins.value(pluginClass); } -QString QuickSettingController::itemKey(PluginsItemInterface *pluginItem) const +QJsonObject QuickSettingController::metaData(PluginsItemInterface *pluginItem) { - return m_quickPluginsMap.value(pluginItem); -} + PluginManagerInterface *pManager = pluginManager(); + if (pManager) + return pManager->metaData(pluginItem); -QJsonObject QuickSettingController::metaData(PluginsItemInterface *pluginItem) const -{ - QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(pluginItem); - if (!pluginLoader) - return QJsonObject(); - - return pluginLoader->metaData().value("MetaData").toObject(); + return QJsonObject(); } PluginsItem *QuickSettingController::pluginItemWidget(PluginsItemInterface *pluginItem) @@ -155,16 +156,10 @@ PluginsItem *QuickSettingController::pluginItemWidget(PluginsItemInterface *plug QList QuickSettingController::pluginInSettings() { - QList settingPlugins; - // 用于在控制中心显示可改变位置的插件,这里只提供 - QList allPlugins = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginCurrent(); - for (PluginsItemInterface *plugin : allPlugins) { - if (plugin->pluginDisplayName().isEmpty()) - continue; + PluginManagerInterface *pManager = pluginManager(); + if (!pManager) + return QList(); - if (hasFlag(plugin, PluginFlag::Attribute_CanSetting)) - settingPlugins << plugin; - } - - return settingPlugins; + // 返回可用于在控制中心显示的插件 + return pManager->pluginsInSetting(); } diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index a23b69aa2..0eaab9324 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -44,36 +44,32 @@ public: public: static QuickSettingController *instance(); QList pluginItems(const PluginAttribute &pluginClass) const; - QString itemKey(PluginsItemInterface *pluginItem) const; - QJsonObject metaData(PluginsItemInterface *pluginItem) const; + QJsonObject metaData(PluginsItemInterface *pluginItem); PluginsItem *pluginItemWidget(PluginsItemInterface *pluginItem); QList pluginInSettings(); PluginAttribute pluginAttribute(PluginsItemInterface * const itemInter) const; - bool hasFlag(PluginsItemInterface *itemInter, PluginFlag flag) const; + QString itemKey(PluginsItemInterface *pluginItem) const; Q_SIGNALS: void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute); void pluginRemoved(PluginsItemInterface *itemInter); void pluginUpdated(PluginsItemInterface *, const DockPart); - void requestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); + void requestAppletVisible(PluginsItemInterface * itemInter, const QString &itemKey, bool visible); protected: explicit QuickSettingController(QObject *parent = Q_NULLPTR); ~QuickSettingController() override; protected: - void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &) override; - void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &) override; - void requestPluginWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} - void requestRefreshPluginWindowVisible(PluginsItemInterface * const, const QString &) override {} - void requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool show) override; + void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; + void itemUpdate(PluginsItemInterface * const itemInter, const QString &) override; + void itemRemoved(PluginsItemInterface * const itemInter, const QString &) override; + void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; private: QMap> m_quickPlugins; - QMap m_quickPluginsMap; QMap m_pluginItemWidgetMap; }; diff --git a/frame/controller/systemplugincontroller.cpp b/frame/controller/systemplugincontroller.cpp deleted file mode 100644 index 3de250334..000000000 --- a/frame/controller/systemplugincontroller.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#include "systemplugincontroller.h" -#include "pluginsiteminterface.h" -#include "utils.h" -#include "systempluginitem.h" - -#include -#include - -SystemPluginController::SystemPluginController(QObject *parent) - : AbstractPluginsController(parent) -{ - setObjectName("SystemTray"); -} - -void SystemPluginController::pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - QMap> &mPluginsMap = pluginsMap(); - - // check if same item added - if (mPluginsMap.contains(itemInter)) - if (mPluginsMap[itemInter].contains(itemKey)) - return; - - SystemPluginItem *item = new SystemPluginItem(itemInter, itemKey); - connect(item, &SystemPluginItem::itemVisibleChanged, this, [ = ] (bool visible){ - emit visible ? pluginItemAdded(itemKey, item) : pluginItemRemoved(itemKey, item); - }, Qt::QueuedConnection); - - mPluginsMap[itemInter][itemKey] = item; - - // 隐藏的插件不加入到布局中 - if (Utils::SettingValue(QString("com.deepin.dde.dock.module.") + itemInter->pluginName(), QByteArray(), "enable", true).toBool()) - emit pluginItemAdded(itemKey, item); -} - -void SystemPluginController::pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); - if (!item) - return; - - item->update(); - - emit pluginItemUpdated(itemKey, item); -} - -void SystemPluginController::pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); - if (!item) - return; - - item->detachPluginWidget(); - - emit pluginItemRemoved(itemKey, item); - - QMap> &mPluginsMap = pluginsMap(); - mPluginsMap[itemInter].remove(itemKey); - - // do not delete the itemWidget object(specified in the plugin interface) - item->centralWidget()->setParent(nullptr); - - // just delete our wrapper object(PluginsItem) - item->deleteLater(); -} - -void SystemPluginController::requestPluginWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) -{ - SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); - if (!item) - return; - - Q_EMIT item->requestWindowAutoHide(autoHide); -} - -void SystemPluginController::requestRefreshPluginWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); - if (!item) - return; - - Q_EMIT item->requestRefershWindowVisible(); -} - -void SystemPluginController::requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) -{ - SystemPluginItem *item = static_cast(pluginItemAt(itemInter, itemKey)); - if (!item) - return; - - if (visible) { - item->showPopupApplet(itemInter->itemPopupApplet(itemKey)); - } else { - item->hidePopup(); - } -} - -int SystemPluginController::systemTrayItemSortKey(const QString &itemKey) -{ - auto inter = pluginInterAt(itemKey); - - if (!inter) { - return -1; - } - - return inter->itemSortKey(itemKey); -} - -void SystemPluginController::setSystemTrayItemSortKey(const QString &itemKey, const int order) -{ - auto inter = pluginInterAt(itemKey); - - if (!inter) { - return; - } - - inter->setSortKey(itemKey, order); -} - -const QVariant SystemPluginController::getValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant &fallback) -{ - auto inter = pluginInterAt(itemKey); - - if (!inter) { - return QVariant(); - } - - return getPluginValue(inter, key, fallback); -} - -void SystemPluginController::saveValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant &value) -{ - auto inter = pluginInterAt(itemKey); - - if (!inter) { - return; - } - - savePluginValue(inter, key, value); -} - -void SystemPluginController::startLoader() -{ - QString pluginsDir("../plugins/system-trays"); - if (!QDir(pluginsDir).exists()) { - pluginsDir = "/usr/lib/dde-dock/plugins/system-trays"; - } - qDebug() << "using system tray plugins dir:" << pluginsDir; - - AbstractPluginsController::startLoader(new PluginLoader(pluginsDir, this)); -} diff --git a/frame/controller/systemplugincontroller.h b/frame/controller/systemplugincontroller.h deleted file mode 100644 index 5fbc02292..000000000 --- a/frame/controller/systemplugincontroller.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: sbw - * - * Maintainer: sbw - * - * 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 . - */ - -#ifndef SYSTEMTRAYSCONTROLLER_H -#define SYSTEMTRAYSCONTROLLER_H - -#include "pluginproxyinterface.h" -#include "abstractpluginscontroller.h" -#include "abstractpluginscontroller.h" - -#include -#include -#include -#include - -class PluginsItemInterface; -class SystemPluginItem; - -class SystemPluginController : public AbstractPluginsController -{ - Q_OBJECT - -public: - explicit SystemPluginController(QObject *parent = nullptr); - - // implements PluginProxyInterface - void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestPluginWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; - void requestRefreshPluginWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestSetPluginAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; - - int systemTrayItemSortKey(const QString &itemKey); - void setSystemTrayItemSortKey(const QString &itemKey, const int order); - - const QVariant getValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant& fallback = QVariant()); - void saveValueSystemTrayItem(const QString &itemKey, const QString &key, const QVariant &value); - - void startLoader(); - -signals: - void pluginItemAdded(const QString &itemKey, SystemPluginItem *pluginItem); - void pluginItemRemoved(const QString &itemKey, SystemPluginItem *pluginItem); - void pluginItemUpdated(const QString &itemKey, SystemPluginItem *pluginItem); -}; - -#endif // SYSTEMTRAYSCONTROLLER_H diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index 3416512cd..fda09b05d 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -23,10 +23,10 @@ #include "utils.h" #include "dockitemmanager.h" #include "windowmanager.h" -#include "proxyplugincontroller.h" #include "quicksettingcontroller.h" #include "pluginsitem.h" #include "settingconfig.h" +#include "customevent.h" #include @@ -170,16 +170,17 @@ QStringList DBusDockAdaptors::GetLoadedPlugins() DockItemInfos DBusDockAdaptors::plugins() { +#define DOCK_QUICK_PLUGINS "Dock_Quick_Plugins" // 获取本地加载的插件 QList allPlugin = localPlugins(); DockItemInfos pluginInfos; - QStringList quickSettingKeys = SETTINGCONFIG->value("Dock_Quick_Plugin_Name").toStringList(); + QStringList quickSettingKeys = SETTINGCONFIG->value(DOCK_QUICK_PLUGINS).toStringList(); for (PluginsItemInterface *plugin : allPlugin) { DockItemInfo info; info.name = plugin->pluginName(); info.displayName = plugin->pluginDisplayName(); info.itemKey = plugin->pluginName(); - info.settingKey = "Dock_Quick_Plugin_Name"; + info.settingKey = DOCK_QUICK_PLUGINS; info.visible = quickSettingKeys.contains(info.itemKey); QSize pixmapSize; QIcon lightIcon = getSettingIcon(plugin, pixmapSize, DGuiApplicationHelper::ColorType::LightType); diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index cbe791138..2390a540f 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -111,18 +111,17 @@ QColor QuickSettingItem::foregroundColor() const QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter) { - QuickSettingController *quickController = QuickSettingController::instance(); // 如果显示在面板的图标或者Widget为空,则不让显示(例如电池插件) - if (!quickController->hasFlag(pluginInter, PluginFlag::Type_Common)) + if (!(pluginInter->flags() & PluginFlag::Type_Common)) return nullptr; - if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Multi)) + if (pluginInter->flags() & PluginFlag::Quick_Multi) return new MultiQuickItem(pluginInter); - if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Full)) + if (pluginInter->flags() & PluginFlag::Quick_Full) return new FullQuickItem(pluginInter); - if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Single)) + if (pluginInter->flags() & PluginFlag::Quick_Single) return new SingleQuickItem(pluginInter); return nullptr; diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index 5d6d4f6ac..ba29bad3c 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -21,10 +21,9 @@ #include "abstractpluginscontroller.h" #include "pluginsiteminterface.h" -#include "pluginsiteminterface_v20.h" -#include "pluginadapter.h" #include "utils.h" #include "settingconfig.h" +#include "pluginmanagerinterface.h" #include #include @@ -43,15 +42,9 @@ static const QStringList CompatiblePluginApiList { AbstractPluginsController::AbstractPluginsController(QObject *parent) : QObject(parent) - , m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()) - , m_dockDaemonInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) + , m_pluginManager(nullptr) { qApp->installEventFilter(this); - - refreshPluginSettings(); - - connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &AbstractPluginsController::onConfigChanged); - connect(m_dockDaemonInter, &DockInter::PluginSettingsSynced, this, &AbstractPluginsController::refreshPluginSettings, Qt::QueuedConnection); } AbstractPluginsController::~AbstractPluginsController() @@ -65,183 +58,6 @@ AbstractPluginsController::~AbstractPluginsController() } } -QList AbstractPluginsController::pluginCurrent() const -{ - return m_pluginExists; -} - -void AbstractPluginsController::saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) -{ - savePluginValue(getPluginInterface(itemInter), key, value); -} - -const QVariant AbstractPluginsController::getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &fallback) -{ - return getPluginValue(getPluginInterface(itemInter), key, fallback); -} - -void AbstractPluginsController::removeValue(PluginsItemInterface *const itemInter, const QStringList &keyList) -{ - removePluginValue(getPluginInterface(itemInter), keyList); -} - -void AbstractPluginsController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - PluginsItemInterface *pluginItem = getPluginInterface(itemInter); - - if (m_pluginExists.contains(pluginItem)) - return; - - PluginAdapter *pluginAdapter = dynamic_cast(pluginItem); - if (pluginAdapter) - pluginAdapter->setItemKey(itemKey); - - m_pluginExists << pluginItem; - m_pluginItemKeyMap[pluginItem] = itemKey; - if (canAddedPlugin(pluginItem)) - pluginItemAdded(pluginItem, itemKey); -} - -void AbstractPluginsController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - pluginItemUpdate(getPluginInterface(itemInter), itemKey); -} - -void AbstractPluginsController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - m_pluginExists.removeOne(itemInter); - m_pluginItemKeyMap.remove(itemInter); - pluginItemRemoved(getPluginInterface(itemInter), itemKey); -} - -void AbstractPluginsController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) -{ - requestPluginWindowAutoHide(getPluginInterface(itemInter), itemKey, autoHide); -} - -void AbstractPluginsController::requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) -{ - requestRefreshPluginWindowVisible(getPluginInterface(itemInter), itemKey); -} - -void AbstractPluginsController::requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) -{ - requestSetPluginAppletVisible(getPluginInterface(itemInter), itemKey, visible); -} - -PluginsItemInterface *AbstractPluginsController::getPluginInterface(PluginsItemInterface * const itemInter) -{ - // 先从事先定义好的map中查找,如果没有找到,就是v23插件,直接返回当前插件的指针 - qulonglong pluginAddr = (qulonglong)itemInter; - if (m_pluginAdapterMap.contains(pluginAddr)) - return m_pluginAdapterMap[pluginAddr]; - - return itemInter; -} - -QMap> &AbstractPluginsController::pluginsMap() -{ - return m_pluginsMap; -} - -void AbstractPluginsController::savePluginValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &value) -{ - // is it necessary? - // refreshPluginSettings(); - - // save to local cache - QJsonObject localObject = m_pluginSettingsObject.value(itemInter->pluginName()).toObject(); - localObject.insert(key, QJsonValue::fromVariant(value)); //Note: QVariant::toJsonValue() not work in Qt 5.7 - - // save to daemon - QJsonObject remoteObject, remoteObjectInter; - remoteObjectInter.insert(key, QJsonValue::fromVariant(value)); //Note: QVariant::toJsonValue() not work in Qt 5.7 - remoteObject.insert(itemInter->pluginName(), remoteObjectInter); - - if (itemInter->type() == PluginsItemInterface::Fixed && key == "enable" && !value.toBool()) { - int fixedPluginCount = 0; - // 遍历FixPlugin插件个数 - for (auto it(m_pluginsMap.begin()); it != m_pluginsMap.end();) { - if (it.key()->type() == PluginsItemInterface::Fixed) { - fixedPluginCount++; - } - ++it; - } - // 修改插件的order值,位置为队尾 - QString name = localObject.keys().last(); - // 此次做一下判断,有可能初始数据不存在pos_*字段,会导致enable字段被修改。或者此处可以循环所有字段是否存在pos_开头的字段? - if (name != key) { - localObject.insert(name, QJsonValue::fromVariant(fixedPluginCount)); //Note: QVariant::toJsonValue() not work in Qt 5.7 - // daemon中同样修改 - remoteObjectInter.insert(name, QJsonValue::fromVariant(fixedPluginCount)); //Note: QVariant::toJsonValue() not work in Qt 5.7 - remoteObject.insert(itemInter->pluginName(), remoteObjectInter); - } - } - - m_pluginSettingsObject.insert(itemInter->pluginName(), localObject); - m_dockDaemonInter->MergePluginSettings(QJsonDocument(remoteObject).toJson(QJsonDocument::JsonFormat::Compact)); -} - -const QVariant AbstractPluginsController::getPluginValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &fallback) -{ - // load from local cache - QVariant v = m_pluginSettingsObject.value(itemInter->pluginName()).toObject().value(key).toVariant(); - if (v.isNull() || !v.isValid()) { - v = fallback; - } - - return v; -} - -void AbstractPluginsController::removePluginValue(PluginsItemInterface * const itemInter, const QStringList &keyList) -{ - if (keyList.isEmpty()) { - m_pluginSettingsObject.remove(itemInter->pluginName()); - } else { - QJsonObject localObject = m_pluginSettingsObject.value(itemInter->pluginName()).toObject(); - for (auto key : keyList) { - localObject.remove(key); - } - m_pluginSettingsObject.insert(itemInter->pluginName(), localObject); - } - - m_dockDaemonInter->RemovePluginSettings(itemInter->pluginName(), keyList); -} - -QObject *AbstractPluginsController::pluginItemAt(PluginsItemInterface *const itemInter, const QString &itemKey) const -{ - if (!m_pluginsMap.contains(itemInter)) - return nullptr; - - return m_pluginsMap[itemInter][itemKey]; -} - -PluginsItemInterface *AbstractPluginsController::pluginInterAt(const QString &itemKey) -{ - QMapIterator> it(m_pluginsMap); - while (it.hasNext()) { - it.next(); - if (it.value().keys().contains(itemKey)) { - return it.key(); - } - } - - return nullptr; -} - -PluginsItemInterface *AbstractPluginsController::pluginInterAt(QObject *destItem) -{ - QMapIterator> it(m_pluginsMap); - while (it.hasNext()) { - it.next(); - if (it.value().values().contains(destItem)) { - return it.key(); - } - } - - return nullptr; -} - void AbstractPluginsController::startLoader(PluginLoader *loader) { connect(loader, &PluginLoader::finished, loader, &PluginLoader::deleteLater, Qt::QueuedConnection); @@ -291,19 +107,6 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) } PluginsItemInterface *interface = qobject_cast(pluginLoader->instance()); - if (!interface) { - // 如果识别当前插件失败,就认为这个插件是v20的插件,将其转换为v20插件接口 - PluginsItemInterface_V20 *interface_v20 = qobject_cast(pluginLoader->instance()); - if (interface_v20) { - // 将v20插件接口通过适配器转换成v23的接口,方便在后面识别 - PluginAdapter *pluginAdapter = new PluginAdapter(interface_v20, pluginLoader); - // 将适配器的地址保存到map列表中,因为适配器自己会调用itemAdded方法,转换成PluginsItemInterface类,但是实际上它 - // 对应的是PluginAdapter类,因此,这个map用于在后面的itemAdded方法中用来查找 - m_pluginAdapterMap[(qulonglong)(interface_v20)] = pluginAdapter; - interface = pluginAdapter; - } - } - if (!interface) { qDebug() << objectName() << "load plugin failed!!!" << pluginLoader->errorString() << pluginFile; @@ -324,28 +127,6 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) return; } - if (!needLoad(interface)) { - // 对于一些固定的插件是不需要加载的,例如在特效模式下,只需要加载电源插件,其他的是无需加载的 - for (const QPair &pair : m_pluginLoadMap.keys()) { - if (pair.first == pluginFile) - m_pluginLoadMap.remove(pair); - } - pluginLoader->unload(); - pluginLoader->deleteLater(); - return; - } - - if (interface->pluginName() == "multitasking") { - if (Utils::IS_WAYLAND_DISPLAY || Dtk::Core::DSysInfo::deepinType() == Dtk::Core::DSysInfo::DeepinServer) { - for (auto &pair : m_pluginLoadMap.keys()) { - if (pair.first == pluginFile) { - m_pluginLoadMap.remove(pair); - } - } - return; - } - } - QMapIterator, bool> it(m_pluginLoadMap); while (it.hasNext()) { it.next(); @@ -363,20 +144,11 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) QMap interfaceData; interfaceData["pluginloader"] = pluginLoader; m_pluginsMap.insert(interface, interfaceData); - QString dbusService = meta.value("depends-daemon-dbus-service").toString(); - if (!dbusService.isEmpty() && !m_dbusDaemonInterface->isServiceRegistered(dbusService).value()) { - qDebug() << objectName() << dbusService << "daemon has not started, waiting for signal"; - connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, - [ = ](const QString & name, const QString & oldOwner, const QString & newOwner) { - Q_UNUSED(oldOwner); - if (name == dbusService && !newOwner.isEmpty()) { - qDebug() << objectName() << dbusService << "daemon started, init plugin and disconnect"; - initPlugin(interface); - disconnect(m_dbusDaemonInterface); - } - } - ); - return; + + PluginManagerInterface * pluginManager = dynamic_cast(interface); + if (pluginManager) { + m_pluginManager = pluginManager; + connect(m_pluginManager, &PluginManagerInterface::pluginLoadFinished, this, &AbstractPluginsController::pluginLoaderFinished); } // NOTE(justforlxz): 插件的所有初始化工作都在init函数中进行, @@ -408,77 +180,15 @@ void AbstractPluginsController::initPlugin(PluginsItemInterface *interface) } } - //插件全部加载完成 - if (loaded) { - emit pluginLoaderFinished(); - } qDebug() << objectName() << "init plugin finished: " << interface->pluginName(); } -void AbstractPluginsController::refreshPluginSettings() +bool AbstractPluginsController::eventFilter(QObject *object, QEvent *event) { - const QString &pluginSettings = m_dockDaemonInter->GetPluginSettings().value(); - if (pluginSettings.isEmpty()) { - qDebug() << "Error! get plugin settings from dbus failed!"; - return; - } - - const QJsonObject &pluginSettingsObject = QJsonDocument::fromJson(pluginSettings.toLocal8Bit()).object(); - if (pluginSettingsObject.isEmpty()) { - return; - } - - // nothing changed - if (pluginSettingsObject == m_pluginSettingsObject) { - return; - } - - for (auto pluginsIt = pluginSettingsObject.constBegin(); pluginsIt != pluginSettingsObject.constEnd(); ++pluginsIt) { - const QString &pluginName = pluginsIt.key(); - const QJsonObject &settingsObject = pluginsIt.value().toObject(); - QJsonObject newSettingsObject = m_pluginSettingsObject.value(pluginName).toObject(); - for (auto settingsIt = settingsObject.constBegin(); settingsIt != settingsObject.constEnd(); ++settingsIt) { - newSettingsObject.insert(settingsIt.key(), settingsIt.value()); - } - // TODO: remove not exists key-values - m_pluginSettingsObject.insert(pluginName, newSettingsObject); - } - - // not notify plugins to refresh settings if this update is not emit by dock daemon - if (sender() != m_dockDaemonInter) { - return; - } - - // notify all plugins to reload plugin settings - for (PluginsItemInterface *pluginInter : m_pluginsMap.keys()) { - pluginInter->pluginSettingsChanged(); - } - - // reload all plugin items for sort order or container - QMap> pluginsMapTemp = m_pluginsMap; - for (auto it = pluginsMapTemp.constBegin(); it != pluginsMapTemp.constEnd(); ++it) { - const QList &itemKeyList = it.value().keys(); - for (auto key : itemKeyList) { - if (key != "pluginloader") { - itemRemoved(it.key(), key); - } - } - for (auto key : itemKeyList) { - if (key != "pluginloader") { - itemAdded(it.key(), key); - } - } - } -} - -bool AbstractPluginsController::eventFilter(QObject *o, QEvent *e) -{ - if (o != qApp) - return false; - if (e->type() != QEvent::DynamicPropertyChange) + if (object != qApp || event->type() != QEvent::DynamicPropertyChange) return false; - QDynamicPropertyChangeEvent *const dpce = static_cast(e); + QDynamicPropertyChangeEvent *const dpce = static_cast(event); const QString propertyName = dpce->propertyName(); if (propertyName == PROP_POSITION) @@ -489,55 +199,7 @@ bool AbstractPluginsController::eventFilter(QObject *o, QEvent *e) return false; } -bool AbstractPluginsController::canAddRemove(PluginsItemInterface *plugin) const +PluginManagerInterface *AbstractPluginsController::pluginManager() const { - if (!plugin->flags() & PluginFlag::Attribute_CanSetting) - return false; - - if (plugin->flags() & PluginFlag::Type_Tool) - return true; - - if (plugin->flags() & PluginFlag::Type_System) - return true; - - return false; -} - -bool AbstractPluginsController::canAddedPlugin(PluginsItemInterface *plugin) const -{ - if (!canAddRemove(plugin)) - return true; - - const QStringList configPlugins = SETTINGCONFIG->value("Dock_Quick_Plugin_Name").toStringList(); - return configPlugins.contains(plugin->pluginName()); -} - -void AbstractPluginsController::onConfigChanged(const QString &key, const QVariant &value) -{ - QStringList pluginNames = value.toStringList(); - if (key == "Dock_Quick_Plugin_Name") { - // 这里只处理工具插件(回收站)和系统插件(电源插件) - for (PluginsItemInterface *plugin : pluginCurrent()) { - if (!canAddRemove(plugin)) - continue; - - const QString itemKey = m_pluginItemKeyMap.value(plugin); - if (!pluginNames.contains(plugin->pluginName()) && pluginIsLoaded(plugin)) { - // 如果当前配置中不包含当前插件,但是当前插件已经加载,那么就移除该插件 - pluginItemRemoved(plugin, itemKey); - QWidget *itemWidget = plugin->itemWidget(itemKey); - if (itemWidget) - itemWidget->setVisible(false); - } else if (pluginNames.contains(plugin->pluginName()) && !pluginIsLoaded(plugin)) { - // 如果当前配置中包含当前插件,但是当前插件并未加载,那么就加载该插件 - pluginItemAdded(plugin, itemKey); - // 只有工具插件是通过QWidget的方式进行显示的,因此,这里只处理工具插件 - if (plugin->flags() & PluginFlag::Type_Tool) { - QWidget *itemWidget = plugin->itemWidget(itemKey); - if (itemWidget) - itemWidget->setVisible(true); - } - } - } - } + return m_pluginManager; } diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index 028ca6909..f1b4ff887 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -33,6 +33,7 @@ class PluginsItemInterface; class PluginAdapter; +class PluginManagerInterface; class AbstractPluginsController : public QObject, PluginProxyInterface { @@ -43,49 +44,22 @@ public: ~ AbstractPluginsController() override; void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {} - virtual QList pluginCurrent() const; - - virtual bool needLoad(PluginsItemInterface *) { return true; } - QMap> &pluginsMap(); - - virtual void savePluginValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value); - virtual const QVariant getPluginValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()); - virtual void removePluginValue(PluginsItemInterface * const itemInter, const QStringList &keyList); - - virtual void pluginItemAdded(PluginsItemInterface * const, const QString &) = 0; - virtual void pluginItemUpdate(PluginsItemInterface * const, const QString &) = 0; - virtual void pluginItemRemoved(PluginsItemInterface * const, const QString &) = 0; - virtual void requestPluginWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) {} - virtual void requestRefreshPluginWindowVisible(PluginsItemInterface * const, const QString &) {} - virtual void requestSetPluginAppletVisible(PluginsItemInterface * const, const QString &, const bool) {} Q_SIGNALS: void pluginLoaderFinished(); protected: - virtual bool pluginIsLoaded(PluginsItemInterface *itemInter) { return true; } + bool eventFilter(QObject *object, QEvent *event) override; - QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; - PluginsItemInterface *pluginInterAt(const QString &itemKey); - PluginsItemInterface *pluginInterAt(QObject *destItem); - bool eventFilter(QObject *o, QEvent *e) override; - - bool canAddRemove(PluginsItemInterface *plugin) const; - bool canAddedPlugin(PluginsItemInterface *plugin) const; + PluginManagerInterface *pluginManager() const; private: // implements PluginProxyInterface - void saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) override; - const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override; - void removeValue(PluginsItemInterface * const itemInter, const QStringList &keyList) override; - - void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; - void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; - void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; - PluginsItemInterface *getPluginInterface(PluginsItemInterface * const itemInter); + void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override {} + void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override {} + void saveValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &value) override {} + void removeValue(PluginsItemInterface *const itemInter, const QStringList &keyList) override {} + const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override { return QVariant(); } protected Q_SLOTS: void startLoader(PluginLoader *loader); @@ -95,23 +69,15 @@ private slots: void positionChanged(); void loadPlugin(const QString &pluginFile); void initPlugin(PluginsItemInterface *interface); - void refreshPluginSettings(); - void onConfigChanged(const QString &key, const QVariant &value); private: - QDBusConnectionInterface *m_dbusDaemonInterface; - DockInter *m_dockDaemonInter; - - // interface, "pluginloader", PluginLoader指针对象 QMap> m_pluginsMap; // filepath, interface, loaded QMap, bool> m_pluginLoadMap; - QList m_pluginExists; - QMap m_pluginItemKeyMap; QJsonObject m_pluginSettingsObject; - QMap m_pluginAdapterMap; + PluginManagerInterface *m_pluginManager; }; #endif // ABSTRACTPLUGINSCONTROLLER_H diff --git a/frame/util/customevent.cpp b/frame/util/customevent.cpp new file mode 100644 index 000000000..30075d03e --- /dev/null +++ b/frame/util/customevent.cpp @@ -0,0 +1,19 @@ +#include "customevent.h" + +// 注册事件类型 +static QEvent::Type pluginEventType = (QEvent::Type)QEvent::registerEventType(QEvent::User + 1001); + +// 事件处理,当收到该事件的时候,加载插件 +PluginLoadEvent::PluginLoadEvent() + : QEvent(pluginEventType) +{ +} + +PluginLoadEvent::~PluginLoadEvent() +{ +} + +QEvent::Type PluginLoadEvent::eventType() +{ + return pluginEventType; +} diff --git a/frame/util/customevent.h b/frame/util/customevent.h new file mode 100644 index 000000000..ddcbdc32b --- /dev/null +++ b/frame/util/customevent.h @@ -0,0 +1,16 @@ +#ifndef CUSTOMEVENT_H +#define CUSTOMEVENT_H + +#include + +// 该插件用于处理插件的延迟加载,当退出安全模式后,会收到该事件并加载插件 +class PluginLoadEvent : public QEvent +{ +public: + PluginLoadEvent(); + ~PluginLoadEvent() override; + + static Type eventType(); +}; + +#endif // CUSTOMEVENT_H diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 62808c0fe..8c5346b1f 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -24,7 +24,6 @@ #include "mainpanelcontrol.h" #include "dockitemmanager.h" #include "menuworker.h" -#include "proxyplugincontroller.h" #include "windowmanager.h" #include "dockscreen.h" #include "dragwidget.h" diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index aa70f3b96..822ceb67a 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -25,7 +25,7 @@ #include -#define PLUGINNAMEKEY "Dock_Quick_Plugin_Name" +#define PLUGINNAMEKEY "Dock_Quick_Plugins" QuickPluginModel *QuickPluginModel::instance() { @@ -81,9 +81,9 @@ QList QuickPluginModel::dockedPluginItems() const QList activedItems; for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { if (isFixed(itemInter)) - activedItems << itemInter; - else dockedItems << itemInter; + else + activedItems << itemInter; } std::sort(dockedItems.begin(), dockedItems.end(), [ this ](PluginsItemInterface *item1, PluginsItemInterface *item2) { return m_dockedPluginIndex.value(item1->pluginName()) < m_dockedPluginIndex.value(item2->pluginName()); @@ -144,12 +144,8 @@ void QuickPluginModel::onSettingChanged(const QString &key, const QVariant &valu } // 2、将配置中已有的但是插件列表中没有的插件移动到任务栏上 QList plugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick); - for (PluginsItemInterface *plugin : plugins) { - if (m_dockedPluginsItems.contains(plugin) || !localOrder.contains(plugin->pluginName())) - continue; - + for (PluginsItemInterface *plugin : plugins) m_dockedPluginsItems << plugin; - } m_dockedPluginIndex.clear(); for (int i = 0; i < localOrder.size(); i++) @@ -161,7 +157,7 @@ void QuickPluginModel::onSettingChanged(const QString &key, const QVariant &valu void QuickPluginModel::initConnection() { QuickSettingController *quickController = QuickSettingController::instance(); - connect(quickController, &QuickSettingController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute plugAttr) { + connect(quickController, &QuickSettingController::pluginInserted, this, [ this, quickController ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute plugAttr) { if (plugAttr != QuickSettingController::PluginAttribute::Quick) return; @@ -169,9 +165,11 @@ void QuickPluginModel::initConnection() if (quickWidget && !quickWidget->parentWidget()) quickWidget->setVisible(false); - // 用来读取已经固定在下方的插件或者强制显示的插件 - if (!m_dockedPluginIndex.contains(itemInter->pluginName()) && !(itemInter->flags() & Attribute_ForceDock)) - return; + if (!m_dockedPluginIndex.contains(itemInter->pluginName())) { + QJsonObject json = quickController->metaData(itemInter); + if (json.contains("order")) + m_dockedPluginIndex[itemInter->pluginName()] = json.value("order").toInt(); + } m_dockedPluginsItems << itemInter; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index d6d42ed98..65bab4389 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -24,7 +24,6 @@ #include "pluginsiteminterface.h" #include "quicksettingcontainer.h" #include "appdrag.h" -#include "proxyplugincontroller.h" #include "quickpluginmodel.h" #include "quickdragcore.h" @@ -89,8 +88,6 @@ typedef struct DragInfo{ } } DragInfo; -static QStringList fixedPluginNames{ "network", "sound", "power" }; - QuickPluginWindow::QuickPluginWindow(QWidget *parent) : QWidget(parent) , m_mainLayout(new QBoxLayout(QBoxLayout::RightToLeft, this)) @@ -420,9 +417,10 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do } } -void QuickPluginWindow::onRequestAppletShow(PluginsItemInterface *itemInter, const QString &itemKey) +void QuickPluginWindow::onRequestAppletVisible(PluginsItemInterface *itemInter, const QString &itemKey, bool visible) { - showPopup(getDockItemByPlugin(itemInter), itemInter, itemInter->itemPopupApplet(itemKey), false); + if (visible) + showPopup(getDockItemByPlugin(itemInter), itemInter, itemInter->itemPopupApplet(itemKey), false); } void QuickPluginWindow::startDrag() @@ -589,7 +587,7 @@ void QuickPluginWindow::initConnection() QuickPluginModel *model = QuickPluginModel::instance(); connect(model, &QuickPluginModel::requestUpdate, this, &QuickPluginWindow::onRequestUpdate); connect(model, &QuickPluginModel::requestUpdatePlugin, this, &QuickPluginWindow::onUpdatePlugin); - connect(QuickSettingController::instance(), &QuickSettingController::requestAppletShow, this, &QuickPluginWindow::onRequestAppletShow); + connect(QuickSettingController::instance(), &QuickSettingController::requestAppletVisible, this, &QuickPluginWindow::onRequestAppletVisible); } /** @@ -800,10 +798,15 @@ bool QuickDockItem::eventFilter(QObject *watched, QEvent *event) QPixmap QuickDockItem::iconPixmap() const { - int pixmapSize = static_cast(ICONHEIGHT * (QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio())); QIcon icon = m_pluginItem->icon(DockPart::QuickShow); - if (!icon.isNull()) + if (!icon.isNull()) { + if (icon.availableSizes().size() > 0) { + QSize size = icon.availableSizes().first(); + return icon.pixmap(size); + } + int pixmapSize = static_cast(ICONHEIGHT * (QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio())); return icon.pixmap(pixmapSize, pixmapSize); + } return QPixmap(); } diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 7dd7f1006..b77fbf2bb 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -69,7 +69,7 @@ protected: private Q_SLOTS: void onRequestUpdate(); void onUpdatePlugin(PluginsItemInterface *itemInter, const DockPart &dockPart); - void onRequestAppletShow(PluginsItemInterface * itemInter, const QString &itemKey); + void onRequestAppletVisible(PluginsItemInterface * itemInter, const QString &itemKey, bool visible); private: void initUi(); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 3afc4b0e4..4e37be5de 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -19,7 +19,6 @@ * along with this program. If not, see . */ #include "systempluginwindow.h" -#include "systemplugincontroller.h" #include "systempluginitem.h" #include "quicksettingcontroller.h" #include "utils.h" diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 4181ba1eb..f1aeb5533 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -26,7 +26,6 @@ #include "dockitemmanager.h" #include "dockscreen.h" #include "displaymanager.h" -#include "proxyplugincontroller.h" #include #include From e7dbbb0140acf1760a56d4a02adbff297a5aa00c Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 5 Jan 2023 17:03:02 +0800 Subject: [PATCH 228/257] =?UTF-8?q?fix:=20=E7=82=B9=E5=87=BB=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=BC=B9=E5=87=BA=E8=87=AA=E5=B7=B1=E7=9A=84=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、删除已经移到插件中的文件 2、点击插件图标,弹出当前插件对应的列表 Log: Influence: 点击插件,观察是否弹出插件自己对应的列表,如果没有弹出列表,则触发这个插件的功能 Task: https://pms.uniontech.com/task-view-222353.html Change-Id: Ia8797ccbe630d56d79ab9138d5aa982b66f74c57 --- frame/item/quicksettingitem.cpp | 21 -- frame/item/quicksettingitem.h | 6 - frame/util/dockpopupwindow.cpp | 38 ++ frame/util/dockpopupwindow.h | 18 + frame/window/docktraywindow.cpp | 3 +- frame/window/quickpluginwindow.cpp | 197 +++++++++-- frame/window/quickpluginwindow.h | 17 +- frame/window/quicksettingcontainer.cpp | 466 ------------------------- frame/window/quicksettingcontainer.h | 99 ------ frame/window/traymanagerwindow.cpp | 3 +- 10 files changed, 234 insertions(+), 634 deletions(-) delete mode 100644 frame/window/quicksettingcontainer.cpp delete mode 100644 frame/window/quicksettingcontainer.h diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 2390a540f..f3c126088 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -21,9 +21,6 @@ #include "quicksettingitem.h" #include "pluginsiteminterface.h" #include "imageutil.h" -#include "multiquickitem.h" -#include "singlequickitem.h" -#include "fullquickitem.h" #include "quicksettingcontroller.h" #include @@ -108,21 +105,3 @@ QColor QuickSettingItem::foregroundColor() const return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); } - -QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter) -{ - // 如果显示在面板的图标或者Widget为空,则不让显示(例如电池插件) - if (!(pluginInter->flags() & PluginFlag::Type_Common)) - return nullptr; - - if (pluginInter->flags() & PluginFlag::Quick_Multi) - return new MultiQuickItem(pluginInter); - - if (pluginInter->flags() & PluginFlag::Quick_Full) - return new FullQuickItem(pluginInter); - - if (pluginInter->flags() & PluginFlag::Quick_Single) - return new SingleQuickItem(pluginInter); - - return nullptr; -} diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index dd7dec259..a0af17691 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -61,10 +61,4 @@ private: QString m_itemKey; }; -class QuickSettingFactory -{ -public: - static QuickSettingItem *createQuickWidget(PluginsItemInterface *const pluginInter); -}; - #endif // QUICKSETTINGITEM_H diff --git a/frame/util/dockpopupwindow.cpp b/frame/util/dockpopupwindow.cpp index 0c97f79a8..a38809688 100644 --- a/frame/util/dockpopupwindow.cpp +++ b/frame/util/dockpopupwindow.cpp @@ -214,3 +214,41 @@ void DockPopupWindow::onButtonPress(int type, int x, int y, const QString &key) emit accept(); hide(); } + +PopupSwitchWidget::PopupSwitchWidget(QWidget *parent) + : QWidget(parent) + , m_containerLayout(new QVBoxLayout(this)) + , m_topWidget(nullptr) +{ + m_containerLayout->setContentsMargins(0, 0, 0, 0); + m_containerLayout->setSpacing(0); +} + +PopupSwitchWidget::~PopupSwitchWidget() +{ +} + +void PopupSwitchWidget::pushWidget(QWidget *widget) +{ + // 首先将界面其他的窗体移除 + for (int i = m_containerLayout->count() - 1; i >= 0; i--) { + QLayoutItem *item = m_containerLayout->itemAt(i); + item->widget()->removeEventFilter(this); + item->widget()->hide(); + m_containerLayout->removeItem(item); + } + m_topWidget = widget; + setFixedSize(widget->size()); + widget->installEventFilter(this); + m_containerLayout->addWidget(widget); + widget->show(); +} + +bool PopupSwitchWidget::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_topWidget && event->type() == QEvent::Resize) { + setFixedSize(m_topWidget->size()); + } + + return QWidget::eventFilter(watched, event); +} diff --git a/frame/util/dockpopupwindow.h b/frame/util/dockpopupwindow.h index 0457a3964..e08dcb131 100644 --- a/frame/util/dockpopupwindow.h +++ b/frame/util/dockpopupwindow.h @@ -82,4 +82,22 @@ private: QWidget *m_extendWidget; }; +class PopupSwitchWidget : public QWidget +{ + Q_OBJECT + +public: + explicit PopupSwitchWidget(QWidget *parent = nullptr); + ~PopupSwitchWidget(); + + void pushWidget(QWidget *widget); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + +private: + QVBoxLayout *m_containerLayout; + QWidget *m_topWidget; +}; + #endif // DOCKPOPUPWINDOW_H diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index eadcc93d1..dcf030a0e 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -27,7 +27,6 @@ #include "tray_delegate.h" #include "quicksettingcontroller.h" #include "pluginsitem.h" -#include "quicksettingcontainer.h" #include "expandiconwidget.h" #include "quickdragcore.h" @@ -422,7 +421,7 @@ void DockTrayWindow::onDropIcon(QDropEvent *dropEvent) if (!dropEvent || !dropEvent->mimeData() || dropEvent->source() == this) return; - if (qobject_cast(dropEvent->source())) { + if (m_quickIconWidget->isQuickWindow(dropEvent->source())) { const QuickPluginMimeData *mimeData = qobject_cast(dropEvent->mimeData()); if (!mimeData) return; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 65bab4389..c36ba37cf 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -22,7 +22,6 @@ #include "quicksettingcontroller.h" #include "quicksettingitem.h" #include "pluginsiteminterface.h" -#include "quicksettingcontainer.h" #include "appdrag.h" #include "quickpluginmodel.h" #include "quickdragcore.h" @@ -112,9 +111,9 @@ QuickPluginWindow::~QuickPluginWindow() void QuickPluginWindow::initUi() { setAcceptDrops(true); - m_mainLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + m_mainLayout->setAlignment(Qt::AlignCenter); m_mainLayout->setDirection(QBoxLayout::RightToLeft); - m_mainLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0); + m_mainLayout->setContentsMargins(0, 0, 0, 0); m_mainLayout->setSpacing(ITEMSPACE); } @@ -124,14 +123,17 @@ void QuickPluginWindow::setPositon(Position position) return; m_position = position; - QuickSettingContainer::setPosition(position); - QuickDockItem::setPosition(position); + for (int i = 0; i < m_mainLayout->count(); i++) { + QuickDockItem *dockItemWidget = qobject_cast(m_mainLayout->itemAt(i)->widget()); + if (dockItemWidget) { + dockItemWidget->setPosition(position); + } + } + resizeDockItem(); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { m_mainLayout->setDirection(QBoxLayout::RightToLeft); - m_mainLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); } else { m_mainLayout->setDirection(QBoxLayout::BottomToTop); - m_mainLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter); } } @@ -176,7 +178,7 @@ QSize QuickPluginWindow::suitableSize(const Dock::Position &position) const } itemWidth += ITEMSPACE; - return QSize(itemWidth, ITEMSIZE); + return QSize(itemWidth, QWIDGETSIZE_MAX); } int itemHeight = 0; @@ -187,7 +189,18 @@ QSize QuickPluginWindow::suitableSize(const Dock::Position &position) const } itemHeight += ITEMSPACE; - return QSize(ITEMSIZE, itemHeight); + return QSize(QWIDGETSIZE_MAX, itemHeight); +} + +bool QuickPluginWindow::isQuickWindow(QObject *object) const +{ + QList dockPlugins = QuickPluginModel::instance()->dockedPluginItems(); + for (PluginsItemInterface *plugin : dockPlugins) { + if (plugin->pluginName() == QString("pluginManager") && plugin->itemPopupApplet(QUICK_ITEM_KEY) == object) + return true; + } + + return false; } PluginsItemInterface *QuickPluginWindow::findQuickSettingItem(const QPoint &mousePoint, const QList &settingItems) @@ -223,6 +236,14 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) break; } } + if (watched == getPopWindow()->getContent()) { +#define ITEMWIDTH 70 +#define QUICKITEMSPACE 10 + int maxWidth = ITEMWIDTH * 4 + (QUICKITEMSPACE * 5); + int contentWidget = getPopWindow()->getContent()->width(); + if (contentWidget > maxWidth || contentWidget <= 0) + getPopWindow()->getContent()->setFixedWidth(maxWidth); + } switch (event->type()) { case QEvent::MouseButtonPress: { QMouseEvent *mouseEvent = static_cast(event); @@ -249,7 +270,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) if (m_dragInfo->canDrag(mouseEvent->pos())) break; - showPopup(m_dragInfo->dockItem); + showPopup(m_dragInfo->dockItem, m_dragInfo->dockItem->pluginItem(), m_dragInfo->dockItem->pluginItem()->itemPopupApplet(QUICK_ITEM_KEY), true); } while (false); m_dragInfo->reset(); @@ -260,7 +281,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) break; QMouseEvent *mouseEvent = static_cast(event); - if (m_dragInfo->canDrag(mouseEvent->pos())) + if (m_dragInfo->canDrag(mouseEvent->pos()) && m_dragInfo->dockItem->canMove()) startDrag(); m_dragInfo->reset(); @@ -269,7 +290,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) case QEvent::Drop: { m_dragEnterMimeData = nullptr; QDropEvent *dropEvent = static_cast(event); - if (qobject_cast(dropEvent->source())) { + if (isQuickWindow(dropEvent->source())) { const QuickPluginMimeData *mimeData = qobject_cast(dropEvent->mimeData()); if (mimeData) dragPlugin(mimeData->pluginItemInterface()); @@ -353,7 +374,7 @@ void QuickPluginWindow::onRequestUpdate() itemWidget = pluginItems[item]; } else { itemWidget = new QuickDockItem(item, quickController->itemKey(item), this); - itemWidget->setFixedSize(itemWidget->suitableSize()); + updateDockItemSize(itemWidget); itemWidget->installEventFilter(this); itemWidget->setMouseTracking(true); countChanged = true; @@ -412,7 +433,7 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do QuickDockItem *quickDockItem = getDockItemByPlugin(itemInter); if (quickDockItem) { - quickDockItem->setFixedSize(quickDockItem->suitableSize()); + updateDockItemSize(quickDockItem); quickDockItem->update(); } } @@ -481,11 +502,21 @@ QuickDockItem *QuickPluginWindow::getActiveDockItem(QPoint point) const void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *itemInter, QWidget *childPage, bool isClicked) { - if (!isVisible()) + if (!isVisible() || !item) return; - bool canBack = true; - DockPopupWindow *popWindow = QuickSettingContainer::popWindow(); + if (!childPage) { + const QString itemKey = QuickSettingController::instance()->itemKey(itemInter); + QStringList commandArgument = itemInter->itemCommand(itemKey).split(" "); + if (commandArgument.size() > 0) { + QString command = commandArgument.first(); + commandArgument.removeFirst(); + QProcess::startDetached(command, commandArgument); + } + return; + } + + DockPopupWindow *popWindow = getPopWindow(); if (isClicked && popWindow->isVisible()) { // 如果是点击插件,并且该插件曾经打开快捷面板且已经是显示状态,那么就直接隐藏快捷面板 popWindow->hide(); @@ -508,14 +539,12 @@ void QuickPluginWindow::showPopup(QuickDockItem *item, PluginsItemInterface *ite } } + PopupSwitchWidget *switchWidget = static_cast(popWindow->getContent()); + switchWidget->installEventFilter(this); + switchWidget->pushWidget(childPage); popWindow->setExtendWidget(item); popWindow->show(popupPoint(item), true); - canBack = false; } - - QuickSettingContainer *container = static_cast(popWindow->getContent()); - container->showPage(childPage, itemInter, canBack); - popWindow->raise(); } QList QuickPluginWindow::quickDockItems() @@ -536,6 +565,62 @@ QList QuickPluginWindow::quickDockItems() return dockItems; } +// 根据位置获取箭头的方向 +static DArrowRectangle::ArrowDirection getDirection(const Dock::Position &position) +{ + switch (position) { + case Dock::Position::Top: + return DArrowRectangle::ArrowDirection::ArrowTop; + case Dock::Position::Left: + return DArrowRectangle::ArrowDirection::ArrowLeft; + case Dock::Position::Right: + return DArrowRectangle::ArrowDirection::ArrowRight; + default: + return DArrowRectangle::ArrowDirection::ArrowBottom; + } + + return DArrowRectangle::ArrowDirection::ArrowBottom; +} + +DockPopupWindow *QuickPluginWindow::getPopWindow() const +{ + static DockPopupWindow *popWindow = nullptr; + if (popWindow) + return popWindow; + + popWindow = new DockPopupWindow; + popWindow->setShadowBlurRadius(20); + popWindow->setRadius(18); + popWindow->setShadowYOffset(2); + popWindow->setShadowXOffset(0); + popWindow->setArrowWidth(18); + popWindow->setArrowHeight(10); + popWindow->setArrowDirection(getDirection(m_position)); + popWindow->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); + PopupSwitchWidget *content = new PopupSwitchWidget(popWindow); + popWindow->setContent(content); + return popWindow; +} + +void QuickPluginWindow::updateDockItemSize(QuickDockItem *dockItem) +{ + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + dockItem->setFixedSize(dockItem->suitableSize().width(), height()); + } else { + dockItem->setFixedSize(width(), dockItem->suitableSize().height()); + } +} + +void QuickPluginWindow::resizeDockItem() +{ + for (int i = 0; i < m_mainLayout->count(); i++) { + QuickDockItem *dockItemWidget = qobject_cast(m_mainLayout->itemAt(i)->widget()); + if (dockItemWidget) { + updateDockItemSize(dockItemWidget); + } + } +} + int QuickPluginWindow::getDropIndex(QPoint point) { QList dockedItems = quickDockItems(); @@ -582,6 +667,12 @@ void QuickPluginWindow::dragMoveEvent(QDragMoveEvent *event) event->accept(); } +void QuickPluginWindow::resizeEvent(QResizeEvent *event) +{ + resizeDockItem(); + QWidget::resizeEvent(event); +} + void QuickPluginWindow::initConnection() { QuickPluginModel *model = QuickPluginModel::instance(); @@ -596,15 +687,15 @@ void QuickPluginWindow::initConnection() * @param parent */ -Dock::Position QuickDockItem::m_position(Dock::Position::Bottom); - QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent) : QWidget(parent) , m_pluginItem(pluginItem) , m_itemKey(itemKey) + , m_position(Dock::Position::Bottom) , m_popupWindow(new DockPopupWindow) , m_contextMenu(new QMenu(this)) , m_tipParent(nullptr) + , m_mainWidget(nullptr) , m_mainLayout(nullptr) , m_dockItemParent(nullptr) { @@ -625,6 +716,7 @@ QuickDockItem::~QuickDockItem() void QuickDockItem::setPosition(Dock::Position position) { m_position = position; + updateWidgetSize(); } PluginsItemInterface *QuickDockItem::pluginItem() @@ -637,6 +729,11 @@ bool QuickDockItem::canInsert() const return (m_pluginItem->flags() & PluginFlag::Attribute_CanInsert); } +bool QuickDockItem::canMove() const +{ + return (m_pluginItem->flags() & PluginFlag::Attribute_CanDrag); +} + void QuickDockItem::hideToolTip() { m_popupWindow->hide(); @@ -679,13 +776,11 @@ void QuickDockItem::paintEvent(QPaintEvent *event) return QWidget::paintEvent(event); QPixmap pixmap = iconPixmap(); - int width = ICONWIDTH; - int height = ICONHEIGHT; - if (m_pluginItem->pluginSizePolicy() == PluginsItemInterface::PluginSizePolicy::Custom) { - width = pixmap.width(); - height = pixmap.height(); - } - QRect pixmapRect = QRect(QPoint((rect().width() - width) / 2, (rect().height() - height) / 2), pixmap.size()); + if (pixmap.isNull()) + return QWidget::paintEvent(event); + + QSize size = suitableSize(); + QRect pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), pixmap.size()); QPainter painter(this); painter.drawPixmap(pixmapRect, pixmap); @@ -770,7 +865,7 @@ void QuickDockItem::showEvent(QShowEvent *event) QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); if (itemWidget && m_mainLayout->indexOf(itemWidget) < 0) { itemWidget->show(); - itemWidget->setFixedSize(size()); + itemWidget->setFixedSize(suitableSize()); m_mainLayout->addWidget(itemWidget); } } @@ -790,12 +885,19 @@ void QuickDockItem::hideEvent(QHideEvent *event) bool QuickDockItem::eventFilter(QObject *watched, QEvent *event) { + // 让插件来处理当前插件的事件 if (watched == this) return m_pluginItem->eventHandler(event); return QWidget::eventFilter(watched, event); } +void QuickDockItem::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + updateWidgetSize(); +} + QPixmap QuickDockItem::iconPixmap() const { QIcon icon = m_pluginItem->icon(DockPart::QuickShow); @@ -804,8 +906,9 @@ QPixmap QuickDockItem::iconPixmap() const QSize size = icon.availableSizes().first(); return icon.pixmap(size); } - int pixmapSize = static_cast(ICONHEIGHT * (QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio())); - return icon.pixmap(pixmapSize, pixmapSize); + int pixmapWidth = static_cast(ICONWIDTH * (QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio())); + int pixmapHeight = static_cast(ICONHEIGHT * (QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio())); + return icon.pixmap(pixmapWidth, pixmapHeight); } return QPixmap(); @@ -817,7 +920,14 @@ void QuickDockItem::initUi() if (!pixmap.isNull()) return; - m_mainLayout = new QHBoxLayout(this); + m_topLayout = new QHBoxLayout(this); + m_topLayout->setContentsMargins(0, 0, 0, 0); + m_topLayout->setAlignment(Qt::AlignCenter); + m_mainWidget = new QWidget(this); + m_topLayout->addWidget(m_mainWidget); + updateWidgetSize(); + + m_mainLayout = new QHBoxLayout(m_mainWidget); m_mainLayout->setContentsMargins(0, 0, 0, 0); QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); if (itemWidget) { @@ -849,6 +959,23 @@ void QuickDockItem::initConnection() connect(qApp, &QApplication::aboutToQuit, m_popupWindow, &DockPopupWindow::deleteLater); } +void QuickDockItem::updateWidgetSize() +{ + if (!m_mainWidget) + return; + + QSize size = suitableSize(); + int width = size.width(); + int height = size.height(); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + // 上下方向 + m_mainWidget->setFixedSize(QWIDGETSIZE_MAX, height); + } else { + // 左右方向 + m_mainWidget->setFixedSize(width, QWIDGETSIZE_MAX); + } +} + QPoint QuickDockItem::topleftPoint() const { QPoint p = this->pos(); diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index b77fbf2bb..5a94b24f3 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -28,7 +28,6 @@ class QuickSettingItem; class PluginsItemInterface; class QHBoxLayout; -class QuickSettingContainer; class QStandardItemModel; class QStandardItem; class QMouseEvent; @@ -57,6 +56,8 @@ public: QSize suitableSize() const; QSize suitableSize(const Dock::Position &position) const; + bool isQuickWindow(QObject *object) const; + Q_SIGNALS: void itemCountChanged(); @@ -65,6 +66,7 @@ protected: void dragEnterEvent(QDragEnterEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; + void resizeEvent(QResizeEvent *event) override; private Q_SLOTS: void onRequestUpdate(); @@ -82,6 +84,9 @@ private: QuickDockItem *getActiveDockItem(QPoint point) const; void showPopup(QuickDockItem *item, PluginsItemInterface *itemInter = nullptr, QWidget *childPage = nullptr, bool isClicked = true); QList quickDockItems(); + DockPopupWindow *getPopWindow() const; + void updateDockItemSize(QuickDockItem *dockItem); + void resizeDockItem(); private: QBoxLayout *m_mainLayout; @@ -99,9 +104,10 @@ public: explicit QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent = nullptr); ~QuickDockItem(); - static void setPosition(Dock::Position position); + void setPosition(Dock::Position position); PluginsItemInterface *pluginItem(); bool canInsert() const; + bool canMove() const; void hideToolTip(); QSize suitableSize() const; @@ -114,6 +120,7 @@ protected: void showEvent(QShowEvent *event) override; void hideEvent(QHideEvent *event) override; bool eventFilter(QObject *watched, QEvent *event) override; + void resizeEvent(QResizeEvent *event) override; private: QPoint topleftPoint() const; @@ -125,16 +132,20 @@ private: void initAttribute(); void initConnection(); + void updateWidgetSize(); + private Q_SLOTS: void onMenuActionClicked(QAction *action); private: PluginsItemInterface *m_pluginItem; QString m_itemKey; - static Dock::Position m_position; + Dock::Position m_position; DockPopupWindow *m_popupWindow; QMenu *m_contextMenu; QWidget *m_tipParent; + QHBoxLayout *m_topLayout; + QWidget *m_mainWidget; QHBoxLayout *m_mainLayout; QWidget *m_dockItemParent; }; diff --git a/frame/window/quicksettingcontainer.cpp b/frame/window/quicksettingcontainer.cpp deleted file mode 100644 index 0c110cea9..000000000 --- a/frame/window/quicksettingcontainer.cpp +++ /dev/null @@ -1,466 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "quicksettingcontainer.h" -#include "quicksettingcontroller.h" -#include "pluginsiteminterface.h" -#include "quicksettingitem.h" -#include "dockpopupwindow.h" -#include "slidercontainer.h" -#include "pluginchildpage.h" -#include "utils.h" -#include "quickdragcore.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -struct QuickDragInfo { - QPoint dragPosition; - QWidget *dragItem = nullptr; - PluginsItemInterface *pluginInter = nullptr; - void reset() { - dragPosition.setX(0); - dragPosition.setY(0); - dragItem = nullptr; - pluginInter = nullptr; - } - bool isNull() { - return !dragItem; - } -} QuickDragInfo; - -#define ITEMWIDTH 70 -#define ITEMHEIGHT 60 -#define ITEMSPACE 10 -#define COLUMNCOUNT 4 - -DockPopupWindow *QuickSettingContainer::m_popWindow = nullptr; -Dock::Position QuickSettingContainer::m_position = Dock::Position::Bottom; - -QuickSettingContainer::QuickSettingContainer(QWidget *parent) - : QWidget(parent) - , m_switchLayout(new QStackedLayout(this)) - , m_mainWidget(new QWidget(this)) - , m_pluginWidget(new QWidget(m_mainWidget)) - , m_pluginLayout(new QGridLayout(m_pluginWidget)) - , m_componentWidget(new QWidget(m_mainWidget)) - , m_mainlayout(new QVBoxLayout(m_mainWidget)) - , m_pluginLoader(QuickSettingController::instance()) - , m_childPage(new PluginChildPage(this)) - , m_dragInfo(new struct QuickDragInfo) - , m_childShowPlugin(nullptr) -{ - initUi(); - initConnection(); - m_childPage->installEventFilter(this); - setMouseTracking(true); -} - -QuickSettingContainer::~QuickSettingContainer() -{ - delete m_dragInfo; -} - -void QuickSettingContainer::showPage(QWidget *widget, PluginsItemInterface *pluginInter, bool canBack) -{ - if (widget && pluginInter && widget != m_mainWidget) { - m_childShowPlugin = pluginInter; - m_childPage->setTitle(pluginInter->pluginDisplayName()); - m_childPage->setCanBack(canBack); - m_childPage->pushWidget(widget); - m_switchLayout->setCurrentWidget(m_childPage); - } else { - m_childShowPlugin = nullptr; - m_switchLayout->setCurrentIndex(0); - } - - onResizeView(); -} - -// 根据位置获取箭头的方向 -static DArrowRectangle::ArrowDirection getDirection(const Dock::Position &position) -{ - switch (position) { - case Dock::Position::Top: - return DArrowRectangle::ArrowDirection::ArrowTop; - case Dock::Position::Left: - return DArrowRectangle::ArrowDirection::ArrowLeft; - case Dock::Position::Right: - return DArrowRectangle::ArrowDirection::ArrowRight; - default: - return DArrowRectangle::ArrowDirection::ArrowBottom; - } - - return DArrowRectangle::ArrowDirection::ArrowBottom; -} - -DockPopupWindow *QuickSettingContainer::popWindow() -{ - if (m_popWindow) - return m_popWindow; - - m_popWindow = new DockPopupWindow; - m_popWindow->setShadowBlurRadius(20); - m_popWindow->setRadius(18); - m_popWindow->setShadowYOffset(2); - m_popWindow->setShadowXOffset(0); - m_popWindow->setArrowWidth(18); - m_popWindow->setArrowHeight(10); - m_popWindow->setArrowDirection(getDirection(m_position)); - m_popWindow->setContent(new QuickSettingContainer(m_popWindow)); - m_popWindow->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); - return m_popWindow; -} - -void QuickSettingContainer::setPosition(Position position) -{ - if (m_position == position) - return; - - m_position = position; - - if (m_popWindow) { - m_popWindow->setArrowDirection(getDirection(m_position)); - // 在任务栏位置发生变化的时候,需要将当前的content获取后,重新调用setContent接口 - // 如果不调用,那么就会出现内容在容器内部的位置错误,界面上的布局会乱 - QWidget *widget = m_popWindow->getContent(); - m_popWindow->setContent(widget); - } -} - -bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) -{ - switch (event->type()) { - case QEvent::Resize: { - onResizeView(); - break; - } - case QEvent::MouseButtonPress: { - QMouseEvent *mouseEvent = static_cast(event); - QuickSettingItem *item = qobject_cast(watched); - if (item) { - m_dragInfo->dragPosition = mouseEvent->pos(); - m_dragInfo->dragItem = item; - m_dragInfo->pluginInter = item->pluginItem(); - } - break; - } - case QEvent::MouseButtonRelease: { - m_dragInfo->reset(); - break; - } - default: - break; - } - - return QWidget::eventFilter(watched, event); -} - -void QuickSettingContainer::appendPlugin(PluginsItemInterface *itemInter, bool needLayout) -{ - QuickSettingItem *quickItem = QuickSettingFactory::createQuickWidget(itemInter); - if (!quickItem) - return; - - quickItem->setParent(m_pluginWidget); - quickItem->setMouseTracking(true); - quickItem->installEventFilter(this); - connect(quickItem, &QuickSettingItem::requestShowChildWidget, this, &QuickSettingContainer::onShowChildWidget); - m_quickSettings << quickItem; - if (quickItem->type() == QuickSettingItem::QuickSettingType::Full) { - // 插件位置占据整行,例如声音、亮度和音乐等 - m_componentWidget->layout()->addWidget(quickItem); - updateFullItemLayout(); - } else if (needLayout) { - // 插件占据两行或者一行 - updateItemLayout(); - } - - onResizeView(); -} - -void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) -{ - QList::Iterator removeItemIter = std::find_if(m_quickSettings.begin(), m_quickSettings.end(), [ = ](QuickSettingItem *item)->bool { - return item->pluginItem() == itemInter; - }); - - if (removeItemIter == m_quickSettings.end()) - return; - - QuickSettingItem *removeItem = *removeItemIter; - removeItem->detachPlugin(); - - if (removeItem->type() == QuickSettingItem::QuickSettingType::Full) - m_componentWidget->layout()->removeWidget(removeItem); - else - m_pluginLayout->removeWidget(removeItem); - - m_quickSettings.removeOne(removeItem); - removeItem->deleteLater(); - if (m_childShowPlugin == itemInter) - showPage(nullptr); - - updateItemLayout(); - updateFullItemLayout(); - onResizeView(); -} - -void QuickSettingContainer::onShowChildWidget(QWidget *childWidget) -{ - QuickSettingItem *quickWidget = qobject_cast(sender()); - if (!quickWidget) - return; - - showPage(childWidget, quickWidget->pluginItem(), true); -} - -void QuickSettingContainer::mouseMoveEvent(QMouseEvent *event) -{ - if (m_dragInfo->isNull()) - return; - - QPoint pointCurrent = event->pos(); - if (qAbs(m_dragInfo->dragPosition.x() - pointCurrent.x()) > 5 - || qAbs(m_dragInfo->dragPosition.y() - pointCurrent.y()) > 5) { - QuickSettingItem *moveItem = qobject_cast(m_dragInfo->dragItem); - QuickIconDrag *drag = new QuickIconDrag(this, moveItem->dragPixmap()); - QuickPluginMimeData *mimedata = new QuickPluginMimeData(m_dragInfo->pluginInter, drag); - drag->setMimeData(mimedata); - drag->setDragHotPot(m_dragInfo->dragPosition); - - m_dragInfo->reset(); - drag->exec(Qt::CopyAction); - } -} - -void QuickSettingContainer::updateItemLayout() -{ - // 清空之前的控件,重新添加 - while (m_pluginLayout->count() > 0) - m_pluginLayout->takeAt(0); - - // 将插件按照两列和一列的顺序来进行排序 - QMap> quickSettings; - QMap> orderQuickSettings; - QuickSettingController *quickController = QuickSettingController::instance(); - for (QuickSettingItem *item : m_quickSettings) { - QuickSettingItem::QuickSettingType type = item->type(); - if (type == QuickSettingItem::QuickSettingType::Full) - continue; - - QJsonObject metaData = quickController->metaData(item->pluginItem()); - if (metaData.contains("order")) - orderQuickSettings[type][item] = metaData.value("order").toInt(); - else - quickSettings[type] << item; - } - // 将需要排序的插件按照顺序插入到原来的数组中 - for (auto itQuick = orderQuickSettings.begin(); itQuick != orderQuickSettings.end(); itQuick++) { - QuickSettingItem::QuickSettingType type = itQuick.key(); - QMap &orderQuicks = itQuick.value(); - for (auto it = orderQuicks.begin(); it != orderQuicks.end(); it++) { - int index = it.value(); - if (index >= 0 && index < quickSettings[type].size()) - quickSettings[type][index] = it.key(); - else - quickSettings[type] << it.key(); - } - } - auto insertQuickSetting = [ quickSettings, this ](QuickSettingItem::QuickSettingType type, int &row, int &column) { - if (!quickSettings.contains(type)) - return; - - int usedColumn = (type == QuickSettingItem::QuickSettingType::Multi ? 2 : 1); - QList quickPlugins = quickSettings[type]; - for (QuickSettingItem *quickItem : quickPlugins) { - quickItem->setVisible(true); - m_pluginLayout->addWidget(quickItem, row, column, 1, usedColumn); - column += usedColumn; - if (column >= COLUMNCOUNT) { - row++; - column = 0; - } - } - }; - - int row = 0; - int column = 0; - insertQuickSetting(QuickSettingItem::QuickSettingType::Multi, row, column); - insertQuickSetting(QuickSettingItem::QuickSettingType::Single, row, column); -} - -void QuickSettingContainer::updateFullItemLayout() -{ - while (m_componentWidget->layout()->count() > 0) - m_componentWidget->layout()->takeAt(0); - - QuickSettingController *quickController = QuickSettingController::instance(); - QList fullItems; - QMap fullItemOrder; - for (QuickSettingItem *item : m_quickSettings) { - if (item->type() != QuickSettingItem::QuickSettingType::Full) - continue; - - fullItems << item; - int order = -1; - QJsonObject metaData = quickController->metaData(item->pluginItem()); - if (metaData.contains("order")) - order = metaData.value("order").toInt(); - - fullItemOrder[item] = order; - } - - std::sort(fullItems.begin(), fullItems.end(), [ fullItemOrder ](QuickSettingItem *item1, QuickSettingItem *item2) { - int order1 = fullItemOrder.value(item1, -1); - int order2 = fullItemOrder.value(item2, -1); - if (order1 == order2) - return true; - if (order1 == -1) - return false; - if (order2 == -1) - return true; - - return order1 < order2; - }); - - for (QuickSettingItem *item : fullItems) { - item->setVisible(true); - m_componentWidget->layout()->addWidget(item); - } -} - -void QuickSettingContainer::initUi() -{ - m_mainlayout->setSpacing(ITEMSPACE); - m_mainlayout->setContentsMargins(ITEMSPACE, ITEMSPACE, ITEMSPACE, ITEMSPACE); - - m_pluginLayout->setContentsMargins(0, 0, 0, 0); - m_pluginLayout->setSpacing(ITEMSPACE); - m_pluginLayout->setAlignment(Qt::AlignLeft); - for (int i = 0; i < COLUMNCOUNT; i++) - m_pluginLayout->setColumnMinimumWidth(i, ITEMWIDTH); - - m_pluginWidget->setLayout(m_pluginLayout); - m_mainlayout->addWidget(m_pluginWidget); - - QVBoxLayout *ctrlLayout = new QVBoxLayout(m_componentWidget); - ctrlLayout->setContentsMargins(0, 0, 0, 0); - ctrlLayout->setSpacing(ITEMSPACE); - ctrlLayout->setDirection(QBoxLayout::BottomToTop); - - m_mainlayout->addWidget(m_componentWidget); - // 加载所有的插件 - QList plugins = m_pluginLoader->pluginItems(QuickSettingController::PluginAttribute::Quick); - for (PluginsItemInterface *plugin : plugins) - appendPlugin(plugin, false); - - m_switchLayout->addWidget(m_mainWidget); - m_switchLayout->addWidget(m_childPage); - - setMouseTracking(true); - setAcceptDrops(true); - - QMetaObject::invokeMethod(this, [ = ] { - if (plugins.size() > 0) { - updateItemLayout(); - updateFullItemLayout(); - } - // 设置当前窗口的大小 - onResizeView(); - setFixedWidth(ITEMWIDTH * 4 + (ITEMSPACE * 5)); - }, Qt::QueuedConnection); -} - -void QuickSettingContainer::initConnection() -{ - connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) { - if (pluginAttr != QuickSettingController::PluginAttribute::Quick) - return; - - appendPlugin(itemInter); - }); - connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); - connect(m_pluginLoader, &QuickSettingController::pluginUpdated, this, &QuickSettingContainer::onPluginUpdated); - - connect(m_childPage, &PluginChildPage::back, this, [ this ] { - showPage(m_mainWidget); - }); - connect(m_childPage, &PluginChildPage::closeSelf, this, [ this ] { - if (!m_childPage->isBack()) - topLevelWidget()->hide(); - }); -} - -// 调整尺寸 -void QuickSettingContainer::onResizeView() -{ - if (m_switchLayout->currentWidget() == m_mainWidget) { - int selfPluginCount = 0; - int fullItemHeight = 0; - int widgetCount = 0; - for (QuickSettingItem *item : m_quickSettings) { - if (item->type() == QuickSettingItem::QuickSettingType::Full) { - fullItemHeight += item->height(); - widgetCount++; - continue; - } - // 如果是置顶的插件,则认为它占用两个普通插件的位置 - int increCount = (item->type() == QuickSettingItem::QuickSettingType::Multi ? 2 : 1); - selfPluginCount += increCount; - } - - int rowCount = selfPluginCount / COLUMNCOUNT; - if (selfPluginCount % COLUMNCOUNT > 0) - rowCount++; - - m_pluginWidget->setFixedHeight(ITEMHEIGHT * rowCount + ITEMSPACE * (rowCount - 1)); - m_componentWidget->setFixedHeight(fullItemHeight + (widgetCount - 1) * ITEMSPACE); - - setFixedHeight(ITEMSPACE * 3 + m_pluginWidget->height() + m_componentWidget->height()); - } else if (m_switchLayout->currentWidget() == m_childPage) { - setFixedHeight(m_childPage->height()); - } -} - -void QuickSettingContainer::onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart) -{ - if (dockPart != DockPart::QuickPanel) - return; - - for (QuickSettingItem *settingItem : m_quickSettings) { - if (settingItem->pluginItem() != itemInter) - continue; - - settingItem->updateShow(); - break; - } -} diff --git a/frame/window/quicksettingcontainer.h b/frame/window/quicksettingcontainer.h deleted file mode 100644 index c04941412..000000000 --- a/frame/window/quicksettingcontainer.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef QUICKSETTINGCONTAINER_H -#define QUICKSETTINGCONTAINER_H - -#include "pluginproxyinterface.h" - -#include "dtkwidget_global.h" - -#include - -#include - -class DockItem; -class QVBoxLayout; -class QuickSettingController; -class BrightnessModel; -class BrightnessWidget; -class QuickSettingItem; -class DockPopupWindow; -class QStackedLayout; -class VolumeDevicesWidget; -class QLabel; -class PluginChildPage; -class QGridLayout; -class DisplaySettingWidget; -struct QuickDragInfo; - -DWIDGET_USE_NAMESPACE - -class QuickSettingContainer : public QWidget -{ - Q_OBJECT - -public: - static DockPopupWindow *popWindow(); - static void setPosition(Dock::Position position); - void showPage(QWidget *widget, PluginsItemInterface *pluginInter = nullptr, bool canBack = false); - -protected: - void mouseMoveEvent(QMouseEvent *event) override; - bool eventFilter(QObject *watched, QEvent *event) override; - - explicit QuickSettingContainer(QWidget *parent = nullptr); - ~QuickSettingContainer() override; - -private Q_SLOTS: - void onPluginRemove(PluginsItemInterface *itemInter); - void onShowChildWidget(QWidget *childWidget); - void onResizeView(); - void onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart); - -private: - // 加载UI - void initUi(); - // 初始化槽函数 - void initConnection(); - // 调整控件位置 - void updateItemLayout(); - // 调整全列插件的位置 - void updateFullItemLayout(); - // 插入插件 - void appendPlugin(PluginsItemInterface *itemInter, bool needLayout = true); - -private: - static DockPopupWindow *m_popWindow; - static Dock::Position m_position; - QStackedLayout *m_switchLayout; - QWidget *m_mainWidget; - QWidget *m_pluginWidget; - QGridLayout *m_pluginLayout; - QWidget *m_componentWidget; - QVBoxLayout *m_mainlayout; - QuickSettingController *m_pluginLoader; - PluginChildPage *m_childPage; - QuickDragInfo *m_dragInfo; - QList m_quickSettings; - PluginsItemInterface *m_childShowPlugin; -}; - -#endif // PLUGINCONTAINER_H diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index e51345368..0828f759f 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -24,7 +24,6 @@ #include "tray_delegate.h" #include "tray_model.h" #include "constants.h" -#include "quicksettingcontainer.h" #include "systempluginwindow.h" #include "datetimedisplayer.h" #include "expandiconwidget.h" @@ -486,7 +485,7 @@ void TrayManagerWindow::dropEvent(QDropEvent *e) if (!e || !e->mimeData() || e->source() == this) return; - if (qobject_cast(e->source())) { + if (m_quickIconWidget->isQuickWindow(e->source())) { const QuickPluginMimeData *mimeData = qobject_cast(e->mimeData()); if (!mimeData) return; From 0c414397e13425abdb907f54cc7d2f2142636377 Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 10 Jan 2023 21:42:10 +0800 Subject: [PATCH 229/257] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除已经移到插件中的文件 Log: Influence: 无 Task: https://pms.uniontech.com/task-view-222353.html Change-Id: Ie4373902170defacebb9f6652b1b21121980ad18 --- frame/controller/quicksettingcontroller.cpp | 1 - frame/item/components/fullquickitem.cpp | 97 ------ frame/item/components/fullquickitem.h | 51 ---- frame/item/components/multiquickitem.cpp | 278 ------------------ frame/item/components/multiquickitem.h | 78 ----- frame/item/components/singlequickitem.cpp | 194 ------------ frame/item/components/singlequickitem.h | 53 ---- frame/item/quicksettingitem.cpp | 107 ------- frame/item/quicksettingitem.h | 64 ---- frame/pluginadapter/pluginadapter.cpp | 213 -------------- frame/pluginadapter/pluginadapter.h | 81 ----- .../pluginadapter/pluginsiteminterface_v20.h | 261 ---------------- frame/window/pluginchildpage.cpp | 121 -------- frame/window/pluginchildpage.h | 62 ---- frame/window/quickpluginwindow.cpp | 1 - 15 files changed, 1662 deletions(-) delete mode 100644 frame/item/components/fullquickitem.cpp delete mode 100644 frame/item/components/fullquickitem.h delete mode 100644 frame/item/components/multiquickitem.cpp delete mode 100644 frame/item/components/multiquickitem.h delete mode 100644 frame/item/components/singlequickitem.cpp delete mode 100644 frame/item/components/singlequickitem.h delete mode 100644 frame/item/quicksettingitem.cpp delete mode 100644 frame/item/quicksettingitem.h delete mode 100644 frame/pluginadapter/pluginadapter.cpp delete mode 100644 frame/pluginadapter/pluginadapter.h delete mode 100644 frame/pluginadapter/pluginsiteminterface_v20.h delete mode 100644 frame/window/pluginchildpage.cpp delete mode 100644 frame/window/pluginchildpage.h diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index d34e0ddf7..a76b214da 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -19,7 +19,6 @@ * along with this program. If not, see . */ #include "quicksettingcontroller.h" -#include "quicksettingitem.h" #include "pluginsitem.h" #include "pluginmanagerinterface.h" diff --git a/frame/item/components/fullquickitem.cpp b/frame/item/components/fullquickitem.cpp deleted file mode 100644 index 0fdfafac9..000000000 --- a/frame/item/components/fullquickitem.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "fullquickitem.h" -#include "pluginsiteminterface.h" - -FullQuickItem::FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) - : QuickSettingItem(pluginInter, parent) - , m_centerWidget(pluginInter->itemWidget(QUICK_ITEM_KEY)) - , m_centerParentWidget(nullptr) - , m_effectWidget(new DBlurEffectWidget(this)) -{ - initUi(); - QMetaObject::invokeMethod(this, &FullQuickItem::resizeSelf, Qt::QueuedConnection); -} - -FullQuickItem::~FullQuickItem() -{ - if (m_centerWidget) - m_centerWidget->setParent(nullptr); -} - -void FullQuickItem::updateShow() -{ - if (m_centerWidget) - m_centerWidget->update(); -} - -void FullQuickItem::detachPlugin() -{ - if (m_centerWidget) - m_centerWidget->setParent(m_centerParentWidget); -} - -QuickSettingItem::QuickSettingType FullQuickItem::type() const -{ - return QuickSettingItem::QuickSettingType::Full; -} - -bool FullQuickItem::eventFilter(QObject *obj, QEvent *event) -{ - if (obj == m_centerWidget && event->type() == QEvent::Resize) - resizeSelf(); - - return QuickSettingItem::eventFilter(obj, event); -} - -void FullQuickItem::initUi() -{ - m_effectWidget->setMaskColor(QColor(239, 240, 245)); - m_effectWidget->setBlurRectXRadius(8); - m_effectWidget->setBlurRectYRadius(8); - - // 如果图标不为空 - if (!m_centerWidget) - return; - - m_centerWidget->setVisible(true); - m_centerParentWidget = m_centerWidget->parentWidget(); - - QHBoxLayout *layout = new QHBoxLayout(m_effectWidget); - layout->setContentsMargins(0, 0, 0, 0); - layout->setAlignment(Qt::AlignHCenter); - layout->addWidget(m_centerWidget); - - QHBoxLayout *mainLayout = new QHBoxLayout(this); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->addWidget(m_effectWidget); - - m_centerWidget->installEventFilter(this); -} - -void FullQuickItem::resizeSelf() -{ - if (!m_centerWidget) - return; - - m_effectWidget->setFixedHeight(m_centerWidget->height()); - setFixedHeight(m_centerWidget->height()); -} diff --git a/frame/item/components/fullquickitem.h b/frame/item/components/fullquickitem.h deleted file mode 100644 index 16082a09e..000000000 --- a/frame/item/components/fullquickitem.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef FULLQUICKITEM_H -#define FULLQUICKITEM_H - -#include "quicksettingitem.h" - -class FullQuickItem : public QuickSettingItem -{ - Q_OBJECT - -public: - FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); - ~FullQuickItem() override; - void updateShow() override; - void detachPlugin() override; - - QuickSettingType type() const override; - -protected: - bool eventFilter(QObject *obj, QEvent *event) override; - -private: - void initUi(); - void resizeSelf(); - -private: - QWidget *m_centerWidget; - QWidget *m_centerParentWidget; - DBlurEffectWidget *m_effectWidget; -}; - -#endif // FULLQUICKITEM_H diff --git a/frame/item/components/multiquickitem.cpp b/frame/item/components/multiquickitem.cpp deleted file mode 100644 index 38fdf1fb4..000000000 --- a/frame/item/components/multiquickitem.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "multiquickitem.h" -#include "pluginsiteminterface.h" - -#include -#include -#include - -#define BGSIZE 36 -#define ICONWIDTH 24 -#define ICONHEIGHT 24 - -static QSize expandSize = QSize(20, 20); - -MultiQuickItem::MultiQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) - : QuickSettingItem(pluginInter, parent) - , m_iconWidget(nullptr) - , m_nameLabel(nullptr) - , m_stateLabel(nullptr) - , m_itemWidgetParent(nullptr) -{ - initUi(); -} - -MultiQuickItem::~MultiQuickItem() -{ - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (itemWidget) - itemWidget->setParent(nullptr); -} - -void MultiQuickItem::updateShow() -{ - if (m_iconWidget && m_nameLabel && m_stateLabel) { - m_iconWidget->update(); - m_nameLabel->setText(QFontMetrics(m_nameLabel->font()).elidedText(pluginItem()->pluginDisplayName(), Qt::TextElideMode::ElideRight, m_nameLabel->width())); - m_stateLabel->setText(QFontMetrics(m_stateLabel->font()).elidedText(pluginItem()->description(), Qt::TextElideMode::ElideRight, m_stateLabel->width())); - } else { - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (itemWidget) { - // 如果插件没有返回图标的显示,则获取插件的itemWidget - itemWidget->update(); - } - } -} - -void MultiQuickItem::detachPlugin() -{ - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (itemWidget && itemWidget->parentWidget() == this) - itemWidget->setParent(m_itemWidgetParent); -} - -QuickSettingItem::QuickSettingType MultiQuickItem::type() const -{ - return QuickSettingItem::QuickSettingType::Multi; -} - -bool MultiQuickItem::eventFilter(QObject *obj, QEvent *event) -{ - if (m_iconWidget) { - if (event->type() == QEvent::MouseButtonRelease) { - if (obj->objectName() == "expandLabel") { - // 如果是鼠标的按下事件 - QWidget *widget = pluginItem()->itemPopupApplet(QUICK_ITEM_KEY); - if (!widget) - return QuickSettingItem::eventFilter(obj, event); - - Q_EMIT requestShowChildWidget(widget); - - } else if (obj == this) { - QStringList commandArgumend = pluginItem()->itemCommand(itemKey()).split(" "); - if (commandArgumend.size() > 0) { - QString command = commandArgumend.first(); - commandArgumend.removeFirst(); - QProcess::startDetached(command, commandArgumend); - } - } - } else if (event->type() == QEvent::Resize) { - QLabel *labelWidget = qobject_cast(obj); - if (!labelWidget) - return QuickSettingItem::eventFilter(obj, event); - - if (labelWidget == m_nameLabel) { - labelWidget->setText(QFontMetrics(labelWidget->font()).elidedText(pluginItem()->pluginDisplayName(), Qt::TextElideMode::ElideRight, labelWidget->width())); - } else if (labelWidget == m_stateLabel) { - labelWidget->setText(QFontMetrics(labelWidget->font()).elidedText(pluginItem()->description(), Qt::TextElideMode::ElideRight, labelWidget->width())); - } - } - } - - return QuickSettingItem::eventFilter(obj, event); -} - -void MultiQuickItem::initUi() -{ - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (pluginItem()->icon(DockPart::QuickPanel).isNull() && itemWidget) { - m_itemWidgetParent = itemWidget->parentWidget(); - // 如果插件没有返回图标的显示,则获取插件的itemWidget - QHBoxLayout *mainLayout = new QHBoxLayout(this); - itemWidget->setVisible(true); - itemWidget->setParent(this); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->addWidget(itemWidget); - } else { - // 如果插件获取到插件区域的图标,则让其按照图标来组合显示 - // 如果是占用两排的插件,则用横向Layout - QHBoxLayout *mainLayout = new QHBoxLayout(this); - mainLayout->setContentsMargins(10, 0, 10, 0); - mainLayout->setSpacing(0); - mainLayout->addStretch(10); - mainLayout->setAlignment(Qt::AlignCenter); - - // 添加图标 - QWidget *iconWidgetParent = new QWidget(this); - QVBoxLayout *iconLayout = new QVBoxLayout(iconWidgetParent); - iconLayout->setContentsMargins(0, 0, 0, 0); - iconLayout->setSpacing(0); - iconLayout->setAlignment(Qt::AlignCenter); - - m_iconWidget = new QuickIconWidget(pluginItem(), itemKey(), iconWidgetParent); - m_iconWidget->setFixedSize(BGSIZE, BGSIZE); - iconLayout->addWidget(m_iconWidget); - mainLayout->addWidget(iconWidgetParent); - mainLayout->addSpacing(10); - - // 添加中间的名称部分 - QWidget *textWidget = new QWidget(this); - m_nameLabel = new QLabel(textWidget); - m_stateLabel = new QLabel(textWidget); - m_nameLabel->setObjectName("nameLabel"); - m_stateLabel->setObjectName("stateLabel"); - - // 设置图标和文字的属性 - QFont nameFont = DFontSizeManager::instance()->t6(); - nameFont.setBold(true); - QPalette pe; - pe.setColor(QPalette::WindowText, Qt::black); - m_nameLabel->setPalette(pe); - m_stateLabel->setPalette(pe); - m_nameLabel->setFont(nameFont); - m_stateLabel->setFont(DFontSizeManager::instance()->t10()); - m_nameLabel->setText(pluginItem()->pluginDisplayName()); - m_stateLabel->setText(pluginItem()->description()); - m_nameLabel->installEventFilter(this); - m_stateLabel->installEventFilter(this); - - QVBoxLayout *textLayout = new QVBoxLayout(textWidget); - textLayout->setContentsMargins(0, 0, 0, 0); - textLayout->setSpacing(0); - textLayout->addWidget(m_nameLabel); - textLayout->addWidget(m_stateLabel); - textLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); - mainLayout->addWidget(textWidget); - - // 添加右侧的展开按钮 - QWidget *expandWidgetParent = new QWidget(this); - QVBoxLayout *expandLayout = new QVBoxLayout(expandWidgetParent); - expandLayout->setSpacing(0); - QLabel *expandLabel = new QLabel(expandWidgetParent); - expandLabel->setObjectName("expandLabel"); - expandLabel->setPixmap(QPixmap(expandFileName())); - expandLabel->setFixedSize(expandSize); - expandLabel->setAutoFillBackground(true); - expandLabel->installEventFilter(this); - expandLayout->addWidget(expandLabel); - pe.setBrush(QPalette::Window, Qt::transparent); - expandLabel->setPalette(pe); - mainLayout->addWidget(expandWidgetParent); - } -} - -QString MultiQuickItem::expandFileName() const -{ - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) - return QString(":/icons/resources/arrow-right-dark.svg"); - - return QString(":/icons/resources/arrow-right.svg"); -} - -/** - * @brief QuickIconWidget::QuickIconWidget - * @param pluginInter - * @param parent - * 图标的widget - */ -QuickIconWidget::QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, QWidget *parent) - : QWidget(parent) - , m_pluginInter(pluginInter) - , m_itemKey(itemKey) -{ -} - -void QuickIconWidget::paintEvent(QPaintEvent *event) -{ - QPixmap pixmapIcon = pluginIcon(); - if (pixmapIcon.isNull()) - return QWidget::paintEvent(event); - - pixmapIcon = pluginIcon(true); - QPainter painter(this); - painter.setRenderHint(QPainter::RenderHint::Antialiasing); - painter.setPen(foregroundColor()); - - DPalette dpa = DPaletteHelper::instance()->palette(this); - QPainter pa(&pixmapIcon); - pa.setCompositionMode(QPainter::CompositionMode_SourceIn); - pa.fillRect(pixmapIcon.rect(), painter.pen().brush()); - // 如果是主图标,则显示阴影背景 - painter.save(); - painter.setPen(Qt::NoPen); - painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight)); - painter.drawEllipse(rect()); - painter.restore(); - QRect rctIcon((rect().width() - pixmapIcon.width()) / 2, (rect().height() - pixmapIcon.height()) / 2, pixmapIcon.width(), pixmapIcon.height()); - painter.drawPixmap(rctIcon, pixmapIcon); -} - -QColor QuickIconWidget::foregroundColor() const -{ - DPalette dpa = DPaletteHelper::instance()->palette(this); - // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 - if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Active) - return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); - - if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Deactive) - return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); - - return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); -} - -QPixmap QuickIconWidget::pluginIcon(bool contailGrab) const -{ - QIcon icon = m_pluginInter->icon(DockPart::QuickPanel); - if (icon.isNull() && contailGrab) { - // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 - QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); - if (itemWidget) { - itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); - return itemWidget->grab(); - } - return QPixmap(); - } - - // 获取icon接口返回的图标 - int pixmapWidth = width(); - int pixmapHeight = height(); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) { - QSize size = iconSizes[0]; - if (size.isValid() && !size.isEmpty() && !size.isNull()) { - pixmapWidth = size.width(); - pixmapHeight = size.height(); - } - } - - return icon.pixmap(pixmapWidth, pixmapHeight); -} diff --git a/frame/item/components/multiquickitem.h b/frame/item/components/multiquickitem.h deleted file mode 100644 index cd20f3125..000000000 --- a/frame/item/components/multiquickitem.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef MULTIQUICKITEM_H -#define MULTIQUICKITEM_H - -#include - -class QuickIconWidget; -class QWidget; - -class MultiQuickItem : public QuickSettingItem -{ - Q_OBJECT - -public: - MultiQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); - ~MultiQuickItem() override; - void updateShow() override; - void detachPlugin() override; - - QuickSettingType type() const override; - -protected: - bool eventFilter(QObject *obj, QEvent *event) override; - -private: - void initUi(); - QString expandFileName() const; - -private: - QuickIconWidget *m_iconWidget; - QLabel *m_nameLabel; - QLabel *m_stateLabel; - QWidget *m_itemWidgetParent; -}; - -/** - * @brief The QuickIconWidget class - * 图标的Widget - */ -class QuickIconWidget : public QWidget -{ - Q_OBJECT - -public: - explicit QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, QWidget *parent = Q_NULLPTR); - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - QColor foregroundColor() const; - QPixmap pluginIcon(bool contailGrab = false) const; - -private: - PluginsItemInterface *m_pluginInter; - QString m_itemKey; -}; - -#endif // MULTIQUICKITEM_H diff --git a/frame/item/components/singlequickitem.cpp b/frame/item/components/singlequickitem.cpp deleted file mode 100644 index b75d66525..000000000 --- a/frame/item/components/singlequickitem.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "singlequickitem.h" -#include "pluginsiteminterface.h" - -#include -#include - -#define ICONHEIGHT 24 -#define ICONWIDTH 24 -#define TEXTHEIGHT 11 - -SingleQuickItem::SingleQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent) - : QuickSettingItem(pluginInter, parent) - , m_itemParentWidget(nullptr) -{ - initUi(); -} - -SingleQuickItem::~SingleQuickItem() -{ -} - -QuickSettingItem::QuickSettingType SingleQuickItem::type() const -{ - return QuickSettingItem::QuickSettingType::Single; -} - -void SingleQuickItem::mouseReleaseEvent(QMouseEvent *event) -{ - Q_UNUSED(event); - QStringList commandArgument = pluginItem()->itemCommand(itemKey()).split(" "); - if (commandArgument.size() > 0) { - QString command = commandArgument.first(); - commandArgument.removeFirst(); - QProcess::startDetached(command, commandArgument); - } -} - -void SingleQuickItem::resizeEvent(QResizeEvent *event) -{ - updateShow(); - QuickSettingItem::resizeEvent(event); -} - -void SingleQuickItem::initUi() -{ - QWidget *topWidget = iconWidget(this); - QVBoxLayout *layout = new QVBoxLayout(this); - layout->addWidget(topWidget); - installEventFilter(this); -} - -QWidget *SingleQuickItem::iconWidget(QWidget *parent) -{ - // 显示图标的窗体 - QWidget *widget = new QWidget(parent); - bool childIsEmpty = true; - QIcon icon = pluginItem()->icon(DockPart::QuickPanel); - if (icon.isNull()) { - // 如果图标为空,则将获取itemWidget作为它的显示 - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (itemWidget) { - m_itemParentWidget = itemWidget->parentWidget(); - QHBoxLayout *layout = new QHBoxLayout(widget); - layout->setContentsMargins(0, 0, 0 ,0); - itemWidget->setParent(widget); - layout->addWidget(itemWidget); - itemWidget->setVisible(true); - childIsEmpty = false; - } - } - - if (childIsEmpty) { - // 如果没有子窗体,则需要添加下方的文字 - QVBoxLayout *layout = new QVBoxLayout(widget); - layout->setAlignment(Qt::AlignVCenter); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(0); - QLabel *imageLabel = new QLabel(widget); - imageLabel->setObjectName("imageLabel"); - imageLabel->setFixedHeight(ICONHEIGHT); - imageLabel->setAlignment(Qt::AlignCenter); - - QLabel *labelText = new QLabel(widget); - labelText->setObjectName("textLabel"); - labelText->setFixedHeight(TEXTHEIGHT); - updatePluginName(labelText); - labelText->setAlignment(Qt::AlignCenter); - labelText->setFont(DFontSizeManager::instance()->t10()); - layout->addWidget(imageLabel); - layout->addSpacing(7); - layout->addWidget(labelText); - } - - setProperty("paint", childIsEmpty); - - return widget; -} - -QPixmap SingleQuickItem::pixmap() const -{ - // 如果快捷面板区域的图标为空,那么就获取itemWidget的截图 - QIcon icon = pluginItem()->icon(DockPart::QuickPanel); - if (icon.isNull()) - return QPixmap(); - - int pixmapWidth = width(); - int pixmapHeight = height(); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) { - QSize size = iconSizes[0]; - if (size.isValid() && !size.isEmpty() && !size.isNull()) { - pixmapWidth = size.width(); - pixmapHeight = size.height(); - } - } - - return icon.pixmap(pixmapWidth / qApp->devicePixelRatio(), pixmapHeight / qApp->devicePixelRatio()); -} - -QLabel *SingleQuickItem::findChildLabel(QWidget *parent, const QString &childObjectName) const -{ - QList childrends = parent->children(); - for (QObject *child : childrends) { - QWidget *widget = qobject_cast(child); - if (!widget) - continue; - - QLabel *label = qobject_cast(child); - if (label && widget->objectName() == childObjectName) - return label; - - label = findChildLabel(widget, childObjectName); - if (label) - return label; - } - - return nullptr; -} - -void SingleQuickItem::updatePluginName(QLabel *textLabel) -{ - if (!textLabel) - return; - - QString text = pluginItem()->description(); - if (text.isEmpty()) - text = pluginItem()->pluginDisplayName(); - QFontMetrics ftm(textLabel->font()); - text = ftm.elidedText(text, Qt::TextElideMode::ElideRight, textLabel->width()); - textLabel->setText(text); -} - -void SingleQuickItem::updateShow() -{ - if (property("paint").toBool()) { - QLabel *imageLabel = findChildLabel(this, "imageLabel"); - if (imageLabel) { - // 更新图像 - imageLabel->setPixmap(pixmap()); - } - updatePluginName(findChildLabel(this, "textLabel")); - } else { - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (itemWidget) - itemWidget->update(); - } -} - -void SingleQuickItem::detachPlugin() -{ - QWidget *itemWidget = pluginItem()->itemWidget(QUICK_ITEM_KEY); - if (itemWidget && !property("paint").toBool()) - itemWidget->setParent(m_itemParentWidget); -} diff --git a/frame/item/components/singlequickitem.h b/frame/item/components/singlequickitem.h deleted file mode 100644 index dd0a6f657..000000000 --- a/frame/item/components/singlequickitem.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef SINGLEQUICKITEM_H -#define SINGLEQUICKITEM_H - -#include - -class SingleQuickItem : public QuickSettingItem -{ - Q_OBJECT - -public: - SingleQuickItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); - ~SingleQuickItem() override; - - QuickSettingType type() const override; - void updateShow() override; - void detachPlugin() override; - -protected: - void mouseReleaseEvent(QMouseEvent *event) override; - void resizeEvent(QResizeEvent *event) override; - -private: - void initUi(); - QWidget *iconWidget(QWidget *parent); - QPixmap pixmap() const; - QLabel *findChildLabel(QWidget *parent, const QString &childObjectName) const; - void updatePluginName(QLabel *textLabel); - -private: - QWidget *m_itemParentWidget; -}; - -#endif // SINGLEQUICKITEM_H diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp deleted file mode 100644 index f3c126088..000000000 --- a/frame/item/quicksettingitem.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "quicksettingitem.h" -#include "pluginsiteminterface.h" -#include "imageutil.h" -#include "quicksettingcontroller.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#define ICONWIDTH 24 -#define ICONHEIGHT 24 -#define ICONSPACE 10 -#define RADIUS 8 -#define FONTSIZE 10 - -#define BGWIDTH 128 -#define BGSIZE 36 -#define MARGINLEFTSPACE 10 -#define OPENICONSIZE 12 -#define MARGINRIGHTSPACE 9 - -QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, QWidget *parent) - : DockItem(parent) - , m_pluginInter(pluginInter) - , m_itemKey(QuickSettingController::instance()->itemKey(pluginInter)) -{ - setAcceptDrops(true); - this->installEventFilter(this); -} - -QuickSettingItem::~QuickSettingItem() -{ -} - -PluginsItemInterface *QuickSettingItem::pluginItem() const -{ - return m_pluginInter; -} - -DockItem::ItemType QuickSettingItem::itemType() const -{ - return DockItem::QuickSettingPlugin; -} - -const QPixmap QuickSettingItem::dragPixmap() -{ - return grab(); -} - -const QString QuickSettingItem::itemKey() const -{ - return m_itemKey; -} - -void QuickSettingItem::paintEvent(QPaintEvent *e) -{ - QWidget::paintEvent(e); - QPainter painter(this); - painter.setRenderHint(QPainter::RenderHint::Antialiasing); - painter.setPen(foregroundColor()); - QPainterPath path; - path.addRoundedRect(rect(), RADIUS, RADIUS); - painter.setClipPath(path); - // 绘制背景色 - DPalette dpa = DPaletteHelper::instance()->palette(this); - painter.fillRect(rect(), Qt::white); -} - -QColor QuickSettingItem::foregroundColor() const -{ - DPalette dpa = DPaletteHelper::instance()->palette(this); - // 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色 - if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Active) - return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text); - - if (m_pluginInter->status() == PluginsItemInterface::PluginMode::Deactive) - return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text); - - return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text); -} diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h deleted file mode 100644 index a0af17691..000000000 --- a/frame/item/quicksettingitem.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef QUICKSETTINGITEM_H -#define QUICKSETTINGITEM_H - -#include "dockitem.h" - -class PluginsItemInterface; -class QuickIconWidget; - -class QuickSettingItem : public DockItem -{ - Q_OBJECT - -public: - enum class QuickSettingType { - Single = 1, // 插件的UI显示单列 - Multi = 2, // 插件的UI显示双列,例如网络和蓝牙等 - Full = 4 // 插件的UI整行显示,例如声音,亮度、音乐播放等 - }; - -public: - QuickSettingItem(PluginsItemInterface *const pluginInter, QWidget *parent = nullptr); - ~QuickSettingItem() override; - PluginsItemInterface *pluginItem() const; - ItemType itemType() const override; - virtual const QPixmap dragPixmap(); - virtual void updateShow() {} - virtual void detachPlugin() {} - const QString itemKey() const; - - virtual QuickSettingType type() const = 0; - -Q_SIGNALS: - void requestShowChildWidget(QWidget *); - -protected: - void paintEvent(QPaintEvent *e) override; - QColor foregroundColor() const; - -private: - PluginsItemInterface *m_pluginInter; - QString m_itemKey; -}; - -#endif // QUICKSETTINGITEM_H diff --git a/frame/pluginadapter/pluginadapter.cpp b/frame/pluginadapter/pluginadapter.cpp deleted file mode 100644 index 76c683215..000000000 --- a/frame/pluginadapter/pluginadapter.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "pluginadapter.h" - -#include - -#define ICONWIDTH 24 -#define ICONHEIGHT 24 - -PluginAdapter::PluginAdapter(PluginsItemInterface_V20 *pluginInter, QPluginLoader *pluginLoader) - : m_pluginInter(pluginInter) - , m_pluginLoader(pluginLoader) -{ -} - -PluginAdapter::~PluginAdapter() -{ - delete m_pluginInter; -} - -const QString PluginAdapter::pluginName() const -{ - return m_pluginInter->pluginName(); -} - -const QString PluginAdapter::pluginDisplayName() const -{ - return m_pluginInter->pluginDisplayName(); -} - -void PluginAdapter::init(PluginProxyInterface *proxyInter) -{ - m_pluginInter->init(proxyInter); -} - -QWidget *PluginAdapter::itemWidget(const QString &itemKey) -{ - return m_pluginInter->itemWidget(itemKey); -} - -QWidget *PluginAdapter::itemTipsWidget(const QString &itemKey) -{ - return m_pluginInter->itemTipsWidget(itemKey); -} - -QWidget *PluginAdapter::itemPopupApplet(const QString &itemKey) -{ - return m_pluginInter->itemPopupApplet(itemKey); -} - -const QString PluginAdapter::itemCommand(const QString &itemKey) -{ - return m_pluginInter->itemCommand(itemKey); -} - -const QString PluginAdapter::itemContextMenu(const QString &itemKey) -{ - return m_pluginInter->itemContextMenu(itemKey); -} - -void PluginAdapter::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) -{ - m_pluginInter->invokedMenuItem(itemKey, menuId, checked); -} - -int PluginAdapter::itemSortKey(const QString &itemKey) -{ - return m_pluginInter->itemSortKey(itemKey); -} - -void PluginAdapter::setSortKey(const QString &itemKey, const int order) -{ - m_pluginInter->setSortKey(itemKey, order); -} - -bool PluginAdapter::itemAllowContainer(const QString &itemKey) -{ - return m_pluginInter->itemAllowContainer(itemKey); -} - -bool PluginAdapter::itemIsInContainer(const QString &itemKey) -{ - return m_pluginInter->itemIsInContainer(itemKey); -} - -void PluginAdapter::setItemIsInContainer(const QString &itemKey, const bool container) -{ - m_pluginInter->setItemIsInContainer(itemKey, container); -} - -bool PluginAdapter::pluginIsAllowDisable() -{ - return m_pluginInter->pluginIsAllowDisable(); -} - -bool PluginAdapter::pluginIsDisable() -{ - return m_pluginInter->pluginIsDisable(); -} - -void PluginAdapter::pluginStateSwitched() -{ - m_pluginInter->pluginStateSwitched(); -} - -void PluginAdapter::displayModeChanged(const Dock::DisplayMode displayMode) -{ - m_pluginInter->displayModeChanged(displayMode); -} - -void PluginAdapter::positionChanged(const Dock::Position position) -{ - m_pluginInter->positionChanged(position); -} - -void PluginAdapter::refreshIcon(const QString &itemKey) -{ - m_pluginInter->refreshIcon(itemKey); -} - -void PluginAdapter::pluginSettingsChanged() -{ - m_pluginInter->pluginSettingsChanged(); -} - -PluginsItemInterface::PluginType PluginAdapter::type() -{ - switch (m_pluginInter->type()) { - case PluginsItemInterface_V20::PluginType::Fixed: - return PluginsItemInterface::PluginType::Fixed; - case PluginsItemInterface_V20::PluginType::Normal: - return PluginsItemInterface::PluginType::Normal; - } - return PluginsItemInterface::PluginType::Normal; -} - -PluginsItemInterface::PluginSizePolicy PluginAdapter::pluginSizePolicy() const -{ - switch (m_pluginInter->pluginSizePolicy()) { - case PluginsItemInterface_V20::PluginSizePolicy::Custom: - return PluginsItemInterface::PluginSizePolicy::Custom; - case PluginsItemInterface_V20::PluginSizePolicy::System: - return PluginsItemInterface::PluginSizePolicy::System; - } - return PluginsItemInterface::PluginSizePolicy::Custom; -} - -QIcon PluginAdapter::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) -{ - QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey); - if (!itemWidget) - return QIcon(); - - switch (dockPart) { - case DockPart::QuickPanel: - case DockPart::SystemPanel: { - // 如果是托盘插件,则让他返回空图标,直接将QWidget展示 - if (m_pluginLoader->fileName().contains(TRAY_PATH)) - return QIcon(); - - // 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件 - QSize oldSize = itemWidget->size(); - itemWidget->setFixedSize(ICONWIDTH / qApp->devicePixelRatio(), ICONHEIGHT / qApp->devicePixelRatio()); - QPixmap pixmap = itemWidget->grab(); - itemWidget->setFixedSize(oldSize); - return pixmap; - } - default: break; - } - - return QIcon(); -} - -PluginsItemInterface::PluginMode PluginAdapter::status() const -{ - return PluginMode::Active; -} - -QString PluginAdapter::description() const -{ - return m_pluginInter->pluginDisplayName(); -} - -PluginFlags PluginAdapter::flags() const -{ - if (m_pluginLoader->fileName().contains(TRAY_PATH)) - return PluginFlag::Type_Tray | PluginFlag::Attribute_CanDrag | PluginFlag::Attribute_CanInsert; - - return PluginsItemInterface::flags(); -} - -void PluginAdapter::setItemKey(const QString &itemKey) -{ - m_itemKey = itemKey; -} diff --git a/frame/pluginadapter/pluginadapter.h b/frame/pluginadapter/pluginadapter.h deleted file mode 100644 index 04dbb3c28..000000000 --- a/frame/pluginadapter/pluginadapter.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef PLUGINADAPTER_H -#define PLUGINADAPTER_H - -#include "pluginsiteminterface.h" -#include "pluginsiteminterface_v20.h" - -#include - -/** 适配器,当加载到v20插件的时候,通过该接口来转成v23接口的插件 - * @brief The PluginAdapter class - */ - -class PluginAdapter : public QObject, public PluginsItemInterface -{ - Q_OBJECT - Q_INTERFACES(PluginsItemInterface) - -public: - PluginAdapter(PluginsItemInterface_V20 *pluginInter, QPluginLoader *pluginLoader); - ~PluginAdapter(); - - const QString pluginName() const override; - const QString pluginDisplayName() const override; - void init(PluginProxyInterface *proxyInter) override; - QWidget *itemWidget(const QString &itemKey) override; - - QWidget *itemTipsWidget(const QString &itemKey) override; - QWidget *itemPopupApplet(const QString &itemKey) override; - const QString itemCommand(const QString &itemKey) override; - const QString itemContextMenu(const QString &itemKey) override; - void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; - int itemSortKey(const QString &itemKey) override; - void setSortKey(const QString &itemKey, const int order) override; - bool itemAllowContainer(const QString &itemKey) override; - bool itemIsInContainer(const QString &itemKey) override; - void setItemIsInContainer(const QString &itemKey, const bool container) override; - - bool pluginIsAllowDisable() override; - bool pluginIsDisable() override; - void pluginStateSwitched() override; - void displayModeChanged(const Dock::DisplayMode displayMode) override; - void positionChanged(const Dock::Position position) override; - void refreshIcon(const QString &itemKey) override; - void pluginSettingsChanged() override; - PluginType type() override; - PluginSizePolicy pluginSizePolicy() const override; - - QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; - PluginMode status() const override; - QString description() const override; - PluginFlags flags() const override; - - void setItemKey(const QString &itemKey); - -private: - PluginsItemInterface_V20 *m_pluginInter; - QString m_itemKey; - QPluginLoader *m_pluginLoader; -}; - -#endif // PLUGINADAPTER_H diff --git a/frame/pluginadapter/pluginsiteminterface_v20.h b/frame/pluginadapter/pluginsiteminterface_v20.h deleted file mode 100644 index 913aa0e9d..000000000 --- a/frame/pluginadapter/pluginsiteminterface_v20.h +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ - -#ifndef PLUGINSITEMINTERFACE_V20_H -#define PLUGINSITEMINTERFACE_V20_H - -#include "pluginproxyinterface.h" - -#include -#include - -/// -/// \brief The PluginsItemInterface_V20 class -/// the dock plugins item interface, all dock plugins should -/// inheirt this class and override all pure virtual function. -/// -class PluginsItemInterface_V20 -{ -public: - enum PluginType { - Normal, - Fixed - }; - - /** - * @brief Plugin size policy - */ - enum PluginSizePolicy { - System = 1 << 0, // Follow the system - Custom = 1 << 1 // The custom - }; - - /// - /// \brief ~PluginsItemInterface_V20 - /// DON'T try to delete m_proxyInter. - /// - virtual ~PluginsItemInterface_V20() {} - - /// - /// \brief pluginName - /// tell dock the unique plugin id - /// \return - /// - virtual const QString pluginName() const = 0; - virtual const QString pluginDisplayName() const { return QString(); } - - /// - /// \brief init - /// init your plugins, you need to save proxyInter to m_proxyInter - /// member variable. but you shouldn't free this pointer. - /// \param proxyInter - /// DON'T try to delete this pointer. - /// - virtual void init(PluginProxyInterface *proxyInter) = 0; - /// - /// \brief itemWidget - /// your plugin item widget, each item should have a unique key. - /// \param itemKey - /// your widget' unqiue key. - /// \return - /// - virtual QWidget *itemWidget(const QString &itemKey) = 0; - - /// - /// \brief itemTipsWidget - /// override this function if your item want to have a tips. - /// the tips will shown when user hover your item. - /// nullptr will be ignored. - /// \param itemKey - /// \return - /// - virtual QWidget *itemTipsWidget(const QString &itemKey) {Q_UNUSED(itemKey); return nullptr;} - /// - /// \brief itemPopupApplet - /// override this function if your item wants to have an popup applet. - /// the popup applet will shown when user click your item. - /// - /// Tips: - /// dock should receive mouse press/release event to check user mouse operate, - /// if your item filter mouse event, this function will not be called. - /// so if you override mouse event and want to use popup applet, you - /// should pass event to your parent use QWidget::someEvent(e); - /// \param itemKey - /// \return - /// - virtual QWidget *itemPopupApplet(const QString &itemKey) {Q_UNUSED(itemKey); return nullptr;} - /// - /// \brief itemCommand - /// execute spec command when user clicked your item. - /// ensure your command do not get user input. - /// - /// empty string will be ignored. - /// \param itemKey - /// \return - /// - virtual const QString itemCommand(const QString &itemKey) {Q_UNUSED(itemKey); return QString();} - - /// - /// \brief itemContextMenu - /// context menu is shown when RequestPopupMenu called. - /// \param itemKey - /// \return - /// - virtual const QString itemContextMenu(const QString &itemKey) {Q_UNUSED(itemKey); return QString();} - /// - /// \brief invokedMenuItem - /// call if context menu item is clicked - /// \param itemKey - /// \param itemId - /// menu item id - /// \param checked - /// - virtual void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) {Q_UNUSED(itemKey); Q_UNUSED(menuId); Q_UNUSED(checked);} - - /// - /// \brief itemSortKey - /// tell dock where your item wants to put on. - /// - /// this index is start from 1 and - /// 0 for left side - /// -1 for right side - /// \param itemKey - /// \return - /// - virtual int itemSortKey(const QString &itemKey) {Q_UNUSED(itemKey); return 1;} - /// - /// \brief setSortKey - /// save your item new position - /// sort key will be changed when plugins order - /// changed(by user drag-drop) - /// \param itemKey - /// \param order - /// - virtual void setSortKey(const QString &itemKey, const int order) {Q_UNUSED(itemKey); Q_UNUSED(order);} - - /// - /// \brief itemAllowContainer - /// tell dock is your item allow to move into container - /// - /// if your item placed into container, popup tips and popup - /// applet will be disabled. - /// \param itemKey - /// \return - /// - virtual bool itemAllowContainer(const QString &itemKey) {Q_UNUSED(itemKey); return false;} - /// - /// \brief itemIsInContainer - /// tell dock your item is in container, this function - /// called at item init and if your item enable container. - /// \param itemKey - /// \return - /// - virtual bool itemIsInContainer(const QString &itemKey) {Q_UNUSED(itemKey); return false;} - /// - /// \brief setItemIsInContainer - /// save your item new state. - /// this function called when user drag out your item from - /// container or user drop item into container(if your item - /// allow drop into container). - /// \param itemKey - /// \param container - /// - virtual void setItemIsInContainer(const QString &itemKey, const bool container) {Q_UNUSED(itemKey); Q_UNUSED(container);} - - virtual bool pluginIsAllowDisable() { return false; } - virtual bool pluginIsDisable() { return false; } - virtual void pluginStateSwitched() {} - - /// - /// \brief displayModeChanged - /// override this function to receive display mode changed signal - /// \param displayMode - /// - virtual void displayModeChanged(const Dock::DisplayMode displayMode) {Q_UNUSED(displayMode);} - /// - /// \brief positionChanged - /// override this function to receive dock position changed signal - /// \param position - /// - virtual void positionChanged(const Dock::Position position) {Q_UNUSED(position);} - - /// - /// \brief refreshIcon - /// refresh item icon, its triggered when system icon theme changed. - /// \param itemKey - /// item key - /// - virtual void refreshIcon(const QString &itemKey) { Q_UNUSED(itemKey); } - - /// - /// \brief displayMode - /// get current dock display mode - /// \return - /// - inline Dock::DisplayMode displayMode() const - { - return qApp->property(PROP_DISPLAY_MODE).value(); - } - - /// - /// \brief position - /// get current dock position - /// \return - /// - inline Dock::Position position() const - { - return qApp->property(PROP_POSITION).value(); - } - - /// - /// \brief settingsChanged - /// override this function to receive plugin settings changed signal(DeepinSync) - /// - virtual void pluginSettingsChanged() {} - - /// - /// \brief type - /// default plugin add dock right,fixed plugin add to dock fixed area - /// - virtual PluginType type() { return Normal; } - - /// - /// \brief plugin size policy - /// default plugin size policy - /// - virtual PluginSizePolicy pluginSizePolicy() const { return System; } - -protected: - /// - /// \brief m_proxyInter - /// NEVER delete this object. - /// - PluginProxyInterface *m_proxyInter = nullptr; -}; - -QT_BEGIN_NAMESPACE - -#define ModuleInterfaceV20_iid "com.deepin.dock.PluginsItemInterface" - -Q_DECLARE_INTERFACE(PluginsItemInterface_V20, ModuleInterfaceV20_iid) -QT_END_NAMESPACE - -#endif // PLUGINSITEMINTERFACE_H diff --git a/frame/window/pluginchildpage.cpp b/frame/window/pluginchildpage.cpp deleted file mode 100644 index 06fdec370..000000000 --- a/frame/window/pluginchildpage.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#include "pluginchildpage.h" - -#include -#include -#include - -PluginChildPage::PluginChildPage(QWidget *parent) - : QWidget(parent) - , m_headerWidget(new QWidget(this)) - , m_back(new QLabel(m_headerWidget)) - , m_title(new QLabel(m_headerWidget)) - , m_container(new QWidget(this)) - , m_topWidget(nullptr) - , m_containerLayout(new QVBoxLayout(m_container)) - , m_isBack(false) -{ - initUi(); - m_back->installEventFilter(this); -} - -PluginChildPage::~PluginChildPage() -{ -} - -void PluginChildPage::pushWidget(QWidget *widget) -{ - // 首先将界面其他的窗体移除 - for (int i = m_containerLayout->count() - 1; i >= 0; i--) { - QLayoutItem *item = m_containerLayout->itemAt(i); - item->widget()->removeEventFilter(this); - item->widget()->hide(); - m_containerLayout->removeItem(item); - } - m_topWidget = widget; - widget->installEventFilter(this); - m_containerLayout->addWidget(widget); - widget->show(); - m_isBack = false; - QMetaObject::invokeMethod(this, &PluginChildPage::resetHeight, Qt::QueuedConnection); -} - -void PluginChildPage::setTitle(const QString &text) -{ - m_title->setText(text); -} - -void PluginChildPage::setCanBack(bool canBack) -{ - m_back->setVisible(canBack); -} - -bool PluginChildPage::isBack() -{ - return m_isBack; -} - -void PluginChildPage::initUi() -{ - m_back->setFixedWidth(24); - m_title->setAlignment(Qt::AlignCenter); - QHBoxLayout *headerLayout = new QHBoxLayout(m_headerWidget); - headerLayout->setContentsMargins(11, 12, 24 + 11, 12); - headerLayout->setSpacing(0); - headerLayout->addWidget(m_back); - headerLayout->addWidget(m_title); - m_headerWidget->setFixedHeight(48); - - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(0); - - mainLayout->addWidget(m_headerWidget); - mainLayout->addWidget(m_container); - m_containerLayout->setContentsMargins(11, 0, 11, 0); - m_containerLayout->setSpacing(0); -} - -bool PluginChildPage::eventFilter(QObject *watched, QEvent *event) -{ - if (watched == m_back && event->type() == QEvent::MouseButtonRelease) { - m_isBack = true; - Q_EMIT back(); - return true; - } - if (watched == m_topWidget) { - if (event->type() == QEvent::Hide) { - Q_EMIT closeSelf(); - return true; - } - if (event->type() == QEvent::Resize) - resetHeight(); - } - return QWidget::eventFilter(watched, event); -} - -void PluginChildPage::resetHeight() -{ - QMargins m = m_containerLayout->contentsMargins(); - m_container->setFixedHeight(m.top() + m.bottom() + m_topWidget->height()); - setFixedHeight(m_headerWidget->height() + m_container->height()); -} diff --git a/frame/window/pluginchildpage.h b/frame/window/pluginchildpage.h deleted file mode 100644 index cc8edc7a7..000000000 --- a/frame/window/pluginchildpage.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. - * - * Author: donghualin - * - * Maintainer: donghualin - * - * 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 . - */ -#ifndef PLUGINCHILDPAGE_H -#define PLUGINCHILDPAGE_H - -#include - -class QLabel; -class QVBoxLayout; - -class PluginChildPage : public QWidget -{ - Q_OBJECT - -public: - explicit PluginChildPage(QWidget *parent); - ~PluginChildPage() override; - void pushWidget(QWidget *widget); - void setTitle(const QString &text); - void setCanBack(bool canBack); - bool isBack(); - -Q_SIGNALS: - void back(); - void closeSelf(); - -protected: - bool eventFilter(QObject *watched, QEvent *event) override; - -private: - void initUi(); - void resetHeight(); - -private: - QWidget *m_headerWidget; - QLabel *m_back; - QLabel *m_title; - QWidget *m_container; - QWidget *m_topWidget; - QVBoxLayout *m_containerLayout; - bool m_isBack; -}; - -#endif // PLUGINCHILDPAGE_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index c36ba37cf..3579db679 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -20,7 +20,6 @@ */ #include "quickpluginwindow.h" #include "quicksettingcontroller.h" -#include "quicksettingitem.h" #include "pluginsiteminterface.h" #include "appdrag.h" #include "quickpluginmodel.h" From a1748e3ca17bd65052c438b40edac2c7f697645b Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 4 Jan 2023 22:14:33 +0800 Subject: [PATCH 230/257] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E5=B0=BA=E5=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整任务栏插件尺寸 Log: 调整插件尺寸 Influence: 观察任务栏插件是否对齐 Task: https://pms.uniontech.com/task-view-222353.html Change-Id: I30b9e1b1862fd9ba5ff3a2a931cd73204ead4292 --- plugins/bluetooth/bluetoothplugin.cpp | 17 +++++++++++++++-- plugins/onboard/onboarditem.cpp | 6 +++--- plugins/onboard/onboarditem.h | 2 +- plugins/onboard/onboardplugin.cpp | 4 ++-- plugins/sound/sounditem.cpp | 6 ++---- plugins/sound/sounditem.h | 2 +- plugins/sound/soundplugin.cpp | 10 +++++++++- 7 files changed, 33 insertions(+), 14 deletions(-) diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index 95190eabc..ade736ce5 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -23,6 +23,7 @@ #include "bluetoothplugin.h" #include "adaptersmanager.h" #include "bluetoothmainwidget.h" +#include "imageutil.h" #include @@ -140,10 +141,22 @@ QIcon BluetoothPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::Col if (dockPart == DockPart::QuickPanel) return QIcon(); + QString iconFile; if (themeType == DGuiApplicationHelper::ColorType::DarkType) - return QIcon(":/bluetooth-active-symbolic.svg"); + iconFile = ":/bluetooth-active-symbolic.sv"; + else + iconFile = ":/bluetooth-active-symbolic-dark.svg"; - return QIcon(":/bluetooth-active-symbolic-dark.svg"); + switch (dockPart) { + case DockPart::DCCSetting: + return ImageUtil::loadSvg(iconFile, QSize(18, 18)); + case DockPart::QuickShow: + return ImageUtil::loadSvg(iconFile, QSize(18, 16)); + default: + break; + } + + return QIcon(); } PluginsItemInterface::PluginMode BluetoothPlugin::status() const diff --git a/plugins/onboard/onboarditem.cpp b/plugins/onboard/onboarditem.cpp index 58589f6e8..3dd237b2b 100644 --- a/plugins/onboard/onboarditem.cpp +++ b/plugins/onboard/onboarditem.cpp @@ -46,14 +46,14 @@ OnboardItem::OnboardItem(QWidget *parent) m_icon = QIcon::fromTheme(":/icons/icon/deepin-virtualkeyboard.svg"); } -QPixmap OnboardItem::iconPixmap(int iconSize) const +QPixmap OnboardItem::iconPixmap(int iconWidth, int iconHeight) const { QString iconName = "deepin-virtualkeyboard"; if (std::min(width(), height()) <= PLUGIN_BACKGROUND_MIN_SIZE || DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) iconName.append(PLUGIN_MIN_ICON_NAME); - return loadSvg(iconName, QSize(iconSize, iconSize)); + return loadSvg(iconName, QSize(iconWidth, iconHeight)); } void OnboardItem::paintEvent(QPaintEvent *e) @@ -102,7 +102,7 @@ void OnboardItem::paintEvent(QPaintEvent *e) painter.fillPath(path, color); } - QPixmap pixmap = iconPixmap(PLUGIN_ICON_MAX_SIZE); + QPixmap pixmap = iconPixmap(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE); painter.setOpacity(1); const QRectF &rf = QRectF(rect()); const QRectF &rfp = QRectF(pixmap.rect()); diff --git a/plugins/onboard/onboarditem.h b/plugins/onboard/onboarditem.h index 58b094dc5..942021bbb 100644 --- a/plugins/onboard/onboarditem.h +++ b/plugins/onboard/onboarditem.h @@ -33,7 +33,7 @@ class OnboardItem : public QWidget public: explicit OnboardItem(QWidget *parent = nullptr); - QPixmap iconPixmap(int iconSize) const; + QPixmap iconPixmap(int iconWidth, int iconHeight) const; protected: void paintEvent(QPaintEvent *e) override; diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index 1274b663c..e6301af07 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -184,9 +184,9 @@ QIcon OnboardPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::Color } if (dockPart == DockPart::QuickPanel) - return m_onboardItem->iconPixmap(24); + return m_onboardItem->iconPixmap(24, 24); - return m_onboardItem->iconPixmap(20); + return m_onboardItem->iconPixmap(18, 16); } PluginsItemInterface::PluginMode OnboardPlugin::status() const diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 149d72661..116ec665c 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -244,7 +244,7 @@ QPixmap SoundItem::pixmap() const return m_iconPixmap; } -QPixmap SoundItem::pixmap(DGuiApplicationHelper::ColorType colorType) const +QPixmap SoundItem::pixmap(DGuiApplicationHelper::ColorType colorType, int iconWidth, int iconHeight) const { const Dock::DisplayMode displayMode = Dock::DisplayMode::Efficient; @@ -280,12 +280,10 @@ QPixmap SoundItem::pixmap(DGuiApplicationHelper::ColorType colorType) const iconString = QString("audio-volume-%1-symbolic").arg(volumeString); } - const auto ratio = devicePixelRatioF(); - int iconSize = PLUGIN_ICON_MAX_SIZE; if (colorType == DGuiApplicationHelper::LightType) iconString.append(PLUGIN_MIN_ICON_NAME); - return ImageUtil::loadSvg(iconString, ":/", iconSize, ratio); + return ImageUtil::loadSvg(":/" + iconString, QSize(iconWidth, iconHeight)); } void SoundItem::sinkChanged(DBusSink *sink) diff --git a/plugins/sound/sounditem.h b/plugins/sound/sounditem.h index 196741b86..f96cd0f17 100644 --- a/plugins/sound/sounditem.h +++ b/plugins/sound/sounditem.h @@ -51,7 +51,7 @@ public: void refreshIcon(); void refreshTips(const int volume, const bool force = false); QPixmap pixmap() const; - QPixmap pixmap(DGuiApplicationHelper::ColorType colorType) const; + QPixmap pixmap(DGuiApplicationHelper::ColorType colorType, int iconWidth, int iconHeight) const; signals: void requestContextMenu() const; diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index bd97c5d9a..84ac584d9 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -149,7 +149,15 @@ void SoundPlugin::pluginSettingsChanged() QIcon SoundPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { - return m_soundItem->pixmap(themeType); + switch (dockPart) { + case DockPart::QuickShow: + return m_soundItem->pixmap(themeType, 18, 16); + case DockPart::DCCSetting: + return m_soundItem->pixmap(themeType, 18, 18); + default: + break; + } + return QIcon(); } PluginsItemInterface::PluginMode SoundPlugin::status() const From f7812cfb66bed1fbb3f8c818e1ce98678b028042 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 Jan 2023 10:58:43 +0800 Subject: [PATCH 231/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E8=93=9D=E7=89=99=E5=90=8E=E5=BC=B9=E6=A1=86=E4=BE=9D?= =?UTF-8?q?=E7=84=B6=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除设备后弹窗不再显示 Log: Influence: 点击任务栏的蓝牙图标,弹出蓝牙弹窗,然后移除蓝牙,观察蓝牙的弹窗是否存在 Bug: https://pms.uniontech.com/bug-view-181945.html Change-Id: Idcef18077d9f822b2ea3aca93442a2d098ea146b --- frame/util/dockpopupwindow.cpp | 6 ++++++ frame/util/dockpopupwindow.h | 1 + frame/window/quickpluginwindow.cpp | 6 ++++++ plugins/bluetooth/bluetoothplugin.cpp | 2 ++ 4 files changed, 15 insertions(+) diff --git a/frame/util/dockpopupwindow.cpp b/frame/util/dockpopupwindow.cpp index a38809688..ca8aa1c0a 100644 --- a/frame/util/dockpopupwindow.cpp +++ b/frame/util/dockpopupwindow.cpp @@ -89,6 +89,12 @@ void DockPopupWindow::setContent(QWidget *content) void DockPopupWindow::setExtendWidget(QWidget *widget) { m_extendWidget = widget; + connect(widget, &QWidget::destroyed, this, [ this ] { m_extendWidget = nullptr; }, Qt::UniqueConnection); +} + +QWidget *DockPopupWindow::extengWidget() const +{ + return m_extendWidget; } void DockPopupWindow::show(const QPoint &pos, const bool model) diff --git a/frame/util/dockpopupwindow.h b/frame/util/dockpopupwindow.h index e08dcb131..5d5e7b8ee 100644 --- a/frame/util/dockpopupwindow.h +++ b/frame/util/dockpopupwindow.h @@ -45,6 +45,7 @@ public: void setContent(QWidget *content); void setExtendWidget(QWidget *widget); + QWidget *extengWidget() const; public slots: void show(const QPoint &pos, const bool model = false); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 3579db679..c622430be 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -359,6 +359,12 @@ void QuickPluginWindow::onRequestUpdate() // 如果该插件在任务栏上,则先将其添加到临时列表中 pluginItems[dockItem->pluginItem()] = dockItem; } else { + DockPopupWindow *popupWindow = getPopWindow(); + if (popupWindow->isVisible()) { + // 该插件被移除的情况下,判断弹出窗口是否在当前的插件中打开的,如果是,则隐藏该窗口 + if (popupWindow->extengWidget() == dockItem) + popupWindow->hide(); + } // 如果该插件不在任务栏上,则先删除 dockItem->deleteLater(); countChanged = true; diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index ade736ce5..b7368d618 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -64,6 +64,8 @@ void BluetoothPlugin::init(PluginProxyInterface *proxyInter) m_proxyInter->itemAdded(this, BLUETOOTH_KEY); }); connect(m_bluetoothItem.data(), &BluetoothItem::noAdapter, [&] { + m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, false); + m_proxyInter->requestSetAppletVisible(this, BLUETOOTH_KEY, false); m_proxyInter->itemRemoved(this, BLUETOOTH_KEY); }); connect(m_bluetoothWidget.data(), &BluetoothMainWidget::requestExpand, this, [ = ] { From 60e5e1b749f6a5678cc70581ca6588f2149331ea Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 Jan 2023 13:55:34 +0800 Subject: [PATCH 232/257] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=9B=BE=E6=A0=87=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 鼠标进入的时候,图标显示底色 Log: 优化图标样式 Influence: 图标样式 Task: https://pms.uniontech.com/bug-view-181945.html Change-Id: I9eb594119f0dbef36aee64ae4fd7a99fa12389c7 --- frame/controller/quicksettingcontroller.cpp | 27 +++-- frame/controller/quicksettingcontroller.h | 3 + frame/window/components/datetimedisplayer.cpp | 15 +++ frame/window/components/datetimedisplayer.h | 1 + frame/window/quickpluginwindow.cpp | 99 ++++++++++++++++--- frame/window/quickpluginwindow.h | 3 + frame/window/systempluginwindow.cpp | 21 ++++ frame/window/systempluginwindow.h | 3 + frame/window/tray/tray_delegate.cpp | 90 ++++++++++++----- frame/window/traymanagerwindow.cpp | 9 +- frame/window/traymanagerwindow.h | 1 + plugins/bluetooth/bluetoothplugin.cpp | 2 +- plugins/onboard/onboarditem.cpp | 8 +- plugins/onboard/onboarditem.h | 6 +- plugins/onboard/onboardplugin.cpp | 4 +- plugins/pluginmanager/iconmanager.cpp | 40 ++++++-- plugins/pluginmanager/iconmanager.h | 4 +- plugins/pluginmanager/pluginmanager.cpp | 9 +- plugins/pluginmanager/pluginmanager.h | 1 + 19 files changed, 286 insertions(+), 60 deletions(-) diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index a76b214da..0313fe2eb 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -23,23 +23,38 @@ #include "pluginmanagerinterface.h" #include +#include QuickSettingController::QuickSettingController(QObject *parent) : AbstractPluginsController(parent) { + qApp->installEventFilter(this); // 只有在非安全模式下才加载插件,安全模式会在等退出安全模式后通过接受事件的方式来加载插件 if (!qApp->property("safeMode").toBool()) - QMetaObject::invokeMethod(this, [ = ] { + QMetaObject::invokeMethod(this, &QuickSettingController::startLoader, Qt::QueuedConnection); +} + +QuickSettingController::~QuickSettingController() +{ +} + +bool QuickSettingController::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == qApp && event->type() == PluginLoadEvent::eventType()) { + // 如果收到的是重新加载插件的消息(一般是在退出安全模式后),则直接加载插件即可 + startLoader(); + } + + return AbstractPluginsController::eventFilter(watched, event); +} + +void QuickSettingController::startLoader() +{ #ifdef QT_DEBUG AbstractPluginsController::startLoader(new PluginLoader(QString("%1/..%2").arg(qApp->applicationDirPath()).arg("/plugins/loader"), this)); #else AbstractPluginsController::startLoader(new PluginLoader("/usr/lib/dde-dock/plugins/loader", this)); #endif - }, Qt::QueuedConnection); -} - -QuickSettingController::~QuickSettingController() -{ } void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 0eaab9324..53001dd05 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -59,6 +59,9 @@ Q_SIGNALS: protected: explicit QuickSettingController(QObject *parent = Q_NULLPTR); ~QuickSettingController() override; + bool eventFilter(QObject *watched, QEvent *event) override; + + void startLoader(); protected: void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override; diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index a459ff034..5264667aa 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -26,11 +26,13 @@ #include #include +#include #include #include #include #include +#include DWIDGET_USE_NAMESPACE DGUI_USE_NAMESPACE @@ -53,6 +55,7 @@ DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent) , m_currentSize(0) , m_oneRow(false) , m_showMultiRow(showMultiRow) + , m_isEnter(false) { m_tipPopupWindow.reset(new DockPopupWindow); // 日期格式变化的时候,需要重绘 @@ -274,6 +277,14 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e) painter.setRenderHint(QPainter::Antialiasing); painter.setPen(QPen(palette().brightText(), 1)); + // 绘制背景色 + if (m_isEnter) { + QColor backColor = DGuiApplicationHelper::ColorType::DarkType == DGuiApplicationHelper::instance()->themeType() ? QColor(20, 20, 20) : Qt::white; + backColor.setAlphaF(0.2); + // 鼠标进入的时候,绘制底色 + painter.fillRect(rect(), backColor); + } + int timeAlignFlag = Qt::AlignCenter; int dateAlignFlag = Qt::AlignCenter; if (m_showMultiRow) { @@ -383,12 +394,16 @@ QRect DateTimeDisplayer::textRect(const QRect &sourceRect) const void DateTimeDisplayer::enterEvent(QEvent *event) { Q_UNUSED(event); + m_isEnter = true; + update(); m_tipPopupWindow->show(tipsPoint()); } void DateTimeDisplayer::leaveEvent(QEvent *event) { Q_UNUSED(event); + m_isEnter = false; + update(); m_tipPopupWindow->hide(); } diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index a0e92b12e..1dda73182 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -98,6 +98,7 @@ private: int m_currentSize; bool m_oneRow; bool m_showMultiRow; + bool m_isEnter; }; #endif // DATETIMEDISPLAYER_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index c622430be..d349960d7 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -40,7 +40,8 @@ #include #define ITEMSIZE 22 -#define ITEMSPACE 6 +#define STARTSPACE 6 +#define ITEMSPACE 0 #define ICONWIDTH 18 #define ICONHEIGHT 16 @@ -114,6 +115,7 @@ void QuickPluginWindow::initUi() m_mainLayout->setDirection(QBoxLayout::RightToLeft); m_mainLayout->setContentsMargins(0, 0, 0, 0); m_mainLayout->setSpacing(ITEMSPACE); + m_mainLayout->addSpacing(STARTSPACE); } void QuickPluginWindow::setPositon(Position position) @@ -169,7 +171,7 @@ QSize QuickPluginWindow::suitableSize() const QSize QuickPluginWindow::suitableSize(const Dock::Position &position) const { if (position == Dock::Position::Top || position == Dock::Position::Bottom) { - int itemWidth = 0; + int itemWidth = STARTSPACE; for (int i = 0; i < m_mainLayout->count(); i++) { QWidget *itemWidget = m_mainLayout->itemAt(i)->widget(); if (itemWidget) @@ -180,7 +182,7 @@ QSize QuickPluginWindow::suitableSize(const Dock::Position &position) const return QSize(itemWidth, QWIDGETSIZE_MAX); } - int itemHeight = 0; + int itemHeight = STARTSPACE; for (int i = 0; i < m_mainLayout->count(); i++) { QWidget *itemWidget = m_mainLayout->itemAt(i)->widget(); if (itemWidget) @@ -447,6 +449,8 @@ void QuickPluginWindow::onRequestAppletVisible(PluginsItemInterface *itemInter, { if (visible) showPopup(getDockItemByPlugin(itemInter), itemInter, itemInter->itemPopupApplet(itemKey), false); + else + getPopWindow()->hide(); } void QuickPluginWindow::startDrag() @@ -703,6 +707,7 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QString &it , m_mainWidget(nullptr) , m_mainLayout(nullptr) , m_dockItemParent(nullptr) + , m_isEnter(false) { initUi(); initConnection(); @@ -712,9 +717,14 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QString &it QuickDockItem::~QuickDockItem() { QWidget *tipWidget = m_pluginItem->itemTipsWidget(m_itemKey); - if (tipWidget && tipWidget->parentWidget() == m_popupWindow) + if (tipWidget && (tipWidget->parentWidget() == m_popupWindow || tipWidget->parentWidget() == this)) tipWidget->setParent(m_tipParent); + QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); + if (itemWidget) { + itemWidget->setParent(nullptr); + itemWidget->hide(); + } m_popupWindow->deleteLater(); } @@ -722,6 +732,12 @@ void QuickDockItem::setPosition(Dock::Position position) { m_position = position; updateWidgetSize(); + if (m_mainLayout) { + QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); + if (itemWidget && m_mainLayout->indexOf(itemWidget) < 0) { + itemWidget->setFixedSize(suitableSize()); + } + } } PluginsItemInterface *QuickDockItem::pluginItem() @@ -746,25 +762,35 @@ void QuickDockItem::hideToolTip() QSize QuickDockItem::suitableSize() const { + int widgetSize = (m_pluginItem->displayMode() == Dock::DisplayMode::Efficient) ? 24 : 30; if (m_pluginItem->pluginSizePolicy() == PluginsItemInterface::PluginSizePolicy::Custom) { QPixmap pixmap = iconPixmap(); - if (!pixmap.isNull()) - return pixmap.size(); + if (!pixmap.isNull()) { + QSize size = pixmap.size(); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + if (size.width() < widgetSize) + size.setWidth(widgetSize); + return size; + } + if (size.height() < widgetSize) + size.setHeight(widgetSize); + return size; + } QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); if (itemWidget) { - int itemWidth = ICONWIDTH; + int itemWidth = widgetSize; int itemHeight = ICONHEIGHT; QSize itemSize = itemWidget->sizeHint(); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - if (itemSize.width() > 0) + if (itemSize.width() > widgetSize) itemWidth = itemSize.width(); if (itemSize.height() > 0 && itemSize.height() <= topLevelWidget()->height()) itemHeight = itemSize.height(); } else { if (itemSize.width() > 0 && itemSize.width() < topLevelWidget()->width()) itemWidth = itemSize.width(); - if (itemSize.height() > 0 && itemSize.height() < ICONHEIGHT) + if (itemSize.height() > widgetSize && itemSize.height() < ICONHEIGHT) itemHeight = itemSize.height(); } @@ -772,7 +798,10 @@ QSize QuickDockItem::suitableSize() const } } - return QSize(ICONWIDTH, ICONHEIGHT); + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + return QSize(widgetSize, ICONHEIGHT); + + return QSize(ICONWIDTH, widgetSize); } void QuickDockItem::paintEvent(QPaintEvent *event) @@ -780,14 +809,37 @@ void QuickDockItem::paintEvent(QPaintEvent *event) if (!m_pluginItem) return QWidget::paintEvent(event); + QPainter painter(this); + QColor backColor = DGuiApplicationHelper::ColorType::DarkType == DGuiApplicationHelper::instance()->themeType() ? QColor(20, 20, 20) : Qt::white; + backColor.setAlphaF(0.2); + if (m_isEnter) { + // 鼠标进入的时候,绘制底色 + QPainterPath path; + int borderRadius = shadowRadius(); + QRect rectBackground; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + int backHeight = qBound(20, height() - 4, 30); + rectBackground.setTop((height() - backHeight) / 2); + rectBackground.setHeight(backHeight); + rectBackground.setWidth(width()); + path.addRoundedRect(rectBackground, borderRadius, borderRadius); + } else { + int backWidth = qBound(20, width() - 4, 30); + rectBackground.setLeft((width() - backWidth) / 2); + rectBackground.setWidth(backWidth); + rectBackground.setHeight(height()); + path.addRoundedRect(rectBackground, borderRadius, borderRadius); + } + painter.fillPath(path, backColor); + } + QPixmap pixmap = iconPixmap(); if (pixmap.isNull()) return QWidget::paintEvent(event); - QSize size = suitableSize(); + QSize size = pixmap.size(); QRect pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), pixmap.size()); - QPainter painter(this); painter.drawPixmap(pixmapRect, pixmap); } @@ -824,6 +876,8 @@ void QuickDockItem::mousePressEvent(QMouseEvent *event) void QuickDockItem::enterEvent(QEvent *event) { + m_isEnter = true; + update(); QWidget::enterEvent(event); QWidget *tipWidget = m_pluginItem->itemTipsWidget(m_itemKey); @@ -858,6 +912,9 @@ void QuickDockItem::enterEvent(QEvent *event) void QuickDockItem::leaveEvent(QEvent *event) { + m_isEnter = false; + update(); + QWidget::leaveEvent(event); m_popupWindow->hide(); } @@ -981,6 +1038,24 @@ void QuickDockItem::updateWidgetSize() } } +int QuickDockItem::shadowRadius() const +{ +#define EFFECTRADIUS 8 +#define MARGIN 4 + // 高效模式下固定为8 + if (m_pluginItem->displayMode() == Dock::DisplayMode::Efficient) + return EFFECTRADIUS; + + return qApp->property("trayBorderRadius").toInt() - MARGIN; +} + +int QuickDockItem::iconSize() const +{ + if (m_pluginItem->displayMode() == Dock::DisplayMode::Efficient) + return 24; + return 30; +} + QPoint QuickDockItem::topleftPoint() const { QPoint p = this->pos(); diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 5a94b24f3..4914b7805 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -133,6 +133,8 @@ private: void initConnection(); void updateWidgetSize(); + int shadowRadius() const; + int iconSize() const; private Q_SLOTS: void onMenuActionClicked(QAction *action); @@ -148,6 +150,7 @@ private: QWidget *m_mainWidget; QHBoxLayout *m_mainLayout; QWidget *m_dockItemParent; + bool m_isEnter; }; #endif // QUICKPLUGINWINDOW_H diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 4e37be5de..6a9973d35 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -222,6 +222,7 @@ StretchPluginsItem::StretchPluginsItem(DockInter *dockInter, PluginsItemInterfac , m_itemKey(itemKey) , m_displayMode(Dock::DisplayMode::Efficient) , m_dockInter(dockInter) + , m_isEnter(false) { } @@ -279,6 +280,12 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) rctPixmap.setHeight(ICONSIZE); } + if (m_isEnter) { + QColor backColor = DGuiApplicationHelper::ColorType::DarkType == DGuiApplicationHelper::instance()->themeType() ? QColor(20, 20, 20) : Qt::white; + backColor.setAlphaF(0.2); + // 鼠标进入的时候,绘制底色 + painter.fillRect(rect(), backColor); + } // 绘制图标 int iconSize = static_cast(ICONSIZE * (QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio())); painter.drawPixmap(rctPixmap, icon.pixmap(iconSize, iconSize)); @@ -399,6 +406,20 @@ void StretchPluginsItem::mouseReleaseEvent(QMouseEvent *e) mouseClick(); } +void StretchPluginsItem::enterEvent(QEvent *event) +{ + m_isEnter = true; + update(); + DockItem::enterEvent(event); +} + +void StretchPluginsItem::leaveEvent(QEvent *event) +{ + m_isEnter = false; + update(); + DockItem::leaveEvent(event); +} + void StretchPluginsItem::mouseClick() { QStringList commandArgument = m_pluginInter->itemCommand(m_itemKey).split(" "); diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index e04ecb987..91760a2c9 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -93,6 +93,8 @@ protected: void paintEvent(QPaintEvent *event) override; void mousePressEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; const QString contextMenu() const override; void invokedMenuItem(const QString &itemId, const bool checked) override; @@ -112,6 +114,7 @@ private: static Dock::Position m_position; QPoint m_mousePressPoint; DockInter *m_dockInter; + bool m_isEnter; }; #endif // SYSTEMPLUGINWINDOW_H diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index d97c94711..b81921bb3 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -27,6 +27,7 @@ #include "widgets/snitrayitemwidget.h" #include "widgets/expandiconwidget.h" #include "utils.h" +#include "constants.h" #include "pluginsiteminterface.h" #include "quicksettingcontroller.h" #include "systempluginitem.h" @@ -186,31 +187,76 @@ void TrayDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, { Q_UNUSED(index); - if (!isPopupTray()) - return; - - QColor borderColor; - QColor backColor; - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - // 白色主题的情况下 - borderColor = Qt::black; - borderColor.setAlpha(static_cast(255 * 0.05)); - backColor = Qt::white; - backColor.setAlpha(static_cast(255 * 0.4)); - } else { - borderColor = Qt::black; - borderColor.setAlpha(static_cast(255 * 0.2)); - backColor = Qt::black; - backColor.setAlpha(static_cast(255 * 0.4)); - } + // 如果不是弹出菜单(在任务栏上显示的),在鼠标没有移入的时候无需绘制背景 + if (!isPopupTray() && !(option.state & QStyle::State_MouseOver)) + return QStyledItemDelegate::paint(painter, option, index); painter->save(); - QPainterPath path; - path.addRoundedRect(option.rect, 8, 8); painter->setRenderHint(QPainter::Antialiasing); - painter->fillPath(path, backColor); - painter->setPen(borderColor); - painter->drawPath(path); + + if (isPopupTray()) { + QPainterPath path; + path.addRoundedRect(option.rect, 8, 8); + QColor borderColor; + QColor backColor; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { + // 白色主题的情况下 + borderColor = Qt::black; + borderColor.setAlpha(static_cast(255 * 0.05)); + backColor = Qt::white; + if (option.state & QStyle::State_MouseOver) { + backColor.setAlphaF(0.4); + } else + backColor.setAlphaF(0.2); + } else { + borderColor = Qt::black; + borderColor.setAlpha(static_cast(255 * 0.2)); + backColor = Qt::black; + if (option.state & QStyle::State_MouseOver) + backColor.setAlphaF(0.4); + else + backColor.setAlphaF(0.2); + } + + painter->fillPath(path, backColor); + painter->setPen(borderColor); + painter->drawPath(path); + } else { + // 如果是任务栏上面的托盘图标,则绘制背景色 + int borderRadius = 8; + if (qApp->property(PROP_DISPLAY_MODE).value() == Dock::DisplayMode::Fashion) { + borderRadius = qApp->property("trayBorderRadius").toInt() - 4; + } + QRect rectBackground; + QPainterPath path; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { + int backHeight = qBound(20, option.rect.height() - 4, 30); + rectBackground.setLeft(option.rect.left()); + rectBackground.setTop(option.rect.top() + (option.rect.height() - backHeight) / 2); + rectBackground.setHeight(backHeight); + rectBackground.setWidth(option.rect.width()); + path.addRoundedRect(rectBackground, borderRadius, borderRadius); + } else { + int backWidth = qBound(20, option.rect.width() - 4, 30); + rectBackground.setLeft(option.rect.left() + (option.rect.width() - backWidth) / 2); + rectBackground.setTop(option.rect.top()); + rectBackground.setWidth(backWidth); + rectBackground.setHeight(option.rect.height()); + path.addRoundedRect(rectBackground, borderRadius, borderRadius); + } + QColor backColor; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { + // 白色主题的情况下 + backColor = Qt::white; + backColor.setAlphaF(0.2); + } else { + backColor = QColor(20, 20, 20); + backColor.setAlphaF(0.2); + } + + painter->fillPath(path, backColor); + } + painter->restore(); } diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index 0828f759f..a2ae6b565 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -86,6 +86,7 @@ void TrayManagerWindow::updateBorderRadius(int borderRadius) { m_borderRadius = borderRadius; update(); + qApp->setProperty("trayBorderRadius", pathRadius()); } void TrayManagerWindow::updateLayout() @@ -128,6 +129,12 @@ void TrayManagerWindow::updateItemLayout(int dockSize) Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0)); } +int TrayManagerWindow::pathRadius() const +{ + QMargins mainMargin = m_mainLayout->contentsMargins(); + return m_borderRadius - mainMargin.top(); +} + void TrayManagerWindow::setPositon(Dock::Position position) { if (m_position == position) @@ -218,7 +225,7 @@ QSize TrayManagerWindow::suitableSize(const Dock::Position &position) const QPainterPath TrayManagerWindow::roundedPaths() { QMargins mainMargin = m_mainLayout->contentsMargins(); - int radius = m_borderRadius - mainMargin.top(); + int radius = pathRadius(); QPainterPath path; if ((m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) && m_singleShow) { diff --git a/frame/window/traymanagerwindow.h b/frame/window/traymanagerwindow.h index fb9b170c4..6a4e35f96 100644 --- a/frame/window/traymanagerwindow.h +++ b/frame/window/traymanagerwindow.h @@ -83,6 +83,7 @@ private: int appDatetimeSize(const Dock::Position &position) const; QPainterPath roundedPaths(); void updateItemLayout(int dockSize); + int pathRadius() const; private Q_SLOTS: void onTrayCountChanged(); diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index b7368d618..c7ce93676 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -145,7 +145,7 @@ QIcon BluetoothPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::Col QString iconFile; if (themeType == DGuiApplicationHelper::ColorType::DarkType) - iconFile = ":/bluetooth-active-symbolic.sv"; + iconFile = ":/bluetooth-active-symbolic.svg"; else iconFile = ":/bluetooth-active-symbolic-dark.svg"; diff --git a/plugins/onboard/onboarditem.cpp b/plugins/onboard/onboarditem.cpp index 3dd237b2b..442433192 100644 --- a/plugins/onboard/onboarditem.cpp +++ b/plugins/onboard/onboarditem.cpp @@ -46,14 +46,14 @@ OnboardItem::OnboardItem(QWidget *parent) m_icon = QIcon::fromTheme(":/icons/icon/deepin-virtualkeyboard.svg"); } -QPixmap OnboardItem::iconPixmap(int iconWidth, int iconHeight) const +QPixmap OnboardItem::iconPixmap(QSize size, DGuiApplicationHelper::ColorType themeType) const { QString iconName = "deepin-virtualkeyboard"; if (std::min(width(), height()) <= PLUGIN_BACKGROUND_MIN_SIZE - || DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + || themeType == DGuiApplicationHelper::LightType) iconName.append(PLUGIN_MIN_ICON_NAME); - return loadSvg(iconName, QSize(iconWidth, iconHeight)); + return loadSvg(iconName, size); } void OnboardItem::paintEvent(QPaintEvent *e) @@ -102,7 +102,7 @@ void OnboardItem::paintEvent(QPaintEvent *e) painter.fillPath(path, color); } - QPixmap pixmap = iconPixmap(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE); + QPixmap pixmap = iconPixmap(QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), DGuiApplicationHelper::instance()->themeType()); painter.setOpacity(1); const QRectF &rf = QRectF(rect()); const QRectF &rfp = QRectF(pixmap.rect()); diff --git a/plugins/onboard/onboarditem.h b/plugins/onboard/onboarditem.h index 942021bbb..41595d6b4 100644 --- a/plugins/onboard/onboarditem.h +++ b/plugins/onboard/onboarditem.h @@ -24,16 +24,20 @@ #include "constants.h" +#include + #include #include +DGUI_USE_NAMESPACE + class OnboardItem : public QWidget { Q_OBJECT public: explicit OnboardItem(QWidget *parent = nullptr); - QPixmap iconPixmap(int iconWidth, int iconHeight) const; + QPixmap iconPixmap(QSize size, DGuiApplicationHelper::ColorType themeType) const; protected: void paintEvent(QPaintEvent *e) override; diff --git a/plugins/onboard/onboardplugin.cpp b/plugins/onboard/onboardplugin.cpp index e6301af07..bc906ede9 100644 --- a/plugins/onboard/onboardplugin.cpp +++ b/plugins/onboard/onboardplugin.cpp @@ -184,9 +184,9 @@ QIcon OnboardPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::Color } if (dockPart == DockPart::QuickPanel) - return m_onboardItem->iconPixmap(24, 24); + return m_onboardItem->iconPixmap(QSize(24, 24), themeType); - return m_onboardItem->iconPixmap(18, 16); + return m_onboardItem->iconPixmap(QSize(18, 16), themeType); } PluginsItemInterface::PluginMode OnboardPlugin::status() const diff --git a/plugins/pluginmanager/iconmanager.cpp b/plugins/pluginmanager/iconmanager.cpp index 00f3df502..5929d797f 100644 --- a/plugins/pluginmanager/iconmanager.cpp +++ b/plugins/pluginmanager/iconmanager.cpp @@ -23,6 +23,9 @@ #include "pluginsiteminterface.h" #include +#include +#include +#include #include #include @@ -30,6 +33,7 @@ #define ITEMSPACE 6 #define ITEMHEIGHT 16 #define ITEMWIDTH 18 + static QStringList pluginNames = {"power", "sound", "network"}; DGUI_USE_NAMESPACE @@ -39,6 +43,7 @@ IconManager::IconManager(DockPluginController *pluginController, QObject *parent , m_pluginController(pluginController) , m_size(QSize(ITEMWIDTH, ITEMHEIGHT)) , m_position(Dock::Position::Bottom) + , m_displayMode(Dock::DisplayMode::Efficient) { } @@ -52,7 +57,12 @@ void IconManager::setPosition(Dock::Position position) m_position = position; } -QPixmap IconManager::pixmap() const +void IconManager::setDisplayMode(Dock::DisplayMode displayMode) +{ + m_displayMode = displayMode; +} + +QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const { QList plugins; for (const QString &pluginName : pluginNames) { @@ -65,25 +75,37 @@ QPixmap IconManager::pixmap() const // 缺省图标 DDciIcon::Theme theme = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType ? DDciIcon::Light : DDciIcon::Dark; DDciIcon dciIcon(QString(":/resources/dock_control.dci")); - return dciIcon.pixmap(QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio(), ITEMHEIGHT, theme, DDciIcon::Normal); + QPixmap pixmap = dciIcon.pixmap(QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio(), ITEMHEIGHT, theme, DDciIcon::Normal); + QColor foreColor = (colorType == DGuiApplicationHelper::ColorType::DarkType ? Qt::white : Qt::black); + foreColor.setAlphaF(0.8); + QPainter pa(&pixmap); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pixmap.rect(), foreColor); + return pixmap; } // 组合图标 QPixmap pixmap; if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - pixmap = QPixmap(ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1), m_size.height() - 8); + if (m_displayMode == Dock::DisplayMode::Efficient) { + // 高效模式下,高度固定为30,圆角固定为8 + pixmap = QPixmap(ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1), 30); + } else { + // 时尚模式下,高度随着任务栏的大小变化而变化 + pixmap = QPixmap(ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1), m_size.height() - 8); + } } else { - pixmap = QPixmap(m_size.width() - 8, ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1)); + if (m_displayMode == Dock::DisplayMode::Efficient) { + // 高校模式下,宽度固定 + pixmap = QPixmap(30, ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1)); + } else { + pixmap = QPixmap(m_size.width() - 8, ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1)); + } } pixmap.fill(Qt::transparent); QPainter painter(&pixmap); painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing); - QColor backColor = DGuiApplicationHelper::ColorType::DarkType == DGuiApplicationHelper::instance()->themeType() ? QColor(20, 20, 20) : Qt::white; - backColor.setAlphaF(0.2); - QPainterPath path; - path.addRoundedRect(pixmap.rect(), 5, 5); - painter.fillPath(path, backColor); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { QPoint pointPixmap(ITEMSPACE, (pixmap.height() - ITEMHEIGHT) / 2); for (PluginsItemInterface *plugin : plugins) { diff --git a/plugins/pluginmanager/iconmanager.h b/plugins/pluginmanager/iconmanager.h index ff5363599..a51c4bd72 100644 --- a/plugins/pluginmanager/iconmanager.h +++ b/plugins/pluginmanager/iconmanager.h @@ -37,7 +37,8 @@ public: explicit IconManager(DockPluginController *pluginController, QObject *parent = nullptr); void updateSize(QSize size); void setPosition(Dock::Position position); - QPixmap pixmap() const; + void setDisplayMode(Dock::DisplayMode displayMode); + QPixmap pixmap(DGuiApplicationHelper::ColorType colorType) const; bool isFixedPlugin(PluginsItemInterface *plugin) const; private: @@ -47,6 +48,7 @@ private: DockPluginController *m_pluginController; QSize m_size; Dock::Position m_position; + Dock::DisplayMode m_displayMode; }; #endif // ICONMANAGER_H diff --git a/plugins/pluginmanager/pluginmanager.cpp b/plugins/pluginmanager/pluginmanager.cpp index 4704e29c4..1d9f8338d 100644 --- a/plugins/pluginmanager/pluginmanager.cpp +++ b/plugins/pluginmanager/pluginmanager.cpp @@ -52,6 +52,7 @@ void PluginManager::init(PluginProxyInterface *proxyInter) m_quickContainer.reset(new QuickSettingContainer(m_dockController.data())); m_iconManager.reset(new IconManager(m_dockController.data())); m_iconManager->setPosition(position()); + m_iconManager->setDisplayMode(displayMode()); connect(m_dockController.data(), &DockPluginController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter) { if (m_iconManager->isFixedPlugin(itemInter)) { @@ -105,7 +106,7 @@ QWidget *PluginManager::itemPopupApplet(const QString &itemKey) QIcon PluginManager::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { if (dockPart == DockPart::QuickShow) { - return m_iconManager->pixmap(); + return m_iconManager->pixmap(themeType); } return QIcon(); @@ -137,6 +138,12 @@ void PluginManager::positionChanged(const Dock::Position position) m_proxyInter->itemUpdate(this, pluginName()); } +void PluginManager::displayModeChanged(const Dock::DisplayMode displayMode) +{ + m_iconManager->setDisplayMode(displayMode); + m_proxyInter->itemUpdate(this, pluginName()); +} + QList PluginManager::plugins() const { return m_dockController->plugins(); diff --git a/plugins/pluginmanager/pluginmanager.h b/plugins/pluginmanager/pluginmanager.h index e054e5ebd..9a48d2557 100644 --- a/plugins/pluginmanager/pluginmanager.h +++ b/plugins/pluginmanager/pluginmanager.h @@ -51,6 +51,7 @@ public: protected: bool eventHandler(QEvent *event) override; void positionChanged(const Dock::Position position) override; + void displayModeChanged(const Dock::DisplayMode displayMode) override; protected: // 实现PluginManagerInterface接口,用于向dock提供所有已经加载的插件 From 4ed9b915f96a2368fb470d15b0dbea6398419e9b Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 9 Jan 2023 19:18:05 +0800 Subject: [PATCH 233/257] =?UTF-8?q?feat:=20=E9=AB=98=E6=95=88=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E6=9C=80=E5=8F=B3=E4=BE=A7=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=A1=8C=E9=9D=A2=E5=8C=BA=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高效模式最右侧增加显示桌面区域 Log: 增加显示桌面按钮 Influence: 进入高效模式,鼠标进入最右侧,点击,观察是否可以正常显示桌面 Bug: https://pms.uniontech.com/bug-view-180859.html Change-Id: I1565d0ad5a47bb3f99c9d51c74c6df67f7f7892c --- frame/window/docktraywindow.cpp | 11 ++++++----- frame/window/docktraywindow.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index dcf030a0e..35a9942d7 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -29,6 +29,7 @@ #include "pluginsitem.h" #include "expandiconwidget.h" #include "quickdragcore.h" +#include "desktop_widget.h" #include @@ -45,7 +46,7 @@ DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent) , m_position(Dock::Position::Bottom) , m_displayMode(Dock::DisplayMode::Efficient) , m_mainBoxLayout(new QBoxLayout(QBoxLayout::Direction::RightToLeft, this)) - , m_frontWidget(new QWidget(this)) + , m_showDesktopWidget(new DesktopWidget(this)) , m_toolWidget(new QWidget(this)) , m_toolLayout(new QBoxLayout(QBoxLayout::RightToLeft, m_toolWidget)) , m_toolLineLabel(new QLabel(this)) @@ -280,7 +281,7 @@ void DockTrayWindow::updateToolWidget() { m_toolWidget->setVisible(m_toolLayout->count() > 0); m_toolLineLabel->setVisible(m_toolLayout->count() > 0); - m_frontWidget->setVisible(m_toolLayout->count() > 0); + m_showDesktopWidget->setVisible(m_toolLayout->count() > 0); } void DockTrayWindow::initUi() @@ -291,7 +292,7 @@ void DockTrayWindow::initUi() m_systemPuginWidget->setDisplayMode(Dock::DisplayMode::Efficient); m_mainBoxLayout->setContentsMargins(0, 0, 0, 0); m_mainBoxLayout->setSpacing(0); - m_mainBoxLayout->addWidget(m_frontWidget); + m_mainBoxLayout->addWidget(m_showDesktopWidget); m_mainBoxLayout->addWidget(m_toolWidget); m_mainBoxLayout->addSpacing(SPLITESPACE); m_mainBoxLayout->addWidget(m_toolLineLabel); @@ -363,7 +364,7 @@ void DockTrayWindow::onUpdateComponentSize() case Dock::Position::Left: case Dock::Position::Right: m_toolLineLabel->setFixedSize(width() * 0.6, SPLITERSIZE); - m_frontWidget->setFixedSize(QWIDGETSIZE_MAX, FRONTSPACING); + m_showDesktopWidget->setFixedSize(QWIDGETSIZE_MAX, FRONTSPACING); m_dateTimeWidget->setFixedSize(QWIDGETSIZE_MAX, m_dateTimeWidget->suitableSize().height()); m_systemPuginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPuginWidget->suitableSize().height()); m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, m_quickIconWidget->suitableSize().height()); @@ -372,7 +373,7 @@ void DockTrayWindow::onUpdateComponentSize() case Dock::Position::Top: case Dock::Position::Bottom: m_toolLineLabel->setFixedSize(SPLITERSIZE, height() * 0.6); - m_frontWidget->setFixedSize(FRONTSPACING, QWIDGETSIZE_MAX); + m_showDesktopWidget->setFixedSize(FRONTSPACING, QWIDGETSIZE_MAX); m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_systemPuginWidget->setFixedSize(m_systemPuginWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); diff --git a/frame/window/docktraywindow.h b/frame/window/docktraywindow.h index 981ea1a6c..84ff7dc6a 100644 --- a/frame/window/docktraywindow.h +++ b/frame/window/docktraywindow.h @@ -81,7 +81,7 @@ private: Dock::Position m_position; Dock::DisplayMode m_displayMode; QBoxLayout *m_mainBoxLayout; - QWidget *m_frontWidget; + QWidget *m_showDesktopWidget; QWidget *m_toolWidget; QBoxLayout *m_toolLayout; QLabel *m_toolLineLabel; From ebd1522aeaf03ee54d3d5a50c5920b26ef00a9d7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 13 Jan 2023 09:41:11 +0800 Subject: [PATCH 234/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E5=9B=BA=E5=AE=9A=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E5=9B=BE=E6=A0=87=E5=92=8C=E5=9B=9E=E6=94=B6=E7=AB=99?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 图标加载后,需要将图标缩放成合适的大小 Log: 修复高缩放率下图标显示异常 Influence: 1.25倍缩放率下,选择非默认主题,观察任务栏显示桌面、多任务试图和回收站的图标大小是否正常 Bug: https://pms.uniontech.com/bug-view-182673.html Change-Id: I8d02cec5f990523acb9f75763fa1cb1e24c93e9c --- frame/util/imageutil.cpp | 17 +++++++++++++++-- plugins/multitasking/multitaskingplugin.cpp | 2 +- plugins/show-desktop/showdesktopplugin.cpp | 2 +- plugins/trash/trashwidget.cpp | 1 + 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/frame/util/imageutil.cpp b/frame/util/imageutil.cpp index 4d68778a8..a15a9b5d9 100644 --- a/frame/util/imageutil.cpp +++ b/frame/util/imageutil.cpp @@ -47,7 +47,9 @@ const QPixmap ImageUtil::loadSvg(const QString &iconName, const QString &localPa if (!icon.isNull()) { QPixmap pixmap = icon.pixmap(pixmapSize); pixmap.setDevicePixelRatio(ratio); - return pixmap; + if (ratio == 1) + return pixmap; + return pixmap.scaled(size * ratio, size * ratio); } QPixmap pixmap(pixmapSize, pixmapSize); @@ -61,7 +63,10 @@ const QPixmap ImageUtil::loadSvg(const QString &iconName, const QString &localPa painter.end(); pixmap.setDevicePixelRatio(ratio); - return pixmap; + if (ratio == 1) + return pixmap; + + return pixmap.scaled(size * ratio, size * ratio); } const QPixmap ImageUtil::loadSvg(const QString &iconName, const QSize size, const qreal ratio) @@ -70,6 +75,14 @@ const QPixmap ImageUtil::loadSvg(const QString &iconName, const QSize size, cons if (!icon.isNull()) { QPixmap pixmap = icon.pixmap(QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : QSize(size * ratio)); pixmap.setDevicePixelRatio(ratio); + if (ratio == 1) + return pixmap; + + if (pixmap.size().width() > size.width() * ratio) + pixmap = pixmap.scaledToWidth(size.width() * ratio); + if (pixmap.size().height() > size.height() * ratio) + pixmap = pixmap.scaledToHeight(size.height() * ratio); + return pixmap; } return QPixmap(); diff --git a/plugins/multitasking/multitaskingplugin.cpp b/plugins/multitasking/multitaskingplugin.cpp index a8b5c7858..b4cb1ef97 100644 --- a/plugins/multitasking/multitaskingplugin.cpp +++ b/plugins/multitasking/multitaskingplugin.cpp @@ -169,5 +169,5 @@ PluginsItemInterface::PluginType MultitaskingPlugin::type() PluginFlags MultitaskingPlugin::flags() const { - return PluginFlag::Type_Fixed; + return PluginFlag::Type_Fixed | PluginFlag::Attribute_ForceDock; } diff --git a/plugins/show-desktop/showdesktopplugin.cpp b/plugins/show-desktop/showdesktopplugin.cpp index 3f6b94f31..56c9cc760 100644 --- a/plugins/show-desktop/showdesktopplugin.cpp +++ b/plugins/show-desktop/showdesktopplugin.cpp @@ -166,7 +166,7 @@ PluginsItemInterface::PluginType ShowDesktopPlugin::type() PluginFlags ShowDesktopPlugin::flags() const { - return PluginFlag::Type_Fixed; + return PluginFlag::Type_Fixed | PluginFlag::Attribute_ForceDock; } void ShowDesktopPlugin::updateVisible() diff --git a/plugins/trash/trashwidget.cpp b/plugins/trash/trashwidget.cpp index 387bc1655..471ace5ba 100644 --- a/plugins/trash/trashwidget.cpp +++ b/plugins/trash/trashwidget.cpp @@ -221,6 +221,7 @@ void TrashWidget::updateIcon() int pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : int(size * ratio); m_icon = icon.pixmap(pixmapSize, pixmapSize); m_icon.setDevicePixelRatio(ratio); + m_icon = m_icon.scaled(pixmapSize * ratio, pixmapSize * ratio); } void TrashWidget::updateIconAndRefresh() From 81edbf000051de267e099cfe28ad1c4ab5db8fcb Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 Jan 2023 22:13:52 +0800 Subject: [PATCH 235/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E6=8F=92=E4=BB=B6=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高缩放率下,需要将图标按照缩放下的图标进行显示 Log: 优化高缩放率下插件图标显示异常 Influence: 高分屏,设置缩放率为最高,观察任务栏插件区域的图标显示是否正常 Bug: https://pms.uniontech.com/bug-view-183543.html Change-Id: I3087c87737a8624b906f9076351a952a2dec8452 --- frame/window/quickpluginwindow.cpp | 5 ++ plugins/onboard/onboarditem.cpp | 1 + plugins/pluginmanager/iconmanager.cpp | 68 ++++++++++++++++++--------- plugins/sound/soundwidget.cpp | 10 ++-- 4 files changed, 57 insertions(+), 27 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index d349960d7..5ce16691b 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -839,7 +839,12 @@ void QuickDockItem::paintEvent(QPaintEvent *event) QSize size = pixmap.size(); QRect pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), pixmap.size()); + pixmap.setDevicePixelRatio(qApp->devicePixelRatio()); + if (m_pluginItem->pluginSizePolicy() == PluginsItemInterface::PluginSizePolicy::System) { + size = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size / qApp->devicePixelRatio(): size; + pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), size); + } painter.drawPixmap(pixmapRect, pixmap); } diff --git a/plugins/onboard/onboarditem.cpp b/plugins/onboard/onboarditem.cpp index 442433192..b44eb0984 100644 --- a/plugins/onboard/onboarditem.cpp +++ b/plugins/onboard/onboarditem.cpp @@ -116,6 +116,7 @@ const QPixmap OnboardItem::loadSvg(const QString &fileName, const QSize &size) c QSize pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : (size * ratio); QPixmap pixmap = QIcon::fromTheme(fileName, m_icon).pixmap(pixmapSize); pixmap.setDevicePixelRatio(ratio); + pixmap = pixmap.scaled(size * ratio); return pixmap; } diff --git a/plugins/pluginmanager/iconmanager.cpp b/plugins/pluginmanager/iconmanager.cpp index 5929d797f..563534ba9 100644 --- a/plugins/pluginmanager/iconmanager.cpp +++ b/plugins/pluginmanager/iconmanager.cpp @@ -87,41 +87,65 @@ QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const // 组合图标 QPixmap pixmap; if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - if (m_displayMode == Dock::DisplayMode::Efficient) { - // 高效模式下,高度固定为30,圆角固定为8 - pixmap = QPixmap(ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1), 30); - } else { - // 时尚模式下,高度随着任务栏的大小变化而变化 - pixmap = QPixmap(ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1), m_size.height() - 8); + // 高效模式下,高度固定为30, 时尚模式下,高度随着任务栏的大小变化而变化 + int iconHeight = (m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.height() - 8); + int iconWidth = ITEMSPACE; + for (PluginsItemInterface *plugin : plugins) { + QIcon icon = plugin->icon(DockPart::QuickShow); + QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + iconSize = iconSizes.first() / qApp->devicePixelRatio(); + iconWidth += iconSize.width() + ITEMSPACE; } + iconWidth += ITEMSPACE; + pixmap = QPixmap(iconWidth, iconHeight); } else { - if (m_displayMode == Dock::DisplayMode::Efficient) { - // 高校模式下,宽度固定 - pixmap = QPixmap(30, ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1)); - } else { - pixmap = QPixmap(m_size.width() - 8, ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1)); + // 左右方向,高效模式下,宽度固定为30,时尚模式下,宽度随任务栏的大小变化而变化 + int iconWidth = m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.width() - 8; + int iconHeight = ITEMHEIGHT; + for (PluginsItemInterface *plugin : plugins) { + QIcon icon = plugin->icon(DockPart::QuickShow); + QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + iconSize = iconSizes.first() / qApp->devicePixelRatio(); + iconHeight += iconSize.height() + ITEMSPACE; } + pixmap = QPixmap(iconWidth, iconHeight); } pixmap.fill(Qt::transparent); QPainter painter(&pixmap); painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - QPoint pointPixmap(ITEMSPACE, (pixmap.height() - ITEMHEIGHT) / 2); + int x = ITEMSPACE; for (PluginsItemInterface *plugin : plugins) { QIcon icon = plugin->icon(DockPart::QuickShow); - QPixmap pixmapDraw = icon.pixmap(ITEMHEIGHT, ITEMHEIGHT); - painter.drawPixmap(pointPixmap, pixmapDraw); - pointPixmap.setX(pointPixmap.x() + ITEMWIDTH + ITEMSPACE); + QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + iconSize = iconSizes.first(); + QPixmap pixmapDraw = icon.pixmap(iconSize); + QSize realIconSize = iconSize / qApp->devicePixelRatio(); + QRect rectPixmap(QPoint(x, (pixmap.height() - realIconSize.height()) / 2), realIconSize); + painter.drawPixmap(rectPixmap, pixmapDraw); + x += ITEMWIDTH + ITEMSPACE; } } else { - QPoint pointPixmap((pixmap.width() - ITEMWIDTH) / 2, ITEMSPACE); - for (PluginsItemInterface *plugin : plugins) { - QIcon icon = plugin->icon(DockPart::QuickShow); - QPixmap pixmapDraw = icon.pixmap(ITEMHEIGHT, ITEMHEIGHT); - painter.drawPixmap(pointPixmap, pixmapDraw); - pointPixmap.setY(pointPixmap.y() + ITEMWIDTH + ITEMSPACE); - } + int y = ITEMSPACE; + for (PluginsItemInterface *plugin : plugins) { + QIcon icon = plugin->icon(DockPart::QuickShow); + QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + iconSize = iconSizes.first() / qApp->devicePixelRatio(); + + QPixmap pixmapDraw = icon.pixmap(iconSize); + QRect rectPixmap(QPoint((pixmap.width() - ITEMWIDTH) / 2, y), iconSize); + painter.drawPixmap(rectPixmap, pixmapDraw); + y += ITEMHEIGHT + ITEMSPACE; + } } painter.end(); return pixmap; diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 878699b0e..7918fae9b 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -40,7 +40,7 @@ DGUI_USE_NAMESPACE -#define ICON_SIZE 24 +#define ICON_SIZE 18 #define BACKSIZE 36 SoundWidget::SoundWidget(QWidget *parent) @@ -68,7 +68,7 @@ void SoundWidget::initUi() QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE)); QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); - m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 12); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); m_sliderContainer->setRange(0, std::round(m_dbusAudio->maxUIVolume() * 100.00)); m_sliderContainer->setPageStep(2); @@ -127,14 +127,14 @@ const QString SoundWidget::leftIcon() { const bool mute = existActiveOutputDevice() ? m_defaultSink->mute() : true; if (mute) - return QString(":/icons/resources/audio-volume-muted-dark"); + return QString(":/icons/resources/audio-volume-muted-dark.svg"); - return QString(":/icons/resources/volume"); + return QString(":/icons/resources/volume.svg"); } const QString SoundWidget::rightIcon() { - return QString(":/icons/resources/broadcast"); + return QString(":/icons/resources/broadcast.svg"); } /** 判断是否存在未禁用的声音输出设备 From 46f01047a21fdf856c9bc6dbe6457bd29732c21c Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 13 Jan 2023 15:40:20 +0800 Subject: [PATCH 236/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E6=89=98=E7=9B=98=E6=97=A0=E6=B3=95=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=A7=BB=E9=99=A4U=E7=9B=98=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:在鼠标点击托盘内右键菜单的时候,会隐藏托盘,导致菜单跟着隐藏,结果是菜单的相关功能不生效 解决方案:在点击托盘区域的时候,判断鼠标位置是否在托盘区域内,包括菜单区域,如果在托盘区域内,则不关闭托盘,等菜单点击完成后再关闭 Log: 修复托盘U盘图标右键不生效的问题 Influence: 插入U盘,打开托盘区,右键菜单,点击,观察功能是否生效 Bug: https://pms.uniontech.com/bug-view-182299.html Change-Id: I7ba5cc65e2509d4a9dab6e21d73906e8894df0b8 --- frame/window/tray/tray_delegate.cpp | 4 ++- frame/window/tray/tray_delegate.h | 1 + frame/window/tray/tray_gridview.h | 1 + .../window/tray/widgets/expandiconwidget.cpp | 13 ++++++++++ .../window/tray/widgets/systempluginitem.cpp | 26 +++++++++++++++++-- frame/window/tray/widgets/systempluginitem.h | 2 ++ .../pluginmanager/dockplugincontroller.cpp | 7 +++-- 7 files changed, 49 insertions(+), 5 deletions(-) diff --git a/frame/window/tray/tray_delegate.cpp b/frame/window/tray/tray_delegate.cpp index b81921bb3..c2bef3d1f 100644 --- a/frame/window/tray/tray_delegate.cpp +++ b/frame/window/tray/tray_delegate.cpp @@ -112,7 +112,9 @@ QWidget *TrayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem PluginsItemInterface *pluginInter = (PluginsItemInterface *)(index.data(TrayModel::PluginInterfaceRole).toULongLong()); if (pluginInter) { const QString itemKey = QuickSettingController::instance()->itemKey(pluginInter); - trayWidget = new SystemPluginItem(pluginInter, itemKey, parent); + SystemPluginItem *trayItem = new SystemPluginItem(pluginInter, itemKey, parent); + connect(trayItem, &SystemPluginItem::execActionFinished, this, &TrayDelegate::requestHide); + trayWidget = trayItem; } } diff --git a/frame/window/tray/tray_delegate.h b/frame/window/tray/tray_delegate.h index 28d2dccf2..e501a4b01 100644 --- a/frame/window/tray/tray_delegate.h +++ b/frame/window/tray/tray_delegate.h @@ -45,6 +45,7 @@ public: Q_SIGNALS: void removeRow(const QModelIndex &) const; void requestDrag(bool) const; + void requestHide(); private Q_SLOTS: void onUpdateExpand(bool on); diff --git a/frame/window/tray/tray_gridview.h b/frame/window/tray/tray_gridview.h index 60dc54762..98a43c926 100644 --- a/frame/window/tray/tray_gridview.h +++ b/frame/window/tray/tray_gridview.h @@ -54,6 +54,7 @@ Q_SIGNALS: void dragLeaved(); void dragEntered(); void dragFinished(); + void requestHide(); private Q_SLOTS: void clearDragModelIndex(); diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index d6f4b1d36..cf50ed024 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -24,6 +24,7 @@ #include "tray_delegate.h" #include "dockpopupwindow.h" #include "imageutil.h" +#include "systempluginitem.h" #include #include @@ -170,6 +171,7 @@ TrayGridWidget *ExpandIconWidget::popupTrayView() connect(trayModel, &TrayModel::rowCountChanged, gridParentView, rowCountChanged); connect(trayModel, &TrayModel::requestRefreshEditor, trayView, &TrayGridView::onUpdateEditorView); + connect(trayDelegate, &TrayDelegate::requestHide, trayView, &TrayGridView::requestHide); connect(trayDelegate, &TrayDelegate::removeRow, trayView, [ = ](const QModelIndex &index) { trayView->model()->removeRow(index.row(),index.parent()); }); @@ -208,6 +210,7 @@ void TrayGridWidget::setPosition(const Dock::Position &position) void TrayGridWidget::setTrayGridView(TrayGridView *trayView) { m_trayGridView = trayView; + connect(m_trayGridView, &TrayGridView::requestHide, this, &TrayGridWidget::hide); } void TrayGridWidget::setReferGridView(TrayGridView *trayView) @@ -315,6 +318,16 @@ void TrayGridWidget::initMember() if (rctView.contains(mousePos)) return; + // 查看是否存在SystemPluginItem插件,在此处判断的原因是因为当弹出右键菜单的时候,如果鼠标在菜单上点击 + // 刚好把托盘区域给隐藏了,导致菜单也跟着隐藏,导致点击菜单的时候不生效 + QAbstractItemModel *dataModel = m_trayGridView->model(); + for (int i = 0; i < dataModel->rowCount(); i++) { + QModelIndex index = dataModel->index(i, 0); + SystemPluginItem *widget = qobject_cast(m_trayGridView->indexWidget(index)); + if (widget && widget->containsPoint(mousePos)) + return; + } + hide(); }); } diff --git a/frame/window/tray/widgets/systempluginitem.cpp b/frame/window/tray/widgets/systempluginitem.cpp index 1fc92e3ff..9a77ffc77 100644 --- a/frame/window/tray/widgets/systempluginitem.cpp +++ b/frame/window/tray/widgets/systempluginitem.cpp @@ -37,7 +37,7 @@ SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, cons : BaseTrayWidget(parent) , m_popupShown(false) , m_tapAndHold(false) - , m_contextMenu(new QMenu(this)) + , m_contextMenu(new QMenu) , m_pluginInter(pluginInter) , m_centralWidget(m_pluginInter->itemWidget(itemKey)) , m_popupTipsDelayTimer(new QTimer(this)) @@ -81,6 +81,11 @@ SystemPluginItem::SystemPluginItem(PluginsItemInterface *const pluginInter, cons connect(qApp, &QApplication::aboutToQuit, PopupWindow, &DockPopupWindow::deleteLater); } + if (Utils::IS_WAYLAND_DISPLAY) { + Qt::WindowFlags flags = m_contextMenu->windowFlags() | Qt::FramelessWindowHint; + m_contextMenu->setWindowFlags(flags); + } + // 必须初始化父窗口,否则当主题切换之后再设置父窗口的时候palette会更改为主题切换前的palette if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey)) { w->setParent(PopupWindow.data()); @@ -109,6 +114,7 @@ SystemPluginItem::~SystemPluginItem() { if (m_popupShown) popupWindowAccept(); + m_contextMenu->deleteLater(); } QString SystemPluginItem::itemKeyForConfig() @@ -379,6 +385,21 @@ void SystemPluginItem::hidePopup() emit requestWindowAutoHide(true); } +bool SystemPluginItem::containsPoint(QPoint pos) +{ + QPoint ptGlobal = mapToGlobal(QPoint(0, 0)); + QRect rectGlobal(ptGlobal, this->size()); + if (rectGlobal.contains(pos)) + return true; + + // 如果菜单列表隐藏,则认为不在区域内 + if (!m_contextMenu->isVisible()) + return false; + + // 判断鼠标是否在菜单区域 + return m_contextMenu->geometry().contains(pos); +} + void SystemPluginItem::hideNonModel() { // auto hide if popup is not model window @@ -501,7 +522,7 @@ void SystemPluginItem::showContextMenu() QJsonArray jsonMenuItems = jsonMenu.value("items").toArray(); for (auto item : jsonMenuItems) { QJsonObject itemObj = item.toObject(); - QAction *action = new QAction(itemObj.value("itemText").toString()); + QAction *action = new QAction(itemObj.value("itemText").toString(), m_contextMenu); action->setCheckable(itemObj.value("isCheckable").toBool()); action->setChecked(itemObj.value("checked").toBool()); action->setData(itemObj.value("itemId").toString()); @@ -520,6 +541,7 @@ void SystemPluginItem::showContextMenu() void SystemPluginItem::menuActionClicked(QAction *action) { invokedMenuItem(action->data().toString(), true); + Q_EMIT execActionFinished(); } void SystemPluginItem::showCentralWidget() diff --git a/frame/window/tray/widgets/systempluginitem.h b/frame/window/tray/widgets/systempluginitem.h index 593a53d9b..3d7f15b4f 100644 --- a/frame/window/tray/widgets/systempluginitem.h +++ b/frame/window/tray/widgets/systempluginitem.h @@ -62,9 +62,11 @@ public: void showPopupApplet(QWidget * const applet); void hidePopup(); + bool containsPoint(QPoint pos); signals: void itemVisibleChanged(bool visible); + void execActionFinished(); protected: bool event(QEvent *event) override; diff --git a/plugins/pluginmanager/dockplugincontroller.cpp b/plugins/pluginmanager/dockplugincontroller.cpp index cdb0b5a94..24a51ca23 100644 --- a/plugins/pluginmanager/dockplugincontroller.cpp +++ b/plugins/pluginmanager/dockplugincontroller.cpp @@ -661,10 +661,13 @@ bool DockPluginController::eventFilter(QObject *object, QEvent *event) bool DockPluginController::pluginCanDock(PluginsItemInterface *plugin) const { - // 观察插件是否已经驻留在任务栏上,如果已经驻留在任务栏,则始终显示 - if (plugin->flags() & PluginFlag::Attribute_ForceDock) + // 1、如果插件是强制驻留任务栏,则始终显示 + // 2、如果插件是托盘插件,例如U盘插件,则始终显示 + if ((plugin->flags() & PluginFlag::Attribute_ForceDock) + || (plugin->flags() & PluginFlag::Type_Tray)) return true; + // 3、插件已经驻留在任务栏,则始终显示 const QStringList configPlugins = SETTINGCONFIG->value(DOCK_QUICK_PLUGINS).toStringList(); return configPlugins.contains(plugin->pluginName()); } From bdd4c4b7221ee94ab878ad2e0f8a565729991599 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Fri, 13 Jan 2023 16:41:43 +0800 Subject: [PATCH 237/257] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=97=B6=E9=97=B4=E6=97=A5=E6=9C=9F=E6=96=87?= =?UTF-8?q?=E5=AD=97=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 系统改变字体后,注销后时间日期显示异常;高效模式下,拉动高度时间字体无变化的问题。 Log: Bug: https://pms.uniontech.com/bug-view-181387.html Influence: 时间和日期显示。 Change-Id: I1d35d35afa54095ddd631775d7b9f190c53779fa --- frame/window/components/datetimedisplayer.cpp | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index 5264667aa..0c7ed0316 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -224,20 +224,29 @@ DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Posi info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2); return info; } - int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width() + 3; - int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; + int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width(); + int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width(); + // 如果是上下方向 if (m_showMultiRow) { - // 日期时间多行显示(一般是高效模式下) - info.m_timeRect = QRect(0, 0, timeWidth, height() / 2); - info.m_dateRect = QRect(0, height() / 2, dateWidth, height() / 2); + // 日期时间多行显示(一般是高效模式下,向下和向上偏移2个像素) + info.m_timeRect = QRect(0, 2, timeWidth, height() / 2); + info.m_dateRect = QRect(0, height() / 2 -2, dateWidth, height() / 2); } else { - info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height()); - int dateX = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2 - ITEMSPACE; - // 如果时间的X坐标小于日期的X坐标,需要手动设置坐标在日期坐标的右侧 - if (dateX < info.m_timeRect.right()) - dateX = info.m_timeRect.right(); - info.m_dateRect = QRect(dateX, 0, dateWidth, height()); + // 3:时间和日期3部分间隔 + if (rect().width() > (ITEMSPACE * 3 + timeWidth + dateWidth)) { + info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height()); + + int dateX = info.m_timeRect.right() + (rect().width() -(ITEMSPACE * 2 + timeWidth + dateWidth)); + info.m_dateRect = QRect(dateX, 0, dateWidth, height()); + } else { + // 宽度不满足间隔为ITEMSPACE的,需要自己计算间隔。 + int itemSpace = (rect().width() - timeWidth - dateWidth) / 3; + info.m_timeRect = QRect(itemSpace, 0, timeWidth, height()); + + int dateX = info.m_timeRect.right() + itemSpace; + info.m_dateRect = QRect(dateX, 0, dateWidth, height()); + } } return info; @@ -287,12 +296,20 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e) int timeAlignFlag = Qt::AlignCenter; int dateAlignFlag = Qt::AlignCenter; + + QFont strTimeFont = timeFont(); + if (m_showMultiRow) { timeAlignFlag = Qt::AlignHCenter | Qt::AlignBottom; dateAlignFlag = Qt::AlignHCenter | Qt::AlignTop; + } else { + if (strTimeFont.pixelSize() >= rect().height()) { + strTimeFont.setPixelSize(rect().height() - 2); + m_dateFont.setPixelSize(rect().height() - 2); + } } - painter.setFont(timeFont()); + painter.setFont(strTimeFont); painter.drawText(textRect(info.m_timeRect), timeAlignFlag, info.m_time); painter.setFont(m_dateFont); painter.drawText(textRect(info.m_dateRect), dateAlignFlag, info.m_date); @@ -333,18 +350,17 @@ QFont DateTimeDisplayer::timeFont() const if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) return DFontSizeManager::instance()->t6(); +#define MINHEIGHT 40 + // 如果是上下方向,且当前只有一行,则始终显示小号字体 - if (m_oneRow) + if (m_oneRow || rect().height() <= MINHEIGHT) return DFontSizeManager::instance()->t10(); static QList dateFontSize = { DFontSizeManager::instance()->t10(), DFontSizeManager::instance()->t9(), DFontSizeManager::instance()->t8(), - DFontSizeManager::instance()->t7(), - DFontSizeManager::instance()->t6() }; + DFontSizeManager::instance()->t7() }; -#define MINHEIGHT 16 - // 获取最低高度为16,找到对应的索引值 int index = qMin(qMax(static_cast((rect().height() - MINHEIGHT) / 3), 0), dateFontSize.size() - 1); return dateFontSize[index]; } From 9b6d09ffabed98dd78c1d88b2cc1aebc9ad9f843 Mon Sep 17 00:00:00 2001 From: donghualin Date: Sat, 14 Jan 2023 16:41:35 +0800 Subject: [PATCH 238/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修复拖动过程中组合图标尺寸显示异常的问题 2、修复从控制中心设置插件显示隐藏引起的异常问题 3、修复高缩放率下的组合图标显示异常问题 4、修复蓝牙面板在不同的主题下颜色的显示的问题 5、社区版键盘布局默认在任务栏显示 Log: 修复图标显示的问题 Influence: 高缩放率下,观察组合图标显示是否正常 Bug: https://pms.uniontech.com/bug-view-181723.html Change-Id: Id351063095a2290731876ce896c2cd05a32d4ec0 --- configs/com.deepin.dde.dock.dconfig.json | 2 +- frame/window/quickpluginwindow.cpp | 8 +--- plugins/bluetooth/bluetoothmainwidget.cpp | 21 ++++++-- plugins/bluetooth/bluetoothmainwidget.h | 1 + .../pluginmanager/dockplugincontroller.cpp | 14 ++++-- plugins/pluginmanager/dockplugincontroller.h | 1 + plugins/pluginmanager/iconmanager.cpp | 48 +++++++++++-------- 7 files changed, 60 insertions(+), 35 deletions(-) diff --git a/configs/com.deepin.dde.dock.dconfig.json b/configs/com.deepin.dde.dock.dconfig.json index cc0b41ee0..2e68253d8 100644 --- a/configs/com.deepin.dde.dock.dconfig.json +++ b/configs/com.deepin.dde.dock.dconfig.json @@ -27,7 +27,7 @@ "visibility": "private" }, "Dock_Quick_Tray_Name": { - "value": ["fcitx"], + "value": ["fcitx", "indicator:keybord_layout"], "serial": 0, "flags": [], "name": "显示在任务栏上的托盘图标", diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 5ce16691b..0016b5df7 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -837,14 +837,10 @@ void QuickDockItem::paintEvent(QPaintEvent *event) if (pixmap.isNull()) return QWidget::paintEvent(event); - QSize size = pixmap.size(); - QRect pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), pixmap.size()); pixmap.setDevicePixelRatio(qApp->devicePixelRatio()); - if (m_pluginItem->pluginSizePolicy() == PluginsItemInterface::PluginSizePolicy::System) { - size = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size / qApp->devicePixelRatio(): size; - pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), size); - } + QSize size = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? pixmap.size() / qApp->devicePixelRatio(): pixmap.size(); + QRect pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), size); painter.drawPixmap(pixmapRect, pixmap); } diff --git a/plugins/bluetooth/bluetoothmainwidget.cpp b/plugins/bluetooth/bluetoothmainwidget.cpp index eff4cff24..d7782b1ae 100644 --- a/plugins/bluetooth/bluetoothmainwidget.cpp +++ b/plugins/bluetooth/bluetoothmainwidget.cpp @@ -42,6 +42,7 @@ BluetoothMainWidget::BluetoothMainWidget(AdaptersManager *adapterManager, QWidge , m_nameLabel(new QLabel(this)) , m_stateLabel(new QLabel(this)) , m_expandLabel(new QLabel(this)) + , m_mouseEnter(false) { initUi(); initConnection(); @@ -66,8 +67,11 @@ bool BluetoothMainWidget::eventFilter(QObject *watcher, QEvent *event) QPainterPath path; path.addEllipse(ptCenter, size / 2 - 1, size / 2 - 1); // 设置黑色背景色 - QColor backColor(Qt::black); - backColor.setAlphaF(0.1); + QColor backColor = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType ? Qt::black : Qt::white); + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType) + backColor.setAlphaF(m_mouseEnter ? 0.2 : 0.1); + else + backColor.setAlphaF(m_mouseEnter ? 0.1 : 0.2); painter.setBrush(backColor); painter.fillPath(path, backColor); // 添加图标 @@ -81,6 +85,16 @@ bool BluetoothMainWidget::eventFilter(QObject *watcher, QEvent *event) painter.drawPixmap(QPoint(ptCenter.x() - pixmap.size().width() / 2, ptCenter.y() - pixmap.size().height() / 2), pixmap); return true; } + case QEvent::Enter: { + m_mouseEnter = true; + m_iconWidget->update(); + break; + } + case QEvent::Leave: { + m_mouseEnter = false; + m_iconWidget->update(); + break; + } case QEvent::MouseButtonRelease: { bool status = !(isOpen()); for (const Adapter *adapter : m_adapterManager->adapters()) @@ -115,10 +129,7 @@ void BluetoothMainWidget::initUi() QFont nameFont = DFontSizeManager::instance()->t6(); nameFont.setBold(true); - QPalette pe; - pe.setColor(QPalette::WindowText, Qt::black); m_nameLabel->setParent(textWidget); - m_nameLabel->setPalette(pe); m_nameLabel->setFont(nameFont); m_stateLabel->setParent(textWidget); diff --git a/plugins/bluetooth/bluetoothmainwidget.h b/plugins/bluetooth/bluetoothmainwidget.h index 083fcc275..8cd7f9dbd 100644 --- a/plugins/bluetooth/bluetoothmainwidget.h +++ b/plugins/bluetooth/bluetoothmainwidget.h @@ -59,6 +59,7 @@ private: QLabel *m_nameLabel; QLabel *m_stateLabel; QLabel *m_expandLabel; + bool m_mouseEnter; }; #endif // BLUETOOTHMAINWIDGET_H diff --git a/plugins/pluginmanager/dockplugincontroller.cpp b/plugins/pluginmanager/dockplugincontroller.cpp index 24a51ca23..d3e6f2396 100644 --- a/plugins/pluginmanager/dockplugincontroller.cpp +++ b/plugins/pluginmanager/dockplugincontroller.cpp @@ -660,6 +660,12 @@ bool DockPluginController::eventFilter(QObject *object, QEvent *event) } bool DockPluginController::pluginCanDock(PluginsItemInterface *plugin) const +{ + const QStringList configPlugins = SETTINGCONFIG->value(DOCK_QUICK_PLUGINS).toStringList(); + return pluginCanDock(configPlugins, plugin); +} + +bool DockPluginController::pluginCanDock(const QStringList &config, PluginsItemInterface *plugin) const { // 1、如果插件是强制驻留任务栏,则始终显示 // 2、如果插件是托盘插件,例如U盘插件,则始终显示 @@ -668,8 +674,7 @@ bool DockPluginController::pluginCanDock(PluginsItemInterface *plugin) const return true; // 3、插件已经驻留在任务栏,则始终显示 - const QStringList configPlugins = SETTINGCONFIG->value(DOCK_QUICK_PLUGINS).toStringList(); - return configPlugins.contains(plugin->pluginName()); + return config.contains(plugin->pluginName()); } void DockPluginController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) @@ -687,13 +692,14 @@ void DockPluginController::onConfigChanged(const QString &key, const QVariant &v // 这里只处理工具插件(回收站)和系统插件(电源插件) for (PluginsItemInterface *plugin : plugins()) { QString itemKey = this->itemKey(plugin); - if (!pluginNames.contains(plugin->pluginName()) && isPluginLoaded(plugin)) { + bool canDock = pluginCanDock(pluginNames, plugin); + if (!canDock && isPluginLoaded(plugin)) { // 如果当前配置中不包含当前插件,但是当前插件已经加载,那么就移除该插件 removePluginItem(plugin, itemKey); QWidget *itemWidget = plugin->itemWidget(itemKey); if (itemWidget) itemWidget->setVisible(false); - } else if (pluginNames.contains(plugin->pluginName()) && !isPluginLoaded(plugin)) { + } else if (canDock && !isPluginLoaded(plugin)) { // 如果当前配置中包含当前插件,但是当前插件并未加载,那么就加载该插件 addPluginItem(plugin, itemKey); // 只有工具插件是通过QWidget的方式进行显示的,因此,这里只处理工具插件 diff --git a/plugins/pluginmanager/dockplugincontroller.h b/plugins/pluginmanager/dockplugincontroller.h index 1aa09c1cc..7b81994ee 100644 --- a/plugins/pluginmanager/dockplugincontroller.h +++ b/plugins/pluginmanager/dockplugincontroller.h @@ -69,6 +69,7 @@ protected: bool eventFilter(QObject *object, QEvent *event) override; bool pluginCanDock(PluginsItemInterface *plugin) const; + bool pluginCanDock(const QStringList &config, PluginsItemInterface *plugin) const; void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; private: diff --git a/plugins/pluginmanager/iconmanager.cpp b/plugins/pluginmanager/iconmanager.cpp index 563534ba9..80ffaa81c 100644 --- a/plugins/pluginmanager/iconmanager.cpp +++ b/plugins/pluginmanager/iconmanager.cpp @@ -33,6 +33,8 @@ #define ITEMSPACE 6 #define ITEMHEIGHT 16 #define ITEMWIDTH 18 +#define MINISIZE 1 +#define STARTPOS 2 static QStringList pluginNames = {"power", "sound", "network"}; @@ -84,34 +86,44 @@ QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const return pixmap; } + int itemSpace = 0; + if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) + itemSpace = (m_displayMode == Dock::DisplayMode::Efficient ? 8 : 10); + else + itemSpace = 2; // 组合图标 QPixmap pixmap; if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { // 高效模式下,高度固定为30, 时尚模式下,高度随着任务栏的大小变化而变化 int iconHeight = (m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.height() - 8); - int iconWidth = ITEMSPACE; + if (iconHeight <= 0) + iconHeight = MINISIZE; + int iconWidth = STARTPOS; for (PluginsItemInterface *plugin : plugins) { QIcon icon = plugin->icon(DockPart::QuickShow); - QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); QList iconSizes = icon.availableSizes(); if (iconSizes.size() > 0) - iconSize = iconSizes.first() / qApp->devicePixelRatio(); - iconWidth += iconSize.width() + ITEMSPACE; + iconSize = iconSizes.first(); + iconWidth += iconSize.width(); } - iconWidth += ITEMSPACE; + iconWidth += itemSpace * (plugins.size() - 1); pixmap = QPixmap(iconWidth, iconHeight); } else { // 左右方向,高效模式下,宽度固定为30,时尚模式下,宽度随任务栏的大小变化而变化 int iconWidth = m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.width() - 8; - int iconHeight = ITEMHEIGHT; + if (iconWidth <= 0) + iconWidth = MINISIZE; + int iconHeight = STARTPOS; for (PluginsItemInterface *plugin : plugins) { QIcon icon = plugin->icon(DockPart::QuickShow); - QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); QList iconSizes = icon.availableSizes(); if (iconSizes.size() > 0) - iconSize = iconSizes.first() / qApp->devicePixelRatio(); - iconHeight += iconSize.height() + ITEMSPACE; + iconSize = iconSizes.first(); + iconHeight += iconSize.height(); } + iconHeight += itemSpace * (plugins.size() - 1); pixmap = QPixmap(iconWidth, iconHeight); } @@ -119,7 +131,7 @@ QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const QPainter painter(&pixmap); painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - int x = ITEMSPACE; + int x = STARTPOS; for (PluginsItemInterface *plugin : plugins) { QIcon icon = plugin->icon(DockPart::QuickShow); QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); @@ -127,24 +139,22 @@ QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const if (iconSizes.size() > 0) iconSize = iconSizes.first(); QPixmap pixmapDraw = icon.pixmap(iconSize); - QSize realIconSize = iconSize / qApp->devicePixelRatio(); - QRect rectPixmap(QPoint(x, (pixmap.height() - realIconSize.height()) / 2), realIconSize); + QRect rectPixmap(QPoint(x, (pixmap.height() - iconSize.height()) / 2), iconSize); painter.drawPixmap(rectPixmap, pixmapDraw); - x += ITEMWIDTH + ITEMSPACE; + x += iconSize.width() + itemSpace; } } else { - int y = ITEMSPACE; + int y = STARTPOS; for (PluginsItemInterface *plugin : plugins) { QIcon icon = plugin->icon(DockPart::QuickShow); - QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); QList iconSizes = icon.availableSizes(); if (iconSizes.size() > 0) - iconSize = iconSizes.first() / qApp->devicePixelRatio(); - + iconSize = iconSizes.first(); QPixmap pixmapDraw = icon.pixmap(iconSize); - QRect rectPixmap(QPoint((pixmap.width() - ITEMWIDTH) / 2, y), iconSize); + QRect rectPixmap(QPoint((pixmap.width() - iconSize.width()) / 2, y), iconSize); painter.drawPixmap(rectPixmap, pixmapDraw); - y += ITEMHEIGHT + ITEMSPACE; + y += iconSize.height() + itemSpace; } } painter.end(); From c6b2257f15ab8627a205c9338340fd21dced7f3b Mon Sep 17 00:00:00 2001 From: donghualin Date: Sat, 14 Jan 2023 16:32:26 +0800 Subject: [PATCH 239/257] =?UTF-8?q?fix:=20=E6=A0=B9=E6=8D=AE=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=9B=BE=E8=B0=83=E6=95=B4=E6=8F=92=E4=BB=B6=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改json中插件的顺序,亮度调整最下方,声音中间,媒体播放最上方 Log: 调整插件显示位置 Influence: 声音、亮度调整和媒体播放的显示位置 Bug: https://pms.uniontech.com/bug-view-181251.html Change-Id: I3a25fa659d63b35cddbfafe128a1fd0ba459434f --- plugins/display/display.json | 2 +- plugins/media/media.json | 3 ++- plugins/sound/sound.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/display/display.json b/plugins/display/display.json index f7c723543..73e8d1b67 100644 --- a/plugins/display/display.json +++ b/plugins/display/display.json @@ -1,4 +1,4 @@ { "api": "2.0.0", - "order": 2 + "order": 1 } diff --git a/plugins/media/media.json b/plugins/media/media.json index bec81f0da..2749bb47d 100644 --- a/plugins/media/media.json +++ b/plugins/media/media.json @@ -1,3 +1,4 @@ { - "api": "2.0.0" + "api": "2.0.0", + "order": 3 } diff --git a/plugins/sound/sound.json b/plugins/sound/sound.json index 06c1144e8..4a24d4eae 100644 --- a/plugins/sound/sound.json +++ b/plugins/sound/sound.json @@ -1,5 +1,5 @@ { "api": "2.0.0", - "order": 1, + "order": 2, "depends-daemon-dbus-service": "org.deepin.dde.Audio1" } From b337d88dd455e51bbf2ba8e78162dc8c236444a7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Sat, 14 Jan 2023 17:57:49 +0800 Subject: [PATCH 240/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E9=80=82=E5=BA=94=E4=B8=8D=E5=90=8C=E7=9A=84?= =?UTF-8?q?=E4=B8=BB=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、不同的主题变化的时候,音乐播放,声音调节和亮度调整面板颜色发生变化 2、切换任务栏的位置,弹出窗口的箭头方向显示正确 Log: 任务栏插件适配不同的主题 Influence: 从控制中心修改主题颜色,观察任务栏快捷面板的主题颜色是否发生变化 Bug: https://pms.uniontech.com/bug-view-179377.html Change-Id: Ic77858124d55dce149d8bd78fb8831038caed265 --- frame/window/quickpluginwindow.cpp | 14 ++++++++ plugins/display/brightnesswidget.cpp | 34 ++++++++++++++++--- plugins/display/brightnesswidget.h | 4 +++ plugins/media/mediawidget.cpp | 7 ++-- plugins/pluginmanager/linequickitem.cpp | 17 ++++++++-- plugins/pluginmanager/linequickitem.h | 8 +++++ plugins/sound/resources/broadcast.svg | 15 +++++++++ plugins/sound/soundwidget.cpp | 43 +++++++++++++++++++++---- plugins/sound/soundwidget.h | 4 +++ 9 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 plugins/sound/resources/broadcast.svg diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 0016b5df7..0d201dbee 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -136,6 +136,20 @@ void QuickPluginWindow::setPositon(Position position) } else { m_mainLayout->setDirection(QBoxLayout::BottomToTop); } + switch(m_position) { + case Dock::Position::Top: + getPopWindow()->setArrowDirection(DArrowRectangle::ArrowDirection::ArrowTop); + break; + case Dock::Position::Right: + getPopWindow()->setArrowDirection(DArrowRectangle::ArrowDirection::ArrowRight); + break; + case Dock::Position::Bottom: + getPopWindow()->setArrowDirection(DArrowRectangle::ArrowDirection::ArrowBottom); + break; + case Dock::Position::Left: + getPopWindow()->setArrowDirection(DArrowRectangle::ArrowDirection::ArrowLeft); + break; + } } void QuickPluginWindow::dragPlugin(PluginsItemInterface *item) diff --git a/plugins/display/brightnesswidget.cpp b/plugins/display/brightnesswidget.cpp index a25d66558..7dfc9f056 100644 --- a/plugins/display/brightnesswidget.cpp +++ b/plugins/display/brightnesswidget.cpp @@ -23,12 +23,16 @@ #include "imageutil.h" #include "slidercontainer.h" +#include + #include #include #define BACKSIZE 36 #define IMAGESIZE 18 +DGUI_USE_NAMESPACE + BrightnessWidget::BrightnessWidget(BrightnessModel *model, QWidget *parent) : QWidget(parent) , m_sliderContainer(new SliderContainer(this)) @@ -55,11 +59,7 @@ void BrightnessWidget::initUi() QHBoxLayout *mainLayout = new QHBoxLayout(this); mainLayout->setContentsMargins(15, 0, 12, 0); - QPixmap leftPixmap = ImageUtil::loadSvg(":/brightness.svg", QSize(IMAGESIZE, IMAGESIZE)); - QPixmap rightPixmap = ImageUtil::loadSvg(":/ICON_Device_Laptop.svg", QSize(IMAGESIZE, IMAGESIZE)); - m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); - m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); - + onThemeTypeChanged(); // 需求要求调节范围是10%-100%,且调节幅度为1% m_sliderContainer->setRange(10, 100); m_sliderContainer->setPageStep(1); @@ -83,6 +83,7 @@ void BrightnessWidget::initConnection() Q_EMIT brightClicked(); }); + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &BrightnessWidget::onThemeTypeChanged); updateSliderValue(); } @@ -93,3 +94,26 @@ void BrightnessWidget::updateSliderValue() m_sliderContainer->updateSliderValue(monitor->brightness()); } } + +void BrightnessWidget::convertThemePixmap(QPixmap &pixmap) +{ + // 图片是黑色的,如果当前主题为白色主题,则无需转换 + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType) + return; + + // 如果是黑色主题,则转换成白色图像 + QPainter painter(&pixmap); + painter.setCompositionMode(QPainter::CompositionMode_SourceIn); + painter.fillRect(pixmap.rect(), Qt::white); + painter.end(); +} + +void BrightnessWidget::onThemeTypeChanged() +{ + QPixmap leftPixmap = ImageUtil::loadSvg(":/brightness.svg", QSize(IMAGESIZE, IMAGESIZE)); + QPixmap rightPixmap = ImageUtil::loadSvg(":/ICON_Device_Laptop.svg", QSize(IMAGESIZE, IMAGESIZE)); + convertThemePixmap(leftPixmap); + convertThemePixmap(rightPixmap); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); + m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); +} diff --git a/plugins/display/brightnesswidget.h b/plugins/display/brightnesswidget.h index 881d0b892..26011fde4 100644 --- a/plugins/display/brightnesswidget.h +++ b/plugins/display/brightnesswidget.h @@ -47,6 +47,10 @@ private: void initUi(); void initConnection(); void updateSliderValue(); + void convertThemePixmap(QPixmap &pixmap); + +private Q_SLOTS: + void onThemeTypeChanged(); private: SliderContainer *m_sliderContainer; diff --git a/plugins/media/mediawidget.cpp b/plugins/media/mediawidget.cpp index b392f3a2a..ba6169ed1 100644 --- a/plugins/media/mediawidget.cpp +++ b/plugins/media/mediawidget.cpp @@ -21,6 +21,7 @@ #include "mediawidget.h" #include +#include #include #include @@ -31,6 +32,7 @@ #include DWIDGET_USE_NAMESPACE +DGUI_USE_NAMESPACE #define PAUSEHEIGHT 21 #define PLAYHEIGHT 18 @@ -175,11 +177,12 @@ void MusicButton::paintEvent(QPaintEvent *event) int height = this->height(); int startX = 2; int startY = (height - ctrlHeight) / 2; + QColor color = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType ? Qt::black : Qt::white; QPainter painter(this); painter.save(); painter.setRenderHint(QPainter::Antialiasing); - painter.setPen(Qt::black); - painter.setBrush(Qt::black); + painter.setPen(color); + painter.setBrush(color); if (m_buttonType == ButtonType::Pause) { painter.drawRect(QRect(startX, startY, ICOMMARGIN, ctrlHeight)); painter.drawRect(QRect(width - ICOMMARGIN - ICONSPACE, startY, ICOMMARGIN, ctrlHeight)); diff --git a/plugins/pluginmanager/linequickitem.cpp b/plugins/pluginmanager/linequickitem.cpp index 1966c6e84..c24377d36 100644 --- a/plugins/pluginmanager/linequickitem.cpp +++ b/plugins/pluginmanager/linequickitem.cpp @@ -34,6 +34,7 @@ LineQuickItem::LineQuickItem(PluginsItemInterface *const pluginInter, const QStr , m_effectWidget(new DBlurEffectWidget(this)) { initUi(); + initConnection(); QMetaObject::invokeMethod(this, &LineQuickItem::resizeSelf, Qt::QueuedConnection); } @@ -70,11 +71,9 @@ bool LineQuickItem::eventFilter(QObject *obj, QEvent *event) void LineQuickItem::initUi() { - QColor maskColor(Qt::white); - maskColor.setAlphaF(0.8); - m_effectWidget->setMaskColor(maskColor); m_effectWidget->setBlurRectXRadius(8); m_effectWidget->setBlurRectYRadius(8); + onThemeTypeChanged(DGuiApplicationHelper::instance()->themeType()); // 如果图标不为空 if (!m_centerWidget) @@ -95,6 +94,11 @@ void LineQuickItem::initUi() m_centerWidget->installEventFilter(this); } +void LineQuickItem::initConnection() +{ + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &LineQuickItem::onThemeTypeChanged); +} + void LineQuickItem::resizeSelf() { if (!m_centerWidget) @@ -103,3 +107,10 @@ void LineQuickItem::resizeSelf() m_effectWidget->setFixedHeight(m_centerWidget->height()); setFixedHeight(m_centerWidget->height()); } + +void LineQuickItem::onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType) +{ + QColor maskColor = themeType == DGuiApplicationHelper::ColorType::LightType ? Qt::white : Qt::black; + maskColor.setAlphaF(themeType == DGuiApplicationHelper::ColorType::LightType ? 0.8 : 0.5); + m_effectWidget->setMaskColor(maskColor); +} diff --git a/plugins/pluginmanager/linequickitem.h b/plugins/pluginmanager/linequickitem.h index e284f37cd..10907a3c6 100644 --- a/plugins/pluginmanager/linequickitem.h +++ b/plugins/pluginmanager/linequickitem.h @@ -23,12 +23,16 @@ #include "quicksettingitem.h" +#include + namespace Dtk { namespace Widget { class DBlurEffectWidget; } } +DGUI_USE_NAMESPACE + // 插件在快捷面板中的展示的样式,这个为整行显示的插件,例如声音,亮度调整和音乐播放等 class LineQuickItem : public QuickSettingItem { @@ -47,8 +51,12 @@ protected: private: void initUi(); + void initConnection(); void resizeSelf(); +private Q_SLOTS: + void onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType); + private: QWidget *m_centerWidget; QWidget *m_centerParentWidget; diff --git a/plugins/sound/resources/broadcast.svg b/plugins/sound/resources/broadcast.svg new file mode 100644 index 000000000..f45b1ae57 --- /dev/null +++ b/plugins/sound/resources/broadcast.svg @@ -0,0 +1,15 @@ + + + ICON / MenuItem / Broadcast + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 7918fae9b..58359d8ea 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -37,6 +37,7 @@ #include #include #include +#include DGUI_USE_NAMESPACE @@ -66,10 +67,7 @@ void SoundWidget::initUi() mainLayout->setContentsMargins(17, 0, 12, 0); mainLayout->addWidget(m_sliderContainer); - QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE)); - QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); - m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); - m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); + onThemeTypeChanged(); m_sliderContainer->setRange(0, std::round(m_dbusAudio->maxUIVolume() * 100.00)); m_sliderContainer->setPageStep(2); @@ -107,6 +105,8 @@ void SoundWidget::initConnection() m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, QIcon(leftIcon())); }); + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &SoundWidget::onThemeTypeChanged); + connect(m_sliderContainer, &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition icon) { switch (icon) { case SliderContainer::IconPosition::LeftIcon: { @@ -126,10 +126,17 @@ void SoundWidget::initConnection() const QString SoundWidget::leftIcon() { const bool mute = existActiveOutputDevice() ? m_defaultSink->mute() : true; - if (mute) - return QString(":/icons/resources/audio-volume-muted-dark.svg"); + if (mute) { + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType) + return QString(":/audio-volume-muted-symbolic-dark.svg"); - return QString(":/icons/resources/volume.svg"); + return QString(":/audio-volume-muted-symbolic.svg"); + } + + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType) + return QString(":/audio-volume-medium-symbolic-dark.svg"); + + return QString(":/audio-volume-medium-symbolic.svg"); } const QString SoundWidget::rightIcon() @@ -137,6 +144,19 @@ const QString SoundWidget::rightIcon() return QString(":/icons/resources/broadcast.svg"); } +void SoundWidget::convertThemePixmap(QPixmap &pixmap) +{ + // 图片是黑色的,如果当前主题为白色主题,则无需转换 + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType) + return; + + // 如果是黑色主题,则转换成白色图像 + QPainter painter(&pixmap); + painter.setCompositionMode(QPainter::CompositionMode_SourceIn); + painter.fillRect(pixmap.rect(), Qt::white); + painter.end(); +} + /** 判断是否存在未禁用的声音输出设备 * @brief SoundApplet::existActiveOutputDevice * @return 存在返回true,否则返回false @@ -160,3 +180,12 @@ bool SoundWidget::existActiveOutputDevice() const return false; } + +void SoundWidget::onThemeTypeChanged() +{ + QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE)); + QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); + convertThemePixmap(rightPixmap); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); + m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); +} diff --git a/plugins/sound/soundwidget.h b/plugins/sound/soundwidget.h index d7c91eb10..e2da5693b 100644 --- a/plugins/sound/soundwidget.h +++ b/plugins/sound/soundwidget.h @@ -55,8 +55,12 @@ protected: private: const QString leftIcon(); const QString rightIcon(); + void convertThemePixmap(QPixmap &pixmap); bool existActiveOutputDevice() const; +private Q_SLOTS: + void onThemeTypeChanged(); + private: DBusAudio *m_dbusAudio; SliderContainer *m_sliderContainer; From f295b434f8f30bfc44cb1a900aa72401fd68c8c7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Sat, 14 Jan 2023 19:45:12 +0800 Subject: [PATCH 241/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E6=8F=92=E4=BB=B6=E5=AD=90=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E6=97=A0=E6=B3=95=E5=85=B3=E9=97=AD=E4=B8=BB=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在子插件点击相应的功能按钮的时候,调用requestSetAppletVisible方法来隐藏面板 Log: 优化快捷面板插件功能 Influence: 进入快捷面板的蓝牙子界面点击设置,进入声音子界面点击设置,进入亮度调整子界面点击设置,在弹出对应的功能后,观察快捷面板是否隐藏 Task: https://pms.uniontech.com/task-view-222353.html Change-Id: Ifeb450497c17220545fbda10c159f1e50b00c534 --- plugins/bluetooth/bluetoothitem.cpp | 1 + plugins/bluetooth/bluetoothitem.h | 1 + plugins/bluetooth/bluetoothplugin.cpp | 9 ++++++--- plugins/bluetooth/componments/bluetoothapplet.cpp | 1 + plugins/bluetooth/componments/bluetoothapplet.h | 1 + plugins/display/displayplugin.cpp | 3 +++ plugins/display/displaysettingwidget.cpp | 2 +- plugins/display/displaysettingwidget.h | 4 ++++ plugins/sound/sounddeviceswidget.cpp | 2 +- plugins/sound/sounddeviceswidget.h | 1 + plugins/sound/soundplugin.cpp | 3 +++ 11 files changed, 23 insertions(+), 5 deletions(-) diff --git a/plugins/bluetooth/bluetoothitem.cpp b/plugins/bluetooth/bluetoothitem.cpp index d025eb19b..c8c0a3501 100644 --- a/plugins/bluetooth/bluetoothitem.cpp +++ b/plugins/bluetooth/bluetoothitem.cpp @@ -67,6 +67,7 @@ BluetoothItem::BluetoothItem(AdaptersManager *adapterManager, QWidget *parent) connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &BluetoothItem::refreshIcon); connect(m_applet, &BluetoothApplet::noAdapter, this, &BluetoothItem::noAdapter); connect(m_applet, &BluetoothApplet::justHasAdapter, this, &BluetoothItem::justHasAdapter); + connect(m_applet, &BluetoothApplet::requestHide, this, &BluetoothItem::requestHide); } QWidget *BluetoothItem::tipsWidget() diff --git a/plugins/bluetooth/bluetoothitem.h b/plugins/bluetooth/bluetoothitem.h index 89a382f6d..13a276aef 100644 --- a/plugins/bluetooth/bluetoothitem.h +++ b/plugins/bluetooth/bluetoothitem.h @@ -62,6 +62,7 @@ signals: void requestContextMenu() const; void noAdapter(); void justHasAdapter(); + void requestHide(); private: Dock::TipsWidget *m_tipsLabel; diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index c7ce93676..9e7923840 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -60,15 +60,18 @@ void BluetoothPlugin::init(PluginProxyInterface *proxyInter) m_bluetoothWidget.reset(new BluetoothMainWidget(m_adapterManager)); - connect(m_bluetoothItem.data(), &BluetoothItem::justHasAdapter, [&] { + connect(m_bluetoothItem.data(), &BluetoothItem::justHasAdapter, [ this ] { m_proxyInter->itemAdded(this, BLUETOOTH_KEY); }); - connect(m_bluetoothItem.data(), &BluetoothItem::noAdapter, [&] { + connect(m_bluetoothItem.data(), &BluetoothItem::requestHide, [ this ] { + m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, false); + }); + connect(m_bluetoothItem.data(), &BluetoothItem::noAdapter, [ this ] { m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, false); m_proxyInter->requestSetAppletVisible(this, BLUETOOTH_KEY, false); m_proxyInter->itemRemoved(this, BLUETOOTH_KEY); }); - connect(m_bluetoothWidget.data(), &BluetoothMainWidget::requestExpand, this, [ = ] { + connect(m_bluetoothWidget.data(), &BluetoothMainWidget::requestExpand, this, [ this ] { m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); }); diff --git a/plugins/bluetooth/componments/bluetoothapplet.cpp b/plugins/bluetooth/componments/bluetoothapplet.cpp index 645aba307..3ec6f9ec2 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.cpp +++ b/plugins/bluetooth/componments/bluetoothapplet.cpp @@ -302,6 +302,7 @@ void BluetoothApplet::initConnect() .method(QString("ShowPage")) .arg(QString("bluetooth")) .call(); + emit requestHide(); }); connect(DApplicationHelper::instance(), &DApplicationHelper::themeTypeChanged, this, &BluetoothApplet::updateIconTheme); connect(m_airPlaneModeInter, &DBusAirplaneMode::EnabledChanged, this, &BluetoothApplet::setAirplaneModeEnabled); diff --git a/plugins/bluetooth/componments/bluetoothapplet.h b/plugins/bluetooth/componments/bluetoothapplet.h index 87f1b7ca2..20f353c8d 100644 --- a/plugins/bluetooth/componments/bluetoothapplet.h +++ b/plugins/bluetooth/componments/bluetoothapplet.h @@ -102,6 +102,7 @@ signals: void justHasAdapter(); void powerChanged(bool state); void deviceStateChanged(const Device *device); + void requestHide(); public slots: // 蓝牙适配器增加 diff --git a/plugins/display/displayplugin.cpp b/plugins/display/displayplugin.cpp index 41001dba8..01f57a9eb 100644 --- a/plugins/display/displayplugin.cpp +++ b/plugins/display/displayplugin.cpp @@ -73,6 +73,9 @@ void DisplayPlugin::init(PluginProxyInterface *proxyInter) connect(m_displayWidget.data(), &BrightnessWidget::brightClicked, this, [ this ] { m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, true); }); + connect(m_displaySettingWidget.data(), &DisplaySettingWidget::requestHide, this, [ this ] { + m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, false); + }); connect(m_model.data(), &BrightnessModel::screenVisibleChanged, this, [ this ](bool visible) { if (visible) m_proxyInter->itemAdded(this, pluginName()); diff --git a/plugins/display/displaysettingwidget.cpp b/plugins/display/displaysettingwidget.cpp index d80056e7e..4a630d0cb 100644 --- a/plugins/display/displaysettingwidget.cpp +++ b/plugins/display/displaysettingwidget.cpp @@ -42,7 +42,7 @@ DisplaySettingWidget::DisplaySettingWidget(QWidget *parent) .path("/org/deepin/dde/ControlCenter1") .interface("org.deepin.dde.ControlCenter1") .method("ShowPage").arg(QString("display")).call(); - hide(); + Q_EMIT requestHide(); }); } diff --git a/plugins/display/displaysettingwidget.h b/plugins/display/displaysettingwidget.h index 9ea0b8fc4..e3adcefce 100644 --- a/plugins/display/displaysettingwidget.h +++ b/plugins/display/displaysettingwidget.h @@ -34,9 +34,13 @@ class DevCollaborationWidget; class DisplaySettingWidget : public QWidget { Q_OBJECT + public: explicit DisplaySettingWidget(QWidget *parent = nullptr); +Q_SIGNALS: + void requestHide(); + private: void initUI(); void resizeWidgetHeight(); diff --git a/plugins/sound/sounddeviceswidget.cpp b/plugins/sound/sounddeviceswidget.cpp index 2942c3b5f..3c00da127 100644 --- a/plugins/sound/sounddeviceswidget.cpp +++ b/plugins/sound/sounddeviceswidget.cpp @@ -449,7 +449,7 @@ void SoundDevicesWidget::onSelectIndexChanged(const QModelIndex &index) .path("/org/deepin/dde/ControlCenter1") .interface("org.deepin.dde.ControlCenter1") .method("ShowPage").arg(QString("sound")).call(); - hide(); + emit requestHide(); } } diff --git a/plugins/sound/sounddeviceswidget.h b/plugins/sound/sounddeviceswidget.h index c37814f62..5fd199e96 100644 --- a/plugins/sound/sounddeviceswidget.h +++ b/plugins/sound/sounddeviceswidget.h @@ -53,6 +53,7 @@ public: Q_SIGNALS: void enableChanged(bool); + void requestHide(); protected: bool eventFilter(QObject *watcher, QEvent *event) override; diff --git a/plugins/sound/soundplugin.cpp b/plugins/sound/soundplugin.cpp index 84ac584d9..99f59b796 100644 --- a/plugins/sound/soundplugin.cpp +++ b/plugins/sound/soundplugin.cpp @@ -70,6 +70,9 @@ void SoundPlugin::init(PluginProxyInterface *proxyInter) } connect(m_soundDeviceWidget.data(), &SoundDevicesWidget::enableChanged, m_soundWidget.data(), &SoundWidget::setEnabled); + connect(m_soundDeviceWidget.data(), &SoundDevicesWidget::requestHide, this, [ this ] { + m_proxyInter->requestSetAppletVisible(this, QUICK_ITEM_KEY, false); + }); } void SoundPlugin::pluginStateSwitched() From 3e1d5c555107b229c7d893a47688def000bbdd3a Mon Sep 17 00:00:00 2001 From: donghualin Date: Sat, 14 Jan 2023 22:09:27 +0800 Subject: [PATCH 242/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E6=95=88=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=97=A0=E6=B3=95=E6=89=93?= =?UTF-8?q?=E5=BC=80=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:高效模式和时尚模式分别创建了各自的XEmbedTrayItemWidget对象,时尚模式后创建这个对象,在创建这个对象的构造函数中会把QX11Info::connection与容器的id进行配对组合,导致后创建的对象替换了先创建对象的容器id与QX11Info::connection的映射,在点击先创建对象的时候,无法找到对应的匹配关系,导致无法打开XEmbedTrayItemWidget协议对应的窗口 修改:在构造函数不再创建映射,在当前窗口showEvent事件中再对容器id和QX11Info::connection进行映射,这样在点击窗口图标的时候可以打开正确的窗口 Log: 修复高效模式下无法打开企业微信的问题 Influence: 进入高效模式,打开企业微信和微信等应用,观察是否正常打开窗口 Bug: https://pms.uniontech.com/bug-view-182065.html Change-Id: I41be68e5ac798f1f7dc34f71652e757247595e06 --- .../tray/widgets/xembedtrayitemwidget.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/frame/window/tray/widgets/xembedtrayitemwidget.cpp b/frame/window/tray/widgets/xembedtrayitemwidget.cpp index 3a8c7ad74..a5ea550ba 100644 --- a/frame/window/tray/widgets/xembedtrayitemwidget.cpp +++ b/frame/window/tray/widgets/xembedtrayitemwidget.cpp @@ -124,6 +124,13 @@ void XEmbedTrayItemWidget::showEvent(QShowEvent *e) { QWidget::showEvent(e); + xcb_connection_t *connection = IS_WAYLAND_DISPLAY ? m_xcbCnn : QX11Info::connection(); + if (connection) { + xcb_map_window(connection, m_containerWid); + + xcb_reparent_window(connection, m_windowId, m_containerWid, 0, 0); + } + m_updateTimer->start(); } @@ -260,11 +267,13 @@ void XEmbedTrayItemWidget::wrapWindow() xcb_flush(c); - xcb_map_window(c, m_containerWid); + if (isVisible()) { + xcb_map_window(c, m_containerWid); - xcb_reparent_window(c, m_windowId, - m_containerWid, - 0, 0); + xcb_reparent_window(c, m_windowId, + m_containerWid, + 0, 0); + } /* * Render the embedded window offscreen From c42340387ee03ccad9317671ec9ffa65de568e17 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Fri, 13 Jan 2023 11:37:21 +0800 Subject: [PATCH 243/257] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新版本号为:6.0.8 Log: Task: https://pms.uniontech.com/task-view-227573.html Influence: 版本号 Change-Id: I7df0ea42812113288fa5b9d8c23acd5947085e75 --- debian/changelog | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/debian/changelog b/debian/changelog index f3863b324..db0a0acf3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,28 @@ +dde-dock (6.0.8.1) unstable; urgency=medium + + [ TagBuilder ] + * style: 解决编译不通过的问题(Task: 96831)(Influence: gerrit打包) + * fix: 修复键盘布局插件不响应键盘布局变化的问题(Task: 225011)(Influence: 社区版,从控制中心不断新增和删除键盘布局,观察布局插件是否显示隐藏) + * feat: 加载插件流程移动到插件里单独加载(Task: 222353)(Influence: 加载插件) + * feat: 加载基本插件(Task: 222353)(Influence: 插件加载) + * fix: 点击插件弹出自己的列表(Task: 222353)(Influence: 点击插件,观察是否弹出插件自己对应的列表,如果没有弹出列表,则触发这个插件的功能) + * chore: 删除多余的文件(Task: 222353)(Influence: 无) + * fix: 调整插件的尺寸(Task: 222353)(Influence: 观察任务栏插件是否对齐) + * fix: 修复移除蓝牙后弹框依然显示的问题(Bug: 181945)(Influence: 点击任务栏的蓝牙图标,弹出蓝牙弹窗,然后移除蓝牙,观察蓝牙的弹窗是否存在) + * fix: 优化插件图标样式(Task: 181945)(Influence: 图标样式) + * feat: 高效模式下最右侧增加显示桌面区域(Bug: 180859)(Influence: 进入高效模式,鼠标进入最右侧,点击,观察是否可以正常显示桌面) + * fix: 修复高缩放率下固定区域图标和回收站图标显示异常的问题(Bug: 182673)(Influence: 1.25倍缩放率下,选择非默认主题,观察任务栏显示桌面、多任务试图和回收站的图标大小是否正常) + * fix: 修复高缩放率下插件图标显示异常的问题(Bug: 183543)(Influence: 高分屏,设置缩放率为最高,观察任务栏插件区域的图标显示是否正常) + * fix: 修复展开托盘无法通过菜单移除U盘的问题(Bug: 182299)(Influence: 插入U盘,打开托盘区,右键菜单,点击,观察功能是否生效) + * fix: 解决任务栏时间日期文字显示异常的问题(Bug: 181387)(Influence: 时间和日期显示) + * fix: 修复图标异常问题(Bug: 181723)(Influence: 高缩放率下,观察组合图标显示是否正常) + * fix: 根据设计图调整插件位置(Bug: 181251)(Influence: 声音、亮度调整和媒体播放的显示位置) + * fix: 修复任务栏适应不同的主题(Bug: 179377)(Influence: 从控制中心修改主题颜色,观察任务栏快捷面板的主题颜色是否发生变化) + * fix: 修复快捷面板插件子面板无法关闭主面板的问题(Bug: 222353)(Influence: 进入快捷面板的蓝牙子界面点击设置,进入声音子界面点击设置,进入亮度调整子界面点击设置,在弹出对应的功能后,观察快捷面板是否隐藏) + * fix: 修复高效模式下无法打开企业微信的问题(Bug: 182065)(Influence: 进入高效模式,打开企业微信和微信等应用,观察是否正常打开窗口) + + -- zhaoyingzhen Fri, 13 Jan 2023 11:37:21 +0800 + dde-dock (6.0.7) unstable; urgency=medium [ TagBuilder ] From 1be68d06b2c7ee2f221fe874deed65be6ef12cfb Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 16 Jan 2023 17:07:04 +0800 Subject: [PATCH 244/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E8=93=9D=E7=89=99=E8=AE=BE=E5=A4=87=E5=90=8E=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E6=8F=92=E4=BB=B6=E4=B8=8D=E6=B6=88=E5=A4=B1?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、任务栏插件显示区域移除对配置变化的响应,该功能已经在DockPluginController中实现 2、在配置变化的时候,判断插件是否可以加载的条件增加了判断该插件是否被加载 3、修复拖动快捷面板的问题 Log: 修复移除蓝牙设备后任务栏插件不消失的问题 Influence: 插上蓝牙,从控制中心勾选该插件,在任务栏显示,然后移除蓝牙设备,观察任务栏的蓝牙图标是否消失 Bug: https://pms.uniontech.com/bug-view-181945.html Change-Id: Ib207f4f0e2ceeb4b100c57b1f3e3899a802b8ed7 --- frame/drag/quickdragcore.h | 2 ++ frame/window/quickpluginmodel.cpp | 34 ------------------- frame/window/quickpluginmodel.h | 1 - frame/window/quickpluginwindow.cpp | 4 +-- .../pluginmanager/dockplugincontroller.cpp | 16 ++++++++- plugins/pluginmanager/quicksettingitem.cpp | 22 +----------- 6 files changed, 20 insertions(+), 59 deletions(-) diff --git a/frame/drag/quickdragcore.h b/frame/drag/quickdragcore.h index 0eee58dc2..4156a65cf 100644 --- a/frame/drag/quickdragcore.h +++ b/frame/drag/quickdragcore.h @@ -50,4 +50,6 @@ private: bool m_useSourcePixmap; }; +Q_DECLARE_INTERFACE(QuickIconDrag, "QuickIconDrag") + #endif // QUICKDRAGCORE_H diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index 822ceb67a..6d645e4c9 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -121,39 +121,6 @@ void QuickPluginModel::onPluginRemoved(PluginsItemInterface *itemInter) Q_EMIT requestUpdate(); } -void QuickPluginModel::onSettingChanged(const QString &key, const QVariant &value) -{ - if (key != PLUGINNAMEKEY) - return; - QStringList localOrder = m_dockedPluginIndex.keys(); - std::sort(localOrder.begin(), localOrder.end(), [ = ](const QString &key1, const QString &key2) { - return m_dockedPluginIndex.value(key1) < m_dockedPluginIndex.value(key2); - }); - if (localOrder == value.toStringList()) - return; - - // 当配置发生变化的时候,更新任务栏的插件显示 - // 1、将当前现有的插件列表中不在配置中的插件移除 - localOrder = value.toStringList(); - for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { - if (localOrder.contains(itemInter->pluginName())) - continue; - - m_dockedPluginsItems.removeOne(itemInter); - m_dockedPluginIndex.remove(itemInter->pluginName()); - } - // 2、将配置中已有的但是插件列表中没有的插件移动到任务栏上 - QList plugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick); - for (PluginsItemInterface *plugin : plugins) - m_dockedPluginsItems << plugin; - - m_dockedPluginIndex.clear(); - for (int i = 0; i < localOrder.size(); i++) - m_dockedPluginIndex[localOrder[i]] = i; - - Q_EMIT requestUpdate(); -} - void QuickPluginModel::initConnection() { QuickSettingController *quickController = QuickSettingController::instance(); @@ -179,7 +146,6 @@ void QuickPluginModel::initConnection() connect(quickController, &QuickSettingController::pluginRemoved, this, &QuickPluginModel::onPluginRemoved); connect(quickController, &QuickSettingController::pluginUpdated, this, &QuickPluginModel::requestUpdatePlugin); - connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &QuickPluginModel::onSettingChanged); } void QuickPluginModel::initConfig() diff --git a/frame/window/quickpluginmodel.h b/frame/window/quickpluginmodel.h index a9a06f886..c1f5e9bdf 100644 --- a/frame/window/quickpluginmodel.h +++ b/frame/window/quickpluginmodel.h @@ -54,7 +54,6 @@ protected: private Q_SLOTS: void onPluginRemoved(PluginsItemInterface *itemInter); - void onSettingChanged(const QString &key, const QVariant &value); private: void initConnection(); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 0d201dbee..2b2a82e62 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -306,7 +306,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) m_dragEnterMimeData = nullptr; QDropEvent *dropEvent = static_cast(event); if (isQuickWindow(dropEvent->source())) { - const QuickPluginMimeData *mimeData = qobject_cast(dropEvent->mimeData()); + QuickPluginMimeData *mimeData = static_cast(const_cast(dropEvent->mimeData())); if (mimeData) dragPlugin(mimeData->pluginItemInterface()); } @@ -320,7 +320,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) void QuickPluginWindow::dragEnterEvent(QDragEnterEvent *event) { - m_dragEnterMimeData = const_cast(qobject_cast(event->mimeData())); + m_dragEnterMimeData = static_cast(const_cast(event->mimeData())); if (m_dragEnterMimeData) { PluginsItemInterface *plugin = m_dragEnterMimeData->pluginItemInterface(); QIcon icon = plugin->icon(DockPart::QuickShow); diff --git a/plugins/pluginmanager/dockplugincontroller.cpp b/plugins/pluginmanager/dockplugincontroller.cpp index d3e6f2396..e310bc477 100644 --- a/plugins/pluginmanager/dockplugincontroller.cpp +++ b/plugins/pluginmanager/dockplugincontroller.cpp @@ -673,7 +673,21 @@ bool DockPluginController::pluginCanDock(const QStringList &config, PluginsItemI || (plugin->flags() & PluginFlag::Type_Tray)) return true; - // 3、插件已经驻留在任务栏,则始终显示 + // 3、如果该插件并未加载(未调用itemAdde或已经调用itemRemoved),则该插件不显示 + if (!m_pluginsMap.contains(plugin)) + return false; + + const QMap &pluginMap = m_pluginsMap[plugin]; + // 如果不包含PLUGININFO,说明该插件从未调用itemAdded方法,无需加载 + if (!pluginMap.contains(PLUGININFO)) + return false; + + // 如果该插件信息的m_loaded为true,说明已经调用过itemAdded方法,并且之后又调用了itemRemoved方法,则插件也无需加载 + PluginInfo *pluginInfo = static_cast(pluginMap[PLUGININFO]); + if (!pluginInfo->m_loaded) + return false; + + // 4、插件已经驻留在任务栏,则始终显示 return config.contains(plugin->pluginName()); } diff --git a/plugins/pluginmanager/quicksettingitem.cpp b/plugins/pluginmanager/quicksettingitem.cpp index 2f672f2ee..f9f6d3266 100644 --- a/plugins/pluginmanager/quicksettingitem.cpp +++ b/plugins/pluginmanager/quicksettingitem.cpp @@ -69,27 +69,7 @@ PluginsItemInterface *QuickSettingItem::pluginItem() const const QPixmap QuickSettingItem::dragPixmap() { - QPixmap pluginPixmap = m_pluginInter->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()).pixmap(ICONWIDTH, ICONHEIGHT); - - QPainter foregroundPainter(&pluginPixmap); - foregroundPainter.setPen(foregroundColor()); - foregroundPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); - foregroundPainter.fillRect(pluginPixmap.rect(), foregroundColor()); - - QPixmap pixmapDrag(ICONWIDTH + ICONSPACE + FONTSIZE * 2, ICONHEIGHT + ICONSPACE + FONTSIZE * 2); - pixmapDrag.fill(Qt::transparent); - QPainter painter(&pixmapDrag); - painter.drawPixmap(QPoint((ICONSPACE + FONTSIZE * 2) / 2, 0), pluginPixmap); - painter.setPen(foregroundPainter.pen()); - - QFont font; - font.setPixelSize(FONTSIZE); - painter.setFont(font); - QTextOption option; - option.setAlignment(Qt::AlignTop | Qt::AlignHCenter); - painter.drawText(QRect(QPoint(0, ICONHEIGHT + ICONSPACE), - QPoint(pixmapDrag.width(), pixmapDrag.height())), m_pluginInter->pluginDisplayName(), option); - return pixmapDrag; + return grab(); } const QString QuickSettingItem::itemKey() const From 4800acce2c769546ab494c8d435fe467bf43c017 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 16 Jan 2023 17:53:38 +0800 Subject: [PATCH 245/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=90=91=E4=B8=8A=E6=8B=96=E5=8A=A8?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=BC=95=E8=B5=B7=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 遍历插件的时候,for循环中的容器错误 Log: Influence: 从任务栏向上拖动插件,观察任务栏是否正常 Bug: https://pms.uniontech.com/bug-view-181945.html Change-Id: Icf93d225680cd257e446855d03bb9434e07c27ea --- frame/window/quickpluginmodel.cpp | 5 ++--- frame/window/quickpluginwindow.cpp | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index 6d645e4c9..10db9d6b8 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -69,7 +69,7 @@ void QuickPluginModel::removePlugin(PluginsItemInterface *itemInter) } if (m_dockedPluginsItems.contains(itemInter)) { - m_dockedPluginsItems.removeOne(itemInter); + m_dockedPluginsItems.removeAll(itemInter); Q_EMIT requestUpdate(); } } @@ -116,7 +116,7 @@ void QuickPluginModel::onPluginRemoved(PluginsItemInterface *itemInter) // 如果插件移除,无需移除下方的排序设置,因为下次插件插入的时候还会插入到下方任务栏 // 因此,此处只需要从列表中移除当前插件 if (m_dockedPluginsItems.contains(itemInter)) - m_dockedPluginsItems.removeOne(itemInter); + m_dockedPluginsItems.removeAll(itemInter); // 向外发送更新列表的信号 Q_EMIT requestUpdate(); } @@ -222,7 +222,6 @@ int QuickPluginModel::generaIndex(int insertIndex, int oldIndex) // 新的位置的索引值大于原来位置的索引值,则认为插入在原来的任务栏的后面,将前面的插件的索引值减去1 for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { int pluginDockIndex = getCurrentIndex(itemInter); - qInfo() << itemInter->pluginDisplayName() << m_dockedPluginIndex[itemInter->pluginName()] << pluginDockIndex; if (pluginDockIndex > oldIndex) { if (pluginDockIndex <= insertIndex) { int tmpIndex = m_dockedPluginIndex[itemInter->pluginName()]; diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 2b2a82e62..c8d7d600d 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -657,10 +657,9 @@ int QuickPluginWindow::getDropIndex(QPoint point) return -1; } - QList dockItemInter = QuickPluginModel::instance()->dockedPluginItems(); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { // 上下方向从右向左排列 - for (int i = 0; i < dockItemInter.count() - 1; i++) { + for (int i = 0; i < dockedItems.count() - 1; i++) { QuickDockItem *dockBeforeItem = dockedItems[i]; QuickDockItem *dockItem = dockedItems[i + 1]; if (!dockItem->canInsert()) @@ -671,7 +670,7 @@ int QuickPluginWindow::getDropIndex(QPoint point) } } else { // 左右方向从下向上排列 - for (int i = 0; i < dockItemInter.count() - 1; i++) { + for (int i = 0; i < dockedItems.count() - 1; i++) { QuickDockItem *dockBeforeItem = dockedItems[i]; QuickDockItem *dockItem = dockedItems[i + 1]; if (!dockItem->canInsert()) From a572f8a37d5ccd9aa361918c7838887681ae294e Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 17 Jan 2023 10:38:45 +0800 Subject: [PATCH 246/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E?= =?UTF-8?q?=E6=89=98=E7=9B=98=E6=8B=96=E5=8A=A8=E5=9B=BE=E6=A0=87=E5=88=B0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=BC=95=E8=B5=B7=E5=B4=A9=E6=BA=83?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将static_cast修改为dynamic_cast,增加了类型判断 Log: Influence: 将托盘图标拖动到任务栏 Bug: https://pms.uniontech.com/bug-view-181945.html Change-Id: I5b23088b8b7508d9a7cf2683a3a8571a57b82e38 --- frame/drag/quickdragcore.h | 2 -- frame/window/quickpluginwindow.cpp | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frame/drag/quickdragcore.h b/frame/drag/quickdragcore.h index 4156a65cf..0eee58dc2 100644 --- a/frame/drag/quickdragcore.h +++ b/frame/drag/quickdragcore.h @@ -50,6 +50,4 @@ private: bool m_useSourcePixmap; }; -Q_DECLARE_INTERFACE(QuickIconDrag, "QuickIconDrag") - #endif // QUICKDRAGCORE_H diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index c8d7d600d..d3fffc94b 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -320,7 +320,9 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) void QuickPluginWindow::dragEnterEvent(QDragEnterEvent *event) { - m_dragEnterMimeData = static_cast(const_cast(event->mimeData())); + // 由于QuickPluginMimeData和QuickIconDrag的来源是pluginManager插件,dock和插件中都使用了这两个类,但是这个两个类 + // 是各自编译的,相当于编译了两份,所以使用qobject_cast会导致转换失败,因此,此处使用dynamic_cast来保证转换成功 + m_dragEnterMimeData = dynamic_cast(const_cast(event->mimeData())); if (m_dragEnterMimeData) { PluginsItemInterface *plugin = m_dragEnterMimeData->pluginItemInterface(); QIcon icon = plugin->icon(DockPart::QuickShow); @@ -329,7 +331,7 @@ void QuickPluginWindow::dragEnterEvent(QDragEnterEvent *event) if (widget) icon = widget->grab(); } - QuickIconDrag *drag = qobject_cast(m_dragEnterMimeData->drag()); + QuickIconDrag *drag = dynamic_cast(m_dragEnterMimeData->drag()); if (drag && !icon.isNull()) { QPixmap pixmap = icon.pixmap(QSize(16, 16)); drag->updatePixmap(pixmap); From 50dad254429a94f217e18a6a12d49402d98067b7 Mon Sep 17 00:00:00 2001 From: caixiangrong Date: Mon, 30 Jan 2023 13:14:32 +0800 Subject: [PATCH 247/257] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=8C=BA=E5=9F=9F=E5=87=BA=E7=8E=B0=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E7=94=B5=E6=B1=A0=E5=9B=BE=E6=A0=87=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.修改电池图标状态刷新处理 2.将电池插件改到快捷面板内 3.快捷面板组合图标改为默认图标 Log: 修改插件区域出现重复的电池图标问题 Bug: https://pms.uniontech.com/bug-view-184085.html Influence: 任务栏-电池图标状态刷新 Change-Id: I8af36acfd9a42efa186338c115f33255af5c1fa6 --- configs/com.deepin.dde.dock.dconfig.json | 4 +- plugins/pluginmanager/iconmanager.cpp | 118 ++---------------- plugins/pluginmanager/iconmanager.h | 3 - plugins/pluginmanager/pluginmanager.cpp | 24 ---- plugins/pluginmanager/pluginmanager.h | 1 - plugins/pluginmanager/pluginmanager.qrc | 5 - .../built-in-icons/dock-control-panel.dci | Bin 0 -> 1558 bytes .../pluginmanager/resources/dock_control.dci | Bin 767 -> 0 bytes .../pluginmanager/resources/pluginmanager.qrc | 5 + plugins/power/powerplugin.cpp | 48 ++++++- plugins/power/powerplugin.h | 4 + 11 files changed, 63 insertions(+), 149 deletions(-) delete mode 100644 plugins/pluginmanager/pluginmanager.qrc create mode 100644 plugins/pluginmanager/resources/built-in-icons/dock-control-panel.dci delete mode 100644 plugins/pluginmanager/resources/dock_control.dci create mode 100644 plugins/pluginmanager/resources/pluginmanager.qrc diff --git a/configs/com.deepin.dde.dock.dconfig.json b/configs/com.deepin.dde.dock.dconfig.json index 2e68253d8..6b1f34a47 100644 --- a/configs/com.deepin.dde.dock.dconfig.json +++ b/configs/com.deepin.dde.dock.dconfig.json @@ -17,7 +17,7 @@ "visibility":"public" }, "Dock_Quick_Plugins": { - "value": ["shutdown", "trash"], + "value": ["power", "network", "shutdown", "trash"], "serial": 0, "flags": [], "name": "显示在任务栏上的快捷插件", @@ -37,4 +37,4 @@ "visibility": "private" } } -} \ No newline at end of file +} diff --git a/plugins/pluginmanager/iconmanager.cpp b/plugins/pluginmanager/iconmanager.cpp index 80ffaa81c..8d1103cd8 100644 --- a/plugins/pluginmanager/iconmanager.cpp +++ b/plugins/pluginmanager/iconmanager.cpp @@ -31,29 +31,21 @@ #include #define ITEMSPACE 6 -#define ITEMHEIGHT 16 -#define ITEMWIDTH 18 +#define IMAGESIZE 12 +#define ITEMSIZE 18 #define MINISIZE 1 #define STARTPOS 2 -static QStringList pluginNames = {"power", "sound", "network"}; - DGUI_USE_NAMESPACE IconManager::IconManager(DockPluginController *pluginController, QObject *parent) : QObject{parent} , m_pluginController(pluginController) - , m_size(QSize(ITEMWIDTH, ITEMHEIGHT)) , m_position(Dock::Position::Bottom) , m_displayMode(Dock::DisplayMode::Efficient) { } -void IconManager::updateSize(QSize size) -{ - m_size = size; -} - void IconManager::setPosition(Dock::Position position) { m_position = position; @@ -66,104 +58,14 @@ void IconManager::setDisplayMode(Dock::DisplayMode displayMode) QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const { - QList plugins; - for (const QString &pluginName : pluginNames) { - PluginsItemInterface *plugin = findPlugin(pluginName); - if (plugin) - plugins << plugin; - } - - if (plugins.size() < 2) { - // 缺省图标 - DDciIcon::Theme theme = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType ? DDciIcon::Light : DDciIcon::Dark; - DDciIcon dciIcon(QString(":/resources/dock_control.dci")); - QPixmap pixmap = dciIcon.pixmap(QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? 1 : qApp->devicePixelRatio(), ITEMHEIGHT, theme, DDciIcon::Normal); - QColor foreColor = (colorType == DGuiApplicationHelper::ColorType::DarkType ? Qt::white : Qt::black); - foreColor.setAlphaF(0.8); - QPainter pa(&pixmap); - pa.setCompositionMode(QPainter::CompositionMode_SourceIn); - pa.fillRect(pixmap.rect(), foreColor); - return pixmap; - } - - int itemSpace = 0; - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) - itemSpace = (m_displayMode == Dock::DisplayMode::Efficient ? 8 : 10); - else - itemSpace = 2; - // 组合图标 - QPixmap pixmap; - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - // 高效模式下,高度固定为30, 时尚模式下,高度随着任务栏的大小变化而变化 - int iconHeight = (m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.height() - 8); - if (iconHeight <= 0) - iconHeight = MINISIZE; - int iconWidth = STARTPOS; - for (PluginsItemInterface *plugin : plugins) { - QIcon icon = plugin->icon(DockPart::QuickShow); - QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) - iconSize = iconSizes.first(); - iconWidth += iconSize.width(); - } - iconWidth += itemSpace * (plugins.size() - 1); - pixmap = QPixmap(iconWidth, iconHeight); - } else { - // 左右方向,高效模式下,宽度固定为30,时尚模式下,宽度随任务栏的大小变化而变化 - int iconWidth = m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.width() - 8; - if (iconWidth <= 0) - iconWidth = MINISIZE; - int iconHeight = STARTPOS; - for (PluginsItemInterface *plugin : plugins) { - QIcon icon = plugin->icon(DockPart::QuickShow); - QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) - iconSize = iconSizes.first(); - iconHeight += iconSize.height(); - } - iconHeight += itemSpace * (plugins.size() - 1); - pixmap = QPixmap(iconWidth, iconHeight); - } - - pixmap.fill(Qt::transparent); - QPainter painter(&pixmap); - painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing); - if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - int x = STARTPOS; - for (PluginsItemInterface *plugin : plugins) { - QIcon icon = plugin->icon(DockPart::QuickShow); - QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) - iconSize = iconSizes.first(); - QPixmap pixmapDraw = icon.pixmap(iconSize); - QRect rectPixmap(QPoint(x, (pixmap.height() - iconSize.height()) / 2), iconSize); - painter.drawPixmap(rectPixmap, pixmapDraw); - x += iconSize.width() + itemSpace; - } - } else { - int y = STARTPOS; - for (PluginsItemInterface *plugin : plugins) { - QIcon icon = plugin->icon(DockPart::QuickShow); - QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); - QList iconSizes = icon.availableSizes(); - if (iconSizes.size() > 0) - iconSize = iconSizes.first(); - QPixmap pixmapDraw = icon.pixmap(iconSize); - QRect rectPixmap(QPoint((pixmap.width() - iconSize.width()) / 2, y), iconSize); - painter.drawPixmap(rectPixmap, pixmapDraw); - y += iconSize.height() + itemSpace; - } - } - painter.end(); - return pixmap; -} - -bool IconManager::isFixedPlugin(PluginsItemInterface *plugin) const -{ - return pluginNames.contains(plugin->pluginName()); + // 缺省图标 + QPixmap pixmap = QIcon::fromTheme("dock-control-panel").pixmap(ITEMSIZE, ITEMSIZE); + QColor foreColor = (colorType == DGuiApplicationHelper::ColorType::DarkType ? Qt::white : Qt::black); + foreColor.setAlphaF(0.8); + QPainter pa(&pixmap); + pa.setCompositionMode(QPainter::CompositionMode_SourceIn); + pa.fillRect(pixmap.rect(), foreColor); + return pixmap.scaled(pixmap.size() / qApp->devicePixelRatio()); } PluginsItemInterface *IconManager::findPlugin(const QString &pluginName) const diff --git a/plugins/pluginmanager/iconmanager.h b/plugins/pluginmanager/iconmanager.h index a51c4bd72..38304a370 100644 --- a/plugins/pluginmanager/iconmanager.h +++ b/plugins/pluginmanager/iconmanager.h @@ -35,18 +35,15 @@ class IconManager : public QObject public: explicit IconManager(DockPluginController *pluginController, QObject *parent = nullptr); - void updateSize(QSize size); void setPosition(Dock::Position position); void setDisplayMode(Dock::DisplayMode displayMode); QPixmap pixmap(DGuiApplicationHelper::ColorType colorType) const; - bool isFixedPlugin(PluginsItemInterface *plugin) const; private: PluginsItemInterface *findPlugin(const QString &pluginName) const; private: DockPluginController *m_pluginController; - QSize m_size; Dock::Position m_position; Dock::DisplayMode m_displayMode; }; diff --git a/plugins/pluginmanager/pluginmanager.cpp b/plugins/pluginmanager/pluginmanager.cpp index 1d9f8338d..46660cfd7 100644 --- a/plugins/pluginmanager/pluginmanager.cpp +++ b/plugins/pluginmanager/pluginmanager.cpp @@ -54,21 +54,6 @@ void PluginManager::init(PluginProxyInterface *proxyInter) m_iconManager->setPosition(position()); m_iconManager->setDisplayMode(displayMode()); - connect(m_dockController.data(), &DockPluginController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter) { - if (m_iconManager->isFixedPlugin(itemInter)) { - m_proxyInter->itemUpdate(this, pluginName()); - } - }); - connect(m_dockController.data(), &DockPluginController::pluginUpdated, this, [ this ](PluginsItemInterface *itemInter) { - if (m_iconManager->isFixedPlugin(itemInter)) { - m_proxyInter->itemUpdate(this, pluginName()); - } - }); - connect(m_dockController.data(), &DockPluginController::pluginRemoved, this, [ this ](PluginsItemInterface *itemInter) { - if (m_iconManager->isFixedPlugin(itemInter)) { - m_proxyInter->itemUpdate(this, pluginName()); - } - }); connect(m_dockController.data(), &DockPluginController::requestAppletVisible, this, [ this ](PluginsItemInterface *itemInter, const QString &itemKey, bool visible) { if (visible) { QWidget *appletWidget = itemInter->itemPopupApplet(itemKey); @@ -123,15 +108,6 @@ PluginsItemInterface::PluginSizePolicy PluginManager::pluginSizePolicy() const return PluginSizePolicy::Custom; } -bool PluginManager::eventHandler(QEvent *event) -{ - if (event->type() == QEvent::Resize) { - QResizeEvent *resizeEvent = static_cast(event); - m_iconManager->updateSize(resizeEvent->size()); - } - return PluginsItemInterface::eventHandler(event); -} - void PluginManager::positionChanged(const Dock::Position position) { m_iconManager->setPosition(position); diff --git a/plugins/pluginmanager/pluginmanager.h b/plugins/pluginmanager/pluginmanager.h index 9a48d2557..eed69c778 100644 --- a/plugins/pluginmanager/pluginmanager.h +++ b/plugins/pluginmanager/pluginmanager.h @@ -49,7 +49,6 @@ public: PluginSizePolicy pluginSizePolicy() const override; protected: - bool eventHandler(QEvent *event) override; void positionChanged(const Dock::Position position) override; void displayModeChanged(const Dock::DisplayMode displayMode) override; diff --git a/plugins/pluginmanager/pluginmanager.qrc b/plugins/pluginmanager/pluginmanager.qrc deleted file mode 100644 index 41792f803..000000000 --- a/plugins/pluginmanager/pluginmanager.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - resources/dock_control.dci - - diff --git a/plugins/pluginmanager/resources/built-in-icons/dock-control-panel.dci b/plugins/pluginmanager/resources/built-in-icons/dock-control-panel.dci new file mode 100644 index 0000000000000000000000000000000000000000..7fe619708fae0022e4e58c7efbca5efa7a0684a7 GIT binary patch literal 1558 zcmZ>9_GDmWVqjo0G-IFytOuF_0!(@NMY)MNdMSxT*$@%Z$hA=AOva??Lsy*&6<{{h zGtetfO)5ZFKqOxls!mT&ABdoy%gId7DA708hnWrYG+3NSgOQaLF+zBhdRhx=4kOHA z$d-`6egst;j>cx!bZ)S{=rp|0v)EYr4hPHc zBeSmjPG8+v@t~H;Wzx=(`$(L_P>yl{X0;yw?4opa9%)=OWM<`Ie&-s6^Dkv^^1?cGH988_s-UFA#G#OnOt;3a%sCv zqw++##SO7Lzf7=faH{IDVp{p*KXX9w!*vDxiLom_9XRsWKWMMRSB2}p8)t65Wt={D z_m}sVxVuj0aJ^!^csGry%F(xO@t3%OOJ}-nac6Z!1y(!yzUR1-vqSrg^CA6^N^9Yt P_9s6b`u(o8zC#88Xnr7& literal 0 HcmV?d00001 diff --git a/plugins/pluginmanager/resources/dock_control.dci b/plugins/pluginmanager/resources/dock_control.dci deleted file mode 100644 index 38848da3b7a9e524bdef6b868a5d74784234c883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmZ>9_GDmWWME)2G-IFytY?DgX3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyxCj^lAV8_7wV>uO!W;%M zmSpk~R7a4fo7*iQJKWVNAS}Sb=PZz|uYZ7B;Jm^A&-VYbq&>4Hzqdb9?ZJ6KmXpKz zAoD^+hJzjs3Ig&i>`cst2Lmi3JSU}OmCw)p@;CpNK}B7?;NSEI+a@l0He=z>mY+U9 zDy<#QTzO_^z07#Z8BSv{i-sl{=ZqIh=ew;K6sI~Gn_bhn!S-}wv3;^$5hl2nB diff --git a/plugins/pluginmanager/resources/pluginmanager.qrc b/plugins/pluginmanager/resources/pluginmanager.qrc new file mode 100644 index 000000000..760cabc9d --- /dev/null +++ b/plugins/pluginmanager/resources/pluginmanager.qrc @@ -0,0 +1,5 @@ + + + built-in-icons/dock-control-panel.dci + + diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index 473ab772c..3c5ff341a 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -26,7 +26,9 @@ #include #include +#include +#include #include #define PLUGIN_STATE_KEY "enable" @@ -48,11 +50,13 @@ PowerPlugin::PowerPlugin(QObject *parent) , m_systemPowerInter(nullptr) , m_powerInter(nullptr) , m_preChargeTimer(new QTimer(this)) + , m_quickPanel(nullptr) { m_tipsLabel->setVisible(false); m_tipsLabel->setObjectName("power"); m_preChargeTimer->setInterval(DELAYTIME); m_preChargeTimer->setSingleShot(true); + initQuickPanel(); connect(m_preChargeTimer,&QTimer::timeout,this,&PowerPlugin::refreshTipsData); } @@ -70,6 +74,8 @@ QWidget *PowerPlugin::itemWidget(const QString &itemKey) { if (itemKey == POWER_KEY) return m_powerStatusWidget.data(); + if (itemKey == QUICK_ITEM_KEY) + return m_quickPanel; return nullptr; } @@ -99,7 +105,7 @@ void PowerPlugin::init(PluginProxyInterface *proxyInter) const QString PowerPlugin::itemCommand(const QString &itemKey) { if (itemKey == POWER_KEY) - return QString("dbus-send --print-reply --dest=org.deepin.dde.ControlCenter1 /org/deepin/dde/ControlCenter1 org.deepin.dde.ControlCenter1.ShowPage \"string:power\""); + return QString("dbus-send --print-reply --dest=org.deepin.dde.ControlCenter1 /org/deepin/dde/ControlCenter1 org.deepin.dde.ControlCenter1.ShowPage string:power"); return QString(); } @@ -143,9 +149,14 @@ void PowerPlugin::setSortKey(const QString &itemKey, const int order) QIcon PowerPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { - // 电池插件不显示在快捷面板上,因此此处返回空图标 - static QIcon batteryIcon; const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(themeType); + // 快捷面板使用m_quickPanel + if (dockPart == DockPart::QuickPanel) { + m_imageLabel->setPixmap(pixmap); + return QIcon(); + } + + static QIcon batteryIcon; batteryIcon.detach(); batteryIcon.addPixmap(pixmap); return batteryIcon; @@ -153,11 +164,12 @@ QIcon PowerPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorTy PluginFlags PowerPlugin::flags() const { - // 电池插件只在任务栏上面展示,不在快捷面板展示,并且可以拖动,可以在其前面插入其他插件,不能在控制中心设置是否显示隐藏 + // 电池插件在任务栏上面展示,在快捷面板展示,并且可以拖动,可以在其前面插入其他插件,能在控制中心设置是否显示隐藏 return PluginFlag::Type_Common | PluginFlag::Attribute_CanDrag | PluginFlag::Attribute_CanInsert - | PluginFlag::Attribute_ForceDock; + | PluginFlag::Attribute_CanSetting + | PluginFlag::Quick_Single; } void PowerPlugin::updateBatteryVisible() @@ -182,6 +194,8 @@ void PowerPlugin::loadPlugin() m_powerStatusWidget.reset(new PowerStatusWidget); connect(m_powerStatusWidget.get(), &PowerStatusWidget::iconChanged, this, [ this ] { + m_proxyInter->updateDockInfo(this, DockPart::QuickPanel); + m_proxyInter->updateDockInfo(this, DockPart::QuickShow); m_proxyInter->itemUpdate(this, POWER_KEY); }); @@ -226,7 +240,7 @@ void PowerPlugin::refreshTipsData() const uint percentage = qMin(100.0, qMax(0.0, data.value("Display"))); const QString value = QString("%1%").arg(std::round(percentage)); const int batteryState = m_powerInter->batteryState()["Display"]; - + m_labelText->setText(value); if (m_preChargeTimer->isActive() && m_showTimeToFull) { // 插入电源后,20秒内算作预充电时间,此时计算剩余充电时间是不准确的 QString tips = tr("Capacity %1 ...").arg(value); @@ -274,3 +288,25 @@ void PowerPlugin::refreshTipsData() m_tipsLabel->setText(tips); } } + +void PowerPlugin::initQuickPanel() +{ + m_quickPanel = new QWidget(); + QVBoxLayout *layout = new QVBoxLayout(m_quickPanel); + layout->setAlignment(Qt::AlignVCenter); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + m_imageLabel = new QLabel(m_quickPanel); + m_imageLabel->setObjectName("imageLabel"); + m_imageLabel->setFixedHeight(24); + m_imageLabel->setAlignment(Qt::AlignCenter); + + m_labelText = new QLabel(m_quickPanel); + m_labelText->setObjectName("textLabel"); + m_labelText->setFixedHeight(11); + m_labelText->setAlignment(Qt::AlignCenter); + m_labelText->setFont(Dtk::Widget::DFontSizeManager::instance()->t10()); + layout->addWidget(m_imageLabel); + layout->addSpacing(7); + layout->addWidget(m_labelText); +} diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index 9c4a106f7..088792cd7 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -62,6 +62,7 @@ private: void loadPlugin(); void onGSettingsChanged(const QString &key); void refreshTipsData(); + void initQuickPanel(); private: bool m_pluginLoaded; @@ -73,6 +74,9 @@ private: SystemPowerInter *m_systemPowerInter; DBusPower *m_powerInter; QTimer *m_preChargeTimer; + QWidget *m_quickPanel; + QLabel *m_imageLabel; + QLabel *m_labelText; }; #endif // POWERPLUGIN_H From da1b436796f6516018f5e803398c5e8223927e8e Mon Sep 17 00:00:00 2001 From: donghualin Date: Tue, 31 Jan 2023 10:55:04 +0800 Subject: [PATCH 248/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=8E=87=E4=B8=8B=E5=9B=BE=E6=A0=87=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、高缩放率下计算图标任务栏尺寸需要乘以缩放率的数值 2、加载声音图标带上具体的后缀名,否则会出现图标显示异常 3、自定义图标的尺寸的显示,需要重新计算图标的宽度 Log: 修复高分屏下图标显示异常 Influence: 高分屏,高缩放率,观察任务栏插件区域的图标 Bug: https://pms.uniontech.com/bug-view-183543.html Bug: https://pms.uniontech.com/bug-view-184089.html Change-Id: Iaa8833b20608129e5c10c8614702a9e5afeae2d9 --- frame/window/docktraywindow.cpp | 2 +- frame/window/mainpanelcontrol.cpp | 184 ++++-------------- frame/window/mainpanelcontrol.h | 7 +- frame/window/mainwindow.cpp | 7 - frame/window/mainwindow.h | 1 - frame/window/quickpluginwindow.cpp | 20 +- frame/window/quickpluginwindow.h | 3 +- frame/window/systempluginwindow.cpp | 20 +- frame/window/traymanagerwindow.cpp | 3 +- .../pluginmanager/quicksettingcontainer.cpp | 2 +- plugins/sound/sounditem.cpp | 2 + 11 files changed, 69 insertions(+), 182 deletions(-) diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 35a9942d7..62c701df0 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -52,7 +52,7 @@ DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent) , m_toolLineLabel(new QLabel(this)) , m_dateTimeWidget(new DateTimeDisplayer(true, this)) , m_systemPuginWidget(new SystemPluginWindow(dockInter, this)) - , m_quickIconWidget(new QuickPluginWindow(this)) + , m_quickIconWidget(new QuickPluginWindow(Dock::DisplayMode::Efficient, this)) , m_trayView(new TrayGridView(this)) , m_model(TrayModel::getDockModel()) , m_delegate(new TrayDelegate(m_trayView, this)) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index c6f6df6d7..617cf2785 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -89,7 +89,6 @@ MainPanelControl::MainPanelControl(DockInter *dockInter, QWidget *parent) , m_multiWindowLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_multiWindowWidget)) , m_toolSonAreaWidget(new QWidget(m_toolAreaWidget)) , m_toolSonLayout(new QBoxLayout(QBoxLayout::LeftToRight, m_toolSonAreaWidget)) - , m_pluginLayout(new QBoxLayout(QBoxLayout::LeftToRight, this)) , m_position(Position::Bottom) , m_placeholderItem(nullptr) , m_appDragWidget(nullptr) @@ -226,13 +225,11 @@ void MainPanelControl::updateMainPanelLayout() m_appAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_mainPanelLayout->setDirection(QBoxLayout::LeftToRight); m_fixedAreaLayout->setDirection(QBoxLayout::LeftToRight); - m_pluginLayout->setDirection(QBoxLayout::LeftToRight); m_appAreaSonLayout->setDirection(QBoxLayout::LeftToRight); m_recentLayout->setDirection(QBoxLayout::LeftToRight); m_multiWindowLayout->setDirection(QBoxLayout::LeftToRight); m_toolAreaLayout->setDirection(QBoxLayout::LeftToRight); m_toolSonLayout->setDirection(QBoxLayout::LeftToRight); - m_pluginLayout->setContentsMargins(10, 0, 10, 0); m_multiWindowLayout->setContentsMargins(0, 2, 0, 2); break; case Position::Right: @@ -241,13 +238,11 @@ void MainPanelControl::updateMainPanelLayout() m_appAreaWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_mainPanelLayout->setDirection(QBoxLayout::TopToBottom); m_fixedAreaLayout->setDirection(QBoxLayout::TopToBottom); - m_pluginLayout->setDirection(QBoxLayout::TopToBottom); m_appAreaSonLayout->setDirection(QBoxLayout::TopToBottom); m_recentLayout->setDirection(QBoxLayout::TopToBottom); m_multiWindowLayout->setDirection(QBoxLayout::TopToBottom); m_toolAreaLayout->setDirection(QBoxLayout::TopToBottom); m_toolSonLayout->setDirection(QBoxLayout::TopToBottom); - m_pluginLayout->setContentsMargins(0, 10, 0, 10); m_multiWindowLayout->setContentsMargins(2, 0, 2, 0); break; } @@ -409,7 +404,6 @@ void MainPanelControl::insertItem(int index, DockItem *item) resizeDockIcon(); item->checkEntry(); - QTimer::singleShot(0, this, &MainPanelControl::updatePluginsLayout); } /**从任务栏移除某一应用,并更新任务栏图标大小 @@ -455,17 +449,7 @@ void MainPanelControl::moveItem(DockItem *sourceItem, DockItem *targetItem) int idx = -1; if (targetItem->itemType() == DockItem::App) idx = m_appAreaSonLayout->indexOf(targetItem); - else if (targetItem->itemType() == DockItem::Plugins){ - //因为日期时间插件大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局 - //因此有拖动图标时,需要从多的一层布局中判断是否相同插件而获取插件位置顺序 - for (int i = 0; i < m_pluginLayout->count(); ++i) { - QLayout *layout = m_pluginLayout->itemAt(i)->layout(); - if (layout && layout->itemAt(0)->widget() == targetItem) { - idx = i; - break; - } - } - } else if (targetItem->itemType() == DockItem::FixedPlugin) + else if (targetItem->itemType() == DockItem::FixedPlugin) idx = m_fixedAreaLayout->indexOf(targetItem); else return; @@ -955,22 +939,6 @@ void MainPanelControl::moveAppSonWidget() m_appAreaSonWidget->move(rect.x(), rect.y()); } -/**通知布局器,控件已发生变化,需要重新设置几何位置 - * @brief MainPanelControl::updatePluginsLayout - */ -void MainPanelControl::updatePluginsLayout() -{ - for (int i = 0; i < m_pluginLayout->count(); ++i) { - QLayout *layout = m_pluginLayout->itemAt(i)->layout(); - if (layout) { - PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); - if (pItem && pItem->sizeHint().width() != -1) { - pItem->updateGeometry(); - } - } - } -} - void MainPanelControl::updateDockInter(DockInter *dockInter) { m_dockInter = dockInter; @@ -998,21 +966,30 @@ QSize MainPanelControl::suitableSize(const Position &position, int screenSize, d } // 如果是特效模式 - int totalLength = static_cast(screenSize / ratio); + int totalLength = getScreenSize(); // 减去插件区域的尺寸 - totalLength -= trayAreaSize(); + totalLength -= trayAreaSize(ratio); + + if (m_fixedSpliter->isVisible()) + totalLength -= SPLITER_SIZE; + if (m_appSpliter->isVisible()) + totalLength -= SPLITER_SIZE; + if (m_recentSpliter->isVisible()) + totalLength -= SPLITER_SIZE; + // 需要参与计算的图标的总数 int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + m_recentLayout->count() + m_toolSonLayout->count(); int multiWindowCount = m_multiWindowLayout->count(); if (iconCount <= 0 && multiWindowCount <= 0) { if (position == Position::Top || position == Position::Bottom) - return QSize((static_cast(dockSize / ratio)), dockSize); + return QSize((static_cast(dockSize)), dockSize); - return QSize(dockSize, static_cast(dockSize / ratio)); + return QSize(dockSize, static_cast(dockSize)); } + int redundantLength = (totalLength % iconCount); // icon宽度 = (总宽度-余数)/icon个数 - int iconSize = qMin(((totalLength - redundantLength) / iconCount), dockSize); + int iconSize = qMin((static_cast((totalLength - redundantLength) / iconCount / ratio)), dockSize); if (position == Position::Top || position == Position::Bottom) { int spliterWidth = m_fixedSpliter->isVisible() ? SPLITER_SIZE : 0; @@ -1034,10 +1011,10 @@ QSize MainPanelControl::suitableSize(const Position &position, int screenSize, d } } - int panelWidth = qMin(iconSize * iconCount + multiSize + static_cast(spliterWidth / ratio), - static_cast((screenSize - DOCKSPACE) / deviceRatio)); + int panelWidth = qMin(iconSize * iconCount + multiSize + static_cast(spliterWidth), + static_cast((screenSize - DOCKSPACE))); - return QSize(panelWidth, static_cast(dockSize / ratio)); + return QSize(panelWidth, static_cast(dockSize)); } int spliterHeight = m_fixedSpliter->isVisible() ? SPLITER_SIZE : 0; @@ -1059,8 +1036,8 @@ QSize MainPanelControl::suitableSize(const Position &position, int screenSize, d } } - int panelHeight = qMin(iconSize * iconCount + multiSize + static_cast(spliterHeight / ratio), - static_cast((screenSize - DOCKSPACE)/ deviceRatio)); + int panelHeight = qMin(iconSize * iconCount + multiSize + static_cast(spliterHeight), + static_cast((screenSize - DOCKSPACE))); return QSize(dockSize, panelHeight); } @@ -1111,10 +1088,10 @@ int MainPanelControl::getScreenSize() const return screenRect.height(); } -int MainPanelControl::trayAreaSize() const +int MainPanelControl::trayAreaSize(qreal ratio) const { if (m_displayMode == Dock::DisplayMode::Efficient) - return (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom ? m_tray->width() : m_tray->height()); + return (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom ? m_tray->width() * ratio: m_tray->height() * ratio); int length = 0; QWidgetList topLevelWidgets = qApp->topLevelWidgets(); @@ -1123,10 +1100,11 @@ int MainPanelControl::trayAreaSize() const if (!topWindow) continue; - if (topWindow->windowType() != MainWindowBase::DockWindowType::MainWindow) - length += (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom ? topWindow->width() : topWindow->height()); + if (topWindow->windowType() != MainWindowBase::DockWindowType::MainWindow) { + length += (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom ? topWindow->width() * ratio : topWindow->height() * ratio); + } - length += topWindow->dockSpace(); + length += topWindow->dockSpace() * ratio; } return length; @@ -1138,7 +1116,6 @@ int MainPanelControl::trayAreaSize() const void MainPanelControl::resizeDockIcon() { int iconSize = 0; - int tray_item_size = 0; // 总宽度 if (m_displayMode == DisplayMode::Fashion) { // 时尚模式 @@ -1152,7 +1129,7 @@ void MainPanelControl::resizeDockIcon() if (iconCount <= 0) return; - int totalLength = getScreenSize() - trayAreaSize(); + int totalLength = getScreenSize() - trayAreaSize(qApp->devicePixelRatio()); if (m_fixedSpliter->isVisible()) totalLength -= SPLITER_SIZE; @@ -1165,26 +1142,8 @@ void MainPanelControl::resizeDockIcon() 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; - - // 余数 - yu = (totalLength % iconCount); - // icon宽度 = (总宽度-余数)/icon个数 - iconSize = (totalLength - yu) / iconCount; } else { - int totalLength = ((m_position == Position::Top) || (m_position == Position::Bottom)) ? width() : height(); - totalLength -= trayAreaSize(); + int totalLength = getScreenSize() - trayAreaSize(qApp->devicePixelRatio()); // 减去3个分割线的宽度 if (m_fixedSpliter->isVisible()) totalLength -= SPLITER_SIZE; @@ -1193,34 +1152,8 @@ void MainPanelControl::resizeDockIcon() if (m_recentSpliter->isVisible()) totalLength -= SPLITER_SIZE; - 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(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 ++; - } - } - } // 减去插件间隔大小, 只有一个插件或没有插件都是间隔20,2个或以上每多一个插件多间隔10 - if (pluginItemCount > 1) - totalLength -= (pluginItemCount + 1) * 10; - else - totalLength -= 20; + totalLength -= 20; if (totalLength < 0) return; @@ -1236,19 +1169,6 @@ void MainPanelControl::resizeDockIcon() // 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; - // 余数 yu = (totalLength % iconCount); // icon宽度 = (总宽度-余数)/icon个数 @@ -1258,20 +1178,20 @@ void MainPanelControl::resizeDockIcon() iconSize = iconSize / qApp->devicePixelRatio(); if ((m_position == Position::Top) || (m_position == Position::Bottom)) { if (iconSize >= height()) { - calcuDockIconSize(height(), height(), tray_item_size); + calcuDockIconSize(height(), height()); } else { - calcuDockIconSize(iconSize, height(), tray_item_size); + calcuDockIconSize(iconSize, height()); } } else { if (iconSize >= width()) { - calcuDockIconSize(width(), width(), tray_item_size); + calcuDockIconSize(width(), width()); } else { - calcuDockIconSize(width(), iconSize, tray_item_size); + calcuDockIconSize(width(), iconSize); } } } -void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) +void MainPanelControl::calcuDockIconSize(int w, int h) { int appItemSize = qMin(w, h); for (int i = 0; i < m_fixedAreaLayout->count(); ++i) @@ -1361,42 +1281,6 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize) } } - // 因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局 - // 因此需要通过多一层布局来获取各插件 - if ((m_position == Position::Top) || (m_position == Position::Bottom)) { - // 三方插件 - for (int i = 0; i < m_pluginLayout->count(); ++ i) { - QLayout *layout = m_pluginLayout->itemAt(i)->layout(); - if (!layout || !layout->itemAt(0)) - continue; - - PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); - if (!pItem) - continue; - - if (pItem->sizeHint().height() == -1) - pItem->setFixedSize(traySize, traySize); - else if (pItem->sizeHint().height() > height()) - pItem->resize(pItem->width(), height()); - } - } else { - // 三方插件 - for (int i = 0; i < m_pluginLayout->count(); i++) { - QLayout *layout = m_pluginLayout->itemAt(i)->layout(); - if (!layout || !layout->itemAt(0)) - continue; - - PluginsItem *pItem = qobject_cast(layout->itemAt(0)->widget()); - if (!pItem) - continue; - - if (pItem->sizeHint().width() == -1) - pItem->setFixedSize(traySize, traySize); - else if (pItem->sizeHint().width() > width()) - pItem->resize(width(), pItem->height()); - } - } - int appTopAndBottomMargin = 0; int appLeftAndRightMargin = 0; diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 061bc776a..a5cb482cb 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -51,7 +51,6 @@ public: void setPositonValue(Position position); void setDisplayMode(DisplayMode dislayMode); void resizeDockIcon(); - void updatePluginsLayout(); void updateDockInter(DockInter *dockInter); QSize suitableSize(const Position &position, int screenSize, double deviceRatio) const; @@ -79,14 +78,14 @@ private: void removeFixedAreaItem(QWidget *wdg); void removeAppAreaItem(QWidget *wdg); int getScreenSize() const; - int trayAreaSize() const; + int trayAreaSize(qreal ratio) const; // 拖拽相关 void startDrag(DockItem *); DockItem *dropTargetItem(DockItem *sourceItem, QPoint point); void moveItem(DockItem *sourceItem, DockItem *targetItem); void handleDragMove(QDragMoveEvent *e, bool isFilter); - void calcuDockIconSize(int w, int h, int traySize); + void calcuDockIconSize(int w, int h); bool checkNeedShowDesktop(); bool appIsOnDock(const QString &appDesktop); void dockRecentApp(DockItem *dockItem); @@ -129,8 +128,6 @@ private: QWidget *m_toolSonAreaWidget; // 工具区域,用来存放回收站等工具 QBoxLayout *m_toolSonLayout; // 工具区域布局 - QBoxLayout *m_pluginLayout; // 插件区域布局 - Position m_position; QPointer m_placeholderItem; QString m_draggingMimeKey; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 8c5346b1f..a9a7d9e73 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -69,13 +69,6 @@ MainWindow::MainWindow(MultiScreenWorker *multiScreenWorker, QWidget *parent) m_mainPanel->insertItem(-1, item); } -void MainWindow::resizeEvent(QResizeEvent *event) -{ - MainWindowBase::resizeEvent(event); - - m_mainPanel->updatePluginsLayout(); -} - void MainWindow::initConnections() { connect(DockItemManager::instance(), &DockItemManager::itemInserted, m_mainPanel, &MainPanelControl::insertItem, Qt::DirectConnection); diff --git a/frame/window/mainwindow.h b/frame/window/mainwindow.h index 5f9f83467..c2796d7ce 100644 --- a/frame/window/mainwindow.h +++ b/frame/window/mainwindow.h @@ -64,7 +64,6 @@ public: private: using QWidget::show; - void resizeEvent(QResizeEvent *event) override; void initConnections(); void resizeDockIcon(); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index d3fffc94b..e47af5bd7 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -87,12 +87,13 @@ typedef struct DragInfo{ } } DragInfo; -QuickPluginWindow::QuickPluginWindow(QWidget *parent) +QuickPluginWindow::QuickPluginWindow(Dock::DisplayMode displayMode, QWidget *parent) : QWidget(parent) , m_mainLayout(new QBoxLayout(QBoxLayout::RightToLeft, this)) , m_position(Dock::Position::Bottom) , m_dragInfo(new DragInfo) , m_dragEnterMimeData(nullptr) + , m_displayMode(displayMode) { initUi(); initConnection(); @@ -115,7 +116,9 @@ void QuickPluginWindow::initUi() m_mainLayout->setDirection(QBoxLayout::RightToLeft); m_mainLayout->setContentsMargins(0, 0, 0, 0); m_mainLayout->setSpacing(ITEMSPACE); - m_mainLayout->addSpacing(STARTSPACE); + // 时尚模式下的插件右侧的区域增加空白的间隔 + if (m_displayMode == Dock::DisplayMode::Fashion) + m_mainLayout->addSpacing(STARTSPACE); } void QuickPluginWindow::setPositon(Position position) @@ -397,6 +400,7 @@ void QuickPluginWindow::onRequestUpdate() itemWidget = pluginItems[item]; } else { itemWidget = new QuickDockItem(item, quickController->itemKey(item), this); + itemWidget->setPosition(m_position); updateDockItemSize(itemWidget); itemWidget->installEventFilter(this); itemWidget->setMouseTracking(true); @@ -783,12 +787,20 @@ QSize QuickDockItem::suitableSize() const if (!pixmap.isNull()) { QSize size = pixmap.size(); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - if (size.width() < widgetSize) + if (size.width() < widgetSize) { size.setWidth(widgetSize); + } else { + int scaleWidth = size.width() / (size.height() / (widgetSize * 1.0f)); + size.setWidth(scaleWidth); + } return size; } - if (size.height() < widgetSize) + if (size.height() < widgetSize) { size.setHeight(widgetSize); + } else { + int scaleHeight = size.height() / (size.width() / (widgetSize * 1.0f)); + size.setHeight(scaleHeight); + } return size; } diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 4914b7805..e0351f912 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -47,7 +47,7 @@ class QuickPluginWindow : public QWidget Q_OBJECT public: - explicit QuickPluginWindow(QWidget *parent = nullptr); + explicit QuickPluginWindow(Dock::DisplayMode displayMode, QWidget *parent = nullptr); ~QuickPluginWindow() override; void setPositon(Dock::Position position); @@ -93,6 +93,7 @@ private: Dock::Position m_position; struct DragInfo *m_dragInfo; QuickPluginMimeData *m_dragEnterMimeData; + Dock::DisplayMode m_displayMode; }; // 用于在任务栏上显示的插件 diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 6a9973d35..de11624ef 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -210,6 +210,7 @@ void SystemPluginWindow::onPluginItemUpdated(PluginsItemInterface *pluginItem) item->update(); } +// 图标的尺寸 #define ICONSIZE 20 #define ICONTEXTSPACE 6 #define PLUGIN_ITEM_DRAG_THRESHOLD 20 @@ -293,20 +294,21 @@ void StretchPluginsItem::paintEvent(QPaintEvent *event) QSize StretchPluginsItem::suitableSize(const Position &position) const { - int iconSize = static_cast(ICONSIZE * (qApp->devicePixelRatio())); if (position == Dock::Position::Top || position == Dock::Position::Bottom) { 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); + return QSize(qMax(textWidth, ICONSIZE) + (m_displayMode == Dock::DisplayMode::Efficient ? 5 : 10) * 2, -1); } - int height = 6; // 图标上边距6 - height += iconSize; // 图标尺寸20 - height += ICONTEXTSPACE; // 图标与文字间距6 - if (needShowText()) // 只有在显示文本的时候才计算文本的高度 - height += QFontMetrics(textFont(position)).height(); // 文本高度 - height += 4; // 下间距4 + int height = 6; // 图标上边距6 + height += ICONSIZE; // 图标尺寸20 + if (m_displayMode == Dock::DisplayMode::Fashion) { + height += ICONTEXTSPACE; // 图标与文字间距6 + if (needShowText()) // 只有在显示文本的时候才计算文本的高度 + height += QFontMetrics(textFont(position)).height(); // 文本高度 + } + height += 4; // 下间距4 return QSize(-1, height); } @@ -338,8 +340,6 @@ bool StretchPluginsItem::needShowText() const if (m_displayMode == Dock::DisplayMode::Efficient) return false; - // 图标的尺寸 -#define ICONSIZE 20 // 图标与文本,图标距离上方和文本距离下方的尺寸 #define SPACEMARGIN 6 // 文本的高度 diff --git a/frame/window/traymanagerwindow.cpp b/frame/window/traymanagerwindow.cpp index a2ae6b565..45d46da5c 100644 --- a/frame/window/traymanagerwindow.cpp +++ b/frame/window/traymanagerwindow.cpp @@ -56,7 +56,7 @@ TrayManagerWindow::TrayManagerWindow(QWidget *parent) , 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_quickIconWidget(new QuickPluginWindow(Dock::DisplayMode::Fashion, m_appPluginWidget)) , m_dateTimeWidget(new DateTimeDisplayer(false, m_appPluginDatetimeWidget)) , m_appPluginLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) , m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this)) @@ -161,7 +161,6 @@ void TrayManagerWindow::setPositon(Dock::Position position) void TrayManagerWindow::setDisplayMode(Dock::DisplayMode displayMode) { m_displayMode = displayMode; - m_systemPluginWidget->setDisplayMode(displayMode); // 如果当前模式为高效模式,则设置当前的trayView为其计算位置的参照 if (displayMode == Dock::DisplayMode::Fashion) { ExpandIconWidget::popupTrayView()->setReferGridView(m_trayView); diff --git a/plugins/pluginmanager/quicksettingcontainer.cpp b/plugins/pluginmanager/quicksettingcontainer.cpp index fb56a2206..8838ae01e 100644 --- a/plugins/pluginmanager/quicksettingcontainer.cpp +++ b/plugins/pluginmanager/quicksettingcontainer.cpp @@ -109,7 +109,7 @@ bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event) case QEvent::MouseButtonPress: { QMouseEvent *mouseEvent = static_cast(event); QuickSettingItem *item = qobject_cast(watched); - if (item) { + if (item && item->pluginItem()->flags() & PluginFlag::Attribute_CanDrag) { m_dragInfo->dragPosition = mouseEvent->pos(); m_dragInfo->dragItem = item; m_dragInfo->pluginInter = item->pluginItem(); diff --git a/plugins/sound/sounditem.cpp b/plugins/sound/sounditem.cpp index 116ec665c..8e10418e5 100644 --- a/plugins/sound/sounditem.cpp +++ b/plugins/sound/sounditem.cpp @@ -283,6 +283,8 @@ QPixmap SoundItem::pixmap(DGuiApplicationHelper::ColorType colorType, int iconWi if (colorType == DGuiApplicationHelper::LightType) iconString.append(PLUGIN_MIN_ICON_NAME); + iconString.append(".svg"); + return ImageUtil::loadSvg(":/" + iconString, QSize(iconWidth, iconHeight)); } From 5652e2a49aeac5a2f9165e9969ec93987c82c9d7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 1 Feb 2023 13:29:58 +0800 Subject: [PATCH 249/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E4=B8=BB=E9=A2=98=E5=8F=98=E5=8C=96=E5=90=8E=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=9D=A2=E6=9D=BF=E7=94=B5=E6=B1=A0=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、电池图标响应主题变化来重新设置图标 2、修改控制中心电池名称的文案 Log: 修改系统主题变化后快捷面板电池颜色显示错误的问题 Influence: 打开快捷面板,在控制中心更改系统颜色,观察快捷面板中系统电池图标是否跟随系统颜色变化 Bug: https://pms.uniontech.com/bug-view-184085.html Change-Id: If02b8800b4d90696c2dc74ac43ebc230233f0f58 --- plugins/power/powerplugin.cpp | 34 ++++++++++++++++++++++++---------- plugins/power/powerplugin.h | 6 +++++- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/plugins/power/powerplugin.cpp b/plugins/power/powerplugin.cpp index 3c5ff341a..963478eda 100644 --- a/plugins/power/powerplugin.cpp +++ b/plugins/power/powerplugin.cpp @@ -52,12 +52,8 @@ PowerPlugin::PowerPlugin(QObject *parent) , m_preChargeTimer(new QTimer(this)) , m_quickPanel(nullptr) { - m_tipsLabel->setVisible(false); - m_tipsLabel->setObjectName("power"); - m_preChargeTimer->setInterval(DELAYTIME); - m_preChargeTimer->setSingleShot(true); - initQuickPanel(); - connect(m_preChargeTimer,&QTimer::timeout,this,&PowerPlugin::refreshTipsData); + initUi(); + initConnection(); } const QString PowerPlugin::pluginName() const @@ -67,7 +63,7 @@ const QString PowerPlugin::pluginName() const const QString PowerPlugin::pluginDisplayName() const { - return tr("Power"); + return tr("Battery"); } QWidget *PowerPlugin::itemWidget(const QString &itemKey) @@ -100,6 +96,8 @@ void PowerPlugin::init(PluginProxyInterface *proxyInter) m_proxyInter = proxyInter; loadPlugin(); + + onThemeTypeChanged(DGuiApplicationHelper::instance()->themeType()); } const QString PowerPlugin::itemCommand(const QString &itemKey) @@ -149,13 +147,12 @@ void PowerPlugin::setSortKey(const QString &itemKey, const int order) QIcon PowerPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) { - const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(themeType); // 快捷面板使用m_quickPanel if (dockPart == DockPart::QuickPanel) { - m_imageLabel->setPixmap(pixmap); return QIcon(); } + const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(themeType); static QIcon batteryIcon; batteryIcon.detach(); batteryIcon.addPixmap(pixmap); @@ -289,8 +286,19 @@ void PowerPlugin::refreshTipsData() } } -void PowerPlugin::initQuickPanel() +void PowerPlugin::onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType) { + const QPixmap pixmap = m_powerStatusWidget->getBatteryIcon(themeType); + m_imageLabel->setPixmap(pixmap); +} + +void PowerPlugin::initUi() +{ + m_tipsLabel->setVisible(false); + m_tipsLabel->setObjectName("power"); + m_preChargeTimer->setInterval(DELAYTIME); + m_preChargeTimer->setSingleShot(true); + m_quickPanel = new QWidget(); QVBoxLayout *layout = new QVBoxLayout(m_quickPanel); layout->setAlignment(Qt::AlignVCenter); @@ -310,3 +318,9 @@ void PowerPlugin::initQuickPanel() layout->addSpacing(7); layout->addWidget(m_labelText); } + +void PowerPlugin::initConnection() +{ + connect(m_preChargeTimer,&QTimer::timeout,this,&PowerPlugin::refreshTipsData); + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &PowerPlugin::onThemeTypeChanged); +} diff --git a/plugins/power/powerplugin.h b/plugins/power/powerplugin.h index 088792cd7..9fa60c224 100644 --- a/plugins/power/powerplugin.h +++ b/plugins/power/powerplugin.h @@ -61,8 +61,12 @@ private: void updateBatteryVisible(); void loadPlugin(); void onGSettingsChanged(const QString &key); + void initUi(); + void initConnection(); + +private slots: void refreshTipsData(); - void initQuickPanel(); + void onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType); private: bool m_pluginLoaded; From 7b5f164b265d59968e62bdec27ae1c85619ea14c Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 1 Feb 2023 14:25:52 +0800 Subject: [PATCH 250/257] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新翻译文案 Log: 更新翻译文案 Influence: 从笔记本上观察控制中心个性化中电池的文案 Task: https://pms.uniontech.com/task-view-226203.html Change-Id: I5f524a9572ba2dfb9fbb052ef6655b8c3dc14ddf --- translations/dde-dock.ts | 15 ++++++-- translations/dde-dock_af.ts | 19 +++++++--- translations/dde-dock_ak.ts | 19 +++++++--- translations/dde-dock_am_ET.ts | 19 +++++++--- translations/dde-dock_ar.ts | 19 +++++++--- translations/dde-dock_ast.ts | 19 +++++++--- translations/dde-dock_az.ts | 19 +++++++--- translations/dde-dock_bg.ts | 19 +++++++--- translations/dde-dock_bn.ts | 19 +++++++--- translations/dde-dock_bo.ts | 19 +++++++--- translations/dde-dock_ca.ts | 19 +++++++--- translations/dde-dock_cs.ts | 19 +++++++--- translations/dde-dock_da.ts | 19 +++++++--- translations/dde-dock_de.ts | 19 +++++++--- translations/dde-dock_el.ts | 19 +++++++--- translations/dde-dock_en_AU.ts | 19 +++++++--- translations/dde-dock_en_GB.ts | 19 +++++++--- translations/dde-dock_en_US.ts | 19 +++++++--- translations/dde-dock_eo.ts | 19 +++++++--- translations/dde-dock_es.ts | 21 +++++++---- translations/dde-dock_es_MX.ts | 19 +++++++--- translations/dde-dock_fa.ts | 19 +++++++--- translations/dde-dock_fi.ts | 19 +++++++--- translations/dde-dock_fr.ts | 19 +++++++--- translations/dde-dock_gl_ES.ts | 19 +++++++--- translations/dde-dock_he.ts | 19 +++++++--- translations/dde-dock_hi_IN.ts | 19 +++++++--- translations/dde-dock_hr.ts | 19 +++++++--- translations/dde-dock_hu.ts | 19 +++++++--- translations/dde-dock_id.ts | 19 +++++++--- translations/dde-dock_it.ts | 19 +++++++--- translations/dde-dock_ja.ts | 19 +++++++--- translations/dde-dock_ka.ts | 19 +++++++--- translations/dde-dock_kab.ts | 19 +++++++--- translations/dde-dock_kk.ts | 19 +++++++--- translations/dde-dock_ko.ts | 19 +++++++--- translations/dde-dock_lt.ts | 19 +++++++--- translations/dde-dock_mn.ts | 19 +++++++--- translations/dde-dock_ms.ts | 19 +++++++--- translations/dde-dock_nb.ts | 19 +++++++--- translations/dde-dock_ne.ts | 19 +++++++--- translations/dde-dock_nl.ts | 23 ++++++++---- translations/dde-dock_pa.ts | 19 +++++++--- translations/dde-dock_pl.ts | 19 +++++++--- translations/dde-dock_pt.ts | 19 +++++++--- translations/dde-dock_pt_BR.ts | 19 +++++++--- translations/dde-dock_ro.ts | 19 +++++++--- translations/dde-dock_ru.ts | 19 +++++++--- translations/dde-dock_si.ts | 19 +++++++--- translations/dde-dock_sk.ts | 19 +++++++--- translations/dde-dock_sl.ts | 19 +++++++--- translations/dde-dock_sq.ts | 67 +++++++++++++++++++--------------- translations/dde-dock_sr.ts | 19 +++++++--- translations/dde-dock_sv.ts | 19 +++++++--- translations/dde-dock_sw.ts | 19 +++++++--- translations/dde-dock_ta.ts | 19 +++++++--- translations/dde-dock_th.ts | 19 +++++++--- translations/dde-dock_tr.ts | 19 +++++++--- translations/dde-dock_ug.ts | 19 +++++++--- translations/dde-dock_uk.ts | 19 +++++++--- translations/dde-dock_vi.ts | 19 +++++++--- translations/dde-dock_zh_CN.ts | 15 ++++++-- translations/dde-dock_zh_HK.ts | 15 ++++++-- translations/dde-dock_zh_TW.ts | 15 ++++++-- 64 files changed, 851 insertions(+), 403 deletions(-) diff --git a/translations/dde-dock.ts b/translations/dde-dock.ts index 7889f6a9e..cccc01236 100644 --- a/translations/dde-dock.ts +++ b/translations/dde-dock.ts @@ -205,6 +205,13 @@ Multi-Screen Collaboration + + DockPluginController + + The plugin %1 is not compatible with the system. + The plugin %1 is not compatible with the system. + + HomeMonitorPlugin @@ -298,10 +305,6 @@ PowerPlugin - - Power - Power - Capacity %1, %2 min remaining Capacity %1, %2 min remaining @@ -334,6 +337,10 @@ Capacity %1, fully charged Capacity %1, fully charged + + Battery + + ShowDesktopPlugin diff --git a/translations/dde-dock_af.ts b/translations/dde-dock_af.ts index 6be97b2a8..d018401ac 100644 --- a/translations/dde-dock_af.ts +++ b/translations/dde-dock_af.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Krag - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ - Plugged In - + Power + Krag diff --git a/translations/dde-dock_ak.ts b/translations/dde-dock_ak.ts index bb715d0c3..ebd7aa1fc 100644 --- a/translations/dde-dock_ak.ts +++ b/translations/dde-dock_ak.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Power - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reboot - Plugged In - + Power + Power diff --git a/translations/dde-dock_am_ET.ts b/translations/dde-dock_am_ET.ts index 07011c750..b14dee71b 100644 --- a/translations/dde-dock_am_ET.ts +++ b/translations/dde-dock_am_ET.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - ሐይል - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ እንደገና ማስነሻ - Plugged In - + Power + ሐይል diff --git a/translations/dde-dock_ar.ts b/translations/dde-dock_ar.ts index 94db7e7e9..b715c7c12 100644 --- a/translations/dde-dock_ar.ts +++ b/translations/dde-dock_ar.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - الطاقة - Capacity %1, %2 min remaining السعة 1%, 2% دقيقة متبقية @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ إعادة التشغيل - Plugged In - وضع الطاقة + Power + الطاقة diff --git a/translations/dde-dock_ast.ts b/translations/dde-dock_ast.ts index 4b847bb7d..064a8d068 100644 --- a/translations/dde-dock_ast.ts +++ b/translations/dde-dock_ast.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Enerxía - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reaniciar - Plugged In - + Power + Enerxía diff --git a/translations/dde-dock_az.ts b/translations/dde-dock_az.ts index 5808ac260..17c6857e8 100644 --- a/translations/dde-dock_az.ts +++ b/translations/dde-dock_az.ts @@ -203,6 +203,13 @@ Çoxekranlı mübadilə + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Elektrik qidalanması - Capacity %1, %2 min remaining Tutum %1, %2 dəq qalır @@ -332,6 +335,10 @@ Capacity %1, fully charged Tutum %1, tam yükləndi + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Yenidən başlatmaq - Plugged In - Elektrik şəbəkəsinə qoşulu + Power + Elektrik qidalanması diff --git a/translations/dde-dock_bg.ts b/translations/dde-dock_bg.ts index d3192c9bf..563732906 100644 --- a/translations/dde-dock_bg.ts +++ b/translations/dde-dock_bg.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Захранване - Capacity %1, %2 min remaining Капацитет %1, остават %2 минути @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Рестартиране - Plugged In - + Power + Захранване diff --git a/translations/dde-dock_bn.ts b/translations/dde-dock_bn.ts index 975aadc41..9b04079e5 100644 --- a/translations/dde-dock_bn.ts +++ b/translations/dde-dock_bn.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - পাওয়ার - Capacity %1, %2 min remaining ধারণ ক্ষমতা %1, %2 min বাকি আছে @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ পুনঃরায় চালু করুন - Plugged In - + Power + পাওয়ার diff --git a/translations/dde-dock_bo.ts b/translations/dde-dock_bo.ts index 7ff883b82..8a1b1d497 100644 --- a/translations/dde-dock_bo.ts +++ b/translations/dde-dock_bo.ts @@ -203,6 +203,13 @@ གློག་ཀླད་མཐུན་སྦྱོར་སྒྲིག་འགོད། + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - གློག་ཁུངས་དོ་དམ། - Capacity %1, %2 min remaining གློག་ཚད་%1 སྐར་མ་%2ལྷག་འདུག @@ -332,6 +335,10 @@ Capacity %1, fully charged གློག་ཚད་%1 ཁེངས་ཟིན། + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ བསྐྱར་སློང་། - Plugged In - གློག་ཁུངས་སྤྱོད་པ། + Power + གློག་ཁུངས་དོ་དམ། diff --git a/translations/dde-dock_ca.ts b/translations/dde-dock_ca.ts index e0d717041..234a922eb 100644 --- a/translations/dde-dock_ca.ts +++ b/translations/dde-dock_ca.ts @@ -203,6 +203,13 @@ Col·laboració multipantalla + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energia - Capacity %1, %2 min remaining Capacitat: %1, %2 min restants @@ -332,6 +335,10 @@ Capacity %1, fully charged Capacitat: 1%, completament carregada + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reinicia - Plugged In - Connectat + Power + Energia diff --git a/translations/dde-dock_cs.ts b/translations/dde-dock_cs.ts index 485a1e44c..2e6cae348 100644 --- a/translations/dde-dock_cs.ts +++ b/translations/dde-dock_cs.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Napájení - Capacity %1, %2 min remaining Energie %1, %2 min zbývá @@ -332,6 +335,10 @@ Capacity %1, fully charged Kapacita %1, plně nabito + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Restartovat - Plugged In - Napájení z elektrické sítě + Power + Napájení diff --git a/translations/dde-dock_da.ts b/translations/dde-dock_da.ts index 0f2465c54..bd85285ae 100644 --- a/translations/dde-dock_da.ts +++ b/translations/dde-dock_da.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Strøm - Capacity %1, %2 min remaining Kapacitet %1, %2 minutter tilbage @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Genstart - Plugged In - Tilsluttet + Power + Strøm diff --git a/translations/dde-dock_de.ts b/translations/dde-dock_de.ts index e33803b13..eb5758893 100644 --- a/translations/dde-dock_de.ts +++ b/translations/dde-dock_de.ts @@ -203,6 +203,13 @@ Bildschirmübergreifende Zusammenarbeit + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Ausschalten / Abmelden - Capacity %1, %2 min remaining Kapazität %1, %2 Min. verbleibend @@ -332,6 +335,10 @@ Capacity %1, fully charged Kapazität %1, vollständig geladen + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Neu starten - Plugged In - Angeschlossen + Power + Energie diff --git a/translations/dde-dock_el.ts b/translations/dde-dock_el.ts index 475d11d96..ad4f43f0e 100644 --- a/translations/dde-dock_el.ts +++ b/translations/dde-dock_el.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Ενέργεια - Capacity %1, %2 min remaining Χωρητικότητα %1, απομένουν %2 λεπτά @@ -332,6 +335,10 @@ Capacity %1, fully charged Χωρητικότητα %1, πλήρης φόρτιση + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Επανεκκίνηση - Plugged In - Στην πρίζα + Power + Ενέργεια diff --git a/translations/dde-dock_en_AU.ts b/translations/dde-dock_en_AU.ts index c620297ee..5cef8a0c0 100644 --- a/translations/dde-dock_en_AU.ts +++ b/translations/dde-dock_en_AU.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Power - Capacity %1, %2 min remaining Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reboot - Plugged In - Plugged In + Power + Power diff --git a/translations/dde-dock_en_GB.ts b/translations/dde-dock_en_GB.ts index 3ed822c51..6ee01041e 100644 --- a/translations/dde-dock_en_GB.ts +++ b/translations/dde-dock_en_GB.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Power - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reboot - Plugged In - + Power + Power diff --git a/translations/dde-dock_en_US.ts b/translations/dde-dock_en_US.ts index a97b5ae6e..2bde7e4f0 100644 --- a/translations/dde-dock_en_US.ts +++ b/translations/dde-dock_en_US.ts @@ -203,6 +203,13 @@ Multi-Screen Collaboration + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Power - Capacity %1, %2 min remaining Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reboot - Plugged In - Plugged In + Power + Power diff --git a/translations/dde-dock_eo.ts b/translations/dde-dock_eo.ts index 23cfcce07..f4581db3f 100644 --- a/translations/dde-dock_eo.ts +++ b/translations/dde-dock_eo.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Ŝalto - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Restartigi - Plugged In - + Power + Ŝalto diff --git a/translations/dde-dock_es.ts b/translations/dde-dock_es.ts index c6fc8f427..06948e82e 100644 --- a/translations/dde-dock_es.ts +++ b/translations/dde-dock_es.ts @@ -203,6 +203,13 @@ Colaboración multipantalla + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -273,7 +280,7 @@ Dock settings - Ajustes del dock + Ajustes del muelle @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energía - Capacity %1, %2 min remaining Capacidad %1, %2 min restante @@ -332,6 +335,10 @@ Capacity %1, fully charged Capacidad %1, completamente cargada + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reiniciar - Plugged In - Enchufado + Power + Energía diff --git a/translations/dde-dock_es_MX.ts b/translations/dde-dock_es_MX.ts index c42736e14..493a2dbc1 100644 --- a/translations/dde-dock_es_MX.ts +++ b/translations/dde-dock_es_MX.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energía - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ - Plugged In - + Power + Energía diff --git a/translations/dde-dock_fa.ts b/translations/dde-dock_fa.ts index 23e517c77..f461ed788 100644 --- a/translations/dde-dock_fa.ts +++ b/translations/dde-dock_fa.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - منبع قدرت - Capacity %1, %2 min remaining ظرفیت %1, %2 دقیقه باقی مانده است @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ راه اندازی مجدد - Plugged In - متصل شده به برق + Power + منبع قدرت diff --git a/translations/dde-dock_fi.ts b/translations/dde-dock_fi.ts index 56d0c3b66..c4b1931ba 100644 --- a/translations/dde-dock_fi.ts +++ b/translations/dde-dock_fi.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Virta - Capacity %1, %2 min remaining Akku %1, %2 min jäljellä @@ -332,6 +335,10 @@ Capacity %1, fully charged Varaus %1, täyteen ladattu + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Käynnistä - Plugged In - Kytketty + Power + Virta diff --git a/translations/dde-dock_fr.ts b/translations/dde-dock_fr.ts index d5914c562..6161e669b 100644 --- a/translations/dde-dock_fr.ts +++ b/translations/dde-dock_fr.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Alimentation - Capacity %1, %2 min remaining Capacité %1, %2 minutes restantes @@ -332,6 +335,10 @@ Capacity %1, fully charged Capacité %1, complètement chargé + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Redémarrer - Plugged In - Branché + Power + Alimentation diff --git a/translations/dde-dock_gl_ES.ts b/translations/dde-dock_gl_ES.ts index 732d76e21..9ea6e11f1 100644 --- a/translations/dde-dock_gl_ES.ts +++ b/translations/dde-dock_gl_ES.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Enerxía - Capacity %1, %2 min remaining Capacidade %1, %2 minutos restantes @@ -332,6 +335,10 @@ Capacity %1, fully charged Capacidade %1, totalmente cargada + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reiniciar - Plugged In - Enchufado + Power + Enerxía diff --git a/translations/dde-dock_he.ts b/translations/dde-dock_he.ts index 0339b287f..8a227ba09 100644 --- a/translations/dde-dock_he.ts +++ b/translations/dde-dock_he.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - צריכת חשמל - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ - Plugged In - + Power + צריכת חשמל diff --git a/translations/dde-dock_hi_IN.ts b/translations/dde-dock_hi_IN.ts index 80ccf9dc3..9e4e92197 100644 --- a/translations/dde-dock_hi_IN.ts +++ b/translations/dde-dock_hi_IN.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - पॉवर - Capacity %1, %2 min remaining क्षमता %1, %2 मिनट शेष @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ पुनः आरंभ करें - Plugged In - + Power + पॉवर diff --git a/translations/dde-dock_hr.ts b/translations/dde-dock_hr.ts index e821f9879..8e8fb7e4d 100644 --- a/translations/dde-dock_hr.ts +++ b/translations/dde-dock_hr.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energija - Capacity %1, %2 min remaining Kapacitet %1, %2 min preostalo @@ -332,6 +335,10 @@ Capacity %1, fully charged Kapacitet %1, potpuno napunjen + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Ponovno podigni sustav - Plugged In - Priključeno + Power + Energija diff --git a/translations/dde-dock_hu.ts b/translations/dde-dock_hu.ts index df8e06bef..d4605f0df 100644 --- a/translations/dde-dock_hu.ts +++ b/translations/dde-dock_hu.ts @@ -203,6 +203,13 @@ Többképernyős együttműködés + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energiaellátás - Capacity %1, %2 min remaining Akkumulátor töltöttsége %1, %2 perc van még hátra a feltöltésig @@ -332,6 +335,10 @@ Capacity %1, fully charged Akkumulátor töltöttsége %1, teljesen feltöltve + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Újraindítás - Plugged In - Áramforráshoz csatlakoztatva + Power + Energiaellátás diff --git a/translations/dde-dock_id.ts b/translations/dde-dock_id.ts index 55258a510..2f36e2d21 100644 --- a/translations/dde-dock_id.ts +++ b/translations/dde-dock_id.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Daya - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Boot ulang - Plugged In - + Power + Daya diff --git a/translations/dde-dock_it.ts b/translations/dde-dock_it.ts index 477e41fb8..929606c44 100644 --- a/translations/dde-dock_it.ts +++ b/translations/dde-dock_it.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Alimentazione - Capacity %1, %2 min remaining Autonomia %1, %2 min. rimanenti @@ -332,6 +335,10 @@ Capacity %1, fully charged Carica completa, capacità %1 + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Riavvia - Plugged In - Collegato al caricabatteria + Power + Alimentazione diff --git a/translations/dde-dock_ja.ts b/translations/dde-dock_ja.ts index d6cefc3fc..1aedb7661 100644 --- a/translations/dde-dock_ja.ts +++ b/translations/dde-dock_ja.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - 電源 - Capacity %1, %2 min remaining バッテリー残量 %1、残り %2 分 @@ -332,6 +335,10 @@ Capacity %1, fully charged バッテリー残量 %1、フル充電済み + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ 再起動 - Plugged In - 電源接続時 + Power + 電源 diff --git a/translations/dde-dock_ka.ts b/translations/dde-dock_ka.ts index c3e93fc6b..c356a1b9e 100644 --- a/translations/dde-dock_ka.ts +++ b/translations/dde-dock_ka.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - კვება - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ გადატვირთვა - Plugged In - + Power + კვება diff --git a/translations/dde-dock_kab.ts b/translations/dde-dock_kab.ts index b3de2f876..480ef61ed 100644 --- a/translations/dde-dock_kab.ts +++ b/translations/dde-dock_kab.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Tazmert - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Ales asker - Plugged In - + Power + Tazmert diff --git a/translations/dde-dock_kk.ts b/translations/dde-dock_kk.ts index 68c0aa31b..896ae951a 100644 --- a/translations/dde-dock_kk.ts +++ b/translations/dde-dock_kk.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Қорек - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ - Plugged In - + Power + Қорек diff --git a/translations/dde-dock_ko.ts b/translations/dde-dock_ko.ts index f401ce1dc..40dcaf0fa 100644 --- a/translations/dde-dock_ko.ts +++ b/translations/dde-dock_ko.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - 전원 - Capacity %1, %2 min remaining 용량 %1, %2분 남음 @@ -332,6 +335,10 @@ Capacity %1, fully charged 용량 %1, 완전히 충전됨 + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ 재부팅 - Plugged In - 연결됨 + Power + 전원 diff --git a/translations/dde-dock_lt.ts b/translations/dde-dock_lt.ts index d9e01d160..435131299 100644 --- a/translations/dde-dock_lt.ts +++ b/translations/dde-dock_lt.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energija - Capacity %1, %2 min remaining Talpa %1, liko %2 min. @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Paleisti iš naujo - Plugged In - Elektros maitinimas + Power + Energija diff --git a/translations/dde-dock_mn.ts b/translations/dde-dock_mn.ts index fe09342bc..b99f12c43 100644 --- a/translations/dde-dock_mn.ts +++ b/translations/dde-dock_mn.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Цэнэг - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Дахин ачааллах - Plugged In - + Power + Цэнэг diff --git a/translations/dde-dock_ms.ts b/translations/dde-dock_ms.ts index 3f22bf174..b79ee6495 100644 --- a/translations/dde-dock_ms.ts +++ b/translations/dde-dock_ms.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Kuasa - Capacity %1, %2 min remaining Kapasiti %1, %2 min berbaki @@ -332,6 +335,10 @@ Capacity %1, fully charged Kapasiti %1, sepenuhnya dicas + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ But semula - Plugged In - Dipalam masuk + Power + Kuasa diff --git a/translations/dde-dock_nb.ts b/translations/dde-dock_nb.ts index aee65f4cc..d5fbbc8d7 100644 --- a/translations/dde-dock_nb.ts +++ b/translations/dde-dock_nb.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Strøm - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Omstart - Plugged In - + Power + Strøm diff --git a/translations/dde-dock_ne.ts b/translations/dde-dock_ne.ts index 160d8ec64..2c4ed511d 100644 --- a/translations/dde-dock_ne.ts +++ b/translations/dde-dock_ne.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - पावर - Capacity %1, %2 min remaining क्षमता %1, %2मिनट बाँकी @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ रिबुट गर्नुहोस् - Plugged In - + Power + पावर diff --git a/translations/dde-dock_nl.ts b/translations/dde-dock_nl.ts index 0f2c127eb..d1eacebde 100644 --- a/translations/dde-dock_nl.ts +++ b/translations/dde-dock_nl.ts @@ -174,7 +174,7 @@ DevCollaborationWidget PC collaboration - + Computersamenwerking @@ -203,11 +203,18 @@ Samenwerken op meerdere schermen + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin Enabled - + Ingeschakeld Disabled @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energie - Capacity %1, %2 min remaining Capaciteit: %1 - %2 min resterend @@ -332,6 +335,10 @@ Capacity %1, fully charged Capaciteit: %1 - volledig opgeladen + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Herstarten - Plugged In - Op netstroom + Power + Energie diff --git a/translations/dde-dock_pa.ts b/translations/dde-dock_pa.ts index ac1035e5e..18d3fac14 100644 --- a/translations/dde-dock_pa.ts +++ b/translations/dde-dock_pa.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - ਊਰਜਾ - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ ਮੁੜ-ਚਾਲੂ ਕਰੋ - Plugged In - + Power + ਊਰਜਾ diff --git a/translations/dde-dock_pl.ts b/translations/dde-dock_pl.ts index 0c34e5533..9493d482a 100644 --- a/translations/dde-dock_pl.ts +++ b/translations/dde-dock_pl.ts @@ -203,6 +203,13 @@ Kolaboracja wieloekranowa + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Zasilanie - Capacity %1, %2 min remaining Poziom: %1, pozostało: %2min @@ -332,6 +335,10 @@ Capacity %1, fully charged Pojemność %1, w pełni naładowana + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Uruchomienie ponowne - Plugged In - Podłączony + Power + Zasilanie diff --git a/translations/dde-dock_pt.ts b/translations/dde-dock_pt.ts index 6cbc9fac6..9e36c8bde 100644 --- a/translations/dde-dock_pt.ts +++ b/translations/dde-dock_pt.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energia - Capacity %1, %2 min remaining Capacidade %1, %2 min restantes @@ -332,6 +335,10 @@ Capacity %1, fully charged Capacidade 1%, totalmente carregada + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reiniciar - Plugged In - Ligado + Power + Energia diff --git a/translations/dde-dock_pt_BR.ts b/translations/dde-dock_pt_BR.ts index dd955f71b..eacca2cb8 100644 --- a/translations/dde-dock_pt_BR.ts +++ b/translations/dde-dock_pt_BR.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energia - Capacity %1, %2 min remaining %1 Carregado - %2m restantes @@ -332,6 +335,10 @@ Capacity %1, fully charged %1 Carregado - Bateria Cheia + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reiniciar - Plugged In - No Carregador + Power + Energia diff --git a/translations/dde-dock_ro.ts b/translations/dde-dock_ro.ts index f604f050d..787c4e0b7 100644 --- a/translations/dde-dock_ro.ts +++ b/translations/dde-dock_ro.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Energie - Capacity %1, %2 min remaining Capacitate %1, %2 Min rămase @@ -332,6 +335,10 @@ Capacity %1, fully charged Capacitate %1, complet încărcat + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Repornire - Plugged In - Conectat + Power + Energie diff --git a/translations/dde-dock_ru.ts b/translations/dde-dock_ru.ts index 056b737d7..04f1bed9f 100644 --- a/translations/dde-dock_ru.ts +++ b/translations/dde-dock_ru.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Питание - Capacity %1, %2 min remaining Емкость %1, %2 мин. осталось @@ -332,6 +335,10 @@ Capacity %1, fully charged Заряд %1, полностью заряжен + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Перезагрузить - Plugged In - От сети + Power + Питание diff --git a/translations/dde-dock_si.ts b/translations/dde-dock_si.ts index a32ab6866..168b64960 100644 --- a/translations/dde-dock_si.ts +++ b/translations/dde-dock_si.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - බලය - Capacity %1, %2 min remaining ධාරිතාව %1, මිනිත්තු %2 ක් ඉතිරි වී ඇත @@ -332,6 +335,10 @@ Capacity %1, fully charged ධාරිතාවය %1, සම්පූර්ණයෙන්ම ආරෝපිතයි + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ පද්ධතිය නැවත අරඹන්න - Plugged In - සම්බන්ධ කර ඇත + Power + බලය diff --git a/translations/dde-dock_sk.ts b/translations/dde-dock_sk.ts index 1dd02a272..229bb3d3f 100644 --- a/translations/dde-dock_sk.ts +++ b/translations/dde-dock_sk.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Napájanie - Capacity %1, %2 min remaining Nabíjanie %1, zostávajú %2 min @@ -332,6 +335,10 @@ Capacity %1, fully charged Kapacita %1, plne nabité + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Reštart - Plugged In - + Power + Napájanie diff --git a/translations/dde-dock_sl.ts b/translations/dde-dock_sl.ts index 2df6c47b2..113dfcf28 100644 --- a/translations/dde-dock_sl.ts +++ b/translations/dde-dock_sl.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Napajanje - Capacity %1, %2 min remaining Zmogljivost %1 za %2 min @@ -332,6 +335,10 @@ Capacity %1, fully charged Zmogljivost %1 - polno + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Ponovni zagon - Plugged In - Priključeno na el.omrežje + Power + Napajanje diff --git a/translations/dde-dock_sq.ts b/translations/dde-dock_sq.ts index a5598702c..cc9742143 100644 --- a/translations/dde-dock_sq.ts +++ b/translations/dde-dock_sq.ts @@ -17,7 +17,7 @@ AirplaneModeItem Airplane mode enabled - Mënyra aeroplan është e aktivizuar + Mënyra aeroplan e aktivizuar Turn off @@ -33,7 +33,7 @@ Airplane mode disabled - Mënyra aeroplan është e çaktivizuar + Mënyra aeroplan e çaktivizuar @@ -84,7 +84,7 @@ %1 connected - %1 u lidh + %1 e lidhur Connecting... @@ -96,7 +96,7 @@ Turned off - I çaktivizuar + Çaktivizuar @@ -140,11 +140,11 @@ DateTimeDisplayer 12-hour time - Orë 12-orëshe + Kohë 12-orëshe 24-hour time - Orë 24-orëshe + Kohë 24-orëshe Time settings @@ -159,11 +159,11 @@ 12-hour time - Orë 12-orëshe + orë 12-orëshe 24-hour time - Orë 24-orëshe + orë 24-orëshe Time settings @@ -174,14 +174,14 @@ DevCollaborationWidget PC collaboration - + Bashkëpunim me PC DialogManager Are you sure you want to empty %1 items? - Jeni i sigurt se doni të zbrazen $1 objekte? + Jeni i sigurt se doni të zbrazen %1 objekte? Cancel @@ -200,6 +200,13 @@ DisplaySettingWidget Multi-Screen Collaboration + Bashkëpunim me Shumë Ekrane + + + + DockPluginController + + The plugin %1 is not compatible with the system. @@ -207,7 +214,7 @@ HomeMonitorPlugin Enabled - E aktivizuar + Aktivizuar Disabled @@ -229,15 +236,15 @@ Efficient Mode - Mënyra Efikase + Mënyra Efikasitet Top - Në Krye + Në krye Bottom - Në Fund + Në fund Left @@ -291,15 +298,11 @@ OnboardPlugin Onboard - Onboard + PowerPlugin - - Power - Energji - Capacity %1, %2 min remaining Kapacitet %1, edhe %2 min @@ -314,7 +317,7 @@ Charging %1, %2 hr %3 min until full - Po ngarkohet %1, edhe %2 hr e 3% min deri sa të jetë plot + Po ngarkohet %1, edhe %2 hr e %3 minuta deri sa të jetë plot Capacity %1 @@ -326,11 +329,15 @@ Capacity %1 ... - Kapacitet %1 … + Kapacitet %1… Capacity %1, fully charged - Kapacitet 1%, plotësisht e ngarkuar + Kapacitet %1, plotësisht e ngarkuar + + + Battery + @@ -368,7 +375,7 @@ Switch account - Ndërroni llogari + Këmbeni llogari Power settings @@ -379,8 +386,8 @@ Rinisu - Plugged In - Në Prizë + Power + Energji @@ -409,7 +416,7 @@ Mute - Pa zë + Hiqi zërin Sound settings @@ -443,18 +450,18 @@ Move to Trash - Shpjere te Hedhurinat + Shpjere te Hedhurina TrashWidget Open - Hape + Hap Empty - E zbrazët + Zbraze @@ -469,7 +476,7 @@ The Dock is in safe mode, please exit to show it properly - Paneli gjendet nën Mënyrën e Parrezik, ju lutemi, dilni prej saj, që të shfaqet si duhet + Paneli gjendet nën mënyrën e parrezik, ju lutemi, dilni prej saj, që të shfaqet si duhet \ No newline at end of file diff --git a/translations/dde-dock_sr.ts b/translations/dde-dock_sr.ts index 7172fbc5c..36e515ab6 100644 --- a/translations/dde-dock_sr.ts +++ b/translations/dde-dock_sr.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Напајање - Capacity %1, %2 min remaining Ниво %1, %2 мин преостало @@ -332,6 +335,10 @@ Capacity %1, fully charged Ниво %1, напуњено + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Поново покрени - Plugged In - Прикључен + Power + Напајање diff --git a/translations/dde-dock_sv.ts b/translations/dde-dock_sv.ts index adf1a9f0f..d575b864e 100644 --- a/translations/dde-dock_sv.ts +++ b/translations/dde-dock_sv.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Stäng av - Capacity %1, %2 min remaining Kapacitet %1, %2 min kvarstår @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Starta om - Plugged In - + Power + Stäng av diff --git a/translations/dde-dock_sw.ts b/translations/dde-dock_sw.ts index decd5dadf..584e7a361 100644 --- a/translations/dde-dock_sw.ts +++ b/translations/dde-dock_sw.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Kiwashio - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Washa upya - Plugged In - + Power + Kiwashio diff --git a/translations/dde-dock_ta.ts b/translations/dde-dock_ta.ts index 4854b7931..4489294df 100644 --- a/translations/dde-dock_ta.ts +++ b/translations/dde-dock_ta.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - மின்திறன் - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ மறுதொடக்கம் - Plugged In - + Power + மின்திறன் diff --git a/translations/dde-dock_th.ts b/translations/dde-dock_th.ts index 9e50064d1..d2c37899c 100644 --- a/translations/dde-dock_th.ts +++ b/translations/dde-dock_th.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - พลังงาน - Capacity %1, %2 min remaining @@ -332,6 +335,10 @@ Capacity %1, fully charged + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ รีบูต - Plugged In - + Power + พลังงาน diff --git a/translations/dde-dock_tr.ts b/translations/dde-dock_tr.ts index c4539cf82..9fd25730c 100644 --- a/translations/dde-dock_tr.ts +++ b/translations/dde-dock_tr.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Güç - Capacity %1, %2 min remaining %1 ve azalıyor, %2 dakika kaldı @@ -332,6 +335,10 @@ Capacity %1, fully charged Kapasite %1, tam şarjlı + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Yeniden başlat - Plugged In - Fişe Takılı + Power + Güç diff --git a/translations/dde-dock_ug.ts b/translations/dde-dock_ug.ts index a40279728..51778244f 100644 --- a/translations/dde-dock_ug.ts +++ b/translations/dde-dock_ug.ts @@ -203,6 +203,13 @@ كومپيۇتېرلار ئارا ھەمكارلىشىش + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - توك مەنبە - Capacity %1, %2 min remaining توك %1 قالدى، %2 مىنۇت يېتىدۇ @@ -332,6 +335,10 @@ Capacity %1, fully charged توك%1، توشتى + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ قايتا قوزغىتىش - Plugged In - توك مەنبەسى ئىشلىتىش + Power + توك مەنبە diff --git a/translations/dde-dock_uk.ts b/translations/dde-dock_uk.ts index a4ff3e764..1e1e4c7d5 100644 --- a/translations/dde-dock_uk.ts +++ b/translations/dde-dock_uk.ts @@ -203,6 +203,13 @@ Сумісне використання декількох екранів + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Живлення - Capacity %1, %2 min remaining Батарея %1, %2 хв залишилося @@ -332,6 +335,10 @@ Capacity %1, fully charged Ємність %1, повністю заряджено + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Перезавантажити - Plugged In - Підключено + Power + Живлення diff --git a/translations/dde-dock_vi.ts b/translations/dde-dock_vi.ts index 3c6e5d725..1701e7526 100644 --- a/translations/dde-dock_vi.ts +++ b/translations/dde-dock_vi.ts @@ -203,6 +203,13 @@ + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - Năng lượng - Capacity %1, %2 min remaining Năng lượng %1, %2 còn lại @@ -332,6 +335,10 @@ Capacity %1, fully charged Công suất 1%, sạc đã đầy + + Battery + + ShowDesktopPlugin @@ -379,8 +386,8 @@ Khởi động lại - Plugged In - Plugged In + Power + Năng lượng diff --git a/translations/dde-dock_zh_CN.ts b/translations/dde-dock_zh_CN.ts index 4e98337de..ea7c9b043 100644 --- a/translations/dde-dock_zh_CN.ts +++ b/translations/dde-dock_zh_CN.ts @@ -203,6 +203,13 @@ 电脑协同设置 + + DockPluginController + + The plugin %1 is not compatible with the system. + The plugin %1 is not compatible with the system. + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - 电源 - Capacity %1, %2 min remaining 电量%1,剩余%2分钟 @@ -332,6 +335,10 @@ Capacity %1, fully charged 电量%1,已充满 + + Battery + 电池 + ShowDesktopPlugin diff --git a/translations/dde-dock_zh_HK.ts b/translations/dde-dock_zh_HK.ts index e6a1e7020..9cd1fdfde 100644 --- a/translations/dde-dock_zh_HK.ts +++ b/translations/dde-dock_zh_HK.ts @@ -203,6 +203,13 @@ 電腦協同設置 + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - 電源 - Capacity %1, %2 min remaining 電量%1,剩餘%2分鐘 @@ -332,6 +335,10 @@ Capacity %1, fully charged 電量%1,已充滿 + + Battery + + ShowDesktopPlugin diff --git a/translations/dde-dock_zh_TW.ts b/translations/dde-dock_zh_TW.ts index c330be22f..7a8aafc31 100644 --- a/translations/dde-dock_zh_TW.ts +++ b/translations/dde-dock_zh_TW.ts @@ -203,6 +203,13 @@ 電腦協同設定 + + DockPluginController + + The plugin %1 is not compatible with the system. + + + HomeMonitorPlugin @@ -296,10 +303,6 @@ PowerPlugin - - Power - 電源 - Capacity %1, %2 min remaining 電量%1,剩餘%2分鐘 @@ -332,6 +335,10 @@ Capacity %1, fully charged 電量%1,已充滿 + + Battery + + ShowDesktopPlugin From 63c03f58a768fa563d3e09d3ef182ef6b86716e7 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 1 Feb 2023 15:35:49 +0800 Subject: [PATCH 251/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8B=96?= =?UTF-8?q?=E5=8A=A8=E6=8F=92=E4=BB=B6=E5=88=B0=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E5=90=8E=E6=89=80=E6=9C=89=E6=8F=92=E4=BB=B6=E9=83=BD=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在保存所有插件的时候,判断该插件是否被移除,如果已经移除,则不保存到配置中 Log: Influence: 默认所有的快捷面板中的插件都在任务栏显示,从控制中心取消所有插件的勾选,然后从快捷面板拖动一个插件到任务栏,观察任务栏插件显示情况 Bug: https://pms.uniontech.com/bug-view-181945.html Change-Id: Ic523ff21107f8429c61db1abde6c8c97793bb59d --- frame/window/quickpluginmodel.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index 10db9d6b8..403aad021 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -158,9 +158,14 @@ void QuickPluginModel::initConfig() void QuickPluginModel::saveConfig() { + QStringList pluginNames; + for (PluginsItemInterface *item : m_dockedPluginsItems) { + pluginNames << item->pluginName(); + } QStringList plugins; for (auto it = m_dockedPluginIndex.begin(); it != m_dockedPluginIndex.end(); it++) { - plugins << it.key(); + if (pluginNames.contains(it.key())) + plugins << it.key(); } std::sort(plugins.begin(), plugins.end(), [ this ](const QString &p1, const QString &p2) { return m_dockedPluginIndex.value(p1) < m_dockedPluginIndex.value(p2); From 0a3298344357bd127e73a76708c89f7102e0d282 Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 2 Feb 2023 09:52:35 +0800 Subject: [PATCH 252/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E4=B8=BB=E9=A2=98=E5=BF=AB=E6=8D=B7=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E4=B8=BB=E9=A2=98=E9=A2=9C=E8=89=B2=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 响应主题变化的信号,在切换主题后实时获取快捷面板的图标 Log: 修复快捷面板插件图标在切换主题后颜色没有变化的问题 Influence: 打开快捷面板,切换主题,观察图标颜色显示是否正常 Bug: https://pms.uniontech.com/bug-view-184085.html Change-Id: Iacffcacf63413ba8d85ae3edf28bf1ff58242036 --- plugins/pluginmanager/quicksettingcontainer.cpp | 7 +++++++ plugins/pluginmanager/quicksettingcontainer.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/plugins/pluginmanager/quicksettingcontainer.cpp b/plugins/pluginmanager/quicksettingcontainer.cpp index 8838ae01e..0f562ba02 100644 --- a/plugins/pluginmanager/quicksettingcontainer.cpp +++ b/plugins/pluginmanager/quicksettingcontainer.cpp @@ -362,6 +362,7 @@ void QuickSettingContainer::initConnection() }); connect(m_pluginController, &DockPluginController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove); connect(m_pluginController, &DockPluginController::pluginUpdated, this, &QuickSettingContainer::onPluginUpdated); + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &QuickSettingContainer::onThemeTypeChanged); connect(m_childPage, &PluginChildPage::back, this, [ this ] { showPage(m_mainWidget); @@ -413,3 +414,9 @@ void QuickSettingContainer::onPluginUpdated(PluginsItemInterface *itemInter, con break; } } + +void QuickSettingContainer::onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType) +{ + for (QuickSettingItem *settingItem : m_quickSettings) + settingItem->doUpdate(); +} diff --git a/plugins/pluginmanager/quicksettingcontainer.h b/plugins/pluginmanager/quicksettingcontainer.h index cf7ed03cc..691a0084d 100644 --- a/plugins/pluginmanager/quicksettingcontainer.h +++ b/plugins/pluginmanager/quicksettingcontainer.h @@ -26,6 +26,7 @@ #include "dtkwidget_global.h" #include +#include #include @@ -64,6 +65,7 @@ private Q_SLOTS: void onShowChildWidget(QWidget *childWidget); void onResizeView(); void onPluginUpdated(PluginsItemInterface *itemInter, const DockPart dockPart); + void onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType); private: // 加载UI From 97f513089a5f9d62f0739af7cdfcd20807fd468b Mon Sep 17 00:00:00 2001 From: lvpeilong Date: Wed, 1 Feb 2023 10:30:48 +0800 Subject: [PATCH 253/257] chore: update changelog update changelog Log: update changelog Influence: null Task: https://pms.uniontech.com/task-view-239643.html Change-Id: I200f9f84d00e5a28f0e3f23dc5c37d84a0536ad3 --- debian/changelog | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/debian/changelog b/debian/changelog index db0a0acf3..741eff2ff 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,17 @@ +dde-dock (6.0.9.1) unstable; urgency=medium + + [ TagBuilder ] + * chore: 更新changelog(Task: 227573)(Influence: 版本号) + * fix: 修复移除蓝牙设备后任务栏插件不消失的问题(Bug: 181945)(Influence: 插上蓝牙,从控制中心勾选该插件,在任务栏显示,然后移除蓝牙设备,观察任务栏的蓝牙图标是否消失) + * fix: 修复从任务栏向上拖动插件引起任务栏崩溃的问题(Bug: 181945)(Influence: 从任务栏向上拖动插件,观察任务栏是否正常) + * fix: 修复从托盘拖动图标到任务栏引起崩溃的问题(Bug: 181945)(Influence: 将托盘图标拖动到任务栏) + * fix: 修改插件区域出现重复的电池图标问题(Bug: 184085)(Influence: 任务栏-电池图标状态刷新) + * fix: 修复高缩放率下图标显示异常的问题(Bug: 183543, 184089)(Influence: 高分屏,高缩放率,观察任务栏插件区域的图标) + * fix: 修复系统主题变化后快捷面板电池颜色显示错误的问题(Bug: 184085)(Influence: 打开快捷面板,在控制中心更改系统颜色,观察快捷面板中系统电池图标是否跟随系统颜色变化) + * fix: 更新翻译文案(Task: 226203)(Influence: 从笔记本上观察控制中心个性化中电池的文案) + + -- lvpeilong Wed, 01 Feb 2023 15:26:25 +0800 + dde-dock (6.0.8.1) unstable; urgency=medium [ TagBuilder ] From 7824dbc484e1c602814b1518b26d888429b18805 Mon Sep 17 00:00:00 2001 From: lvpeilong Date: Thu, 2 Feb 2023 13:35:37 +0800 Subject: [PATCH 254/257] chore: update changelog update changelog Log: update changelog Influence: null Task: https://pms.uniontech.com/task-view-239643.html Change-Id: I207a7ea3f1beb3623ee9040c46a397f5cc51658d --- debian/changelog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 741eff2ff..95717d0e4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +dde-dock (6.0.9.2) unstable; urgency=medium + + [ TagBuilder ] + * fix: 修复拖动插件到任务栏后所有插件都显示的问题(Bug: 181945)(Influence: 默认所有的快捷面板中的插件都在任务栏显示,从控制中心取消所有插件的勾选,然后从快捷面板拖动一个插件到任务栏,观察任务栏插件显示情况) + * fix: 修复切换主题快捷面板插件主题颜色没有变化(Bug: 184085)(Influence: 打开快捷面板,切换主题,观察图标颜色显示是否正常) + + -- lvpeilong Thu, 02 Feb 2023 13:30:36 +0800 + dde-dock (6.0.9.1) unstable; urgency=medium [ TagBuilder ] From b6002b55dcf0100c7abffd4161e3a665b1d8a24a Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 2 Feb 2023 13:23:45 +0800 Subject: [PATCH 255/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E5=9B=9E=E6=94=B6=E7=AB=99=E6=98=BE=E7=A4=BA=E5=90=8E?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=A1=8C=E9=9D=A2=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 取消回收站显示后,显示桌面组件不会隐藏 Log: 修复取消回收站显示后显示桌面失效的问题 Influence: 从控制中心取消回收站的显示,观察高效模式下是否可以显示桌面 Bug: https://pms.uniontech.com/bug-view-180859.html Change-Id: Ic9ed03f0c94177dc06cd2b19cd5492454b07bd45 --- frame/window/docktraywindow.cpp | 36 ++++++++++++++++++++++++--------- frame/window/docktraywindow.h | 3 +++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 62c701df0..cb53b3d24 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -38,7 +38,7 @@ #define FRONTSPACING 18 #define SPLITERSIZE 2 -#define SPLITESPACE 10 +#define SPLITESPACE 5 DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent) : QWidget(parent) @@ -56,6 +56,9 @@ DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent) , m_trayView(new TrayGridView(this)) , m_model(TrayModel::getDockModel()) , m_delegate(new TrayDelegate(m_trayView, this)) + , m_toolFrontSpaceWidget(new QWidget(this)) + , m_toolBackSpaceWidget(new QWidget(this)) + , m_dateTimeSpaceWidget(new QWidget(this)) { initUi(); initConnection(); @@ -90,10 +93,12 @@ QSize DockTrayWindow::suitableSize(const Dock::Position &position, const int &, { if (position == Dock::Position::Left || position == Dock::Position::Right) { // 左右的尺寸 - int height = FRONTSPACING + int height = m_showDesktopWidget->height() + + m_toolFrontSpaceWidget->height() + m_toolWidget->height() - + (SPLITESPACE * 2) - + SPLITERSIZE + + m_toolBackSpaceWidget->height() + + m_toolLineLabel->height() + + m_dateTimeSpaceWidget->height() + m_dateTimeWidget->suitableSize(position).height() + m_systemPuginWidget->suitableSize(position).height() + m_quickIconWidget->suitableSize(position).height() @@ -102,10 +107,12 @@ QSize DockTrayWindow::suitableSize(const Dock::Position &position, const int &, return QSize(-1, height); } // 上下的尺寸 - int width = FRONTSPACING + int width = m_showDesktopWidget->width() + + m_toolFrontSpaceWidget->width() + m_toolWidget->width() - + (SPLITESPACE * 2) - + SPLITERSIZE + + m_toolBackSpaceWidget->width() + + m_toolLineLabel->width() + + m_dateTimeSpaceWidget->width() + m_dateTimeWidget->width() + m_systemPuginWidget->width() + m_quickIconWidget->width() @@ -281,7 +288,9 @@ void DockTrayWindow::updateToolWidget() { m_toolWidget->setVisible(m_toolLayout->count() > 0); m_toolLineLabel->setVisible(m_toolLayout->count() > 0); - m_showDesktopWidget->setVisible(m_toolLayout->count() > 0); + m_toolFrontSpaceWidget->setVisible(m_toolLayout->count() > 0); + m_toolBackSpaceWidget->setVisible(m_toolLayout->count() > 0); + m_dateTimeSpaceWidget->setVisible(m_toolLayout->count() > 0); } void DockTrayWindow::initUi() @@ -293,10 +302,11 @@ void DockTrayWindow::initUi() m_mainBoxLayout->setContentsMargins(0, 0, 0, 0); m_mainBoxLayout->setSpacing(0); m_mainBoxLayout->addWidget(m_showDesktopWidget); + m_mainBoxLayout->addWidget(m_toolFrontSpaceWidget); m_mainBoxLayout->addWidget(m_toolWidget); - m_mainBoxLayout->addSpacing(SPLITESPACE); + m_mainBoxLayout->addWidget(m_toolBackSpaceWidget); m_mainBoxLayout->addWidget(m_toolLineLabel); - m_mainBoxLayout->addSpacing(SPLITESPACE); + m_mainBoxLayout->addWidget(m_dateTimeSpaceWidget); m_mainBoxLayout->addWidget(m_dateTimeWidget); m_mainBoxLayout->addWidget(m_systemPuginWidget); m_mainBoxLayout->addWidget(m_quickIconWidget); @@ -369,6 +379,9 @@ void DockTrayWindow::onUpdateComponentSize() m_systemPuginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPuginWidget->suitableSize().height()); m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, m_quickIconWidget->suitableSize().height()); m_trayView->setFixedSize(QWIDGETSIZE_MAX, m_trayView->suitableSize().height()); + m_toolFrontSpaceWidget->setFixedSize(QWIDGETSIZE_MAX, SPLITESPACE); + m_toolBackSpaceWidget->setFixedSize(QWIDGETSIZE_MAX, SPLITESPACE); + m_dateTimeSpaceWidget->setFixedSize(QWIDGETSIZE_MAX, SPLITESPACE); break; case Dock::Position::Top: case Dock::Position::Bottom: @@ -378,6 +391,9 @@ void DockTrayWindow::onUpdateComponentSize() m_systemPuginWidget->setFixedSize(m_systemPuginWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_trayView->setFixedSize(m_trayView->suitableSize().width(), QWIDGETSIZE_MAX); + m_toolFrontSpaceWidget->setFixedSize(SPLITESPACE, QWIDGETSIZE_MAX); + m_toolBackSpaceWidget->setFixedSize(SPLITESPACE, QWIDGETSIZE_MAX); + m_dateTimeSpaceWidget->setFixedSize(SPLITESPACE, QWIDGETSIZE_MAX); break; } Q_EMIT requestUpdate(); diff --git a/frame/window/docktraywindow.h b/frame/window/docktraywindow.h index 84ff7dc6a..bfc5a0d3d 100644 --- a/frame/window/docktraywindow.h +++ b/frame/window/docktraywindow.h @@ -91,6 +91,9 @@ private: TrayGridView *m_trayView; // 托盘区域视图 TrayModel *m_model; // 托盘区域的model TrayDelegate *m_delegate; // 托盘区域的视图代理 + QWidget *m_toolFrontSpaceWidget; // 用于显示桌面和回收站中间的间隔 + QWidget *m_toolBackSpaceWidget; // 用于回收站和时间日期分割线中间的间隔 + QWidget *m_dateTimeSpaceWidget; // 用于时间日期分割线和时间日期中间的间隔 }; #endif // DOCKTRAYWINDOW_H From 1049bfb1d9e3ed055a728025d843280b40caed10 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 3 Feb 2023 17:35:16 +0800 Subject: [PATCH 256/257] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8F=E4=BD=8D=E7=BD=AE=E5=8F=91=E7=94=9F=E5=8F=98?= =?UTF-8?q?=E5=8C=96=E6=8F=90=E7=A4=BA=E6=B6=88=E6=81=AF=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E8=B7=9F=E7=9D=80=E6=94=B9=E5=8F=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 任务栏位置发生变化的时候,发送信号通知osd改变自己的位置 Log: Influence: 调整任务栏位置,观察通知消息的位置是否跟着变化 Bug: https://pms.uniontech.com/bug-view-184231.html Change-Id: I4f28d32fb6e57dd1a3fa929cd04dea8ec5d2816f --- frame/window/windowmanager.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index f1aeb5533..6c22a1a30 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -235,7 +235,7 @@ QRect WindowManager::geometry() const if (!mainWindow->isVisible()) continue; - QRect windowRect = mainWindow->rect(); + QRect windowRect = mainWindow->geometry(); if (i == 0 || x > windowRect.x()) x = windowRect.x(); if (i == 0) { @@ -253,7 +253,7 @@ QRect WindowManager::geometry() const if (!mainWindow->isVisible()) continue; - QRect windowRect = mainWindow->rect(); + QRect windowRect = mainWindow->geometry(); if (i == 0 || y > windowRect.y()) y = windowRect.y(); @@ -660,6 +660,7 @@ void WindowManager::onChangeDockPosition(QString fromScreen, QString toScreen, c showAniFinish(); m_multiScreenWorker->setStates(MultiScreenWorker::ChangePositionAnimationStart, false); animationFinish(true); + emit panelGeometryChanged(); }); for (QParallelAnimationGroup *ani : animations) { From 1191af61dd8f362c34439daabdd73ef1b0bbec55 Mon Sep 17 00:00:00 2001 From: deepin-admin-bot Date: Tue, 14 Feb 2023 08:27:39 +0000 Subject: [PATCH 257/257] chore: Sync by sync by github workflow Log: none Influence: none --- .github/workflows/call-auto-tag.yml | 16 ++++++++++++++++ .github/workflows/call-tag-build.yml | 13 +++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 .github/workflows/call-auto-tag.yml create mode 100644 .github/workflows/call-tag-build.yml diff --git a/.github/workflows/call-auto-tag.yml b/.github/workflows/call-auto-tag.yml new file mode 100644 index 000000000..5018e5beb --- /dev/null +++ b/.github/workflows/call-auto-tag.yml @@ -0,0 +1,16 @@ +name: auto tag + +on: + pull_request_target: + types: [opened, synchronize, closed] + paths: + - "debian/changelog" + +concurrency: + group: ${{ github.workflow }}-pull/${{ github.event.number }} + cancel-in-progress: true + +jobs: + auto_tag: + uses: linuxdeepin/.github/.github/workflows/auto-tag.yml@master + secrets: inherit diff --git a/.github/workflows/call-tag-build.yml b/.github/workflows/call-tag-build.yml new file mode 100644 index 000000000..6420b293b --- /dev/null +++ b/.github/workflows/call-tag-build.yml @@ -0,0 +1,13 @@ +name: tag build +on: + push: + tags: "*" + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + build: + uses: linuxdeepin/.github/.github/workflows/tag-build.yml@master + secrets: inherit