when leaving an active automation state, update fader displays to show correct curren...
[ardour.git] / gtk2_ardour / gain_meter.cc
index ff91f5a74a7a8797a4dbadba2cbd048730c624c3..90585c3676b071e3eede06656443d26f654a6068 100644 (file)
 #include "pbd/fastlog.h"
 #include "pbd/stacktrace.h"
 
-#include "ardour_ui.h"
 #include "gain_meter.h"
-#include "global_signals.h"
 #include "logmeter.h"
 #include "gui_thread.h"
 #include "keyboard.h"
 #include "public_editor.h"
 #include "utils.h"
 #include "meter_patterns.h"
+#include "timers.h"
+#include "tooltips.h"
+#include "ui_config.h"
 
 #include "ardour/session.h"
 #include "ardour/route.h"
 #include "ardour/meter.h"
 #include "ardour/audio_track.h"
 #include "ardour/midi_track.h"
+#include "ardour/dB.h"
 
 #include "i18n.h"
 
@@ -61,12 +63,34 @@ 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;
 
@@ -77,10 +101,13 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        next_release_selects = false;
        _width = Wide;
 
+       fader_length = rint (fader_length * UIConfiguration::instance().get_ui_scale());
+       fader_girth = rint (fader_girth * UIConfiguration::instance().get_ui_scale());
+
        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);
@@ -105,14 +132,22 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        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.unset_flags (Gtk::CAN_FOCUS);
        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");
 
-       ARDOUR_UI::instance()->set_tip (gain_automation_state_button, _("Fader automation mode"));
-       ARDOUR_UI::instance()->set_tip (gain_automation_style_button, _("Fader automation type"));
+       set_tooltip (gain_automation_state_button, _("Fader automation mode"));
+       set_tooltip (gain_automation_style_button, _("Fader automation type"));
 
        gain_automation_style_button.unset_flags (Gtk::CAN_FOCUS);
        gain_automation_state_button.unset_flags (Gtk::CAN_FOCUS);
@@ -136,8 +171,8 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        RedrawMetrics.connect (sigc::mem_fun(*this, &GainMeterBase::redraw_metrics));
 
        UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &GainMeterBase::on_theme_changed));
-       ColorsChanged.connect (sigc::bind(sigc::mem_fun (*this, &GainMeterBase::color_handler), false));
-       DPIReset.connect (sigc::bind(sigc::mem_fun (*this, &GainMeterBase::color_handler), true));
+       UIConfiguration::instance().ColorsChanged.connect (sigc::bind(sigc::mem_fun (*this, &GainMeterBase::color_handler), false));
+       UIConfiguration::instance().DPIReset.connect (sigc::bind(sigc::mem_fun (*this, &GainMeterBase::color_handler), true));
 }
 
 GainMeterBase::~GainMeterBase ()
@@ -230,11 +265,11 @@ GainMeterBase::setup_gain_adjustment ()
 
        if (_amp->output_streams().n_midi() <=  _amp->output_streams().n_audio()) {
                _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_slider->set_default_value (gain_to_slider_position (1));
+               gain_adjustment.set_lower (GAIN_COEFF_ZERO);
+               gain_adjustment.set_upper (GAIN_COEFF_UNITY);
+               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 (GAIN_COEFF_UNITY));
        } else {
                _data_type = DataType::MIDI;
                gain_adjustment.set_lower (0.0);
@@ -247,7 +282,7 @@ GainMeterBase::setup_gain_adjustment ()
        ignore_toggle = false;
 
        effective_gain_display ();
-       
+
        _previous_amp_output_streams = _amp->output_streams ();
 }
 
@@ -435,10 +470,10 @@ GainMeterBase::gain_activated ()
        /* clamp to displayable values */
        if (_data_type == DataType::AUDIO) {
                f = min (f, 6.0f);
-               _amp->set_gain (dB_to_coefficient(f), this);
+               _amp->gain_control()->set_value (dB_to_coefficient(f), Controllable::NoGroup);
        } else {
                f = min (fabs (f), 2.0f);
-               _amp->set_gain (f, this);
+               _amp->gain_control()->set_value (f, Controllable::NoGroup);
        }
 
        if (gain_display.has_focus()) {
@@ -494,12 +529,12 @@ GainMeterBase::gain_adjusted ()
        } else {
                value = gain_adjustment.get_value();
        }
-       
+
        if (!ignore_toggle) {
                if (_route && _route->amp() == _amp) {
-                       _route->set_gain (value, this);
+                       _route->set_gain (value, Controllable::UseGroup);
                } else {
-                       _amp->set_gain (value, this);
+                       _amp->gain_control()->set_value (value, Controllable::NoGroup);
                }
        }
 
@@ -509,7 +544,7 @@ GainMeterBase::gain_adjusted ()
 void
 GainMeterBase::effective_gain_display ()
 {
-       float value = 0.0;
+       float value = GAIN_COEFF_ZERO;
 
        switch (_data_type) {
        case DataType::AUDIO:
@@ -582,7 +617,7 @@ next_meter_point (MeterPoint mp)
                break;
        }
 
-       /*NOTREACHED*/
+       abort(); /*NOTREACHED*/
        return MeterInput;
 }
 
