diff options
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; +} |