GUI action Transport/RecordCountIn
[ardour.git] / gtk2_ardour / ardour_ui_ed.cc
index 2ca83ca7bfda808438f2af0c695989e3b64d2a9f..1cca283900f9e129e86c03df55cf465f987b8515 100644 (file)
@@ -49,6 +49,7 @@
 #include "monitor_section.h"
 #include "engine_dialog.h"
 #include "editor.h"
+#include "editing.h"
 #include "actions.h"
 #include "meterbridge.h"
 #include "luawindow.h"
@@ -68,7 +69,7 @@
 
 #include "control_protocol/control_protocol.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -108,6 +109,18 @@ ARDOUR_UI::create_luawindow ()
        return 0;
 }
 
+void
+ARDOUR_UI::escape ()
+{
+       Escape (); /* EMIT SIGNAL */
+}
+
+void
+ARDOUR_UI::close_current_dialog ()
+{
+       Keyboard::close_current_dialog ();
+}
+
 void
 ARDOUR_UI::install_actions ()
 {
@@ -115,6 +128,13 @@ ARDOUR_UI::install_actions ()
        Glib::RefPtr<ActionGroup> main_menu_actions = global_actions.create_action_group (X_("Main_menu"));
        Glib::RefPtr<Action> act;
 
+       global_actions.register_action (main_actions, X_("Escape"), _("Escape (deselect all)"), sigc::mem_fun (*this, &ARDOUR_UI::escape));
+       /* This is hard-wired into the Keyboard code as "Primary-w". Maybe it
+          doesn't need to be. This action makes it possible to do this from a
+          control surface.
+       */
+       global_actions.register_action (main_actions, X_("close-current-dialog"), _("Close Current Dialog"), sigc::mem_fun (*this, &ARDOUR_UI::close_current_dialog));
+
        /* menus + submenus that need action items */
 
        global_actions.register_action (main_menu_actions, X_("Session"), _("Session"));
@@ -126,7 +146,6 @@ ARDOUR_UI::install_actions ()
        global_actions.register_action (main_menu_actions, X_("MixerMenu"), _("Mixer"));
        global_actions.register_action (main_menu_actions, X_("EditorMenu"), _("Editor"));
        global_actions.register_action (main_menu_actions, X_("PrefsMenu"), _("Preferences"));
-       global_actions.register_action (main_menu_actions, X_("MastersMenu"), _("Master Faders"));
        global_actions.register_action (main_menu_actions, X_("DetachMenu"), _("Detach"));
        global_actions.register_action (main_menu_actions, X_("Help"), _("Help"));
        global_actions.register_action (main_menu_actions, X_("KeyMouseActions"), _("Misc. Shortcuts"));
@@ -149,9 +168,10 @@ ARDOUR_UI::install_actions ()
        act = global_actions.register_action (main_actions, X_("Close"), _("Close"),  sigc::mem_fun(*this, &ARDOUR_UI::close_session));
        ActionManager::session_sensitive_actions.push_back (act);
 
-       act = global_actions.register_action (main_actions, X_("AddTrackBus"), _("Add Track or Bus..."), sigc::mem_fun(*this, &ARDOUR_UI::add_route));
+       act = global_actions.register_action (main_actions, X_("AddTrackBus"), _("Add Track, Bus or VCA..."), sigc::mem_fun(*this, &ARDOUR_UI::add_route));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::write_sensitive_actions.push_back (act);
+       ActionManager::rec_sensitive_actions.push_back (act);
 
        act = global_actions.register_action (main_actions, X_("duplicate-routes"), _("Duplicate Tracks/Busses..."),
                                              sigc::mem_fun(*this, &ARDOUR_UI::start_duplicate_routes));
@@ -200,6 +220,9 @@ ARDOUR_UI::install_actions ()
        act = global_actions.register_action (main_actions, X_("SaveAs"), _("Save As..."), sigc::mem_fun(*this, &ARDOUR_UI::save_session_as));
        ActionManager::session_sensitive_actions.push_back (act);
 
+       act = global_actions.register_action (main_actions, X_("Archive"), _("Archive..."), sigc::mem_fun(*this, &ARDOUR_UI::archive_session));
+       ActionManager::session_sensitive_actions.push_back (act);
+
        act = global_actions.register_action (main_actions, X_("Rename"), _("Rename..."), sigc::mem_fun(*this, &ARDOUR_UI::rename_session));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::write_sensitive_actions.push_back (act);
@@ -261,6 +284,67 @@ ARDOUR_UI::install_actions ()
        global_actions.register_action (common_actions, X_("detach-mixer"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), mixer));
        global_actions.register_action (common_actions, X_("detach-preferences"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), rc_option_editor));
 
