feat: 增加回收站和电源插件在控制中心的显示和隐藏

响应DConfig配置文件的变化,根据当前新增或删除的配置来新增或删除插件

Log:
Influence: 从控制中心勾选或者取消勾选回收站和电源插件,观察任务栏的变化
Task: https://pms.uniontech.com/task-view-216841.html
Change-Id: Ia79ae924180d07e1b11f26bd119c83a8932cb80d
This commit is contained in:
donghualin 2022-11-30 11:13:45 +08:00
parent 224066836a
commit 8cb6cb89d7
11 changed files with 194 additions and 50 deletions

View File

@ -137,6 +137,11 @@ ProxyPluginController::ProxyPluginController(QObject *parent)
QMetaObject::invokeMethod(this, &ProxyPluginController::startLoader, Qt::QueuedConnection);
}
bool ProxyPluginController::pluginIsLoaded(PluginsItemInterface *itemInter)
{
return m_pluginsItems.contains(itemInter);
}
QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const itemInter)
{
QMap<PluginsItemInterface *, QMap<QString, QObject *> > &plugin = pluginsMap();

View File

@ -51,6 +51,8 @@ protected:
explicit ProxyPluginController(QObject *parent = nullptr);
~ProxyPluginController() override {}
bool pluginIsLoaded(PluginsItemInterface *itemInter) override;
void pluginItemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override;
void pluginItemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override;
void pluginItemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override;

View File

@ -31,6 +31,7 @@ ToolAppHelper::ToolAppHelper(QWidget *toolAreaWidget, QObject *parent)
: QObject(parent)
, m_toolAreaWidget(toolAreaWidget)
, m_displayMode(DisplayMode::Efficient)
, m_position(Dock::Position::Bottom)
{
connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) {
if (pluginAttr != QuickSettingController::PluginAttribute::Tool)
@ -38,27 +39,28 @@ ToolAppHelper::ToolAppHelper(QWidget *toolAreaWidget, QObject *parent)
pluginItemAdded(itemInter);
});
connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ = ](PluginsItemInterface *itemInter) {
pluginItemRemoved(itemInter);
});
QList<PluginsItemInterface *> pluginItems = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Tool);
for (PluginsItemInterface *pluginItem : pluginItems)
pluginItemAdded(pluginItem);
updateToolArea();
}
void ToolAppHelper::setDisplayMode(DisplayMode displayMode)
{
m_displayMode = displayMode;
updateWidgetStatus();
moveToolWidget();
updateWidgetStatus();
}
void ToolAppHelper::removePluginItem(DockItem *dockItem)
void ToolAppHelper::setPosition(Position position)
{
removeToolArea(dockItem);
if (m_toolAreaWidget->layout()->count() == 0 && toolIsVisible())
updateWidgetStatus();
Q_EMIT requestUpdate();
m_toolAreaWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
m_position = position;
}
bool ToolAppHelper::toolIsVisible() const
@ -78,11 +80,12 @@ void ToolAppHelper::appendToToolArea(int index, DockItem *dockItem)
Q_EMIT requestUpdate();
}
bool ToolAppHelper::removeToolArea(DockItem *dockItem)
bool ToolAppHelper::removeToolArea(PluginsItemInterface *itemInter)
{
QBoxLayout *boxLayout = static_cast<QBoxLayout *>(m_toolAreaWidget->layout());
for (int i = 0; i < boxLayout->count(); i++) {
if (boxLayout->itemAt(i)->widget() == dockItem) {
PluginsItem *dockItem = qobject_cast<PluginsItem *>(boxLayout->itemAt(i)->widget());
if (dockItem && dockItem->pluginItem() == itemInter) {
boxLayout->removeWidget(dockItem);
return true;
}
@ -115,6 +118,38 @@ void ToolAppHelper::moveToolWidget()
}
}
void ToolAppHelper::updateToolArea()
{
bool oldVisible = m_toolAreaWidget->isVisible();
QLayout *layout = m_toolAreaWidget->layout();
if (m_position == Dock::Position::Bottom || m_position == Dock::Position::Top) {
int size = 0;
for (int i = 0; i < layout->count(); i++) {
PluginsItem *dockItem = qobject_cast<PluginsItem *>(layout->itemAt(i)->widget());
if (!dockItem)
continue;
size += dockItem->width();
}
m_toolAreaWidget->setFixedWidth(size);
m_toolAreaWidget->setVisible(size > 0);
} else {
int size = 0;
for (int i = 0; i < layout->count(); i++) {
PluginsItem *dockItem = qobject_cast<PluginsItem *>(layout->itemAt(i)->widget());
if (!dockItem)
continue;
size += dockItem->height();
}
m_toolAreaWidget->setFixedHeight(size);
m_toolAreaWidget->setVisible(size > 0);
}
bool isVisible = m_toolAreaWidget->isVisible();
if (oldVisible != isVisible)
Q_EMIT toolVisibleChanged(isVisible);
}
void ToolAppHelper::updateWidgetStatus()
{
bool oldVisible = toolIsVisible();
@ -130,13 +165,9 @@ void ToolAppHelper::updateWidgetStatus()
Q_EMIT toolVisibleChanged(visible);
}
bool ToolAppHelper::pluginInTool(DockItem *dockItem) const
bool ToolAppHelper::pluginInTool(PluginsItemInterface *itemInter) const
{
PluginsItem *pluginItem = qobject_cast<PluginsItem *>(dockItem);
if (!pluginItem)
return false;
return (QuickSettingController::instance()->pluginAttribute(pluginItem->pluginItem()) == QuickSettingController::PluginAttribute::Tool);
return (QuickSettingController::instance()->pluginAttribute(itemInter) == QuickSettingController::PluginAttribute::Tool);
}
void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter)
@ -145,9 +176,23 @@ void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter)
return;
QuickSettingController *quickController = QuickSettingController::instance();
PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter);
if (pluginInTool(pluginItem))
if (pluginInTool(itemInter)) {
PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter);
appendToToolArea(0, pluginItem);
updateToolArea();
Q_EMIT requestUpdate();
}
}
void ToolAppHelper::pluginItemRemoved(PluginsItemInterface *itemInter)
{
QuickSettingController *quickController = QuickSettingController::instance();
if (pluginInTool(itemInter)) {
PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter);
removeToolArea(pluginItem->pluginItem());
updateToolArea();
Q_EMIT requestUpdate();
}
}
bool ToolAppHelper::pluginExists(PluginsItemInterface *itemInter) const

