diff options
Diffstat (limited to 'muse2/muse/undo.cpp')
-rw-r--r-- | muse2/muse/undo.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/muse2/muse/undo.cpp b/muse2/muse/undo.cpp index e7ef611b..37a0f7c1 100644 --- a/muse2/muse/undo.cpp +++ b/muse2/muse/undo.cpp @@ -53,6 +53,7 @@ const char* UndoOp::typeName() static const char* name[] = { "AddTrack", "DeleteTrack", "AddPart", "DeletePart", "ModifyPartTick", "ModifyPartLength", "ModifyPartLengthFrames", "ModifyPartName", "SelectPart", + "MovePartToTrack", "AddEvent", "DeleteEvent", "ModifyEvent", "SelectEvent", "AddTempo", "DeleteTempo", "AddSig", "DeleteSig", @@ -83,6 +84,7 @@ void UndoOp::dump() case ModifyPartLength: case ModifyPartLengthFrames: case ModifyPartName: + case MovePartToTrack: break; case AddEvent: case DeleteEvent: @@ -405,18 +407,21 @@ void Song::revertOperationGroup2(Undo& operations) } break; case UndoOp::AddPart: - { - Part* part = editable_part; - removePart(part); + removePart(editable_part); updateFlags |= SC_PART_REMOVED; editable_part->unchainClone(); - } break; case UndoOp::DeletePart: addPart(editable_part); updateFlags |= SC_PART_INSERTED; editable_part->rechainClone(); break; + case UndoOp::MovePartToTrack: + removePart(editable_part); // remove it from the track it currently lives on. (does not touch the clone chain) + editable_part->setTrack(const_cast<Track*>(i->oldTrack)); + addPart(editable_part); // add it to the track we just set. + updateFlags |= SC_PART_INSERTED | SC_PART_REMOVED; + break; case UndoOp::ModifyPartName: editable_part->setName(i->_oldName); updateFlags |= SC_PART_MODIFIED; @@ -534,6 +539,12 @@ void Song::executeOperationGroup2(Undo& operations) updateFlags |= SC_PART_REMOVED; editable_part->unchainClone(); break; + case UndoOp::MovePartToTrack: + removePart(editable_part); // remove it from the track it currently lives on. (does not touch the clone chain) + editable_part->setTrack(editable_track); + addPart(editable_part); // add it to the track we just set. + updateFlags |= SC_PART_INSERTED | SC_PART_REMOVED; + break; case UndoOp::ModifyPartName: editable_part->setName(i->_newName); updateFlags |= SC_PART_MODIFIED; @@ -659,6 +670,19 @@ UndoOp::UndoOp(UndoType type_, const Part* part_, bool selected_, bool sel_old_) selected_old=sel_old_; } +UndoOp::UndoOp(UndoType type_, const Part* part_, const Track* nTrack, const Track* oTrack) +{ + assert(type_==MovePartToTrack); + assert(part_); + assert(nTrack); + assert(oTrack); + + type=type_; + part = part_; + track=nTrack; + oldTrack=oTrack; +} + UndoOp::UndoOp(UndoType type_, const Event& nev, const Event& oev, const Part* part_, bool doCtrls_, bool doClones_) { assert(type_==ModifyEvent); |