+       /* these actions are all currently implemented by the Editor, but need
+        * to be accessible from anywhere as actions.
+        */
+
+       act = global_actions.register_action (common_actions, "alternate-jump-forward-to-mark", _("Jump to Next Mark"), sigc::mem_fun(editor, &PublicEditor::jump_forward_to_mark));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "alternate-jump-backward-to-mark", _("Jump to Previous Mark"), sigc::mem_fun(editor, &PublicEditor::jump_backward_to_mark));
+       ActionManager::session_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (common_actions, "set-session-start-from-playhead", _("Set Session Start from Playhead"), sigc::mem_fun(editor, &PublicEditor::set_session_start_from_playhead));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "set-session-end-from-playhead", _("Set Session End from Playhead"), sigc::mem_fun(editor, &PublicEditor::set_session_end_from_playhead));
+       ActionManager::session_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (common_actions, "toggle-location-at-playhead", _("Toggle Mark at Playhead"), sigc::mem_fun(editor, &PublicEditor::toggle_location_at_playhead_cursor));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "add-location-from-playhead", _("Add Mark from Playhead"), sigc::mem_fun(editor, &PublicEditor::add_location_from_playhead_cursor));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "alternate-add-location-from-playhead", _("Add Mark from Playhead"), sigc::mem_fun(editor, &PublicEditor::add_location_from_playhead_cursor));
+       ActionManager::session_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (common_actions, "remove-location-from-playhead", _("Remove Mark at Playhead"), sigc::mem_fun(editor, &PublicEditor::remove_location_at_playhead_cursor));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "alternate-remove-location-from-playhead", _("Remove Mark at Playhead"), sigc::mem_fun(editor, &PublicEditor::remove_location_at_playhead_cursor));
+       ActionManager::session_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (common_actions, "nudge-next-forward", _("Nudge Next Later"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::nudge_forward), true, false));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "nudge-next-backward", _("Nudge Next Earlier"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::nudge_backward), true, false));
+       ActionManager::session_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (common_actions, "nudge-playhead-forward", _("Nudge Playhead Forward"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::nudge_forward), false, true));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "nudge-playhead-backward", _("Nudge Playhead Backward"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::nudge_backward), false, true));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "playhead-forward-to-grid", _("Playhead to Next Grid"), sigc::mem_fun(editor, &PublicEditor::playhead_forward_to_grid));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "playhead-backward-to-grid", _("Playhead to Previous Grid"), sigc::mem_fun(editor, &PublicEditor::playhead_backward_to_grid));
+       ActionManager::session_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (common_actions, "start-range-from-playhead", _("Start Range from Playhead"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::keyboard_selection_begin), Editing::EDIT_IGNORE_MOUSE ));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "finish-range-from-playhead", _("Finish Range from Playhead"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::keyboard_selection_finish), false, Editing::EDIT_IGNORE_MOUSE ));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "start-range", _("Start Range"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::keyboard_selection_begin), Editing::EDIT_IGNORE_NONE));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "finish-range", _("Finish Range"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::keyboard_selection_finish), false, Editing::EDIT_IGNORE_NONE));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "start-punch-range", _("Start Punch Range"), sigc::mem_fun(editor, &PublicEditor::set_punch_start_from_edit_point));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "finish-punch-range", _("Finish Punch Range"), sigc::mem_fun(editor, &PublicEditor::set_punch_end_from_edit_point));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "start-loop-range", _("Start Loop Range"), sigc::mem_fun(editor, &PublicEditor::set_loop_start_from_edit_point));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "finish-loop-range", _("Finish Loop Range"), sigc::mem_fun(editor, &PublicEditor::set_loop_end_from_edit_point));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "alt-start-range", _("Start Range"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::keyboard_selection_begin), Editing::EDIT_IGNORE_NONE));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_action (common_actions, "alt-finish-range", _("Finish Range"), sigc::bind (sigc::mem_fun(editor, &PublicEditor::keyboard_selection_finish), false, Editing::EDIT_IGNORE_NONE));
+       ActionManager::session_sensitive_actions.push_back (act);
+
        /* These "change" actions are not intended to be used inside menus, but
           are for the tab/window control buttons, which have somewhat odd
           semantics.
@@ -319,6 +403,19 @@ ARDOUR_UI::install_actions ()
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::write_sensitive_actions.push_back (act);
 
+       act = global_actions.register_action (common_actions,
+                       "jump-backward-to-mark", _("Jump to Previous Mark"), sigc::mem_fun(*editor, &PublicEditor::jump_backward_to_mark));
+       ActionManager::session_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (common_actions,
+                       "jump-forward-to-mark", _("Jump to Next Mark"), sigc::mem_fun(*editor, &PublicEditor::jump_forward_to_mark));
+       ActionManager::session_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (common_actions,
+                       X_("addExistingAudioFiles"), _("Import"), sigc::mem_fun (*editor, &PublicEditor::external_audio_dialog));
+       ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
+
        Glib::RefPtr<ActionGroup> transport_actions = global_actions.create_action_group (X_("Transport"));
 
        /* do-nothing action for the "transport" menu bar item */
