#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"
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;
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);
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);
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 ()
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);
ignore_toggle = false;
effective_gain_display ();
-
+
_previous_amp_output_streams = _amp->output_streams ();
}
/* 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()) {
} 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);
}
}
void
GainMeterBase::effective_gain_display ()
{
- float value = 0.0;
+ float value = GAIN_COEFF_ZERO;
switch (_data_type) {
case DataType::AUDIO:
break;
}
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
return MeterInput;
}
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:
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();
}
}
peak_display.set_text (buf);
}
}
- if (mpeak >= Config->get_meter_peak()) {
+ if (mpeak >= UIConfiguration::instance().get_meter_peak()) {
peak_display.set_name ("MixerStripPeakDisplayPeak");
}
}
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)
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);
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);
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));
meter_hbox.pack_start (meter_ticks2_area, false, false);
meter_hbox.pack_start (meter_metric_area, false, false);
}
+#undef PX_SCALE
GainMeter::~GainMeter () { }
bool
GainMeterBase::level_meter_button_press (GdkEventButton* ev)
{
- return !!LevelMeterButtonPress (ev); /* EMIT SIGNAL */
+ return static_cast<bool>(LevelMeterButtonPress (ev)); /* EMIT SIGNAL */
}
void