aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmpui/configdialog.cpp2
-rw-r--r--src/qmmpui/filedialog.cpp73
-rw-r--r--src/qmmpui/filedialog.h11
-rw-r--r--src/qmmpui/qmmpuiplugincache.cpp51
-rw-r--r--src/qmmpui/qmmpuiplugincache_p.h4
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;
};