Improve data and icon file handling
authorManuel Nickschas <sputnick@quassel-irc.org>
Sun, 25 Jan 2009 01:00:39 +0000 (02:00 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sun, 25 Jan 2009 01:04:41 +0000 (02:04 +0100)
Add some more locations that data files are being searched in, and reorder the icon
search order to prefer system themes over our own files. Ah, and fix some bugs that
would exclude some dirs that really should be included.

This hopefully provides sane handling of external files now.

src/common/quassel.cpp
src/uisupport/iconloader.cpp

index d9e180e..5444979 100644 (file)
@@ -284,32 +284,32 @@ QStringList Quassel::findDataDirPaths() const {
       dataDirNames[i].append("/apps/quassel/");
   } else {
   // Provide a fallback
-  // FIXME fix this for win and mac!
 #ifdef Q_OS_WIN32
-    dataDirNames << qgetenv("APPDATA") + QCoreApplication::organizationDomain()
+    dataDirNames << qgetenv("APPDATA") + QCoreApplication::organizationDomain() + "/share/apps/quassel/"
+                 << qgetenv("APPDATA") + QCoreApplication::organizationDomain()
                  << QCoreApplication::applicationDirPath();
+  }
 #elif defined Q_WS_MAC
     dataDirNames << QDir::homePath() + "/Library/Application Support/Quassel/"
                  << QCoreApplication::applicationDirPath();
+  }
 #else
-    if(dataDirNames.isEmpty())
-      dataDirNames.append("/usr/share/apps/quassel/");
-    // 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");
-      appDir.append("/apps/quassel/");
-      if(!dataDirNames.contains(appDir))
-        dataDirNames.append(appDir);
-    }
-#endif
+    dataDirNames.append("/usr/share/apps/quassel/");
+  }
+  // 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");
+    appDir.append("/apps/quassel/");
+    if(!dataDirNames.contains(appDir))
+      dataDirNames.append(appDir);
   }
+#endif
 
   // add resource path and workdir just in case
-  dataDirNames << ":/data/"
-               << QCoreApplication::applicationDirPath() + "/data/"
-               << QCoreApplication::applicationDirPath();
+  dataDirNames << QCoreApplication::applicationDirPath() + "/data/"
+               << ":/data/";
 
   // append trailing '/' and check for existence
   QStringList::Iterator iter = dataDirNames.begin();
index 354e0ee..1c3d6e7 100644 (file)
@@ -54,39 +54,59 @@ void IconLoader::setTheme(const QString &theme) {
   // check which dirs could contain themed icons
   _themedIconDirNames.clear();
   _plainIconDirNames.clear();
-  QString path;
-  QStringList dataDirNames = Quassel::dataDirPaths();
 
-  // System theme in $data/icons/$theme
-  foreach(QString dir, dataDirNames) {
-    path = QString("%1/icons/%2").arg(dir, theme);
-    if(QFile::exists(path))
-      _themedIconDirNames.append(path);
+  // First, look for a system theme
+  // This is supposed to only work on Unix, though other platforms might set $XDG_DATA_DIRS if they please.
+  QStringList iconDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts);
+  if(!iconDirNames.isEmpty()) {
+    for(int i = 0; i < iconDirNames.count(); i++)
+      iconDirNames[i].append(QString("/icons/"));
+  }
+#ifdef Q_OS_UNIX
+  else {
+    // Provide a fallback
+    iconDirNames << "/usr/share/icons/";
+  }
+  // Add our prefix too
+  QString appDir = QCoreApplication::applicationDirPath();
+  int binpos = appDir.lastIndexOf("/bin");
+  if(binpos >= 0) {
+    appDir.replace(binpos, 4, "/share");
+    appDir.append("/icons/");
+    if(!iconDirNames.contains(appDir))
+      iconDirNames.append(appDir);
   }
-  // Resource for system theme :/icons/$theme
-  path = QString(":/icons/%1").arg(theme);
-  if(QFile::exists(path))
-    _themedIconDirNames.append(path);
-
-  // Own icons in $data/apps/quassel/icons/hicolor
-  // Also, plain icon dirs $data/apps/quassel/pics
-  foreach(QString dir, dataDirNames) {
-    path = QString("%1/icons/hicolor").arg(dir);
+#endif
+
+  // Now look for an icons/ subdir in our data paths
+  foreach(const QString &dir, Quassel::dataDirPaths())
+    iconDirNames << dir + "icons/";
+
+  // Add our resource path too
+  iconDirNames << ":/icons/";
+
+  // Ready do add theme names
+  foreach(const QString &dir, iconDirNames) {
+    QString path = dir + theme + '/';
     if(QFile::exists(path))
-      _themedIconDirNames.append(path);
-    path = QString("%1/apps/quassel/pics").arg(dir);
+      _themedIconDirNames << path;
+  }
+  foreach(const QString &dir, iconDirNames) {
+    QString path = dir + "hicolor/";
     if(QFile::exists(path))
-      _plainIconDirNames.append(path);
+      _themedIconDirNames << path;
   }
 
-  // Same for :/icons/hicolor and :/pics
-  path = QString(":/icons/hicolor");
-  if(QFile::exists(path))
-    _themedIconDirNames.append(path);
+  // We ship some plain (non-themed) icons in $data/pics
+  foreach(const QString &dir, Quassel::dataDirPaths()) {
+    QString path = dir + "pics/";
+    if(QFile::exists(path))
+      _plainIconDirNames << path;
+  }
+  // And of course, our resource path
+  if(QFile::exists(":/pics"))
+    _plainIconDirNames << ":/pics";
 
-  path = QString(":/pics");
-  if(QFile::exists(path))
-    _plainIconDirNames.append(path);
 }
 
 // TODO: optionally implement cache (speed/memory tradeoff?)