Mixer: Improve panner drawing.
This commit is contained in:
parent
363f2f04bc
commit
f5240cb2f4
|
@ -18,9 +18,11 @@
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
||||||
#include "Panner.H"
|
#include "Panner.H"
|
||||||
|
#include <FL/x.H>
|
||||||
|
#include <FL/Fl.H>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
// #include <FL/fl_draw.H>
|
||||||
|
|
||||||
/* 2D Panner widget. Supports various multichannel configurations. */
|
/* 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 );
|
bbox( tx, ty, tw, th );
|
||||||
|
|
||||||
tw -= pw();
|
const float PW = pw();
|
||||||
th -= ph();
|
const float PH = ph();
|
||||||
|
|
||||||
|
tw -= PW;
|
||||||
|
th -= PH;
|
||||||
|
|
||||||
float px, py;
|
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));
|
*X = tx + ((tw / 2) * px + (tw / 2));
|
||||||
*Y = ty + ((th / 2) * py + (th / 2));
|
*Y = ty + ((th / 2) * py + (th / 2));
|
||||||
|
|
||||||
*W = pw();
|
*W = PW;
|
||||||
*H = ph();
|
*H = PH;
|
||||||
}
|
}
|
||||||
|
|
||||||
Panner::Point *
|
Panner::Point *
|
||||||
|
@ -115,36 +120,13 @@ Panner::event_point ( void )
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Panner::draw ( void )
|
Panner::draw_the_box ( int tx, int ty, int tw, int th )
|
||||||
{
|
{
|
||||||
draw_box();
|
draw_box();
|
||||||
// draw_box( FL_FLAT_BOX, x(), y(), w(), h(), FL_BLACK );
|
|
||||||
draw_label();
|
|
||||||
|
|
||||||
|
fl_line_style( FL_SOLID, 2 );
|
||||||
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;
|
|
||||||
|
|
||||||
/* draw perimeter */
|
/* draw perimeter */
|
||||||
{
|
{
|
||||||
|
@ -154,8 +136,8 @@ Panner::draw ( void )
|
||||||
if ( Fl::belowmouse() == this )
|
if ( Fl::belowmouse() == this )
|
||||||
{
|
{
|
||||||
iter = 12;
|
iter = 12;
|
||||||
c1 = fl_darker( FL_RED );
|
c1 = fl_darker( fl_darker( FL_RED ) );
|
||||||
c2 = FL_GRAY;
|
c2 = FL_BLACK;
|
||||||
}
|
}
|
||||||
else
|
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( 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);
|
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 ); */
|
/* fl_arc( tx, ty, tw, th, 0, 360 ); */
|
||||||
|
|
||||||
|
@ -225,23 +250,52 @@ Panner::draw ( void )
|
||||||
int px, py, pw, ph;
|
int px, py, pw, ph;
|
||||||
point_bbox( p, &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_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_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 */
|
/* draw number */
|
||||||
|
@ -258,6 +312,7 @@ Panner::draw ( void )
|
||||||
/* fl_line( bx + pw() / 2, by + ph() / 2, tx + (tw / 2), ty + (th / 2) ); */
|
/* fl_line( bx + pw() / 2, by + ph() / 2, tx + (tw / 2), ty + (th / 2) ); */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
done:
|
||||||
|
|
||||||
fl_pop_clip();
|
fl_pop_clip();
|
||||||
}
|
}
|
||||||
|
@ -281,17 +336,19 @@ Panner::handle ( int m )
|
||||||
redraw();
|
redraw();
|
||||||
return 1;
|
return 1;
|
||||||
case FL_PUSH:
|
case FL_PUSH:
|
||||||
|
{
|
||||||
if ( Fl::event_button2() )
|
if ( Fl::event_button2() )
|
||||||
{
|
{
|
||||||
_bypassed = ! _bypassed;
|
_bypassed = ! _bypassed;
|
||||||
redraw();
|
redraw();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if ( Fl::event_button1() && ( drag = event_point() ) )
|
|
||||||
return 1;
|
if ( Fl::event_button1() )
|
||||||
else
|
drag = event_point();
|
||||||
return 0;
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
case FL_RELEASE:
|
case FL_RELEASE:
|
||||||
if ( Fl::event_button1() && drag )
|
if ( Fl::event_button1() && drag )
|
||||||
{
|
{
|
||||||
|
@ -311,6 +368,10 @@ Panner::handle ( int m )
|
||||||
if ( ! drag )
|
if ( ! drag )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/* else if ( Fl::event_button1() && ( drag = event_point() ) ) */
|
||||||
|
/* return 1; */
|
||||||
|
/* else */
|
||||||
|
|
||||||
float X = Fl::event_x() - x();
|
float X = Fl::event_x() - x();
|
||||||
float Y = Fl::event_y() - y();
|
float Y = Fl::event_y() - y();
|
||||||
|
|
||||||
|
@ -325,7 +386,7 @@ Panner::handle ( int m )
|
||||||
if ( when() & FL_WHEN_CHANGED )
|
if ( when() & FL_WHEN_CHANGED )
|
||||||
do_callback();
|
do_callback();
|
||||||
|
|
||||||
redraw();
|
damage(FL_DAMAGE_EXPOSE);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,8 @@ using namespace std;
|
||||||
class Panner : public Fl_Widget
|
class Panner : public Fl_Widget
|
||||||
{
|
{
|
||||||
|
|
||||||
|
void draw_the_box( int, int, int, int );
|
||||||
|
|
||||||
struct Point
|
struct Point
|
||||||
{
|
{
|
||||||
/* axes */
|
/* axes */
|
||||||
|
|
Loading…
Reference in New Issue