File indexing completed on 2024-04-28 11:20:48

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2010 Alexander Rieder <alexanderrieder@gmail.com>
0004 */
0005 
0006 #include "panelpluginhandler.h"
0007 using namespace Cantor;
0008 
0009 #include <QCoreApplication>
0010 #include <QDebug>
0011 #include <QDir>
0012 
0013 #include <KPluginFactory>
0014 #include <KPluginMetaData>
0015 #include <KPluginFactory>
0016 
0017 #include "session.h"
0018 #include "backend.h"
0019 
0020 class Cantor::PanelPluginHandlerPrivate
0021 {
0022   public:
0023     QList<Cantor::PanelPlugin*> plugins;
0024 };
0025 
0026 PanelPluginHandler::PanelPluginHandler( QObject* parent ) : QObject(parent) ,
0027                                                             d(new PanelPluginHandlerPrivate)
0028 {
0029     setObjectName(QStringLiteral("PanelPluginHandler"));
0030 }
0031 
0032 PanelPluginHandler::~PanelPluginHandler()
0033 {
0034     delete d;
0035 }
0036 
0037 void PanelPluginHandler::loadPlugins()
0038 {
0039     const QVector<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("cantor/panels"));
0040 
0041     for (const KPluginMetaData &plugin : plugins) {
0042 
0043         const auto result = KPluginFactory::instantiatePlugin<PanelPlugin>(plugin, QCoreApplication::instance());
0044 
0045         if (!result) {
0046             qDebug() << "Error while loading panel: " << result.errorText;
0047             continue;
0048         }
0049 
0050         PanelPlugin *panel = result.plugin;
0051 
0052         panel->setPluginInfo(plugin);
0053         d->plugins.append(panel);
0054 
0055     }
0056 }
0057 
0058 QList<Cantor::PanelPlugin *> Cantor::PanelPluginHandler::allPlugins()
0059 {
0060     return d->plugins;
0061 }
0062 
0063 QList<PanelPlugin*> PanelPluginHandler::plugins(Session* session)
0064 {
0065     QList<PanelPlugin*> pluginsForSession;
0066 
0067     if (session == nullptr)
0068         return pluginsForSession;
0069 
0070     const auto capabilities = session->backend()->capabilities();
0071     const QStringList& extensions = session->backend()->extensions();
0072 
0073     qDebug()<<"loading panel plugins for session of type "<<session->backend()->name();
0074     for (auto* plugin : d->plugins)
0075     {
0076         bool supported=true;
0077         for (const QString& req : plugin->requiredExtensions()){
0078             // FIXME: That req.isEmpty() is there just because Help Panel has req
0079             // empty, returning FALSE when the comparison must to return TRUE.
0080             supported = supported && (extensions.contains(req) || req.isEmpty());
0081         }
0082 
0083         supported = supported && ( (capabilities & plugin->requiredCapabilities()) == plugin->requiredCapabilities());
0084 
0085         if(supported)
0086         {
0087             qDebug() << "plugin " << plugin->name()<<" is supported, requires extensions " << plugin->requiredExtensions();
0088             pluginsForSession.append(plugin);
0089         }
0090         else
0091             qDebug() << "plugin " << plugin->name() <<" is not supported";
0092     }
0093 
0094     return pluginsForSession;
0095 }
0096 
0097 QList<PanelPlugin*> PanelPluginHandler::activePluginsForSession(Session* session, const PanelStates& previousPluginStates)
0098 {
0099     const auto& plugins = this->plugins(session);
0100     for (auto* plugin : plugins)
0101     {
0102         if(!plugin)
0103         {
0104             qDebug()<<"somethings wrong with plugin inside PanelPluginHandler";
0105             continue;
0106         }
0107 
0108         if (previousPluginStates.contains(plugin->name()))
0109             plugin->restoreState(previousPluginStates[plugin->name()]);
0110         else
0111         {
0112             Cantor::PanelPlugin::State initState;
0113             initState.session = session;
0114             plugin->restoreState(initState);
0115         }
0116     }
0117     return plugins;
0118 }