QssParser: Interpret "oblique" as italic
[quassel.git] / src / uisupport / icon.cpp
index a8785b2..9a6a528 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-09 by the Quassel Project                          *
+ *   Copyright (C) 2005-2018 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   You should have received a copy of the GNU General Public License     *
  *   along with this program; if not, write to the                         *
  *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
-#ifndef HAVE_KDE
-
 #include "icon.h"
-#include "iconloader.h"
 
-Icon::Icon() : QIcon() {
+#include <set>
+
+#include <QDebug>
+
+namespace icon {
 
+namespace {
+
+void printWarning(const QString &iconName, const QString &extra = {})
+{
+    static std::set<QString> warnedAbout;
+    if (warnedAbout.insert(iconName).second) {
+        qWarning() << "Missing icon:" << iconName << qPrintable(extra);
+    }
 }
 
-Icon::Icon(const QString &name) : QIcon() {
-  addPixmap(IconLoader::global()->loadIcon(name, IconLoader::Desktop));
 }
 
-Icon::Icon(const QIcon& copy) : QIcon(copy) {
 
+QIcon get(const QString &iconName, const QString &fallbackPath)
+{
+    return get(std::vector<QString>{iconName}, fallbackPath);
 }
 
-Icon& Icon::operator=(const Icon &other) {
-  if (this != &other) {
-    QIcon::operator=(other);
-  }
-  return *this;
+
+QIcon get(const std::vector<QString> &iconNames, const QString &fallbackPath)
+{
+    for (auto &&iconName : iconNames) {
+        // Exact match
+        if (QIcon::hasThemeIcon(iconName)) {
+            return QIcon::fromTheme(iconName);
+        }
+    }
+
+    for (auto &&iconName : iconNames) {
+        // Try to get something from the theme anyway (i.e. a more generic fallback)
+        QIcon fallback = QIcon::fromTheme(iconName);
+        if (!fallback.availableSizes().isEmpty()) {
+            printWarning(iconName, QString{"(using fallback: \"%1\")"}.arg(fallback.name()));
+            return fallback;
+        }
+    }
+
+    // Build error string
+    QStringList requested;
+    for (auto &&iconName : iconNames) {
+        requested << iconName;
+    }
+    QString missing = "{" + requested.join(", ") + "}";
+
+    // Nothing from the theme, so try to load from path if given
+    if (!fallbackPath.isEmpty()) {
+        QIcon fallback{fallbackPath};
+        if (!fallback.availableSizes().isEmpty()) {
+            printWarning(missing, QString{"(using fallback: \"%1\")"}.arg(fallbackPath));
+            return fallback;
+        }
+    }
+
+    // Meh.
+    printWarning(missing);
+    return {};
 }
 
-#endif
+}