Mixer: Improve appearance of panner/spatialization widget with pixmap background.
This commit is contained in:
parent
a3a8247b83
commit
0c6a3ea0f8
Binary file not shown.
After Width: | Height: | Size: 105 KiB |
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
|
@ -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;
|
||||
|
|
|
@ -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(); */
|
||||
/* } */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
{
|
||||
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
|
||||
|
@ -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 );
|
||||
|
||||
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)(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_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 );
|
||||
|
||||
/* 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();
|
||||
}
|
||||
|
||||
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_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 */
|
||||
|
|
|
@ -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 ( ) { }
|
||||
|
|
|
@ -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' ) )
|
||||
|
||||
|
|
Loading…
Reference in New Issue