Browse Source

Mixer: Improve panner drawing.

tags/non-daw-v1.2.0
Jonathan Moore Liles 13 years ago
parent
commit
f5240cb2f4
2 changed files with 115 additions and 52 deletions
  1. +113
    -52
      mixer/src/Panner.C
  2. +2
    -0
      mixer/src/Panner.H

+ 113
- 52
mixer/src/Panner.C 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;
}


+ 2
- 0
mixer/src/Panner.H 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 */


Loading…
Cancel
Save