Tweaks to Mixer and Monitor keybindings:
authorBen Loftis <ben@harrisonconsoles.com>
Tue, 4 Dec 2018 00:55:52 +0000 (18:55 -0600)
committerBen Loftis <ben@harrisonconsoles.com>
Fri, 7 Dec 2018 18:57:26 +0000 (12:57 -0600)
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.

17 files changed:
gtk2_ardour/ardour.keys.in
gtk2_ardour/ardour.menus.in
gtk2_ardour/ardour_ui.cc
gtk2_ardour/ardour_ui.h
gtk2_ardour/ardour_ui2.cc
gtk2_ardour/ardour_ui_dialogs.cc
gtk2_ardour/ardour_ui_ed.cc
gtk2_ardour/mixer.bindings
gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_ui.cc
gtk2_ardour/mixer_ui.h
gtk2_ardour/monitor.bindings
gtk2_ardour/monitor_section.cc
gtk2_ardour/option_editor.cc
gtk2_ardour/option_editor.h
gtk2_ardour/session_option_editor.cc
gtk2_ardour/session_option_editor.h

index d36ce176ee27329faf1bb28a9348d82aabfba774..656a261bcea276a293beb2afed29ed775d83f2ba 100644 (file)
@@ -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)
index 9ec8babb66f6239282f2071a930adf9b9fd93759..ddc6ce1147720a9f3535afdcabf82c36f0664624 100644 (file)
       </menu>
       <separator/>
       <menuitem action='toggle-session-options-editor'/>
+
+      <menu name='MonitorMenu' action='MonitorMenu'>
+           <menuitem action='UseMonitorSection'/>
+           <menuitem action='monitor-cut-all'/>
+           <menuitem action='monitor-dim-all'/>
+           <menuitem action='monitor-mono'/>
+      </menu>
+      
       <menu name='Metadata' action='Metadata'>
         <menuitem action='EditMetadata'/>
         <menuitem action='ImportMetadata'/>
       <menuitem action='toggle-skip-playback'/>
 #endif
 
-      <separator/>
-      <menuitem action='set-loop-from-edit-range'/>
-      <menuitem action='set-punch-from-edit-range'/>
-      <menuitem action='set-session-from-edit-range'/>
-
       <separator/>
       <menuitem action='Forward'/>
       <menuitem action='Rewind'/>
       <menuitem action='TransitionToReverse'/>
       <separator/>
 
+      <separator/>
+      <menuitem action='set-loop-from-edit-range'/>
+      <menuitem action='set-punch-from-edit-range'/>
+      <menuitem action='set-session-from-edit-range'/>
 
       <menu action="MovePlayHeadMenu">
         <menuitem action='set-playhead'/>
 
       <menuitem action='show-editor-mixer'/>
       <menuitem action='show-editor-list'/>
+
+      <menuitem action='ToggleSummary'/>
+      <menuitem action='ToggleGroupTabs'/>
+      <menuitem action='show-marker-lines'/>
+
+      <separator/>
       <menuitem action='ToggleMixerList'/>
-      <menuitem action='ToggleMonitorSection'/>
 #ifdef MIXBUS
       <menuitem action='ToggleMixbusPane'/>
 #endif
       <menuitem action='ToggleVCAPane'/>
-      <menuitem action='ToggleSummary'/>
-      <menuitem action='ToggleGroupTabs'/>
-      <menuitem action='show-marker-lines'/>
+      <menuitem action='ToggleMonitorSection'/>
 
     </menu>
     <menu action = 'WindowMenu'>
index 6dd659420c84eff9c5ff9039dfb0ddbcec4c558b..9321f1313752e3206fbcef9728fe13b6da7df82f 100644 (file)
@@ -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<Route> mon = _session->monitor_out ();
+       if (!mon) {
+               return;
+       }
+       boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
+
+       Glib::RefPtr<Action> act = global_actions.find_action (X_("Monitor"), "monitor-dim-all");
+       assert (act);  Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+       assert (tact); _monitor->set_dim_all (tact->get_active());
+}
+
+void
+ARDOUR_UI::monitor_cut_all ()
+{
+       boost::shared_ptr<Route> mon = _session->monitor_out ();
+       if (!mon) {
+               return;
+       }
+       boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
+
+       Glib::RefPtr<Action> act = global_actions.find_action (X_("Monitor"), "monitor-cut-all");
+       assert (act);  Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+       assert (tact); _monitor->set_cut_all (tact->get_active());
+}
+
+void
+ARDOUR_UI::monitor_mono ()
+{
+       boost::shared_ptr<Route> mon = _session->monitor_out ();
+       if (!mon) {
+               return;
+       }
+       boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
+
+       Glib::RefPtr<Action> act = global_actions.find_action (X_("Monitor"), "monitor-mono");
+       assert (act);  Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+       assert (tact);_monitor->set_mono (tact->get_active());
+}
index 62a81a6a00ab0e493104c1f2556282af8934f928..dd31e2bbd4c81ac924fbd0a8796d0f622a0e244a 100644 (file)
@@ -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 ();
index 431f094ca7e2e75c8145a8be31a80c1209cbc11b..97d639fc1bb5990d995811b6aa4b6b867d79a89f 100644 (file)
@@ -817,3 +817,21 @@ ARDOUR_UI::update_title ()
        }
 
 }
