hopefully get dynamic tabbable menu state right this time
[ardour.git] / gtk2_ardour / ardour_ui_ed.cc
index e33252850367b26336839edb10841360f72aba06..299a5d7d69e2f754c87ea0fef61baf7b64fe5291 100644 (file)
@@ -49,6 +49,7 @@
 #include "engine_dialog.h"
 #include "editor.h"
 #include "actions.h"
+#include "meterbridge.h"
 #include "mixer_ui.h"
 #include "startup.h"
 #include "window_manager.h"
@@ -78,14 +79,15 @@ ARDOUR_UI::create_editor ()
 {
        try {
                editor = new Editor ();
+               editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change));
+               editor->add_to_notebook (_tabs, _("Editor"));
        }
 
        catch (failed_constructor& err) {
                return -1;
        }
 
-       editor->Realized.connect (sigc::mem_fun (*this, &ARDOUR_UI::editor_realized));
-       editor->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), true));
+        editor->signal_event().connect (sigc::bind (sigc::ptr_fun (&Keyboard::catch_user_event_for_pre_dialog_focus), editor));
 
        return 0;
 }
@@ -105,6 +107,10 @@ ARDOUR_UI::install_actions ()
        ActionManager::register_action (main_menu_actions, X_("Sync"), _("Sync"));
        ActionManager::register_action (main_menu_actions, X_("TransportOptions"), _("Options"));
        ActionManager::register_action (main_menu_actions, X_("WindowMenu"), _("Window"));
+       ActionManager::register_action (main_menu_actions, X_("MixerMenu"), _("Mixer"));
+       ActionManager::register_action (main_menu_actions, X_("EditorMenu"), _("Editor"));
+       ActionManager::register_action (main_menu_actions, X_("PrefsMenu"), _("Preferences"));
+       ActionManager::register_action (main_menu_actions, X_("DetachMenu"), _("Detach"));
        ActionManager::register_action (main_menu_actions, X_("Help"), _("Help"));
        ActionManager::register_action (main_menu_actions, X_("KeyMouseActions"), _("Misc. Shortcuts"));
        ActionManager::register_action (main_menu_actions, X_("AudioFileFormat"), _("Audio File Format"));
@@ -131,13 +137,24 @@ ARDOUR_UI::install_actions ()
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::write_sensitive_actions.push_back (act);
 
+       act = ActionManager::register_action (main_actions, X_("duplicate-routes"), _("Duplicate Tracks/Busses..."),
+                                             sigc::mem_fun(*this, &ARDOUR_UI::start_duplicate_routes));
+       ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
+       ActionManager::track_selection_sensitive_actions.push_back (act);
+
+       act = ActionManager::register_action (main_actions, X_("cancel-solo"), _("Cancel Solo"), sigc::mem_fun(*this, &ARDOUR_UI::cancel_solo));
+       ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
+
+
        act = ActionManager::register_action (main_actions, X_("OpenVideo"), _("Open Video"),
                                              sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::add_video), (Gtk::Window*) 0));
        ActionManager::session_sensitive_actions.push_back (act);
        act = ActionManager::register_action (main_actions, X_("CloseVideo"), _("Remove Video"),
                                              sigc::mem_fun (*this, &ARDOUR_UI::remove_video));
        act->set_sensitive (false);
-       act = ActionManager::register_action (main_actions, X_("ExportVideo"), _("Export To Video File"),
+       act = ActionManager::register_action (main_actions, X_("ExportVideo"), _("Export to Video File"),
                        hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::export_video), false)));
        ActionManager::session_sensitive_actions.push_back (act);
 
@@ -149,6 +166,14 @@ ARDOUR_UI::install_actions ()
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::write_sensitive_actions.push_back (act);
 
