summaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
commit7167ce41b61d2ba2cdb526777a4233eb84a3b66a (patch)
treea35c14143716e1f2c98f808c81f89426045a946f /SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp
Imported Upstream version 2.99.6upstream/2.99.6
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp b/SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp
new file mode 100644
index 0000000..efe22a1
--- /dev/null
+++ b/SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp
@@ -0,0 +1,164 @@
+#include "iconmanager.h"
+#include "sqlitestudio.h"
+#include "services/pluginmanager.h"
+#include "common/unused.h"
+#include "common/global.h"
+#include <QApplication>
+#include <QDir>
+#include <QString>
+#include <QIcon>
+#include <QMovie>
+#include <QDebug>
+#include <QPainter>
+
+IconManager* IconManager::instance = nullptr;
+
+IconManager* IconManager::getInstance()
+{
+ if (instance == nullptr)
+ instance = new IconManager();
+
+ return instance;
+}
+
+QString IconManager::getFilePathForName(const QString& name)
+{
+ return paths[name];
+}
+
+IconManager::IconManager()
+{
+}
+
+void IconManager::init()
+{
+ Icon::init();
+
+ iconDirs += qApp->applicationDirPath() + "/img";
+ iconDirs += ":/icons";
+
+ QString envDirs = SQLITESTUDIO->getEnv("SQLITESTUDIO_ICONS");
+ if (!envDirs.isNull())
+ iconDirs += envDirs.split(PATH_LIST_SEPARATOR);
+
+#ifdef ICONS_DIR
+ iconDirs += STRINGIFY(ICONS_DIR);
+#endif
+
+ iconFileExtensions << "*.png" << "*.PNG" << "*.jpg" << "*.JPG" << "*.svg" << "*.SVG";
+ movieFileExtensions << "*.gif" << "*.GIF" << "*.mng" << "*.MNG";
+
+ foreach (QString dirPath, iconDirs)
+ {
+ loadRecurently(dirPath, "", false);
+ loadRecurently(dirPath, "", true);
+ }
+
+ Icon::loadAll();
+
+ if (PLUGINS->arePluginsInitiallyLoaded())
+ enableRescanning();
+ else
+ connect(PLUGINS, SIGNAL(pluginsInitiallyLoaded()), this, SLOT(pluginsInitiallyLoaded()));
+}
+
+void IconManager::rescanResources(const QString& pluginName)
+{
+ if (!pluginName.isNull() && PLUGINS->isBuiltIn(pluginName))
+ return;
+
+ for (const QString& name : resourceMovies)
+ {
+ delete movies[name];
+ movies.remove(name);
+ }
+
+ for (const QString& name : resourceIcons)
+ icons.remove(name);
+
+ resourceMovies.clear();
+ resourceIcons.clear();
+ loadRecurently(":/icons", "", true);
+ loadRecurently(":/icons", "", false);
+
+ Icon::reloadAll();
+}
+
+void IconManager::rescanResources(Plugin* plugin, PluginType* pluginType)
+{
+ UNUSED(pluginType);
+ rescanResources(plugin->getName());
+}
+
+void IconManager::pluginsAboutToMassUnload()
+{
+ disconnect(PLUGINS, SIGNAL(loaded(Plugin*,PluginType*)), this, SLOT(rescanResources(Plugin*,PluginType*)));
+ disconnect(PLUGINS, SIGNAL(unloaded(QString,PluginType*)), this, SLOT(rescanResources(QString)));
+}
+
+void IconManager::pluginsInitiallyLoaded()
+{
+ Icon::reloadAll();
+ enableRescanning();
+ disconnect(PLUGINS, SIGNAL(pluginsInitiallyLoaded()), this, SLOT(pluginsInitiallyLoaded()));
+}
+
+void IconManager::loadRecurently(QString dirPath, const QString& prefix, bool movie)
+{
+ QStringList extensions = movie ? movieFileExtensions : iconFileExtensions;
+ QString path;
+ QString name;
+ QDir dir(dirPath);
+ foreach (QFileInfo entry, dir.entryInfoList(extensions, QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot|QDir::Readable))
+ {
+ if (entry.isDir())
+ {
+ loadRecurently(entry.absoluteFilePath(), prefix+entry.fileName()+"_", movie);
+ continue;
+ }
+
+ path = entry.absoluteFilePath();
+ name = entry.baseName();
+ paths[name] = path;
+ if (movie)
+ movies[name] = new QMovie(path);
+ else
+ icons[name] = new QIcon(path);
+
+ if (path.startsWith(":/"))
+ {
+ if (movie)
+ resourceMovies << name;
+ else
+ resourceIcons << name;
+ }
+ }
+}
+
+void IconManager::enableRescanning()
+{
+ connect(PLUGINS, SIGNAL(loaded(Plugin*,PluginType*)), this, SLOT(rescanResources(Plugin*,PluginType*)));
+ connect(PLUGINS, SIGNAL(unloaded(QString,PluginType*)), this, SLOT(rescanResources(QString)));
+ connect(PLUGINS, SIGNAL(aboutToQuit()), this, SLOT(pluginsAboutToMassUnload()));
+}
+
+QMovie* IconManager::getMovie(const QString& name)
+{
+ if (!movies.contains(name))
+ qCritical() << "Movie missing:" << name;
+
+ return movies[name];
+}
+
+QIcon* IconManager::getIcon(const QString& name)
+{
+ if (!icons.contains(name))
+ qCritical() << "Icon missing:" << name;
+
+ return icons[name];
+}
+
+bool IconManager::isMovie(const QString& name)
+{
+ return movies.contains(name);
+}