@@ -369,10 +466,18 @@ ARDOUR_UI::install_actions ()
        act = global_actions.register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_selection));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
-       act = global_actions.register_action (transport_actions, X_("PlayPreroll"), _("Play Selection w/Preroll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_preroll));
+       act = global_actions.register_action (transport_actions, X_("PlayPreroll"), _("Play w/Preroll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_preroll));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
+       act = global_actions.register_action (transport_actions, X_("RecordPreroll"), _("Record w/Preroll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_rec_preroll));
+       ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
+
+       act = global_actions.register_action (transport_actions, X_("RecordCountIn"), _("Record w/Count-In"), sigc::mem_fun(*this, &ARDOUR_UI::transport_rec_count_in));
+       ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
+
        act = global_actions.register_action (transport_actions, X_("Record"), _("Enable Record"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), false));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::write_sensitive_actions.push_back (act);
@@ -478,6 +583,13 @@ ARDOUR_UI::install_actions ()
        act = global_actions.register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Frames, false));
        ActionManager::session_sensitive_actions.push_back (act);
 
+       act = global_actions.register_toggle_action (transport_actions, X_("SessionMonitorIn"), _("All Input"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_monitoring_in));
+       act->set_short_label (_("All In"));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = global_actions.register_toggle_action (transport_actions, X_("SessionMonitorDisk"), _("All Disk"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_monitoring_disk));
+       act->set_short_label (_("All Disk"));
+       ActionManager::session_sensitive_actions.push_back (act);
+
        act = global_actions.register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch In"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
        act->set_short_label (_("In"));
        ActionManager::session_sensitive_actions.push_back (act);
@@ -502,7 +614,7 @@ ARDOUR_UI::install_actions ()
        act = global_actions.register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto Return"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
-       act = global_actions.register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_follow_edits));
+       act = global_actions.register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Range"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_follow_edits));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
@@ -536,13 +648,11 @@ ARDOUR_UI::install_actions ()
        ActionManager::session_sensitive_actions.push_back (act);
        act = global_actions.register_toggle_action (option_actions, X_("SendMidiClock"), _("Send MIDI Clock"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_clock));
        ActionManager::session_sensitive_actions.push_back (act);
-       act = global_actions.register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI Feedback"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
-       ActionManager::session_sensitive_actions.push_back (act);
 
        /* MIDI */
 
        Glib::RefPtr<ActionGroup> midi_actions = global_actions.create_action_group (X_("MIDI"));
-       global_actions.register_action (midi_actions, X_("panic"), _("Panic"), sigc::mem_fun(*this, &ARDOUR_UI::midi_panic));
+       global_actions.register_action (midi_actions, X_("panic"), _("Panic (Send MIDI all-notes-off)"), sigc::mem_fun(*this, &ARDOUR_UI::midi_panic));
 }
 
 void
