Implement icon-render callback in ArdourButton
This commit is contained in:
parent
22d676c7b6
commit
3b8348f009
@ -62,6 +62,8 @@ ArdourButton::ArdourButton (Element e)
|
||||
, _markup (false)
|
||||
, _elements (e)
|
||||
, _icon (Gtkmm2ext::ArdourIcon::NoIcon)
|
||||
, _icon_render_cb (0)
|
||||
, _icon_render_cb_data (0)
|
||||
, _tweaks (Tweaks (0))
|
||||
, _char_pixel_width (0)
|
||||
, _char_pixel_height (0)
|
||||
@ -368,14 +370,22 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
|
||||
gdk_cairo_set_source_pixbuf (cr, _pixbuf->gobj(), x, y);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
else /* VectorIcons are exclusive to Pixbuf Icons */
|
||||
if (_elements & VectorIcon) {
|
||||
else /* VectorIcon, IconRenderCallback are exclusive to Pixbuf Icons */
|
||||
if (_elements & (VectorIcon | IconRenderCallback)) {
|
||||
int vw = get_width();
|
||||
int vh = get_height();
|
||||
if (_elements & Menu) {
|
||||
vw -= _diameter + 4;
|
||||
}
|
||||
if (_elements & VectorIcon) {
|
||||
Gtkmm2ext::ArdourIcon::render (cr, _icon, vw, vh, active_state(), text_color);
|
||||
} else {
|
||||
cairo_save (cr);
|
||||
rounded_function (cr, 0, 0, get_width(), get_height(), corner_radius + 1.5);
|
||||
cairo_clip (cr);
|
||||
_icon_render_cb (cr, vw, vh, text_color, _icon_render_cb_data);
|
||||
cairo_restore (cr);
|
||||
}
|
||||
}
|
||||
|
||||
const int text_margin = char_pixel_width();
|
||||
@ -1271,7 +1281,24 @@ void
|
||||
ArdourButton::set_icon (Gtkmm2ext::ArdourIcon::Icon i)
|
||||
{
|
||||
_icon = i;
|
||||
_elements = (ArdourButton::Element) ((_elements | ArdourButton::VectorIcon) & ~ArdourButton::Text);
|
||||
_icon_render_cb = 0;
|
||||
_icon_render_cb_data = 0;
|
||||
_elements = (ArdourButton::Element) ((_elements | VectorIcon) & ~(ArdourButton::Text | IconRenderCallback));
|
||||
CairoWidget::set_dirty ();
|
||||
}
|
||||
|
||||
void
|
||||
ArdourButton::set_icon (rendercallback_t cb, void* d)
|
||||
{
|
||||
if (!cb) {
|
||||
_elements = (ArdourButton::Element) ((_elements | ArdourButton::Text) & ~(IconRenderCallback | VectorIcon));
|
||||
_icon_render_cb = 0;
|
||||
_icon_render_cb_data = 0;
|
||||
} else {
|
||||
_elements = (ArdourButton::Element) ((_elements | IconRenderCallback) & ~(ArdourButton::Text | VectorIcon));
|
||||
_icon_render_cb = cb;
|
||||
_icon_render_cb_data = d;
|
||||
}
|
||||
CairoWidget::set_dirty ();
|
||||
}
|
||||
|
||||
|
@ -41,9 +41,12 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
|
||||
unused = 0x10,
|
||||
Menu = 0x20,
|
||||
Inactive = 0x40, // no _action is defined AND state is not used
|
||||
VectorIcon = 0x80, // tentative, see commit message
|
||||
VectorIcon = 0x80,
|
||||
IconRenderCallback = 0x100,
|
||||
};
|
||||
|
||||
typedef void (* rendercallback_t) (cairo_t*, int, int, uint32_t, void*);
|
||||
|
||||
static Element default_elements;
|
||||
static Element led_default_elements;
|
||||
static Element just_led_default_elements;
|
||||
@ -75,6 +78,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
|
||||
|
||||
Gtkmm2ext::ArdourIcon::Icon icon() const { return _icon; }
|
||||
void set_icon (Gtkmm2ext::ArdourIcon::Icon);
|
||||
void set_icon (rendercallback_t, void*);
|
||||
|
||||
void set_corner_radius (float);
|
||||
|
||||
@ -147,6 +151,8 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
|
||||
bool _markup;
|
||||
Element _elements;
|
||||
Gtkmm2ext::ArdourIcon::Icon _icon;
|
||||
rendercallback_t _icon_render_cb;
|
||||
void* _icon_render_cb_data;
|
||||
Tweaks _tweaks;
|
||||
BindingProxy binding_proxy;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user