diff options
| -rw-r--r-- | src/qmmpui/aboutdialog.cpp | 2 | ||||
| -rw-r--r-- | src/qmmpui/configdialog.cpp | 2 | ||||
| -rw-r--r-- | src/qmmpui/qmmpuiplugincache.cpp | 18 | ||||
| -rw-r--r-- | src/qmmpui/qmmpuiplugincache_p.h | 3 | ||||
| -rw-r--r-- | src/qmmpui/uiloader.cpp | 86 | ||||
| -rw-r--r-- | src/qmmpui/uiloader.h | 22 |
6 files changed, 77 insertions, 56 deletions
diff --git a/src/qmmpui/aboutdialog.cpp b/src/qmmpui/aboutdialog.cpp index 79ca40fd8..607d2d6c6 100644 --- a/src/qmmpui/aboutdialog.cpp +++ b/src/qmmpui/aboutdialog.cpp @@ -111,7 +111,7 @@ QString AboutDialog::loadAbout() text.append("</ul>"); text.append("<h5>"+tr("General plugins:")+"</h5>"); text.append("<ul type=\"square\">"); - foreach(GeneralFactory *fact, *General::factories()) + foreach(GeneralFactory *fact, General::factories()) { text.append("<li>"); text.append(fact->properties().name); diff --git a/src/qmmpui/configdialog.cpp b/src/qmmpui/configdialog.cpp index e1a9f25d8..7f52a73ba 100644 --- a/src/qmmpui/configdialog.cpp +++ b/src/qmmpui/configdialog.cpp @@ -252,7 +252,7 @@ void ConfigDialog::loadPluginsInfo() load user interfaces information */ item = new QTreeWidgetItem (m_ui->treeWidget, QStringList() << tr("User Interfaces")); - foreach(UiFactory *factory, *UiLoader::factories()) + foreach(UiFactory *factory, UiLoader::factories()) { new PluginItem (item, factory, UiLoader::file(factory)); } diff --git a/src/qmmpui/qmmpuiplugincache.cpp b/src/qmmpui/qmmpuiplugincache.cpp index ff804c131..b4a88ac2f 100644 --- a/src/qmmpui/qmmpuiplugincache.cpp +++ b/src/qmmpui/qmmpuiplugincache.cpp @@ -25,6 +25,7 @@ #include <QApplication> #include <QTranslator> #include "generalfactory.h" +#include "uifactory.h" #include "qmmpuiplugincache_p.h" QmmpUiPluginCache::QmmpUiPluginCache(const QString &file, QSettings *settings) @@ -32,6 +33,7 @@ QmmpUiPluginCache::QmmpUiPluginCache(const QString &file, QSettings *settings) m_error = false; m_instance = 0; m_generalFactory = 0; + m_uiFactory = 0; m_priority = 0; bool update = false; QFileInfo info(file); @@ -66,6 +68,11 @@ QmmpUiPluginCache::QmmpUiPluginCache(const QString &file, QSettings *settings) m_shortName = factory->properties().shortName; m_priority = 0; } + else if(UiFactory *factory = uiFactory()) + { + m_shortName = factory->properties().shortName; + m_priority = 0; + } else { qWarning("QmmpUiPluginCache: unknown plugin type: %s", qPrintable(m_path)); @@ -117,6 +124,17 @@ GeneralFactory *QmmpUiPluginCache::generalFactory() return m_generalFactory; } +UiFactory *QmmpUiPluginCache::uiFactory() +{ + if(!m_uiFactory) + { + m_uiFactory = qobject_cast<UiFactory *> (instance()); + if(m_uiFactory) + qApp->installTranslator(m_uiFactory->createTranslator(qApp)); + } + return m_uiFactory; +} + QObject *QmmpUiPluginCache::instance() { if(m_error) diff --git a/src/qmmpui/qmmpuiplugincache_p.h b/src/qmmpui/qmmpuiplugincache_p.h index c5e3186f6..1a4be8918 100644 --- a/src/qmmpui/qmmpuiplugincache_p.h +++ b/src/qmmpui/qmmpuiplugincache_p.h @@ -26,6 +26,7 @@ #include <QSettings> class GeneralFactory; +class UiFactory; /*! @internal * @author Ilya Kotov <forkotov02@hotmail.ru> @@ -41,6 +42,7 @@ public: bool hasError() const; GeneralFactory *generalFactory(); + UiFactory *uiFactory(); static void cleanup(QSettings *settings); @@ -51,6 +53,7 @@ private: bool m_error; QObject *m_instance; GeneralFactory *m_generalFactory; + UiFactory *m_uiFactory; int m_priority; }; diff --git a/src/qmmpui/uiloader.cpp b/src/qmmpui/uiloader.cpp index 987e4997d..ac02674e8 100644 --- a/src/qmmpui/uiloader.cpp +++ b/src/qmmpui/uiloader.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011 by Ilya Kotov * + * Copyright (C) 2011-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -18,63 +18,61 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#include <QtGui> -#include <QObject> -#include <QList> -#include <QApplication> +#include <QDir> #include <qmmp/qmmp.h> +#include "qmmpuiplugincache_p.h" #include "uiloader.h" -QList<UiFactory*> *UiLoader::m_factories = 0; -QHash <UiFactory*, QString> *UiLoader::m_files = 0; +QList<QmmpUiPluginCache*> *UiLoader::m_cache = 0; -void UiLoader::checkFactories() +void UiLoader::loadPlugins() { - if (!m_factories) + if (m_cache) + return; + + m_cache = new QList<QmmpUiPluginCache*>; + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); + QDir pluginsDir (Qmmp::pluginsPath()); + pluginsDir.cd("Ui"); + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { - m_factories = new QList<UiFactory *>; - m_files = new QHash <UiFactory*, QString>; - QDir pluginsDir(Qmmp::pluginsPath()); - pluginsDir.cd("Ui"); - foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + QmmpUiPluginCache *item = new QmmpUiPluginCache(pluginsDir.absoluteFilePath(fileName), &settings); + if(item->hasError()) { - QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); - QObject *plugin = loader.instance(); - if (loader.isLoaded()) - qDebug("UiLoader: loaded plugin %s", qPrintable(fileName)); - else - qWarning("UiLoader: %s", qPrintable(loader.errorString())); - - UiFactory *factory = 0; - if (plugin) - factory = qobject_cast<UiFactory *>(plugin); - - if (factory) - { - m_factories->append(factory); - m_files->insert(factory, pluginsDir.absoluteFilePath(fileName)); - qApp->installTranslator(factory->createTranslator(qApp)); - } + delete item; + continue; } + m_cache->append(item); } } -QList<UiFactory*> *UiLoader::factories() +QList<UiFactory *> UiLoader::factories() { - checkFactories(); - return m_factories; + loadPlugins(); + QList<UiFactory *> list; + foreach (QmmpUiPluginCache *item, *m_cache) + { + if(item->uiFactory()) + list.append(item->uiFactory()); + } + return list; } QString UiLoader::file(UiFactory *factory) { - checkFactories(); - return m_files->value(factory); + loadPlugins(); + foreach(QmmpUiPluginCache *item, *m_cache) + { + if(item->shortName() == factory->properties().shortName) + return item->file(); + } + return QString(); } void UiLoader::select(UiFactory* factory) { - checkFactories(); - if (!m_factories->contains(factory)) + loadPlugins(); + if (!factories().contains(factory)) return; QSettings settings (Qmmp::configFile(), QSettings::IniFormat); settings.setValue ("Ui/current_plugin", factory->properties().shortName); @@ -82,15 +80,15 @@ void UiLoader::select(UiFactory* factory) UiFactory *UiLoader::selected() { - checkFactories(); + loadPlugins(); QSettings settings (Qmmp::configFile(), QSettings::IniFormat); QString name = settings.value("Ui/current_plugin", "skinned").toString(); - foreach(UiFactory *factory, *m_factories) + foreach(QmmpUiPluginCache *item, *m_cache) { - if (factory->properties().shortName == name) - return factory; + if(item->shortName() == name && item->uiFactory()) + return item->uiFactory(); } - if (!m_factories->isEmpty()) - return m_factories->at(0); + if (!m_cache->isEmpty()) + return m_cache->at(0)->uiFactory(); return 0; } diff --git a/src/qmmpui/uiloader.h b/src/qmmpui/uiloader.h index df20c4b7e..207e6e792 100644 --- a/src/qmmpui/uiloader.h +++ b/src/qmmpui/uiloader.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011 by Ilya Kotov * + * Copyright (C) 2011-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -17,13 +17,16 @@ * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#ifndef UI_H -#define UI_H +#ifndef UILOADER_H +#define UILOADER_H -#include <QStringList> -#include <QHash> +#include <QString> +#include <QList> +#include <QObject> #include "uifactory.h" +class QmmpUiPluginCache; + /*! @brief The UiLoader provides user interface plugins access * @author Ilya Kotov <forkotov02@hotmail.ru> */ @@ -33,7 +36,7 @@ public: /*! * Returns a list of the loaded ui plugin factories. */ - static QList<UiFactory*> *factories(); + static QList<UiFactory*> factories(); /*! * Returns plugin file path. * @param factory User interface plugin factory. @@ -50,9 +53,8 @@ public: static UiFactory *selected(); private: - static QList<UiFactory*> *m_factories; - static QHash <UiFactory*, QString> *m_files; - static void checkFactories(); + static void loadPlugins(); + static QList<QmmpUiPluginCache*> *m_cache; }; -#endif //UI_H +#endif //UILOADER_H |
