/* * 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 #include #include #include [[nodiscard]] inline QPixmap render(const auto &data, const QSize size = QSize()) { QSvgRenderer renderer; renderer.load(QByteArray(data.data(), static_cast(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)); }