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 @@
+
+
\ 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 @@
+
+
\ 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 @@
+
+
\ 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 @@
+
+
\ 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 @@
+
+
\ 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 @@
+
+
\ 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 @@
+
+
\ 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 @@
+
+
\ 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 @@
+
+
\ 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 @@
+
+
\ 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();
}