File indexing completed on 2024-05-05 05:53:50

0001 /*  This file was part of the KDE libraries
0002 
0003     SPDX-FileCopyrightText: 2021 Tomaz Canabrava <tcanabrava@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "PluginManager.h"
0009 
0010 #include "IKonsolePlugin.h"
0011 #include "MainWindow.h"
0012 #include "konsoledebug.h"
0013 
0014 #include <KLocalizedString>
0015 #include <KPluginFactory>
0016 #include <KPluginMetaData>
0017 
0018 #include <QAction>
0019 
0020 namespace Konsole
0021 {
0022 struct PluginManagerPrivate {
0023     std::vector<IKonsolePlugin *> plugins;
0024 };
0025 
0026 PluginManager::PluginManager()
0027     : d(std::make_unique<PluginManagerPrivate>())
0028 {
0029 }
0030 
0031 PluginManager::~PluginManager()
0032 {
0033     qDeleteAll(d->plugins);
0034 }
0035 
0036 void PluginManager::loadAllPlugins()
0037 {
0038     QVector<KPluginMetaData> pluginMetaData = KPluginMetaData::findPlugins(QStringLiteral("konsoleplugins"), [](const KPluginMetaData &data) {
0039         // Compare RELEASE_SERVICE_VERSION MAJOR and MINOR only: XX.YY
0040         auto plugin_version = QString(data.version()).left(5);
0041         auto release_version = QLatin1String(RELEASE_SERVICE_VERSION).left(5);
0042         if (plugin_version == release_version) {
0043             return true;
0044         } else {
0045             qCWarning(KonsoleDebug) << "Ignoring" << data.name() << "plugin version (" << plugin_version << ") doesn't match release version ("
0046                                     << release_version << ")";
0047             return false;
0048         }
0049     });
0050     for (const auto &metaData : pluginMetaData) {
0051         const KPluginFactory::Result result = KPluginFactory::instantiatePlugin<IKonsolePlugin>(metaData);
0052         if (!result) {
0053             continue;
0054         }
0055 
0056         d->plugins.push_back(result.plugin);
0057     }
0058 }
0059 
0060 void PluginManager::registerMainWindow(Konsole::MainWindow *window)
0061 {
0062     QList<QAction *> internalPluginSubmenus;
0063     for (auto *plugin : d->plugins) {
0064         plugin->addMainWindow(window);
0065         internalPluginSubmenus.append(plugin->menuBarActions(window));
0066         window->addPlugin(plugin);
0067     }
0068 
0069     if (internalPluginSubmenus.isEmpty()) {
0070         auto *emptyMenuAct = new QAction(i18n("No plugins available"), this);
0071         emptyMenuAct->setEnabled(false);
0072         internalPluginSubmenus.append(emptyMenuAct);
0073     }
0074 
0075     window->setPluginsActions(internalPluginSubmenus);
0076 }
0077 
0078 std::vector<IKonsolePlugin *> PluginManager::plugins() const
0079 {
0080     return d->plugins;
0081 }
0082 
0083 }
0084 
0085 #include "moc_PluginManager.cpp"