From aacd502f046534d34fcd55735621fc3abc69899a Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Thu, 28 Feb 2008 13:00:10 -0600 Subject: [PATCH] Make tempo and time point deletion undoable also. --- Loggable.C | 15 +++++---- Loggable.H | 2 +- Region.H | 2 +- Tempo_Point.H | 73 ++++++++++++++++++++++++++++++++++++++---- Time_Point.H | 88 ++++++++++++++++++++++++++++++++++++++++++++------- Track.H | 2 +- main.C | 4 ++- 7 files changed, 158 insertions(+), 28 deletions(-) diff --git a/Loggable.C b/Loggable.C index 6a28782..876a145 100644 --- a/Loggable.C +++ b/Loggable.C @@ -183,11 +183,12 @@ Loggable::undo ( void ) if ( ! strcmp( command, "destroy" ) ) { - printf( "should create new %s here\n", classname ); - char **sa = parse_alist( arguments ); - _class_map[ string( classname ) ]( sa ); + if ( ! _class_map[ string( classname ) ] ) + printf( "error class %s is unregistered!\n", classname ); + else + _class_map[ string( classname ) ]( sa ); } else if ( ! strcmp( command, "set" ) ) @@ -289,7 +290,7 @@ void Loggable::log_start ( void ) { if ( ! _old_state ) - _old_state = log_dump(); + _old_state = get(); ++_nest; @@ -305,7 +306,7 @@ Loggable::log_end ( void ) // assert( _old_state ); - char **_new_state = log_dump(); + char **_new_state = get(); // if ( _old_state ) @@ -340,7 +341,7 @@ Loggable::log_create ( void ) indent(); log( "%s 0x%X create ", class_name(), _id ); - char **sa = log_dump(); + char **sa = get(); if ( sa ) { @@ -357,7 +358,7 @@ Loggable::log_destroy ( void ) indent(); log( "%s 0x%X destroy (nothing) << ", class_name(), _id ); - char **sa = log_dump(); + char **sa = get(); // log_print( sa, NULL ); log_print( NULL, sa ); diff --git a/Loggable.H b/Loggable.H index aa07a10..91b7d92 100644 --- a/Loggable.H +++ b/Loggable.H @@ -130,7 +130,7 @@ public: /* log messages for journal */ virtual const char *class_name ( void ) = 0; - virtual char ** log_dump ( void ) = 0; + virtual char ** get ( void ) = 0; /* this method must parse an array of name/value pair strings and make the appropriate changes too the object state */ diff --git a/Region.H b/Region.H index 1f7016e..a6c5a08 100644 --- a/Region.H +++ b/Region.H @@ -60,7 +60,7 @@ protected: const char *class_name ( void ) { return "Region"; } - char ** log_dump ( void ) + char ** get ( void ) { // char *r; char **sa = (char**)malloc( sizeof( char* ) * 8 ); diff --git a/Tempo_Point.H b/Tempo_Point.H index 3ffb174..8dab8d6 100644 --- a/Tempo_Point.H +++ b/Tempo_Point.H @@ -40,20 +40,82 @@ protected: const char *class_name ( void ) { return "Tempo_Point"; } - char ** log_dump ( void ) + char ** get ( void ) { - char **sa = (char**)malloc( sizeof( char* ) * 3 ); + char **sa = (char**)malloc( sizeof( char* ) * 4 ); - sa[2] = NULL; + int i = 0; - asprintf( &sa[0], ":x %lu", _offset ); - asprintf( &sa[1], ":tempo %f", _tempo ); + asprintf( &sa[i++], ":track 0x%X", _track ? _track->id() : 0 ); + asprintf( &sa[i++], ":x %lu", _offset ); + asprintf( &sa[i++], ":tempo %f", _tempo ); + + sa[i] = NULL; return sa; } + void + set ( char **sa ) + { + for ( int i = 0; sa[i]; ++i ) + { + char *s = sa[i]; + + strtok( s, " " ); + + char *v = s + strlen( s ) + 1; + + if ( ! strcmp( s, ":x" ) ) + _offset = atol( v ); + else + if ( ! strcmp( s, ":tepmo" ) ) + _tempo = atof( v ); + else + if ( ! strcmp( s, ":track" ) ) + { + int i; + sscanf( v, "%X", &i ); + Track *t = (Track*)Loggable::find( i ); + + assert( t ); + + t->add( this ); + } + + + free( s ); + } + + free( sa ); + + timeline->rulers->redraw(); + timeline->tracks->redraw(); + + _make_label(); + } + + Tempo_Point ( ) + { + + } + public: + /* for loggable */ + static Loggable * + create ( char **sa ) + { + Tempo_Point *r = new Tempo_Point; + + r->set( sa ); + + r->log_create(); + + return (Loggable *)r; + } + + Tempo_Point ( nframes_t when, float bpm ) { _tempo = bpm; @@ -73,7 +135,6 @@ public: float tempo ( void ) const { return _tempo; } void tempo ( float v ) { _tempo = v; } - int handle ( int m ) { diff --git a/Time_Point.H b/Time_Point.H index 45c8769..572fa89 100644 --- a/Time_Point.H +++ b/Time_Point.H @@ -25,12 +25,12 @@ struct time_sig { int beats_per_bar; - int note_type; + int beat_type; time_sig ( int bpb, int note ) { beats_per_bar = bpb; - note_type = note; + beat_type = note; } }; @@ -47,28 +47,94 @@ class Time_Point : public Track_Point if ( ! _label ) _label = new char[40]; - snprintf( _label, 40, "%d/%d", _time.beats_per_bar, _time.note_type ); + snprintf( _label, 40, "%d/%d", _time.beats_per_bar, _time.beat_type ); + } + + Time_Point ( ) : _time( 4, 4 ) + { + } protected: const char *class_name ( void ) { return "Time_Point"; } - char ** log_dump ( void ) + char ** get ( void ) { - char **sa = (char**)malloc( sizeof( char* ) * 4 ); + char **sa = (char**)malloc( sizeof( char* ) * 5 ); - sa[3] = NULL; + int i = 0; - asprintf( &sa[0], ":x %lu", _offset ); - asprintf( &sa[1], ":beats_per_bar %d", _time.beats_per_bar ); - asprintf( &sa[2], ":beat_type %d", _time.note_type ); + asprintf( &sa[i++], ":track 0x%X", _track ? _track->id() : 0 ); + asprintf( &sa[i++], ":x %lu", _offset ); + asprintf( &sa[i++], ":beats_per_bar %d", _time.beats_per_bar ); + asprintf( &sa[i++], ":beat_type %d", _time.beat_type ); + + sa[i] = NULL; return sa; } + void + set ( char **sa ) + { + for ( int i = 0; sa[i]; ++i ) + { + char *s = sa[i]; + + strtok( s, " " ); + + char *v = s + strlen( s ) + 1; + + if ( ! strcmp( s, ":x" ) ) + _offset = atol( v ); + else + if ( ! strcmp( s, ":beats_per_bar" ) ) + _time.beats_per_bar = atoi( v ); + else + if ( ! strcmp( s, ":beat_type" ) ) + _time.beat_type = atoi( v ); + else + if ( ! strcmp( s, ":track" ) ) + { + int i; + sscanf( v, "%X", &i ); + Track *t = (Track*)Loggable::find( i ); + + assert( t ); + + t->add( this ); + } + + + free( s ); + } + + free( sa ); + + timeline->rulers->redraw(); + timeline->tracks->redraw(); + + _make_label(); + } + + + public: + /* for loggable */ + static Loggable * + create ( char **sa ) + { + Time_Point *r = new Time_Point; + + r->set( sa ); + + r->log_create(); + + return (Loggable *)r; + } + Time_Point ( nframes_t when, int bpb, int note ) : _time( bpb, note ) { _offset = when; @@ -84,9 +150,9 @@ public: } /* beats_per_bar ( void ) const { return _time.beats_per_bar; } */ -/* note_type ( void ) const { return _note_type; } */ +/* beat_type ( void ) const { return _beat_type; } */ - void time ( int bpb, int note ) { _time.beats_per_bar = bpb; _time.note_type = note; } + void time ( int bpb, int note ) { _time.beats_per_bar = bpb; _time.beat_type = note; } time_sig time ( void ) const { return _time; } int diff --git a/Track.H b/Track.H index 2825638..6c502a4 100644 --- a/Track.H +++ b/Track.H @@ -53,7 +53,7 @@ protected: void set ( char ** ) { return; } - char ** log_dump ( void ) + char ** get ( void ) { // char *r; diff --git a/main.C b/main.C index 07af037..0183f1a 100644 --- a/main.C +++ b/main.C @@ -71,7 +71,9 @@ main ( int argc, char **argv ) Fl::scheme( "plastic" ); Loggable::open( "history" ); - Loggable::register_create( "Region", &Region::create ); + Loggable::register_create( "Region", &Region::create ); + Loggable::register_create( "Tempo_Point", &Tempo_Point::create ); + Loggable::register_create( "Time_Point", &Time_Point::create ); timeline = new Timeline( 0, 0, 800, 600, "Timeline" );