+
+void
+ARDOUR_UI::toggle_use_monitor_section ()
+{
+       RefPtr<Action> act = ActionManager::get_action (X_("Monitor"), "UseMonitorSection");
+       assert (act);  RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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);
+}
index 7a8366517e6165ec7f2829b47eb7fdedb9c31849..dd1a1233c33b828ac2b14d4430fc6b356a7f3cf9 100644 (file)
@@ -959,49 +959,3 @@ ARDOUR_UI::toggle_mixer_space()
                }
        }
 }
-
-void
-ARDOUR_UI::toggle_mixer_list()
-{
-       Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMixerList");
-
-       if (act) {
-               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
-                       mixer->show_mixer_list (tact->get_active());
-       }
-}
-
-void
-ARDOUR_UI::toggle_monitor_section_visibility ()
-{
-       Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
-
-       if (act) {
-               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
-                       mixer->show_monitor_section (tact->get_active());
-       }
-}
-
-void
-ARDOUR_UI::toggle_vca_pane ()
-{
-       Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleVCAPane");
-
-       if (act) {
-               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
-               mixer->showhide_vcas (tact->get_active());
-       }
-}
-
-#ifdef MIXBUS
-void
-ARDOUR_UI::toggle_mixbus_pane ()
-{
-       Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMixbusPane");
-
-       if (act) {
-               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
-               mixer->showhide_mixbusses (tact->get_active());
-       }
-}
-#endif
index 79d3c6abcad859609886953e5a68e582344b963c..6e9227dd6b9d97f751ba0881d077e67d640e0785 100644 (file)
@@ -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<ToggleAction>::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<ToggleAction>::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<ActionGroup> 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);
index 45219b75a0775946a572c96c067bbf1322d782a5..c62144a40cf586f0ca64c131ca73659825a4e728 100644 (file)
@@ -20,5 +20,9 @@
    <Binding key="Secondary-m" action="Mixer/show-editor" group="Window Visibility"/>
    <Binding key="Secondary-Down" action="Mixer/select-next-stripable" group="Window Visibility"/>
    <Binding key="Secondary-Up" action="Mixer/select-prev-stripable" group="Window Visibility"/>
+
+   <Binding key="Tertiary-l" action="Mixer/ToggleMixerList" group="Window Visibility"/>
+   <Binding key="Tertiary-v" action="Mixer/ToggleVCAPane" group="Window Visibility"/>
+   <Binding key="Tertiary-m" action="Mixer/ToggleMonitorSection" group="Window Visibility"/>
   </Press>
  </Bindings>
