diff options
author | David Robillard <d@drobilla.net> | 2014-12-16 14:37:40 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2014-12-18 20:23:34 -0500 |
commit | a12a065457a10d9be2582f3ad2fcee7178405981 (patch) | |
tree | e616a88d159606ffcd7150cb7e4164022f85d3eb /gtk2_ardour/midi_streamview.cc | |
parent | 026f7bf5b7bd4b28209a2fa9d421a5a73ec29dc4 (diff) |
Fix copy paste of MIDI and track automation.
Diffstat (limited to 'gtk2_ardour/midi_streamview.cc')
-rw-r--r-- | gtk2_ardour/midi_streamview.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index f47091b3a6..5207b7354d 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -654,3 +654,41 @@ MidiStreamView::resume_updates () _canvas_group->redraw (); } + +struct RegionPositionSorter { + bool operator() (RegionView* a, RegionView* b) { + return a->region()->position() < b->region()->position(); + } +}; + +bool +MidiStreamView::paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx) +{ + /* Paste into the first region which starts on or before pos. Only called when + using an internal editing tool. */ + + if (region_views.empty()) { + return false; + } + + region_views.sort (RegionView::PositionOrder()); + + list<RegionView*>::const_iterator prev = region_views.begin (); + + for (list<RegionView*>::const_iterator i = region_views.begin(); i != region_views.end(); ++i) { + if ((*i)->region()->position() > pos) { + break; + } + prev = i; + } + + boost::shared_ptr<Region> r = (*prev)->region (); + + /* If *prev doesn't cover pos, it's no good */ + if (r->position() > pos || ((r->position() + r->length()) < pos)) { + return false; + } + + MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*prev); + return mrv ? mrv->paste(pos, selection, ctx) : false; +} |