no longer delete and recreate MonitorSection when it is removed/added to a Session
[ardour.git] / gtk2_ardour / monitor_section.cc
index ca0b23399d1b87f741a8ba74243459ccc0d6fbff..201bd175e406ae72754f326c8c29e43240b7c0fa 100644 (file)
 #include "pbd/error.h"
 #include "pbd/replace_all.h"
 
-#include "gtkmm2ext/tearoff.h"
 #include "gtkmm2ext/actions.h"
 #include "gtkmm2ext/utils.h"
 
 #include <gtkmm/menu.h>
 #include <gtkmm/menuitem.h>
 
+#include "widgets/tearoff.h"
 #include "widgets/tooltips.h"
 
 #include "ardour/amp.h"
@@ -60,10 +60,6 @@ using namespace Gtkmm2ext;
 using namespace PBD;
 using namespace std;
 
-Glib::RefPtr<ActionGroup> MonitorSection::monitor_actions;
-Gtkmm2ext::ActionMap MonitorSection::myactions (X_("monitor section"));
-Gtkmm2ext::Bindings* MonitorSection::bindings = 0;
-
 #define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
 
 MonitorSection::MonitorSection (Session* s)
@@ -97,15 +93,13 @@ MonitorSection::MonitorSection (Session* s)
 
        Glib::RefPtr<Action> act;
 
-       if (!monitor_actions) {
-               register_actions ();
-               load_bindings ();
-       }
+       load_bindings ();
+       register_actions ();
+       set_data ("ardour-bindings", bindings);
+       bindings->associate ();
 
        channel_size_group = SizeGroup::create (SIZE_GROUP_HORIZONTAL);
 
-       set_data ("ardour-bindings", bindings);
-
        _plugin_selector = new PluginSelector (PluginManager::instance());
        insert_box = new ProcessorBox (_session, boost::bind (&MonitorSection::plugin_selector, this), _rr_selection, 0);
        insert_box->set_no_show_all ();
@@ -441,9 +435,9 @@ MonitorSection::MonitorSection (Session* s)
        vpacker.pack_start (master_packer,        false, false, PX_SCALE(10));
        vpacker.pack_end   (*out_packer,          false, false,
 #ifdef MIXBUS
-                       scrollbar_height - 2 /* no outer frame */
+                       scrollbar_height - 2 /* no outer sample */
 #else
-                       scrollbar_height + 2 /* frame borders */
+                       scrollbar_height + 2 /* sample borders */
 #endif
                        );
 
@@ -623,6 +617,12 @@ MonitorSection::set_session (Session* s)
 
                populate_buttons ();
 
+               /* some actions may have been left in the wrong state from a
+                * previous monitor route that was then deleted
+                */
+               ActionManager::set_sensitive (monitor_actions, true);
+               ActionManager::set_sensitive (solo_actions, true);
+
        } else {
                /* no session */
 
@@ -925,24 +925,15 @@ MonitorSection::register_actions ()
        string action_descr;
        Glib::RefPtr<Action> act;
 
-       monitor_actions = myactions.create_action_group (X_("Monitor"));
+       monitor_actions = ActionManager::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"),
+       act = ActionManager::register_toggle_action (monitor_actions, "toggle-exclusive-solo", _("Toggle exclusive solo mode"),
                        sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), ToggleExclusiveSolo));
 
        Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
        tact->set_active (Config->get_exclusive_solo());
 
-       act = myactions.register_toggle_action (monitor_actions, "toggle-mute-overrides-solo", _("Toggle mute overrides solo mode"),
+       act = ActionManager::register_toggle_action (monitor_actions, "toggle-mute-overrides-solo", _("Toggle mute overrides solo mode"),
                        sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), ToggleMuteOverridesSolo));
 
        tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
@@ -952,39 +943,39 @@ MonitorSection::register_actions ()
 
                action_name = string_compose (X_("monitor-cut-%1"), chn);
                action_descr = string_compose (_("Cut monitor channel %1"), chn);
-               myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
+               ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
                                sigc::bind (sigc::ptr_fun (action_proxy1), CutChannel, chn));
 
                action_name = string_compose (X_("monitor-dim-%1"), chn);
                action_descr = string_compose (_("Dim monitor channel %1"), chn);
-               myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
+               ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
                                sigc::bind (sigc::ptr_fun (action_proxy1), DimChannel, chn));
 
                action_name = string_compose (X_("monitor-solo-%1"), chn);
                action_descr = string_compose (_("Solo monitor channel %1"), chn);
-               myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
+               ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
                                sigc::bind (sigc::ptr_fun (action_proxy1), SoloChannel, chn));
 
                action_name = string_compose (X_("monitor-invert-%1"), chn);
                action_descr = string_compose (_("Invert monitor channel %1"), chn);
-               myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
+               ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
                                sigc::bind (sigc::ptr_fun (action_proxy1), InvertChannel, chn));
 
        }
 
 
-       Glib::RefPtr<ActionGroup> solo_actions = myactions.create_action_group (X_("Solo"));
+       Glib::RefPtr<ActionGroup> solo_actions = ActionManager::create_action_group (X_("Solo"));
        RadioAction::Group solo_group;
 
-       myactions.register_radio_action (solo_actions, solo_group, "solo-use-in-place", _("In-place solo"),
-                       sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), SoloUseInPlace));
-       myactions.register_radio_action (solo_actions, solo_group, "solo-use-afl", _("After Fade Listen (AFL) solo"),
-                       sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), SoloUseAFL));
-       myactions.register_radio_action (solo_actions, solo_group, "solo-use-pfl", _("Pre Fade Listen (PFL) solo"),
-                       sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), SoloUsePFL));
+       ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-in-place", _("In-place solo"),
+                                             sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), SoloUseInPlace));
+       ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-afl", _("After Fade Listen (AFL) solo"),
+                                             sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), SoloUseAFL));
+       ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-pfl", _("Pre Fade Listen (PFL) solo"),
+                                             sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), SoloUsePFL));
 
-       myactions.register_toggle_action (monitor_actions, "toggle-monitor-processor-box", _("Toggle Monitor Section Processor Box"),
-                       sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), ToggleMonitorProcessorBox));
+       ActionManager::register_toggle_action (monitor_actions, "toggle-monitor-processor-box", _("Toggle Monitor Section Processor Box"),
+                                              sigc::bind (sigc::ptr_fun (MonitorSection::action_proxy0), ToggleMonitorProcessorBox));
 
 }
 
@@ -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());
                }
@@ -1654,7 +1646,7 @@ MonitorSection::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost:
 void
 MonitorSection::load_bindings ()
 {
-       bindings = Bindings::get_bindings (X_("Monitor Section"), myactions);
+       bindings = Bindings::get_bindings (X_("Monitor Section"));
 }
 
 void