Browse Source

Clean up measure line code more.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
e22b7cc635
3 changed files with 155 additions and 146 deletions
  1. +143
    -13
      Timeline.C
  2. +9
    -130
      Timeline.H
  3. +3
    -3
      Track_Widget.H

+ 143
- 13
Timeline.C View File

@@ -207,26 +207,156 @@ Timeline::draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color )
{
measure = ts_to_x( (double)(sample_rate * 60) / beats_per_minute( x_to_ts( x ) + xoffset ));

int bpb = beats_per_bar( x_to_ts( x ) + xoffset );
const int abs_x = ts_to_x( xoffset ) + x;

if ( 0 == (x / measure) % bpb )
if ( 0 == abs_x % measure )
{
if ( measure * bpb < 8 )
break;
int bpb = beats_per_bar( x_to_ts( x ) + xoffset );

fl_color( bar );
}
else
{
if ( measure < 8 )
continue;
if ( 0 == (abs_x / measure) % bpb )
{
if ( measure * bpb < 8 )
break;

fl_color( bar );
}
else
{
if ( measure < 8 )
continue;

fl_color( beat );
}

fl_color( beat );
}

if ( 0 == (ts_to_x( xoffset ) + x) % measure )
fl_line( x, Y, x, Y + H );
}

}
fl_line_style( FL_SOLID, 0 );
}


void
Timeline::position ( int X )
{
_old_xposition = xoffset;

xoffset = x_to_ts( X );

damage( FL_DAMAGE_SCROLL );
}

void
Timeline::draw_clip ( void * v, int X, int Y, int W, int H )
{
Timeline *tl = (Timeline *)v;

// printf( "draw_clip: %d,%d %dx%d\n", X, Y, W, H );
fl_push_clip( X, Y, W, H );

fl_color( rand() );
fl_rectf( X, Y, X + W, Y + H );

tl->draw_child( *tl->tracks );
tl->draw_child( *tl->rulers );

fl_pop_clip();
}


void
Timeline::draw ( void )
{
int X, Y, W, H;

X = tracks->x() + Fl::box_dx( tracks->child( 0 )->box() ) + 1;
Y = tracks->y();
W = tracks->w() - Fl::box_dw( tracks->child( 0 )->box() ) - 1;
H = tracks->h();


/* fl_color( FL_RED ); */
/* fl_rect( X, Y, X + W, Y + H ); */

if ( damage() & FL_DAMAGE_ALL )
// ( damage() & ( FL_DAMAGE_CHILD | FL_DAMAGE_SCROLL ) ) )
{

draw_box( box(), x(), y(), w(), h(), color() );

fl_push_clip( rulers->x(), rulers->y(), rulers->w(), rulers->h() );
draw_child( *rulers );
fl_pop_clip();

fl_push_clip( tracks->x(), rulers->y() + rulers->h(), tracks->w(), h() - hscroll->h() );
draw_child( *tracks );
fl_pop_clip();

draw_child( *hscroll );
draw_child( *vscroll );

return;
}

if ( damage() & FL_DAMAGE_CHILD )
{

/* if ( damage() & FL_DAMAGE_SCROLL ) */
/* fl_push_no_clip(); */

fl_push_clip( rulers->x(), rulers->y(), rulers->w(), rulers->h() );
update_child( *rulers );
fl_pop_clip();

fl_push_clip( tracks->x(), rulers->y() + rulers->h(), tracks->w(), h() - rulers->h() - hscroll->h() );
update_child( *tracks );
fl_pop_clip();

update_child( *hscroll );
update_child( *vscroll );

/* if ( damage() & FL_DAMAGE_SCROLL ) */
/* fl_pop_clip(); */

}


if ( damage() & FL_DAMAGE_SCROLL )
{
int dx = ts_to_x( _old_xposition ) - ts_to_x( xoffset );
int dy = _old_yposition - yposition;

if ( ! dy )
fl_scroll( X, rulers->y(), W, rulers->h(), dx, 0, draw_clip, this );

Y = rulers->y() + rulers->h();
H = h() - rulers->h() - hscroll->h();

fl_scroll( X, Y, W, H, dx, dy, draw_clip, this );

_old_xposition = xoffset;
_old_yposition = yposition;

}


}


int
Timeline::handle ( int m )
{
switch ( m )
{
case FL_MOUSEWHEEL:
{
if ( hscroll->handle( m ) )
return 1;

return vscroll->handle( m );
}
default:
return Fl_Group::handle( m );
}
}

+ 9
- 130
Timeline.H View File

