]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Port the VCS plugin system to KPluginLoader
authorTobias Fella <fella@posteo.de>
Mon, 5 Apr 2021 10:37:28 +0000 (10:37 +0000)
committerElvis Angelaccio <elvis.angelaccio@kde.org>
Mon, 5 Apr 2021 10:37:28 +0000 (10:37 +0000)
The loader looks for the plugins in ${QT_PLUGIN_PATH}/dolphin/vcs.
The old method of loading the plugins is kept around for now, to support
external, legacy plugins.

src/settings/contextmenu/contextmenusettingspage.cpp
src/views/versioncontrol/kversioncontrolplugin.h
src/views/versioncontrol/versioncontrolobserver.cpp

index 0723fee2ec52a2e282ebfeda9280c825c51fec2f..8631b0ceb2c051f105de12cf18462e603ff668b1 100644 (file)
@@ -304,9 +304,24 @@ void ContextMenuSettingsPage::loadVersionControlSystems()
     const QStringList enabledPlugins = VersionControlSettings::enabledPlugins();
 
     // Create a checkbox for each available version control plugin
+    QSet<QString> loadedPlugins;
+
+    const QVector<KPluginMetaData> plugins = KPluginLoader::findPlugins(QStringLiteral("dolphin/vcs"));
+    for (const auto &plugin : plugins) {
+        const QString pluginName = plugin.name();
+        addRow(QStringLiteral("code-class"),
+               pluginName,
+               VersionControlServicePrefix + pluginName,
+               enabledPlugins.contains(pluginName));
+        loadedPlugins += pluginName;
+    }
+
     const KService::List pluginServices = KServiceTypeTrader::self()->query(QStringLiteral("FileViewVersionControlPlugin"));
     for (const auto &plugin : pluginServices) {
         const QString pluginName = plugin->name();
+        if (loadedPlugins.contains(pluginName)) {
+            continue;
+        }
         addRow(QStringLiteral("code-class"),
                pluginName,
                VersionControlServicePrefix + pluginName,
index aeac5ad2905d84447dbbbdbff0bfd8e0b3d12f60..c908be24720288b4837cb4200b72070135df48b0 100644 (file)
@@ -23,14 +23,15 @@ class KFileItem;
  * steps are required (in the example below it is assumed that a plugin for
  * Subversion will be written):
  *
- * - Create a fileviewsvnplugin.desktop file with the following content:
+ * - Create a fileviewsvnplugin.json file with the following content:
  *   <code>
- *   [Desktop Entry]
- *   Type=Service
- *   Name=Subversion
- *   X-KDE-ServiceTypes=FileViewVersionControlPlugin
- *   MimeType=text/plain;
- *   X-KDE-Library=fileviewsvnplugin
+ *   {
+ *      "KPlugin": {
+ *          "Description": "The svn plugin",
+ *          "Name": "Svn"
+ *      }
+ *   }
+
  *   </code>
  *
  * - Create a class FileViewSvnPlugin derived from KVersionControlPlugin and
@@ -45,15 +46,13 @@ class KFileItem;
  *   <code>
  *   #include <KPluginFactory>
  *   #include <KPluginLoader>
- *   K_PLUGIN_FACTORY(FileViewSvnPluginFactory, registerPlugin<FileViewSvnPlugin>();)
- *   K_EXPORT_PLUGIN(FileViewSvnPluginFactory("fileviewsvnplugin"))
+ *   K_PLUGIN_CLASS_WITH_JSON(FileViewSvnPlugin, "fileviewsvnplugin.json")
  *   </code>
  *
  * - Add the following lines to your CMakeLists.txt file:
  *   <code>
- *   kde4_add_plugin(fileviewsvnplugin fileviewsvnplugin.cpp)
- *   target_link_libraries(fileviewsvnplugin konq)
- *   install(FILES fileviewsvnplugin.desktop DESTINATION ${SERVICES_INSTALL_DIR})
+ *   kcoreaddons_add_plugin(fileviewsvnplugin SOURCES fileviewsvnplugin.cpp INSTALL_NAMESPACE "dolphin/vcs")
+ *   target_link_libraries(fileviewsvnplugin DolphinVcs)
  *   </code>
  *
  * General implementation notes:
index cf5be3c9163355429d04a9870037e4ed2c8c7432..9f0933a487be4a74685a5367bd116b89d3f4ec6e 100644 (file)
@@ -15,6 +15,8 @@
 #include <KLocalizedString>
 #include <KService>
 #include <KServiceTypeTrader>
+#include <KPluginLoader>
+#include <KPluginMetaData>
 
 #include <QTimer>
 
@@ -279,24 +281,47 @@ void VersionControlObserver::initPlugins()
         // all fileview version control plugins and remember them in 'plugins'.
         const QStringList enabledPlugins = VersionControlSettings::enabledPlugins();
 
+        const QVector<KPluginMetaData> plugins = KPluginLoader::findPlugins(QStringLiteral("dolphin/vcs"));
+
+        QSet<QString> loadedPlugins;
+
+        for (const auto &p : plugins) {
+            if (enabledPlugins.contains(p.name())) {
+                KPluginLoader loader(p.fileName());
+                KPluginFactory *factory = loader.factory();
+                KVersionControlPlugin *plugin = factory->create<KVersionControlPlugin>();
+                if (plugin) {
+                    m_plugins.append(plugin);
+                    loadedPlugins += p.name();
+                }
+            }
+        }
+
+        // Deprecated: load plugins using KService. This mechanism will be removed with KF6
         const KService::List pluginServices = KServiceTypeTrader::self()->query(QStringLiteral("FileViewVersionControlPlugin"));
         for (KService::List::ConstIterator it = pluginServices.constBegin(); it != pluginServices.constEnd(); ++it) {
+            if (loadedPlugins.contains((*it)->property("Name", QVariant::String).toString())) {
+                continue;
+            }
             if (enabledPlugins.contains((*it)->name())) {
                 KVersionControlPlugin* plugin = (*it)->createInstance<KVersionControlPlugin>(this);
                 if (plugin) {
-                    connect(plugin, &KVersionControlPlugin::itemVersionsChanged,
-                            this, &VersionControlObserver::silentDirectoryVerification);
-                    connect(plugin, &KVersionControlPlugin::infoMessage,
-                            this, &VersionControlObserver::infoMessage);
-                    connect(plugin, &KVersionControlPlugin::errorMessage,
-                            this, &VersionControlObserver::errorMessage);
-                    connect(plugin, &KVersionControlPlugin::operationCompletedMessage,
-                            this, &VersionControlObserver::operationCompletedMessage);
-
                     m_plugins.append(plugin);
                 }
             }
         }
+
+        for (auto &plugin : qAsConst(m_plugins)) {
+            connect(plugin, &KVersionControlPlugin::itemVersionsChanged,
+                this, &VersionControlObserver::silentDirectoryVerification);
+            connect(plugin, &KVersionControlPlugin::infoMessage,
+                this, &VersionControlObserver::infoMessage);
+            connect(plugin, &KVersionControlPlugin::errorMessage,
+                this, &VersionControlObserver::errorMessage);
+            connect(plugin, &KVersionControlPlugin::operationCompletedMessage,
+                this, &VersionControlObserver::operationCompletedMessage);
+        }
+
         m_pluginsInitialized = true;
     }
 }