summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/ardour.keys.in12
-rw-r--r--gtk2_ardour/ardour.menus.in28
-rw-r--r--gtk2_ardour/ardour_ui.cc43
-rw-r--r--gtk2_ardour/ardour_ui.h12
-rw-r--r--gtk2_ardour/ardour_ui2.cc18
-rw-r--r--gtk2_ardour/ardour_ui_dialogs.cc46
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc32
-rw-r--r--gtk2_ardour/mixer.bindings4
-rw-r--r--gtk2_ardour/mixer_strip.cc2
-rw-r--r--gtk2_ardour/mixer_ui.cc200
-rw-r--r--gtk2_ardour/mixer_ui.h25
-rw-r--r--gtk2_ardour/monitor.bindings3
-rw-r--r--gtk2_ardour/monitor_section.cc20
-rw-r--r--gtk2_ardour/option_editor.cc49
-rw-r--r--gtk2_ardour/option_editor.h29
-rw-r--r--gtk2_ardour/session_option_editor.cc34
-rw-r--r--gtk2_ardour/session_option_editor.h3
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 @@
</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'/>
@@ -77,17 +85,16 @@
#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='TransitionToRoll'/>
<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'/>
@@ -512,15 +519,18 @@
<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'>
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<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());
+}
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<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);
+}
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<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
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<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);
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 @@
<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>
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<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);
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<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;
@@ -1963,6 +1987,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)
{
RouteGroup* group;
@@ -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;
}
@@ -2526,9 +2634,37 @@ 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
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<ARDOUR::Stripable> 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 @@
<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"/>
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<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());
}
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
@@ -204,6 +204,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)
: Option (i, n),
_get (g),
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<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
{
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<float>* _vpu;
ComboOption<ARDOUR::SampleFormat>* _sf;
EntryOption* _take_name;