File indexing completed on 2024-05-12 04:33:20

0001 /*
0002     SPDX-FileCopyrightText: 2012 Victor Dodon <dodonvictor at gmail dot com>
0003     SPDX-FileCopyrightText: 2012-2018 Gilles Caulier <caulier dot gilles at gmail dot com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "kipitestpluginloader.h"
0009 
0010 // Qt includes
0011 
0012 #include <QMap>
0013 #include <QAction>
0014 #include <QDebug>
0015 
0016 // KF includes
0017 
0018 #include <KActionCategory>
0019 #include <KXMLGUIFactory>
0020 #include <KXmlGuiWindow>
0021 
0022 // Local includes
0023 
0024 #include "kipiinterface.h"
0025 #include "kipitestmainwindow.h"
0026 
0027 namespace KXMLKipiCmd
0028 {
0029 
0030 class KipiTestPluginLoader::Private
0031 {
0032 
0033 public:
0034 
0035     Private()
0036     {
0037         app                         = nullptr;
0038         kipipluginsActionCollection = nullptr;
0039         kipiPluginLoader            = nullptr;
0040         kipiInterface               = nullptr;
0041     }
0042 
0043     PluginLoader*               kipiPluginLoader;
0044     KipiInterface*              kipiInterface;
0045     KXmlGuiWindow*              app;
0046 
0047     KActionCollection*          kipipluginsActionCollection;
0048     QMap<int, KActionCategory*> kipiCategoryMap;
0049 };
0050 
0051 // -- Static values -------------------------------
0052 
0053 KipiTestPluginLoader* KipiTestPluginLoader::m_instance = nullptr;
0054 
0055 // -----------------------------------------------
0056 
0057 KipiTestPluginLoader::KipiTestPluginLoader(KXmlGuiWindow* const parent, KipiInterface *const interface)
0058     : QObject(parent),
0059       d(new Private)
0060 {
0061     m_instance       = this;
0062     d->kipiInterface = interface;
0063     d->app           = parent;
0064 
0065     loadPlugins();
0066 }
0067 
0068 KipiTestPluginLoader::~KipiTestPluginLoader()
0069 {
0070     delete d;
0071     m_instance = nullptr;
0072 }
0073 
0074 KipiTestPluginLoader* KipiTestPluginLoader::instance()
0075 {
0076     return m_instance;
0077 }
0078 
0079 KActionCollection* KipiTestPluginLoader::pluginsActionCollection() const
0080 {
0081     return d->kipipluginsActionCollection;
0082 }
0083 
0084 QList<PluginLoader::Info*> KipiTestPluginLoader::pluginList()
0085 {
0086     return d->kipiPluginLoader->pluginList();
0087 }
0088 
0089 QList<QAction*> KipiTestPluginLoader::kipiActionsByCategory(Category cat) const
0090 {
0091     KActionCategory* const category = d->kipiCategoryMap[cat];
0092 
0093     if (category)
0094     {
0095         return category->actions();
0096     }
0097 
0098     return QList<QAction*>();
0099 }
0100 
0101 void KipiTestPluginLoader::loadPlugins()
0102 {
0103     d->kipipluginsActionCollection = new KActionCollection(d->app, QLatin1String("kipitest"));
0104 
0105     QStringList ignores;
0106 
0107     // List of obsoletes plugins to not load
0108 
0109     // Comment the following two lines if you want to load the HelloWorld and
0110     // the KXMLHelloWorld plugins for testing purposes
0111     //ignores.append("HelloWorld");
0112     //ignores.append("KXMLHelloWorld");
0113 
0114     ignores.append(QString::fromLatin1("KameraKlient"));
0115 
0116     // These plugins have been renamed with 0.2.0-rc1
0117     ignores.append(QString::fromLatin1("Facebook Exporter"));
0118     ignores.append(QString::fromLatin1("SmugMug Exporter"));
0119     ignores.append(QString::fromLatin1("SlideShow"));
0120     ignores.append(QString::fromLatin1("PrintWizard"));
0121     ignores.append(QString::fromLatin1("SimpleViewer"));
0122     ignores.append(QString::fromLatin1("KioExport"));
0123 
0124     d->kipiPluginLoader = new PluginLoader(d->app);
0125     d->kipiPluginLoader->setInterface(d->kipiInterface);
0126     d->kipiPluginLoader->setIgnoredPluginsList(ignores);
0127     d->kipiPluginLoader->init();
0128 
0129     connect(d->kipiPluginLoader, &PluginLoader::replug,
0130             this, &KipiTestPluginLoader::slotKipiPluginsPlug);
0131 
0132     d->kipiPluginLoader->loadPlugins();
0133 }
0134 
0135 void KipiTestPluginLoader::slotKipiPluginsPlug()
0136 {
0137     d->kipiCategoryMap.clear();
0138     d->kipipluginsActionCollection->clear();
0139 
0140     PluginLoader::PluginList list = d->kipiPluginLoader->pluginList();
0141     int cpt                       = 0;
0142 
0143     for (PluginLoader::PluginList::ConstIterator it = list.constBegin() ; it != list.constEnd() ; ++it)
0144     {
0145         Plugin* const plugin = (*it)->plugin();
0146 
0147         if (!plugin || !(*it)->shouldLoad())
0148         {
0149             continue;
0150         }
0151 
0152         d->app->guiFactory()->removeClient(plugin);
0153     }
0154 
0155     QStringList disabledActions = d->kipiPluginLoader->disabledPluginActions();
0156 
0157     for (PluginLoader::PluginList::ConstIterator it = list.constBegin() ; it != list.constEnd() ; ++it)
0158     {
0159         Plugin* const plugin = (*it)->plugin();
0160 
0161         if (!plugin || !(*it)->shouldLoad())
0162         {
0163             continue;
0164         }
0165 
0166         ++cpt;
0167         plugin->setup(d->app);
0168         plugin->rebuild();
0169 
0170         const auto pluginActions = plugin->actions();
0171         for (QAction* const action : pluginActions)
0172         {
0173             QString actionName(action->objectName());
0174             Category cat = plugin->category(action);
0175 
0176             if (cat == InvalidCategory)
0177             {
0178                 qWarning() << "Plugin action '" << actionName << "' has invalid category!";
0179                 continue;
0180             }
0181 
0182             if (!disabledActions.contains(actionName))
0183             {
0184                 KActionCategory* category = d->kipiCategoryMap[cat];
0185 
0186                 if (!category)
0187                 {
0188                     category = new KActionCategory(categoryName(cat), d->kipipluginsActionCollection);
0189                     d->kipiCategoryMap.insert(cat, category);
0190                 }
0191 
0192                 category->addAction(actionName, qobject_cast<QAction*>(action));
0193             }
0194             else
0195             {
0196                 qDebug() << "Plugin '" << actionName << "' is disabled.";
0197             }
0198         }
0199     }
0200 
0201     for (PluginLoader::PluginList::ConstIterator it = list.constBegin() ; it != list.constEnd() ; ++it)
0202     {
0203         Plugin* const plugin = (*it)->plugin();
0204 
0205         if (!plugin || !(*it)->shouldLoad())
0206         {
0207             continue;
0208         }
0209 
0210         d->app->guiFactory()->addClient(plugin);
0211     }
0212 
0213     // load KIPI actions settings
0214     d->kipipluginsActionCollection->readSettings();
0215 }
0216 
0217 void KipiTestPluginLoader::checkEmptyCategory(Category cat)
0218 {
0219     KActionCategory* const category = d->kipiCategoryMap[cat];
0220 
0221     if (!category)
0222     {
0223         QString actionName    = QString::fromLatin1("emptyCategory") + categoryShortName(cat);
0224         QAction* const action = d->app->actionCollection()->addAction(actionName);
0225         action->setEnabled(false);
0226         d->kipiCategoryMap.insert(cat, new KActionCategory(categoryName(cat), d->kipipluginsActionCollection));
0227     }
0228 }
0229 
0230 QString KipiTestPluginLoader::categoryName(Category cat) const
0231 {
0232     QString res;
0233 
0234     switch (cat)
0235     {
0236         case ExportPlugin:
0237             res = QLatin1String("Export Tools");
0238             break;
0239 
0240         case ImportPlugin:
0241             res = QLatin1String("Import Tools");
0242             break;
0243 
0244         case ImagesPlugin:
0245             res = QLatin1String("Images Tools");
0246             break;
0247 
0248         case ToolsPlugin:
0249             res = QLatin1String("Miscellaneous Tools");
0250             break;
0251 
0252         case BatchPlugin:
0253             res = QLatin1String("Batch Tools");
0254             break;
0255 
0256         case CollectionsPlugin:
0257             res = QLatin1String("Albums Tools");
0258             break;
0259 
0260         default:
0261             res = QLatin1String("Unknown Tools");
0262             break;
0263     }
0264 
0265     return res;
0266 }
0267 
0268 QString KipiTestPluginLoader::categoryShortName(Category cat) const
0269 {
0270     QString res;
0271 
0272     switch (cat)
0273     {
0274         case ExportPlugin:
0275             res = QLatin1String("Export");
0276             break;
0277 
0278         case ImportPlugin:
0279             res = QLatin1String("Import");
0280             break;
0281 
0282         case ToolsPlugin:
0283             res = QLatin1String("Tools");
0284             break;
0285 
0286         case BatchPlugin:
0287             res = QLatin1String("Batch");
0288             break;
0289 
0290         case CollectionsPlugin:
0291             res = QLatin1String("Collections");
0292             break;
0293 
0294         default:
0295             res = QLatin1String("Unknown");
0296             break;
0297     }
0298 
0299     return res;
0300 }
0301 
0302 } // namespace KXMLKipiCmd
0303 
0304 #include "moc_kipitestpluginloader.cpp"