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
This commit is contained in:
Carl Hetherington 2011-11-13 15:12:34 +00:00
parent 05ae84cbed
commit ef4ac379a3
6 changed files with 92 additions and 6 deletions

View 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 ();
}

View 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

View 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;
}

View 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);

View 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);
}

View 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);
};