Browse Source

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

tags/non-daw-v1.2.0
Jonathan Moore Liles 12 years ago
parent
commit
0c6a3ea0f8
8 changed files with 67 additions and 208 deletions
  1. BIN
      mixer/pixmaps/panner-512x512.png
  2. BIN
      mixer/pixmaps/panner-92x92.png
  3. +3
    -3
      mixer/src/Controller_Module.C
  4. +1
    -1
      mixer/src/Mixer_Strip.C
  5. +2
    -2
      mixer/src/Module_Parameter_Editor.C
  6. +43
    -177
      mixer/src/Panner.C
  7. +16
    -25
      mixer/src/Panner.H
  8. +2
    -0
      mixer/wscript

BIN
mixer/pixmaps/panner-512x512.png View File

Before After
Width: 512  |  Height: 512  |  Size: 105KB

BIN
mixer/pixmaps/panner-92x92.png View File

Before After
Width: 92  |  Height: 92  |  Size: 8.6KB

+ 3
- 3
mixer/src/Controller_Module.C View File

@@ -269,9 +269,9 @@ Controller_Module::connect_spatializer_to ( Module *m )
{ {
clear(); 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->color(FL_GRAY0);
o->selection_color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL); o->labeltype(FL_NORMAL_LABEL);
@@ -756,7 +756,7 @@ Controller_Module::handle ( int m )
if ( Fl::event_button3() ) if ( Fl::event_button3() )
{ {
/* context menu */ /* context menu */
if ( type() != SPATIALIZATION )
/* if ( type() != SPATIALIZATION ) */
menu_popup( &menu() ); menu_popup( &menu() );


return 1; return 1;


+ 1
- 1
mixer/src/Mixer_Strip.C View File

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


+ 2
- 2
mixer/src/Module_Parameter_Editor.C View File

@@ -305,8 +305,8 @@ Module_Parameter_Editor::make_controls ( void )


if ( azimuth_port_number >= 0 && elevation_port_number >= 0 ) 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->color(FL_GRAY0);
o->selection_color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL); o->labeltype(FL_NORMAL_LABEL);


+ 43
- 177
mixer/src/Panner.C View File

@@ -24,57 +24,12 @@
#include <math.h> #include <math.h>
// #include <FL/fl_draw.H> // #include <FL/fl_draw.H>


#include <FL/Fl_Shared_Image.H>

/* 2D Panner widget. Supports various multichannel configurations. */ /* 2D Panner widget. Supports various multichannel configurations. */


Panner::Point *Panner::drag; 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 */ /** set X, Y, W, and H to the bounding box of point /p/ in screen coords */
void void
Panner::point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const 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(); draw_box();


fl_line_style( FL_SOLID, 2 );

/* draw perimeter */
{
Fl_Color c1, c2;
int iter;

if ( Fl::belowmouse() == this )
{
iter = 12;
c1 = fl_darker( fl_darker( FL_RED ) );
c2 = FL_BLACK;
}
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 );

if ( tw == 92 )
{
Fl_Image *i = Fl_Shared_Image::get( PIXMAP_PATH "/non-mixer/panner-92x92.png" );
i->draw( tx, ty );
}
else if ( tw > 400 )
{
Fl_Image *i = Fl_Shared_Image::get( PIXMAP_PATH "/non-mixer/panner-512x512.png" );
i->draw( tx, ty );
}
} }


void void
@@ -175,8 +102,9 @@ Panner::draw ( void )


bbox( tx, ty, tw, th ); 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; 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_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( 1.2f, (float)a );

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 ];
Point *p = &_points[0];


Fl_Color c = (Fl_Color)(10 + 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; int px, py, pw, ph;
point_bbox( p, &px, &py, &pw, &ph ); point_bbox( p, &px, &py, &pw, &ph );




{ {


const float S = ( 0.5 + ( 1.0f - p->d ) ); const float S = ( 0.5 + ( 1.0f - p->d ) );
@@ -266,56 +151,36 @@ Panner::draw ( void )
py - ( po * 12 ), py - ( po * 12 ),
pw + ( po * 24 ), ph + (po * 24 )); 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_pie( px + 5, py + 5, pw - 10, ph - 10, 0, 360 );

fl_color(c);


fl_color( FL_WHITE );
/* draw point */
if ( p != drag )
fl_color( c );
fl_pie( px, py, pw, ph, 0, 360 ); 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 ) 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( 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( 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(); fl_pop_clip();
} }
const char *s = p->label;


/* draw number */
char pat[4];
snprintf( pat, 4, "%d", i + 1 );

fl_color( FL_BLACK );
fl_color( fl_rgb_color( 125,125,130 ) );
fl_font( FL_HELVETICA, ph + 2 ); 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: done:


fl_line_style( FL_SOLID, 0 ); fl_line_style( FL_SOLID, 0 );
@@ -378,12 +243,13 @@ Panner::handle ( int m )
/* return 1; */ /* return 1; */
/* else */ /* else */


float X = Fl::event_x() - x();
float Y = Fl::event_y() - y();


int tx, ty, tw, th; int tx, ty, tw, th;
bbox( tx, ty, tw, th ); bbox( tx, ty, tw, th );


float X = Fl::event_x() - tx;
float Y = Fl::event_y() - ty;

/* if ( _outs < 3 ) */ /* if ( _outs < 3 ) */
/* drag->angle( (float)(X / (tw / 2)) - 1.0f, 0.0f ); */ /* drag->angle( (float)(X / (tw / 2)) - 1.0f, 0.0f ); */
/* else */ /* else */


+ 16
- 25
mixer/src/Panner.H View File

@@ -42,8 +42,10 @@ class Panner : public Fl_Widget
/* angle */ /* angle */
float a; 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/ */ /** translate angle /a/ into x/y coords and place the result in /X/ and /Y/ */
void void
@@ -132,8 +134,8 @@ class Panner : public Fl_Widget


vector <Point> _points; 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]; static int _configs[][12];


@@ -143,6 +145,15 @@ class Panner : public Fl_Widget
H = h() - Fl::box_dh( box() ); H = h() - Fl::box_dh( box() );
X = x() + Fl::box_dx( box() ); X = x() + Fl::box_dx( box() );
Y = y() + Fl::box_dy( 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; 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 * event_point ( void );
Point angle_to_axes ( float a ); 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; static Point * drag;


protected: protected:
@@ -180,16 +180,7 @@ public:


_outs = 1; _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 ( ) { } virtual ~Panner ( ) { }


+ 2
- 0
mixer/wscript View File

@@ -92,6 +92,8 @@ src/main.C
cwd=start_dir, relative_trick=True) 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 + '/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' ) ) bld.install_files( '/'.join( [ '${DATADIR}/doc', APPNAME ] ), bld.path.ant_glob( 'doc/*.html doc/*.png' ) )




Loading…
Cancel
Save