diff --git a/mixer/src/Panner.C b/mixer/src/Panner.C index b802388..8dd455a 100644 --- a/mixer/src/Panner.C +++ b/mixer/src/Panner.C @@ -18,9 +18,11 @@ /*******************************************************************************/ #include "Panner.H" - +#include +#include #include #include +// #include /* 2D Panner widget. Supports various multichannel configurations. */ @@ -81,8 +83,11 @@ Panner::point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const bbox( tx, ty, tw, th ); - tw -= pw(); - th -= ph(); + const float PW = pw(); + const float PH = ph(); + + tw -= PW; + th -= PH; float px, py; @@ -91,8 +96,8 @@ Panner::point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const *X = tx + ((tw / 2) * px + (tw / 2)); *Y = ty + ((th / 2) * py + (th / 2)); - *W = pw(); - *H = ph(); + *W = PW; + *H = PH; } Panner::Point * @@ -115,36 +120,13 @@ Panner::event_point ( void ) return NULL; } + void -Panner::draw ( void ) +Panner::draw_the_box ( int tx, int ty, int tw, int th ) { draw_box(); -// draw_box( FL_FLAT_BOX, x(), y(), w(), h(), FL_BLACK ); - draw_label(); - - if ( _bypassed ) - { - fl_color( 0 ); - fl_font( FL_HELVETICA, 12 ); - fl_draw( "(bypass)", x(), y(), w(), h(), FL_ALIGN_CENTER ); - return; - } - - int tw, th, tx, ty; - - bbox( tx, ty, tw, th ); - - fl_push_clip( tx, ty, tw, th ); - - fl_color( FL_RED ); - - const int b = 10; - - tx += b; - ty += b; - tw -= b * 2; - th -= b * 2; + fl_line_style( FL_SOLID, 2 ); /* draw perimeter */ { @@ -154,8 +136,8 @@ Panner::draw ( void ) if ( Fl::belowmouse() == this ) { iter = 12; - c1 = fl_darker( FL_RED ); - c2 = FL_GRAY; + c1 = fl_darker( fl_darker( FL_RED ) ); + c2 = FL_BLACK; } else { @@ -172,11 +154,54 @@ Panner::draw ( void ) fl_arc( tx + (i * (tw / iter)) / 2, ty + (i * (th / iter)) / 2, tw - (i * (tw / iter)), th - (i * ( th / iter )), 0, 360 ); + /* fl_arc( cr, */ + /* tx + tw / 2, */ + /* ty + th / 2, */ + /* ((float)tw / iter) / 2, */ + /* 0, 360 ); */ + c = fl_color_average( c1, c2, (float)i / iter); } } -/* fl_color( FL_WHITE ); */ +} + +void +Panner::draw ( void ) +{ + int tw, th, tx, ty; + + bbox( tx, ty, tw, th ); + + fl_push_clip( tx, ty, tw, th ); + + + const int b = 10; + +// draw_box(); + draw_label(); + + if ( _bypassed ) + { + draw_box(); + fl_color( 0 ); + fl_font( FL_HELVETICA, 12 ); + fl_draw( "(bypass)", x(), y(), w(), h(), FL_ALIGN_CENTER ); + goto done; + } + + + tx += b; + ty += b; + tw -= b * 2; + th -= b * 2; + + if ( damage() & FL_DAMAGE_ALL ) + draw_the_box( tx, ty, tw, th ); + +// fl_color( FL_RED ); + + fl_color( FL_WHITE ); /* fl_arc( tx, ty, tw, th, 0, 360 ); */ @@ -225,23 +250,52 @@ Panner::draw ( void ) int px, py, pw, ph; point_bbox( p, &px, &py, &pw, &ph ); - /* draw point */ - if ( p != drag ) - fl_color( c ); - else - fl_color( FL_WHITE ); - fl_pie( px, py, pw, ph, 0, 360 ); - /* draw echo */ - fl_color( c = fl_darker( c ) ); - fl_arc( px - 5, py - 5, pw + 10, ph + 10, 0, 360 ); - if ( Fl::belowmouse() == this ) { + + const float S = ( 0.5 + ( 1.0f - p->d ) ); + + float po = 5 * S; + + fl_push_clip( px - ( po * 12 ), + py - ( po * 12 ), + pw + ( po * 24 ), ph + (po * 24 )); + + if ( damage() & FL_DAMAGE_EXPOSE ) + draw_the_box( tx, ty, tw, th ); + + fl_color( FL_WHITE ); + + /* draw point */ + if ( p != drag ) + fl_color( c ); + + fl_pie( px, py, pw, ph, 0, 360 ); + + /* draw echo */ fl_color( c = fl_darker( c ) ); - fl_arc( px - 10, py - 10, pw + 20, ph + 20, 0, 360 ); +// fl_color_alpha( c = fl_darker( c ), 0.5 ); + +// fl_arc( cr, px, py, pw + po * 1, 0, 360 ); + fl_arc( px - po, py - po, pw + ( po * 2 ), ph + ( po * 2 ), 0, 360 ); + + if ( Fl::belowmouse() == this ) + { + fl_color( c = fl_darker( c ) ); + +// fl_color_alpha( c = fl_darker( c ), 0.5 ); + fl_arc( px - ( po * 2 ), py - ( po * 2 ), pw + ( po * 4 ), ph + ( po * 4 ), 0, 360 ); + /* fl_arc( cr, px, py, pw + po * 1, 0, 360 ); */ + fl_color( c = fl_darker( c ) ); - fl_arc( px - 30, py - 30, pw + 60, ph + 60, 0, 360 ); + +// fl_color_alpha( c = fl_darker( c ), 0.5 ); + fl_arc( px - ( po * 4 ), py - ( po * 4 ), pw + ( po * 8 ), ph + (po * 8 ), 0, 360 ); + /* fl_arc( cr, px, py, pw + po * 1, 0, 360 ); */ + } + + fl_pop_clip(); } /* draw number */ @@ -258,6 +312,7 @@ Panner::draw ( void ) /* fl_line( bx + pw() / 2, by + ph() / 2, tx + (tw / 2), ty + (th / 2) ); */ } +done: fl_pop_clip(); } @@ -281,17 +336,19 @@ Panner::handle ( int m ) redraw(); return 1; case FL_PUSH: - + { if ( Fl::event_button2() ) { _bypassed = ! _bypassed; redraw(); return 1; } - else if ( Fl::event_button1() && ( drag = event_point() ) ) - return 1; - else - return 0; + + if ( Fl::event_button1() ) + drag = event_point(); + + return 1; + } case FL_RELEASE: if ( Fl::event_button1() && drag ) { @@ -311,6 +368,10 @@ Panner::handle ( int m ) if ( ! drag ) return 0; + /* else if ( Fl::event_button1() && ( drag = event_point() ) ) */ + /* return 1; */ + /* else */ + float X = Fl::event_x() - x(); float Y = Fl::event_y() - y(); @@ -325,7 +386,7 @@ Panner::handle ( int m ) if ( when() & FL_WHEN_CHANGED ) do_callback(); - redraw(); + damage(FL_DAMAGE_EXPOSE); return 1; } diff --git a/mixer/src/Panner.H b/mixer/src/Panner.H index 910ec26..08943c0 100644 --- a/mixer/src/Panner.H +++ b/mixer/src/Panner.H @@ -31,6 +31,8 @@ using namespace std; class Panner : public Fl_Widget { + void draw_the_box( int, int, int, int ); + struct Point { /* axes */