Add a method to find data files in standard directories (such as $PREFIX/share)
authorManuel Nickschas <sputnick@quassel-irc.org>
Sun, 11 Jan 2009 22:34:17 +0000 (23:34 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Mon, 12 Jan 2009 03:00:44 +0000 (04:00 +0100)
Also we move finding those directories out of iconloader.cpp into util.cpp such that we
can reuse that elsewhere.
Oh, and we make IconLoader spit out a warning if an icon isn't found now, as sometimes icons
change names upstream.

src/common/util.cpp
src/common/util.h
src/uisupport/iconloader.cpp

index 9e9bf88..a8a3887 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <QCoreApplication>
 #include <QDebug>
 
 #include <QCoreApplication>
 #include <QDebug>
+#include <QFile>
 #include <QLibraryInfo>
 #include <QTextCodec>
 #include <QTranslator>
 #include <QLibraryInfo>
 #include <QTextCodec>
 #include <QTranslator>
@@ -175,6 +176,34 @@ QDir quasselDir() {
   return qDir;
 }
 
   return qDir;
 }
 
+QStringList dataDirPaths() {
+  QStringList dataDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts);
+
+  // Provide a fallback
+# ifdef Q_OS_UNIX
+  if(dataDirNames.isEmpty()) dataDirNames.append("/usr/share");
+  // on UNIX, we always check our install prefix
+  QString appDir = QCoreApplication::applicationDirPath();
+  int binpos = appDir.lastIndexOf("/bin");
+  if(binpos >= 0) {
+    appDir.replace(binpos, 4, "/share");
+    if(!dataDirNames.contains(appDir)) dataDirNames.append(appDir);
+  }
+# endif
+
+  return dataDirNames;
+}
+
+QString findDataFilePath(const QString &fileName) {
+  QStringList dataDirs = dataDirPaths();
+  foreach(QString dataDir, dataDirs) {
+    QString path = dataDir + "/apps/quassel/" + fileName;
+    if(QFile::exists(path))
+      return path;
+  }
+  return QString();
+}
+
 void loadTranslation(const QLocale &locale) {
   QTranslator *qtTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QtTr");
   QTranslator *quasselTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QuasselTr");
 void loadTranslation(const QLocale &locale) {
   QTranslator *qtTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QtTr");
   QTranslator *quasselTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QuasselTr");
index bbacda0..28639ba 100644 (file)
@@ -52,6 +52,21 @@ uint editingDistance(const QString &s1, const QString &s2);
 
 QDir quasselDir();
 
 
 QDir quasselDir();
 
+//! Returns a list of data directory paths
+/** There are several locations for applications to install their data files in. On Unix,
+ *  a common location is /usr/share; others include $PREFIX/share and additional directories
+ *  specified in the env variable XDG_DATA_DIRS.
+ *  \return A list of directory paths to look for data files in
+ */
+QStringList dataDirPaths();
+
+//! Searches for a data file in the possible data directories
+/** Data files can reside in $DATA_DIR/apps/quassel, where $DATA_DIR is one of the directories
+ *  returned by \sa dataDirPaths().
+ *  \return The full path to the data file if found; a null QString else
+ */
+QString findDataFilePath(const QString &fileName);
+
 void loadTranslation(const QLocale &locale);
 
 template<typename T>
 void loadTranslation(const QLocale &locale);
 
 template<typename T>
index cc4a823..d3df5b3 100644 (file)
@@ -26,6 +26,7 @@
 #include <QFile>
 
 #include "iconloader.h"
 #include <QFile>
 
 #include "iconloader.h"
+#include "util.h"
 
 IconLoader IconLoader::_iconLoader;
 int IconLoader::_groupSize[] = { 48, 22, 22, 16, 32, 22 };  // default sizes taken from Oxygen
 
 IconLoader IconLoader::_iconLoader;
 int IconLoader::_groupSize[] = { 48, 22, 22, 16, 32, 22 };  // default sizes taken from Oxygen
@@ -53,19 +54,7 @@ void IconLoader::setTheme(const QString &theme) {
   _themedIconDirNames.clear();
   _plainIconDirNames.clear();
   QString path;
   _themedIconDirNames.clear();
   _plainIconDirNames.clear();
   QString path;
-  QStringList dataDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts);
-
-// Provide a fallback
-# ifdef Q_OS_UNIX
-    if(dataDirNames.isEmpty()) dataDirNames.append("/usr/share");
-    // on UNIX, we always check our install prefix
-    QString appDir = QCoreApplication::applicationDirPath();
-    int binpos = appDir.lastIndexOf("/bin");
-    if(binpos >= 0) {
-      appDir.replace(binpos, 4, "/share");
-      if(!dataDirNames.contains(appDir)) dataDirNames.append(appDir);
-    }
-# endif
+  QStringList dataDirNames = dataDirPaths();
 
   // System theme in $data/icons/$theme
   foreach(QString dir, dataDirNames) {
 
   // System theme in $data/icons/$theme
   foreach(QString dir, dataDirNames) {
@@ -135,6 +124,7 @@ QString IconLoader::findIconPath(const QString &name, int size) {
     if(QFile::exists(path)) return path;
   }
 
     if(QFile::exists(path)) return path;
   }
 
+  qWarning() << "Icon not found:" << name << size;
   return QString();
 }
 
   return QString();
 }