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.
This commit is contained in:
Ben Loftis 2018-12-03 18:55:52 -06:00
parent 19cb8cf138
commit 65bda27d42
17 changed files with 391 additions and 171 deletions

View 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)

View file

@ -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'/>
@ -76,11 +84,6 @@
<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'/>
@ -88,6 +91,10 @@
<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'>

View 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());
}

View 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 ();

View 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);
}

View 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

View 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);

View 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>

View 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);

View 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::show_monitor_section (bool yn)
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::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);
show_monitor_section (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);
}
#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

View 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;

View 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"/>

View 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());
}

View 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)

View 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
{

View 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 ()
{

View 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;