Popup menu over meters in mixer strips to select metering
authorCarl Hetherington <carl@carlh.net>
Sun, 13 Nov 2011 15:12:34 +0000 (15:12 +0000)
committerCarl Hetherington <carl@carlh.net>
Sun, 13 Nov 2011 15:12:34 +0000 (15:12 +0000)
point (rest of #4419).

git-svn-id: svn://localhost/ardour2/branches/3.0@10569 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/gain_meter.cc
gtk2_ardour/gain_meter.h
gtk2_ardour/level_meter.cc
gtk2_ardour/level_meter.h
gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_strip.h

index c0a69583477e66df17cef36ea8ecccc8ff858900..0618e5ee80c5d75bb8dcd800a5afa5a2806f4ee1 100644 (file)
@@ -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 ();
 }
+
index cd65c17adb1613a07a67cde8eea2c8176b697468..e706606c76ee7a554efc531abf2a61a2aec74071 100644 (file)
@@ -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<bool, GdkEventButton *> 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
index 4a658640502b8af06badfb76da667b26fb968c40..b073d54a7a62db765039f5619fa1b59b9a33bee9 100644 (file)
@@ -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;
 }
 
index e89266a407de281b3099f3559d27c66df95441a6..0e51758858e33fa897fe8e9e30521952b4cc313d 100644 (file)
@@ -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<bool, GdkEventButton *> 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);
index 02e483fea4e1fd6be5c57a117914aed0223d37d9..bf82130b95e441585109e6f8150da37036231513 100644 (file)
@@ -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<RadioMenuItem *> (&items.back ());
+       i->set_active (_route->meter_point() == point);
+}
+
+void
+MixerStrip::set_meter_point (MeterPoint p)
+{
+       _route->set_meter_point (p);
+}
index 6aac87850d1ccd94ad3b8fe9ac18bc747e06319b..ec12c5c9dbf476746aec0c18e021227206315820 100644 (file)
@@ -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);
 };