mirror of
https://github.com/aseprite/aseprite.git
synced 2024-10-04 13:59:46 +00:00
Allow overriding the icon part used by icon layers with the icon provided by a widget
This commit is contained in:
parent
1783704a53
commit
5325f56f67
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user