View File

@ -41,7 +41,7 @@ public:
explicit ToolAppHelper(QWidget *toolAreaWidget, QObject *parent = nullptr);
void setDisplayMode(DisplayMode displayMode);
void removePluginItem(DockItem *dockItem);
void setPosition(Dock::Position position);
bool toolIsVisible() const;
Q_SIGNALS:
@ -50,17 +50,20 @@ Q_SIGNALS:
private:
void appendToToolArea(int index, DockItem *dockItem);
bool removeToolArea(DockItem *dockItem);
bool removeToolArea(PluginsItemInterface *itemInter);
void moveToolWidget();
void updateToolArea();
void updateWidgetStatus();
bool pluginInTool(DockItem *dockItem) const;
bool pluginInTool(PluginsItemInterface *itemInter) const;
void pluginItemAdded(PluginsItemInterface *itemInter);
void pluginItemRemoved(PluginsItemInterface *itemInter);
bool pluginExists(PluginsItemInterface *itemInter) const;
private:
QWidget *m_toolAreaWidget;
DisplayMode m_displayMode;
Dock::Position m_position;
QList<DockItem *> m_sequentPluginItems;
};

View File

@ -48,17 +48,19 @@ PluginsItem::PluginsItem(PluginsItemInterface *const pluginInter, const QString
{
qDebug() << "load plugins item: " << pluginInter->pluginName() << itemKey << m_centralWidget;
m_centralWidget->setParent(this);
m_centralWidget->setVisible(true);
m_centralWidget->setObjectName(pluginInter->pluginName() + "-centralwidget");
m_centralWidget->installEventFilter(this);
if (m_centralWidget) {
m_centralWidget->setParent(this);
m_centralWidget->setVisible(true);
m_centralWidget->setObjectName(pluginInter->pluginName() + "-centralwidget");
m_centralWidget->installEventFilter(this);
QBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(m_centralWidget);
hLayout->setSpacing(0);
hLayout->setMargin(0);
QBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(m_centralWidget);
hLayout->setSpacing(0);
hLayout->setMargin(0);
setLayout(hLayout);
setLayout(hLayout);
}
setAccessibleName(pluginInter->pluginName());
setAttribute(Qt::WA_TranslucentBackground);

View File

@ -24,6 +24,7 @@
#include "pluginsiteminterface_v20.h"
#include "pluginadapter.h"
#include "utils.h"
#include "settingconfig.h"
#include <DNotifySender>
#include <DSysInfo>
@ -49,6 +50,7 @@ AbstractPluginsController::AbstractPluginsController(QObject *parent)
refreshPluginSettings();
connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &AbstractPluginsController::onConfigChanged);
connect(m_dockDaemonInter, &DockInter::PluginSettingsSynced, this, &AbstractPluginsController::refreshPluginSettings, Qt::QueuedConnection);
}
@ -95,7 +97,9 @@ void AbstractPluginsController::itemAdded(PluginsItemInterface * const itemInter
pluginAdapter->setItemKey(itemKey);
m_pluginExists << pluginItem;
pluginItemAdded(pluginItem, itemKey);
m_pluginItemKeyMap[pluginItem] = itemKey;
if (canAddedPlugin(pluginItem))
pluginItemAdded(pluginItem, itemKey);
}
void AbstractPluginsController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey)
@ -106,6 +110,7 @@ void AbstractPluginsController::itemUpdate(PluginsItemInterface * const itemInte
void AbstractPluginsController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey)
{
m_pluginExists.removeOne(itemInter);
m_pluginItemKeyMap.remove(itemInter);
pluginItemRemoved(getPluginInterface(itemInter), itemKey);
}
@ -483,3 +488,56 @@ bool AbstractPluginsController::eventFilter(QObject *o, QEvent *e)
return false;
}
bool AbstractPluginsController::canAddRemove(PluginsItemInterface *plugin) const
{
if (!plugin->flags() & PluginFlag::Attribute_CanSetting)
return false;
if (plugin->flags() & PluginFlag::Type_Tool)
return true;
if (plugin->flags() & PluginFlag::Type_System)
return true;
return false;
}
bool AbstractPluginsController::canAddedPlugin(PluginsItemInterface *plugin) const
{
if (!canAddRemove(plugin))
return true;
const QStringList configPlugins = SETTINGCONFIG->value("Dock_Quick_Plugin_Name").toStringList();
return configPlugins.contains(plugin->pluginName());
}
void AbstractPluginsController::onConfigChanged(const QString &key, const QVariant &value)
{
QStringList pluginNames = value.toStringList();
if (key == "Dock_Quick_Plugin_Name") {
// 这里只处理工具插件(回收站)和系统插件(电源插件)
for (PluginsItemInterface *plugin : pluginCurrent()) {
if (!canAddRemove(plugin))
continue;
const QString itemKey = m_pluginItemKeyMap.value(plugin);
if (!pluginNames.contains(plugin->pluginName()) && pluginIsLoaded(plugin)) {
// 如果当前配置中不包含当前插件,但是当前插件已经加载,那么就移除该插件
pluginItemRemoved(plugin, itemKey);
QWidget *itemWidget = plugin->itemWidget(itemKey);
if (itemWidget)
itemWidget->setVisible(false);
} else if (pluginNames.contains(plugin->pluginName()) && !pluginIsLoaded(plugin)) {
// 如果当前配置中包含当前插件,但是当前插件并未加载,那么就加载该插件
pluginItemAdded(plugin, itemKey);
// 只有工具插件是通过QWidget的方式进行显示的因此这里只处理工具插件
if (plugin->flags() & PluginFlag::Type_Tool) {
QWidget *itemWidget = plugin->itemWidget(itemKey);
if (itemWidget)
itemWidget->setVisible(true);
}
}
}
}
}

