diff options
| -rw-r--r-- | src/qmmpui/configdialog.cpp | 2 | ||||
| -rw-r--r-- | src/qmmpui/filedialog.cpp | 73 | ||||
| -rw-r--r-- | src/qmmpui/filedialog.h | 11 | ||||
| -rw-r--r-- | src/qmmpui/qmmpuiplugincache.cpp | 51 | ||||
| -rw-r--r-- | src/qmmpui/qmmpuiplugincache_p.h | 4 |
5 files changed, 99 insertions, 42 deletions
diff --git a/src/qmmpui/configdialog.cpp b/src/qmmpui/configdialog.cpp index 7f52a73ba..bd460888c 100644 --- a/src/qmmpui/configdialog.cpp +++ b/src/qmmpui/configdialog.cpp @@ -242,7 +242,7 @@ void ConfigDialog::loadPluginsInfo() load file dialogs information */ item = new QTreeWidgetItem (m_ui->treeWidget, QStringList() << tr("File Dialogs")); - foreach(FileDialogFactory *factory, *FileDialog::factories()) + foreach(FileDialogFactory *factory, FileDialog::factories()) { new PluginItem (item, factory, FileDialog::file(factory)); } diff --git a/src/qmmpui/filedialog.cpp b/src/qmmpui/filedialog.cpp index 93bfd669a..5219449ed 100644 --- a/src/qmmpui/filedialog.cpp +++ b/src/qmmpui/filedialog.cpp @@ -26,64 +26,60 @@ #include <QMetaObject> #include <QLibrary> #include <qmmp/qmmp.h> +#include "qmmpuiplugincache_p.h" #include "filedialog.h" #include "qtfiledialog_p.h" - //static functions FileDialog* FileDialog::m_instance = 0; -QList<FileDialogFactory*> *FileDialog::m_factories = 0; -QHash <FileDialogFactory*, QString> *FileDialog::m_files = 0; +QList<QmmpUiPluginCache*> *FileDialog::m_cache = 0; FileDialogFactory *FileDialog::m_currentFactory = 0; -void FileDialog::checkFactories() +void FileDialog::loadPlugins() { - if(m_factories) + if (m_cache) return; - m_factories = new QList<FileDialogFactory *>; - m_files = new QHash <FileDialogFactory*, QString>; - m_factories->append(new QtFileDialogFactory); + m_cache = new QList<QmmpUiPluginCache*>; + m_cache->append(new QmmpUiPluginCache(new QtFileDialogFactory)); + + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); QDir pluginsDir (Qmmp::pluginsPath()); pluginsDir.cd("FileDialogs"); foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { - QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); - QObject *plugin = loader.instance(); - if (loader.isLoaded()) - qDebug("FileDialog: loaded plugin %s", qPrintable(fileName)); - else - qWarning("FileDialog: %s",qPrintable(loader.errorString())); - - FileDialogFactory *factory = 0; - if (plugin) - factory = qobject_cast<FileDialogFactory *>(plugin); - - if (factory) + QmmpUiPluginCache *item = new QmmpUiPluginCache(pluginsDir.absoluteFilePath(fileName), &settings); + if(item->hasError()) { - m_factories->append(factory); - m_files->insert(factory, fileName); - qApp->installTranslator(factory->createTranslator(qApp)); + delete item; + continue; } + m_cache->append(item); } } -QList <FileDialogFactory*> *FileDialog::factories() +QList<FileDialogFactory *> FileDialog::factories() { - checkFactories(); - return m_factories; + loadPlugins(); + QList<FileDialogFactory *> list; + foreach (QmmpUiPluginCache *item, *m_cache) + { + if(item->fileDialogFactory()) + list.append(item->fileDialogFactory()); + } + return list; } void FileDialog::setEnabled(FileDialogFactory *factory) { - checkFactories(); + loadPlugins(); QSettings settings (Qmmp::configFile(), QSettings::IniFormat); settings.setValue("FileDialog", factory->properties().shortName); } bool FileDialog::isEnabled(FileDialogFactory *factory) { - checkFactories(); + loadPlugins(); QSettings settings (Qmmp::configFile(), QSettings::IniFormat); QString name = settings.value("FileDialog", "qt_dialog").toString(); return factory->properties().shortName == name; @@ -91,8 +87,13 @@ bool FileDialog::isEnabled(FileDialogFactory *factory) QString FileDialog::file(FileDialogFactory *factory) { - checkFactories(); - return m_files->value(factory); + loadPlugins(); + foreach(QmmpUiPluginCache *item, *m_cache) + { + if(item->shortName() == factory->properties().shortName) + return item->file(); + } + return QString(); } QString FileDialog::getExistingDirectory(QWidget *parent, @@ -161,22 +162,22 @@ void FileDialog::popup(QWidget *parent, FileDialog* FileDialog::instance() { - checkFactories(); + loadPlugins(); FileDialogFactory *selected = 0; QSettings settings (Qmmp::configFile(), QSettings::IniFormat); QString name = settings.value("FileDialog", "qt_dialog").toString(); - foreach(FileDialogFactory *factory, *m_factories) + foreach(QmmpUiPluginCache *item, *m_cache) { - if(factory->properties().shortName == name) + if(item->shortName() == name) { - selected = factory; + selected = item->fileDialogFactory(); break; } } if(!selected) - selected = m_factories->at(0); + selected = m_cache->at(0)->fileDialogFactory(); if(selected == m_currentFactory && m_instance) return m_instance; @@ -194,7 +195,7 @@ FileDialog* FileDialog::instance() FileDialog* FileDialog::createDefault() { - return m_factories->at(0)->create(); + return m_cache->at(0)->fileDialogFactory()->create(); } //base implementation diff --git a/src/qmmpui/filedialog.h b/src/qmmpui/filedialog.h index 73ec61b79..55f25cc30 100644 --- a/src/qmmpui/filedialog.h +++ b/src/qmmpui/filedialog.h @@ -1,5 +1,5 @@ /************************************************************************** -* Copyright (C) 2008-2012 by Ilya Kotov * +* Copyright (C) 2008-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -27,6 +27,8 @@ #include <QHash> #include "filedialogfactory.h" +class QmmpUiPluginCache; + /*! @brief The FileDialog class is the base interface class of the file dialogs. * @author Vladimir Kuznetsov <vovanec@gmail.com> */ @@ -37,7 +39,7 @@ public: /*! * Returns a list of registered file dialog factories. */ - static QList <FileDialogFactory*> *factories(); + static QList <FileDialogFactory*> factories(); /*! * Selects current file dialog factory. */ @@ -229,13 +231,12 @@ private slots: void updateLastDir(const QStringList&); private: - static void checkFactories(); + static void loadPlugins(); static FileDialog* instance(); static FileDialog* createDefault(); - static QList<FileDialogFactory*> *m_factories; static FileDialogFactory *m_currentFactory; static FileDialog* m_instance; - static QHash <FileDialogFactory*, QString> *m_files; + static QList<QmmpUiPluginCache*> *m_cache; void init(QObject* receiver, const char* member, QString *dir); bool m_initialized; diff --git a/src/qmmpui/qmmpuiplugincache.cpp b/src/qmmpui/qmmpuiplugincache.cpp index b4a88ac2f..2586f01ed 100644 --- a/src/qmmpui/qmmpuiplugincache.cpp +++ b/src/qmmpui/qmmpuiplugincache.cpp @@ -26,6 +26,7 @@ #include <QTranslator> #include "generalfactory.h" #include "uifactory.h" +#include "filedialogfactory.h" #include "qmmpuiplugincache_p.h" QmmpUiPluginCache::QmmpUiPluginCache(const QString &file, QSettings *settings) @@ -34,6 +35,7 @@ QmmpUiPluginCache::QmmpUiPluginCache(const QString &file, QSettings *settings) m_instance = 0; m_generalFactory = 0; m_uiFactory = 0; + m_fileDialogFactory = 0; m_priority = 0; bool update = false; QFileInfo info(file); @@ -73,6 +75,11 @@ QmmpUiPluginCache::QmmpUiPluginCache(const QString &file, QSettings *settings) m_shortName = factory->properties().shortName; m_priority = 0; } + else if(FileDialogFactory *factory = fileDialogFactory()) + { + m_shortName = factory->properties().shortName; + m_priority = 0; + } else { qWarning("QmmpUiPluginCache: unknown plugin type: %s", qPrintable(m_path)); @@ -93,6 +100,39 @@ QmmpUiPluginCache::QmmpUiPluginCache(const QString &file, QSettings *settings) settings->endGroup(); } +QmmpUiPluginCache::QmmpUiPluginCache(QObject *instance) +{ + m_error = false; + m_instance = instance; + m_generalFactory = 0; + m_uiFactory = 0; + m_fileDialogFactory = 0; + m_priority = 0; + + if(GeneralFactory *factory = generalFactory()) + { + m_shortName = factory->properties().shortName; + m_priority = 0; + } + else if(UiFactory *factory = uiFactory()) + { + m_shortName = factory->properties().shortName; + m_priority = 0; + } + else if(FileDialogFactory *factory = fileDialogFactory()) + { + m_shortName = factory->properties().shortName; + m_priority = 0; + } + else + { + qWarning("QmmpUiPluginCache: unknown plugin type"); + m_error = true; + return; + } + qDebug("QmmpUiPluginCache: registered internal factory %s", qPrintable(m_shortName)); +} + const QString QmmpUiPluginCache::shortName() const { return m_shortName; @@ -135,6 +175,17 @@ UiFactory *QmmpUiPluginCache::uiFactory() return m_uiFactory; } +FileDialogFactory *QmmpUiPluginCache::fileDialogFactory() +{ + if(!m_fileDialogFactory) + { + m_fileDialogFactory = qobject_cast<FileDialogFactory *> (instance()); + if(m_fileDialogFactory) + qApp->installTranslator(m_fileDialogFactory->createTranslator(qApp)); + } + return m_fileDialogFactory; +} + QObject *QmmpUiPluginCache::instance() { if(m_error) diff --git a/src/qmmpui/qmmpuiplugincache_p.h b/src/qmmpui/qmmpuiplugincache_p.h index 1a4be8918..7743ebba6 100644 --- a/src/qmmpui/qmmpuiplugincache_p.h +++ b/src/qmmpui/qmmpuiplugincache_p.h @@ -27,6 +27,7 @@ class GeneralFactory; class UiFactory; +class FileDialogFactory; /*! @internal * @author Ilya Kotov <forkotov02@hotmail.ru> @@ -35,6 +36,7 @@ class QmmpUiPluginCache { public: QmmpUiPluginCache(const QString &file, QSettings *settings); + QmmpUiPluginCache(QObject *instance); const QString shortName() const; const QString file() const; @@ -43,6 +45,7 @@ public: GeneralFactory *generalFactory(); UiFactory *uiFactory(); + FileDialogFactory *fileDialogFactory(); static void cleanup(QSettings *settings); @@ -54,6 +57,7 @@ private: QObject *m_instance; GeneralFactory *m_generalFactory; UiFactory *m_uiFactory; + FileDialogFactory *m_fileDialogFactory; int m_priority; }; |
