summaryrefslogtreecommitdiff
path: root/muse2/muse/undo.cpp
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2012-05-28 14:15:52 +0000
committerFlorian Jung <flo@windfisch.org>2012-05-28 14:15:52 +0000
commitd2a88cfaad5ac385fc3c6212c09ad7fbc38e9454 (patch)
tree387da0b38255003e1a971629ea0de32273ac3d3c /muse2/muse/undo.cpp
parent716f5a5b56a3b7ff59004ef0a1af5f98cb2a691c (diff)
merged with release_2_0
Diffstat (limited to 'muse2/muse/undo.cpp')
-rw-r--r--muse2/muse/undo.cpp542
1 files changed, 118 insertions, 424 deletions
diff --git a/muse2/muse/undo.cpp b/muse2/muse/undo.cpp
index e12fcedc..b81de33d 100644
--- a/muse2/muse/undo.cpp
+++ b/muse2/muse/undo.cpp
@@ -49,7 +49,7 @@ std::list<QString> temporaryWavFiles;
const char* UndoOp::typeName()
{
static const char* name[] = {
- "AddTrack", "DeleteTrack", "ModifyTrack",
+ "AddTrack", "DeleteTrack",
"AddPart", "DeletePart", "ModifyPart",
"AddEvent", "DeleteEvent", "ModifyEvent",
"AddTempo", "DeleteTempo",
@@ -73,10 +73,7 @@ void UndoOp::dump()
switch(type) {
case AddTrack:
case DeleteTrack:
- printf("%d %s\n", trackno, oTrack->name().toLatin1().constData());
- break;
- case ModifyTrack:
- printf("%d <%s>-<%s>\n", trackno, oTrack->name().toLatin1().constData(), nTrack->name().toLatin1().constData());
+ printf("%d %s\n", trackno, track->name().toLatin1().constData());
break;
case AddPart:
case DeletePart:
@@ -124,99 +121,85 @@ void UndoList::clearDelete()
{
if(!empty())
{
- for(iUndo iu = begin(); iu != end(); ++iu)
+ if (this->isUndo)
{
- Undo& u = *iu;
- for(riUndoOp i = u.rbegin(); i != u.rend(); ++i)
+ for(iUndo iu = begin(); iu != end(); ++iu)
{
- switch(i->type)
+ Undo& u = *iu;
+ for(iUndoOp i = u.begin(); i != u.end(); ++i)
{
- case UndoOp::DeleteTrack:
- if(i->oTrack)
- {
- delete i->oTrack;
- iUndo iu2 = iu;
- ++iu2;
- for(; iu2 != end(); ++iu2)
- {
- Undo& u2 = *iu2;
- for(riUndoOp i2 = u2.rbegin(); i2 != u2.rend(); ++i2)
- {
- if(i2->type == UndoOp::DeleteTrack)
- {
- if(i2->oTrack == i->oTrack)
- i2->oTrack = 0;
- }
- }
- }
- }
- break;
- /* case UndoOp::ModifyTrack: DELETETHIS 50
- if(i->oTrack)
- {
- // Prevent delete i->oTrack from crashing.
- switch(i->oTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->oTrack;
- for(int ch = 0; ch < ao->channels(); ++ch)
- ao->setJackPort(ch, 0);
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->oTrack;
- for(int ch = 0; ch < ai->channels(); ++ch)
- ai->setJackPort(ch, 0);
- }
- break;
- default:
- break;
- }
- if(!i->oTrack->isMidiTrack())
- ((AudioTrack*)i->oTrack)->clearEfxList();
- delete i->oTrack;
-
- iUndo iu2 = iu;
- ++iu2;
- for(; iu2 != end(); ++iu2)
- {
- Undo& u2 = *iu2;
- for(riUndoOp i2 = u2.rbegin(); i2 != u2.rend(); ++i2)
- {
- if(i2->type == UndoOp::ModifyTrack)
- {
- if(i2->oTrack == i->oTrack)
- i2->oTrack = 0;
- }
- }
- }
- }
- break; */
-
- //case UndoOp::DeletePart:
- //delete i->oPart;
- // break;
- //case UndoOp::DeleteTempo:
- // break;
- //case UndoOp::DeleteSig:
- // break;
+ switch(i->type)
+ {
+ case UndoOp::DeleteTrack:
+ if(i->track)
+ delete i->track;
+ break;
+
+ case UndoOp::DeletePart:
+ delete i->oPart;
+ break;
+
+ case UndoOp::ModifyPart:
+ delete i->oPart;
+ break;
+
case UndoOp::ModifyMarker:
- if (i->copyMarker)
- delete i->copyMarker;
- break;
- case UndoOp::ModifyTrackName:
- if (i->_oldName)
- delete i->_oldName;
- if (i->_newName)
- delete i->_newName;
- break;
- default:
- break;
+ if (i->copyMarker)
+ delete i->copyMarker;
+ break;
+
+ case UndoOp::ModifyTrackName:
+ if (i->_oldName)
+ delete [] i->_oldName;
+ if (i->_newName)
+ delete [] i->_newName;
+ break;
+
+ default:
+ break;
+ }
}
+ u.clear();
+ }
+ }
+ else
+ {
+ for(riUndo iu = rbegin(); iu != rend(); ++iu)
+ {
+ Undo& u = *iu;
+ for(riUndoOp i = u.rbegin(); i != u.rend(); ++i)
+ {
+ switch(i->type)
+ {
+ case UndoOp::AddTrack:
+ delete i->track;
+ break;
+
+ case UndoOp::AddPart:
+ delete i->oPart;
+ break;
+
+ case UndoOp::ModifyPart:
+ delete i->nPart;
+ break;
+ case UndoOp::ModifyMarker:
+ if (i->realMarker)
+ delete i->realMarker;
+ break;
+
+ case UndoOp::ModifyTrackName:
+ if (i->_oldName)
+ delete [] i->_oldName;
+ if (i->_newName)
+ delete [] i->_newName;
+ break;
+
+ default:
+ break;
+ }
+ }
+ u.clear();
}
- u.clear();
}
}
@@ -261,12 +244,12 @@ void cleanOperationGroup(Undo& group)
iUndoOp op_=op;
op_++;
- if ((op->type==UndoOp::ModifyTrack) || (op->type==UndoOp::DeleteTrack))
+ if (op->type==UndoOp::DeleteTrack)
{
- if (processed_tracks.find(op->oTrack)!=processed_tracks.end())
+ if (processed_tracks.find(op->track)!=processed_tracks.end())
group.erase(op);
else
- processed_tracks.insert(op->oTrack);
+ processed_tracks.insert(op->track);
}
else if ((op->type==UndoOp::ModifyPart) || (op->type==UndoOp::DeletePart))
{
@@ -320,149 +303,15 @@ void Song::doUndo2()
for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) {
switch(i->type) {
case UndoOp::AddTrack:
- removeTrack2(i->oTrack);
+ removeTrack2(i->track);
updateFlags |= SC_TRACK_REMOVED;
break;
case UndoOp::DeleteTrack:
- insertTrack2(i->oTrack, i->trackno);
- chainTrackParts(i->oTrack, true);
+ insertTrack2(i->track, i->trackno);
+ chainTrackParts(i->track, true);
updateFlags |= SC_TRACK_INSERTED;
break;
-/* DELETETHIS 130
- case UndoOp::ModifyTrack:
- {
- //printf("Song::doUndo2 ModifyTrack #1 oTrack %p %s nTrack %p %s\n", i->oTrack, i->oTrack->name().toLatin1().constData(), i->nTrack, i->nTrack->name().toLatin1().constData());
-
- // Unchain the track parts, but don't touch the ref counts.
- unchainTrackParts(i->nTrack, false);
-
- //Track* track = i->nTrack->clone();
- Track* track = i->nTrack->clone(false);
-
- // A Track custom assignment operator was added by Tim.
- *(i->nTrack) = *(i->oTrack);
-
- //printf("Song::doUndo2 ModifyTrack #2 oTrack %p %s nTrack %p %s\n", i->oTrack, i->oTrack->name().toLatin1().constData(), i->nTrack, i->nTrack->name().toLatin1().constData());
-
- // Prevent delete i->oTrack from crashing.
- switch(i->oTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->oTrack;
- for(int ch = 0; ch < ao->channels(); ++ch)
- ao->setJackPort(ch, 0);
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->oTrack;
- for(int ch = 0; ch < ai->channels(); ++ch)
- ai->setJackPort(ch, 0);
- }
- break;
- default:
- break;
- }
- if(!i->oTrack->isMidiTrack())
- ((AudioTrack*)i->oTrack)->clearEfxList();
-
- delete i->oTrack;
- i->oTrack = track;
-
- // Chain the track parts, but don't touch the ref counts.
- chainTrackParts(i->nTrack, false);
-
- //printf("Song::doUndo2 ModifyTrack #3 oTrack %p %s nTrack %p %s\n", i->oTrack, i->oTrack->name().toLatin1().constData(), i->nTrack, i->nTrack->name().toLatin1().constData());
-
- // Connect and register ports.
- switch(i->nTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->nTrack;
- ao->setName(ao->name());
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->nTrack;
- ai->setName(ai->name());
- }
- break;
- default:
- break;
- }
-
- // Update solo states, since the user may have changed soloing on other tracks.
- updateSoloStates();
-
- updateFlags |= SC_TRACK_MODIFIED;
- }
- break;
-*/
-
- /*
- switch(i->nTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->nTrack;
- for(int ch = 0; ch < ao->channels(); ++ch)
- ao->setJackPort(ch, 0);
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->nTrack;
- for(int ch = 0; ch < ai->channels(); ++ch)
- ai->setJackPort(ch, 0);
- }
- break;
- default:
- break;
- }
- if(!i->nTrack->isMidiTrack())
- ((AudioTrack*)i->nTrack)->clearEfxList();
-
- //delete i->oTrack;
- //i->oTrack = track;
-
- // Remove the track. removeTrack2 takes care of unchaining the new track.
- removeTrack2(i->nTrack);
-
- // Connect and register ports.
- switch(i->oTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->oTrack;
- ao->setName(ao->name());
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->oTrack;
- ai->setName(ai->name());
- }
- break;
- default:
- break;
- }
-
- // Insert the old track.
- insertTrack2(i->oTrack, i->trackno);
- // Chain the old track parts. (removeTrack2, above, takes care of unchaining the new track).
- chainTrackParts(i->oTrack, true);
-
- // Update solo states, since the user may have changed soloing on other tracks.
- updateSoloStates();
-
- updateFlags |= SC_TRACK_MODIFIED;
- }
- break;
- */
case UndoOp::SwapTrack:
{
@@ -479,7 +328,6 @@ void Song::doUndo2()
removePart(part);
updateFlags |= SC_PART_REMOVED;
i->oPart->events()->incARef(-1);
- //i->oPart->unchainClone(); DELETETHIS
unchainClone(i->oPart);
}
break;
@@ -487,19 +335,17 @@ void Song::doUndo2()
addPart(i->oPart);
updateFlags |= SC_PART_INSERTED;
i->oPart->events()->incARef(1);
- //i->oPart->chainClone(); DELETETHIS
chainClone(i->oPart);
break;
case UndoOp::ModifyPart:
if(i->doCtrls)
- removePortCtrlEvents(i->oPart, i->doClones);
- changePart(i->oPart, i->nPart);
- i->oPart->events()->incARef(-1);
- i->nPart->events()->incARef(1);
- //i->oPart->replaceClone(i->nPart); DELETETHIS
- replaceClone(i->oPart, i->nPart);
+ removePortCtrlEvents(i->nPart, i->doClones);
+ changePart(i->nPart, i->oPart);
+ i->nPart->events()->incARef(-1);
+ i->oPart->events()->incARef(1);
+ replaceClone(i->nPart, i->oPart);
if(i->doCtrls)
- addPortCtrlEvents(i->nPart, i->doClones);
+ addPortCtrlEvents(i->oPart, i->doClones);
updateFlags |= SC_PART_MODIFIED;
break;
case UndoOp::AddEvent:
@@ -572,145 +418,17 @@ void Song::doRedo2()
for (iUndoOp i = u.begin(); i != u.end(); ++i) {
switch(i->type) {
case UndoOp::AddTrack:
- insertTrack2(i->oTrack, i->trackno);
- chainTrackParts(i->oTrack, true);
+ insertTrack2(i->track, i->trackno);
+ chainTrackParts(i->track, true);
updateFlags |= SC_TRACK_INSERTED;
break;
case UndoOp::DeleteTrack:
- removeTrack2(i->oTrack);
+ removeTrack2(i->track);
updateFlags |= SC_TRACK_REMOVED;
break;
-/* DELETETHIS 130
- case UndoOp::ModifyTrack:
- {
- // Unchain the track parts, but don't touch the ref counts.
- unchainTrackParts(i->nTrack, false);
-
- //Track* track = i->nTrack->clone();
- Track* track = i->nTrack->clone(false);
-
- *(i->nTrack) = *(i->oTrack);
-
- // Prevent delete i->oTrack from crashing.
- switch(i->oTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->oTrack;
- for(int ch = 0; ch < ao->channels(); ++ch)
- ao->setJackPort(ch, 0);
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->oTrack;
- for(int ch = 0; ch < ai->channels(); ++ch)
- ai->setJackPort(ch, 0);
- }
- break;
- default:
- break;
- }
- if(!i->oTrack->isMidiTrack())
- ((AudioTrack*)i->oTrack)->clearEfxList();
-
- delete i->oTrack;
- i->oTrack = track;
-
- // Chain the track parts, but don't touch the ref counts.
- chainTrackParts(i->nTrack, false);
-
- // Connect and register ports.
- switch(i->nTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->nTrack;
- ao->setName(ao->name());
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->nTrack;
- ai->setName(ai->name());
- }
- break;
- default:
- break;
- }
-
- // Update solo states, since the user may have changed soloing on other tracks.
- updateSoloStates();
-
- updateFlags |= SC_TRACK_MODIFIED;
- }
- break;
-*/
-
- /*
- // Prevent delete i->oTrack from crashing.
- switch(i->oTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->oTrack;
- for(int ch = 0; ch < ao->channels(); ++ch)
- ao->setJackPort(ch, 0);
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->oTrack;
- for(int ch = 0; ch < ai->channels(); ++ch)
- ai->setJackPort(ch, 0);
- }
- break;
- default:
- break;
- }
- if(!i->oTrack->isMidiTrack())
- ((AudioTrack*)i->oTrack)->clearEfxList();
-
- //delete i->oTrack;
- //i->oTrack = track;
-
- // Remove the track. removeTrack2 takes care of unchaining the old track.
- removeTrack2(i->oTrack);
- // Connect and register ports.
- switch(i->nTrack->type())
- {
- case Track::AUDIO_OUTPUT:
- {
- AudioOutput* ao = (AudioOutput*)i->nTrack;
- ao->setName(ao->name());
- }
- break;
- case Track::AUDIO_INPUT:
- {
- AudioInput* ai = (AudioInput*)i->nTrack;
- ai->setName(ai->name());
- }
- break;
- default:
- break;
- }
-
- // Insert the new track.
- insertTrack2(i->nTrack, i->trackno);
- // Chain the new track parts. (removeTrack2, above, takes care of unchaining the old track).
- chainTrackParts(i->nTrack, true);
-
- // Update solo states, since the user may have changed soloing on other tracks.
- updateSoloStates();
-
- updateFlags |= SC_TRACK_MODIFIED;
- }
- break;
- */
-
case UndoOp::SwapTrack:
{
Track* track = _tracks[i->a];
@@ -723,26 +441,23 @@ void Song::doRedo2()
addPart(i->oPart);
updateFlags |= SC_PART_INSERTED;
i->oPart->events()->incARef(1);
- //i->oPart->chainClone(); DELETETHIS
chainClone(i->oPart);
break;
case UndoOp::DeletePart:
removePart(i->oPart);
updateFlags |= SC_PART_REMOVED;
i->oPart->events()->incARef(-1);
- //i->oPart->unchainClone(); DELETETHIS
unchainClone(i->oPart);
break;
case UndoOp::ModifyPart:
if(i->doCtrls)
- removePortCtrlEvents(i->nPart, i->doClones);
- changePart(i->nPart, i->oPart);
- i->oPart->events()->incARef(1);
- i->nPart->events()->incARef(-1);
- //i->nPart->replaceClone(i->oPart); DELETETHIS
- replaceClone(i->nPart, i->oPart);
+ removePortCtrlEvents(i->oPart, i->doClones);
+ changePart(i->oPart, i->nPart);
+ i->nPart->events()->incARef(1);
+ i->oPart->events()->incARef(-1);
+ replaceClone(i->oPart, i->nPart);
if(i->doCtrls)
- addPortCtrlEvents(i->oPart, i->doClones);
+ addPortCtrlEvents(i->nPart, i->doClones);
updateFlags |= SC_PART_MODIFIED;
break;
case UndoOp::AddEvent:
@@ -821,19 +536,12 @@ UndoOp::UndoOp(UndoType type_, int a_, int b_, int c_)
c = c_;
}
-UndoOp::UndoOp(UndoType type_, int n, Track* oldTrack, Track* newTrack)
- {
- type = type_;
- trackno = n;
- oTrack = oldTrack;
- nTrack = newTrack;
- }
-UndoOp::UndoOp(UndoType type_, int n, Track* track)
+UndoOp::UndoOp(UndoType type_, int n, Track* track_)
{
type = type_;
trackno = n;
- oTrack = track;
+ track = track_;
}
UndoOp::UndoOp(UndoType type_, Part* part)
@@ -864,8 +572,8 @@ UndoOp::UndoOp(UndoType type_, Event& nev, Part* part_, bool doCtrls_, bool doCl
UndoOp::UndoOp(UndoType type_, Part* oPart_, Part* nPart_, bool doCtrls_, bool doClones_)
{
type = type_;
- oPart = nPart_;
- nPart = oPart_;
+ oPart = oPart_;
+ nPart = nPart_;
doCtrls = doCtrls_;
doClones = doClones_;
}
@@ -879,12 +587,6 @@ UndoOp::UndoOp(UndoType type_, int c, int ctrl_, int ov, int nv)
nVal = nv;
}
-UndoOp::UndoOp(UndoType type_, SigEvent* oevent, SigEvent* nevent)
- {
- type = type_;
- oSignature = oevent;
- nSignature = nevent;
- }
UndoOp::UndoOp(UndoType type_, Marker* copyMarker_, Marker* realMarker_)
{
type = type_;
@@ -901,20 +603,20 @@ UndoOp::UndoOp(UndoType type_, const char* changedFile, const char* changeData,
endframe = endframe_;
}
-UndoOp::UndoOp(UndoOp::UndoType type_, Track* track, const char* old_name, const char* new_name)
+UndoOp::UndoOp(UndoOp::UndoType type_, Track* track_, const char* old_name, const char* new_name)
{
type = type_;
- _renamedTrack = track;
+ _renamedTrack = track_;
_oldName = new char[strlen(old_name) + 1];
_newName = new char[strlen(new_name) + 1];
strcpy(_oldName, old_name);
strcpy(_newName, new_name);
}
-UndoOp::UndoOp(UndoOp::UndoType type_, Track* track, int old_chan, int new_chan)
+UndoOp::UndoOp(UndoOp::UndoType type_, Track* track_, int old_chan, int new_chan)
{
type = type_;
- _propertyTrack = track;
+ _propertyTrack = track_;
_oldPropValue = old_chan;
_newPropValue = new_chan;
}
@@ -953,24 +655,24 @@ bool Song::doUndo1()
for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) {
switch(i->type) {
case UndoOp::AddTrack:
- removeTrack1(i->oTrack);
+ removeTrack1(i->track);
break;
case UndoOp::DeleteTrack:
- insertTrack1(i->oTrack, i->trackno);
+ insertTrack1(i->track, i->trackno);
// FIXME: Would like to put this part in Undo2, but indications
// elsewhere are that (dis)connecting jack routes must not be
// done in the realtime thread. The result is that we get a few
// "PANIC Process init: No buffer from audio device" messages
// before the routes are (dis)connected. So far seems to do no harm though...
- switch(i->oTrack->type())
+ switch(i->track->type())
{
case Track::AUDIO_OUTPUT:
case Track::AUDIO_INPUT:
- connectJackRoutes((AudioTrack*)i->oTrack, false);
+ connectJackRoutes((AudioTrack*)i->track, false);
break;
//case Track::AUDIO_SOFTSYNTH: DELETETHIS 4
- //SynthI* si = (SynthI*)i->oTrack;
+ //SynthI* si = (SynthI*)i->track;
//si->synth()->init(
// break;
default:
@@ -1039,15 +741,11 @@ void Song::doUndo3()
for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) {
switch(i->type) {
case UndoOp::AddTrack:
- removeTrack3(i->oTrack);
+ removeTrack3(i->track);
break;
case UndoOp::DeleteTrack:
- insertTrack3(i->oTrack, i->trackno);
+ insertTrack3(i->track, i->trackno);
break;
- case UndoOp::ModifyTrack:
- // Not much choice but to do this - Tim. DELETETHIS 2
- //clearClipboardAndCloneList();
- break;
case UndoOp::ModifyMarker:
{
if (i->realMarker) {
@@ -1085,17 +783,17 @@ bool Song::doRedo1()
for (iUndoOp i = u.begin(); i != u.end(); ++i) {
switch(i->type) {
case UndoOp::AddTrack:
- insertTrack1(i->oTrack, i->trackno);
+ insertTrack1(i->track, i->trackno);
// FIXME: See comments in Undo1.
- switch(i->oTrack->type())
+ switch(i->track->type())
{
case Track::AUDIO_OUTPUT:
case Track::AUDIO_INPUT:
- connectJackRoutes((AudioTrack*)i->oTrack, false);
+ connectJackRoutes((AudioTrack*)i->track, false);
break;
//case Track::AUDIO_SOFTSYNTH: DELETETHIS 4
- //SynthI* si = (SynthI*)i->oTrack;
+ //SynthI* si = (SynthI*)i->track;
//si->synth()->init(
// break;
default:
@@ -1104,7 +802,7 @@ bool Song::doRedo1()
break;
case UndoOp::DeleteTrack:
- removeTrack1(i->oTrack);
+ removeTrack1(i->track);
break;
case UndoOp::ModifyTrackName:
i->_renamedTrack->setName(i->_newName);
@@ -1167,15 +865,11 @@ void Song::doRedo3()
for (iUndoOp i = u.begin(); i != u.end(); ++i) {
switch(i->type) {
case UndoOp::AddTrack:
- insertTrack3(i->oTrack, i->trackno);
+ insertTrack3(i->track, i->trackno);
break;
case UndoOp::DeleteTrack:
- removeTrack3(i->oTrack);
+ removeTrack3(i->track);
break;
- case UndoOp::ModifyTrack:
- // Not much choice but to do this - Tim. DELETETHIS 2
- //clearClipboardAndCloneList();
- break;
case UndoOp::ModifyMarker:
{
if (i->copyMarker) {