diff options
| author | Florian Jung <flo@windfisch.org> | 2013-08-22 16:46:23 +0200 | 
|---|---|---|
| committer | Florian Jung <flo@windfisch.org> | 2013-08-22 16:46:23 +0200 | 
| commit | c1d220283956a50c60678e6703c919b13ed7403f (patch) | |
| tree | 925b84a56610a54d4e610002c03ccf2f3e891a0d /muse2/muse | |
| parent | 31e77a058e391d11323d0289d0003b86865a5e7f (diff) | |
MidiTransform now uses operation groups
Diffstat (limited to 'muse2/muse')
| -rw-r--r-- | muse2/muse/miditransform.cpp | 97 | ||||
| -rw-r--r-- | muse2/muse/miditransform.h | 5 | ||||
| -rw-r--r-- | muse2/muse/song.cpp | 2 | 
3 files changed, 27 insertions, 77 deletions
| diff --git a/muse2/muse/miditransform.cpp b/muse2/muse/miditransform.cpp index 75e6f4f7..3f0f9235 100644 --- a/muse2/muse/miditransform.cpp +++ b/muse2/muse/miditransform.cpp @@ -41,6 +41,9 @@  #include "gconfig.h"  #include "midictrl.h" +using MusECore::Undo; +using MusECore::UndoOp; +  namespace MusECore {  // @@ -483,8 +486,7 @@ void MidiTransformerDialog::accept()  //    subfunction of processEvent()  //--------------------------------------------------------- -void MidiTransformerDialog::transformEvent(MusECore::Event& event, MusECore::MidiPart* part, -  MusECore::MidiPart* newPart) +void MidiTransformerDialog::transformEvent(MusECore::Event& event, MusECore::MidiPart* part, MusECore::MidiPart* newPart, MusECore::Undo& operations)        {        MusECore::MidiTransformation* cmt = data->cmt;        MusECore::Event newEvent = event.clone(); @@ -670,33 +672,16 @@ void MidiTransformerDialog::transformEvent(MusECore::Event& event, MusECore::Mid              pos = 0;        newEvent.setTick(pos); -      MusECore::Event dummy;        switch(data->cmt->funcOp) {              case MusECore::Transform: -                  // Indicate do clone parts.  -                  removePortCtrlEvents(event, part, true); -                  MusEGlobal::song->changeEvent(event, newEvent, part); -                  // Indicate do clone parts.  -                  addPortCtrlEvents(newEvent, part, true); -                  // Indicate do port controller values and clone parts.  -                  MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::ModifyEvent, newEvent, event, part, true, true)); -                  MusEGlobal::song->addUpdateFlags(SC_EVENT_MODIFIED); +                  operations.push_back(UndoOp(UndoOp::ModifyEvent, newEvent, event, part, true, true));                    break;              case MusECore::Insert:                    // Indicate do port controller values and clone parts.  -                  MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::AddEvent, dummy, newEvent, part, true, true)); -                  MusEGlobal::song->addEvent(newEvent, part); -                  // Indicate do clone parts.  -                  addPortCtrlEvents(newEvent, part, true); -                  MusEGlobal::song->addUpdateFlags(SC_EVENT_INSERTED); +                  operations.push_back(UndoOp(UndoOp::AddEvent, newEvent, part, true, true));                    break;              case MusECore::Extract: -                  // Indicate do port controller values and clone parts.  -                  MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::DeleteEvent, dummy, event, part, true, true)); -                  // Indicate do clone parts.  -                  removePortCtrlEvents(event, part, true); -                  MusEGlobal::song->deleteEvent(event, part); -                  MusEGlobal::song->addUpdateFlags(SC_EVENT_REMOVED); +                  operations.push_back(UndoOp(UndoOp::DeleteEvent, event, part, true, true));              case MusECore::Copy:                    newPart->addEvent(newEvent);                    break; @@ -709,7 +694,7 @@ void MidiTransformerDialog::transformEvent(MusECore::Event& event, MusECore::Mid  //   processEvent  //--------------------------------------------------------- -void MidiTransformerDialog::processEvent(MusECore::Event& event, MusECore::MidiPart* part, MusECore::MidiPart* newPart) +void MidiTransformerDialog::processEvent(MusECore::Event& event, MusECore::MidiPart* part, MusECore::MidiPart* newPart, MusECore::Undo& operations)        {        switch(data->cmt->funcOp) {              case MusECore::Select: @@ -719,35 +704,22 @@ void MidiTransformerDialog::processEvent(MusECore::Event& event, MusECore::MidiP                    int tick = event.tick();                    int rt = AL::sigmap.raster(tick, data->cmt->quantVal) - tick;                    if (tick != rt) { -                        // Indicate do clone parts.  -                        removePortCtrlEvents(event, part, true);                          MusECore::Event newEvent = event.clone();                          newEvent.setTick(rt); -                        MusEGlobal::song->changeEvent(event, newEvent, part); -                        // Indicate do clone parts.  -                        addPortCtrlEvents(newEvent, part, true); -                        // Indicate do port controller values and clone parts.  -                        MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::ModifyEvent, newEvent, event, part, true, true)); -                        MusEGlobal::song->addUpdateFlags(SC_EVENT_MODIFIED); +						operations.push_back(UndoOp(UndoOp::ModifyEvent,newEvent,event,part,true,true));                          }                    }                    break;              case MusECore::Delete:                    { -                  MusECore::Event ev; -                  // Indicate do port controller values and clone parts.  -                  MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::DeleteEvent, ev, event, part, true, true)); -                  // Indicate do clone parts.  -                  removePortCtrlEvents(event, part, true); -                  MusEGlobal::song->deleteEvent(event, part); -                  MusEGlobal::song->addUpdateFlags(SC_EVENT_REMOVED); +                  operations.push_back(UndoOp(UndoOp::DeleteEvent, event, part, true, true));                    }                    break;              case MusECore::Transform:              case MusECore::Insert:              case MusECore::Copy:              case MusECore::Extract: -                  transformEvent(event, part, newPart); +                  transformEvent(event, part, newPart, operations);                    break;              }        } @@ -921,8 +893,8 @@ bool MidiTransformerDialog::isSelected(const MusECore::Event& event)  void MidiTransformerDialog::apply()        {        MusECore::SongChangedFlags_t flags = 0; -      MusEGlobal::song->startUndo(); -      MusEGlobal::audio->msgIdle(true); +	   +	  Undo operations;        bool copyExtract = (data->cmt->funcOp == MusECore::Copy)                           || (data->cmt->funcOp == MusECore::Extract); @@ -944,7 +916,7 @@ void MidiTransformerDialog::apply()                          const MusECore::EventList& el = part->events();                          // Check if the event list has already been done. Skip repeated clones.                          if (doneList.contains(part->clonemaster_sn())) -                          break; +                             continue;                          doneList.insert(part->clonemaster_sn());                          for (MusECore::ciEvent i = el.begin(); i != el.end(); ++i) { @@ -969,7 +941,7 @@ void MidiTransformerDialog::apply()                    const MusECore::EventList& el = part->events();                    // Check if the event list has already been done. Skip repeated clones.                    if (doneList.contains(part->clonemaster_sn())) -                      break; +                      continue;                    doneList.insert(part->clonemaster_sn());                    if (copyExtract) { @@ -985,7 +957,7 @@ void MidiTransformerDialog::apply()                                      newPart->setColorIndex(part->colorIndex());                                      newPart->setTick(part->tick());                                      newPart->setLenTick(part->lenTick()); -                                    MusEGlobal::song->addPart(newPart); +                                    operations.push_back(UndoOp(UndoOp::AddPart,newPart));                                      flags |= SC_PART_INSERTED;                                      break;                                      } @@ -999,46 +971,23 @@ void MidiTransformerDialog::apply()                                continue;                          int flag = isSelected(event);                          if (data->cmt->funcOp == MusECore::Select) -                              event.setSelected(flag); +                              operations.push_back(UndoOp(UndoOp::SelectEvent, event,flag, event.selected()));                          else if (flag) -                              pel.add(event); +                              pel.add(const_cast<MusECore::Event&>(event)); // ough, FIXME, what an ugly hack.                          }                    for (MusECore::iEvent i = pel.begin(); i != pel.end(); ++i) {                          MusECore::Event event = i->second; -                        processEvent(event, part, newPart); +                        processEvent(event, part, newPart, operations);                          }                    }              }        if (!tl.empty()) {              flags |= SC_TRACK_INSERTED; -            for (MusECore::iTrack t = tl.begin(); t != tl.end(); ++t) { -                  MusEGlobal::song->insertTrack0(*t, -1); -                  } -            } +            for (MusECore::iTrack t = tl.begin(); t != tl.end(); ++t) +                  operations.push_back(UndoOp(UndoOp::AddTrack, -1, *t)); +      } -      switch(data->cmt->funcOp) { -            case MusECore::Select: -                  flags |= SC_SELECTION; -                  break; -            case MusECore::Quantize: -                  flags |= SC_EVENT_MODIFIED; -                  break; -            case MusECore::Delete: -                  flags |= SC_EVENT_REMOVED; -                  break; -            case MusECore::Transform: -                  flags |= SC_EVENT_MODIFIED; -                  break; -            case MusECore::Insert: -                  flags |= SC_EVENT_INSERTED; -                  break; -            case MusECore::Copy: -                  flags |= SC_EVENT_INSERTED; -            case MusECore::Extract: -                  break; -            } -      MusEGlobal::audio->msgIdle(false); -      MusEGlobal::song->endUndo(flags); +      MusEGlobal::song->applyOperationGroup(operations);        }  //--------------------------------------------------------- diff --git a/muse2/muse/miditransform.h b/muse2/muse/miditransform.h index 997c144d..626c83c5 100644 --- a/muse2/muse/miditransform.h +++ b/muse2/muse/miditransform.h @@ -32,6 +32,7 @@ class QDialog;  namespace MusECore { +class Undo;  class Event;  class MidiPart;  class MidiTransformation; @@ -70,9 +71,9 @@ class MidiTransformerDialog : public QDialog, public Ui::MidiTransformDialogBase        virtual void accept();        void setValOp(QWidget* a, QWidget* b, MusECore::ValOp op); -      void processEvent(MusECore::Event&, MusECore::MidiPart*, MusECore::MidiPart*); +      void processEvent(MusECore::Event&, MusECore::MidiPart*, MusECore::MidiPart*, MusECore::Undo& operations);        bool isSelected(const MusECore::Event&); -      void transformEvent(MusECore::Event&, MusECore::MidiPart*, MusECore::MidiPart*); +      void transformEvent(MusECore::Event&, MusECore::MidiPart*, MusECore::MidiPart*, MusECore::Undo& operations);        bool typesMatch(const MusECore::Event& e, unsigned selType);        void updatePresetList(); diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index 4e70adf5..be913b78 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -2979,7 +2979,7 @@ void Song::connectJackRoutes(AudioTrack* track, bool disconnect)  void Song::insertTrack0(Track* track, int idx)        {        insertTrack1(track, idx); -      insertTrack2(track, idx);  // MusEGlobal::audio->msgInsertTrack(track, idx, false); DELETETHIS or is this somehow explanatory? +      insertTrack2(track, idx);  // the same as MusEGlobal::audio->msgInsertTrack(track, idx, false);        insertTrack3(track, idx);        } | 
