several steps closer to more sane color system
[ardour.git] / gtk2_ardour / gain_meter.cc
index fcb22f5575c076ef4f716526db07c1e317438774..1dfd086b957d42416347ab468fb248660f92b60d 100644 (file)
@@ -49,6 +49,7 @@
 #include "ardour/meter.h"
 #include "ardour/audio_track.h"
 #include "ardour/midi_track.h"
+#include "ardour/dB.h"
 
 #include "i18n.h"
 
@@ -61,12 +62,35 @@ using namespace std;
 using Gtkmm2ext::Keyboard;
 using namespace ArdourMeter;
 
+
+static void
+reset_cursor_to_default (Gtk::Entry* widget)
+{
+       Glib::RefPtr<Gdk::Window> win = widget->get_text_window ();
+       if (win) {
+               /* C++ doesn't provide a pointer argument version of this
+                  (i.e. you cannot set to NULL to get the default/parent
+                  cursor)
+               */
+               gdk_window_set_cursor (win->gobj(), 0);
+       }
+}
+
+static void
+reset_cursor_to_default_state (Gtk::StateType, Gtk::Entry* widget)
+{
+       reset_cursor_to_default (widget);
+}
+
 GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int fader_girth)
-       : gain_adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0.0, 1.0, 0.01, 0.1)
+       : gain_adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()),  // value
+                          0.0,  // lower
+                          1.0,  // upper
+                          dB_coeff_step(Config->get_max_gain()) / 10.0,  // step increment
+                          dB_coeff_step(Config->get_max_gain()))  // page increment
        , gain_automation_style_button ("")
        , gain_automation_state_button ("")
        , _data_type (DataType::AUDIO)
-
 {
        using namespace Menu_Helpers;
 
@@ -78,9 +102,9 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        _width = Wide;
 
        if (horizontal) {
-               gain_slider = manage (new HSliderController (&gain_adjustment, fader_length, fader_girth));
+               gain_slider = manage (new HSliderController (&gain_adjustment, boost::shared_ptr<PBD::Controllable>(), fader_length, fader_girth));
        } else {
-               gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth));
+               gain_slider = manage (new VSliderController (&gain_adjustment, boost::shared_ptr<PBD::Controllable>(), fader_length, fader_girth));
        }
 
        level_meter = new LevelMeterHBox(_session);
@@ -101,11 +125,20 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        gain_display.signal_focus_out_event().connect (sigc::mem_fun (*this, &GainMeter::gain_focused), false);
        gain_display.set_alignment(0.5);
 
-       peak_display.set_name ("peak display");
-       peak_display.set_layout_font (ARDOUR_UI::config()->get_canvasvar_SmallFont());
+       peak_display.set_name ("MixerStripPeakDisplay");
+       set_size_request_to_display_given_text (peak_display, "-80.g", 2, 6); /* note the descender */
        max_peak = minus_infinity();
        peak_display.set_text (_("-inf"));
-       peak_display.set_alignment (0.5, 0.5);
+       peak_display.set_alignment(0.5);
+       
+       /* stuff related to the fact that the peak display is not, in
+          fact, supposed to be a text entry. 
+       */
+       peak_display.set_events (peak_display.get_events() & ~(Gdk::EventMask (Gdk::LEAVE_NOTIFY_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::POINTER_MOTION_MASK)));
+       peak_display.signal_map().connect (sigc::bind (sigc::ptr_fun (reset_cursor_to_default), &peak_display));
+       peak_display.signal_state_changed().connect (sigc::bind (sigc::ptr_fun (reset_cursor_to_default_state), &peak_display));
+       peak_display.unset_flags (Gtk::CAN_FOCUS);
+       peak_display.set_editable (false);
 
        gain_automation_style_button.set_name ("mixer strip button");
        gain_automation_state_button.set_name ("mixer strip button");
@@ -231,8 +264,8 @@ GainMeterBase::setup_gain_adjustment ()
                _data_type = DataType::AUDIO;
                gain_adjustment.set_lower (0.0);
                gain_adjustment.set_upper (1.0);
-               gain_adjustment.set_step_increment (0.01);
-               gain_adjustment.set_page_increment (0.1);
+               gain_adjustment.set_step_increment (dB_coeff_step(Config->get_max_gain()) / 10.0);
+               gain_adjustment.set_page_increment (dB_coeff_step(Config->get_max_gain()));
                gain_slider->set_default_value (gain_to_slider_position (1));
        } else {
                _data_type = DataType::MIDI;
@@ -364,7 +397,7 @@ GainMeterBase::reset_peak_display ()
        level_meter->clear_meters();
        max_peak = -INFINITY;
        peak_display.set_text (_("-inf"));
-       peak_display.set_active (false);
+       peak_display.set_name ("MixerStripPeakDisplay");
 }
 
 void
@@ -581,7 +614,7 @@ next_meter_point (MeterPoint mp)
                break;
        }
 
-       /*NOTREACHED*/
+       abort(); /*NOTREACHED*/
        return MeterInput;
 }
 
@@ -844,6 +877,12 @@ GainMeterBase::gain_automation_state_changed ()
        }
 }
 
+const ChanCount
+GainMeterBase::meter_channels() const
+{
+               if (_meter) { return _meter->input_streams(); }
+               else { return ChanCount(); }
+}
 void
 GainMeterBase::update_meters()
 {
@@ -859,9 +898,8 @@ GainMeterBase::update_meters()
                        peak_display.set_text (buf);
                }
        }
-
        if (mpeak >= Config->get_meter_peak()) {
-               peak_display.set_active (true);
+               peak_display.set_name ("MixerStripPeakDisplayPeak");
        }
 }