dde-dock/frame/controller/proxyplugincontroller.cpp
donghualin 9a81886b6a fix: 修复时尚模式下无法显示电源按钮的问题
原因:电源按钮只会加载一次,在时尚模式下已经加载过,导致在高效模式下没有加载到任务栏的controller中
解决方案:将加载电源按钮的controller用一个单例的代理类来实现,FixedPluginController和DockPluginsController同时引用这个类来加载同一个插件

Log: 解决时尚模式下无法显示电源按钮的问题
Influence: 任务栏-查看高效模式下电源插件是否加载
Bug: https://pms.uniontech.com/bug-view-132733.html
Change-Id: I80d0cb9c87e6e1a478410f53a35ccfce344677ea
2022-05-27 15:09:31 +08:00

128 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
*
* Author: donghualin <donghualin@uniontech.com>
*
* Maintainer: donghualin <donghualin@uniontech.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "proxyplugincontroller.h"
#include "pluginsiteminterface.h"
QMap<int, ProxyPluginController *> ProxyPluginController::m_instances = {};
// 该方法用来设置所有的需要加载的插件的路径信息
static QMap<int, QList<QStringList>> getPluginPaths()
{
QList<QStringList> pluginPaths;
pluginPaths << QStringList{ QString("%1/.local/lib/dde-dock/plugins/").arg(QDir::homePath()) }
<< QStringList{ QString(qApp->applicationDirPath() + "/../plugins"),
QString("/usr/lib/dde-dock/plugins") };
QMap<int, QList<QStringList>> plugins;
plugins[FIXEDSYSTEMPLUGIN] = pluginPaths;
return plugins;
}
// 该方法根据当前加载插件的类型来生成对应的单例的类
ProxyPluginController *ProxyPluginController::instance(int instanceKey)
{
static QMap<int, QList<QStringList>> pluginLoadInfos = getPluginPaths();
if (m_instances.contains(instanceKey))
return m_instances.value(instanceKey);
// 生成单例类,获取加载插件的路径信息
ProxyPluginController *controller = new ProxyPluginController();
controller->m_dirs = (pluginLoadInfos.contains(instanceKey) ? pluginLoadInfos[instanceKey] : QList<QStringList>());
m_instances[instanceKey] = controller;
return controller;
}
// 新增要使用的控制器,第二个参数表示当前控制器需要加载的插件名称,为空表示加载所有插件
void ProxyPluginController::addProxyInterface(AbstractPluginsController *interface, const QStringList &pluginNames)
{
if (!m_interfaces.contains(interface))
m_interfaces[interface] = pluginNames;
}
void ProxyPluginController::removeProxyInterface(AbstractPluginsController *interface)
{
if (m_interfaces.contains(interface))
m_interfaces.remove(interface);
}
ProxyPluginController::ProxyPluginController(QObject *parent)
: AbstractPluginsController(parent)
{
}
QPluginLoader *ProxyPluginController::pluginLoader(PluginsItemInterface * const itemInter)
{
QMap<PluginsItemInterface *, QMap<QString, QObject *> > &plugin = pluginsMap();
if (plugin.contains(itemInter))
return qobject_cast<QPluginLoader *>(plugin[itemInter].value("pluginloader"));
return nullptr;
}
void ProxyPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey)
{
// 只有当前的controll设置的过滤名称包含当前插件的名称或者过滤名称为空才新增当前插件
QList<AbstractPluginsController *> pluginKeys = m_interfaces.keys();
for (AbstractPluginsController *interface: pluginKeys) {
const QStringList &filterNames = m_interfaces[interface];
if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName()))
interface->itemAdded(itemInter, itemKey);
}
}
void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey)
{
QList<AbstractPluginsController *> pluginKeys = m_interfaces.keys();
for (AbstractPluginsController *interface: pluginKeys) {
const QStringList &filterNames = m_interfaces[interface];
if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName()))
interface->itemUpdate(itemInter, itemKey);
}
}
void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey)
{
QList<AbstractPluginsController *> pluginKeys = m_interfaces.keys();
for (AbstractPluginsController *interface: pluginKeys) {
const QStringList &filterNames = m_interfaces[interface];
if (filterNames.isEmpty() || filterNames.contains(itemInter->pluginName()))
interface->itemRemoved(itemInter, itemKey);
}
}
void ProxyPluginController::startLoader()
{
QDir dir;
for (const QStringList &pluginPaths : m_dirs) {
QString loadPath;
for (const QString &pluginPath : pluginPaths) {
if (!dir.exists(pluginPath))
continue;
loadPath = pluginPath;
break;
}
if (!loadPath.isEmpty())
AbstractPluginsController::startLoader(new PluginLoader(loadPath, this));
}
}