13
0

Implement icon-render callback in ArdourButton

This commit is contained in:
Robin Gareus 2017-02-17 18:26:30 +01:00
parent 22d676c7b6
commit 3b8348f009
2 changed files with 38 additions and 5 deletions

View File

@ -62,6 +62,8 @@ ArdourButton::ArdourButton (Element e)
, _markup (false) , _markup (false)
, _elements (e) , _elements (e)
, _icon (Gtkmm2ext::ArdourIcon::NoIcon) , _icon (Gtkmm2ext::ArdourIcon::NoIcon)
, _icon_render_cb (0)
, _icon_render_cb_data (0)
, _tweaks (Tweaks (0)) , _tweaks (Tweaks (0))
, _char_pixel_width (0) , _char_pixel_width (0)
, _char_pixel_height (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); gdk_cairo_set_source_pixbuf (cr, _pixbuf->gobj(), x, y);
cairo_fill (cr); cairo_fill (cr);
} }
else /* VectorIcons are exclusive to Pixbuf Icons */ else /* VectorIcon, IconRenderCallback are exclusive to Pixbuf Icons */
if (_elements & VectorIcon) { if (_elements & (VectorIcon | IconRenderCallback)) {
int vw = get_width(); int vw = get_width();
int vh = get_height(); int vh = get_height();
if (_elements & Menu) { if (_elements & Menu) {
vw -= _diameter + 4; vw -= _diameter + 4;
} }
if (_elements & VectorIcon) {
Gtkmm2ext::ArdourIcon::render (cr, _icon, vw, vh, active_state(), text_color); 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(); const int text_margin = char_pixel_width();
@ -1271,7 +1281,24 @@ void
ArdourButton::set_icon (Gtkmm2ext::ArdourIcon::Icon i) ArdourButton::set_icon (Gtkmm2ext::ArdourIcon::Icon i)
{ {
_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 (); CairoWidget::set_dirty ();
} }

View File

@ -41,9 +41,12 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
unused = 0x10, unused = 0x10,
Menu = 0x20, Menu = 0x20,
Inactive = 0x40, // no _action is defined AND state is not used 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 default_elements;
static Element led_default_elements; static Element led_default_elements;
static Element just_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; } Gtkmm2ext::ArdourIcon::Icon icon() const { return _icon; }
void set_icon (Gtkmm2ext::ArdourIcon::Icon); void set_icon (Gtkmm2ext::ArdourIcon::Icon);
void set_icon (rendercallback_t, void*);
void set_corner_radius (float); void set_corner_radius (float);
@ -147,6 +151,8 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
bool _markup; bool _markup;
Element _elements; Element _elements;
Gtkmm2ext::ArdourIcon::Icon _icon; Gtkmm2ext::ArdourIcon::Icon _icon;
rendercallback_t _icon_render_cb;
void* _icon_render_cb_data;
Tweaks _tweaks; Tweaks _tweaks;
BindingProxy binding_proxy; BindingProxy binding_proxy;