@@ -51,6 +51,8 @@ using std::list;
struct Timeline : public Fl_Group
{

static void draw_clip ( void * v, int X, int Y, int W, int H );

int _old_xposition;
int _old_yposition;

@@ -98,138 +100,15 @@ struct Timeline : public Fl_Group
return x * fpp;
}

/* #define FOR_CHILDREN_OF( name, ind ) \ */
/* for ( int i = (name) ->children(); i-- && ( (ind) = (name) ->child( i ) ); ) */

float beats_per_minute ( nframes_t when ) const;
void beats_per_minute ( nframes_t when, float bpm );
int beats_per_bar ( nframes_t when ) const;
void beats_per_minute ( nframes_t when, float bpm );
void draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color );
void position ( int X );
void draw ( void );
int handle ( int m );

/** set scroll position */
void
position ( int X )
{
_old_xposition = xoffset;

xoffset = x_to_ts( X );

damage( FL_DAMAGE_SCROLL );

/* rulers->damage( FL_DAMAGE_SCROLL ); */
/* tracks->damage( FL_DAMAGE_SCROLL ); */

}


#define FOR_CHILDREN_OF( name, ind ) \
for ( int i = (name) ->children(); i-- && ( (ind) = (name) ->child( i ) ); )

static void
draw_clip ( void * v, int X, int Y, int W, int H )
{
Timeline *tl = (Timeline *)v;

// printf( "draw_clip: %d,%d %dx%d\n", X, Y, W, H );
fl_push_clip( X, Y, W, H );

fl_color( rand() );
fl_rectf( X, Y, X + W, Y + H );

tl->draw_child( *tl->tracks );
tl->draw_child( *tl->rulers );

fl_pop_clip();
}


void
draw ( void )
{
int X, Y, W, H;

X = tracks->x() + Fl::box_dx( tracks->child( 0 )->box() ) + 1;
Y = tracks->y();
W = tracks->w() - Fl::box_dw( tracks->child( 0 )->box() ) - 1;
H = tracks->h();


/* fl_color( FL_RED ); */
/* fl_rect( X, Y, X + W, Y + H ); */

if ( damage() & FL_DAMAGE_ALL )
{

/* fl_push_clip( x(), y(), w() - vscroll->w(), h() - hscroll->h() ); */

/* Fl_Group::draw(); */

/* fl_pop_clip(); */

/* draw_child( *hscroll ); */
/* draw_child( *vscroll ); */


fl_push_clip( rulers->x(), rulers->y(), rulers->w(), rulers->h() );
draw_child( *rulers );
fl_pop_clip();

fl_push_clip( tracks->x(), rulers->y() + rulers->h(), tracks->w(), h() - hscroll->h() );
draw_child( *tracks );
fl_pop_clip();

draw_child( *hscroll );
draw_child( *vscroll );

return;
}

if ( damage() & FL_DAMAGE_SCROLL )
{
int dx = ts_to_x( _old_xposition ) - ts_to_x( xoffset );
int dy = _old_yposition - yposition;

if ( ! dy )
fl_scroll( X, rulers->y(), W, rulers->h(), dx, 0, draw_clip, this );

Y = rulers->y() + rulers->h();
H = h() - rulers->h() - hscroll->h();

fl_scroll( X, Y, W, H, dx, dy, draw_clip, this );

_old_xposition = xoffset;
_old_yposition = yposition;

}

if ( damage() & FL_DAMAGE_CHILD )
{
fl_push_clip( rulers->x(), rulers->y(), rulers->w(), rulers->h() );
update_child( *rulers );
fl_pop_clip();

fl_push_clip( tracks->x(), rulers->y() + rulers->h(), tracks->w(), h() - rulers->h() - hscroll->h() );
update_child( *tracks );
fl_pop_clip();

update_child( *hscroll );
update_child( *vscroll );
}

}


int handle ( int m )
{
switch ( m )
{
case FL_MOUSEWHEEL:
{
if ( hscroll->handle( m ) )
return 1;

return vscroll->handle( m );
}
default:
return Fl_Group::handle( m );
}
}
};

+ 3
- 3
Track_Widget.H View File

@@ -253,7 +253,7 @@ public:

redraw();

if ( ox + X >= _track->x() )
if ( timeline->ts_to_x( timeline->xoffset ) + ox + X > 0 )
{
int nx = ox + X;

@@ -287,8 +287,8 @@ public:
pos += d;

timeline->position( timeline->ts_to_x( pos ) );
// timeline->tracks->redraw();
_track->redraw();
// timeline->redraw();
}




Loading…
Cancel
Save