From c9ef939c47d3065a22d88ab2d257180131c6d965 Mon Sep 17 00:00:00 2001 From: EvanR Date: Tue, 6 Jan 2009 11:43:56 -0600 Subject: [PATCH] Rewrote overwrite and layer operations to be undoable. New Commands were created to overwrite a block on re-record and to push a blank layer. --- src/arranger.cpp | 1 + src/eventedit.cpp | 2 ++ src/saveload.cpp | 2 +- src/seq.cpp | 89 ++++++++++++++++++++++++++++++++++++------------------- src/seq.h | 73 ++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 135 insertions(+), 32 deletions(-) diff --git a/src/arranger.cpp b/src/arranger.cpp index f0ec508..3fa3d01 100644 --- a/src/arranger.cpp +++ b/src/arranger.cpp @@ -77,6 +77,7 @@ Arranger::Arranger(int x, int y, int w, int h, const char* label = 0) : fltk::Wi resize_s = NULL; resize_handle_width = 4; + resize_arrow = 0; unclone_flag=0; join_flag=0; diff --git a/src/eventedit.cpp b/src/eventedit.cpp index 9fb6797..7c01999 100644 --- a/src/eventedit.cpp +++ b/src/eventedit.cpp @@ -70,6 +70,8 @@ EventEdit::EventEdit(int x, int y, int w, int h, const char* label = 0) : fltk:: line_t1 = 0; line_t2 = 0; + + cur_seqpat = NULL; } int EventEdit::handle(int event){ diff --git a/src/saveload.cpp b/src/saveload.cpp index 53c75e6..f7f6677 100644 --- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -522,7 +522,7 @@ int load(const char* filename){ for(int j=1; j> index; p = findpatternbyindex(index,patlist); - layers->push_new(p); + layers->push(p); } file >> layers->index; diff --git a/src/seq.cpp b/src/seq.cpp index 10d1a6f..cf98eaa 100644 --- a/src/seq.cpp +++ b/src/seq.cpp @@ -326,14 +326,44 @@ void MoveSeqpat::undo(){ } void SplitSeqpat::redo(){ - s->p = p2; + } void SplitSeqpat::undo(){ + +} + +void JoinSeqpat::redo(){ + +} + +void JoinSeqpat::undo(){ + +} + +void ClearSeqpat::redo(){ + s->p = p2; +} + +void ClearSeqpat::undo(){ s->p = p1; } +void LayerSeqpat::redo(){ + if(s->layers == NULL){ + s->layers = new layerstack(s->p); + } + s->layers->push(p); + s->p = p; +} +void LayerSeqpat::undo(){ + s->p = s->layers->pop(); + if(s->layers->total == 1){ + delete s->layers; + s->layers = NULL; + } +} void CreateNote::redo(){ @@ -720,40 +750,19 @@ void seqpat::restate(){ //clear the pattern void seqpat::apply_erase(){ - if(layers){ - layers->ref_c--; - if(layers->ref_c == 0){ - delete layers; - layers = NULL; - } - } - pattern* ptmp = new pattern(); - ptmp->ref_c = 1; - ptmp->h = p->h; - ptmp->s = p->s; - ptmp->v = p->v; - ptmp->regen_colors(); + Command* c; - if(p){ - if(--(p->ref_c) == 0){ - delete p; - } - } - - p = ptmp; + c = new ClearSeqpat(this); + set_undo(c); + undo_push(1); } //create new pattern and make it current void seqpat::apply_layer(){ - if(layers){ - p = layers->push_new(); - } - else{ - layers = new layerstack(p); - layers->ref_c = 1; - p = layers->push_new(); - } + Command* c = new LayerSeqpat(this); + set_undo(c); + undo_push(1); } void seqpat::next_layer(){ @@ -843,7 +852,7 @@ pattern* layerstack::push_new(){ return array[index]; } -void layerstack::push_new(pattern* p){ +void layerstack::push(pattern* p){ if(total==memsize){ reallocate(); } @@ -864,6 +873,26 @@ void layerstack::reallocate(){ array = ptmp; } +pattern* layerstack::pop(){ + if(index == 1){ + return NULL; + } + if(index == total-1){ + index--; + } + array[total-1]=NULL; + total--; + return array[index]; +} + +void layerstack::remove(int n){ + +} + +void layerstack::insert(pattern* p, int n){ + +} + pattern* layerstack::next(){ if(index==total-1){ diff --git a/src/seq.h b/src/seq.h index 0f2df4f..f412284 100644 --- a/src/seq.h +++ b/src/seq.h @@ -125,7 +125,10 @@ struct layerstack { int ref_c; pattern* push_new(); - void push_new(pattern* p); + void push(pattern* p); + pattern* pop(); + void remove(int n); + void insert(pattern* p, int n); pattern* next(); pattern* prev(); void reallocate(); @@ -456,6 +459,7 @@ class MoveSeqpat : public Command { void undo(); }; +/*TODO*/ class SplitSeqpat : public Command { seqpat* s; pattern* p1; @@ -481,6 +485,73 @@ class SplitSeqpat : public Command { }; +/*TODO*/ +class JoinSeqpat : public Command { + + public: + + JoinSeqpat(seqpat* zs1, seqpat* zs2){ + //s = zs; + //p1 = s->p; + //p2 = new pattern(); + //p2->ref_c = 1; + } + + ~JoinSeqpat(){ + //if(--(p2->ref_c) == 0){ + // delete p2; + //} + } + + void redo(); + void undo(); +}; + +class ClearSeqpat : public Command { + + seqpat* s; + pattern* p1; + pattern* p2; + + public: + + ClearSeqpat(seqpat* zs){ + s = zs; + p1 = s->p; + p2 = new pattern(); + p2->ref_c = 1; + } + + ~ClearSeqpat(){ + //delete p2 + } + + void redo(); + void undo(); +}; + +class LayerSeqpat : public Command { + + seqpat* s; + pattern* p; + + public: + + LayerSeqpat(seqpat* zs){ + s = zs; + p = new pattern(); + p->ref_c = 1; + } + + ~LayerSeqpat(){ + //delete p2 + } + + void redo(); + void undo(); +}; + + class CreateNote : public Command { -- 2.11.4.GIT