X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fgain_meter.cc;h=7b7ad33f9ae5beda0146e2c1ebfac152b49a050b;hb=d3e2de8b4e006ac652b004cb44b66afa9f6584f6;hp=edf07a13a584c0079007a1346b58dfedd8ee9b6d;hpb=e279b9892b467aa823e253d97b6e9504cca0e252;p=ardour.git diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index edf07a13a5..7b7ad33f9a 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -30,7 +30,6 @@ #include #include #include -#include #include #include "pbd/fastlog.h" #include "pbd/stacktrace.h" @@ -54,6 +53,7 @@ #include "i18n.h" using namespace ARDOUR; +using namespace ARDOUR_UI_UTILS; using namespace PBD; using namespace Gtkmm2ext; using namespace Gtk; @@ -61,6 +61,26 @@ using namespace std; using Gtkmm2ext::Keyboard; using namespace ArdourMeter; + +static void +reset_cursor_to_default (Gtk::Entry* widget) +{ + Glib::RefPtr 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_automation_style_button ("") @@ -78,9 +98,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, false)); + gain_slider = manage (new HSliderController (&gain_adjustment, boost::shared_ptr(), fader_length, fader_girth)); } else { - gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth, false)); + gain_slider = manage (new VSliderController (&gain_adjustment, boost::shared_ptr(), fader_length, fader_girth)); } level_meter = new LevelMeterHBox(_session); @@ -89,8 +109,9 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press)); meter_metric_area.add_events (Gdk::BUTTON_PRESS_MASK); - gain_slider->signal_button_press_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_press), false); - gain_slider->signal_button_release_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_release), false); + gain_slider->set_tweaks (PixFader::Tweaks(PixFader::NoButtonForward | PixFader::NoVerticalScroll)); + gain_slider->StartGesture.connect (sigc::mem_fun (*this, &GainMeter::amp_start_touch)); + gain_slider->StopGesture.connect (sigc::mem_fun (*this, &GainMeter::amp_stop_touch)); gain_slider->set_name ("GainFader"); gain_display.set_name ("MixerStripGainDisplay"); @@ -98,12 +119,22 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int gain_display.signal_activate().connect (sigc::mem_fun (*this, &GainMeter::gain_activated)); gain_display.signal_focus_in_event().connect (sigc::mem_fun (*this, &GainMeter::gain_focused), false); 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 ("MixerStripPeakDisplay"); set_size_request_to_display_given_text (peak_display, "-80.g", 2, 6); /* note the descender */ max_peak = minus_infinity(); - peak_display.set_label (_("-inf")); + peak_display.set_text (_("-inf")); + 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"); @@ -135,16 +166,6 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int 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)); - -// PBD::ScopedConnection _config_connection; -// Config->ParameterChanged.connect ( _config_connection, MISSING_INVALIDATOR, boost::bind(&GainMeterBase::set_flat_buttons, this, _1), gui_context() ); -} - -void -GainMeterBase::set_flat_buttons () -{ -printf("set_flat_butt\n"); -// gain_slider->set_flat_buttons( ARDOUR_UI::config()->get_flat_buttons() ); } GainMeterBase::~GainMeterBase () @@ -274,18 +295,24 @@ void GainMeterBase::setup_meters (int len) { int meter_width = 5; + uint32_t meter_channels = 0; + if (_meter) { + meter_channels = _meter->input_streams().n_total(); + } else if (_route) { + meter_channels = _route->shared_peak_meter()->input_streams().n_total(); + } switch (_width) { case Wide: //meter_ticks1_area.show(); //meter_ticks2_area.show(); meter_metric_area.show(); - if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) { + if (meter_channels == 1) { meter_width = 10; } break; case Narrow: - if (_route && _route->shared_peak_meter()->input_streams().n_total() > 1) { + if (meter_channels > 1) { meter_width = 4; } //meter_ticks1_area.hide(); @@ -307,7 +334,15 @@ GainMeter::setup_meters (int len) { switch (_width) { case Wide: - hbox.set_homogeneous(true); + { + uint32_t meter_channels = 0; + if (_meter) { + meter_channels = _meter->input_streams().n_total(); + } else if (_route) { + meter_channels = _route->shared_peak_meter()->input_streams().n_total(); + } + hbox.set_homogeneous(meter_channels < 7 ? true : false); + } break; case Narrow: hbox.set_homogeneous(false); @@ -357,7 +392,7 @@ GainMeterBase::reset_peak_display () _meter->reset_max(); level_meter->clear_meters(); max_peak = -INFINITY; - peak_display.set_label (_("-inf")); + peak_display.set_text (_("-inf")); peak_display.set_name ("MixerStripPeakDisplay"); } @@ -575,7 +610,7 @@ next_meter_point (MeterPoint mp) break; } - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return MeterInput; } @@ -684,25 +719,16 @@ GainMeterBase::meter_point_clicked () } } -bool -GainMeterBase::gain_slider_button_press (GdkEventButton* ev) +void +GainMeterBase::amp_start_touch () { - switch (ev->type) { - case GDK_BUTTON_PRESS: - _amp->gain_control()->start_touch (_amp->session().transport_frame()); - break; - default: - return false; - } - - return false; + _amp->gain_control()->start_touch (_amp->session().transport_frame()); } -bool -GainMeterBase::gain_slider_button_release (GdkEventButton*) +void +GainMeterBase::amp_stop_touch () { _amp->gain_control()->stop_touch (false, _amp->session().transport_frame()); - return false; } gint @@ -847,6 +873,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() { @@ -856,10 +888,10 @@ GainMeterBase::update_meters() if (mpeak > max_peak) { max_peak = mpeak; if (mpeak <= -200.0f) { - peak_display.set_label (_("-inf")); + peak_display.set_text (_("-inf")); } else { snprintf (buf, sizeof(buf), "%.1f", mpeak); - peak_display.set_label (buf); + peak_display.set_text (buf); } } if (mpeak >= Config->get_meter_peak()) { @@ -907,6 +939,11 @@ GainMeter::GainMeter (Session* s, int fader_length) } gain_display_box.pack_start (gain_display, true, true); + if (peak_display.get_parent()) { + peak_display.get_parent()->remove (gain_display); + } + gain_display_box.pack_start (peak_display, true, true); + meter_metric_area.set_name ("AudioTrackMetrics"); meter_metric_area.set_size_request(24, -1); @@ -1009,6 +1046,7 @@ GainMeter::get_gm_width () { Gtk::Requisition sz; int min_w = 0; + sz.width = 0; meter_metric_area.size_request (sz); min_w += sz.width; level_meter->size_request (sz); @@ -1052,6 +1090,13 @@ GainMeter::meter_ticks2_expose (GdkEventExpose *ev) return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area); } +void +GainMeter::on_style_changed (const Glib::RefPtr&) +{ + gain_display.queue_draw(); + peak_display.queue_draw(); +} + boost::shared_ptr GainMeterBase::get_controllable() { @@ -1065,7 +1110,7 @@ GainMeterBase::get_controllable() bool GainMeterBase::level_meter_button_press (GdkEventButton* ev) { - return LevelMeterButtonPress (ev); /* EMIT SIGNAL */ + return !!LevelMeterButtonPress (ev); /* EMIT SIGNAL */ } void @@ -1117,6 +1162,7 @@ GainMeter::meter_configuration_changed (ChanCount c) setup_meters(); meter_clear_pattern_cache(4); + on_style_changed(Glib::RefPtr()); } void