no longer delete and recreate MonitorSection when it is removed/added to a Session
[ardour.git] / gtk2_ardour / monitor_section.cc
index ec591a571af016437b5e1586dc3bffc5c07d46c6..201bd175e406ae72754f326c8c29e43240b7c0fa 100644 (file)
 #include "pbd/error.h"
 #include "pbd/replace_all.h"
 
-#include "gtkmm2ext/bindable_button.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"
 #include "ardour/audioengine.h"
 #include "ardour/monitor_processor.h"
 #include "monitor_section.h"
 #include "public_editor.h"
 #include "timers.h"
-#include "tooltips.h"
 #include "ui_config.h"
 #include "utils.h"
 
 #include "pbd/i18n.h"
 
 using namespace ARDOUR;
+using namespace ArdourWidgets;
 using namespace ARDOUR_UI_UTILS;
 using namespace Gtk;
 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)
@@ -88,6 +85,7 @@ MonitorSection::MonitorSection (Session* s)
        , solo_mute_override_button (ArdourButton::led_default_elements)
        , toggle_processorbox_button (ArdourButton::default_elements)
        , _inhibit_solo_model_update (false)
+       , _rr_selection ()
        , _ui_initialized (false)
 {
 
@@ -95,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 ();
@@ -439,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
                        );
 
@@ -621,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 */
 
@@ -923,24 +925,15 @@ MonitorSection::register_actions ()
        string action_descr;
        Glib::RefPtr<Action> act;
 
-       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));
+       monitor_actions = ActionManager::create_action_group (X_("Monitor"));
 
-       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);
@@ -950,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));
 
 }
 
@@ -1101,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());
                }
@@ -1115,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());
                }
@@ -1123,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());
                }
@@ -1178,6 +1172,10 @@ MonitorSection::map_state ()
 void
 MonitorSection::do_blink (bool onoff)
 {
+       if (!UIConfiguration::instance().get_blink_alert_indicators ()) {
+               onoff = true;
+       }
+
        solo_blink (onoff);
        audition_blink (onoff);
 }
@@ -1648,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