summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-02-17 18:26:30 +0100
committerRobin Gareus <robin@gareus.org>2017-02-17 18:58:11 +0100
commit3b8348f0099134aeded08cc797b2c7a1efb76507 (patch)
tree10550f2d2b62bdc5d10d6cf1a1b3cfae89837b7e /gtk2_ardour
parent22d676c7b6141700cb8470128dc75710fa2fba01 (diff)
Implement icon-render callback in ArdourButton
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour_button.cc35
-rw-r--r--gtk2_ardour/ardour_button.h8
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;