From ef4ac379a330a6a26e4b2da575a2c0010bc41783 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 13 Nov 2011 15:12:34 +0000 Subject: Popup menu over meters in mixer strips to select metering point (rest of #4419). git-svn-id: svn://localhost/ardour2/branches/3.0@10569 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/gain_meter.cc | 11 +++++++++++ gtk2_ardour/gain_meter.h | 10 ++++++++++ gtk2_ardour/level_meter.cc | 18 +++++++++++++----- gtk2_ardour/level_meter.h | 6 +++++- gtk2_ardour/mixer_strip.cc | 47 ++++++++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/mixer_strip.h | 6 ++++++ 6 files changed, 92 insertions(+), 6 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index c0a6958347..0618e5ee80 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -110,6 +110,10 @@ GainMeterBase::GainMeterBase (Session* s, level_meter = new LevelMeter(_session); + level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1)); + 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)); gain_slider->signal_button_release_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_release)); gain_slider->set_name ("GainFader"); @@ -1105,6 +1109,12 @@ GainMeterBase::get_controllable() } } +bool +GainMeterBase::level_meter_button_press (GdkEventButton* ev) +{ + return LevelMeterButtonPress (ev); /* EMIT SIGNAL */ +} + void GainMeter::meter_configuration_changed (ChanCount c) { @@ -1119,3 +1129,4 @@ GainMeter::meter_configuration_changed (ChanCount c) style_changed = true; meter_metric_area.queue_draw (); } + diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index cd65c17adb..e706606c76 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -88,6 +88,11 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr LevelMeter& get_level_meter() const { return *level_meter; } Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; } + /** Emitted in the GUI thread when a button is pressed over the level meter; + * return true if the event is handled. + */ + PBD::Signal1 LevelMeterButtonPress; + protected: friend class MixerStrip; @@ -182,6 +187,11 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr void color_handler(bool); ARDOUR::DataType _data_type; ARDOUR::ChanCount _previous_amp_output_streams; + +private: + + bool level_meter_button_press (GdkEventButton *); + PBD::ScopedConnection _level_meter_connection; }; class GainMeter : public GainMeterBase, public Gtk::VBox diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 4a65864050..b073d54a7a 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -201,8 +201,9 @@ LevelMeter::setup_meters (int len, int initial_width) meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, b, m, t, c); meters[n].width = width; meters[n].length = len; - meters[n].meter->add_events (Gdk::BUTTON_RELEASE_MASK); - meters[n].meter->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &LevelMeter::meter_button_release), n)); + meters[n].meter->add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); + meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_press)); + meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_release)); } pack_end (*meters[n].meter, false, false); @@ -213,12 +214,19 @@ LevelMeter::setup_meters (int len, int initial_width) color_changed = false; } -gint -LevelMeter::meter_button_release (GdkEventButton* ev, uint32_t /*which*/) +bool +LevelMeter::meter_button_press (GdkEventButton* ev) +{ + return ButtonPress (ev); /* EMIT SIGNAL */ +} + +bool +LevelMeter::meter_button_release (GdkEventButton* ev) { if (ev->button == 1) { - clear_meters(); + clear_meters (); } + return true; } diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h index e89266a407..0e51758858 100644 --- a/gtk2_ardour/level_meter.h +++ b/gtk2_ardour/level_meter.h @@ -67,6 +67,9 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr void hide_meters (); void setup_meters (int len=0, int width=3); + /** Emitted in the GUI thread when a button is pressed over the meter */ + PBD::Signal1 ButtonPress; + private: ARDOUR::PeakMeter* _meter; @@ -96,7 +99,8 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr PBD::ScopedConnection _parameter_connection; void hide_all_meters (); - gint meter_button_release (GdkEventButton*, uint32_t); + bool meter_button_press (GdkEventButton *); + bool meter_button_release (GdkEventButton *); void parameter_changed (std::string); void configuration_changed (ARDOUR::ChanCount in, ARDOUR::ChanCount out); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 02e483fea4..bf82130b95 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -364,6 +364,8 @@ MixerStrip::init () parameter_changed (X_("mixer-strip-visibility")); Config->ParameterChanged.connect (_config_connection, MISSING_INVALIDATOR, ui_bind (&MixerStrip::parameter_changed, this, _1), gui_context()); + + gpm.LevelMeterButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&MixerStrip::level_meter_button_press, this, _1)); } MixerStrip::~MixerStrip () @@ -2010,3 +2012,48 @@ MixerStrip::ab_plugins () processor_box.processor_operation (ProcessorBox::ProcessorsAB); } +bool +MixerStrip::level_meter_button_press (GdkEventButton* ev) +{ + if (ev->button == 3) { + popup_level_meter_menu (ev); + return true; + } + + return false; +} + +void +MixerStrip::popup_level_meter_menu (GdkEventButton* ev) +{ + using namespace Gtk::Menu_Helpers; + + Gtk::Menu* m = manage (new Menu); + MenuList& items = m->items (); + + RadioMenuItem::Group group; + + add_level_meter_item (items, group, _("Input"), MeterInput); + add_level_meter_item (items, group, _("Pre-fader"), MeterPreFader); + add_level_meter_item (items, group, _("Post-fader"), MeterPostFader); + add_level_meter_item (items, group, _("Output"), MeterOutput); + add_level_meter_item (items, group, _("Custom"), MeterCustom); + + m->popup (ev->button, ev->time); +} + +void +MixerStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterPoint point) +{ + using namespace Menu_Helpers; + + items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MixerStrip::set_meter_point), point))); + RadioMenuItem* i = dynamic_cast (&items.back ()); + i->set_active (_route->meter_point() == point); +} + +void +MixerStrip::set_meter_point (MeterPoint p) +{ + _route->set_meter_point (p); +} diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h index 6aac87850d..ec12c5c9db 100644 --- a/gtk2_ardour/mixer_strip.h +++ b/gtk2_ardour/mixer_strip.h @@ -313,6 +313,12 @@ class MixerStrip : public RouteUI, public Gtk::EventBox void add_input_port (ARDOUR::DataType); void add_output_port (ARDOUR::DataType); + bool level_meter_button_press (GdkEventButton *); + void popup_level_meter_menu (GdkEventButton *); + void add_level_meter_item (Gtk::Menu_Helpers::MenuList &, Gtk::RadioMenuItem::Group &, std::string const &, ARDOUR::MeterPoint); + void set_meter_point (ARDOUR::MeterPoint); + PBD::ScopedConnection _level_meter_connection; + static std::string meter_point_string (ARDOUR::MeterPoint); }; -- cgit v1.2.3