From 8d8eac02627bd8c79dd068691bc7b885f47b5832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Mon, 11 Oct 2021 11:14:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按照设计图更新UI Log: Task: https://pms.uniontech.com/zentao/task-view-86359.html Change-Id: I90f16bc2d39bbbc49f245e6ef76ac833e660e6b5 --- frame/dbus/dbusdockadaptors.cpp | 15 ++- frame/dbus/dbusdockadaptors.h | 5 + .../dcc-dock-settings-plugin/CMakeLists.txt | 2 +- .../actions/icon_dock_32px.svg | 7 + .../com_deepin_dde_dock.h | 6 + .../icons/plugins/assistant.svg | 15 +++ .../icons/plugins/desktop.svg | 7 + .../icons/plugins/keyboard.svg | 7 + .../icons/plugins/notify.svg | 7 + .../icons/plugins/plug-in2.svg | 7 + .../icons/plugins/power.svg | 9 ++ .../icons/plugins/task.svg | 7 + .../icons/plugins/time.svg | 9 ++ .../icons/plugins/trash.svg | 9 ++ .../module_widget.cpp | 125 ++++++++++++++---- .../dcc-dock-settings-plugin/module_widget.h | 18 ++- .../dcc-dock-settings-plugin/resources.qrc | 16 +++ .../settings_module.cpp | 2 +- .../ut_module_widget.cpp | 11 +- 19 files changed, 244 insertions(+), 40 deletions(-) create mode 100644 plugins/dcc-dock-settings-plugin/actions/icon_dock_32px.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/assistant.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/desktop.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/keyboard.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/notify.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/plug-in2.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/power.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/task.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/time.svg create mode 100644 plugins/dcc-dock-settings-plugin/icons/plugins/trash.svg create mode 100644 plugins/dcc-dock-settings-plugin/resources.qrc diff --git a/frame/dbus/dbusdockadaptors.cpp b/frame/dbus/dbusdockadaptors.cpp index 3964b3e7b..88c0ad03f 100644 --- a/frame/dbus/dbusdockadaptors.cpp +++ b/frame/dbus/dbusdockadaptors.cpp @@ -118,6 +118,17 @@ QStringList DBusDockAdaptors::GetLoadedPlugins() return newList; } +// 返回每个插件的识别Key(所以此值应始终不变),供个性化插件根据key去匹配每个插件对应的图标 +QString DBusDockAdaptors::getPluginKey(const QString &pluginName) +{ + for (auto plugin : DockItemManager::instance()->pluginList()) { + if (plugin->pluginDisplayName() == pluginName) + return plugin->pluginName(); + } + + return QString(); +} + bool DBusDockAdaptors::getPluginVisible(const QString &pluginName) { for (auto *p : DockItemManager::instance()->pluginList()) { @@ -191,11 +202,11 @@ bool DBusDockAdaptors::isPluginValid(const QString &name) // 未开启窗口特效时,不显示多任务视图插件 if (name == "multitasking" && !DWindowManagerHelper::instance()->hasComposite()) - return false; + return false; // 录屏插件不显示,插件名如果有变化,建议发需求,避免任务栏反复适配 if (name == "deepin-screen-recorder-plugin") - return false; + return false; return true; } diff --git a/frame/dbus/dbusdockadaptors.h b/frame/dbus/dbusdockadaptors.h index 64854890c..f26e33943 100644 --- a/frame/dbus/dbusdockadaptors.h +++ b/frame/dbus/dbusdockadaptors.h @@ -43,6 +43,9 @@ class DBusDockAdaptors: public QDBusAbstractAdaptor " " " " " " + " " + " " + " " " " " " " " @@ -72,6 +75,8 @@ public Q_SLOTS: // METHODS QStringList GetLoadedPlugins(); + QString getPluginKey(const QString &pluginName); + bool getPluginVisible(const QString &pluginName); void setPluginVisible(const QString &pluginName, bool visible); diff --git a/plugins/dcc-dock-settings-plugin/CMakeLists.txt b/plugins/dcc-dock-settings-plugin/CMakeLists.txt index 32cd1f138..c2ee326ca 100644 --- a/plugins/dcc-dock-settings-plugin/CMakeLists.txt +++ b/plugins/dcc-dock-settings-plugin/CMakeLists.txt @@ -18,7 +18,7 @@ find_package(DtkWidget REQUIRED) pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) -add_library(${PLUGIN_NAME} SHARED ${SRCS}) +add_library(${PLUGIN_NAME} SHARED ${SRCS} resources.qrc) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ./) target_include_directories(${PLUGIN_NAME} PUBLIC ../src diff --git a/plugins/dcc-dock-settings-plugin/actions/icon_dock_32px.svg b/plugins/dcc-dock-settings-plugin/actions/icon_dock_32px.svg new file mode 100644 index 000000000..a9aa35d8f --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/actions/icon_dock_32px.svg @@ -0,0 +1,7 @@ + + + list2_icon/dock/normal + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/com_deepin_dde_dock.h b/plugins/dcc-dock-settings-plugin/com_deepin_dde_dock.h index 10cdbe142..b6c22cdc3 100644 --- a/plugins/dcc-dock-settings-plugin/com_deepin_dde_dock.h +++ b/plugins/dcc-dock-settings-plugin/com_deepin_dde_dock.h @@ -54,6 +54,12 @@ public Q_SLOTS: // METHODS return asyncCallWithArgumentList(QStringLiteral("GetLoadedPlugins"), argumentList); } + inline QDBusPendingReply getPluginKey(const QString &pluginName) + { + QList argumentList; + argumentList << QVariant::fromValue(pluginName); + return asyncCallWithArgumentList(QStringLiteral("getPluginKey"), argumentList); + } inline QDBusPendingReply<> ReloadPlugins() diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/assistant.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/assistant.svg new file mode 100644 index 000000000..7c2010bf1 --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/assistant.svg @@ -0,0 +1,15 @@ + + + icon/dock/assistant + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/desktop.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/desktop.svg new file mode 100644 index 000000000..c0fa9ab19 --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/desktop.svg @@ -0,0 +1,7 @@ + + + icon/dock/desktop + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/keyboard.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/keyboard.svg new file mode 100644 index 000000000..d9c5718b2 --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/keyboard.svg @@ -0,0 +1,7 @@ + + + icon/dock/keyboard + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/notify.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/notify.svg new file mode 100644 index 000000000..fba759921 --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/notify.svg @@ -0,0 +1,7 @@ + + + icon/dock/notify + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/plug-in2.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/plug-in2.svg new file mode 100644 index 000000000..5ab6bf7fd --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/plug-in2.svg @@ -0,0 +1,7 @@ + + + icon/dock/plug-in2 + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/power.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/power.svg new file mode 100644 index 000000000..b6ae5a96b --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/power.svg @@ -0,0 +1,9 @@ + + + icon/dock/power + + + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/task.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/task.svg new file mode 100644 index 000000000..0537c2347 --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/task.svg @@ -0,0 +1,7 @@ + + + icon/dock/task + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/time.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/time.svg new file mode 100644 index 000000000..da813d6f9 --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/time.svg @@ -0,0 +1,9 @@ + + + icon/dock/time + + + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/icons/plugins/trash.svg b/plugins/dcc-dock-settings-plugin/icons/plugins/trash.svg new file mode 100644 index 000000000..05ce6decf --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/icons/plugins/trash.svg @@ -0,0 +1,9 @@ + + + icon/dock/trash + + + + + + \ No newline at end of file diff --git a/plugins/dcc-dock-settings-plugin/module_widget.cpp b/plugins/dcc-dock-settings-plugin/module_widget.cpp index e07b145ca..2de49dc6f 100644 --- a/plugins/dcc-dock-settings-plugin/module_widget.cpp +++ b/plugins/dcc-dock-settings-plugin/module_widget.cpp @@ -25,9 +25,10 @@ #include #include #include -#include #include +#include +#include #include #include @@ -36,6 +37,7 @@ #include #include #include +#include DWIDGET_USE_NAMESPACE @@ -66,11 +68,16 @@ ModuleWidget::ModuleWidget(QWidget *parent) , m_screenSettingTitle(new TitleLabel(tr("Multi screen config"))) , m_screenSettingComboxWidget(new ComboxWidget) , m_pluginAreaTitle(new TitleLabel(tr("Plugin area"))) + , m_pluginTips(new DTipLabel(tr("Select the icon that needs to be displayed in the plug-in area of the taskbar"))) + , 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_dockInter(new DBusInter("com.deepin.dde.Dock", "/com/deepin/dde/Dock", QDBusConnection::sessionBus(), this)) , m_gsettingsWatcher(new GSettingWatcher("com.deepin.dde.control-center", "personalization", this)) { initUI(); + + connect(m_dockInter, &DBusInter::pluginVisibleChanged, this, &ModuleWidget::updateItemCheckStatus); } ModuleWidget::~ModuleWidget() @@ -82,6 +89,7 @@ ModuleWidget::~ModuleWidget() delete m_screenSettingTitle; delete m_screenSettingComboxWidget; delete m_pluginAreaTitle; + delete m_pluginTips; } void ModuleWidget::initUI() @@ -140,17 +148,21 @@ void ModuleWidget::initUI() m_sizeSlider->addBackground(); m_sizeSlider->slider()->setRange(40, 100); QStringList ranges; - ranges << tr("Small") << tr("Big"); + ranges << tr("Small") << "" << tr("Big"); 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::valueChanged, this, [ = ] (int value) { if (m_daemonDockInter->displayMode() == DisplayMode::Fashion) { m_daemonDockInter->setWindowSizeFashion(uint(value)); } else if (m_daemonDockInter->displayMode() == DisplayMode::Efficient) { m_daemonDockInter->setWindowSizeEfficient(uint(value)); } + updateSliderValue(); }); - updateSliderValue(m_daemonDockInter->displayMode()); + + updateSliderValue(); m_gsettingsWatcher->bind("sizeSlider", m_sizeSlider); layout->addWidget(m_sizeSlider); @@ -158,7 +170,7 @@ void ModuleWidget::initUI() // 多屏显示设置 if (QDBusConnection::sessionBus().interface()->isServiceRegistered("com.deepin.dde.Dock")) { static QMap g_screenSettingMap = {{tr("Follow the mouse"), false} - , {tr("Only show in primary"), true}}; + , {tr("Only show in primary"), true}}; layout->addSpacing(10); layout->addWidget(m_screenSettingTitle); @@ -181,28 +193,76 @@ void ModuleWidget::initUI() if (reply.error().type() != QDBusError::ErrorType::NoError) { qWarning() << "dbus call failed, method: 'GetLoadedPlugins()'"; } else { + const QMap &pluginIconMap = {{"assistant", ":/icons/plugins/assistant.svg"} + , {"show-desktop", ":/icons/plugins/desktop.svg"} + , {"onboard", ":/icons/plugins/keyboard.svg"} + , {"notifications", ":/icons/plugins/notify.svg"} + , {"shutdown", ":/icons/plugins/power.svg"} + , {"multitasking", ":/icons/plugins/task.svg"} + , {"datetime", ":/icons/plugins/time.svg"} + , {"trash", ":/icons/plugins/trash.svg"}}; if (plugins.size() != 0) { layout->addSpacing(10); layout->addWidget(m_pluginAreaTitle); m_gsettingsWatcher->bind("pluginArea", m_pluginAreaTitle); - for (auto name : plugins) { - SwitchWidget *widget = new SwitchWidget(this); - widget->setTitle(name); - widget->addBackground(); - widget->setChecked(m_dockInter->getPluginVisible(name)); - connect(widget, &SwitchWidget::checkedChanged, this, [ = ] (const bool checked) { - m_dockInter->setPluginVisible(widget->title(), checked); - }); - connect(m_dockInter, &DBusInter::pluginVisibleChanged, this, [ = ] (const QString &pluginName, bool visible) { - if (pluginName == widget->title()) { - widget->setChecked(visible); - } - }); - layout->addWidget(widget); - m_gsettingsWatcher->bind("pluginArea", widget); - m_pluginWidgetList.append(widget); + 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_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_gsettingsWatcher->bind("pluginArea", 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), ":/icons/plugins/plug-in2.svg"))); + 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); } } @@ -215,13 +275,32 @@ void ModuleWidget::initUI() setWidget(widget); } -void ModuleWidget::updateSliderValue(int displayMode) +void ModuleWidget::updateSliderValue() { + auto displayMode = m_daemonDockInter->displayMode(); + m_sizeSlider->blockSignals(true); if (displayMode == DisplayMode::Fashion) { - m_sizeSlider->setValueLiteral(QString::number(m_daemonDockInter->windowSizeFashion())); + m_sizeSlider->slider()->setValue(int(m_daemonDockInter->windowSizeFashion())); } else if (displayMode == DisplayMode::Efficient) { - m_sizeSlider->setValueLiteral(QString::number(m_daemonDockInter->windowSizeEfficient())); + m_sizeSlider->slider()->setValue(int(m_daemonDockInter->windowSizeEfficient())); } else { Q_ASSERT_X(false, __FILE__, "not supported"); } + m_sizeSlider->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-settings-plugin/module_widget.h b/plugins/dcc-dock-settings-plugin/module_widget.h index 7232b28a3..9ef21f281 100644 --- a/plugins/dcc-dock-settings-plugin/module_widget.h +++ b/plugins/dcc-dock-settings-plugin/module_widget.h @@ -23,6 +23,8 @@ #include +#include + #include #include "com_deepin_dde_dock.h" @@ -31,12 +33,18 @@ namespace dcc { namespace widgets { class ComboxWidget; class TitledSliderItem; -class SwitchWidget; } } +DWIDGET_BEGIN_NAMESPACE +class DListView; +class DTipLabel; +DWIDGET_END_NAMESPACE + class TitleLabel; class GSettingWatcher; +class QStandardItemModel; + using namespace dcc::widgets; using DBusDock = com::deepin::dde::daemon::Dock; using DBusInter = com::deepin::dde::Dock; @@ -48,10 +56,12 @@ public: explicit ModuleWidget(QWidget *parent = nullptr); ~ ModuleWidget(); +private: void initUI(); private Q_SLOTS: - void updateSliderValue(int displayMode); + void updateSliderValue(); + void updateItemCheckStatus(const QString &name, bool visible); private: ComboxWidget *m_modeComboxWidget; @@ -64,7 +74,9 @@ private: ComboxWidget *m_screenSettingComboxWidget; TitleLabel *m_pluginAreaTitle; - QList m_pluginWidgetList; + DTK_WIDGET_NAMESPACE::DTipLabel *m_pluginTips; + DTK_WIDGET_NAMESPACE::DListView *m_pluginView; + QStandardItemModel *m_pluginModel; DBusDock *m_daemonDockInter; DBusInter *m_dockInter; diff --git a/plugins/dcc-dock-settings-plugin/resources.qrc b/plugins/dcc-dock-settings-plugin/resources.qrc new file mode 100644 index 000000000..0fbdc10df --- /dev/null +++ b/plugins/dcc-dock-settings-plugin/resources.qrc @@ -0,0 +1,16 @@ + + + actions/icon_dock_32px.svg + + + icons/plugins/time.svg + icons/plugins/assistant.svg + icons/plugins/desktop.svg + icons/plugins/keyboard.svg + icons/plugins/notify.svg + icons/plugins/plug-in2.svg + icons/plugins/power.svg + icons/plugins/task.svg + icons/plugins/trash.svg + + diff --git a/plugins/dcc-dock-settings-plugin/settings_module.cpp b/plugins/dcc-dock-settings-plugin/settings_module.cpp index 72e6b0ff7..71fcbba0f 100644 --- a/plugins/dcc-dock-settings-plugin/settings_module.cpp +++ b/plugins/dcc-dock-settings-plugin/settings_module.cpp @@ -61,7 +61,7 @@ const QString SettingsModule::displayName() const QIcon SettingsModule::icon() const { - return QIcon::fromTheme("unknown"); + return QIcon::fromTheme("icon_dock"); } QString SettingsModule::translationPath() const 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 712958fdf..5815110e9 100644 --- a/tests/plugins/dcc-dock-settings-plugin/ut_module_widget.cpp +++ b/tests/plugins/dcc-dock-settings-plugin/ut_module_widget.cpp @@ -7,18 +7,9 @@ class Test_ModuleWidget : public QObject, public ::testing::Test {}; -TEST(Test_ModuleWidget_DeathTest, updateSliderValue) -{ - ModuleWidget widget; -#ifdef QT_DEBUG - EXPECT_DEBUG_DEATH({widget.updateSliderValue(-1);}, ""); -#endif -} - TEST_F(Test_ModuleWidget, updateSliderValue) { ModuleWidget widget; - widget.updateSliderValue(0); - widget.updateSliderValue(1); + widget.updateSliderValue(); }