@@ -589,18 +699,6 @@ ARDOUR_UI::build_menu_bar ()
        use_menubar_as_top_menubar ();
 #endif
 
-       bool wall_clock = false;
-       bool disk_space = false;
-
-       if (!Profile->get_small_screen()) {
-#ifndef __APPLE__
-               // OSX provides its own wallclock, thank you very much
-               wall_clock = true;
-#endif
-               disk_space = true;
-       }
-
-
        hbox->pack_end (error_alert_button, false, false, 2);
 
        hbox->pack_end (wall_clock_label, false, false, 2);
@@ -619,9 +717,10 @@ ARDOUR_UI::build_menu_bar ()
        menu_bar_base.add (menu_hbox);
 
 #ifndef __APPLE__
-       _status_bar_visibility.add (&wall_clock_label,      X_("WallClock"), _("Wall Clock"), wall_clock);
+       // OSX provides its own wallclock, thank you very much
+       _status_bar_visibility.add (&wall_clock_label,      X_("WallClock"), _("Wall Clock"), true);
 #endif
-       _status_bar_visibility.add (&disk_space_label,      X_("Disk"),      _("Disk Space"), disk_space);
+       _status_bar_visibility.add (&disk_space_label,      X_("Disk"),      _("Disk Space"), !Profile->get_small_screen());
        _status_bar_visibility.add (&cpu_load_label,        X_("DSP"),       _("DSP"), true);
        _status_bar_visibility.add (&xrun_label,            X_("XRun"),      _("X-run"), false);
        _status_bar_visibility.add (&peak_thread_work_label,X_("Peakfile"),  _("Active Peak-file Work"), false);
@@ -680,7 +779,6 @@ ARDOUR_UI::save_ardour_state ()
        LocaleGuard lg; // one guard to rule them all
        XMLNode* node = new XMLNode (keyboard->get_state());
        Config->add_extra_xml (*node);
-       Config->add_extra_xml (get_transport_controllable_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 ());
@@ -705,8 +803,6 @@ ARDOUR_UI::save_ardour_state ()
                current_tab = "mixer";
        } else if (current_page_number == _tabs.page_num (rc_option_editor->contents())) {
                current_tab = "preferences";
-       } else if (masters && (current_page_number == _tabs.page_num (masters->contents()))) {
-               current_tab == "masters";
        }
 
        main_window_node.add_property (X_("current-tab"), current_tab);
@@ -728,6 +824,7 @@ ARDOUR_UI::save_ardour_state ()
        XMLNode& enode (editor->get_state());
        XMLNode& mnode (mixer->get_state());
        XMLNode& bnode (meterbridge->get_state());
+       XMLNode& pnode (rc_option_editor->get_state());
 
        Config->add_extra_xml (*window_node);
        Config->add_extra_xml (audio_midi_setup->get_state());
@@ -740,6 +837,7 @@ ARDOUR_UI::save_ardour_state ()
                _session->add_instant_xml (main_window_node);
                _session->add_instant_xml (enode);
                _session->add_instant_xml (mnode);
+               _session->add_instant_xml (pnode);
                _session->add_instant_xml (bnode);
                if (location_ui) {
                        _session->add_instant_xml (location_ui->ui().get_state ());
@@ -748,12 +846,17 @@ ARDOUR_UI::save_ardour_state ()
                Config->add_instant_xml (main_window_node);
                Config->add_instant_xml (enode);
                Config->add_instant_xml (mnode);
+               Config->add_instant_xml (pnode);
                Config->add_instant_xml (bnode);
                if (location_ui) {
                        Config->add_instant_xml (location_ui->ui().get_state ());
                }
        }
+
        delete &enode;
+       delete &mnode;
+       delete &bnode;
+       delete &pnode;
 
        Keyboard::save_keybindings ();
 }
@@ -769,8 +872,7 @@ ARDOUR_UI::resize_text_widgets ()
 void
 ARDOUR_UI::focus_on_clock ()
 {
-       if (editor && primary_clock) {
-               editor->present ();
+       if (primary_clock) {
                primary_clock->focus ();
        }
 }