aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-05-13 17:13:32 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-05-13 17:13:32 +0000
commit623485b2c143d736656134750c8004c437cd6d68 (patch)
treea7598a8337fc9f3565d3544c07a0539d03ae3afb /src
parentd26972aaac0fa0ec67b9958a79eff90e09d3df30 (diff)
downloadqmmp-623485b2c143d736656134750c8004c437cd6d68.tar.gz
qmmp-623485b2c143d736656134750c8004c437cd6d68.tar.bz2
qmmp-623485b2c143d736656134750c8004c437cd6d68.zip
added cache for ui plugins
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3465 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/qmmpui/aboutdialog.cpp2
-rw-r--r--src/qmmpui/configdialog.cpp2
-rw-r--r--src/qmmpui/qmmpuiplugincache.cpp18
-rw-r--r--src/qmmpui/qmmpuiplugincache_p.h3
-rw-r--r--src/qmmpui/uiloader.cpp86
-rw-r--r--src/qmmpui/uiloader.h22
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