src: Yearly copyright bump
[quassel.git] / src / uisupport / icon.cpp
index 19e9f88..2a91743 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2013 by the Quassel Project                        *
+ *   Copyright (C) 2005-2020 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   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 {
 
-Icon::Icon(const QString &name) : QIcon()
+namespace {
+
+void printWarning(const QString& iconName, const QString& extra = {})
 {
-    addPixmap(IconLoader::global()->loadIcon(name, IconLoader::Desktop));
+    static std::set<QString> warnedAbout;
+    if (warnedAbout.insert(iconName).second) {
+        qWarning() << "Missing icon:" << iconName << qPrintable(extra);
+    }
 }
 
+}  // namespace
 
-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)
+QIcon get(const std::vector<QString>& iconNames, const QString& fallbackPath)
 {
-    if (this != &other) {
-        QIcon::operator=(other);
+    for (auto&& iconName : iconNames) {
+        // Exact match
+        if (QIcon::hasThemeIcon(iconName)) {
+            return QIcon::fromTheme(iconName);
+        }
     }
-    return *this;
-}
 
+    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
+}  // namespace icon