+       act = ActionManager::register_action (main_actions, X_("QuickSnapshotStay"), _("Quick Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), false));
+       ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
+
+       act = ActionManager::register_action (main_actions, X_("QuickSnapshotSwitch"), _("Quick Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), true));
+       ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
+
        act = ActionManager::register_action (main_actions, X_("SaveAs"), _("Save As..."), sigc::mem_fun(*this, &ARDOUR_UI::save_session_as));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::write_sensitive_actions.push_back (act);
@@ -169,7 +194,7 @@ ARDOUR_UI::install_actions ()
        act = ActionManager::register_action (main_actions, X_("ImportMetadata"), _("Import Metadata..."),  sigc::mem_fun(*this, &ARDOUR_UI::import_metadata));
        ActionManager::session_sensitive_actions.push_back (act);
 
-       act = ActionManager::register_action (main_actions, X_("ExportAudio"), _("Export To Audio File(s)..."),  sigc::mem_fun (*editor, &PublicEditor::export_audio));
+       act = ActionManager::register_action (main_actions, X_("ExportAudio"), _("Export to Audio File(s)..."),  sigc::mem_fun (*editor, &PublicEditor::export_audio));
        ActionManager::session_sensitive_actions.push_back (act);
 
        act = ActionManager::register_action (main_actions, X_("StemExport"), _("Stem export..."),  sigc::mem_fun (*editor, &PublicEditor::stem_export));
@@ -196,6 +221,22 @@ ARDOUR_UI::install_actions ()
        ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (hide_return (sigc::mem_fun(*this, &ARDOUR_UI::finish))));
        ActionManager::register_action (common_actions, X_("Hide"), _("Hide"), sigc::mem_fun (*this, &ARDOUR_UI::hide_application));
 
+       ActionManager::register_action (common_actions, X_("show-editor"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), editor));
+       ActionManager::register_action (common_actions, X_("show-mixer"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), mixer));
+       ActionManager::register_action (common_actions, X_("show-preferences"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), rc_option_editor));
+
+       ActionManager::register_action (common_actions, X_("hide-editor"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), editor));
+       ActionManager::register_action (common_actions, X_("hide-mixer"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), mixer));
+       ActionManager::register_action (common_actions, X_("hide-preferences"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), rc_option_editor));
+       
+       ActionManager::register_action (common_actions, X_("attach-editor"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), editor));
+       ActionManager::register_action (common_actions, X_("attach-mixer"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), mixer));
+       ActionManager::register_action (common_actions, X_("attach-preferences"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), rc_option_editor));
+       
+       ActionManager::register_action (common_actions, X_("detach-editor"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), editor));
+       ActionManager::register_action (common_actions, X_("detach-mixer"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), mixer));
+       ActionManager::register_action (common_actions, X_("detach-preferences"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), rc_option_editor));
+
        /* windows visibility actions */
 
        ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
@@ -203,27 +244,31 @@ ARDOUR_UI::install_actions ()
        act = ActionManager::register_toggle_action (common_actions, X_("KeepTearoffs"), _("Show Toolbars"), mem_fun (*this, &ARDOUR_UI::toggle_keep_tearoffs));
        ActionManager::session_sensitive_actions.push_back (act);
 
+       act = ActionManager::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 = ActionManager::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())
        ActionManager::register_action (common_actions, X_("show-ui-prefs"), _("Show more UI preferences"), sigc::mem_fun (*this, &ARDOUR_UI::show_ui_prefs));
 
