Browse Source

Mixer: Improve knob and slider appearance.

tags/non-daw-v1.2.0
Jonathan Moore Liles 10 years ago
parent
commit
550fb651c7
10 changed files with 419 additions and 129 deletions
  1. +111
    -0
      FL/Fl_DialX.C
  2. +36
    -0
      FL/Fl_DialX.H
  3. +120
    -0
      FL/Fl_SliderX.C
  4. +37
    -0
      FL/Fl_SliderX.H
  5. +54
    -34
      FL/Fl_Value_SliderX.C
  6. +33
    -35
      FL/Fl_Value_SliderX.H
  7. +2
    -0
      FL/wscript
  8. +4
    -4
      mixer/src/Controller_Module.C
  9. +8
    -45
      mixer/src/Mixer.C
  10. +14
    -11
      mixer/src/Module_Parameter_Editor.C

+ 111
- 0
FL/Fl_DialX.C View File

@@ -0,0 +1,111 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "Fl_DialX.H"
#include <FL/Fl.H>
#include <FL/fl_draw.H>

void
Fl_DialX::draw ( void )
{
int X,Y,S;

{
int ox, oy, ww, hh, side;
ox = x();
oy = y();
ww = w();
hh = h();
if (ww > hh)
{
side = hh;
ox = ox + (ww - side) / 2;
}
else
{
side = ww;
oy = oy + (hh - side) / 2;
}
side = w() > h() ? hh : ww;

X = ox;
Y = oy;
S = side;
}

draw_box();
draw_label();

double angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1();

fl_draw_box( box(), X, Y, S, S, color() );
/* shrink a bit */
int OX = x();
int OY = y();
X += S / 8;
Y += S / 8;
int OS = S;
S -= S / 4;
fl_line_style( FL_SOLID, S / 12 );
/* background arc */
fl_color( fl_darker( color() ) );
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle2() );
/* foreground arc */
fl_color( selection_color() );
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle );


fl_line_style( FL_SOLID, 0 );
if ( active_r() )
{
int W = OS;
int H = OS;

fl_push_matrix();
fl_translate(OX+W/2, OY+H/2);
fl_scale(W, H);
fl_rotate(310+angle);
fl_color( fl_color_add_alpha( FL_WHITE, 127 ));
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.12); fl_end_polygon();
fl_color( FL_WHITE );
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.06); fl_end_polygon();
fl_pop_matrix();
}
fl_color( fl_contrast( labelcolor(), color() ) );
if ( Fl::belowmouse() == this )
{
char s[10];
fl_font( FL_HELVETICA, 10 );
snprintf( s, sizeof( s ), "%.1f", value() );

fl_color( FL_FOREGROUND_COLOR );
fl_draw( s, X, Y, S, S, FL_ALIGN_CENTER );
}
}

+ 36
- 0
FL/Fl_DialX.H View File

@@ -0,0 +1,36 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Dial.H>

class Fl_DialX : public Fl_Dial
{

public:

Fl_DialX ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Dial(X,Y,W,H,L)
{
}

virtual void draw ( void );
virtual ~Fl_DialX() { }
};

+ 120
- 0
FL/Fl_SliderX.C View File

@@ -0,0 +1,120 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "Fl_SliderX.H"
#include <FL/Fl.H>
#include <FL/fl_draw.H>