@@ -813,9 +848,9 @@ GainMeterBase::gain_automation_style_changed ()
 void
 GainMeterBase::gain_automation_state_changed ()
 {
-       ENSURE_GUI_THREAD (*this, &GainMeterBase::gain_automation_state_changed)
+       ENSURE_GUI_THREAD (*this, &GainMeterBase::gain_automation_state_changed);
 
-       bool x;
+       cerr << "GMB:autostate change to " << _amp->gain_control()->alist()->automation_state() << endl;
 
        switch (_width) {
        case Wide:
@@ -826,22 +861,24 @@ GainMeterBase::gain_automation_state_changed ()
                break;
        }
 
-       x = (_amp->gain_control()->alist()->automation_state() != ARDOUR::Off);
+       const bool automation_watch_required = (_amp->gain_control()->alist()->automation_state() != ARDOUR::Off);
 
-       if (gain_automation_state_button.get_active() != x) {
+       if (gain_automation_state_button.get_active() != automation_watch_required) {
                ignore_toggle = true;
-               gain_automation_state_button.set_active (x);
+               gain_automation_state_button.set_active (automation_watch_required);
                ignore_toggle = false;
        }
 
        update_gain_sensitive ();
 
-       /* start watching automation so that things move */
-
        gain_watching.disconnect();
 
-       if (x) {
-               gain_watching = ARDOUR_UI::RapidScreenUpdate.connect (sigc::mem_fun (*this, &GainMeterBase::effective_gain_display));
+       if (automation_watch_required) {
+               /* start watching automation so that things move */
+               gain_watching = Timers::rapid_connect (sigc::mem_fun (*this, &GainMeterBase::effective_gain_display));
+       } else {
+               /* update once to get the correct value shown as we re-enter off/manual mode */
+               effective_gain_display();
        }
 }
 
@@ -866,7 +903,7 @@ GainMeterBase::update_meters()
                        peak_display.set_text (buf);
                }
        }
-       if (mpeak >= Config->get_meter_peak()) {
+       if (mpeak >= UIConfiguration::instance().get_meter_peak()) {
                peak_display.set_name ("MixerStripPeakDisplayPeak");
        }
 }
@@ -901,6 +938,8 @@ GainMeterBase::redraw_metrics()
        meter_ticks2_area.queue_draw ();
 }
 
+#define PX_SCALE(pxmin, dflt) rint(std::max((double)pxmin, (double)dflt * UIConfiguration::instance().get_ui_scale()))
+
 GainMeter::GainMeter (Session* s, int fader_length)
        : GainMeterBase (s, false, fader_length, 24)
        , gain_display_box(true, 0)
@@ -917,19 +956,19 @@ GainMeter::GainMeter (Session* s, int fader_length)
        gain_display_box.pack_start (peak_display, true, true);
 
        meter_metric_area.set_name ("AudioTrackMetrics");
-       meter_metric_area.set_size_request(24, -1);
+       meter_metric_area.set_size_request(PX_SCALE(24, 24), -1);
 
        gain_automation_style_button.set_name ("mixer strip button");
        gain_automation_state_button.set_name ("mixer strip button");
 
-       ARDOUR_UI::instance()->set_tip (gain_automation_state_button, _("Fader automation mode"));
-       ARDOUR_UI::instance()->set_tip (gain_automation_style_button, _("Fader automation type"));
+       set_tooltip (gain_automation_state_button, _("Fader automation mode"));
+       set_tooltip (gain_automation_style_button, _("Fader automation type"));
 
        gain_automation_style_button.unset_flags (Gtk::CAN_FOCUS);
        gain_automation_state_button.unset_flags (Gtk::CAN_FOCUS);
 
-       gain_automation_state_button.set_size_request(15, 15);
-       gain_automation_style_button.set_size_request(15, 15);
+       gain_automation_state_button.set_size_request (PX_SCALE(12, 15), PX_SCALE(12, 15));
+       gain_automation_style_button.set_size_request (PX_SCALE(12, 15), PX_SCALE(12, 15));
 
        fader_vbox = manage (new Gtk::VBox());
        fader_vbox->set_spacing (0);
@@ -940,7 +979,7 @@ GainMeter::GainMeter (Session* s, int fader_length)
 
        hbox.pack_start (fader_alignment, true, true);
 
-       set_spacing (2);
+       set_spacing (PX_SCALE(2, 2));
 
        pack_start (gain_display_box, Gtk::PACK_SHRINK);
        pack_start (hbox, Gtk::PACK_SHRINK);
@@ -951,8 +990,8 @@ GainMeter::GainMeter (Session* s, int fader_length)
        meter_metric_area.signal_expose_event().connect (
                sigc::mem_fun(*this, &GainMeter::meter_metrics_expose));
 
-       meter_ticks1_area.set_size_request(3,-1);
-       meter_ticks2_area.set_size_request(3,-1);
+       meter_ticks1_area.set_size_request (PX_SCALE(3, 3), -1);
+       meter_ticks2_area.set_size_request (PX_SCALE(3, 3), -1);
 
        meter_ticks1_area.signal_expose_event().connect (
                        sigc::mem_fun(*this, &GainMeter::meter_ticks1_expose));
@@ -964,6 +1003,7 @@ GainMeter::GainMeter (Session* s, int fader_length)
        meter_hbox.pack_start (meter_ticks2_area, false, false);
        meter_hbox.pack_start (meter_metric_area, false, false);
 }
+#undef PX_SCALE
 
 GainMeter::~GainMeter () { }
 
@@ -1082,7 +1122,7 @@ GainMeterBase::get_controllable()
 bool
 GainMeterBase::level_meter_button_press (GdkEventButton* ev)
 {
-       return !!LevelMeterButtonPress (ev); /* EMIT SIGNAL */
+       return static_cast<bool>(LevelMeterButtonPress (ev)); /* EMIT SIGNAL */
 }
 
 void