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"