void
Fl_SliderX::draw ( int X, int Y, int W, int H)
{
if (damage()&FL_DAMAGE_ALL) draw_box();
double val;

if (minimum() == maximum())
val = 0.5;
else {
val = (value()-minimum())/(maximum()-minimum());
if (val > 1.0) val = 1.0;
else if (val < 0.0) val = 0.0;
}

int ww = (horizontal() ? W : H);
int hh = (horizontal() ? H : W);
int xx, S;
/* S = int(val*ww+.5); */
/* if (minimum()>maximum()) {S = ww-S; xx = ww-S;} */
/* else xx = 0; */
{
//S = //int(ww+.5);
S = hh;
int T = (horizontal() ? H : W)/2+1;
// if (type()==FL_VERT_NICE_SLIDER || type()==FL_HOR_NICE_SLIDER) T += 4;
if (S < T) S = T;
xx = int(val*(ww-S)+.5);
}

int xsl, ysl, wsl, hsl;
if (horizontal()) {
xsl = X+xx;
wsl = S;
ysl = Y + hh/2;
hsl = hh/4;
} else {
ysl = Y+xx;
hsl = S;
xsl = X + hh/2;
wsl = hh/4;
}

{
fl_push_clip(X, Y, W, H);
draw_box();
fl_pop_clip();
Fl_Color black = active_r() ? FL_BLACK : FL_INACTIVE_COLOR;
}
//draw_bg(X, Y, W, H);

fl_line_style( FL_SOLID, hh/6 );
fl_color( fl_darker(color()) );

if ( horizontal() )
fl_line ( X + S/2, Y + hh/2, X + W - S/2, Y + hh/2 );
else
fl_line ( X + hh/2, Y + S/2, X + hh/2, Y + H - S/2 );

fl_color( selection_color() );

if ( horizontal() )
fl_line ( X + S/2, ysl, xsl + S/2, ysl );
else
fl_line ( X + S/2, Y + H - S/2, xsl, ysl + (S/2) );
fl_line_style( FL_SOLID, 0 );

fl_push_matrix();
if ( horizontal() )
fl_translate( xsl + (hh/2), ysl);
else
fl_translate( xsl, ysl + (hh/2) );

fl_color( fl_color_add_alpha( FL_WHITE, 127 ));
fl_begin_polygon(); fl_circle(0.0,0.0, hh/3); fl_end_polygon();
fl_color( FL_WHITE );
fl_begin_polygon(); fl_circle(0.0,0.0, hh/6); fl_end_polygon();
fl_pop_matrix();
draw_label(xsl, ysl, wsl, hsl);

if (Fl::focus() == this) {
draw_focus();
}

/* draw(x()+Fl::box_dx(box()), */
/* y()+Fl::box_dy(box()), */
/* w()-Fl::box_dw(box()), */
/* h()-Fl::box_dh(box())); */

}

+ 37
- 0
FL/Fl_SliderX.H View File

@@ -0,0 +1,37 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Slider.H>

class Fl_SliderX : public Fl_Slider
{

public:

Fl_SliderX( int X, int Y, int W, int H, const char *L=0 ) : Fl_Slider(X,Y,W,H,L)
{
}

virtual ~Fl_SliderX ( ) { };

virtual void draw ( int X, int Y, int W, int H );
virtual void draw ( void ) { draw(x(),y(),w(),h()); }
};

+ 54
- 34
FL/Fl_Value_SliderX.C View File

@@ -20,38 +20,58 @@

#include "Fl_Value_SliderX.H"

int Fl_Value_SliderX::_default_style = NICE_SLIDER;

void
Fl_Value_SliderX::draw ( void )
{
switch ( _default_style )
{
case NICE_SLIDER:
{
if ( FL_HORIZONTAL == _type )
Fl_Value_Slider::type( FL_HOR_NICE_SLIDER );
else
Fl_Value_Slider::type( FL_VERT_NICE_SLIDER );
break;
}
case FILL_SLIDER:
{
if ( FL_HORIZONTAL == _type )
Fl_Value_Slider::type( FL_HOR_FILL_SLIDER );
else
Fl_Value_Slider::type( FL_VERT_FILL_SLIDER );
break;
}
case SIMPLE_SLIDER:
{
if ( FL_HORIZONTAL == _type )
Fl_Value_Slider::type( FL_HOR_SLIDER );
else
Fl_Value_Slider::type( FL_VERT_SLIDER );
break;
}
}

Fl_Value_Slider::draw();
#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <math.h>

/**
Creates a new Fl_Value_SliderX widget using the given
position, size, and label string. The default boxtype is FL_DOWN_BOX.
*/
Fl_Value_SliderX::Fl_Value_SliderX(int X, int Y, int W, int H, const char*l)
: Fl_SliderX(X,Y,W,H,l) {
step(1,100);
textfont_ = FL_HELVETICA;
textsize_ = 10;
textcolor_ = FL_FOREGROUND_COLOR;
}

void Fl_Value_SliderX::draw() {
int sxx = x(), syy = y(), sww = w(), shh = h();
int bxx = x(), byy = y(), bww = w(), bhh = h();
if (horizontal()) {
bww = 35; sxx += 35; sww -= 35;
} else {
syy += 25; bhh = 25; shh -= 25;
}
if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color());
Fl_SliderX::draw(sxx+Fl::box_dx(box()),
syy+Fl::box_dy(box()),
sww-Fl::box_dw(box()),
shh-Fl::box_dh(box()));
draw_box(box(),bxx,byy,bww,bhh,color());
char buf[128];
format(buf);
fl_font(textfont(), textsize());
fl_color(active_r() ? textcolor() : fl_inactive(textcolor()));
fl_draw(buf, bxx, byy, bww, bhh, FL_ALIGN_CLIP);
}