View File

@ -62,6 +62,17 @@ public:
Q_SIGNALS:
void pluginLoaderFinished();
protected:
virtual bool pluginIsLoaded(PluginsItemInterface *itemInter) { return true; }
QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const;
PluginsItemInterface *pluginInterAt(const QString &itemKey);
PluginsItemInterface *pluginInterAt(QObject *destItem);
bool eventFilter(QObject *o, QEvent *e) override;
bool canAddRemove(PluginsItemInterface *plugin) const;
bool canAddedPlugin(PluginsItemInterface *plugin) const;
private:
// implements PluginProxyInterface
void saveValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant &value) override;
@ -74,15 +85,8 @@ private:
void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override;
void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override;
void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override;
PluginsItemInterface *getPluginInterface(PluginsItemInterface * const itemInter);
protected:
QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const;
PluginsItemInterface *pluginInterAt(const QString &itemKey);
PluginsItemInterface *pluginInterAt(QObject *destItem);
bool eventFilter(QObject *o, QEvent *e) override;
protected Q_SLOTS:
void startLoader(PluginLoader *loader);
@ -92,6 +96,7 @@ private slots:
void loadPlugin(const QString &pluginFile);
void initPlugin(PluginsItemInterface *interface);
void refreshPluginSettings();
void onConfigChanged(const QString &key, const QVariant &value);
private:
QDBusConnectionInterface *m_dbusDaemonInterface;
@ -103,6 +108,7 @@ private:
// filepath, interface, loaded
QMap<QPair<QString, PluginsItemInterface *>, bool> m_pluginLoadMap;
QList<PluginsItemInterface *> m_pluginExists;
QMap<PluginsItemInterface *, QString> m_pluginItemKeyMap;
QJsonObject m_pluginSettingsObject;
QMap<qulonglong, PluginAdapter *> m_pluginAdapterMap;

