summaryrefslogtreecommitdiff
path: root/muse2/muse/undo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/undo.cpp')
-rw-r--r--muse2/muse/undo.cpp32
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);