Mixer: Improve panner drawing.

This commit is contained in:
Jonathan Moore Liles 2012-04-25 20:31:12 -07:00
parent 363f2f04bc
commit f5240cb2f4
2 changed files with 115 additions and 52 deletions

View File

@ -18,9 +18,11 @@
/*******************************************************************************/
#include "Panner.H"
#include <FL/x.H>
#include <FL/Fl.H>
#include <stdio.h>
#include <math.h>
// #include <FL/fl_draw.H>
/* 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;
}

View File

@ -31,6 +31,8 @@ using namespace std;
class Panner : public Fl_Widget
{
void draw_the_box( int, int, int, int );
struct Point
{
/* axes */