diff options
author | Florian Jung <flo@windfisch.org> | 2012-05-28 14:15:52 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2012-05-28 14:15:52 +0000 |
commit | d2a88cfaad5ac385fc3c6212c09ad7fbc38e9454 (patch) | |
tree | 387da0b38255003e1a971629ea0de32273ac3d3c /muse2/muse/undo.cpp | |
parent | 716f5a5b56a3b7ff59004ef0a1af5f98cb2a691c (diff) |
merged with release_2_0
Diffstat (limited to 'muse2/muse/undo.cpp')
-rw-r--r-- | muse2/muse/undo.cpp | 542 |
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) { |