From 56047a094cdc1f41b369c6796690cded85e2a2c6 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 30 Mar 2019 01:19:47 +0100 Subject: AutomationRangeDrag tweaks for stacked layer view Use y-pos and height of given TAV *layer* where the drag was initiated. --- gtk2_ardour/editor_drag.cc | 12 +++++++----- gtk2_ardour/editor_drag.h | 5 +++-- gtk2_ardour/editor_mouse.cc | 26 +++++++++++++++++++++----- 3 files changed, 31 insertions(+), 12 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 1b06d32d2e..079e9c81ac 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -6216,6 +6216,7 @@ AutomationRangeDrag::AutomationRangeDrag (Editor* editor, AutomationTimeAxisView : Drag (editor, atv->base_item ()) , _ranges (r) , _y_origin (atv->y_position()) + , _y_height (atv->effective_height()) // or atv->lines()->front()->height() ?! , _nothing_to_drag (false) { DEBUG_TRACE (DEBUG::Drags, "New AutomationRangeDrag\n"); @@ -6223,10 +6224,11 @@ AutomationRangeDrag::AutomationRangeDrag (Editor* editor, AutomationTimeAxisView } /** Make an AutomationRangeDrag for region gain lines or MIDI controller regions */ -AutomationRangeDrag::AutomationRangeDrag (Editor* editor, list const & v, list const & r, double y_origin) +AutomationRangeDrag::AutomationRangeDrag (Editor* editor, list const & v, list const & r, double y_origin, double y_height) : Drag (editor, v.front()->get_canvas_group ()) , _ranges (r) , _y_origin (y_origin) + , _y_height (y_height) , _nothing_to_drag (false) , _integral (false) { @@ -6295,9 +6297,9 @@ AutomationRangeDrag::setup (list > const & lin } double -AutomationRangeDrag::y_fraction (boost::shared_ptr line, double global_y) const +AutomationRangeDrag::y_fraction (double global_y) const { - return 1.0 - ((global_y - _y_origin) / line->height()); + return 1.0 - ((global_y - _y_origin) / _y_height); } double @@ -6442,12 +6444,12 @@ AutomationRangeDrag::motion (GdkEvent*, bool first_move) } for (list::iterator i = _lines.begin(); i != _lines.end(); ++i) { - i->line->start_drag_multiple (i->points, y_fraction (i->line, current_pointer_y()), i->state); + i->line->start_drag_multiple (i->points, y_fraction (current_pointer_y()), i->state); } } for (list::iterator l = _lines.begin(); l != _lines.end(); ++l) { - float const f = y_fraction (l->line, current_pointer_y()); + float const f = y_fraction (current_pointer_y()); /* we are ignoring x position for this drag, so we can just pass in anything */ pair result; uint32_t ignored; diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 1147d82b96..c24ff32dc0 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -1244,7 +1244,7 @@ class AutomationRangeDrag : public Drag { public: AutomationRangeDrag (Editor *, AutomationTimeAxisView *, std::list const &); - AutomationRangeDrag (Editor *, std::list const &, std::list const &, double y_origin); + AutomationRangeDrag (Editor *, std::list const &, std::list const &, double y_origin, double y_height); void start_grab (GdkEvent *, Gdk::Cursor* c = 0); void motion (GdkEvent *, bool); @@ -1257,7 +1257,7 @@ public: private: void setup (std::list > const &); - double y_fraction (boost::shared_ptr, double global_y_position) const; + double y_fraction (double global_y_position) const; double value (boost::shared_ptr list, double x) const; std::list _ranges; @@ -1272,6 +1272,7 @@ private: std::list _lines; double _y_origin; + double _y_height; bool _nothing_to_drag; bool _integral; }; diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 15f74b2491..8f875b88e3 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1138,18 +1138,25 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT /* MIDI CC or similar -- TODO handle multiple? */ list rvl; rvl.push_back (clicked_regionview); - _drags->set (new AutomationRangeDrag (this, rvl, selection->time, clicked_regionview->get_time_axis_view().y_position()), event, _cursors->up_down); + _drags->set (new AutomationRangeDrag (this, rvl, selection->time, + clicked_regionview->get_time_axis_view().y_position(), + clicked_regionview->get_time_axis_view().current_height()), + event, _cursors->up_down); return true; } - /* no shift+drag: only apply to clicked_regionview (if any) */ - if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) { + /* shift+drag: only apply to clicked_regionview (if any) */ + if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) { if (dynamic_cast(clicked_regionview) == 0) { return true; } list rvl; rvl.push_back (clicked_regionview); - _drags->set (new AutomationRangeDrag (this, rvl, selection->time, clicked_regionview->get_time_axis_view().y_position()), event, _cursors->up_down); + // TODO: handle layer_display() == Stacked + _drags->set (new AutomationRangeDrag (this, rvl, selection->time, + clicked_regionview->get_time_axis_view().y_position(), + clicked_regionview->get_time_axis_view().current_height()), + event, _cursors->up_down); return true; } @@ -1180,7 +1187,16 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT } /* region-gain drag */ if (!rvl.empty ()) { - _drags->set (new AutomationRangeDrag (this, rvl, selection->time, tvp.first->y_position()), event, _cursors->up_down); + double y_pos = tvp.first->y_position(); + double height = tvp.first->current_height(); + StreamView* cv = tvp.first->view (); + if (cv->layer_display() == Stacked && cv->layers() > 1) { + height /= cv->layers(); + double yy = event->button.y - _trackview_group->canvas_origin().y; + y_pos += floor ((yy - y_pos) / height) * height; + } + _drags->set (new AutomationRangeDrag (this, rvl, selection->time, y_pos, height), + event, _cursors->up_down); } return true; break; -- cgit v1.2.3