From 65bda27d4218d9d4ebf809d91e716c892e1f1d8b Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Mon, 3 Dec 2018 18:55:52 -0600 Subject: [PATCH] Tweaks to Mixer and Monitor keybindings: Add Mixer-specific view keybindings for list, vca, mon. (thanks to: the_CLA) Move monitor keybindings (mute, dim, mono) to be globally-accessible. Implement new mixer-specific actions to show/hide monitor,vcas,mixbuses (the_CLA) Move monitor funcs (mute,dim,mono) to globally-accessible actions. Make a new Monitor group insted of using Transport group. Allow use-monitor-section to be controlled by both menu and session-options dialog. --- gtk2_ardour/ardour.keys.in | 12 +- gtk2_ardour/ardour.menus.in | 28 ++-- gtk2_ardour/ardour_ui.cc | 43 ++++++ gtk2_ardour/ardour_ui.h | 12 +- gtk2_ardour/ardour_ui2.cc | 18 +++ gtk2_ardour/ardour_ui_dialogs.cc | 46 ------ gtk2_ardour/ardour_ui_ed.cc | 32 ++--- gtk2_ardour/mixer.bindings | 4 + gtk2_ardour/mixer_strip.cc | 2 +- gtk2_ardour/mixer_ui.cc | 200 +++++++++++++++++++++++---- gtk2_ardour/mixer_ui.h | 25 ++-- gtk2_ardour/monitor.bindings | 3 - gtk2_ardour/monitor_section.cc | 20 +-- gtk2_ardour/option_editor.cc | 49 +++++++ gtk2_ardour/option_editor.h | 29 ++++ gtk2_ardour/session_option_editor.cc | 34 +---- gtk2_ardour/session_option_editor.h | 3 - 17 files changed, 390 insertions(+), 170 deletions(-) diff --git a/gtk2_ardour/ardour.keys.in b/gtk2_ardour/ardour.keys.in index d36ce176ee..656a261bce 100644 --- a/gtk2_ardour/ardour.keys.in +++ b/gtk2_ardour/ardour.keys.in @@ -57,6 +57,8 @@ just align the first region and moves other selected regions to maintain relativ %gmode Global Global Transport Modes +%gmon Global Global Monitor Operations + %movp Global Global Playhead Operations A left click in the rulers positions the playhead unless Ardour is recording. You can use {\tt KP$\_$n} to move the playhead to the n-th marker. @@ -150,6 +152,7 @@ This mode provides many different operations on both regions and control points, @gmark|Common/jump-backward-to-mark|q|to previous mark @sess|Common/Quit|<@PRIMARY@>q|quit @gmark|Common/jump-forward-to-mark|w|to next mark +@mmode|MouseMode/set-mouse-mode-content|e|content mode @select|Editor/select-all-before-edit-cursor|<@PRIMARY@>e|select all before EP @rop|Region/export-region|<@PRIMARY@><@SECONDARY@>e|export selected region(s) @sess|Main/ExportAudio|<@SECONDARY@>e|export session @@ -167,8 +170,6 @@ This mode provides many different operations on both regions and control points, @sess|Common/addExistingAudioFiles|<@PRIMARY@>i|import audio files @gselect|Common/invert-selection|<@TERTIARY@>i|invert selection @edtrk|Editor/toggle-midi-input-active|<@SECONDARY@>i|toggle sel. track MIDI input -@mmode|MouseMode/set-mouse-mode-object|g|object mode -@mmode|MouseMode/set-mouse-mode-content|e|content mode @sess|Main/Open|<@PRIMARY@>o|open an existing session @sess|Main/Recent|<@PRIMARY@><@TERTIARY@>o|open a recent session @wvis|Window/toggle-session-options-editor|<@SECONDARY@>o|toggle preferences dialog @@ -187,6 +188,7 @@ This mode provides many different operations on both regions and control points, @sess|Common/Save|<@PRIMARY@>s|save session @sess|Main/SnapshotStay|<@PRIMARY@><@TERTIARY@>s|snapshot session @edtrk|Editor/track-solo-toggle|<@SECONDARY@>s|toggle track solo status +@edit|Editor/ToggleSummary|<@TERTIARY@>s|toggle summary @mmode|MouseMode/set-mouse-mode-draw|d|note-draw mode @edit|Editor/duplicate|<@SECONDARY@>d|duplicate (once) @edit|Editor/multi-duplicate|<@TERTIARY@>d|duplicate (multi) @@ -197,6 +199,7 @@ This mode provides many different operations on both regions and control points, @rop|Region/show-rhythm-ferret|<@SECONDARY@>f|show rhythm ferret window @wvis|Common/ToggleMaximalEditor|<@PRIMARY@><@SECONDARY@>f|maximise editor space @wvis|Common/ToggleMaximalMixer|<@PRIMARY@><@TERTIARY@>f|maximise mixer space +@mmode|MouseMode/set-mouse-mode-object|g|object mode @edit|Region/play-selected-regions|h|play selected region(s) @eep|Region/trim-front|j|trim front @eep|Region/trim-back|k|trim back @@ -204,6 +207,7 @@ This mode provides many different operations on both regions and control points, @trans|Transport/Loop|l|loop play (the loop range) @select|Editor/select-all-in-loop-range|<@PRIMARY@>l|select all in loop range @wvis|Window/toggle-locations|<@SECONDARY@>l| toggle locations dialog +@edit|Editor/show-editor-list|<@TERTIARY@>l| show editor list ;; BOTTOM ROW @@ -227,6 +231,10 @@ This mode provides many different operations on both regions and control points, @wvis|Window/toggle-midi-connection-manager|<@SECONDARY@><@TERTIARY@>m|toggle global midi patchbay @wvis|Window/show-mixer|<@SECONDARY@>m|show mixer window +@gmon|Monitor/monitor-cut-all|<@PRIMARY@>m|monitor cut all +@gmon|Monitor/monitor-mono|<@PRIMARY@><@SECONDARY@>m|monitor mono +@gmon|Monitor/monitor-dim-all|<@PRIMARY@><@TERTIARY@>m|monitor dim + ;; arrow keys, navigation etc. @vis|Editor/step-tracks-up|Up|scroll up (step) diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 9ec8babb66..ddc6ce1147 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -34,6 +34,14 @@ + + + + + + + + @@ -76,11 +84,6 @@ #endif - - - - - @@ -88,6 +91,10 @@ + + + + @@ -512,15 +519,18 @@ + + + + + + - #ifdef MIXBUS #endif - - - + diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 6dd659420c..9321f13137 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -92,6 +92,7 @@ #include "ardour/filename_extensions.h" #include "ardour/filesystem_paths.h" #include "ardour/ltc_file_reader.h" +#include "ardour/monitor_control.h" #include "ardour/midi_track.h" #include "ardour/port.h" #include "ardour/plugin_manager.h" @@ -5985,3 +5986,45 @@ ARDOUR_UI::reset_focus (Gtk::Widget* w) gtk_window_set_focus (GTK_WINDOW(top->gobj()), 0); } + +void +ARDOUR_UI::monitor_dim_all () +{ + boost::shared_ptr mon = _session->monitor_out (); + if (!mon) { + return; + } + boost::shared_ptr _monitor = mon->monitor_control (); + + Glib::RefPtr act = global_actions.find_action (X_("Monitor"), "monitor-dim-all"); + assert (act); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); _monitor->set_dim_all (tact->get_active()); +} + +void +ARDOUR_UI::monitor_cut_all () +{ + boost::shared_ptr mon = _session->monitor_out (); + if (!mon) { + return; + } + boost::shared_ptr _monitor = mon->monitor_control (); + + Glib::RefPtr act = global_actions.find_action (X_("Monitor"), "monitor-cut-all"); + assert (act); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); _monitor->set_cut_all (tact->get_active()); +} + +void +ARDOUR_UI::monitor_mono () +{ + boost::shared_ptr mon = _session->monitor_out (); + if (!mon) { + return; + } + boost::shared_ptr _monitor = mon->monitor_control (); + + Glib::RefPtr act = global_actions.find_action (X_("Monitor"), "monitor-mono"); + assert (act); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact);_monitor->set_mono (tact->get_active()); +} diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 62a81a6a00..dd31e2bbd4 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -231,15 +231,8 @@ public: void new_midi_tracer_window (); void toggle_editing_space(); void toggle_mixer_space(); - void toggle_mixer_list(); - void toggle_monitor_section_visibility (); void toggle_keep_tearoffs(); - void toggle_vca_pane(); -#ifdef MIXBUS - void toggle_mixbus_pane(); -#endif - void reset_focus (Gtk::Widget*); static PublicEditor* _instance; @@ -372,6 +365,11 @@ public: protected: friend class PublicEditor; + void toggle_use_monitor_section (); + void monitor_dim_all (); + void monitor_cut_all (); + void monitor_mono (); + void toggle_auto_play (); void toggle_auto_input (); void toggle_punch (); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 431f094ca7..97d639fc1b 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -817,3 +817,21 @@ ARDOUR_UI::update_title () } } + +void +ARDOUR_UI::toggle_use_monitor_section () +{ + RefPtr act = ActionManager::get_action (X_("Monitor"), "UseMonitorSection"); + assert (act); RefPtr tact = Glib::RefPtr::cast_dynamic (act); + assert (tact); + + bool yn = tact->get_active (); + + if (yn) { + _session->add_monitor_section (); + } else { + _session->remove_monitor_section (); + } + + Config->set_use_monitor_bus (yn); +} diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 7a8366517e..dd1a1233c3 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -959,49 +959,3 @@ ARDOUR_UI::toggle_mixer_space() } } } - -void -ARDOUR_UI::toggle_mixer_list() -{ - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMixerList"); - - if (act) { - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - mixer->show_mixer_list (tact->get_active()); - } -} - -void -ARDOUR_UI::toggle_monitor_section_visibility () -{ - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMonitorSection"); - - if (act) { - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - mixer->show_monitor_section (tact->get_active()); - } -} - -void -ARDOUR_UI::toggle_vca_pane () -{ - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleVCAPane"); - - if (act) { - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - mixer->showhide_vcas (tact->get_active()); - } -} - -#ifdef MIXBUS -void -ARDOUR_UI::toggle_mixbus_pane () -{ - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMixbusPane"); - - if (act) { - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - mixer->showhide_mixbusses (tact->get_active()); - } -} -#endif diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 79d3c6abca..6e9227dd6b 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -376,22 +376,6 @@ ARDOUR_UI::install_actions () global_actions.register_toggle_action (common_actions, X_("ToggleMaximalMixer"), _("Maximise Mixer Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_space)); ActionManager::session_sensitive_actions.push_back (act); - act = global_actions.register_toggle_action (common_actions, X_("ToggleMixerList"), _("Toggle Mixer List"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_list)); - ActionManager::session_sensitive_actions.push_back (act); - - act = global_actions.register_toggle_action (common_actions, X_("ToggleVCAPane"), _("Toggle VCA Pane"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_vca_pane)); - ActionManager::session_sensitive_actions.push_back (act); - Glib::RefPtr::cast_dynamic(act)->set_active (true); - -#ifdef MIXBUS - act = global_actions.register_toggle_action (common_actions, X_("ToggleMixbusPane"), _("Toggle Mixbus Pane"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixbus_pane)); - ActionManager::session_sensitive_actions.push_back (act); - Glib::RefPtr::cast_dynamic(act)->set_active (true); -#endif - - act = global_actions.register_toggle_action (common_actions, X_("ToggleMonitorSection"), _("Toggle Monitor Section Visibility"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_monitor_section_visibility)); - act->set_sensitive (false); - if (Profile->get_mixbus()) { global_actions.register_action (common_actions, X_("show-ui-prefs"), _("Show more UI preferences"), sigc::mem_fun (*this, &ARDOUR_UI::show_ui_prefs)); } @@ -640,6 +624,22 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); + /* Monitor actions (accessible globally) */ + /* ...will get sensitized if a mon-section is added */ + + act = global_actions.register_action (main_actions, X_("MonitorMenu"), _("Monitor Section")); + ActionManager::session_sensitive_actions.push_back (act); + + Glib::RefPtr monitor_actions = global_actions.create_action_group (X_("Monitor")); + + act = global_actions.register_toggle_action (monitor_actions, X_("UseMonitorSection"), _("Use Monitor Section"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_use_monitor_section)); + ActionManager::session_sensitive_actions.push_back (act); + act = global_actions.register_toggle_action (monitor_actions, "monitor-mono", _("Monitor Section: Mono"), sigc::mem_fun (*this, &ARDOUR_UI::monitor_mono)); + act->set_sensitive(false); + act = global_actions.register_toggle_action (monitor_actions, "monitor-cut-all", _("Monitor Section: Mute"), sigc::mem_fun (*this, &ARDOUR_UI::monitor_cut_all)); + act->set_sensitive(false); + act = global_actions.register_toggle_action (monitor_actions, "monitor-dim-all", _("Monitor Section: Dim"), sigc::mem_fun (*this, &ARDOUR_UI::monitor_dim_all)); + act->set_sensitive(false); act = global_actions.register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync Startup to Video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync)); ActionManager::session_sensitive_actions.push_back (act); diff --git a/gtk2_ardour/mixer.bindings b/gtk2_ardour/mixer.bindings index 45219b75a0..c62144a40c 100644 --- a/gtk2_ardour/mixer.bindings +++ b/gtk2_ardour/mixer.bindings @@ -20,5 +20,9 @@ + + + + diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 43ad8a2828..1e7c94f906 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -581,7 +581,7 @@ MixerStrip::set_route (boost::shared_ptr rt) solo_iso_table.set_sensitive(false); control_slave_ui.set_sensitive(false); if (monitor_section_button == 0) { - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMonitorSection"); + Glib::RefPtr act = ActionManager::get_action ("Mixer", "ToggleMonitorSection"); _session->MonitorChanged.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::monitor_changed, this), gui_context()); monitor_section_button = manage (new ArdourButton); diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 07193c3286..39ddb6b08e 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -112,7 +112,6 @@ Mixer_UI::Mixer_UI () , _in_group_rebuild_or_clear (false) , _route_deletion_in_progress (false) , _maximised (false) - , _show_mixer_list (true) , _strip_selection_change_without_scroll (false) , _selection (*this, *this) { @@ -572,6 +571,8 @@ Mixer_UI::add_stripables (StripableList& slist) if (mnode) { _monitor_section->tearoff().set_state (*mnode); } + + set_monitor_action_sensitivity(true); } out_packer.pack_end (_monitor_section->tearoff(), false, false); @@ -1526,24 +1527,28 @@ Mixer_UI::redisplay_track_list () /* update visibility of VCA assign buttons */ if (n_masters == 0) { + //show/hide the channelstrip VCA assign buttons on channelstrips: UIConfiguration::instance().set_mixer_strip_visibility (VisibilityGroup::remove_element (UIConfiguration::instance().get_mixer_strip_visibility(), X_("VCA"))); - vca_vpacker.hide (); - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleVCAPane"); + + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleVCAPane"); if (act) { act->set_sensitive (false); } + //remove the VCA packer, but don't change our prior setting for show/hide: + vca_vpacker.hide (); } else { + //show/hide the channelstrip VCA assign buttons on channelstrips: UIConfiguration::instance().set_mixer_strip_visibility (VisibilityGroup::add_element (UIConfiguration::instance().get_mixer_strip_visibility(), X_("VCA"))); - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleVCAPane"); - if (act) { - act->set_sensitive (true); - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - showhide_vcas (tact->get_active()); - } else { - vca_vpacker.show (); - } + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleVCAPane"); + assert (act); + act->set_sensitive (true); + + //if we were showing VCAs before, show them now: + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); + showhide_vcas ( tact->get_active () ); } _group_tabs->set_dirty (); @@ -1934,19 +1939,38 @@ Mixer_UI::route_group_property_changed (RouteGroup* group, const PropertyChange& } void -Mixer_UI::show_mixer_list (bool yn) +Mixer_UI::toggle_mixer_list () +{ + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleMixerList"); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + showhide_mixer_list (tact->get_active()); + } +} + +void +Mixer_UI::showhide_mixer_list (bool yn) { if (yn) { list_vpacker.show (); } else { list_vpacker.hide (); } +} - _show_mixer_list = yn; +void +Mixer_UI::toggle_monitor_section () +{ + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleMonitorSection"); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + showhide_monitor_section (tact->get_active()); + } } + void -Mixer_UI::show_monitor_section (bool yn) +Mixer_UI::showhide_monitor_section (bool yn) { if (!monitor_section()) { return; @@ -1962,6 +1986,49 @@ Mixer_UI::show_monitor_section (bool yn) } } +void +Mixer_UI::toggle_vcas () +{ + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleVCAPane"); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + showhide_vcas (tact->get_active()); + } +} + +void +Mixer_UI::showhide_vcas (bool yn) +{ + if (yn) { + vca_vpacker.show(); + } else { + vca_vpacker.hide(); + } +} + +#ifdef MIXBUS +void +Mixer_UI::toggle_mixbuses () +{ + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleMixbusPane"); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + showhide_mixbuses (tact->get_active()); + } +} + +void +Mixer_UI::showhide_mixbuses (bool on) +{ + if (on) { + mb_vpacker.show(); + } else { + mb_vpacker.hide(); + } +} +#endif + + void Mixer_UI::route_group_name_edit (const std::string& path, const std::string& new_text) { @@ -2169,9 +2236,10 @@ Mixer_UI::set_state (const XMLNode& node, int version) } if (node.get_property ("show-mixer-list", yn)) { - Glib::RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleMixerList")); + Glib::RefPtr act = myactions.find_action (X_("Mixer"), X_("ToggleMixerList")); assert (act); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); /* do it twice to force the change */ tact->set_active (!yn); @@ -2179,13 +2247,41 @@ Mixer_UI::set_state (const XMLNode& node, int version) } if (node.get_property ("monitor-section-visible", yn)) { - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMonitorSection"); + Glib::RefPtr act = myactions.find_action (X_("Mixer"), X_("ToggleMonitorSection")); + assert (act); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); + + /* do it twice to force the change */ + tact->set_active (!yn); + tact->set_active (yn); + } + + if (node.get_property ("show-vca-pane", yn)) { + Glib::RefPtr act = myactions.find_action (X_("Mixer"), X_("ToggleVCAPane")); + assert (act); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); + + /* do it twice to force the change */ + tact->set_active (!yn); + tact->set_active (yn); + } + +#ifdef MIXBUS + if (node.get_property ("show-mixbus-pane", yn)) { + Glib::RefPtr act = myactions.find_action (X_("Mixer"), X_("ToggleMixbusPane")); + assert (act); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); + /* do it twice to force the change */ + tact->set_active (!yn); tact->set_active (yn); - show_monitor_section (yn); } +#endif + //check for the user's plugin_order file XMLNode plugin_order_new(X_("PO")); if (PluginManager::instance().load_plugin_order_file(plugin_order_new)) { @@ -2272,13 +2368,25 @@ Mixer_UI::get_state () node->set_property ("narrow-strips", (_strip_width == Narrow)); node->set_property ("show-mixer", _visible); - node->set_property ("show-mixer-list", _show_mixer_list); node->set_property ("maximised", _maximised); - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMonitorSection"); - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - assert (tact); - node->set_property ("monitor-section-visible", tact->get_active ()); + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleMixerList"); + assert (act); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); node->set_property ("show-mixer-list", tact->get_active ()); + + act = myactions.find_action ("Mixer", "ToggleMonitorSection"); + assert (act); tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); node->set_property ("monitor-section-visible", tact->get_active ()); + + act = myactions.find_action ("Mixer", "ToggleVCAPane"); + assert (act); tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); node->set_property ("show-vca-pane", tact->get_active ()); + +#ifdef MIXBUS + act = myactions.find_action ("Mixer", "ToggleMixbusPane"); + assert (act); tact = Glib::RefPtr::cast_dynamic(act); + assert (tact); node->set_property ("show-mixbus-pane", tact->get_active ()); +#endif return *node; } @@ -2525,10 +2633,38 @@ Mixer_UI::set_axis_targets_for_operation () } +void +Mixer_UI::set_monitor_action_sensitivity (bool yn) +{ + Glib::RefPtr act; + Glib::RefPtr tact; + + act = ActionManager::get_action (X_("Monitor"), "UseMonitorSection"); + assert (act); tact = Glib::RefPtr::cast_dynamic (act); + assert (tact); tact->set_active ( yn ); + + act = ActionManager::get_action (X_("Monitor"), "monitor-cut-all"); + assert (act); tact = Glib::RefPtr::cast_dynamic (act); + assert (tact); tact->set_sensitive ( yn ); + + act = ActionManager::get_action (X_("Monitor"), "monitor-dim-all"); + assert (act); tact = Glib::RefPtr::cast_dynamic (act); + assert (tact); tact->set_sensitive ( yn ); + + act = ActionManager::get_action (X_("Monitor"), "monitor-mono"); + assert (act); tact = Glib::RefPtr::cast_dynamic (act); + assert (tact); tact->set_sensitive ( yn ); +} + void Mixer_UI::monitor_section_going_away () { + /* Set sensitivity based on existence of the monitor bus */ + + set_monitor_action_sensitivity(false); + if (_monitor_section) { + XMLNode* ui_node = Config->extra_xml(X_("UI")); /* immediate state save. * @@ -2606,16 +2742,18 @@ Mixer_UI::restore_mixer_space () void Mixer_UI::monitor_section_attached () { - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMonitorSection"); + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleMonitorSection"); + assert (act); act->set_sensitive (true); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - act->set_sensitive (true); - show_monitor_section (tact->get_active ()); + assert (tact); + showhide_monitor_section ( tact->get_active () ); } void Mixer_UI::monitor_section_detached () { - Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMonitorSection"); + Glib::RefPtr act = myactions.find_action ("Mixer", "ToggleMonitorSection"); act->set_sensitive (false); } @@ -3102,6 +3240,16 @@ Mixer_UI::register_actions () myactions.register_action (group, "toggle-midi-input-active", _("Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"), sigc::bind (sigc::mem_fun (*this, &Mixer_UI::toggle_midi_input_active), false)); + + myactions.register_toggle_action (group, X_("ToggleMixerList"), _("Mixer: Show Mixer List"), sigc::mem_fun (*this, &Mixer_UI::toggle_mixer_list)); + + myactions.register_toggle_action (group, X_("ToggleVCAPane"), _("Mixer: Show VCAs"), sigc::mem_fun (*this, &Mixer_UI::toggle_vcas)); + +#ifdef MIXBUS + myactions.register_toggle_action (group, X_("ToggleMixbusPane"), _("Mixer: Show Mixbuses"), sigc::mem_fun (*this, &Mixer_UI::toggle_mixbus_pane)); +#endif + + myactions.register_toggle_action (group, X_("ToggleMonitorSection"), _("Mixer: Show Monitor Section"), sigc::mem_fun (*this, &Mixer_UI::toggle_monitor_section)); } void diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index 5908622c58..aab4480d30 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -101,9 +101,6 @@ public: void save_plugin_order_file (); - void show_mixer_list (bool yn); - void show_monitor_section (bool); - void show_strip (MixerStrip *); void hide_strip (MixerStrip *); @@ -135,13 +132,18 @@ public: void load_bindings (); Gtkmm2ext::Bindings* bindings; - void showhide_vcas (bool on) { - if (on) { vca_vpacker.show(); } else { vca_vpacker.hide(); } - } + void toggle_mixer_list (); + void showhide_mixer_list (bool yn); + + void toggle_monitor_section (); + void showhide_monitor_section (bool); + + void toggle_vcas (); + void showhide_vcas (bool on); + #ifdef MIXBUS - void showhide_mixbusses (bool on) { - if (on) { mb_vpacker.show(); } else { mb_vpacker.hide(); } - } + void toggle_mixbuses (); + void showhide_mixbusses (bool on); #endif protected: @@ -376,6 +378,8 @@ private: friend class MixerGroupTabs; + void set_monitor_action_sensitivity (bool); + void monitor_section_going_away (); void monitor_section_attached (); @@ -398,9 +402,6 @@ private: /// true if we are in fullscreen mode bool _maximised; - // true if mixer list is visible - bool _show_mixer_list; - bool _strip_selection_change_without_scroll; mutable boost::weak_ptr spilled_strip; diff --git a/gtk2_ardour/monitor.bindings b/gtk2_ardour/monitor.bindings index d7cafffb46..d0133937d6 100644 --- a/gtk2_ardour/monitor.bindings +++ b/gtk2_ardour/monitor.bindings @@ -1,8 +1,5 @@ - - - diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc index e52b48c7c7..1fb8f79f72 100644 --- a/gtk2_ardour/monitor_section.cc +++ b/gtk2_ardour/monitor_section.cc @@ -927,15 +927,6 @@ MonitorSection::register_actions () monitor_actions = myactions.create_action_group (X_("Monitor")); - myactions.register_toggle_action (monitor_actions, "monitor-mono", _("Switch monitor to mono"), - sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), MonitorMono)); - - myactions.register_toggle_action (monitor_actions, "monitor-cut-all", _("Cut monitor"), - sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), MonitorCutAll)); - - myactions.register_toggle_action (monitor_actions, "monitor-dim-all", _("Dim monitor"), - sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), MonitorDimAll)); - act = myactions.register_toggle_action (monitor_actions, "toggle-exclusive-solo", _("Toggle exclusive solo mode"), sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), ToggleExclusiveSolo)); @@ -1103,13 +1094,14 @@ MonitorSection::map_state () return; } - Glib::RefPtr act; - update_solo_model (); + Glib::RefPtr act; + Glib::RefPtr tact; + act = ActionManager::get_action (X_("Monitor"), "monitor-cut-all"); if (act) { - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + tact = Glib::RefPtr::cast_dynamic (act); if (tact) { tact->set_active (_monitor->cut_all()); } @@ -1117,7 +1109,7 @@ MonitorSection::map_state () act = ActionManager::get_action (X_("Monitor"), "monitor-dim-all"); if (act) { - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + tact = Glib::RefPtr::cast_dynamic (act); if (tact) { tact->set_active (_monitor->dim_all()); } @@ -1125,7 +1117,7 @@ MonitorSection::map_state () act = ActionManager::get_action (X_("Monitor"), "monitor-mono"); if (act) { - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + tact = Glib::RefPtr::cast_dynamic (act); if (tact) { tact->set_active (_monitor->mono()); } diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc index b685e78947..4d51bbce10 100644 --- a/gtk2_ardour/option_editor.cc +++ b/gtk2_ardour/option_editor.cc @@ -202,6 +202,55 @@ RcActionButton::add_to_page (OptionEditorPage *p) } } +/*--------------------------*/ + +CheckOption::CheckOption (string const & i, string const & n, Glib::RefPtr act) +{ + _button = manage (new CheckButton); + _label = manage (new Label); + _label->set_markup (n); + _button->add (*_label); + _button->signal_toggled().connect (sigc::mem_fun (*this, &CheckOption::toggled)); + + Gtkmm2ext::Activatable::set_related_action (act); + if (_action) { + + action_sensitivity_changed (); + + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (_action); + if (tact) { + action_toggled (); + tact->signal_toggled().connect (sigc::mem_fun (*this, &CheckOption::action_toggled)); + } + + _action->connect_property_changed ("sensitive", sigc::mem_fun (*this, &CheckOption::action_sensitivity_changed)); + } +} + +void +CheckOption::action_toggled () +{ + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (_action); + if (tact) { + _button->set_active(tact->get_active()); + } +} + +void +CheckOption::add_to_page (OptionEditorPage* p) +{ + add_widget_to_page (p, _button); +} + +void +CheckOption::toggled () +{ + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (_action); + + tact->set_active( _button->get_active() ); +} + + /*--------------------------*/ BoolOption::BoolOption (string const & i, string const & n, sigc::slot g, sigc::slot s) diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index 132d260c05..d6738889f3 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -33,6 +33,7 @@ #include "widgets/slider_controller.h" +#include "actions.h" #include "ardour_window.h" #include "audio_clock.h" #include "ardour/types.h" @@ -187,6 +188,34 @@ protected: std::string _name; }; +/** Just a Gtk Checkbutton, masquerading as an option component */ +class CheckOption : public OptionEditorComponent , public Gtkmm2ext::Activatable +{ +public: + CheckOption (std::string const &, std::string const &, Glib::RefPtr act ); + void set_state_from_config () {} + void parameter_changed (std::string const &) {} + void add_to_page (OptionEditorPage*); + + void set_sensitive (bool yn) { + _button->set_sensitive (yn); + } + + Gtk::Widget& tip_widget() { return *_button; } + + void action_toggled (); + void action_sensitivity_changed () {} + void action_visibility_changed () {} + +protected: + virtual void toggled (); + + sigc::slot _get; ///< slot to get the configuration variable's value + sigc::slot _set; ///< slot to set the configuration variable's value + Gtk::CheckButton* _button; ///< UI button + Gtk::Label* _label; ///< label for button, so we can use markup +}; + /** Component which provides the UI to handle a boolean option using a GTK CheckButton */ class BoolOption : public Option { diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index 362d28cce4..a2f0227d3f 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -20,6 +20,7 @@ #include "ardour/session.h" #include "ardour/transport_master_manager.h" +#include "actions.h" #include "gui_thread.h" #include "session_option_editor.h" #include "search_path_option.h" @@ -273,11 +274,10 @@ SessionOptionEditor::SessionOptionEditor (Session* s) sigc::mem_fun (*_session_config, &SessionConfiguration::set_auto_input) )); - add_option (_("Monitoring"), new BoolOption ( + add_option (_("Monitoring"), new CheckOption ( "have-monitor-section", _("Use monitor section in this session"), - sigc::mem_fun (*this, &SessionOptionEditor::get_use_monitor_section), - sigc::mem_fun (*this, &SessionOptionEditor::set_use_monitor_section) + ActionManager::get_action(X_("Monitor"), "UseMonitorSection") )); add_option (_("Monitoring"), new OptionEditorBlank ()); @@ -448,34 +448,6 @@ SessionOptionEditor::parameter_changed (std::string const & p) } } -/* the presence of absence of a monitor section is not really a regular session - * property so we provide these two functions to act as setter/getter slots - */ - -bool -SessionOptionEditor::set_use_monitor_section (bool yn) -{ - bool had_monitor_section = _session->monitor_out() != 0; - - if (yn) { - _session->add_monitor_section (); - } else { - _session->remove_monitor_section (); - } - - /* store this choice for any new sessions */ - - Config->set_use_monitor_bus (yn); - - return had_monitor_section != (_session->monitor_out() != 0); -} - -bool -SessionOptionEditor::get_use_monitor_section () -{ - return _session->monitor_out() != 0; -} - void SessionOptionEditor::save_defaults () { diff --git a/gtk2_ardour/session_option_editor.h b/gtk2_ardour/session_option_editor.h index 81d72df731..a27ae88ad1 100644 --- a/gtk2_ardour/session_option_editor.h +++ b/gtk2_ardour/session_option_editor.h @@ -37,9 +37,6 @@ private: ARDOUR::SessionConfiguration* _session_config; - bool set_use_monitor_section (bool); - bool get_use_monitor_section (); - ComboOption* _vpu; ComboOption* _sf; EntryOption* _take_name; -- 2.30.2