diff options
author | Robin Gareus <robin@gareus.org> | 2017-02-17 18:26:30 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-02-17 18:58:11 +0100 |
commit | 3b8348f0099134aeded08cc797b2c7a1efb76507 (patch) | |
tree | 10550f2d2b62bdc5d10d6cf1a1b3cfae89837b7e /gtk2_ardour | |
parent | 22d676c7b6141700cb8470128dc75710fa2fba01 (diff) |
Implement icon-render callback in ArdourButton
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ardour_button.cc | 35 | ||||
-rw-r--r-- | gtk2_ardour/ardour_button.h | 8 |
2 files changed, 38 insertions, 5 deletions
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index c1626e6aad..3395486d35 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -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; } - Gtkmm2ext::ArdourIcon::render (cr, _icon, vw, vh, active_state(), text_color); + 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 (); } diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h index a659c1ec85..1ad6306ae1 100644 --- a/gtk2_ardour/ardour_button.h +++ b/gtk2_ardour/ardour_button.h @@ -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; |