diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-08-13 01:57:03 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-08-13 01:57:03 +0000 |
commit | 0178875021916feea05a830325c25e9a7db81d34 (patch) | |
tree | da01be83db51399e179d08814e3fb1e0a3bff183 /gtk2_ardour/midi_region_view.cc | |
parent | 677bb36f5c012ac6d429a1d1fce0a726616160d4 (diff) |
MIDI cut&paste round two (not done yet); a small region trim fix from lincoln s.
git-svn-id: svn://localhost/ardour2/branches/3.0@5517 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 9b9be486a3..7482981b71 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -47,6 +47,7 @@ #include "ghostregion.h" #include "gui_thread.h" #include "keyboard.h" +#include "midi_cut_buffer.h" #include "midi_region_view.h" #include "midi_streamview.h" #include "midi_time_axis.h" @@ -660,7 +661,6 @@ MidiRegionView::~MidiRegionView () } _selection.clear(); - _cut_buffer.clear (); clear_events(); delete _note_group; delete _delta_command; @@ -1669,17 +1669,25 @@ MidiRegionView::cut_copy_clear (Editing::CutCopyOp op) return; } - _cut_buffer.clear (); + PublicEditor& editor (trackview.editor()); + switch (op) { + case Cut: + case Copy: + cerr << "Cut/Copy: get selection as CB\n"; + editor.get_cut_buffer().add (selection_as_cut_buffer()); + break; + default: + break; + } + start_delta_command(); for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { switch (op) { case Copy: - _cut_buffer.push_back (NoteType (*((*i)->note().get()))); break; case Cut: - _cut_buffer.push_back (NoteType (*(*i)->note().get())); command_remove_note (*i); break; case Clear: @@ -1690,3 +1698,33 @@ MidiRegionView::cut_copy_clear (Editing::CutCopyOp op) apply_command(); } +MidiCutBuffer* +MidiRegionView::selection_as_cut_buffer () const +{ + Evoral::Sequence<MidiModel::TimeType>::Notes notes; + + for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { + notes.push_back (boost::shared_ptr<NoteType> (new NoteType (*((*i)->note().get())))); + } + + /* sort them into time order */ + + sort (notes.begin(), notes.end(), Evoral::Sequence<MidiModel::TimeType>::note_time_comparator); + + MidiCutBuffer* cb = new MidiCutBuffer (trackview.session()); + cb->set (notes); + + return cb; +} + +void +MidiRegionView::paste (nframes64_t pos, const MidiCutBuffer& mcb) +{ + MidiModel::DeltaCommand* cmd = _model->new_delta_command("paste"); + for (Evoral::Sequence<MidiModel::TimeType>::Notes::const_iterator i = mcb.notes().begin(); i != mcb.notes().end(); ++i) { + cmd->add (boost::shared_ptr<NoteType> (new NoteType (*((*i).get())))); + } + _model->apply_command(trackview.session(), cmd); + + +} |