Allow overriding the icon part used by icon layers with the icon provided by a widget

This commit is contained in:
Martín Capello 2022-12-07 15:57:41 -03:00 committed by David Capello
parent 1783704a53
commit 5325f56f67
4 changed files with 23 additions and 4 deletions

View File

@ -12,6 +12,7 @@
#include "app/ui/skin/skin_part.h" #include "app/ui/skin/skin_part.h"
#include "obs/signal.h" #include "obs/signal.h"
#include "ui/grid.h" #include "ui/grid.h"
#include "ui/style.h"
#include <string> #include <string>
@ -19,12 +20,13 @@ namespace app {
class ButtonSet : public ui::Grid { class ButtonSet : public ui::Grid {
public: public:
class Item : public ui::Widget { class Item : public ui::Widget, public ui::Style::Layer::IconSurfaceProvider {
public: public:
Item(); Item();
void setHotColor(gfx::Color color); void setHotColor(gfx::Color color);
void setIcon(const skin::SkinPartPtr& icon, bool mono = false); void setIcon(const skin::SkinPartPtr& icon, bool mono = false);
void setMono(const bool mono) { m_mono = mono; } 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; } skin::SkinPartPtr icon() const { return m_icon; }
ButtonSet* buttonSet(); ButtonSet* buttonSet();
protected: protected:

View File

@ -51,6 +51,11 @@ namespace ui {
kCapture = 16 kCapture = 16
}; };
class IconSurfaceProvider {
public:
virtual os::Surface* iconSurface() const = 0;
};
Layer() Layer()
: m_type(Type::kNone) : m_type(Type::kNone)
, m_flags(0) , m_flags(0)

View File

@ -104,6 +104,7 @@ PaintWidgetPartInfo::PaintWidgetPartInfo()
styleFlags = 0; styleFlags = 0;
text = nullptr; text = nullptr;
mnemonic = 0; mnemonic = 0;
icon = nullptr;
} }
PaintWidgetPartInfo::PaintWidgetPartInfo(const Widget* widget) PaintWidgetPartInfo::PaintWidgetPartInfo(const Widget* widget)
@ -114,6 +115,10 @@ PaintWidgetPartInfo::PaintWidgetPartInfo(const Widget* widget)
styleFlags = PaintWidgetPartInfo::getStyleFlagsForWidget(widget); styleFlags = PaintWidgetPartInfo::getStyleFlagsForWidget(widget);
text = &widget->text(); text = &widget->text();
mnemonic = widget->mnemonic(); mnemonic = widget->mnemonic();
icon = nullptr;
if (const Style::Layer::IconSurfaceProvider* iconProvider = dynamic_cast<const Style::Layer::IconSurfaceProvider*>(widget)) {
icon = iconProvider->iconSurface();
}
} }
// static // static
@ -202,7 +207,7 @@ void Theme::paintWidgetPart(Graphics* g,
(const Style::Layer& layer) { (const Style::Layer& layer) {
paintLayer(g, style, layer, paintLayer(g, style, layer,
(info.text ? *info.text: std::string()), (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 Style::Layer& layer,
const std::string& text, const std::string& text,
const int mnemonic, const int mnemonic,
os::Surface* providedIcon,
gfx::Rect& rc, gfx::Rect& rc,
gfx::Color& bgColor) gfx::Color& bgColor)
{ {
@ -483,7 +489,7 @@ void Theme::paintLayer(Graphics* g,
break; break;
case Style::Layer::Type::kIcon: { case Style::Layer::Type::kIcon: {
os::Surface* icon = layer.icon(); os::Surface* icon = providedIcon ? providedIcon : layer.icon();
if (icon) { if (icon) {
gfx::Size iconSize(icon->width(), icon->height()); gfx::Size iconSize(icon->width(), icon->height());
gfx::Point pt; gfx::Point pt;
@ -599,7 +605,11 @@ void Theme::measureLayer(const Widget* widget,
break; break;
case Style::Layer::Type::kIcon: { case Style::Layer::Type::kIcon: {
os::Surface* icon = layer.icon(); const os::Surface* icon = layer.icon();
if (const Style::Layer::IconSurfaceProvider* iconProvider = dynamic_cast<const Style::Layer::IconSurfaceProvider*>(widget)) {
icon = iconProvider->iconSurface() ? iconProvider->iconSurface() : icon;
}
if (icon) { if (icon) {
iconHint.w = std::max(iconHint.w, icon->width()+ABS(layer.offset().x)); iconHint.w = std::max(iconHint.w, icon->width()+ABS(layer.offset().x));
iconHint.h = std::max(iconHint.h, icon->height()+ABS(layer.offset().y)); iconHint.h = std::max(iconHint.h, icon->height()+ABS(layer.offset().y));

View File

@ -46,6 +46,7 @@ namespace ui {
int styleFlags; // ui::Style::Layer flags int styleFlags; // ui::Style::Layer flags
const std::string* text; const std::string* text;
int mnemonic; int mnemonic;
os::Surface* icon;
PaintWidgetPartInfo(); PaintWidgetPartInfo();
PaintWidgetPartInfo(const Widget* widget); PaintWidgetPartInfo(const Widget* widget);
@ -148,6 +149,7 @@ namespace ui {
const Style::Layer& layer, const Style::Layer& layer,
const std::string& text, const std::string& text,
const int mnemonic, const int mnemonic,
os::Surface* icon,
gfx::Rect& rc, gfx::Rect& rc,
gfx::Color& bgColor); gfx::Color& bgColor);
void measureLayer(const Widget* widget, void measureLayer(const Widget* widget,