Make vertical scrolling work.
This commit is contained in:
parent
364fee5983
commit
63fb8971a2
79
Timeline.C
79
Timeline.C
|
@ -23,13 +23,72 @@
|
||||||
#include "Time_Track.H"
|
#include "Time_Track.H"
|
||||||
#include "Audio_Track.H"
|
#include "Audio_Track.H"
|
||||||
|
|
||||||
|
#include <FL/Fl_Scrollbar.H>
|
||||||
|
|
||||||
|
void
|
||||||
|
cb_hscroll ( Fl_Widget *w, void *v )
|
||||||
|
{
|
||||||
|
Scalebar *sb = (Scalebar*)w;
|
||||||
|
|
||||||
|
if ( sb->zoom_changed() )
|
||||||
|
{
|
||||||
|
timeline->fpp = sb->zoom() * 1;
|
||||||
|
|
||||||
|
int maxx = timeline->ts_to_x( timeline->length );
|
||||||
|
sb->range( 0, maxx );
|
||||||
|
|
||||||
|
timeline->redraw();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
timeline->position( sb->value() );
|
||||||
|
}
|
||||||
|
|
||||||
|
printf( "%lu\n", timeline->xoffset );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cb_vscroll ( Fl_Widget *w, void *v )
|
||||||
|
{
|
||||||
|
Fl_Scrollbar *sb = (Fl_Scrollbar*)w;
|
||||||
|
|
||||||
|
timeline->tracks->position( timeline->tracks->x(), (timeline->rulers->y() + timeline->rulers->h()) - sb->value() );
|
||||||
|
timeline->yposition = sb->value();
|
||||||
|
|
||||||
|
timeline->vscroll->range( 0, timeline->tracks->h() - timeline->h() - timeline->rulers->h() );
|
||||||
|
|
||||||
|
timeline->damage( FL_DAMAGE_SCROLL );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Group( X, Y, W, H, L )
|
Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Group( X, Y, W, H, L )
|
||||||
{
|
{
|
||||||
|
|
||||||
xoffset = 0;
|
xoffset = 0;
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Pack *o = new Fl_Pack( 0, 0, 800, 600, "rulers" );
|
Scalebar *o = new Scalebar( X, H - 18, W - 18, 18 );
|
||||||
|
|
||||||
|
o->range( 0, 48000 * 2 );
|
||||||
|
o->zoom_range( 2, 8192 );
|
||||||
|
o->zoom( 256 );
|
||||||
|
o->type( FL_HORIZONTAL );
|
||||||
|
o->callback( cb_hscroll, 0 );
|
||||||
|
|
||||||
|
hscroll = o;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Fl_Scrollbar *o = new Fl_Scrollbar( W - 18, Y, 18, H - 18 );
|
||||||
|
|
||||||
|
o->type( FL_VERTICAL );
|
||||||
|
o->step( 10 );
|
||||||
|
o->callback( cb_vscroll, 0 );
|
||||||
|
vscroll = o;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Fl_Pack *o = new Fl_Pack( 0, 0, W - vscroll->w(), H - hscroll->h(), "rulers" );
|
||||||
o->type( Fl_Pack::VERTICAL );
|
o->type( Fl_Pack::VERTICAL );
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -59,13 +118,16 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Group( X,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
o->size( o->w(), o->child( 0 )->h() * o->children() );
|
||||||
rulers = o;
|
rulers = o;
|
||||||
o->end();
|
o->end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Scroll *o = new Fl_Scroll( 0, 24 * 2, 800, 600 - (24 * 3) );
|
|
||||||
o->type( Fl_Scroll::VERTICAL_ALWAYS );
|
/* Fl_Scroll *o = new Fl_Scroll( 0, 24 * 2, 800, 600 - (24 * 3) ); */
|
||||||
|
/* o->type( Fl_Scroll::VERTICAL_ALWAYS ); */
|
||||||
|
|
||||||
sample_rate = 44100;
|
sample_rate = 44100;
|
||||||
fpp = 256;
|
fpp = 256;
|
||||||
|
@ -73,12 +135,12 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Group( X,
|
||||||
length = sample_rate * 60 * 2;
|
length = sample_rate * 60 * 2;
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Pack *o = new Fl_Pack( 0, 0, 800, 5000 );
|
Fl_Pack *o = new Fl_Pack( X, rulers->y() + rulers->h(), W - vscroll->w(), 5000 );
|
||||||
o->type( Fl_Pack::VERTICAL );
|
o->type( Fl_Pack::VERTICAL );
|
||||||
o->spacing( 10 );
|
o->spacing( 10 );
|
||||||
|
|
||||||
Track *l = NULL;
|
Track *l = NULL;
|
||||||
for ( int i = 6; i--; )
|
for ( int i = 16; i--; )
|
||||||
{
|
{
|
||||||
|
|
||||||
Track *o = new Audio_Track( 0, 0, 800, 100 );
|
Track *o = new Audio_Track( 0, 0, 800, 100 );
|
||||||
|
@ -93,10 +155,13 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Group( X,
|
||||||
o->end();
|
o->end();
|
||||||
}
|
}
|
||||||
|
|
||||||
scroll = o;
|
/* scroll = o; */
|
||||||
o->end();
|
/* o->end(); */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vscroll->range( 0, tracks->h() );
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
|
||||||
end();
|
end();
|
||||||
|
|
105
Timeline.H
105
Timeline.H
|
@ -51,7 +51,8 @@ using std::list;
|
||||||
struct Timeline : public Fl_Group
|
struct Timeline : public Fl_Group
|
||||||
{
|
{
|
||||||
|
|
||||||
int _old_position;
|
int _old_xposition;
|
||||||
|
int _old_yposition;
|
||||||
|
|
||||||
enum snap_flags_e {
|
enum snap_flags_e {
|
||||||
SNAP_TO_REGION,
|
SNAP_TO_REGION,
|
||||||
|
@ -62,7 +63,8 @@ struct Timeline : public Fl_Group
|
||||||
Fl_Scroll *scroll;
|
Fl_Scroll *scroll;
|
||||||
Fl_Pack *tracks;
|
Fl_Pack *tracks;
|
||||||
Fl_Pack *rulers;
|
Fl_Pack *rulers;
|
||||||
Scalebar *scrollbar;
|
Scalebar *hscroll;
|
||||||
|
Fl_Scrollbar *vscroll;
|
||||||
|
|
||||||
Tempo_Track *tempo_track;
|
Tempo_Track *tempo_track;
|
||||||
Time_Track *time_track;
|
Time_Track *time_track;
|
||||||
|
@ -76,6 +78,8 @@ struct Timeline : public Fl_Group
|
||||||
|
|
||||||
nframes_t length;
|
nframes_t length;
|
||||||
|
|
||||||
|
int yposition;
|
||||||
|
|
||||||
int _beats_per_bar;
|
int _beats_per_bar;
|
||||||
float _beats_per_minute;
|
float _beats_per_minute;
|
||||||
|
|
||||||
|
@ -102,7 +106,7 @@ struct Timeline : public Fl_Group
|
||||||
void
|
void
|
||||||
position ( int X )
|
position ( int X )
|
||||||
{
|
{
|
||||||
_old_position = xoffset;
|
_old_xposition = xoffset;
|
||||||
|
|
||||||
xoffset = x_to_ts( X );
|
xoffset = x_to_ts( X );
|
||||||
|
|
||||||
|
@ -127,26 +131,8 @@ struct Timeline : public Fl_Group
|
||||||
fl_color( rand() );
|
fl_color( rand() );
|
||||||
fl_rectf( X, Y, X + W, Y + H );
|
fl_rectf( X, Y, X + W, Y + H );
|
||||||
|
|
||||||
// tl->tracks->redraw();
|
|
||||||
|
|
||||||
tl->draw_child( *tl->rulers );
|
|
||||||
tl->draw_child( *tl->tracks );
|
tl->draw_child( *tl->tracks );
|
||||||
|
tl->draw_child( *tl->rulers );
|
||||||
|
|
||||||
// tl->tracks->draw();
|
|
||||||
// tl->rulers->draw();
|
|
||||||
|
|
||||||
/* FOR_CHILDREN_OF( tracks, o ) */
|
|
||||||
/* { */
|
|
||||||
/* tracks->draw_child( *o ); */
|
|
||||||
/* tracks->draw_outside_label( *o ); */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
/* FOR_CHILDREN_OF( rulers, o ) */
|
|
||||||
/* { */
|
|
||||||
/* tracks->draw_child( o ); */
|
|
||||||
/* tracks->draw_outside_label( o ); */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
fl_pop_clip();
|
fl_pop_clip();
|
||||||
}
|
}
|
||||||
|
@ -163,45 +149,84 @@ struct Timeline : public Fl_Group
|
||||||
H = tracks->h();
|
H = tracks->h();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* fl_color( FL_RED ); */
|
/* fl_color( FL_RED ); */
|
||||||
/* fl_rect( X, Y, X + W, Y + H ); */
|
/* fl_rect( X, Y, X + W, Y + H ); */
|
||||||
|
|
||||||
if ( damage() & FL_DAMAGE_ALL )
|
if ( damage() & FL_DAMAGE_ALL )
|
||||||
{
|
{
|
||||||
Fl_Group::draw();
|
|
||||||
|
|
||||||
/* draw_clip( this, X, tracks->y(), W, tracks->h() ); */
|
/* fl_push_clip( x(), y(), w() - vscroll->w(), h() - hscroll->h() ); */
|
||||||
/* draw_clip( this, X, rulers->y(), W, rulers->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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( damage() & FL_DAMAGE_SCROLL )
|
if ( damage() & FL_DAMAGE_SCROLL )
|
||||||
{
|
{
|
||||||
// printf( "doing scroll\n" );
|
int dx = ts_to_x( _old_xposition ) - ts_to_x( xoffset );
|
||||||
int dx = ts_to_x( _old_position ) - ts_to_x( xoffset );
|
int dy = _old_yposition - yposition;
|
||||||
|
|
||||||
fl_scroll( X, tracks->y(), W, tracks->h(), dx, 0, draw_clip, this );
|
if ( ! dy )
|
||||||
fl_scroll( X, rulers->y(), W, rulers->h(), dx, 0, draw_clip, this );
|
fl_scroll( X, rulers->y(), W, rulers->h(), dx, 0, draw_clip, this );
|
||||||
|
|
||||||
_old_position = 0;
|
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 )
|
if ( damage() & FL_DAMAGE_CHILD )
|
||||||
{
|
{
|
||||||
Fl_Widget *o;
|
fl_push_clip( rulers->x(), rulers->y(), rulers->w(), rulers->h() );
|
||||||
FOR_CHILDREN_OF( this, o )
|
update_child( *rulers );
|
||||||
this->update_child( *o );
|
fl_pop_clip();
|
||||||
|
|
||||||
/* FOR_CHILDREN_OF( tracks, o ) */
|
fl_push_clip( tracks->x(), rulers->y() + rulers->h(), tracks->w(), h() - rulers->h() - hscroll->h() );
|
||||||
/* tracks->update_child( o ); */
|
update_child( *tracks );
|
||||||
|
fl_pop_clip();
|
||||||
|
|
||||||
/* FOR_CHILDREN_OF( rulers, o ) */
|
update_child( *hscroll );
|
||||||
/* rulers->update_child( o ); */
|
update_child( *vscroll );
|
||||||
|
|
||||||
// fl_pop_clip()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
8
Track.C
8
Track.C
|
@ -47,7 +47,11 @@ Track::sort ( void )
|
||||||
void
|
void
|
||||||
Track::draw ( void )
|
Track::draw ( void )
|
||||||
{
|
{
|
||||||
fl_push_clip( x(), y(), w(), h() );
|
|
||||||
|
if ( ! fl_not_clipped( x(), y(), w(), h() ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* fl_push_clip( x(), y(), w(), h() ); */
|
||||||
|
|
||||||
Fl_Group::draw();
|
Fl_Group::draw();
|
||||||
|
|
||||||
|
@ -64,7 +68,7 @@ Track::draw ( void )
|
||||||
for ( list <Track_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
for ( list <Track_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
||||||
(*r)->draw( X, Y, W, H );
|
(*r)->draw( X, Y, W, H );
|
||||||
|
|
||||||
fl_pop_clip();
|
/* fl_pop_clip(); */
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
60
main.C
60
main.C
|
@ -51,59 +51,6 @@
|
||||||
|
|
||||||
Timeline *timeline;
|
Timeline *timeline;
|
||||||
|
|
||||||
void
|
|
||||||
cb_scroll ( Fl_Widget *w, void *v )
|
|
||||||
{
|
|
||||||
Scalebar *sb = (Scalebar*)w;
|
|
||||||
|
|
||||||
if ( sb->zoom_changed() )
|
|
||||||
{
|
|
||||||
// timeline->fpp = sb->zoom() * 256;
|
|
||||||
timeline->fpp = sb->zoom() * 1;
|
|
||||||
|
|
||||||
/* timeline->fpp = max( min( timeline->fpp, 4096.0f ), (float)2 ); */
|
|
||||||
|
|
||||||
int maxx = timeline->ts_to_x( timeline->length );
|
|
||||||
sb->range( 0, maxx );
|
|
||||||
|
|
||||||
// timeline->redraw();
|
|
||||||
timeline->redraw();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
timeline->position( sb->value() );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* timeline->xoffset = timeline->x_to_ts( sb->value() ); */
|
|
||||||
/* // timeline->tracks->redraw(); */
|
|
||||||
/* timeline->scroll->redraw(); */
|
|
||||||
|
|
||||||
printf( "%lu\n", timeline->xoffset );
|
|
||||||
|
|
||||||
/* for ( int i = timeline->tracks->children(); i-- ; ) */
|
|
||||||
/* { */
|
|
||||||
/* Fl_Group *track = (Fl_Group*)timeline->tracks->child( i ); */
|
|
||||||
/* track->damage( FL_DAMAGE_SCROLL ); */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
/* for ( int i = timeline->rulers->children(); i-- ; ) */
|
|
||||||
/* { */
|
|
||||||
/* Fl_Group *track = (Fl_Group*)timeline->rulers->child( i ); */
|
|
||||||
/* track->damage( FL_DAMAGE_SCROLL ); */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* /\* for ( int j = track->children(); j-- ; ) *\/ */
|
|
||||||
/* /\* ((Region*)(track->child( j )))->resize(); *\/ */
|
|
||||||
/* /\* } *\/ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void cb_undo ( Fl_Widget *w, void *v )
|
void cb_undo ( Fl_Widget *w, void *v )
|
||||||
{
|
{
|
||||||
Loggable::undo();
|
Loggable::undo();
|
||||||
|
@ -126,12 +73,7 @@ main ( int argc, char **argv )
|
||||||
/* track1->next( track2 ); */
|
/* track1->next( track2 ); */
|
||||||
/* track2->prev( track1 ); */
|
/* track2->prev( track1 ); */
|
||||||
|
|
||||||
timeline->scrollbar = new Scalebar( 0, 600 - 24, 800, 24 );
|
// timeline->scrollbar = new Scalebar( 0, 600 - 24, 800, 24 );
|
||||||
timeline->scrollbar->range( 0, 48000 * 2 );
|
|
||||||
timeline->scrollbar->zoom_range( 2, 8192 );
|
|
||||||
timeline->scrollbar->zoom( 256 );
|
|
||||||
timeline->scrollbar->type( 1 );
|
|
||||||
timeline->scrollbar->callback( cb_scroll, 0 );
|
|
||||||
|
|
||||||
Fl_Button *o = new Fl_Button( 0, 0, 50, 50, "undo" );
|
Fl_Button *o = new Fl_Button( 0, 0, 50, 50, "undo" );
|
||||||
o->callback( cb_undo, 0 );
|
o->callback( cb_undo, 0 );
|
||||||
|
|
Loading…
Reference in New Issue