diff options
| author | Robert Jonsson <spamatica@gmail.com> | 2011-04-19 19:33:42 +0000 | 
|---|---|---|
| committer | Robert Jonsson <spamatica@gmail.com> | 2011-04-19 19:33:42 +0000 | 
| commit | 0b8e29363db66ddbd0dac925bb57b75310a93eba (patch) | |
| tree | 9cc4eeee00a868bb338de5ce67299e36bb4a69a2 /muse2/muse | |
| parent | aab05a914e357938f0ccb3d592186320e0646366 (diff) | |
undo for keymap
Diffstat (limited to 'muse2/muse')
| -rw-r--r-- | muse2/muse/audio.h | 3 | ||||
| -rw-r--r-- | muse2/muse/master/lmaster.cpp | 52 | ||||
| -rw-r--r-- | muse2/muse/seqmsg.cpp | 27 | ||||
| -rw-r--r-- | muse2/muse/song.cpp | 12 | ||||
| -rw-r--r-- | muse2/muse/song.h | 59 | ||||
| -rw-r--r-- | muse2/muse/undo.cpp | 21 | ||||
| -rw-r--r-- | muse2/muse/undo.h | 1 | 
7 files changed, 117 insertions, 58 deletions
| diff --git a/muse2/muse/audio.h b/muse2/muse/audio.h index 58f399e3..1eb03bbc 100644 --- a/muse2/muse/audio.h +++ b/muse2/muse/audio.h @@ -42,6 +42,7 @@ enum {        SEQM_ADD_PART, SEQM_REMOVE_PART, SEQM_CHANGE_PART,        SEQM_ADD_EVENT, SEQM_REMOVE_EVENT, SEQM_CHANGE_EVENT,        SEQM_ADD_TEMPO, SEQM_SET_TEMPO, SEQM_REMOVE_TEMPO, SEQM_ADD_SIG, SEQM_REMOVE_SIG, +      SEQM_ADD_KEY, SEQM_REMOVE_KEY,        SEQM_SET_GLOBAL_TEMPO,        SEQM_UNDO, SEQM_REDO,        SEQM_RESET_DEVICES, SEQM_INIT_DEVICES, SEQM_PANIC, @@ -218,6 +219,8 @@ class Audio {        void msgDeleteTempo(int tick, int tempo, bool doUndoFlag = true);        void msgAddSig(int tick, int z, int n, bool doUndoFlag = true);        void msgRemoveSig(int tick, int z, int n, bool doUndoFlag = true); +      void msgAddKey(int tick, int key, bool doUndoFlag = true); +      void msgRemoveKey(int tick, int key, bool doUndoFlag = true);        void msgShowInstrumentGui(MidiInstrument*, bool);        void msgShowInstrumentNativeGui(MidiInstrument*, bool);        void msgPanic(); diff --git a/muse2/muse/master/lmaster.cpp b/muse2/muse/master/lmaster.cpp index 412360e3..295dfb52 100644 --- a/muse2/muse/master/lmaster.cpp +++ b/muse2/muse/master/lmaster.cpp @@ -56,7 +56,7 @@ key_enum stringToKey(QString input) //flo  //don't change this function (except when renaming stuff)  QString keyToString(key_enum key) //flo  { -	int index; +  int index=0;  	switch(key)  	{  		case KEY_C:   index= 0; break; @@ -103,7 +103,7 @@ void LMaster::closeEvent(QCloseEvent* e)  void LMaster::songChanged(int type)        { -      if (type & (SC_SIG | SC_TEMPO)) +      if (type & (SC_SIG | SC_TEMPO | SC_KEY ))              updateList();        } @@ -292,19 +292,19 @@ void LMaster::updateList()            ++it;          } -        else if (ik != k->rend() && (is == s->rend() && (ik->second.tick >= it->second->tick) -                || (it == t->rend() && ik->second.tick >= is->second->tick ))) {// ik biggest +        else if ((ik != k->rend()) && (is == s->rend()) && (ik->second.tick >= it->second->tick) +                || (it == t->rend()) && (ik->second.tick >= is->second->tick )) {// ik biggest            insertKey(ik->second);            ++ik;          } -        else if (is != s->rend() && (ik == k->rend() && (is->second->tick >= it->second->tick) -                || (it == t->rend() && is->second->tick >= ik->second.tick ))) {// is biggest +        else if ((is != s->rend()) && (ik == k->rend()) && (is->second->tick >= it->second->tick) +                || (it == t->rend()) && (is->second->tick >= ik->second.tick )) {// is biggest            insertSig(is->second);            ++is;          } -        else if (it != t->rend() && (ik == k->rend() && (it->second->tick >= is->second->tick) -                || (is == s->rend() && it->second->tick >= ik->second.tick ))) {// it biggest +        else if ((it != t->rend()) && (ik == k->rend()) && (it->second->tick >= is->second->tick) +                || (is == s->rend()) && (it->second->tick >= ik->second.tick )) {// it biggest            insertTempo(it->second);            ++it;          } @@ -416,9 +416,9 @@ void LMaster::cmd(int cmd)                                      }                                case LMASTER_KEYEVENT:                                      { -                                    //LMasterKeyEventItem* k = (LMasterKeyEventItem*) l; -                                    keymap.delKey(l->tick()); -                                    //audio->msgRemoveSig(k->tick(), k->z(), k->n()); +                                    LMasterKeyEventItem* k = (LMasterKeyEventItem*) l; +                                    //keymap.delKey(l->tick()); +                                    audio->msgRemoveKey(k->tick(), k->key());                                      break;                                      }                                default: @@ -647,12 +647,11 @@ void LMaster::returnPressed()                    else if (editedItem->getType() == LMASTER_KEYEVENT) {                          LMasterKeyEventItem* k = (LMasterKeyEventItem*) editedItem;                          key_enum key = k->key(); -//                        song->startUndo(); -//                        audio->msgDeleteTempo(oldtick, tempo, false); -//                        audio->msgAddTempo(newtick, tempo, false); -//                        song->endUndo(SC_TEMPO); -                        keymap.delKey(oldtick); -                        keymap.addKey(newtick, key); +                        song->startUndo(); +                        audio->msgRemoveKey(oldtick, key, false); +                        audio->msgAddKey(newtick, key, false); +                        song->endUndo(SC_KEY); +                          // Select the item:                          QTreeWidgetItem* newSelected = (QTreeWidgetItem*) getItemAtPos(newtick, LMASTER_KEYEVENT);                          if (newSelected) { @@ -673,7 +672,6 @@ void LMaster::returnPressed()        //        else if (editedItem->getType() == LMASTER_SIGEVENT && editorColumn == LMASTER_VAL_COL)         { -          printf("SIGEVENT return\n");            ///Sig newSig = sig_editor->sig();              AL::TimeSignature newSig = sig_editor->sig(); @@ -683,12 +681,11 @@ void LMaster::returnPressed()              if(newSig.isValid())              {                LMasterSigEventItem* e = (LMasterSigEventItem*) editedItem; -              printf("adding sig %d %d\n", e->z(),e->n()); +              //printf("adding sig %d %d\n", e->z(),e->n());                int tick = e->tick();                if (!editingNewItem) {                      song->startUndo(); -                    if (tick > 0) -                          audio->msgRemoveSig(tick, e->z(), e->n(), false); +                    audio->msgRemoveSig(tick, e->z(), e->n(), false);                      audio->msgAddSig(tick, newSig.z, newSig.n, false);                      song->endUndo(SC_SIG);                      } @@ -701,7 +698,6 @@ void LMaster::returnPressed()        }        else if (editedItem->getType() == LMASTER_KEYEVENT && editorColumn == LMASTER_VAL_COL) { -          printf("KEYEVENT return\n");            QString input = key_editor->currentText();            key_editor->hide();            repaint(); @@ -711,18 +707,16 @@ void LMaster::returnPressed()            key_enum key = stringToKey(input);            if (!editingNewItem) { -//                      song->startUndo(); -//                      audio->msgDeleteTempo(tick, e->tempo(), false); -//                      audio->msgAddTempo(tick, tempo, false); -//                      song->endUndo(SC_TEMPO); -                      keymap.addKey(tick,key); +                      song->startUndo(); +                      audio->msgRemoveKey(tick, e->key(), false); +                      audio->msgAddKey(tick, key, false); +                      song->endUndo(SC_KEY);                      }                //                // New item edited:                //                else { -                    //audio->msgAddTempo(tick, tempo, true); -                    keymap.addKey(tick,key); +                    audio->msgAddKey(tick, key, true);                      }            }        updateList(); diff --git a/muse2/muse/seqmsg.cpp b/muse2/muse/seqmsg.cpp index 564cce42..950015b2 100644 --- a/muse2/muse/seqmsg.cpp +++ b/muse2/muse/seqmsg.cpp @@ -1067,6 +1067,33 @@ void Audio::msgRemoveSig(int tick, int z, int n, bool doUndoFlag)        }  //--------------------------------------------------------- +//   msgAddKey +//--------------------------------------------------------- + +void Audio::msgAddKey(int tick, int key, bool doUndoFlag) +      { +      AudioMsg msg; +      msg.id = SEQM_ADD_KEY; +      msg.a = tick; +      msg.b = key; +      sendMessage(&msg, doUndoFlag); +      } + +//--------------------------------------------------------- +//   msgRemoveKey +//! sends remove key message +//--------------------------------------------------------- + +void Audio::msgRemoveKey(int tick, int key, bool doUndoFlag) +      { +      AudioMsg msg; +      msg.id = SEQM_REMOVE_KEY; +      msg.a = tick; +      msg.b = key; +      sendMessage(&msg, doUndoFlag); +      } + +//---------------------------------------------------------  //   msgScanAlsaMidiPorts  //--------------------------------------------------------- diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index a7cff79d..ad6de83d 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -1954,6 +1954,18 @@ void Song::processMsg(AudioMsg* msg)                    updateFlags = SC_SIG;                    break; +            case SEQM_ADD_KEY: +                  undoOp(UndoOp::AddKey, msg->a, msg->b); +                  keymap.addKey(msg->a, (key_enum) msg->b); +                  updateFlags = SC_KEY; +                  break; + +            case SEQM_REMOVE_KEY: +                  undoOp(UndoOp::DeleteKey, msg->a, msg->b); +                  keymap.delKey(msg->a); +                  updateFlags = SC_KEY; +                  break; +              default:                    printf("unknown seq message %d\n", msg->id);                    break; diff --git a/muse2/muse/song.h b/muse2/muse/song.h index e4695728..b097a5ee 100644 --- a/muse2/muse/song.h +++ b/muse2/muse/song.h @@ -45,36 +45,37 @@ class MidiDevice;  class AudioPort;  class AudioDevice; -#define SC_TRACK_INSERTED     1 -#define SC_TRACK_REMOVED      2 -#define SC_TRACK_MODIFIED     4 -#define SC_PART_INSERTED      8 -#define SC_PART_REMOVED       0x10 -#define SC_PART_MODIFIED      0x20 -#define SC_EVENT_INSERTED     0x40 -#define SC_EVENT_REMOVED      0x80 -#define SC_EVENT_MODIFIED     0x100 -#define SC_SIG                0x200       // timing signature -#define SC_TEMPO              0x400       // tempo map changed -#define SC_MASTER             0x800       // master flag changed -#define SC_SELECTION          0x1000 -#define SC_MIDI_CONTROLLER    0x2000      // must update midi mixer -#define SC_MUTE               0x4000 -#define SC_SOLO               0x8000 -#define SC_RECFLAG            0x10000 -#define SC_ROUTE              0x20000 -#define SC_CHANNELS           0x40000 -#define SC_CONFIG             0x80000     // midiPort-midiDevice -#define SC_DRUMMAP            0x100000    // must update drumeditor -#define SC_MIXER_VOLUME       0x200000 -#define SC_MIXER_PAN          0x400000 -#define SC_AUTOMATION         0x800000 -#define SC_AUX                0x1000000   // mixer aux changed -#define SC_RACK               0x2000000   // mixer rack changed -#define SC_CLIP_MODIFIED      0x4000000 +#define SC_TRACK_INSERTED      1 +#define SC_TRACK_REMOVED       2 +#define SC_TRACK_MODIFIED      4 +#define SC_PART_INSERTED       8 +#define SC_PART_REMOVED        0x10 +#define SC_PART_MODIFIED       0x20 +#define SC_EVENT_INSERTED      0x40 +#define SC_EVENT_REMOVED       0x80 +#define SC_EVENT_MODIFIED      0x100 +#define SC_SIG                 0x200       // timing signature +#define SC_TEMPO               0x400       // tempo map changed +#define SC_MASTER              0x800       // master flag changed +#define SC_SELECTION           0x1000 +#define SC_MIDI_CONTROLLER     0x2000      // must update midi mixer +#define SC_MUTE                0x4000 +#define SC_SOLO                0x8000 +#define SC_RECFLAG             0x10000 +#define SC_ROUTE               0x20000 +#define SC_CHANNELS            0x40000 +#define SC_CONFIG              0x80000     // midiPort-midiDevice +#define SC_DRUMMAP             0x100000    // must update drumeditor +#define SC_MIXER_VOLUME        0x200000 +#define SC_MIXER_PAN           0x400000 +#define SC_AUTOMATION          0x800000 +#define SC_AUX                 0x1000000   // mixer aux changed +#define SC_RACK                0x2000000   // mixer rack changed +#define SC_CLIP_MODIFIED       0x4000000  #define SC_MIDI_CONTROLLER_ADD 0x8000000   // a hardware midi controller was added or deleted -#define SC_MIDI_TRACK_PROP    0x10000000   // a midi track's properties changed (channel, compression etc) -#define SC_SONG_TYPE          0x20000000   // the midi song type (mtype) changed +#define SC_MIDI_TRACK_PROP     0x10000000   // a midi track's properties changed (channel, compression etc) +#define SC_SONG_TYPE           0x20000000   // the midi song type (mtype) changed +#define SC_KEY                 0x40000000   // key map changed  #define REC_NOTE_FIFO_SIZE    16 diff --git a/muse2/muse/undo.cpp b/muse2/muse/undo.cpp index 8d218b0f..44d37591 100644 --- a/muse2/muse/undo.cpp +++ b/muse2/muse/undo.cpp @@ -8,6 +8,7 @@  ///#include "sig.h"  #include "al/sig.h"  // Tim. +#include "keyevent.h"  #include "undo.h"  #include "song.h" @@ -72,6 +73,8 @@ void UndoOp::dump()              case DeleteSig:              case ModifyClip:              case ModifyMarker: +            case AddKey: +            case DeleteKey:                    break;              }        } @@ -432,6 +435,16 @@ void Song::doUndo2()                          AL::sigmap.add(i->a, AL::TimeSignature(i->b, i->c));                          updateFlags |= SC_SIG;                          break; +                  case UndoOp::AddKey: +                        ///sigmap.del(i->a); +                        keymap.delKey(i->a); +                        updateFlags |= SC_KEY; +                        break; +                  case UndoOp::DeleteKey: +                        ///sigmap.add(i->a, i->b, i->c); +                        keymap.addKey(i->a, (key_enum)i->b); +                        updateFlags |= SC_KEY; +                        break;                    case UndoOp::ModifyClip:                    case UndoOp::ModifyMarker:                          break; @@ -660,6 +673,14 @@ void Song::doRedo2()                          AL::sigmap.del(i->a);                          updateFlags |= SC_SIG;                          break; +                  case UndoOp::AddKey: +                        keymap.addKey(i->a, (key_enum)i->b); +                        updateFlags |= SC_KEY; +                        break; +                  case UndoOp::DeleteKey: +                        keymap.delKey(i->a); +                        updateFlags |= SC_KEY; +                        break;                    case UndoOp::ModifyClip:                    case UndoOp::ModifyMarker:                          break; diff --git a/muse2/muse/undo.h b/muse2/muse/undo.h index b17e8e21..eb5600ef 100644 --- a/muse2/muse/undo.h +++ b/muse2/muse/undo.h @@ -33,6 +33,7 @@ struct UndoOp {              AddEvent, DeleteEvent, ModifyEvent,              AddTempo, DeleteTempo,              AddSig,   DeleteSig, +            AddKey,   DeleteKey,              SwapTrack,              ModifyClip,              ModifyMarker | 
