diff options
author | André Nusser <andre.nusser@googlemail.com> | 2015-11-26 17:26:43 +0100 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2015-12-02 14:59:43 -0500 |
commit | 653789424b0c607007499813fd66da91c05462e9 (patch) | |
tree | e88ead3f52fcba9462e2b8551813b0e0814191a9 /gtk2_ardour | |
parent | ba4db8f6cb30c3bf373a1261da0f9e49a598ccbc (diff) |
Fix "Fill Track".
It now behaves like Multi-Duplicate until the end marker. The end
marker is excluded as this would often lead to size 1 regions.
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 51 |
1 files changed, 22 insertions, 29 deletions
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index ed364367bc..4e22c572e5 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -3306,56 +3306,49 @@ Editor::crop_region_to (framepos_t start, framepos_t end) void Editor::region_fill_track () { - RegionSelection rs = get_regions_from_selection_and_entered (); - - if (!_session || rs.empty()) { - return; - } + boost::shared_ptr<Playlist> playlist; + RegionSelection regions = get_regions_from_selection_and_entered (); + RegionSelection foo; framepos_t const end = _session->current_end_frame (); - RegionSelection foo; - bool in_command = false; - for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + if (regions.empty () || regions.end_frame () + 1 >= end) { + return; + } - boost::shared_ptr<Region> region ((*i)->region()); + framepos_t const start_frame = regions.start (); + framepos_t const end_frame = regions.end_frame (); + framecnt_t const gap = end_frame - start_frame + 1; - boost::shared_ptr<Playlist> pl = region->playlist(); + begin_reversible_command (Operations::region_fill); - if (end <= region->last_frame()) { - continue; - } + selection->clear_regions (); - double times = (double) (end - region->last_frame()) / (double) region->length(); + for (RegionSelection::iterator i = regions.begin(); i != regions.end(); ++i) { - if (times == 0) { - continue; - } + boost::shared_ptr<Region> r ((*i)->region()); - if (!in_command) { - begin_reversible_command (Operations::region_fill); - in_command = true; - } TimeAxisView& tv = (*i)->get_time_axis_view(); RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (&tv); latest_regionviews.clear (); sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view)); - pl->clear_changes (); - pl->add_region (RegionFactory::create (region, true), region->last_frame(), times); - _session->add_command (new StatefulDiffCommand (pl)); + framepos_t const position = end_frame + (r->first_frame() - start_frame + 1); + playlist = (*i)->region()->playlist(); + playlist->clear_changes (); + playlist->duplicate_until (r, position, gap, end); + _session->add_command(new StatefulDiffCommand (playlist)); c.disconnect (); foo.insert (foo.end(), latest_regionviews.begin(), latest_regionviews.end()); } - if (in_command) { - if (!foo.empty()) { - selection->set (foo); - } - commit_reversible_command (); + if (!foo.empty()) { + selection->set (foo); } + + commit_reversible_command (); } void |