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
This commit is contained in:
Carl Hetherington 2012-06-17 16:57:21 +00:00
parent add52f1c0e
commit 95377c141c
5 changed files with 50 additions and 2 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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&> (_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&> (_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();

View File

@ -159,6 +159,8 @@ class Keyboard : public sigc::trackable, PBD::Stateful
}
};
sigc::signal0<void> ShiftReleased;
protected:
static Keyboard* _the_keyboard;

View File

@ -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()) {