int Fl_Value_SliderX::handle(int event) {
if (event == FL_PUSH && Fl::visible_focus()) {
Fl::focus(this);
redraw();
}
int sxx = x(), syy = y(), sww = w(), shh = h();
if (horizontal()) {
sxx += 35; sww -= 35;
} else {
syy += 25; shh -= 25;
}
return Fl_SliderX::handle(event,
sxx+Fl::box_dx(box()),
syy+Fl::box_dy(box()),
sww-Fl::box_dw(box()),
shh-Fl::box_dh(box()));
}


+ 33
- 35
FL/Fl_Value_SliderX.H View File

@@ -17,41 +17,39 @@
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

/* just like an Fl_Value_Slider, except that it responds to mousewheel events */

#pragma once

#include <FL/Fl_Value_Slider.H>
#include <FL/Fl.H>
#include <math.h>

class Fl_Value_SliderX : public Fl_Value_Slider
{
static int _default_style;

int _type;

#ifndef Fl_Value_SliderX_H
#define Fl_Value_SliderX_H

#include "Fl_SliderX.H"

/**
The Fl_Value_SliderX widget is a Fl_SliderX widget
with a box displaying the current value.
<P ALIGN=CENTER>\image html value_slider.png
\image latex value_slider.png "Fl_Value_SliderX" width=4cm
*/
class FL_EXPORT Fl_Value_SliderX : public Fl_SliderX {
Fl_Font textfont_;
Fl_Fontsize textsize_;
Fl_Color textcolor_;
protected:
void draw();
public:
int handle(int);
Fl_Value_SliderX(int x,int y,int w,int h, const char *l = 0);
/** Gets the typeface of the text in the value box. */
Fl_Font textfont() const {return textfont_;}
/** Sets the typeface of the text in the value box. */
void textfont(Fl_Font s) {textfont_ = s;}
/** Gets the size of the text in the value box. */
Fl_Fontsize textsize() const {return textsize_;}
/** Sets the size of the text in the value box. */
void textsize(Fl_Fontsize s) {textsize_ = s;}
/** Gets the color of the text in the value box. */
Fl_Color textcolor() const {return textcolor_;}
/** Sets the color of the text in the value box. */
void textcolor(Fl_Color s) {textcolor_ = s;}
};

enum
{
NICE_SLIDER,
SIMPLE_SLIDER,
FILL_SLIDER
};

static void default_style ( int n ) { Fl_Value_SliderX::_default_style = n; }

int type ( void ) const { return _type; }
void type ( int v ) { _type = v; }

Fl_Value_SliderX ( int X, int Y, int W, int H, const char *L = 0 )
: Fl_Value_Slider( X, Y, W, H, L )
{
}

virtual ~Fl_Value_SliderX() { }
#endif

virtual void draw ( void );
};

+ 2
- 0
FL/wscript View File