-       ActionManager::register_action (common_actions, X_("toggle-mixer"), S_("Window|Mixer"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_mixer_window));
-       ActionManager::register_action (common_actions, X_("toggle-editor-mixer"), _("Toggle Editor+Mixer"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_editor_mixer));
        ActionManager::register_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
 
        ActionManager::register_action (common_actions, X_("reattach-all-tearoffs"), _("Reattach All Tearoffs"), sigc::mem_fun (*this, &ARDOUR_UI::reattach_all_tearoffs));
 
        act = ActionManager::register_action (common_actions, X_("NewMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::new_midi_tracer_window));
        ActionManager::session_sensitive_actions.push_back (act);
-       ActionManager::register_action (common_actions, X_("Chat"), _("Chat"),  sigc::mem_fun(*this, &ARDOUR_UI::launch_chat));
+       ActionManager::register_action (common_actions, X_("chat"), _("Chat"),  sigc::mem_fun(*this, &ARDOUR_UI::launch_chat));
        /** TRANSLATORS: This is `Manual' in the sense of an instruction book that tells a user how to use Ardour */
-       ActionManager::register_action (common_actions, X_("Manual"), S_("Help|Manual"),  mem_fun(*this, &ARDOUR_UI::launch_manual));
-       ActionManager::register_action (common_actions, X_("Reference"), _("Reference"),  mem_fun(*this, &ARDOUR_UI::launch_reference));
-       ActionManager::register_action (common_actions, X_("Tracker"), _("Report A Bug"), mem_fun(*this, &ARDOUR_UI::launch_tracker));
-       ActionManager::register_action (common_actions, X_("Cheat_Sheet"), _("Cheat Sheet"), mem_fun(*this, &ARDOUR_UI::launch_cheat_sheet));
-       ActionManager::register_action (common_actions, X_("Website"), _("Ardour Website"), mem_fun(*this, &ARDOUR_UI::launch_website));
-       ActionManager::register_action (common_actions, X_("Website_Dev"), _("Ardour Development"), mem_fun(*this, &ARDOUR_UI::launch_website_dev));
-       ActionManager::register_action (common_actions, X_("Forums"), _("User Forums"), mem_fun(*this, &ARDOUR_UI::launch_forums));
-       ActionManager::register_action (common_actions, X_("Howto_Report"), _("How to report a bug"), mem_fun(*this, &ARDOUR_UI::launch_howto_report));
+       ActionManager::register_action (common_actions, X_("manual"), S_("Help|Manual"),  mem_fun(*this, &ARDOUR_UI::launch_manual));
+       ActionManager::register_action (common_actions, X_("reference"), S_("Manual|Reference"),  mem_fun(*this, &ARDOUR_UI::launch_reference));
+       ActionManager::register_action (common_actions, X_("tracker"), _("Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_tracker));
+       ActionManager::register_action (common_actions, X_("cheat-sheet"), _("Cheat Sheet"), mem_fun(*this, &ARDOUR_UI::launch_cheat_sheet));
+       ActionManager::register_action (common_actions, X_("website"), _("Ardour Website"), mem_fun(*this, &ARDOUR_UI::launch_website));
+       ActionManager::register_action (common_actions, X_("website-dev"), _("Ardour Development"), mem_fun(*this, &ARDOUR_UI::launch_website_dev));
+       ActionManager::register_action (common_actions, X_("forums"), _("User Forums"), mem_fun(*this, &ARDOUR_UI::launch_forums));
+       ActionManager::register_action (common_actions, X_("howto-report"), _("How to Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_howto_report));
 
        act = ActionManager::register_action (common_actions, X_("Save"), _("Save"),  sigc::hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""), false)));
        ActionManager::session_sensitive_actions.push_back (act);
@@ -265,11 +310,11 @@ if (Profile->get_mixbus())
           - otherwise do nothing
        */
 
-       act = ActionManager::register_action (transport_actions, X_("TransitionToRoll"), _("Transition To Roll"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
+       act = ActionManager::register_action (transport_actions, X_("TransitionToRoll"), _("Transition to Roll"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
-       act = ActionManager::register_action (transport_actions, X_("TransitionToReverse"), _("Transition To Reverse"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
+       act = ActionManager::register_action (transport_actions, X_("TransitionToReverse"), _("Transition to Reverse"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
@@ -611,6 +656,18 @@ ARDOUR_UI::save_ardour_state ()
        XMLNode* window_node = new XMLNode (X_("UI"));
        window_node->add_property (_status_bar_visibility.get_state_name().c_str(), _status_bar_visibility.get_state_value ());
 
+       /* main window */
+
+       gint mx, my, mw, mh;
+       _main_window.get_position (mx, my);
+       _main_window.get_size (mw, mh);
+
+       XMLNode main_window_node (X_("Main"));
+       main_window_node.add_property (X_("x"), PBD::to_string (mx, std::dec));
+       main_window_node.add_property (X_("y"), PBD::to_string (my, std::dec));
+       main_window_node.add_property (X_("w"), PBD::to_string (mw, std::dec));
+       main_window_node.add_property (X_("h"), PBD::to_string (mh, std::dec));
+
        /* Windows */
 
        WM::Manager::instance().add_state (*window_node);
@@ -639,18 +696,19 @@ ARDOUR_UI::save_ardour_state ()
 
        window_node->add_child_nocopy (*tearoff_node);
 
+       XMLNode& enode (editor->get_state());
+       XMLNode& mnode (mixer->get_state());
+       XMLNode& bnode (meterbridge->get_state());
+
        Config->add_extra_xml (*window_node);
        Config->add_extra_xml (audio_midi_setup->get_state());
 
        Config->save_state();
 
-       ui_config->save_state ();
-
-       XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
-       XMLNode& mnode (mixer->get_state());
-       XMLNode& bnode (meterbridge->get_state());
+       UIConfiguration::instance().save_state ();
 
        if (_session) {
+               _session->add_instant_xml (main_window_node);
                _session->add_instant_xml (enode);
                _session->add_instant_xml (mnode);
                _session->add_instant_xml (bnode);
@@ -658,8 +716,10 @@ ARDOUR_UI::save_ardour_state ()
                        _session->add_instant_xml (location_ui->ui().get_state ());
                }
        } else {
+               Config->add_instant_xml (main_window_node);
                Config->add_instant_xml (enode);
                Config->add_instant_xml (mnode);
+               Config->add_instant_xml (bnode);
                if (location_ui) {
                        Config->add_instant_xml (location_ui->ui().get_state ());
                }
@@ -699,3 +759,9 @@ ARDOUR_UI::xrun_button_release (GdkEventButton* ev)
        }
        return true;
 }
+
+Gtk::Notebook&
+ARDOUR_UI::tabs()
+{
+       return _tabs;
+}