View File

@ -45,6 +45,7 @@ DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent)
, m_position(Dock::Position::Bottom)
, m_displayMode(Dock::DisplayMode::Efficient)
, m_mainBoxLayout(new QBoxLayout(QBoxLayout::Direction::RightToLeft, this))
, m_frontWidget(new QWidget(this))
, m_toolWidget(new QWidget(this))
, m_toolLayout(new QBoxLayout(QBoxLayout::RightToLeft, m_toolWidget))
, m_toolLineLabel(new QLabel(this))
@ -78,6 +79,7 @@ void DockTrayWindow::setDisplayMode(const Dock::DisplayMode &displayMode)
{
m_displayMode = displayMode;
moveToolPlugin();
updateToolWidget();
// 如果当前模式为高效模式则设置当前的trayView为其计算位置的参照
if (displayMode == Dock::DisplayMode::Efficient)
ExpandIconWidget::popupTrayView()->setReferGridView(m_trayView);
@ -131,6 +133,9 @@ void DockTrayWindow::resizeEvent(QResizeEvent *event)
void DockTrayWindow::paintEvent(QPaintEvent *event)
{
QWidget::paintEvent(event);
if (!m_toolLineLabel->isVisible())
return;
QPainter painter(this);
QColor color;
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) {
@ -271,6 +276,13 @@ void DockTrayWindow::moveToolPlugin()
}
}
void DockTrayWindow::updateToolWidget()
{
m_toolWidget->setVisible(m_toolLayout->count() > 0);
m_toolLineLabel->setVisible(m_toolLayout->count() > 0);
m_frontWidget->setVisible(m_toolLayout->count() > 0);
}
void DockTrayWindow::initUi()
{
m_toolLayout->setContentsMargins(0, 0, 0, 0);
@ -279,7 +291,7 @@ void DockTrayWindow::initUi()
m_systemPuginWidget->setDisplayMode(Dock::DisplayMode::Efficient);
m_mainBoxLayout->setContentsMargins(0, 0, 0, 0);
m_mainBoxLayout->setSpacing(0);
m_mainBoxLayout->addSpacing(FRONTSPACING);
m_mainBoxLayout->addWidget(m_frontWidget);
m_mainBoxLayout->addWidget(m_toolWidget);
m_mainBoxLayout->addSpacing(SPLITESPACE);
m_mainBoxLayout->addWidget(m_toolLineLabel);
@ -293,6 +305,7 @@ void DockTrayWindow::initUi()
m_toolLineLabel->setFixedSize(0, 0);
m_mainBoxLayout->addStretch();
updateToolWidget();
}
void DockTrayWindow::initConnection()
@ -353,6 +366,7 @@ void DockTrayWindow::onUpdateComponentSize()
case Dock::Position::Left:
case Dock::Position::Right:
m_toolLineLabel->setFixedSize(width() * 0.6, SPLITERSIZE);
m_frontWidget->setFixedSize(QWIDGETSIZE_MAX, FRONTSPACING);
m_dateTimeWidget->setFixedSize(QWIDGETSIZE_MAX, m_dateTimeWidget->suitableSize().height());
m_systemPuginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPuginWidget->suitableSize().height());
m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, m_quickIconWidget->suitableSize().height());
@ -361,6 +375,7 @@ void DockTrayWindow::onUpdateComponentSize()
case Dock::Position::Top:
case Dock::Position::Bottom:
m_toolLineLabel->setFixedSize(SPLITERSIZE, height() * 0.6);
m_frontWidget->setFixedSize(FRONTSPACING, QWIDGETSIZE_MAX);
m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), QWIDGETSIZE_MAX);
m_systemPuginWidget->setFixedSize(m_systemPuginWidget->suitableSize().width(), QWIDGETSIZE_MAX);
m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX);
@ -380,6 +395,7 @@ void DockTrayWindow::onItemAdded(PluginsItemInterface *itemInter)
pluginItem->setVisible(true);
m_toolLayout->addWidget(pluginItem);
updateToolWidget();
Q_EMIT requestUpdate();
}
@ -396,6 +412,7 @@ void DockTrayWindow::onItemRemove(PluginsItemInterface *itemInter)
continue;
m_toolLayout->removeWidget(pluginItem);
updateToolWidget();
Q_EMIT requestUpdate();
break;

