X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_button.cc;h=3ec9d770d97086198e3553c8e74b368efc9ff41b;hb=c4578db595771b5db9572b23cfe3f9a7ebef66c3;hp=c1626e6aad693c4fcb669d9182354946acc87083;hpb=155b1dc4c88fb9f4fdca40dfca0ffaede1fc0ea4;p=ardour.git diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index c1626e6aad..3ec9d770d9 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -44,7 +44,6 @@ #define BASELINESTRETCH (1.25) #define TRACKHEADERBTNW (3.10) -using namespace Gdk; using namespace Gtk; using namespace Glib; using namespace PBD; @@ -62,6 +61,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) @@ -254,8 +255,10 @@ ArdourButton::set_alignment (const float xa, const float ya) * ARDOUR_UI_UTILS::render_vector_icon() */ void -ArdourButton::render (cairo_t* cr, cairo_rectangle_t *) +ArdourButton::render (Cairo::RefPtr const& ctx, cairo_rectangle_t*) { + cairo_t* cr = ctx->cobj(); + uint32_t text_color; uint32_t led_color; @@ -368,14 +371,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(); @@ -614,7 +625,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req) * of text. */ - } else { //if (!_text.empty() || !_sizing_text.empty()) { + } else /*if (!_text.empty() || !_sizing_text.empty()) */ { req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0)); req->width += rint(1.75 * char_pixel_width()); // padding @@ -661,7 +672,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req) req->width += _diameter + 4; } - if (_elements & VectorIcon) { + if (_elements & (VectorIcon | IconRenderCallback)) { assert(!(_elements & Text)); const int wh = std::max (6., std::max (rint (TRACKHEADERBTNW * char_avg_pixel_width()), ceil (char_pixel_height() * BASELINESTRETCH + 1.))); req->width += wh; @@ -967,6 +978,7 @@ ArdourButton::set_related_action (RefPtr act) if (_action) { action_tooltip_changed (); + action_sensitivity_changed (); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (_action); if (tact) { @@ -1097,7 +1109,21 @@ ArdourButton::on_focus_out_event (GdkEventFocus* ev) bool ArdourButton::on_key_release_event (GdkEventKey *ev) { - if (_focused && + if (_act_on_release && _focused && + (ev->keyval == GDK_space || ev->keyval == GDK_Return)) + { + signal_clicked(); + if (_action) { + _action->activate (); + } + return true; + } + return CairoWidget::on_key_release_event (ev); +} + +bool +ArdourButton::on_key_press_event (GdkEventKey *ev) { + if (!_act_on_release && _focused && (ev->keyval == GDK_space || ev->keyval == GDK_Return)) { signal_clicked(); @@ -1118,6 +1144,11 @@ ArdourButton::on_enter_notify_event (GdkEventCrossing* ev) CairoWidget::set_dirty (); } + boost::shared_ptr c (binding_proxy.get_controllable ()); + if (c) { + PBD::Controllable::GUIFocusChanged (boost::weak_ptr (c)); + } + return CairoWidget::on_enter_notify_event (ev); } @@ -1130,6 +1161,10 @@ ArdourButton::on_leave_notify_event (GdkEventCrossing* ev) CairoWidget::set_dirty (); } + if (binding_proxy.get_controllable()) { + PBD::Controllable::GUIFocusChanged (boost::weak_ptr ()); + } + return CairoWidget::on_leave_notify_event (ev); } @@ -1271,7 +1306,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 (); }