diff --git a/src/app/ui/button_set.h b/src/app/ui/button_set.h index 5a15da0aa..baf929654 100644 --- a/src/app/ui/button_set.h +++ b/src/app/ui/button_set.h @@ -12,6 +12,7 @@ #include "app/ui/skin/skin_part.h" #include "obs/signal.h" #include "ui/grid.h" +#include "ui/style.h" #include @@ -19,12 +20,13 @@ namespace app { class ButtonSet : public ui::Grid { public: - class Item : public ui::Widget { + class Item : public ui::Widget, public ui::Style::Layer::IconSurfaceProvider { public: Item(); void setHotColor(gfx::Color color); void setIcon(const skin::SkinPartPtr& icon, bool mono = false); void setMono(const bool mono) { m_mono = mono; } + os::Surface* iconSurface() const override { return m_icon ? m_icon->bitmap(0) : nullptr; } skin::SkinPartPtr icon() const { return m_icon; } ButtonSet* buttonSet(); protected: diff --git a/src/ui/style.h b/src/ui/style.h index 8f3bbc5e5..0eae8e982 100644 --- a/src/ui/style.h +++ b/src/ui/style.h @@ -51,6 +51,11 @@ namespace ui { kCapture = 16 }; + class IconSurfaceProvider { + public: + virtual os::Surface* iconSurface() const = 0; + }; + Layer() : m_type(Type::kNone) , m_flags(0) diff --git a/src/ui/theme.cpp b/src/ui/theme.cpp index 58ef9710f..c730e737b 100644 --- a/src/ui/theme.cpp +++ b/src/ui/theme.cpp @@ -104,6 +104,7 @@ PaintWidgetPartInfo::PaintWidgetPartInfo() styleFlags = 0; text = nullptr; mnemonic = 0; + icon = nullptr; } PaintWidgetPartInfo::PaintWidgetPartInfo(const Widget* widget) @@ -114,6 +115,10 @@ PaintWidgetPartInfo::PaintWidgetPartInfo(const Widget* widget) styleFlags = PaintWidgetPartInfo::getStyleFlagsForWidget(widget); text = &widget->text(); mnemonic = widget->mnemonic(); + icon = nullptr; + if (const Style::Layer::IconSurfaceProvider* iconProvider = dynamic_cast(widget)) { + icon = iconProvider->iconSurface(); + } } // static @@ -202,7 +207,7 @@ void Theme::paintWidgetPart(Graphics* g, (const Style::Layer& layer) { paintLayer(g, style, layer, (info.text ? *info.text: std::string()), - info.mnemonic, rc, outBgColor); + info.mnemonic, info.icon, rc, outBgColor); }); } @@ -319,6 +324,7 @@ void Theme::paintLayer(Graphics* g, const Style::Layer& layer, const std::string& text, const int mnemonic, + os::Surface* providedIcon, gfx::Rect& rc, gfx::Color& bgColor) { @@ -483,7 +489,7 @@ void Theme::paintLayer(Graphics* g, break; case Style::Layer::Type::kIcon: { - os::Surface* icon = layer.icon(); + os::Surface* icon = providedIcon ? providedIcon : layer.icon(); if (icon) { gfx::Size iconSize(icon->width(), icon->height()); gfx::Point pt; @@ -599,7 +605,11 @@ void Theme::measureLayer(const Widget* widget, break; case Style::Layer::Type::kIcon: { - os::Surface* icon = layer.icon(); + const os::Surface* icon = layer.icon(); + if (const Style::Layer::IconSurfaceProvider* iconProvider = dynamic_cast(widget)) { + icon = iconProvider->iconSurface() ? iconProvider->iconSurface() : icon; + } + if (icon) { iconHint.w = std::max(iconHint.w, icon->width()+ABS(layer.offset().x)); iconHint.h = std::max(iconHint.h, icon->height()+ABS(layer.offset().y)); diff --git a/src/ui/theme.h b/src/ui/theme.h index 33773a2a8..46074dfbe 100644 --- a/src/ui/theme.h +++ b/src/ui/theme.h @@ -46,6 +46,7 @@ namespace ui { int styleFlags; // ui::Style::Layer flags const std::string* text; int mnemonic; + os::Surface* icon; PaintWidgetPartInfo(); PaintWidgetPartInfo(const Widget* widget); @@ -148,6 +149,7 @@ namespace ui { const Style::Layer& layer, const std::string& text, const int mnemonic, + os::Surface* icon, gfx::Rect& rc, gfx::Color& bgColor); void measureLayer(const Widget* widget,