summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorAndré Nusser <andre.nusser@googlemail.com>2015-11-26 17:26:43 +0100
committerPaul Davis <paul@linuxaudiosystems.com>2015-12-02 14:59:43 -0500
commit653789424b0c607007499813fd66da91c05462e9 (patch)
treee88ead3f52fcba9462e2b8551813b0e0814191a9 /gtk2_ardour
parentba4db8f6cb30c3bf373a1261da0f9e49a598ccbc (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.cc51
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