@@ -129,17 +129,22 @@ log_diff ( char **sa1, char **sa2 ) | |||
void | |||
Loggable::log_start ( void ) | |||
{ | |||
// if ( _old_state ) | |||
// log_end(); | |||
if ( _old_state ) | |||
return; | |||
if ( ! _old_state ) | |||
_old_state = log_dump(); | |||
++_nest; | |||
_old_state = log_dump(); | |||
} | |||
void | |||
Loggable::log_end ( void ) | |||
{ | |||
if ( --_nest > 0 ) | |||
return; | |||
// assert( _old_state ); | |||
char **_new_state = log_dump(); | |||
// if ( _old_state ) | |||
@@ -152,11 +157,21 @@ Loggable::log_end ( void ) | |||
log_print( _old_state, _new_state ); | |||
} | |||
free_sa( _old_state ); | |||
if ( _new_state ) | |||
free_sa( _new_state ); | |||
if ( _old_state ) | |||
free_sa( _old_state ); | |||
_old_state = NULL; | |||
/* if ( _old_state ) */ | |||
/* { */ | |||
/* free_sa( _old_state ); */ | |||
/* _old_state = NULL; */ | |||
/* } */ | |||
// _old_state = NULL; | |||
} | |||
void | |||
@@ -29,6 +29,7 @@ | |||
#include <vector> | |||
using std::vector; | |||
class Logger; | |||
class Loggable | |||
{ | |||
@@ -44,6 +45,7 @@ private: | |||
char **_old_state; | |||
char **_new_state; | |||
int _nest; | |||
static | |||
void indent ( void ) | |||
@@ -89,6 +91,7 @@ public: | |||
{ | |||
_id = ++_log_id; | |||
_old_state = NULL; | |||
_nest = 0; | |||
_loggables.push_back( this ); | |||
} | |||
@@ -115,8 +118,44 @@ public: | |||
int id ( void ) { return _id; } | |||
friend class Logger; | |||
}; | |||
class Logger | |||
{ | |||
Loggable *_this; | |||
Logger ( ) {} | |||
public: | |||
Logger ( Loggable *l ) : _this( l ) | |||
{ | |||
_this->log_start(); | |||
} | |||
~Logger ( ) | |||
{ | |||
_this->log_end(); | |||
} | |||
void hold ( void ) | |||
{ | |||
printf( "hold\n" ); | |||
_this->_nest++; | |||
} | |||
void release ( void ) | |||
{ | |||
printf( "release\n" ); | |||
_this->_nest--; | |||
assert( _this->_nest ); | |||
} | |||
}; | |||
/* #ifndef _LOGGABLE_C */ | |||
/* #define log( act, fmt, args... ) log( __CLASS__, act, fmt, ## args ) */ | |||
/* #endif */ | |||
@@ -144,6 +144,7 @@ Region::trim ( enum trim_e t, int X ) | |||
int | |||
Region::handle ( int m ) | |||
{ | |||
static bool dragging = false; | |||
static int ox, oy; | |||
static enum trim_e trimming; | |||
@@ -156,7 +157,8 @@ Region::handle ( int m ) | |||
int ret; | |||
log_start(); | |||
Logger _log( this ); | |||
//log_start(); | |||
switch ( m ) | |||
{ | |||
@@ -170,9 +172,11 @@ Region::handle ( int m ) | |||
{ | |||
case 1: | |||
trim( trimming = LEFT, X ); | |||
// _log.hold(); | |||
break; | |||
case 3: | |||
trim( trimming = RIGHT, X ); | |||
// _log.hold(); | |||
break; | |||
case 2: | |||
{ | |||
@@ -240,10 +244,19 @@ Region::handle ( int m ) | |||
{ | |||
trimming = NO; | |||
} | |||
printf( "releasing\n"); | |||
if ( dragging ) | |||
_log.release(); | |||
dragging = false; | |||
goto changed; | |||
case FL_DRAG: | |||
if ( ! dragging ) | |||
{ | |||
_log.hold(); | |||
dragging = true; | |||
} | |||
if ( Fl::event_state() & FL_SHIFT && | |||
Fl::event_state() & FL_CTRL ) | |||
{ | |||
@@ -307,7 +320,7 @@ Region::handle ( int m ) | |||
changed: | |||
log_end(); | |||
// log_end(); | |||
return 1; | |||
} | |||
@@ -40,9 +40,17 @@ 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 ); } */ | |||
char ** log_dump ( void ) | |||
{ | |||
char **sa = (char**)malloc( sizeof( char* ) * 3 ); | |||
sa[2] = NULL; | |||
asprintf( &sa[0], ":x %lu", _offset ); | |||
asprintf( &sa[1], ":tempo %f", _tempo ); | |||
return sa; | |||
} | |||
public: | |||
@@ -54,9 +54,18 @@ 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 ); } */ | |||
char ** log_dump ( void ) | |||
{ | |||
char **sa = (char**)malloc( sizeof( char* ) * 4 ); | |||
sa[3] = NULL; | |||
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 ); | |||
return sa; | |||
} | |||
public: | |||
@@ -179,7 +179,7 @@ struct Timeline : public Fl_Group | |||
if ( damage() & FL_DAMAGE_SCROLL ) | |||
{ | |||
printf( "doing scroll\n" ); | |||
// printf( "doing scroll\n" ); | |||
int dx = ts_to_x( _old_position ) - ts_to_x( xoffset ); | |||
fl_scroll( X, tracks->y(), W, tracks->h(), dx, 0, draw_clip, this ); | |||
@@ -88,7 +88,7 @@ Track::event_widget ( void ) | |||
void | |||
Track::add ( Track_Widget *r ) | |||
{ | |||
log_start(); | |||
Logger _log( this ); | |||
if ( r->track() ) | |||
{ | |||
@@ -99,8 +99,6 @@ Track::add ( Track_Widget *r ) | |||
_widgets.push_back( r ); | |||
r->track( this ); | |||
log_end(); | |||
} | |||
/* snap /r/ to nearest edge */ | |||
@@ -32,14 +32,6 @@ protected: | |||
{ | |||
} | |||
char ** log_dump ( void ) | |||
{ | |||
return NULL; | |||
} | |||
void log_change ( void ) | |||
{ | |||
} | |||
public: | |||
Fl_Align align ( void ) const { return FL_ALIGN_RIGHT; } | |||
@@ -199,11 +199,13 @@ public: | |||
handle ( int m ) | |||
{ | |||
static int ox, oy; | |||
static bool moved = false; | |||
static bool dragging = false; | |||
int X = Fl::event_x(); | |||
int Y = Fl::event_y(); | |||
Logger _log( this ); | |||
switch ( m ) | |||
{ | |||
case FL_ENTER: | |||
@@ -230,16 +232,19 @@ public: | |||
return 1; | |||
} | |||
case FL_RELEASE: | |||
if ( moved ) | |||
{ | |||
// log_move(); | |||
moved = false; | |||
} | |||
// dump(); | |||
if ( dragging ) | |||
_log.release(); | |||
dragging = false; | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
return 1; | |||
case FL_DRAG: | |||
{ | |||
if ( ! dragging ) | |||
{ | |||
dragging = true; | |||
_log.hold(); | |||
} | |||
redraw(); | |||
if ( ox + X >= _track->x() ) | |||
@@ -249,8 +254,6 @@ public: | |||
_offset = timeline->x_to_ts( nx ) + timeline->xoffset; | |||
_track->snap( this ); | |||
moved = true; | |||
} | |||
// _track->redraw(); | |||