diff options
Diffstat (limited to 'src/autogen/applicationstyle.cpp')
-rw-r--r-- | src/autogen/applicationstyle.cpp | 91 |
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)); +} |