From a1a2e088a53e6aaeab6dc8715f522a4fc633cf7c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 24 Feb 2017 23:37:23 +0100 Subject: Allow to switch master-meter type in the toolbar-meter --- gtk2_ardour/ardour_ui.cc | 48 ++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/ardour_ui.h | 6 +++++ gtk2_ardour/ardour_ui_dialogs.cc | 4 +++- 3 files changed, 57 insertions(+), 1 deletion(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index da93f81f45..737f55de6c 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -152,6 +152,7 @@ typedef uint64_t microseconds_t; #include "missing_plugin_dialog.h" #include "mixer_ui.h" #include "meterbridge.h" +#include "meter_patterns.h" #include "mouse_cursors.h" #include "nsm.h" #include "opts.h" @@ -291,6 +292,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , error_alert_button ( ArdourButton::just_led_default_elements ) , editor_meter(0) , editor_meter_peak_display() + , _suspend_editor_meter_callbacks (false) , _numpad_locate_happening (false) , _session_is_new (false) , last_key_press_time (0) @@ -5294,6 +5296,52 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat msg.run (); } +void +ARDOUR_UI::add_editor_meter_type_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type) +{ + using namespace Menu_Helpers; + + items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (editor_meter, &LevelMeterHBox::set_meter_type), type))); + RadioMenuItem* i = dynamic_cast (&items.back ()); + i->set_active (editor_meter->meter_type () == type); +} + +void +ARDOUR_UI::popup_editor_meter_menu (GdkEventButton* ev) +{ + using namespace Gtk::Menu_Helpers; + + Gtk::Menu* m = manage (new Menu); + MenuList& items = m->items (); + + RadioMenuItem::Group group; + + _suspend_editor_meter_callbacks = true; + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak0dB), MeterPeak0dB); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK12), MeterK12); + add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); + + m->popup (ev->button, ev->time); + _suspend_editor_meter_callbacks = false; +} + +bool +ARDOUR_UI::editor_meter_button_press (GdkEventButton* ev) +{ + if (ev->button == 3 && editor_meter) { + popup_editor_meter_menu (ev); + return true; + } + return false; +} void ARDOUR_UI::reset_peak_display () diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index d6b897a42f..0073a36edc 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -565,6 +565,11 @@ private: ArdourButton editor_meter_peak_display; bool editor_meter_peak_button_release (GdkEventButton*); + bool editor_meter_button_press (GdkEventButton* ev); + void popup_editor_meter_menu (GdkEventButton* ev); + void add_editor_meter_type_item (Gtk::Menu_Helpers::MenuList&, Gtk::RadioMenuItem::Group&, std::string const &, ARDOUR::MeterType); + bool _suspend_editor_meter_callbacks; + void blink_handler (bool); sigc::connection blink_connection; @@ -835,6 +840,7 @@ private: PBD::ScopedConnectionList forever_connections; PBD::ScopedConnection halt_connection; + PBD::ScopedConnection editor_meter_connection; void step_edit_status_change (bool); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 561fff520c..5fae3bb367 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -224,10 +224,12 @@ ARDOUR_UI::set_session (Session *s) editor_meter = new LevelMeterHBox(_session); editor_meter->set_meter (_session->master_out()->shared_peak_meter().get()); editor_meter->clear_meters(); - editor_meter->set_type (_session->master_out()->meter_type()); + editor_meter->set_meter_type (_session->master_out()->meter_type()); editor_meter->setup_meters (30, 10, 6); editor_meter->show(); meter_box.pack_start(*editor_meter); + + editor_meter->ButtonPress.connect_same_thread (editor_meter_connection, boost::bind (&ARDOUR_UI::editor_meter_button_press, this, _1)); } ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display)); -- cgit v1.2.3