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 "obs/signal.h"
#include "ui/grid.h"
#include "ui/style.h"
#include <string>
@ -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:

View File

@ -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)

View File

@ -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<const Style::Layer::IconSurfaceProvider*>(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<const Style::Layer::IconSurfaceProvider*>(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));

View File

@ -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,