diff options
author | Carl Hetherington <carl@carlh.net> | 2009-08-26 00:06:21 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2009-08-26 00:06:21 +0000 |
commit | 28af0265b5867a4ad9bd35e2d98eadd7f1264693 (patch) | |
tree | 11d63ba1b446de353c4b28f6e822d0549b2f5499 /gtk2_ardour | |
parent | 33328b868dd29bfe80c8b4acc664358f8530bcd5 (diff) |
When a track is in "stacked" mode, allow regions to be moved to different layers by dragging
and dropping. In stacked mode, the relayering by "recently added / moved etc. is higher" setting
is ignored, and regions are put on the layer that they are dropped to, unless:
1. they are dropped so that they overlap another region on the same layer, in which case they
are put on the layer above that one.
2. they are dropped such that they could be put on a lower layer with no audible difference, in
which case they are put on the lower layer.
git-svn-id: svn://localhost/ardour2/branches/3.0@5590 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 28 | ||||
-rw-r--r-- | gtk2_ardour/editor_drag.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/session_option_editor.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/streamview.cc | 5 |
4 files changed, 25 insertions, 12 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 701a0c7940..fcd859e83e 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -726,7 +726,7 @@ RegionMoveDrag::finished (GdkEvent* /*event*/, bool movement_occurred) pair<PlaylistSet::iterator,bool> insert_result, frozen_insert_result; nframes64_t drag_delta; bool changed_tracks, changed_position; - map<RegionView*, RouteTimeAxisView*> final; + map<RegionView*, pair<RouteTimeAxisView*, int> > final; RouteTimeAxisView* source_tv; if (!movement_occurred) { @@ -781,12 +781,13 @@ RegionMoveDrag::finished (GdkEvent* /*event*/, bool movement_occurred) _editor->update_canvas_now (); /* make a list of where each region ended up */ - final = find_time_axis_views (); + final = find_time_axis_views_and_layers (); for (list<RegionView*>::const_iterator i = _views.begin(); i != _views.end(); ) { RegionView* rv = (*i); - RouteTimeAxisView* dest_rtv = final[*i]; + RouteTimeAxisView* dest_rtv = final[*i].first; + layer_t dest_layer = final[*i].second; nframes64_t where; @@ -837,6 +838,10 @@ RegionMoveDrag::finished (GdkEvent* /*event*/, bool movement_occurred) } to_playlist->add_region (new_region, where); + if (dest_rtv->view()->layer_display() == Stacked) { + new_region->set_layer (dest_layer); + new_region->set_pending_explicit_relayer (true); + } c.disconnect (); @@ -861,6 +866,11 @@ RegionMoveDrag::finished (GdkEvent* /*event*/, bool movement_occurred) boost::shared_ptr<Playlist> playlist = dest_rtv->playlist(); + if (dest_rtv->view()->layer_display() == Stacked) { + rv->region()->set_layer (dest_layer); + rv->region()->set_pending_explicit_relayer (true); + } + insert_result = modified_playlists.insert (playlist); if (insert_result.second) { @@ -1214,10 +1224,10 @@ RegionInsertDrag::RegionInsertDrag (Editor* e, boost::shared_ptr<Region> r, Rout _dest_layer = _primary->region()->layer (); } -map<RegionView*, RouteTimeAxisView*> -RegionMotionDrag::find_time_axis_views () +map<RegionView*, pair<RouteTimeAxisView*, int> > +RegionMotionDrag::find_time_axis_views_and_layers () { - map<RegionView*, RouteTimeAxisView*> tav; + map<RegionView*, pair<RouteTimeAxisView*, int> > tav; for (list<RegionView*>::const_iterator i = _views.begin(); i != _views.end(); ++i) { @@ -1227,7 +1237,7 @@ RegionMotionDrag::find_time_axis_views () iy1 += _editor->vertical_adjustment.get_value() - _editor->canvas_timebars_vsize; pair<TimeAxisView*, int> tv = _editor->trackview_by_y_position (iy1); - tav[*i] = dynamic_cast<RouteTimeAxisView*> (tv.first); + tav[*i] = make_pair (dynamic_cast<RouteTimeAxisView*> (tv.first), tv.second); } return tav; @@ -1239,9 +1249,9 @@ RegionInsertDrag::finished (GdkEvent* /*event*/, bool /*movement_occurred*/) { _editor->update_canvas_now (); - map<RegionView*, RouteTimeAxisView*> final = find_time_axis_views (); + map<RegionView*, pair<RouteTimeAxisView*, int> > final = find_time_axis_views_and_layers (); - RouteTimeAxisView* dest_rtv = final[_primary]; + RouteTimeAxisView* dest_rtv = final[_primary].first; _primary->get_canvas_group()->reparent (*dest_rtv->view()->canvas_item()); _primary->get_canvas_group()->property_y() = 0; diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 97e503f0d6..68b2624d11 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -186,7 +186,7 @@ protected: void copy_regions (GdkEvent *); bool y_movement_disallowed (int, int, int, TimeAxisViewSummary const &) const; - std::map<RegionView*, RouteTimeAxisView*> find_time_axis_views (); + std::map<RegionView*, std::pair<RouteTimeAxisView*, int> > find_time_axis_views_and_layers (); double compute_x_delta (GdkEvent const *, nframes64_t *); bool compute_y_delta ( TimeAxisView const *, TimeAxisView*, int32_t, int32_t, TimeAxisViewSummary const &, diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index cbcb3ecb78..edb596c6cc 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -303,7 +303,7 @@ SessionOptionEditor::SessionOptionEditor (Session* s) ComboOption<LayerModel>* lm = new ComboOption<LayerModel> ( "layer-model", - _("Layering model"), + _("Layering model in overlaid mode"), mem_fun (*_session_config, &SessionConfiguration::get_layer_model), mem_fun (*_session_config, &SessionConfiguration::set_layer_model) ); diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index c68985ee77..fbd48ddbf2 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -351,10 +351,12 @@ StreamView::playlist_changed (boost::shared_ptr<Diskstream> ds) /* update layers count and the y positions and heights of our regions */ _layers = ds->playlist()->top_layer() + 1; update_contents_height (); - update_coverage_frames (); + + ds->playlist()->set_explicit_relayering (_layer_display == Stacked); /* draw it */ + redisplay_diskstream (); /* catch changes */ @@ -571,6 +573,7 @@ StreamView::set_layer_display (LayerDisplay d) _layer_display = d; update_contents_height (); update_coverage_frames (); + _trackview.get_diskstream()->playlist()->set_explicit_relayering (_layer_display == Stacked); } void |