| @@ -31,11 +31,16 @@ class Scalebar : public Fl_Scrollbar | |||||
| bool _zoom_changed; | bool _zoom_changed; | ||||
| double _zoom_min; | |||||
| double _zoom_max; | |||||
| public: | public: | ||||
| Scalebar ( int X, int Y, int W, int H ) : Fl_Scrollbar ( X, Y, W, H ) | Scalebar ( int X, int Y, int W, int H ) : Fl_Scrollbar ( X, Y, W, H ) | ||||
| { | { | ||||
| _zoom = 1.0f; | _zoom = 1.0f; | ||||
| _zoom_min = 0; | |||||
| _zoom_max = 256; | |||||
| _zoom_changed = true; | _zoom_changed = true; | ||||
| step( 1 ); | step( 1 ); | ||||
| @@ -44,6 +49,7 @@ public: | |||||
| bool zoom_changed ( void ) const { return _zoom_changed; } | bool zoom_changed ( void ) const { return _zoom_changed; } | ||||
| double zoom ( void ) const { return _zoom; } | double zoom ( void ) const { return _zoom; } | ||||
| double value ( void ) const { return Fl_Slider::value(); } | double value ( void ) const { return Fl_Slider::value(); } | ||||
| void zoom_range ( double zmin, double zmax ) { _zoom_min = zmin; _zoom_max = zmax; } | |||||
| int | int | ||||
| handle ( int m ) | handle ( int m ) | ||||
| @@ -54,6 +60,8 @@ public: | |||||
| { | { | ||||
| int d = Fl::event_dy(); | int d = Fl::event_dy(); | ||||
| double z = _zoom; | |||||
| if ( d < 0 ) | if ( d < 0 ) | ||||
| while ( d++ ) | while ( d++ ) | ||||
| _zoom /= 2; | _zoom /= 2; | ||||
| @@ -61,11 +69,20 @@ public: | |||||
| while ( d-- ) | while ( d-- ) | ||||
| _zoom *= 2; | _zoom *= 2; | ||||
| _zoom_changed = true; | |||||
| do_callback(); | |||||
| _zoom_changed = false; | |||||
| if ( _zoom > _zoom_max ) | |||||
| _zoom = _zoom_max; | |||||
| else | |||||
| if ( _zoom < _zoom_min ) | |||||
| _zoom = _zoom_min; | |||||
| if ( z != _zoom ) | |||||
| { | |||||
| _zoom_changed = true; | |||||
| do_callback(); | |||||
| _zoom_changed = false; | |||||
| slider_size( w() / maximum() ); | |||||
| slider_size( w() / maximum() ); | |||||
| } | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| @@ -24,6 +24,8 @@ | |||||
| #include <FL/Fl_Scrollbar.H> | #include <FL/Fl_Scrollbar.H> | ||||
| #include <FL/Fl_Widget.H> | #include <FL/Fl_Widget.H> | ||||
| #include "Scalebar.H" | |||||
| #include "Audio_File.H" // just for nframes_t | #include "Audio_File.H" // just for nframes_t | ||||
| #include <math.h> | #include <math.h> | ||||
| @@ -60,7 +62,7 @@ struct Timeline : public Fl_Group | |||||
| Fl_Scroll *scroll; | Fl_Scroll *scroll; | ||||
| Fl_Pack *tracks; | Fl_Pack *tracks; | ||||
| Fl_Pack *rulers; | Fl_Pack *rulers; | ||||
| Fl_Scrollbar *scrollbar; | |||||
| Scalebar *scrollbar; | |||||
| Tempo_Track *tempo_track; | Tempo_Track *tempo_track; | ||||
| Time_Track *time_track; | Time_Track *time_track; | ||||
| @@ -58,8 +58,10 @@ cb_scroll ( Fl_Widget *w, void *v ) | |||||
| if ( sb->zoom_changed() ) | if ( sb->zoom_changed() ) | ||||
| { | { | ||||
| timeline->fpp = sb->zoom() * 256; | |||||
| timeline->fpp = max( min( timeline->fpp, 4096.0f ), (float)2 ); | |||||
| // 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 ); | int maxx = timeline->ts_to_x( timeline->length ); | ||||
| sb->range( 0, maxx ); | sb->range( 0, maxx ); | ||||
| @@ -121,6 +123,7 @@ main ( int argc, char **argv ) | |||||
| 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->range( 0, 48000 * 2 ); | ||||
| timeline->scrollbar->zoom_range( 2, 8192 ); | |||||
| timeline->scrollbar->type( 1 ); | timeline->scrollbar->type( 1 ); | ||||
| timeline->scrollbar->callback( cb_scroll, 0 ); | timeline->scrollbar->callback( cb_scroll, 0 ); | ||||