From 95377c141c404c959797028b737ca747c1bccadb Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 17 Jun 2012 16:57:21 +0000 Subject: [PATCH] Hacky fix for track height step losing 'grip' on the track being resized (#4503). git-svn-id: svn://localhost/ardour2/branches/3.0@12747 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.cc | 8 ++++++++ gtk2_ardour/editor.h | 19 +++++++++++++++++++ gtk2_ardour/time_axis_view.cc | 15 +++++++++++++-- libs/gtkmm2ext/gtkmm2ext/keyboard.h | 2 ++ libs/gtkmm2ext/keyboard.cc | 8 ++++++++ 5 files changed, 50 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 939c05b1e8..e3e00cf340 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -282,6 +282,7 @@ Editor::Editor () , _region_selection_change_updates_region_list (true) , _following_mixer_selection (false) , _control_point_toggled_on_press (false) + , _stepping_axis_view (0) { constructed = false; @@ -696,6 +697,8 @@ Editor::Editor () signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close)); + Gtkmm2ext::Keyboard::the_keyboard().ShiftReleased.connect (sigc::mem_fun (*this, &Editor::shift_key_released)); + /* allow external control surfaces/protocols to do various things */ ControlProtocol::ZoomToSession.connect (*this, invalidator (*this), boost::bind (&Editor::temporal_zoom_session, this), gui_context()); @@ -5473,3 +5476,8 @@ Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* ev _control_point_context_menu.popup (event->button.button, event->button.time); } +void +Editor::shift_key_released () +{ + _stepping_axis_view = 0; +} diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 5134b6a7a1..a2d7c93fd3 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -470,6 +470,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void get_pointer_position (double &, double &) const; + TimeAxisView* stepping_axis_view () { + return _stepping_axis_view; + } + + void set_stepping_axis_view (TimeAxisView* v) { + _stepping_axis_view = v; + } + protected: void map_transport_state (); void map_position_change (framepos_t); @@ -2102,6 +2110,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */ bool _control_point_toggled_on_press; + /** This is used by TimeAxisView to keep a track of the TimeAxisView that is currently being + stepped in height using Shift-Scrollwheel. When a scroll event occurs, we do the step on + this _stepping_axis_view if it is non-0 (and we set up this _stepping_axis_view with the + TimeAxisView underneath the mouse if it is 0). Then Editor resets _stepping_axis_view when + the shift key is released. In this (hacky) way, pushing shift and moving the scroll wheel + will operate on the same track until shift is released (rather than skipping about to whatever + happens to be underneath the mouse at the time). + */ + TimeAxisView* _stepping_axis_view; + void shift_key_released (); + friend class Drag; friend class RegionDrag; friend class RegionMoveDrag; diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index ddf03e968e..ee5c7c1c2a 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -48,6 +48,7 @@ #include "utils.h" #include "streamview.h" #include "editor_drag.h" +#include "editor.h" #include "i18n.h" @@ -317,7 +318,12 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev) switch (ev->direction) { case GDK_SCROLL_UP: if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { - step_height (false); + /* See Editor::_stepping_axis_view for notes on this hack */ + Editor& e = dynamic_cast (_editor); + if (!e.stepping_axis_view ()) { + e.set_stepping_axis_view (this); + } + e.stepping_axis_view()->step_height (false); return true; } else if (Keyboard::no_modifiers_active (ev->state)) { _editor.scroll_tracks_up_line(); @@ -327,7 +333,12 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev) case GDK_SCROLL_DOWN: if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { - step_height (true); + /* See Editor::_stepping_axis_view for notes on this hack */ + Editor& e = dynamic_cast (_editor); + if (!e.stepping_axis_view ()) { + e.set_stepping_axis_view (this); + } + e.stepping_axis_view()->step_height (true); return true; } else if (Keyboard::no_modifiers_active (ev->state)) { _editor.scroll_tracks_down_line(); diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h index 3287cdb37e..909f791403 100644 --- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h +++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h @@ -159,6 +159,8 @@ class Keyboard : public sigc::trackable, PBD::Stateful } }; + sigc::signal0 ShiftReleased; + protected: static Keyboard* _the_keyboard; diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc index 6328eb977c..81b9ae642a 100644 --- a/libs/gtkmm2ext/keyboard.cc +++ b/libs/gtkmm2ext/keyboard.cc @@ -243,6 +243,14 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event) keyval = event->keyval; } + if (keyval == GDK_Shift_L) { + /* There is a special and rather hacky situation in Editor which makes + it useful to know when a shift key has been released, so emit a signal + here (see Editor::_stepping_axis_view) + */ + ShiftReleased (); /* EMIT SIGNAL */ + } + if (event->type == GDK_KEY_PRESS) { if (find (state.begin(), state.end(), keyval) == state.end()) {