Mixer: Improve appearance of panner/spatialization widget with pixmap background.

This commit is contained in:
Jonathan Moore Liles 2013-06-21 17:23:17 -07:00
parent a3a8247b83
commit 0c6a3ea0f8
8 changed files with 67 additions and 208 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -269,9 +269,9 @@ Controller_Module::connect_spatializer_to ( Module *m )
{
clear();
Panner *o = new Panner( 0,0, 100, 100 );
Panner *o = new Panner( 0,0, 92,92 );
o->box(FL_THIN_UP_BOX);
o->box(FL_FLAT_BOX);
o->color(FL_GRAY0);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
@ -756,7 +756,7 @@ Controller_Module::handle ( int m )
if ( Fl::event_button3() )
{
/* context menu */
if ( type() != SPATIALIZATION )
/* if ( type() != SPATIALIZATION ) */
menu_popup( &menu() );
return 1;

View File

@ -506,7 +506,7 @@ Mixer_Strip::init ( )
o->hide();
o->label( 0 );
o->pad( false );
o->size( 100, 100 );
o->size( 92,92 );
}
/* o->end(); */
/* } */

View File

@ -305,8 +305,8 @@ Module_Parameter_Editor::make_controls ( void )
if ( azimuth_port_number >= 0 && elevation_port_number >= 0 )
{
Panner *o = new Panner( 0,0, 300, 300 );
o->box(FL_THIN_UP_BOX);
Panner *o = new Panner( 0,0, 512,512 );
o->box(FL_FLAT_BOX);
o->color(FL_GRAY0);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);

View File

@ -24,57 +24,12 @@
#include <math.h>
// #include <FL/fl_draw.H>
#include <FL/Fl_Shared_Image.H>
/* 2D Panner widget. Supports various multichannel configurations. */
Panner::Point *Panner::drag;
/* multichannel layouts, in degrees */
int Panner::_configs[][12] =
{
/* none, error condition? */
{ NONE },
/* mono, panner disabled */
{ NONE },
/* stereo */
{ L, R },
/* stereo + mono */
{ L, R, C },
/* quad */
{ FL, FR, RL, RR },
/* 5.1 */
{ FL, FR, RL, RR, C },
/* no such config */
{ NONE },
/* 7.1 */
{ FL, FR, RL, RR, C, L, R },
};
/* speaker symbol */
#define BP fl_begin_polygon()
#define EP fl_end_polygon()
#define BCP fl_begin_complex_polygon()
#define ECP fl_end_complex_polygon()
#define BL fl_begin_line()
#define EL fl_end_line()
#define BC fl_begin_loop()
#define EC fl_end_loop()
#define vv(x,y) fl_vertex(x,y)
static void draw_speaker ( Fl_Color col )
{
fl_color(col);
BP; vv(0.2,0.4); vv(0.6,0.4); vv(0.6,-0.4); vv(0.2,-0.4); EP;
BP; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EP;
fl_color( fl_darker( col ) );
BC; vv(0.2,0.4); vv(0.6,0.4); vv(0.6,-0.4); vv(0.2,-0.4); EC;
BC; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EC;
}
/** set X, Y, W, and H to the bounding box of point /p/ in screen coords */
void
Panner::point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const
@ -126,46 +81,18 @@ Panner::draw_the_box ( int tx, int ty, int tw, int th )
{
draw_box();
fl_line_style( FL_SOLID, 2 );
/* draw perimeter */
if ( tw == 92 )
{
Fl_Color c1, c2;
int iter;
Fl_Image *i = Fl_Shared_Image::get( PIXMAP_PATH "/non-mixer/panner-92x92.png" );
if ( Fl::belowmouse() == this )
i->draw( tx, ty );
}
else if ( tw > 400 )
{
iter = 12;
c1 = fl_darker( fl_darker( FL_RED ) );
c2 = FL_BLACK;
Fl_Image *i = Fl_Shared_Image::get( PIXMAP_PATH "/non-mixer/panner-512x512.png" );
i->draw( tx, ty );
}
else
{
iter = 6;
c1 = FL_GRAY;
c2 = FL_BLACK;
}
Fl_Color c = c1;
for ( int i = iter; i--; )
{
fl_color( c );
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_line_style( FL_SOLID, 0 );
}
void
@ -175,8 +102,9 @@ Panner::draw ( void )
bbox( tx, ty, tw, th );
fl_push_clip( tx, ty, tw, th );
fl_push_clip( x(),y(),w(),h() );
draw_the_box( tx, ty, tw, th );
const int b = 10;
@ -193,69 +121,26 @@ Panner::draw ( void )
}
tx += b;
ty += b;
tw -= b * 2;
th -= b * 2;
/* tx += b; */
/* ty += b; */
/* tw -= b * 2; */
/* th -= b * 2; */
if ( damage() & FL_DAMAGE_ALL )
draw_the_box( tx, ty, tw, th );
fl_line_style( FL_SOLID, 2 );
// fl_color( FL_RED );
fl_line_style( FL_SOLID, 1 );
fl_color( FL_WHITE );
/* fl_arc( tx, ty, tw, th, 0, 360 ); */
if ( _configs[ _outs ][0] >= 0 )
{
for ( int i = _outs; i--; )
{
int a = _configs[ _outs ][ i ];
Point *p = &_points[0];
Point p( 1.2f, (float)a );
// Fl_Color c = (Fl_Color)(10 + i);
float px, py;
p.axes( &px, &py );
fl_push_matrix();
const int bx = tx + ((tw / 2) * px + (tw / 2));
const int by = ty + ((th / 2) * py + (th / 2));
fl_translate( bx, by );
fl_scale( 5, 5 );
a = 90 - a;
fl_rotate( a );
draw_speaker( FL_WHITE );
fl_rotate( -a );
fl_pop_matrix();
}
}
/* ensure that points are drawn *inside* the circle */
for ( int i = _ins; i--; )
{
Point *p = &_points[ i ];
Fl_Color c = (Fl_Color)(10 + i);
Fl_Color c = fl_color_add_alpha( fl_rgb_color( 192, 192, 206 ), 127 );
int px, py, pw, ph;
point_bbox( p, &px, &py, &pw, &ph );
{
const float S = ( 0.5 + ( 1.0f - p->d ) );
@ -266,56 +151,36 @@ Panner::draw ( void )
py - ( po * 12 ),
pw + ( po * 24 ), ph + (po * 24 ));
if ( damage() & FL_DAMAGE_EXPOSE )
draw_the_box( tx, ty, tw, th );
fl_color( fl_color_add_alpha( fl_rgb_color( 254,254,254 ), 254 ) );
fl_color( FL_WHITE );
fl_pie( px + 5, py + 5, pw - 10, ph - 10, 0, 360 );
/* draw point */
if ( p != drag )
fl_color( c );
fl_color(c);
fl_pie( px, py, pw, ph, 0, 360 );
/* draw echo */
fl_color( c = fl_darker( c ) );
// 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 )
{
/* draw echo */
fl_color( c = fl_darker( c ) );
fl_arc( px - po, py - po, pw + ( po * 2 ), ph + ( po * 2 ), 0, 360 );
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_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 */
char pat[4];
snprintf( pat, 4, "%d", i + 1 );
const char *s = p->label;
fl_color( FL_BLACK );
fl_color( fl_rgb_color( 125,125,130 ) );
fl_font( FL_HELVETICA, ph + 2 );
fl_draw( pat, px + 1, py + 1, pw - 1, ph - 1, FL_ALIGN_CENTER );
/* draw line */
/* fl_color( FL_WHITE ); */
/* fl_line( bx + pw() / 2, by + ph() / 2, tx + (tw / 2), ty + (th / 2) ); */
fl_draw( s, px + 20, py + 1, 50, ph - 1, FL_ALIGN_LEFT );
}
done:
fl_line_style( FL_SOLID, 0 );
@ -378,12 +243,13 @@ Panner::handle ( int m )
/* return 1; */
/* else */
float X = Fl::event_x() - x();
float Y = Fl::event_y() - y();
int tx, ty, tw, th;
bbox( tx, ty, tw, th );
float X = Fl::event_x() - tx;
float Y = Fl::event_y() - ty;
/* if ( _outs < 3 ) */
/* drag->angle( (float)(X / (tw / 2)) - 1.0f, 0.0f ); */
/* else */

View File

@ -42,8 +42,10 @@ class Panner : public Fl_Widget
/* angle */
float a;
Point ( ) : d( 0.0f ), a( 0.0f ) { }
Point ( float D, float A ) : d( D ), a( A ) { }
const char *label;
Point ( ) : d( 0.0f ), a( 0.0f ), label(0) { }
Point ( float D, float A ) : d( D ), a( A ), label(0) { }
/** translate angle /a/ into x/y coords and place the result in /X/ and /Y/ */
void
@ -132,8 +134,8 @@ class Panner : public Fl_Widget
vector <Point> _points;
static int pw ( void ) { return 12; }
static int ph ( void ) { return 12; }
static int pw ( void ) { return 16; }
static int ph ( void ) { return 16; }
static int _configs[][12];
@ -143,6 +145,15 @@ class Panner : public Fl_Widget
H = h() - Fl::box_dh( box() );
X = x() + Fl::box_dx( box() );
Y = y() + Fl::box_dy( box() );
int S = W > H ? H : W;
if ( W > H )
X += ( (W/2) - (S/2) );
else if ( H > W )
Y += ( (H/2) - (S/2) );
W = H = S;
}
void point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const;
@ -150,17 +161,6 @@ class Panner : public Fl_Widget
Point * event_point ( void );
Point angle_to_axes ( float a );
enum {
NONE = -1,
R = 90,
L = 270,
C = 0,
FL = 315,
FR = 45,
RL = 225,
RR = 135,
};
static Point * drag;
protected:
@ -180,16 +180,7 @@ public:
_outs = 1;
// _ins = _outs = 4;
// _points.push_back( Point( 1, FL ) );
_points.push_back( Point( 1, C ) );
/* _points.push_back( Point( 1, FR ) ); */
/* _points.push_back( Point( 1, RL ) ); */
/* _points.push_back( Point( 1, RR ) ); */
_points.push_back( Point( 1, 0 ) );
}
virtual ~Panner ( ) { }

View File

@ -92,6 +92,8 @@ src/main.C
cwd=start_dir, relative_trick=True)
bld.install_as('${DATADIR}/pixmaps/' + APPNAME + '/icon-256x256.png', 'icons/hicolor/256x256/apps/' + APPNAME + '.png')
bld.install_as('${DATADIR}/pixmaps/' + APPNAME + '/panner-512x125.png', 'pixmaps/panner-512x512.png')
bld.install_as('${DATADIR}/pixmaps/' + APPNAME + '/panner-92x125.png', 'pixmaps/panner-92x92.png')
bld.install_files( '/'.join( [ '${DATADIR}/doc', APPNAME ] ), bld.path.ant_glob( 'doc/*.html doc/*.png' ) )