Add peak hold to VU meter widget.

This commit is contained in:
Jonathan Moore Liles 2008-03-11 23:31:50 -05:00
parent 39549d1113
commit b90a3ac6e5
3 changed files with 32 additions and 8 deletions

View File

@ -2,7 +2,8 @@
version 1.0108
header_name {.H}
code_name {.C}
decl {\#include "VU_Meter.H"} {}
decl {\#include "VU_Meter.H"} {selected public global
}
widget_class Mixer_Strip {open
xywh {1051 42 124 816} type Double box UP_FRAME color 32 selection_color 63 resizable
@ -21,7 +22,7 @@ widget_class Mixer_Strip {open
} {
Fl_Button {} {
label {@circle}
private xywh {7 143 35 25} type Toggle
private xywh {7 143 35 25} type Toggle labelsize 10
}
Fl_Button {} {
label m
@ -35,13 +36,13 @@ widget_class Mixer_Strip {open
Fl_Group {} {open
xywh {13 178 104 509} resizable
} {
Fl_Value_Slider {} {
Fl_Value_Slider gain {
label Gain
callback {// parent()->parent()->damage( FL_DAMAGE_ALL, x(), y(), w(), h() );}
xywh {14 195 33 471} type {Vert Knob} color 32 selection_color 1 minimum 1.5 maximum 0 step 0.01 value 1 textsize 14
}
Fl_Box {} {
label VU selected
Fl_Box meter {
label VU
xywh {57 193 55 484} box ROUNDED_BOX selection_color 88
class VU_Meter
}

View File

@ -31,6 +31,8 @@ VU_Meter::VU_Meter ( int X, int Y, int W, int H, const char *L ) :
Fl_Widget( X, Y, W, H, L )
{
_peak = 0.0f;
divisions( 32 );
type( FL_VERTICAL );
@ -53,6 +55,7 @@ VU_Meter::draw ( void )
// draw_box( FL_FLAT_BOX, x(), y(), w(), h(), color() );
int v = (value() / maximum()) * _divisions;
int pv = (_peak / maximum()) * _divisions;
int bh = h() / _divisions;
int bw = w() / _divisions;
@ -61,7 +64,7 @@ VU_Meter::draw ( void )
{
Fl_Color c = fl_color_average( _max_color, _min_color, (float)p / _divisions );
if ( p > v )
if ( p > v && p != pv )
// c = fl_color_average( color(), c, _dim );
c = fl_color_average( FL_BLACK, c, _dim );
@ -72,6 +75,22 @@ VU_Meter::draw ( void )
draw_box( box(), x() + (p * bw), y(), bw, h(), c );
else
draw_box( box(), x(), y() + h() - (p * bh), w(), bh, c );
}
if ( value() > _peak )
_peak = value();
}
int
VU_Meter::handle ( int m )
{
switch ( m )
{
case FL_PUSH:
reset();
break;
}
return 0;
}

View File

@ -24,6 +24,8 @@
class VU_Meter : public Fl_Widget
{
float _peak;
float _value;
float _minimum;
float _maximum;
@ -38,12 +40,12 @@ class VU_Meter : public Fl_Widget
protected:
virtual void draw ( void );
virtual int handle ( int m );
public:
VU_Meter ( int X, int Y, int W, int H, const char *L = 0 );
void maximum( float v ) { _maximum = v; redraw(); }
float maximum ( void ) const { return _maximum; }
@ -53,6 +55,8 @@ public:
void value ( float v ) { _value = v; redraw(); }
float value ( void ) const { return _value; }
void reset ( void ) { _peak = 0.0f; }
bool divisions ( void ) const { return _divisions; }
void divisions ( int v ) { _divisions = v; }