From 69fb7a78903b39ca848daab5a1f7b723e79062a3 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Sun, 24 Feb 2008 01:42:41 -0600 Subject: [PATCH] Work on journal system. --- Loggable.C | 117 +++++++++++++++++++++++++++++++++++++++++++++++++ Loggable.H | 46 +++++++++++++++++-- Region.C | 27 +++++++----- Region.H | 59 +++++++++++++++++++------ Tempo_Point.H | 2 + Time_Point.H | 2 + Track.C | 14 +++--- Track_Point.H | 8 ++++ Track_Widget.H | 8 +++- 9 files changed, 244 insertions(+), 39 deletions(-) diff --git a/Loggable.C b/Loggable.C index 9955023..b51dbf8 100644 --- a/Loggable.C +++ b/Loggable.C @@ -28,6 +28,8 @@ FILE *Loggable::_fp; int Loggable::_log_id = 0; +vector Loggable::_loggables; + bool Loggable::open ( const char *filename ) { @@ -56,3 +58,118 @@ Loggable::log ( const char *module, const char *action, const char *fmt, ... ) fprintf( _fp, "\n" ); } + + +static +void free_sa ( char **sa ) +{ + char **a = sa; + for ( ; *a; a++ ) + free( *a ); + + free( sa ); +} + + +static +void +log_print( char **o, char **n ) +{ + if ( n ) + for ( ; *n; n++ ) + printf( "%s%s", *n, *(n + 1) ? " " : "" ); + + if ( o && *o ) + { + if ( n ) printf( " << " ); + for ( ; *o; o++ ) + printf( "%s%s", *o, *(o + 1) ? " " : "" ); + } + + printf( "\n" ); +} + +/** compare elements of dumps s1 and s2, removing those elements + of dst which are not changed from src */ +static +void +log_diff ( char **sa1, char **sa2 ) +{ + if ( ! sa1 ) + return; + + int w = 0; + for ( int i = 0; sa1[ i ]; ++i ) + { + if ( ! strcmp( sa1[ i ], sa2[ i ] ) ) + { + free( sa2[ i ] ); + free( sa1[ i ] ); + } + else + { + sa2[ w ] = sa2[ i ]; + sa1[ w ] = sa1[ i ]; + + w++; + } + } + + sa1[ w ] = NULL; + sa2[ w ] = NULL; +} + + + + + +void +Loggable::log_start ( void ) +{ + if ( ! _old_state ) + _old_state = log_dump(); +} + +void +Loggable::log_end ( void ) +{ + char **_new_state = log_dump(); + + // if ( _old_state ) + + log_diff( _old_state, _new_state ); + + printf( "%s 0x%X set ", class_name(), _id ); + + log_print( _old_state, _new_state ); + + free_sa( _old_state ); + if ( _new_state ) + free_sa( _new_state ); + + _old_state = NULL; +} + +void +Loggable::log_create ( void ) +{ + printf( "%s 0x%X new ", class_name(), _id ); + + char **sa = log_dump(); + + log_print( NULL, sa ); + + free_sa( sa ); +} + +void +Loggable::log_destroy ( void ) +{ + printf( "%s 0x%X destroy ", class_name(), _id ); + + char **sa = log_dump(); + + log_print( sa, NULL ); + + free_sa( sa ); +} diff --git a/Loggable.H b/Loggable.H index 6d5145a..9255dd7 100644 --- a/Loggable.H +++ b/Loggable.H @@ -22,6 +22,12 @@ #pragma once #include +#include +#include + + +#include +using std::vector; class Loggable { @@ -29,28 +35,60 @@ class Loggable static FILE *_fp; static int _log_id; + static vector _loggables; + private: int _id; + char **_old_state; + char **_new_state; + public: static bool open ( const char *filename ); + + static + Loggable * + find ( int id ) + { + if ( id > _log_id ) + return NULL; + + return _loggables[ id ]; + } + Loggable ( ) { _id = ++_log_id; + _old_state = NULL; + + _loggables.push_back( this ); } + /* log messages for journal */ - virtual void log_create ( void ) = 0; - virtual void log_destroy ( void ) = 0; - virtual void log_move ( void ) = 0; - virtual void log_change ( void ) = 0; + virtual const char *class_name ( void ) = 0; + virtual char ** log_dump ( void ) = 0; + + /* this method must parse an array of name/value pair strings and make the appropriate changes too + the object state */ + virtual void set ( char **sa ) = 0; +// void log ( const char *module, const char *action, const char *fmt, ... ); + +protected: void log ( const char *module, const char *action, const char *fmt, ... ); + void log_start ( void ); + void log_end ( void ); + void log_create ( void ); + void log_destroy ( void ); }; #ifndef _LOGGABLE_C #define log( act, fmt, args... ) log( __CLASS__, act, fmt, ## args ) #endif + +/* #define LOG_START Logger _logger( this ) */ +/* #define LOG_END _logger.print( this ) */ diff --git a/Region.C b/Region.C index bad8649..8014ed3 100644 --- a/Region.C +++ b/Region.C @@ -131,7 +131,7 @@ Region::trim ( enum trim_e t, int X ) long td = timeline->x_to_ts( d ); - printf( "%li %li\n", td, _end - _start ); +// printf( "%li %li\n", td, _end - _start ); if ( td >= 0 && _end - _start < td ) _end = _start + timeline->x_to_ts( 1 ); @@ -161,6 +161,7 @@ Region::handle ( int m ) int ret; + log_start(); switch ( m ) { @@ -178,11 +179,11 @@ Region::handle ( int m ) case 3: trim( trimming = RIGHT, X ); break; - default: return 0; - + break; } + fl_cursor( FL_CURSOR_WE ); return 1; } @@ -205,11 +206,13 @@ Region::handle ( int m ) else _selected = ! _selected; - log_change(); redraw(); + goto changed; } + ret = Track_Widget::handle( m ); + return ret | 1; } @@ -221,9 +224,9 @@ Region::handle ( int m ) if ( trimming != NO ) { trimming = NO; - log_change(); } - return 1; + printf( "releasing\n"); + goto changed; case FL_DRAG: if ( Fl::event_state() & FL_SHIFT && @@ -278,20 +281,20 @@ Region::handle ( int m ) _track->prev()->add( this ); } -// _track->redraw(); - // _track->damage( FL_DAMAGE_EXPOSE, x(), y(), w(), h() ); ret = Track_Widget::handle( m ); return ret | 1; - - -// _offset = timeline->x_to_ts( x() ); - default: return Track_Widget::handle( m ); break; } + +changed: + + log_end(); + return 1; + } void diff --git a/Region.H b/Region.H index 59bd01c..323d9c7 100644 --- a/Region.H +++ b/Region.H @@ -35,6 +35,8 @@ using namespace std; #include "Track_Widget.H" +#include "Loggable.H" + /* got I hate C++ */ #define __CLASS__ "Region" @@ -56,25 +58,56 @@ class Region : public Track_Widget protected: - /* general */ - void log_create ( void ) - { - log( "create", "%lu \"%s\" %d %f %lu %lu", _offset, _clip->name(), _selected, _scale, _start, _end ); - } + const char *class_name ( void ) { return "Region"; } - void log_destroy ( void ) + char ** log_dump ( void ) { - log( "destroy", NULL ); - } + // char *r; + char **sa = (char**)malloc( sizeof( char* ) * 6 ); - void log_move ( void ) - { - log( "move", "%lu", _offset ); + sa[5] = NULL; + + asprintf( &sa[0], ":x %lu", _offset ); + asprintf( &sa[1], ":l %lu", _start ); + asprintf( &sa[2], ":r %lu", _end ); + asprintf( &sa[3], ":selected %d", _selected ); + asprintf( &sa[4], ":gain %f", _scale ); + +// asprintf( &r, ":x %lu\n:l %lu\n:r %lu\n:selected %d\n:gain %f", _offset, _start, _end, _selected, _scale ); + + return sa; } - void log_change ( void ) + void + set ( char **sa ) { - log( "change", "%d %f %lu %lu", _selected, _scale, _start, _end ); + for ( int i = 0; sa[i]; ++i ) + { + char *s = sa[i]; + + strtok( s, " " ); + + char *v = s + strlen( s ); + + if ( ! strcmp( s, ":x" ) ) + _offset = atol( v ); + else + if ( ! strcmp( s, ":l" ) ) + _start = atol( v ); + else + if ( ! strcmp( s, ":r" ) ) + _end = atol( v ); + else + if ( ! strcmp( s, ":selected" ) ) + _selected = atoi( v ); + else + if ( ! strcmp( s, ":gain" ) ) + _scale = atof( v ); + + free( s ); + } + + free( sa ); } public: diff --git a/Tempo_Point.H b/Tempo_Point.H index f5bca12..bc4811f 100644 --- a/Tempo_Point.H +++ b/Tempo_Point.H @@ -38,6 +38,8 @@ class Tempo_Point : public Track_Point protected: + const char *class_name ( void ) { return "Tempo_Point"; } + void log_create ( void ) { log( "create", "%lu %f", _offset, _tempo ); } void log_destroy ( void ) { log( "destroy", NULL ); } void log_move ( void ) { log( "move", "%lu", _offset ); } diff --git a/Time_Point.H b/Time_Point.H index acba05f..c18ca2c 100644 --- a/Time_Point.H +++ b/Time_Point.H @@ -52,6 +52,8 @@ class Time_Point : public Track_Point protected: + const char *class_name ( void ) { return "Time_Point"; } + void log_create ( void ) { log( "create", "%lu %d %d", _offset, _time.beats_per_bar, _time.note_type ); } void log_destroy ( void ) { log( "destroy", NULL ); } void log_move ( void ) { log( "move", "%lu", _offset ); } diff --git a/Track.C b/Track.C index 8c96dbd..d4e84fc 100644 --- a/Track.C +++ b/Track.C @@ -73,7 +73,6 @@ Track::remove ( Track_Widget *r ) Track_Widget * Track::event_widget ( void ) { -// FIXME: doesn't handle overlap! int ets = timeline->xoffset + timeline->x_to_ts( Fl::event_x() ); for ( list ::const_reverse_iterator r = _widgets.rbegin(); r != _widgets.rend(); r++ ) if ( ets > (*r)->offset() && ets < (*r)->offset() + (*r)->length() ) @@ -146,7 +145,7 @@ done: int Track::handle ( int m ) { - static Track_Widget *current_widget; + static Track_Widget *pushed; switch ( m ) { @@ -155,27 +154,24 @@ Track::handle ( int m ) return 1; default: { - Track_Widget *r = event_widget(); - if ( current_widget ) - r = current_widget; + Track_Widget *r = pushed ? pushed : event_widget(); if ( r ) { int retval = r->handle( m ); if ( retval && m == FL_PUSH ) - current_widget = r; + pushed = r; if ( retval && m == FL_RELEASE ) - current_widget = NULL; + pushed = NULL; if ( _queued_widget ) { remove( _queued_widget ); delete _queued_widget; _queued_widget = NULL; - current_widget = NULL; -// redraw(); + pushed = NULL; } return retval; diff --git a/Track_Point.H b/Track_Point.H index e8f2a07..ef43bd9 100644 --- a/Track_Point.H +++ b/Track_Point.H @@ -28,6 +28,14 @@ protected: char *_label; + void set ( char **a ) + { + } + + char ** log_dump ( void ) + { + return NULL; + } void log_change ( void ) { } diff --git a/Track_Widget.H b/Track_Widget.H index 2acb427..632e77d 100644 --- a/Track_Widget.H +++ b/Track_Widget.H @@ -206,6 +206,12 @@ public: switch ( m ) { + case FL_ENTER: + fl_cursor( FL_CURSOR_HAND ); + return 1; + case FL_LEAVE: + fl_cursor( FL_CURSOR_DEFAULT ); + return 1; case FL_PUSH: { ox = x() - X; @@ -226,7 +232,7 @@ public: case FL_RELEASE: if ( moved ) { - log_move(); +// log_move(); moved = false; } // dump();