index 43ad8a2828e259db571cd1c857789ee9bb6f95bd..1e7c94f9069406d13406877f46340c9e0001265c 100644 (file)
@@ -581,7 +581,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
                solo_iso_table.set_sensitive(false);
                control_slave_ui.set_sensitive(false);
                if (monitor_section_button == 0) {
-                       Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
+                       Glib::RefPtr<Action> 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);
index 07193c3286912ac723f3834a47ce682662a9ae5a..39ddb6b08eb2d53b0b6e93387dede2829371ed91 100644 (file)
@@ -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<Action> act = ActionManager::get_action ("Common", "ToggleVCAPane");
+
+               Glib::RefPtr<Action> 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<Action> act = ActionManager::get_action ("Common", "ToggleVCAPane");
-               if (act) {
-                       act->set_sensitive (true);
-                       Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
-                       showhide_vcas (tact->get_active());
-               } else {
-                       vca_vpacker.show ();
-               }
+               Glib::RefPtr<Action> act = myactions.find_action ("Mixer", "ToggleVCAPane");
+               assert (act);
+               act->set_sensitive (true);
+
+               //if we were showing VCAs before, show them now:
+               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = myactions.find_action ("Mixer", "ToggleMixerList");
+       if (act) {
+               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = myactions.find_action ("Mixer", "ToggleMonitorSection");
+       if (act) {
+               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = myactions.find_action ("Mixer", "ToggleVCAPane");
+       if (act) {
+               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = myactions.find_action ("Mixer", "ToggleMixbusPane");
+       if (act) {
+               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleMixerList"));
+               Glib::RefPtr<Action> act = myactions.find_action (X_("Mixer"), X_("ToggleMixerList"));
                assert (act);
                Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
+               Glib::RefPtr<Action> act = myactions.find_action (X_("Mixer"), X_("ToggleMonitorSection"));
+               assert (act);
+               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = myactions.find_action (X_("Mixer"), X_("ToggleVCAPane"));
+               assert (act);
+               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = myactions.find_action (X_("Mixer"), X_("ToggleMixbusPane"));
+               assert (act);
                Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
-       Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
-       assert (tact);
-       node->set_property ("monitor-section-visible", tact->get_active ());
+       Glib::RefPtr<Action> act = myactions.find_action ("Mixer", "ToggleMixerList");
+       assert (act); Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<ToggleAction>::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<ToggleAction>::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<ToggleAction>::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<Action> act;
+       Glib::RefPtr<ToggleAction> tact;
+
+       act = ActionManager::get_action (X_("Monitor"), "UseMonitorSection");
+       assert (act);  tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+       assert (tact); tact->set_active ( yn );
+
+       act = ActionManager::get_action (X_("Monitor"), "monitor-cut-all");
+       assert (act);  tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+       assert (tact); tact->set_sensitive ( yn );
+
+       act = ActionManager::get_action (X_("Monitor"), "monitor-dim-all");
+       assert (act);  tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+       assert (tact); tact->set_sensitive ( yn );
+
+       act = ActionManager::get_action (X_("Monitor"), "monitor-mono");
+       assert (act);  tact = Glib::RefPtr<ToggleAction>::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<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
+       Glib::RefPtr<Action> act = myactions.find_action ("Mixer", "ToggleMonitorSection");
+       assert (act); act->set_sensitive (true);
+
        Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
+       Glib::RefPtr<Action> 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
index 5908622c581bdf82092abaa1fa79781bef711e14..aab4480d306c6b887cf7898010f00611e3289fe8 100644 (file)
@@ -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<ARDOUR::Stripable> spilled_strip;
index d7cafffb467eea92748ffef977bbf0ff3b16f648..d0133937d6f8ab4966dddb3d93da40cebc01ee20 100644 (file)
@@ -1,8 +1,5 @@
 <Bindings name="Monitor Section">
   <Press>
-     <Binding key="m" action="Monitor/monitor-mono"/>
-     <Binding key="c" action="Monitor/monitor-cut-all"/>
-     <Binding key="d" action="Monitor/monitor-dim-all"/>
      <Binding key="e" action="Monitor/toggle-exclusive-solo"/>
      <Binding key="Shift-o" action="Monitor/toggle-mute-overrides-solo"/>
      <Binding key="b" action="Monitor/toggle-monitor-processor-box"/>
index e52b48c7c75e2bbcf244aa5a56e2bbfc1b15cdce..1fb8f79f72bb493d2e9f29c2287a10428c92f5e9 100644 (file)
@@ -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<Action> act;
-
        update_solo_model ();
 
+       Glib::RefPtr<Action> act;
+       Glib::RefPtr<ToggleAction> tact;
+
        act = ActionManager::get_action (X_("Monitor"), "monitor-cut-all");
        if (act) {
-               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+               tact = Glib::RefPtr<ToggleAction>::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<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+               tact = Glib::RefPtr<ToggleAction>::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<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+               tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
                if (tact) {
                        tact->set_active (_monitor->mono());
                }
index b685e789472c35f5e3e0455c7bf67509500dde34..4d51bbce1033e8691647da15d01b0728bcbb774b 100644 (file)
@@ -202,6 +202,55 @@ RcActionButton::add_to_page (OptionEditorPage *p)
        }
 }
 
+/*--------------------------*/
+
+CheckOption::CheckOption (string const & i, string const & n, Glib::RefPtr<Gtk::Action> 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<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (_action);
+
+       tact->set_active( _button->get_active() );
+}
+
+
 /*--------------------------*/
 
 BoolOption::BoolOption (string const & i, string const & n, sigc::slot<bool> g, sigc::slot<bool, bool> s)
index 132d260c05fbb4685decf2b593399593ca260bb1..d6738889f3dd45a5d8d7618aef5528135c6a1b9e 100644 (file)
@@ -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<Gtk::Action> 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<bool>       _get; ///< slot to get the configuration variable's value
+       sigc::slot<bool, bool> _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
 {
index 362d28cce469d23b11c0b152d6239b9e97217d4a..a2f0227d3f4bdfa4403bc724a0d20a5f44f162ba 100644 (file)
@@ -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 ()
 {
index 81d72df731d49a9cbd1a62e044883caa8ba45020..a27ae88ad1d8c23d1ddb0cfe602ecbfb094d42a5 100644 (file)
@@ -37,9 +37,6 @@ private:
 
        ARDOUR::SessionConfiguration* _session_config;
 
-       bool set_use_monitor_section (bool);
-       bool get_use_monitor_section ();
-
        ComboOption<float>* _vpu;
        ComboOption<ARDOUR::SampleFormat>* _sf;
        EntryOption* _take_name;