void
Editor::paste_internal (framepos_t position, float times)
{
- bool commit = false;
-
DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("apparent paste position is %1\n", position));
if (internal_editing()) {
DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("preferred edit position is %1\n", position));
}
- begin_reversible_command (Operations::paste);
-
TrackViewList ts;
TrackViewList::iterator i;
size_t nth;
ts.push_back (_last_cut_copy_source_track);
}
- for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) {
+ if (internal_editing ()) {
/* undo/redo is handled by individual tracks/regions */
-
- if (internal_editing()) {
-
+
+ for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) {
+
RegionSelection rs;
RegionSelection::iterator r;
MidiNoteSelection::iterator cb;
-
+
get_regions_at (rs, position, ts);
-
+
for (cb = cut_buffer->midi_notes.begin(), r = rs.begin();
cb != cut_buffer->midi_notes.end() && r != rs.end(); ++r) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*r);
++cb;
}
}
+ }
+
+ } else {
- } else {
+ /* we do redo (do you do voodoo?) */
- if ((*i)->paste (position, times, *cut_buffer, nth)) {
- commit = true;
- }
+ begin_reversible_command (Operations::paste);
+
+ for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) {
+ (*i)->paste (position, times, *cut_buffer, nth);
}
- }
-
- if (commit) {
+
commit_reversible_command ();
}
}
}
void
-MidiRegionView::apply_diff ()
+MidiRegionView::apply_diff (bool as_subcommand)
{
bool add_or_remove;
}
}
- _model->apply_command(*trackview.session(), _note_diff_command);
+ if (as_subcommand) {
+ _model->apply_command_as_subcommand (*trackview.session(), _note_diff_command);
+ } else {
+ _model->apply_command (*trackview.session(), _note_diff_command);
+ }
+
_note_diff_command = 0;
midi_view()->midi_track()->playlist_modified();
_marked_for_velocity.clear();
}
-void
-MidiRegionView::apply_diff_as_subcommand ()
-{
- bool add_or_remove;
-
- if (!_note_diff_command) {
- return;
- }
-
- if ((add_or_remove = _note_diff_command->adds_or_removes())) {
- // Mark all selected notes for selection when model reloads
- for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
- _marked_for_selection.insert((*i)->note());
- }
- }
-
- _model->apply_command_as_subcommand(*trackview.session(), _note_diff_command);
- _note_diff_command = 0;
- midi_view()->midi_track()->playlist_modified();
-
- if (add_or_remove) {
- _marked_for_selection.clear();
- }
- _marked_for_velocity.clear();
-}
-
-
void
MidiRegionView::abort_command()
{
return cb;
}
+/** This method handles undo */
void
MidiRegionView::paste (framepos_t pos, float times, const MidiCutBuffer& mcb)
{
DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("MIDI paste @ %1 times %2\n", pos, times));
+ trackview.session()->begin_reversible_command (_("paste"));
+
start_note_diff_command (_("paste"));
Evoral::MusicalTime beat_delta;
DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("Paste extended region from %1 to %2\n", region_end, end_frame));
- trackview.session()->begin_reversible_command (_("paste"));
-
_region->clear_changes ();
_region->set_length (end_frame, this);
trackview.session()->add_command (new StatefulDiffCommand (_region));
}
- apply_diff ();
+ apply_diff (true);
+
+ trackview.session()->commit_reversible_command ();
}
struct EventNoteTimeEarlyFirstComparator {