@@ -15,6 +15,8 @@ Fl_Menu_Settings.C
Fl_Scalepack.C
Fl_Text_Edit_Window.fl
Fl_Value_SliderX.C
Fl_DialX.C
Fl_SliderX.C
New_Project_Dialog.fl
event_name.C
menu_popup.C


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

@@ -31,7 +31,7 @@
#include <FL/Fl_Menu_.H>
#include <FL/Fl_Light_Button.H>
#include <FL/fl_draw.H>
#include "FL/Fl_Dial.H"
#include "FL/Fl_DialX.H"
#include "FL/Fl_Labelpad_Group.H"
#include "FL/Fl_Value_SliderX.H"
#include "Panner.H"
@@ -362,8 +362,8 @@ Controller_Module::connect_to ( Port *p )
w = o;

o->type(4);
o->color(FL_DARK1);
o->selection_color(FL_RED);
o->color( FL_DARK1 );
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) );
o->minimum(1.5);
o->maximum(0);
o->value(1);
@@ -381,7 +381,7 @@ Controller_Module::connect_to ( Port *p )
}
else
{
{ Fl_Dial *o = new Fl_Dial( 0, 0, 50, 50, p->name() );
{ Fl_DialX *o = new Fl_DialX( 0, 0, 50, 50, p->name() );
w = o;
control = o;



+ 8
- 45
mixer/src/Mixer.C View File

@@ -289,36 +289,6 @@ void Mixer::cb_menu(Fl_Widget* o) {
{
fl_theme_chooser();
}
else if (! strcmp( picked, "&Options/&Display/&Knobs/&Burnished") )
{
Fl_Dial::default_style( Fl_Dial::BURNISHED_DIAL );
redraw_windows();
}
else if (! strcmp( picked, "&Options/&Display/&Knobs/&Arc") )
{
Fl_Dial::default_style( Fl_Dial::ARC_DIAL );
redraw_windows();
}
else if (! strcmp( picked, "&Options/&Display/&Knobs/&Plastic") )
{
Fl_Dial::default_style( Fl_Dial::PLASTIC_DIAL );
redraw_windows();
}
else if (! strcmp( picked, "&Options/&Display/&Sliders/&Nice") )
{
Fl_Value_SliderX::default_style( Fl_Value_SliderX::NICE_SLIDER );
redraw_windows();
}
else if (! strcmp( picked, "&Options/&Display/&Sliders/&Fill") )
{
Fl_Value_SliderX::default_style( Fl_Value_SliderX::FILL_SLIDER );
redraw_windows();
}
else if (! strcmp( picked, "&Options/&Display/&Sliders/&Simple") )
{
Fl_Value_SliderX::default_style( Fl_Value_SliderX::SIMPLE_SLIDER );
redraw_windows();
}
else if ( ! strcmp( picked, "&Help/&About" ) )
{
About_Dialog ab( PIXMAP_PATH "/non-mixer/icon-256x256.png" );
@@ -444,13 +414,6 @@ Mixer::Mixer ( int X, int Y, int W, int H, const char *L ) :
o->add( "&Mixer/Add &N Strips" );
o->add( "&Mixer/&Import Strip" );
o->add( "&View/&Theme", 0, 0, 0 );
o->add( "_&Options/&Display/&Knobs/&Arc", 0, 0, 0, FL_MENU_RADIO );
o->add( "_&Options/&Display/&Knobs/&Burnished", 0, 0, 0, FL_MENU_RADIO );
o->add( "_&Options/&Display/&Knobs/&Plastic", 0, 0, 0, FL_MENU_RADIO | FL_MENU_VALUE );
o->add( "_&Options/&Display/&Sliders/&Nice", 0, 0, 0, FL_MENU_RADIO | FL_MENU_VALUE );
o->add( "_&Options/&Display/&Sliders/&Fill", 0, 0, 0, FL_MENU_RADIO );
o->add( "_&Options/&Display/&Sliders/&Simple", 0, 0, 0, FL_MENU_RADIO );
o->add( "_&Options/&Display/&Colors/&System", 0, 0, 0, FL_MENU_RADIO );
o->add( "&Help/&Manual" );
o->add( "&Help/&About" );
o->callback( cb_menu, this );
@@ -760,19 +723,19 @@ Mixer::load_options ( void )
{
// save options

char *path;
asprintf( &path, "%s/options", user_config_dir );
((Fl_Menu_Settings*)menubar)->load( menubar->find_item( "&Options" ), path );
free( path );
/* char *path; */
/* asprintf( &path, "%s/options", user_config_dir ); */
/* ((Fl_Menu_Settings*)menubar)->load( menubar->find_item( "&Options" ), path ); */
/* free( path ); */
}

void
Mixer::save_options ( void )
{
char *path;
asprintf( &path, "%s/%s", user_config_dir, options_filename );
((Fl_Menu_Settings*)menubar)->dump( menubar->find_item( "&Options" ), path );
free( path );
/* char *path; */
/* asprintf( &path, "%s/%s", user_config_dir, options_filename ); */
/* ((Fl_Menu_Settings*)menubar)->dump( menubar->find_item( "&Options" ), path ); */
/* free( path ); */
}

void


+ 14
- 11
mixer/src/Module_Parameter_Editor.C View File

@@ -32,7 +32,7 @@
#include "FL/Fl_Flowpack.H"
#include "FL/Fl_Labelpad_Group.H"
#include "FL/Fl_Value_SliderX.H"
#include "FL/Fl_Dial.H"
#include "FL/Fl_DialX.H"

#include "Module.H"
#include "Module_Parameter_Editor.H"
@@ -145,6 +145,9 @@ Module_Parameter_Editor::make_controls ( void )
elevation_port_number = -1;
float elevation_value = 0.0f;

Fl_Color fc = fl_color_add_alpha( FL_CYAN, 200 );
Fl_Color bc = FL_BACKGROUND2_COLOR;

controls_by_port.resize( module->control_input.size() );

for ( unsigned int i = 0; i < module->control_input.size(); ++i )
@@ -177,7 +180,7 @@ Module_Parameter_Editor::make_controls ( void )
{
Fl_Button *o = new Fl_Button( 0, 0, 30, 30, p->name() );
w = o;
o->selection_color( FL_GREEN );
o->selection_color( fc );
o->type( FL_TOGGLE_BUTTON );
o->value( p->control_value() );
}
@@ -203,7 +206,7 @@ Module_Parameter_Editor::make_controls ( void )
{
if ( mode_choice->value() == 0 )
{
Fl_Dial *o = new Fl_Dial( 0, 0, 60, 60, p->name() );
Fl_DialX *o = new Fl_DialX( 0, 0, 60, 60, p->name() );
w = o;

if ( p->hints.ranged )
@@ -213,9 +216,8 @@ Module_Parameter_Editor::make_controls ( void )
o->minimum( p->hints.minimum );
o->maximum( p->hints.maximum );
}

o->color( FL_GRAY );
o->selection_color( FL_WHITE );
o->color( bc );
o->selection_color( fc );
o->value( p->control_value() );

// o->step( fabs( ( o->maximum() - o->minimum() ) ) / 32.0f );
@@ -229,7 +231,7 @@ Module_Parameter_Editor::make_controls ( void )
{
o->type( FL_HORIZONTAL );

o->size( 120, 36 );
o->size( 120, 24 );
if ( p->hints.ranged )
{
o->minimum( p->hints.minimum );
@@ -240,17 +242,18 @@ Module_Parameter_Editor::make_controls ( void )
{
o->type( FL_VERTICAL );

o->size( 36, 120 );
o->size( 24, 120 );
/* have to reverse the meaning of these to get the
* orientation of the slider right */
o->maximum( p->hints.minimum );
o->minimum( p->hints.maximum );
}

o->textsize( 8 );
o->box( FL_NO_BOX );
o->slider( FL_UP_BOX );
// o->color( FL_BACKGROUND2_COLOR );
o->color( FL_BACKGROUND2_COLOR );
o->selection_color( FL_WHITE );
o->color( bc );
o->selection_color( fc );
o->value( p->control_value() );
}



Loading…
Cancel
Save