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"