View File

@ -68,6 +68,7 @@ private:
void resizeTool() const;
bool pluginExists(PluginsItemInterface *itemInter) const;
void moveToolPlugin();
void updateToolWidget();
private Q_SLOTS:
void onUpdateComponentSize();
@ -80,6 +81,7 @@ private:
Dock::Position m_position;
Dock::DisplayMode m_displayMode;
QBoxLayout *m_mainBoxLayout;
QWidget *m_frontWidget;
QWidget *m_toolWidget;
QBoxLayout *m_toolLayout;
QLabel *m_toolLineLabel;

View File

@ -371,6 +371,7 @@ void MainPanelControl::setPositonValue(Dock::Position position)
m_position = position;
m_tray->setPositon(position);
m_toolHelper->setPosition(position);
QMetaObject::invokeMethod(this, &MainPanelControl::updateMainPanelLayout, Qt::QueuedConnection);
}
@ -428,9 +429,6 @@ void MainPanelControl::removeItem(DockItem *item)
case DockItem::Placeholder:
m_recentHelper->removeAppItem(item);
break;
case DockItem::Plugins:
m_toolHelper->removePluginItem(item);
break;
case DockItem::AppMultiWindow:
m_multiHelper->removeMultiWindow(static_cast<AppMultiItem *>(item));
break;
@ -908,7 +906,6 @@ DockItem *MainPanelControl::dropTargetItem(DockItem *sourceItem, QPoint point)
return targetItem;
}
void MainPanelControl::updateDisplayMode()
{
updateModeChange();
@ -918,7 +915,6 @@ void MainPanelControl::updateDisplayMode()
void MainPanelControl::updateModeChange()
{
m_toolAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion);
m_toolSonAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion);
onRecentVisibleChanged(m_recentHelper->recentIsVisible());
onDockAppVisibleChanged(m_recentHelper->dockAppIsVisible());
onToolVisibleChanged(m_toolHelper->toolIsVisible());

View File

@ -177,14 +177,22 @@ QSize TrayManagerWindow::suitableSize(const Dock::Position &position) const
{
QMargins m = m_mainLayout->contentsMargins();
if (position == Dock::Position::Top || position == Dock::Position::Bottom) {
return QSize(appDatetimeSize(position) +
m_systemPluginWidget->suitableSize(position).width() + m_mainLayout->spacing() +
m.left() + m.right(), QWIDGETSIZE_MAX);
int width = appDatetimeSize(position);
int systemWidgetWidth = m_systemPluginWidget->suitableSize(position).width();
if (systemWidgetWidth > 0) {
width += systemWidgetWidth + m_mainLayout->spacing();
}
width += m.left() + m.right();
return QSize(width, QWIDGETSIZE_MAX);
}
return QSize(QWIDGETSIZE_MAX, appDatetimeSize(position) +
m_systemPluginWidget->suitableSize(position).height() + m_mainLayout->spacing() +
m.top() + m.bottom());
int height = appDatetimeSize(position);
int systemWidgetHeight = m_systemPluginWidget->suitableSize(position).height();
if (systemWidgetHeight > 0) {
height += systemWidgetHeight + m_mainLayout->spacing();
}
height += m.top() + m.bottom();
return QSize(QWIDGETSIZE_MAX, height);
}
// 用于返回需要绘制的圆形区域