From 730656863465250e8ed9f277cd5dd1409e9e46ac Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Thu, 28 Aug 2014 14:25:19 -0500 Subject: [PATCH] More fixes to ArdourButton actions. Optionally allow events to fallthrough to parents, in particular for the DnDVBox case. Also allow the number_label to operate as a track selector. --- gtk2_ardour/ardour_button.cc | 17 ++++++++++++----- gtk2_ardour/ardour_button.h | 6 +++++- gtk2_ardour/mixer_strip.cc | 1 + gtk2_ardour/processor_box.cc | 11 +++++++---- gtk2_ardour/route_time_axis.cc | 1 + gtk2_ardour/route_ui.cc | 4 ---- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index 6c7fa32438..7e158b7e9c 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -83,6 +83,7 @@ ArdourButton::ArdourButton (Element e) , _hovering (false) , _focused (false) , _fixed_colors_set (false) + , _fallthrough_to_parent (false) { ARDOUR_UI_UTILS::ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler)); } @@ -660,20 +661,24 @@ ArdourButton::on_button_press_event (GdkEventButton *ev) } } - _grabbed = true; - queue_draw (); - if (binding_proxy.button_press_handler (ev)) { return true; } + _grabbed = true; + queue_draw (); + if (!_act_on_release) { if (_action) { _action->activate (); + return true; } } - return true; + if (_fallthrough_to_parent) + return false; + + return false; } bool @@ -690,7 +695,6 @@ ArdourButton::on_button_release_event (GdkEventButton *ev) _grabbed = false; queue_draw (); - if (_hovering) { signal_clicked (); if (_act_on_release) { @@ -700,6 +704,9 @@ ArdourButton::on_button_release_event (GdkEventButton *ev) } } } + + if (_fallthrough_to_parent) + return false; return true; } diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h index bb0cbfed1e..c6e38aff2e 100644 --- a/gtk2_ardour/ardour_button.h +++ b/gtk2_ardour/ardour_button.h @@ -96,7 +96,9 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable void set_image (const Glib::RefPtr&); - void set_fixed_colors (const uint32_t active_color, const uint32_t inactive_color); + void set_fixed_colors (const uint32_t active_color, const uint32_t inactive_color); + + void set_fallthrough_to_parent(bool fall) { _fallthrough_to_parent = fall; } protected: void render (cairo_t *, cairo_rectangle_t *); @@ -154,6 +156,8 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable bool _focused; bool _fixed_colors_set; + bool _fallthrough_to_parent; + void setup_led_rect (); void set_colors (); void color_handler (); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 17d59b8bf5..f6f07009c9 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -284,6 +284,7 @@ MixerStrip::init () number_label.set_name ("tracknumber label"); number_label.set_fixed_colors (0x80808080, 0x80808080); number_label.set_alignment (.5, .5); + number_label.set_fallthrough_to_parent (true); global_vpacker.set_spacing (2); if (!ARDOUR::Profile->get_trx()) { diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index f095896f40..abc88524a8 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -501,6 +501,7 @@ ProcessorEntry::Control::Control (boost::shared_ptr c, string { _slider.set_controllable (c); box.set_padding(0, 0, 4, 4); + _button.set_fallthrough_to_parent(true); if (c->toggled()) { _button.set_text (_name); @@ -1312,6 +1313,12 @@ ProcessorBox::processor_button_press_event (GdkEventButton *ev, ProcessorEntry* ret = true; + } else if (Keyboard::is_context_menu_event (ev)) { + + show_processor_menu (ev->time); + + ret = true; + } else if (processor && ev->button == 1 && selected) { // this is purely informational but necessary for route params UI @@ -1340,10 +1347,6 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev, ProcessorEntry sigc::mem_fun(*this, &ProcessorBox::idle_delete_processor), boost::weak_ptr(processor))); - } else if (Keyboard::is_context_menu_event (ev)) { - - show_processor_menu (ev->time); - } else if (processor && Keyboard::is_button2_event (ev) #ifndef GTKOSX && (Keyboard::no_modifier_keys_pressed (ev) && ((ev->state & Gdk::BUTTON2_MASK) == Gdk::BUTTON2_MASK)) diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index b31299a3ec..979ab6a0ef 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -110,6 +110,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan { number_label.set_name("route button"); number_label.set_alignment(.5, .5); + number_label.set_fallthrough_to_parent (true); sess->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::parameter_changed, this, _1), gui_context()); } diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 38fd851999..0b0d1a6642 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -772,28 +772,24 @@ RouteUI::update_monitoring_display () bool RouteUI::monitor_input_press(GdkEventButton*) { -printf("RouteUI monitor_input_press\n"); return false; } bool RouteUI::monitor_input_release(GdkEventButton* ev) { -printf("RouteUI monitor_input_release\n"); return monitor_release (ev, MonitorInput); } bool RouteUI::monitor_disk_press (GdkEventButton*) { -printf("RouteUI monitor_disk_press\n"); return false; } bool RouteUI::monitor_disk_release (GdkEventButton* ev) { - printf("RouteUI monitor_disk_release\n"); monitor_release (ev, MonitorDisk); }