diff --git a/Mixer_Strip.fl b/Mixer_Strip.fl index 49057c6..121d0c7 100644 --- a/Mixer_Strip.fl +++ b/Mixer_Strip.fl @@ -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 } diff --git a/VU_Meter.C b/VU_Meter.C index 014afa1..4cd237b 100644 --- a/VU_Meter.C +++ b/VU_Meter.C @@ -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; } diff --git a/VU_Meter.H b/VU_Meter.H index 21a12e1..3caef21 100644 --- a/VU_Meter.H +++ b/VU_Meter.H @@ -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; }