aboutsummaryrefslogtreecommitdiff
path: root/src/autogen/applicationstyle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/autogen/applicationstyle.cpp')
-rw-r--r--src/autogen/applicationstyle.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/autogen/applicationstyle.cpp b/src/autogen/applicationstyle.cpp
new file mode 100644
index 0000000..40c93d3
--- /dev/null
+++ b/src/autogen/applicationstyle.cpp
@@ -0,0 +1,91 @@
+/*
+ * This file is part of smolbote. It's copyrighted by the contributors recorded
+ * in the version control history of the file, available from its original
+ * location: https://neueland.iserlohn-fortress.net/cgit/smolbote
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#include "applicationstyle.h"
+#include "poi_icons.h"
+#include "poi_logos.h"
+#include <QPainter>
+#include <QStyleFactory>
+#include <QSvgRenderer>
+#include <spdlog/spdlog.h>
+
+[[nodiscard]] inline QPixmap render(const auto &data, const QSize size = QSize())
+{
+ QSvgRenderer renderer;
+ renderer.load(QByteArray(data.data(), static_cast<int>(data.size())));
+
+ QPixmap pm(size.isValid() ? size : renderer.defaultSize());
+ pm.fill(Qt::transparent);
+
+ QPainter painter(&pm);
+ renderer.render(&painter, pm.rect());
+
+ return pm;
+}
+
+ApplicationStyle::ApplicationStyle()
+ : QProxyStyle(QStyleFactory::create("fusion"))
+{
+}
+
+QIcon ApplicationStyle::standardIcon(QStyle::StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *w) const
+{
+ using namespace std::literals;
+
+ if(standardPixmap == QStyle::SP_MediaVolume) {
+ auto on = render(icons::get([] { return "volume-3.svg"sv; }));
+ auto off = render(icons::get([] { return "volume.svg"sv; }));
+ QIcon m;
+ m.addPixmap(on, QIcon::Normal, QIcon::On);
+ m.addPixmap(off, QIcon::Normal, QIcon::Off);
+ return m;
+ }
+
+ const auto id = [standardPixmap]() {
+ switch(standardPixmap) {
+ case QStyle::SP_ArrowBack:
+ return "arrow-left.svg"sv;
+ case QStyle::SP_ArrowForward:
+ return "arrow-right.svg"sv;
+ case QStyle::SP_BrowserStop:
+ return "circle-x.svg"sv;
+ case QStyle::SP_BrowserReload:
+ return "refresh.svg"sv;
+ case QStyle::SP_DirHomeIcon:
+ return "home.svg"sv;
+ default:
+ return "__unknown__"sv;
+ }
+ }();
+
+ const auto *const data = std::find_if(icons::entries.begin(), icons::entries.end(), [id](const auto &tuple) -> bool {
+ return std::get<0>(tuple) == id;
+ });
+
+ if(data == icons::entries.end()) {
+ spdlog::error("fixme: getting default fusion icon for StandardPixmap({})", standardPixmap);
+ return QStyleFactory::create("fusion")->standardIcon(standardPixmap, opt, w);
+ }
+
+ const auto d = std::get<1>(*data);
+ return QIcon(render(d));
+}
+
+QIcon ApplicationStyle::applicationIcon()
+{
+ using namespace std::literals;
+ constexpr auto d = logos::get([]{ return "poi.svg"sv; });
+ return QIcon(render(d));
+}
+
+QIcon ApplicationStyle::windowIcon()
+{
+ using namespace std::literals;
+ constexpr auto d = logos::get([]{ return "poi_window.svg"sv; });
+ return QIcon(render(d));
+}