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:
parent
05ae84cbed
commit
ef4ac379a3
|
@ -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 ();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue