From 0bdc1eb1a2003e3805f84925d7be7d521cac215f Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 30 May 2022 20:29:53 +0800 Subject: [PATCH] =?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 {