diff --git a/debian/dde-shell.install b/debian/dde-shell.install index 17a122b62..b2d738507 100644 --- a/debian/dde-shell.install +++ b/debian/dde-shell.install @@ -15,6 +15,7 @@ usr/share/dde-shell/org.deepin.ds.dde-am*/ usr/libexec/dockplugin-loader usr/lib/*/qt5/plugins/wayland-shell-integration usr/lib/*/libdde-dockplugin-interface.so.* +usr/lib/*/libdock-plugin.so.* usr/share/dsg/configs/org.deepin.ds.dock/ usr/lib/dde-dock/tmp/plugins usr/lib/dde-dock/tmp/plugins/quick-trays diff --git a/frame/containment.cpp b/frame/containment.cpp index 41943df6b..247545fe4 100644 --- a/frame/containment.cpp +++ b/frame/containment.cpp @@ -57,6 +57,7 @@ DApplet *DContainment::createApplet(const DAppletData &data) }); d->m_applets.append(applet); + Q_EMIT appletListChanged(); return applet; } @@ -66,6 +67,7 @@ void DContainment::removeApplet(DApplet *applet) D_D(DContainment); if (d->m_applets.contains(applet)) { d->m_applets.removeOne(applet); + Q_EMIT appletListChanged(); } if (auto view = applet->rootObject()) { d->m_model->remove(view); diff --git a/frame/containment.h b/frame/containment.h index 5e4986ef7..7d36941d0 100644 --- a/frame/containment.h +++ b/frame/containment.h @@ -39,6 +39,9 @@ class DS_SHARE DContainment : public DApplet bool load() override; bool init() override; +Q_SIGNALS: + void appletListChanged(); + protected: explicit DContainment(DContainmentPrivate &dd, QObject *parent = nullptr); }; diff --git a/panels/dock/CMakeLists.txt b/panels/dock/CMakeLists.txt index 708482b01..305918538 100644 --- a/panels/dock/CMakeLists.txt +++ b/panels/dock/CMakeLists.txt @@ -59,7 +59,7 @@ add_library(dockpanel SHARED target_link_libraries(dockpanel PRIVATE PkgConfig::WaylandClient - dde-shell-frame + dock-plugin ) if (BUILD_WITH_X11) @@ -93,14 +93,20 @@ add_subdirectory(dockplugin) # dock qml element(include Dock.xx defines and DockCompositor) file( - GLOB dock_plugin_sources + GLOB dock_plugin_headers constants.h + ddockapplet.h +) +file( + GLOB dock_plugin_sources # dockfilterproxymodel.cpp # dockfilterproxymodel.h dockpluginmanagerextension_p.h dockpluginmanagerextension.cpp dockpluginmanagerintegration_p.h dockpluginmanagerintegration.cpp + private/ddockapplet_p.h + ddockapplet.cpp ) set_source_files_properties(DockCompositor.qml PROPERTIES @@ -117,15 +123,22 @@ set_source_files_properties(DockPalette.qml PROPERTIES qt_policy(SET QTP0001 OLD) qt_add_qml_module(dock-plugin - PLUGIN_TARGET dock-plugin + PLUGIN_TARGET dock-qml-plugin URI "org.deepin.ds.dock" VERSION "1.0" SHARED - SOURCES ${dock_plugin_sources} - QML_FILES DockCompositor.qml OverflowContainer.qml MenuHelper.qml DockPalette.qml + SOURCES ${dock_plugin_headers} ${dock_plugin_sources} + QML_FILES DockCompositor.qml OverflowContainer.qml MenuHelper.qml DockPalette.qml DockItem.qml OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/plugins/org/deepin/ds/dock/ ) +set_target_properties(dock-plugin PROPERTIES + VERSION ${CMAKE_PROJECT_VERSION} + SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR} + OUTPUT_NAME dock-plugin + EXPORT_NAME DockShell +) + qt_generate_wayland_protocol_server_sources(dock-plugin FILES ${CMAKE_CURRENT_SOURCE_DIR}/dockplugin/protocol/dock-plugin-manager-v1.xml @@ -137,6 +150,7 @@ target_link_libraries(dock-plugin PUBLIC Qt${QT_VERSION_MAJOR}::Qml Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::WaylandCompositor + dde-shell-frame PRIVATE PkgConfig::WaylandClient Qt${QT_VERSION_MAJOR}::WaylandCompositorPrivate @@ -147,6 +161,19 @@ target_include_directories(dock-plugin $ ) +target_include_directories(dock-plugin INTERFACE + $ + $ + $ +) + +target_link_directories(dock-plugin INTERFACE + $ + $ +) + +install(FILES ${dock_plugin_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/dockshell") +install(TARGETS dock-plugin DESTINATION "${LIB_INSTALL_DIR}") install(DIRECTORY "${PROJECT_BINARY_DIR}/plugins/org/deepin/ds/dock/" DESTINATION "${QML_INSTALL_DIR}/org/deepin/ds/dock/") dtk_add_config_meta_files(APPID org.deepin.ds.dock FILES dconfig/org.deepin.ds.dock.json) dtk_add_config_meta_files(APPID org.deepin.ds.dock FILES dconfig/org.deepin.ds.dock.power.json) diff --git a/panels/dock/DockItem.qml b/panels/dock/DockItem.qml new file mode 100644 index 000000000..3e312929c --- /dev/null +++ b/panels/dock/DockItem.qml @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import org.deepin.ds 1.0 +import org.deepin.dtk 1.0 as D +import org.deepin.dtk.private 1.0 as DP +import org.deepin.ds.dock 1.0 + +AppletItem { + id: root + property int dockOrder + property bool shouldVisible + property alias toolButtonColor: backgroundButton.color1 + property alias toolButtonBorderColor: backgroundButton.outsideBorderColor + property alias toolTip: toolTip.text + property alias icon: button.icon.name + + signal clicked + + PanelToolTip { + id: toolTip + } + D.ToolButton { + id: button + anchors.centerIn: parent + width: 30 + height: 30 + icon.width: 16 + icon.height: 16 + + display: D.IconLabel.IconOnly + onClicked: { + toolTip.close() + root.clicked() + } + + onHoveredChanged: { + if (toolTip.text === "") + return + + if (hovered) { + var point = Applet.rootObject.mapToItem(null, Applet.rootObject.width / 2, 0) + toolTip.toolTipX = point.x + toolTip.toolTipY = point.y + toolTip.open() + } else { + toolTip.close() + } + } + + background: DP.ButtonPanel { + id: backgroundButton + + button: button + color2: color1 + insideBorderColor: null + } + } +} diff --git a/panels/dock/clipboarditem/CMakeLists.txt b/panels/dock/clipboarditem/CMakeLists.txt index eb8e98a0e..61826b901 100644 --- a/panels/dock/clipboarditem/CMakeLists.txt +++ b/panels/dock/clipboarditem/CMakeLists.txt @@ -5,13 +5,11 @@ add_library(dock-clipboarditem SHARED clipboarditem.cpp clipboarditem.h - ../dockiteminfo.cpp - ../dockiteminfo.h ) target_link_libraries(dock-clipboarditem PRIVATE - dde-shell-frame + dock-plugin ) ds_install_package(PACKAGE org.deepin.ds.dock.clipboarditem TARGET dock-clipboarditem) -ds_handle_package_translation(PACKAGE org.deepin.ds.dock.clipboarditem) \ No newline at end of file +ds_handle_package_translation(PACKAGE org.deepin.ds.dock.clipboarditem) diff --git a/panels/dock/clipboarditem/clipboarditem.cpp b/panels/dock/clipboarditem/clipboarditem.cpp index 1b2356e55..215bc4365 100644 --- a/panels/dock/clipboarditem/clipboarditem.cpp +++ b/panels/dock/clipboarditem/clipboarditem.cpp @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -#include "applet.h" #include "clipboarditem.h" #include "pluginfactory.h" @@ -25,64 +24,30 @@ static DDBusSender clipboardDbus() } ClipboardItem::ClipboardItem(QObject *parent) - : DApplet(parent) - , m_visible(true) + : DDockApplet(parent) { - + setVisible(true); + setIcon("clipboard"); } -void ClipboardItem::toggleClipboard() +QString ClipboardItem::displayName() const { - clipboardDbus().method("Toggle").call(); + return tr("Clipboard"); } -DockItemInfo ClipboardItem::dockItemInfo() +QString ClipboardItem::itemKey() const { - DockItemInfo info; - info.name = "clipboard"; - info.displayName = tr("Clipboard"); - info.itemKey = "clipboard"; - info.settingKey = "clipboard"; - info.visible = m_visible; - { - const auto lightPalette = DGuiApplicationHelper::instance()->applicationPalette(DGuiApplicationHelper::LightType); - auto lightPixmap = DDciIcon::fromTheme("clipboard").pixmap( - qApp->devicePixelRatio(), - 30, - DDciIcon::Light, - DDciIcon::Normal, - DDciIconPalette::fromQPalette(lightPalette) - ); - QBuffer buffer(&info.iconLight); - if (buffer.open(QIODevice::WriteOnly)) { - lightPixmap.save(&buffer, "png"); - } - } - { - const auto darkPalette = DGuiApplicationHelper::instance()->applicationPalette(DGuiApplicationHelper::DarkType); - auto darkPixmap = DDciIcon::fromTheme("clipboard").pixmap( - qApp->devicePixelRatio(), - 30, - DDciIcon::Dark, - DDciIcon::Normal, - DDciIconPalette::fromQPalette(darkPalette) - ); - QBuffer buffer(&info.iconDark); - if (buffer.open(QIODevice::WriteOnly)) { - darkPixmap.save(&buffer, "png"); - } - } - - return info; + return QString("clipboard"); } -void ClipboardItem::setVisible(bool visible) +QString ClipboardItem::settingKey() const { - if (m_visible != visible) { - m_visible = visible; + return QString("clipboard"); +} - Q_EMIT visibleChanged(visible); - } +void ClipboardItem::toggleClipboard() +{ + clipboardDbus().method("Toggle").call(); } D_APPLET_CLASS(ClipboardItem) diff --git a/panels/dock/clipboarditem/clipboarditem.h b/panels/dock/clipboarditem/clipboarditem.h index 68660601d..ce53118cd 100644 --- a/panels/dock/clipboarditem/clipboarditem.h +++ b/panels/dock/clipboarditem/clipboarditem.h @@ -4,31 +4,22 @@ #pragma once -#include "applet.h" +#include "ddockapplet.h" #include "dsglobal.h" -#include "../dockiteminfo.h" namespace dock { -class ClipboardItem : public DS_NAMESPACE::DApplet +class ClipboardItem : public DS_NAMESPACE::DDockApplet { Q_OBJECT - Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged) public: explicit ClipboardItem(QObject *parent = nullptr); - Q_INVOKABLE void toggleClipboard(); - - Q_INVOKABLE DockItemInfo dockItemInfo(); - - inline bool visible() const { return m_visible;} - Q_INVOKABLE void setVisible(bool visible); + QString displayName() const override; + QString itemKey() const override; + QString settingKey() const override; -Q_SIGNALS: - void visibleChanged(bool); - -private: - bool m_visible; + Q_INVOKABLE void toggleClipboard(); }; } diff --git a/panels/dock/clipboarditem/package/clipboarditem.qml b/panels/dock/clipboarditem/package/clipboarditem.qml index bf47c9302..0d8498cd3 100644 --- a/panels/dock/clipboarditem/package/clipboarditem.qml +++ b/panels/dock/clipboarditem/package/clipboarditem.qml @@ -2,61 +2,22 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -import QtQuick 2.15 -import QtQuick.Controls 2.15 - import org.deepin.ds 1.0 -import org.deepin.dtk 1.0 as D -import org.deepin.dtk.private 1.0 as DP import org.deepin.ds.dock 1.0 -import org.deepin.dtk.style 1.0 as DStyle -AppletItem { - id: clipboardItem +DockItem { + dockOrder: 1 + shouldVisible: Applet.visible + toolButtonColor: DockPalette.toolButtonColor + toolButtonBorderColor: DockPalette.toolButtonBorderColor + toolTip: qsTr("Clipboard") + icon: Applet.icon + property int dockSize: Panel.rootObject.dockSize - property int dockOrder: 1 implicitWidth: Panel.rootObject.useColumnLayout ? dockSize : 30 implicitHeight: Panel.rootObject.useColumnLayout ? 30 : dockSize - property bool shouldVisible: Applet.visible - property D.Palette toolButtonColor: DockPalette.toolButtonColor - property D.Palette toolButtonBorderColor: DockPalette.toolButtonBorderColor - - PanelToolTip { - id: toolTip - text: qsTr("Clipboard") - } - D.ToolButton { - id: button - anchors.centerIn: parent - width: 30 - height: 30 - icon.name: "clipboard" - icon.width: 16 - icon.height: 16 - - display: D.IconLabel.IconOnly - onClicked: { - Applet.toggleClipboard() - toolTip.close() - } - - onHoveredChanged: { - if (hovered) { - var point = Applet.rootObject.mapToItem(null, Applet.rootObject.width / 2, 0) - toolTip.toolTipX = point.x - toolTip.toolTipY = point.y - toolTip.open() - } else { - toolTip.close() - } - } - background: DP.ButtonPanel { - button: button - color1: clipboardItem.toolButtonColor - color2: clipboardItem.toolButtonColor - outsideBorderColor: clipboardItem.toolButtonBorderColor - insideBorderColor: null - } + onClicked: { + Applet.toggleClipboard() } } diff --git a/panels/dock/ddockapplet.cpp b/panels/dock/ddockapplet.cpp new file mode 100644 index 000000000..55135e795 --- /dev/null +++ b/panels/dock/ddockapplet.cpp @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "ddockapplet.h" +#include "private/ddockapplet_p.h" + +#include + +DS_BEGIN_NAMESPACE + +DCORE_USE_NAMESPACE + +Q_DECLARE_LOGGING_CATEGORY(dsLog) + +DDockAppletPrivate::DDockAppletPrivate(DDockApplet *qq) + : DAppletPrivate(qq) +{ + +} + +DDockAppletPrivate::~DDockAppletPrivate() +{ + +} + +DDockApplet::DDockApplet(QObject *parent) + : DDockApplet(*new DDockAppletPrivate(this), parent) +{ + +} + +DDockApplet::DDockApplet(DDockAppletPrivate &dd, QObject *parent) + : DApplet(dd, parent) +{ + +} + +DDockApplet::~DDockApplet() +{ + qDebug(dsLog) << "Destroyed DDockApplet:" << pluginId() << id(); +} + +/*! + A unique name that identifies the plug-in. The default implementation is `pluginId`. +*/ +QString DDockApplet::name() const +{ + return DApplet::pluginId(); +} + +/*! + A name that displays a name that matches the current locale +*/ +/** + * @brief DDockApplet::displayName + * @return + */ + +/** + * @brief DDockApplet::itemKey + * @return + */ + +/** + * @brief DDockApplet::settingKey + * @return + */ + +/*! + A dci icon for display +*/ +QString DDockApplet::icon() const +{ + D_DC(DDockApplet); + + return d->icon; +} + +void DDockApplet::setIcon(const QString &icon) +{ + D_D(DDockApplet); + + d->icon = icon; + Q_EMIT iconChanged(icon); +} + +/*! + Whether the plug-in is displayed on the panel +*/ +bool DDockApplet::visible() const +{ + D_DC(DDockApplet); + + return d->visible; +} + +void DDockApplet::setVisible(bool visible) +{ + D_D(DDockApplet); + + if (d->visible == visible) + return; + + d->visible = visible; + Q_EMIT visibleChanged(visible); +} + +DS_END_NAMESPACE diff --git a/panels/dock/ddockapplet.h b/panels/dock/ddockapplet.h new file mode 100644 index 000000000..2ca1d4a50 --- /dev/null +++ b/panels/dock/ddockapplet.h @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "applet.h" +#include "dsglobal.h" + +#include + +#include + +DS_BEGIN_NAMESPACE +/** + * @brief You Can Used As Dock Plugins Sub Class + */ +class DDockAppletPrivate; +class DS_SHARE DDockApplet : public DApplet +{ + Q_OBJECT + Q_PROPERTY(QString name READ name CONSTANT FINAL) + Q_PROPERTY(QString displayName READ displayName CONSTANT FINAL) + Q_PROPERTY(QString itemKey READ itemKey CONSTANT FINAL) + Q_PROPERTY(QString settingKey READ settingKey CONSTANT FINAL) + Q_PROPERTY(QString icon READ icon NOTIFY iconChanged FINAL) + Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged FINAL); + + D_DECLARE_PRIVATE(DDockApplet); + +public: + explicit DDockApplet(QObject *parent = nullptr); + virtual ~DDockApplet() override; + + virtual QString name() const; + virtual QString displayName() const = 0; + virtual QString itemKey() const = 0; + virtual QString settingKey() const = 0; + + QString icon() const; + void setIcon(const QString &icon); + + bool visible() const; + void setVisible(bool visible); + +Q_SIGNALS: + void iconChanged(const QString &); + void visibleChanged(bool); + +protected: + explicit DDockApplet(DDockAppletPrivate &dd, QObject *parent = nullptr); +}; + +DS_END_NAMESPACE diff --git a/panels/dock/dockdbusproxy.cpp b/panels/dock/dockdbusproxy.cpp index 966a425ab..8300aaf81 100644 --- a/panels/dock/dockdbusproxy.cpp +++ b/panels/dock/dockdbusproxy.cpp @@ -6,11 +6,13 @@ #include "dsglobal.h" #include "constants.h" #include "dockpanel.h" +#include "ddockapplet.h" #include "dockdbusproxy.h" #include #include +#include DGUI_USE_NAMESPACE @@ -18,51 +20,38 @@ namespace dock { DockDBusProxy::DockDBusProxy(DockPanel* parent) : QObject(parent) , m_oldDockApplet(nullptr) - , m_clipboardApplet(nullptr) - , m_searchApplet(nullptr) - , m_multitaskviewApplet(nullptr) { registerPluginInfoMetaType(); connect(DockSettings::instance(), &DockSettings::pluginsVisibleChanged, this, [this] (const QVariantMap &pluginsVisible) { - setPluginVisible("org.deepin.ds.dock.clipboarditem", pluginsVisible); - setPluginVisible("org.deepin.ds.dock.searchitem", pluginsVisible); - setPluginVisible("org.deepin.ds.dock.multitaskview", pluginsVisible); + for (auto applet : m_dockApplets) { + QString itemKey = applet->itemKey(); + if (pluginsVisible.contains(itemKey)) { + applet->setVisible(pluginsVisible[itemKey].toBool()); + } else { + auto settingPluginsVisible = DockSettings::instance()->pluginsVisible(); + settingPluginsVisible[itemKey] = true; + DockSettings::instance()->setPluginsVisible(settingPluginsVisible); + } + } }); connect(parent, &DockPanel::rootObjectChanged, this, [this]() { auto pluginsVisible = DockSettings::instance()->pluginsVisible(); - setPluginVisible("org.deepin.ds.dock.clipboarditem", pluginsVisible); - setPluginVisible("org.deepin.ds.dock.searchitem", pluginsVisible); - setPluginVisible("org.deepin.ds.dock.multitaskview", pluginsVisible); - }); - - // Communicate with the other module - auto getOtherApplet = [ = ] { - QList list = appletList("org.deepin.ds.dock.tray"); - if (!list.isEmpty()) m_oldDockApplet = list.first(); - - list = appletList("org.deepin.ds.dock.clipboarditem"); - if (!list.isEmpty()) m_clipboardApplet = list.first(); - - list = appletList("org.deepin.ds.dock.searchitem"); - if (!list.isEmpty()) m_searchApplet = list.first(); - - list = appletList("org.deepin.ds.dock.multitaskview"); - if (!list.isEmpty()) m_multitaskviewApplet = list.first(); - - return m_oldDockApplet && m_clipboardApplet && m_searchApplet && m_multitaskviewApplet; - }; - - // TODO: DQmlGlobal maybe missing a signal which named `appletListChanged`? - QTimer *timer = new QTimer; - timer->setInterval(1000); - connect(timer, &QTimer::timeout, this, [ = ] { - if (getOtherApplet()) { - timer->stop(); - timer->deleteLater(); + for (auto applet : m_dockApplets) { + QString itemKey = applet->itemKey(); + if (pluginsVisible.contains(itemKey)) { + applet->setVisible(pluginsVisible[itemKey].toBool()); + } else { + auto settingPluginsVisible = DockSettings::instance()->pluginsVisible(); + settingPluginsVisible[itemKey] = true; + DockSettings::instance()->setPluginsVisible(settingPluginsVisible); + } } }); - timer->start(); + + auto root = qobject_cast(this->parent()); + connect(root, &DS_NAMESPACE::DContainment::appletListChanged, this, &DockDBusProxy::onAppletListChanged); + onAppletListChanged(); } DockPanel* DockDBusProxy::parent() const @@ -112,12 +101,15 @@ QRect DockDBusProxy::geometry() void DockDBusProxy::setPluginVisible(const QString &pluginId, const QVariantMap &pluginsVisible) { - if (auto item = applet(pluginId)) { - DockItemInfo itemInfo; - QMetaObject::invokeMethod(item, "dockItemInfo", Qt::DirectConnection, qReturnArg(itemInfo)); - QString itemKey = itemInfo.itemKey; + auto it = std::find_if(m_dockApplets.begin(), m_dockApplets.end(), [ = ] (DS_NAMESPACE::DDockApplet *applet) { + return pluginId == applet->pluginId(); + }); + + if (it != m_dockApplets.end()) { + auto applet = (*it); + const auto &itemKey = applet->itemKey(); if (pluginsVisible.contains(itemKey)) { - QMetaObject::invokeMethod(item, "setVisible", Qt::QueuedConnection, pluginsVisible[itemKey].toBool()); + applet->setVisible(pluginsVisible[itemKey].toBool()); } else { auto settingPluginsVisible = DockSettings::instance()->pluginsVisible(); settingPluginsVisible[itemKey] = true; @@ -226,6 +218,31 @@ bool DockDBusProxy::RequestUndock(const QString &desktopFile) return res; } +void DockDBusProxy::onAppletListChanged() +{ + // for old dock + QList list = appletList("org.deepin.ds.dock.tray"); + if (!m_oldDockApplet && !list.isEmpty()) m_oldDockApplet = list.first(); + + // other dock plugin + m_dockApplets.clear(); + auto root = qobject_cast(parent()); + + QQueue containments; + containments.enqueue(root); + while (!containments.isEmpty()) { + DS_NAMESPACE::DContainment *containment = containments.dequeue(); + for (const auto applet : containment->applets()) { + if (auto item = qobject_cast(applet)) { + containments.enqueue(item); + } + if (auto dockApplet = qobject_cast(applet)) { + m_dockApplets << dockApplet; + } + } + } +} + QStringList DockDBusProxy::GetLoadedPlugins() { // TODO: implement this function @@ -239,25 +256,46 @@ DockItemInfos DockDBusProxy::plugins() QMetaObject::invokeMethod(m_oldDockApplet, "plugins", Qt::DirectConnection, qReturnArg(iteminfos)); } - if (m_clipboardApplet) { + for (auto applet : m_dockApplets) { DockItemInfo info; - if (QMetaObject::invokeMethod(m_clipboardApplet, "dockItemInfo", Qt::DirectConnection, qReturnArg(info))) { - iteminfos.append(info); + info.name = applet->name(); + info.displayName = applet->displayName(); + info.itemKey = applet->itemKey(); + info.settingKey = applet->settingKey(); + info.visible = applet->visible(); + + { + const auto lightPalette = DGuiApplicationHelper::instance()->applicationPalette(DGuiApplicationHelper::LightType); + auto lightPixmap = DDciIcon::fromTheme(applet->icon()).pixmap( + qApp->devicePixelRatio(), + 30, + DDciIcon::Light, + DDciIcon::Normal, + DDciIconPalette::fromQPalette(lightPalette) + ); + QBuffer buffer(&info.iconLight); + if (buffer.open(QIODevice::WriteOnly)) { + lightPixmap.save(&buffer, "png"); + } + } + { + const auto darkPalette = DGuiApplicationHelper::instance()->applicationPalette(DGuiApplicationHelper::DarkType); + auto darkPixmap = DDciIcon::fromTheme("search").pixmap( + qApp->devicePixelRatio(), + 30, + DDciIcon::Dark, + DDciIcon::Normal, + DDciIconPalette::fromQPalette(darkPalette) + ); + QBuffer buffer(&info.iconDark); + if (buffer.open(QIODevice::WriteOnly)) { + darkPixmap.save(&buffer, "png"); + } } - } - if (m_searchApplet) { - DockItemInfo info; - if (QMetaObject::invokeMethod(m_searchApplet, "dockItemInfo", Qt::DirectConnection, qReturnArg(info))) - iteminfos.append(info); + iteminfos.append(info); } - if (m_multitaskviewApplet && DWindowManagerHelper::instance()->hasComposite()) { - DockItemInfo info; - if (QMetaObject::invokeMethod(m_multitaskviewApplet, "dockItemInfo", Qt::DirectConnection, qReturnArg(info))) { - iteminfos.append(info); - } - } return iteminfos; } @@ -273,23 +311,16 @@ void DockDBusProxy::callShow() void DockDBusProxy::setItemOnDock(const QString &settingKey, const QString &itemKey, bool visible) { - if (itemKey == "clipboard" && m_clipboardApplet) { - QMetaObject::invokeMethod(m_clipboardApplet, "setVisible", Qt::QueuedConnection, visible); - auto pluginsVisible = DockSettings::instance()->pluginsVisible(); - pluginsVisible[itemKey] = visible; - DockSettings::instance()->setPluginsVisible(pluginsVisible); - } else if (itemKey == "search" && m_searchApplet) { - QMetaObject::invokeMethod(m_searchApplet, "setVisible", Qt::QueuedConnection, visible); - auto pluginsVisible = DockSettings::instance()->pluginsVisible(); - pluginsVisible[itemKey] = visible; - DockSettings::instance()->setPluginsVisible(pluginsVisible); - } else if (itemKey == "multitasking-view" && m_multitaskviewApplet) { - QMetaObject::invokeMethod(m_multitaskviewApplet, "setVisible", Qt::QueuedConnection, visible); + auto it = std::find_if(m_dockApplets.begin(), m_dockApplets.end(), [ = ] (DS_NAMESPACE::DDockApplet *applet) { + return itemKey == applet->itemKey(); + }); + + if (it != m_dockApplets.end()) { + auto applet = (*it); + applet->setVisible(visible); auto pluginsVisible = DockSettings::instance()->pluginsVisible(); pluginsVisible[itemKey] = visible; DockSettings::instance()->setPluginsVisible(pluginsVisible); - } else if (m_oldDockApplet) { - QMetaObject::invokeMethod(m_oldDockApplet, "setItemOnDock", Qt::QueuedConnection, settingKey, itemKey, visible); } } diff --git a/panels/dock/dockdbusproxy.h b/panels/dock/dockdbusproxy.h index cf74da49d..184191f5a 100644 --- a/panels/dock/dockdbusproxy.h +++ b/panels/dock/dockdbusproxy.h @@ -13,6 +13,10 @@ #include #include +namespace DS_NAMESPACE { +class DDockApplet; +} + /** this class used for old dock api compatible * it will forward old dbus call to new implementation */ @@ -67,6 +71,9 @@ class DockDBusProxy final: public QObject, public QDBusContext bool IsDocked(const QString &desktopFile); bool RequestUndock(const QString &desktopFile); +private Q_SLOTS: + void onAppletListChanged(); + private: DockPanel* parent() const; QString getAppID(const QString &desktopfile); @@ -75,9 +82,7 @@ class DockDBusProxy final: public QObject, public QDBusContext void setPluginVisible(const QString &pluginId, const QVariantMap &pluginsVisible); DS_NAMESPACE::DApplet *m_oldDockApplet; - DS_NAMESPACE::DApplet *m_clipboardApplet; - DS_NAMESPACE::DApplet *m_searchApplet; - DS_NAMESPACE::DApplet *m_multitaskviewApplet; + QList m_dockApplets; }; } diff --git a/panels/dock/multitaskview/CMakeLists.txt b/panels/dock/multitaskview/CMakeLists.txt index ff09258bf..ab8ca8cab 100644 --- a/panels/dock/multitaskview/CMakeLists.txt +++ b/panels/dock/multitaskview/CMakeLists.txt @@ -5,12 +5,10 @@ add_library(dock-multitaskview SHARED multitaskview.cpp multitaskview.h - ../dockiteminfo.cpp - ../dockiteminfo.h ) target_link_libraries(dock-multitaskview PRIVATE - dde-shell-frame + dock-plugin ) ds_install_package(PACKAGE org.deepin.ds.dock.multitaskview TARGET dock-multitaskview) diff --git a/panels/dock/multitaskview/multitaskview.cpp b/panels/dock/multitaskview/multitaskview.cpp index f5f56e38a..5a5c14370 100644 --- a/panels/dock/multitaskview/multitaskview.cpp +++ b/panels/dock/multitaskview/multitaskview.cpp @@ -18,10 +18,12 @@ DGUI_USE_NAMESPACE namespace dock { MultiTaskView::MultiTaskView(QObject *parent) - : DApplet(parent) - , m_iconName("deepin-multitasking-view") + : DDockApplet(parent) { - connect(DWindowManagerHelper::instance(), &DWindowManagerHelper::hasCompositeChanged, this, &MultiTaskView::visibleChanged); + connect(DWindowManagerHelper::instance(), &DWindowManagerHelper::hasCompositeChanged, this, &MultiTaskView::onHasCompositeChanged); + + setVisible(true); + setIcon("dcc-view"); } bool MultiTaskView::init() @@ -40,75 +42,28 @@ void MultiTaskView::openWorkspace() .call(); } -QString MultiTaskView::iconName() const +void MultiTaskView::onHasCompositeChanged() { - return m_iconName; + // TODO + // setVisible(DWindowManagerHelper::instance()->hasComposite()); } -void MultiTaskView::setIconName(const QString& iconName) +QString MultiTaskView::displayName() const { - if (iconName != m_iconName) { - m_iconName = iconName; - Q_EMIT iconNameChanged(); - } + return tr("Multitasking View"); } -bool MultiTaskView::visible() const +QString MultiTaskView::itemKey() const { - return m_visible && DWindowManagerHelper::instance()->hasComposite(); + return QString("multitasking-view"); } -DockItemInfo MultiTaskView::dockItemInfo() +QString MultiTaskView::settingKey() const { - DockItemInfo info; - info.name = "multitasking-view"; - info.displayName = tr("Multitasking View"); - info.itemKey = "multitasking-view"; - info.settingKey = "multitasking-view"; - info.visible = visible(); - { - const auto lightPalette = DGuiApplicationHelper::instance()->applicationPalette(DGuiApplicationHelper::LightType); - auto lightPixmap = DDciIcon::fromTheme("dcc-view").pixmap( - qApp->devicePixelRatio(), - 30, - DDciIcon::Light, - DDciIcon::Normal, - DDciIconPalette::fromQPalette(lightPalette) - ); - QBuffer buffer(&info.iconLight); - if (buffer.open(QIODevice::WriteOnly)) { - lightPixmap.save(&buffer, "png"); - } - } - { - const auto darkPalette = DGuiApplicationHelper::instance()->applicationPalette(DGuiApplicationHelper::DarkType); - auto darkPixmap = DDciIcon::fromTheme("dcc-view").pixmap( - qApp->devicePixelRatio(), - 30, - DDciIcon::Dark, - DDciIcon::Normal, - DDciIconPalette::fromQPalette(darkPalette) - ); - QBuffer buffer(&info.iconDark); - if (buffer.open(QIODevice::WriteOnly)) { - darkPixmap.save(&buffer, "png"); - } - } - - return info; -} - -void MultiTaskView::setVisible(bool visible) -{ - if (m_visible != visible) { - m_visible = visible; - - Q_EMIT visibleChanged(); - } + return QString("multitasking-view"); } D_APPLET_CLASS(MultiTaskView) } - #include "multitaskview.moc" diff --git a/panels/dock/multitaskview/multitaskview.h b/panels/dock/multitaskview/multitaskview.h index 4766a5427..03c76f121 100644 --- a/panels/dock/multitaskview/multitaskview.h +++ b/panels/dock/multitaskview/multitaskview.h @@ -4,39 +4,29 @@ #pragma once -#include "applet.h" +#include "ddockapplet.h" #include "dsglobal.h" -#include "../dockiteminfo.h" namespace dock { -class MultiTaskView : public DS_NAMESPACE::DApplet +class MultiTaskView : public DS_NAMESPACE::DDockApplet { Q_OBJECT - Q_PROPERTY(QString iconName READ iconName WRITE setIconName NOTIFY iconNameChanged FINAL) - Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged) public: explicit MultiTaskView(QObject *parent = nullptr); virtual bool init() override; - QString iconName() const; - void setIconName(const QString& iconName); bool hasComposite(); - Q_INVOKABLE void openWorkspace(); - Q_INVOKABLE DockItemInfo dockItemInfo(); - - Q_INVOKABLE bool visible() const; - Q_INVOKABLE void setVisible(bool visible); + QString displayName() const override; + QString itemKey() const override; + QString settingKey() const override; -Q_SIGNALS: - void iconNameChanged(); - void visibleChanged(); + Q_INVOKABLE void openWorkspace(); -private: - bool m_visible; - QString m_iconName; +public Q_SLOTS: + void onHasCompositeChanged(); }; } diff --git a/panels/dock/multitaskview/package/multitaskview.qml b/panels/dock/multitaskview/package/multitaskview.qml index 4f61b23d7..e2bbfcd64 100644 --- a/panels/dock/multitaskview/package/multitaskview.qml +++ b/panels/dock/multitaskview/package/multitaskview.qml @@ -26,7 +26,7 @@ AppletItem { D.DciIcon { id: icon anchors.centerIn: parent - name: Applet.iconName + name: "deepin-multitasking-view" scale: Panel.rootObject.dockItemMaxSize * 9 / 14 / Dock.MAX_DOCK_TASKMANAGER_ICON_SIZE // 9:14 (iconSize/dockHeight) sourceSize: Qt.size(Dock.MAX_DOCK_TASKMANAGER_ICON_SIZE, Dock.MAX_DOCK_TASKMANAGER_ICON_SIZE) diff --git a/panels/dock/private/ddockapplet_p.h b/panels/dock/private/ddockapplet_p.h new file mode 100644 index 000000000..303a85829 --- /dev/null +++ b/panels/dock/private/ddockapplet_p.h @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "private/applet_p.h" +#include "ddockapplet.h" + +#include +#include + +DS_BEGIN_NAMESPACE +class DDockAppletPrivate : public DAppletPrivate +{ +public: + explicit DDockAppletPrivate(DDockApplet *qq); + ~DDockAppletPrivate() override; + + bool visible = false; + QString icon; + D_DECLARE_PUBLIC(DDockApplet); +}; + +DS_END_NAMESPACE diff --git a/panels/dock/searchitem/CMakeLists.txt b/panels/dock/searchitem/CMakeLists.txt index eaedb74e4..3a9c8eede 100644 --- a/panels/dock/searchitem/CMakeLists.txt +++ b/panels/dock/searchitem/CMakeLists.txt @@ -5,12 +5,10 @@ add_library(dock-searchitem SHARED searchitem.cpp searchitem.h - ../dockiteminfo.cpp - ../dockiteminfo.h ) target_link_libraries(dock-searchitem PRIVATE - dde-shell-frame + dock-plugin ) ds_install_package(PACKAGE org.deepin.ds.dock.searchitem TARGET dock-searchitem) diff --git a/panels/dock/searchitem/package/searchitem.qml b/panels/dock/searchitem/package/searchitem.qml index f51ec8885..221c4ebd8 100644 --- a/panels/dock/searchitem/package/searchitem.qml +++ b/panels/dock/searchitem/package/searchitem.qml @@ -3,75 +3,23 @@ // SPDX-License-Identifier: GPL-3.0-or-later import QtQuick 2.15 -import QtQuick.Controls 2.15 - import org.deepin.ds 1.0 -import org.deepin.dtk 1.0 as D -import org.deepin.dtk.style 1.0 as DStyle -import org.deepin.dtk.private 1.0 as DP import org.deepin.ds.dock 1.0 import Qt.labs.platform 1.1 as LP -AppletItem { +DockItem { id: searchItem + dockOrder: 3 + shouldVisible: Applet.visible + toolButtonColor: DockPalette.toolButtonColor + toolButtonBorderColor: DockPalette.toolButtonBorderColor + toolTip: qsTr("GrandSearch") + icon: Applet.icon + property int dockSize: Panel.rootObject.dockSize - property int dockOrder: 3 implicitWidth: Panel.rootObject.useColumnLayout ? dockSize : 30 implicitHeight: Panel.rootObject.useColumnLayout ? 30 : dockSize - property bool shouldVisible: Applet.visible - - property D.Palette toolButtonColor: DockPalette.toolButtonColor - property D.Palette toolButtonBorderColor: DockPalette.toolButtonBorderColor - - - property D.Palette backgroundColor: D.Palette { - normal { - common: Qt.rgba(1, 1, 1, 0.4) - } - normalDark{ - common: Qt.rgba(1, 1, 1, 0.2) - } - } - - PanelToolTip { - id: toolTip - text: qsTr("GrandSearch") - } - - D.ToolButton { - id: button - anchors.centerIn: parent - width: 30 - height: 30 - icon.name: "search" - icon.width: 16 - icon.height: 16 - display: D.IconLabel.IconOnly - onClicked: { - toolTip.close() - Applet.toggleGrandSearch() - } - onHoveredChanged: { - if (hovered) { - var point = Applet.rootObject.mapToItem(null, Applet.rootObject.width / 2, 0) - toolTip.toolTipX = point.x - toolTip.toolTipY = point.y - toolTip.open() - } else { - toolTip.close() - } - } - - // TODO: get style from Dtk - background: DP.ButtonPanel { - button: button - color1: searchItem.toolButtonColor - color2: searchItem.toolButtonColor - outsideBorderColor: searchItem.toolButtonBorderColor - insideBorderColor: null - } - } MouseArea { id: mouseArea diff --git a/panels/dock/searchitem/searchitem.cpp b/panels/dock/searchitem/searchitem.cpp index 05115d69b..97b444bbe 100644 --- a/panels/dock/searchitem/searchitem.cpp +++ b/panels/dock/searchitem/searchitem.cpp @@ -2,19 +2,14 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -#include "applet.h" +#include "ddockapplet.h" #include "searchitem.h" #include "pluginfactory.h" #include -#include -#include #include -#include -#include -DGUI_USE_NAMESPACE namespace dock { static DDBusSender searchDbus() @@ -25,74 +20,38 @@ static DDBusSender searchDbus() } SearchItem::SearchItem(QObject *parent) - : DApplet(parent) - , m_visible(true) + : DDockApplet(parent) { - + setVisible(true); + setIcon("search"); } -void SearchItem::toggleGrandSearch() +QString SearchItem::displayName() const { - searchDbus().method("SetVisible").arg(true).call(); + return tr("GrandSearch"); } -void SearchItem::toggleGrandSearchConfig() +QString SearchItem::itemKey() const { - QProcess::startDetached("dde-grand-search", QStringList() << "--setting"); + return QString("search"); } -DockItemInfo SearchItem::dockItemInfo() +QString SearchItem::settingKey() const { - DockItemInfo info; - info.name = "search"; - info.displayName = tr("GrandSearch"); - info.itemKey = "search"; - info.settingKey = "search"; - info.visible = m_visible; - - { - const auto lightPalette = DGuiApplicationHelper::instance()->applicationPalette(DGuiApplicationHelper::LightType); - auto lightPixmap = DDciIcon::fromTheme("search").pixmap( - qApp->devicePixelRatio(), - 30, - DDciIcon::Light, - DDciIcon::Normal, - DDciIconPalette::fromQPalette(lightPalette) - ); - QBuffer buffer(&info.iconLight); - if (buffer.open(QIODevice::WriteOnly)) { - lightPixmap.save(&buffer, "png"); - } - } - { - const auto darkPalette = DGuiApplicationHelper::instance()->applicationPalette(DGuiApplicationHelper::DarkType); - auto darkPixmap = DDciIcon::fromTheme("search").pixmap( - qApp->devicePixelRatio(), - 30, - DDciIcon::Dark, - DDciIcon::Normal, - DDciIconPalette::fromQPalette(darkPalette) - ); - QBuffer buffer(&info.iconDark); - if (buffer.open(QIODevice::WriteOnly)) { - darkPixmap.save(&buffer, "png"); - } - } - - return info; + return QString("search"); } -void SearchItem::setVisible(bool visible) +void SearchItem::toggleGrandSearch() { - if (m_visible != visible) { - m_visible = visible; + searchDbus().method("SetVisible").arg(true).call(); +} - Q_EMIT visibleChanged(visible); - } +void SearchItem::toggleGrandSearchConfig() +{ + QProcess::startDetached("dde-grand-search", QStringList() << "--setting"); } D_APPLET_CLASS(SearchItem) } - #include "searchitem.moc" diff --git a/panels/dock/searchitem/searchitem.h b/panels/dock/searchitem/searchitem.h index 34d68d5fa..9cf432615 100644 --- a/panels/dock/searchitem/searchitem.h +++ b/panels/dock/searchitem/searchitem.h @@ -4,32 +4,23 @@ #pragma once -#include "applet.h" +#include "ddockapplet.h" #include "dsglobal.h" -#include "../dockiteminfo.h" namespace dock { -class SearchItem : public DS_NAMESPACE::DApplet +class SearchItem : public DS_NAMESPACE::DDockApplet { Q_OBJECT - Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged) public: explicit SearchItem(QObject *parent = nullptr); + QString displayName() const override; + QString itemKey() const override; + QString settingKey() const override; + Q_INVOKABLE void toggleGrandSearch(); Q_INVOKABLE void toggleGrandSearchConfig(); - - Q_INVOKABLE DockItemInfo dockItemInfo(); - - inline bool visible() const { return m_visible;} - Q_INVOKABLE void setVisible(bool visible); - -Q_SIGNALS: - void visibleChanged(bool); - -private: - bool m_visible; }; }