various work to make loop/punch display work better (including fixes for bugs present...
[ardour.git] / gtk2_ardour / editor_actions.cc
index 074d51428e10fea75d396f5b4caa7b2288a3f86f..5f3354b0beaa1b28a9edd89379e78955e5727dd3 100644 (file)
 #include <gio/gio.h>
 #include <gtk/gtkiconfactory.h>
 
-#include "pbd/filesystem.h"
 #include "pbd/file_utils.h"
-#include "pbd/search_path.h"
 
 #include "gtkmm2ext/tearoff.h"
+#include "gtkmm2ext/utils.h"
 
 #include "ardour/filesystem_paths.h"
 #include "ardour/profile.h"
 #include "ardour/session.h"
 #include "ardour/types.h"
 
+#include "canvas/canvas.h"
+#include "canvas/pixbuf.h"
+
 #include "actions.h"
 #include "ardour_ui.h"
 #include "editing.h"
@@ -287,7 +289,7 @@ Editor::register_actions ()
        reg_sens (editor_actions, "set-playhead", _("Playhead to Mouse"), sigc::mem_fun(*this, &Editor::set_playhead_cursor));
        reg_sens (editor_actions, "set-edit-point", _("Active Marker to Mouse"), sigc::mem_fun(*this, &Editor::set_edit_point));
 
-       reg_sens (editor_actions, "duplicate-range", _("Duplicate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_dialog), false));
+       reg_sens (editor_actions, "duplicate-range", _("Duplicate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_range), false));
 
        undo_action = reg_sens (editor_actions, "undo", S_("Command|Undo"), sigc::bind (sigc::mem_fun(*this, &Editor::undo), 1U));
        redo_action = reg_sens (editor_actions, "redo", _("Redo"), sigc::bind (sigc::mem_fun(*this, &Editor::redo), 1U));
@@ -402,45 +404,59 @@ Editor::register_actions ()
        radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-mouse", _("Zoom Focus Mouse"), sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusMouse));
        radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusEdit));
 
+       ActionManager::register_action (editor_actions, X_("cycle-zoom-focus"), _("Next Zoom Focus"), sigc::mem_fun (*this, &Editor::cycle_zoom_focus));
+
+
        Glib::RefPtr<ActionGroup> mouse_mode_actions = ActionGroup::create (X_("MouseMode"));
        RadioAction::Group mouse_mode_group;
 
+       act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Smart Object Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled));       
+       smart_mode_action = Glib::RefPtr<ToggleAction>::cast_static (act);
+       smart_mode_button.set_related_action (smart_mode_action);
+       smart_mode_button.set_text (_("Smart"));
+       smart_mode_button.add_elements ( ArdourButton::FlatFace );
+       smart_mode_button.set_name ("mouse mode button");
+
        act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject));
        mouse_move_button.set_related_action (act);
        mouse_move_button.set_image (::get_icon("tool_object"));
+       mouse_move_button.add_elements ( ArdourButton::FlatFace );
        mouse_move_button.set_name ("mouse mode button");
 
        act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseRange));        
        mouse_select_button.set_related_action (act);
        mouse_select_button.set_image (::get_icon("tool_range"));
+       mouse_select_button.add_elements ( ArdourButton::FlatFace );
        mouse_select_button.set_name ("mouse mode button");
 
        act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseDraw));   
        mouse_draw_button.set_related_action (act);
        mouse_draw_button.set_image (::get_icon("midi_tool_pencil"));
+       mouse_draw_button.add_elements ( ArdourButton::FlatFace );
        mouse_draw_button.set_name ("mouse mode button");
 
-       act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Link Object / Range Tools"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled));       
-       smart_mode_action = Glib::RefPtr<ToggleAction>::cast_static (act);
-
        act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-gain", _("Gain Tool"), sigc::bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseGain)); 
        mouse_gain_button.set_related_action (act);
        mouse_gain_button.set_image (::get_icon("tool_gain"));
+       mouse_gain_button.add_elements ( ArdourButton::FlatFace );
        mouse_gain_button.set_name ("mouse mode button");
 
        act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-zoom", _("Zoom Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseZoom));   
        mouse_zoom_button.set_related_action (act);
        mouse_zoom_button.set_image (::get_icon("tool_zoom"));
+       mouse_zoom_button.add_elements ( ArdourButton::FlatFace );
        mouse_zoom_button.set_name ("mouse mode button");
 
        act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-audition", _("Audition Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseAudition));       
        mouse_audition_button.set_related_action (act);
        mouse_audition_button.set_image (::get_icon("tool_audition"));
+       mouse_audition_button.add_elements ( ArdourButton::FlatFace );
        mouse_audition_button.set_name ("mouse mode button");
 
        act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseTimeFX));    
        mouse_timefx_button.set_related_action (act);
        mouse_timefx_button.set_image (::get_icon("tool_stretch"));
+       mouse_timefx_button.add_elements ( ArdourButton::FlatFace );
        mouse_timefx_button.set_name ("mouse mode button");
 
        ActionManager::register_action (editor_actions, "step-mouse-mode", _("Step Mouse Mode"), sigc::bind (sigc::mem_fun(*this, &Editor::step_mouse_mode), true));
@@ -448,6 +464,7 @@ Editor::register_actions ()
        act = ActionManager::register_toggle_action (mouse_mode_actions, "toggle-internal-edit", _("Edit MIDI"), sigc::mem_fun(*this, &Editor::toggle_internal_editing));
        internal_edit_button.set_related_action (act);
        internal_edit_button.set_image (::get_icon("tool_note"));
+       internal_edit_button.add_elements ( ArdourButton::FlatFace );
        internal_edit_button.set_name ("mouse mode button");
 
        RadioAction::Group edit_point_group;
@@ -530,15 +547,46 @@ Editor::register_actions ()
        ruler_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-timecode-ruler"), _("Timecode"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_timecode)));
        ruler_minsec_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-minsec-ruler"), _("Min:Sec"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_minsec)));
 
+       ActionManager::register_action (editor_menu_actions, X_("VideoMonitorMenu"), _("Video Monitor"));
+
+       ruler_video_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-video-ruler"), _("Video"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_video_timeline)));
+       xjadeo_proc_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("ToggleJadeo"), _("Video Monitor"), sigc::mem_fun (*this, &Editor::set_xjadeo_proc)));
+
+       xjadeo_ontop_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-ontop"), _("Always on Top"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 1)));
+       xjadeo_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 2)));
+       xjadeo_frame_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-frame"), _("Frame number"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 3)));
+       xjadeo_osdbg_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-osdbg"), _("Timecode Background"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 4)));
+       xjadeo_fullscreen_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-fullscreen"), _("Fullscreen"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 5)));
+       xjadeo_letterbox_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-letterbox"), _("Letterbox"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 6)));
+       xjadeo_zoom_100 = reg_sens (editor_actions, "zoom-vmon-100", _("Original Size"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 7));
+
        /* set defaults here */
 
        no_ruler_shown_update = true;
        ruler_meter_action->set_active (true);
        ruler_tempo_action->set_active (true);
        ruler_marker_action->set_active (true);
-       ruler_range_action->set_active (false);
+       ruler_range_action->set_active (true);
        ruler_loop_punch_action->set_active (true);
        ruler_loop_punch_action->set_active (true);
+
+       ruler_video_action->set_active (false);
+       xjadeo_proc_action->set_active (false);
+       xjadeo_proc_action->set_sensitive (false);
+       xjadeo_ontop_action->set_active (false);
+       xjadeo_ontop_action->set_sensitive (false);
+       xjadeo_timecode_action->set_active (false);
+       xjadeo_timecode_action->set_sensitive (false);
+       xjadeo_frame_action->set_active (false);
+       xjadeo_frame_action->set_sensitive (false);
+       xjadeo_osdbg_action->set_active (false);
+       xjadeo_osdbg_action->set_sensitive (false);
+       xjadeo_fullscreen_action->set_active (false);
+       xjadeo_fullscreen_action->set_sensitive (false);
+       xjadeo_letterbox_action->set_active (false);
+       xjadeo_letterbox_action->set_sensitive (false);
+       xjadeo_zoom_100->set_sensitive (false);
+
        if (Profile->get_sae()) {
                ruler_bbt_action->set_active (true);
                ruler_cd_marker_action->set_active (false);
@@ -625,6 +673,9 @@ Editor::register_actions ()
        Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
        tact->set_active (true);
 
+       ActionManager::register_action (editor_actions, X_("toggle-midi-input-active"), _("Toggle MIDI Input Active for Editor-Selected Tracks/Busses"), 
+                                  sigc::bind (sigc::mem_fun (*this, &Editor::toggle_midi_input_active), false));
+
        ActionManager::add_action_group (rl_actions);
        ActionManager::add_action_group (ruler_actions);
        ActionManager::add_action_group (zoom_actions);
@@ -641,11 +692,11 @@ Editor::load_bindings ()
        
         key_bindings.set_action_map (editor_action_map);
 
-       sys::path binding_file;
+       std::string binding_file;
 
        if (find_file_in_search_path (ardour_config_search_path(), "editor.bindings", binding_file)) {
-                key_bindings.load (binding_file.to_string());
-               info << string_compose (_("Loaded editor bindings from %1"), binding_file.to_string()) << endmsg;
+                key_bindings.load (binding_file);
+               info << string_compose (_("Loaded editor bindings from %1"), binding_file) << endmsg;
         } else {
                error << string_compose (_("Could not find editor.bindings in search path %1"), ardour_config_search_path().to_string()) << endmsg;
        }
@@ -691,6 +742,9 @@ Editor::toggle_ruler_visibility (RulerType rt)
        case ruler_time_cd_marker:
                action = "toggle-cd-marker-ruler";
                break;
+       case ruler_video_timeline:
+               action = "toggle-video-ruler";
+               break;
        }
 
        Glib::RefPtr<Action> act = ActionManager::get_action (X_("Rulers"), action);
@@ -722,6 +776,133 @@ Editor::set_group_tabs ()
        }
 }
 
+void
+Editor::set_close_video_sensitive (bool onoff)
+{
+       Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("CloseVideo"));
+       if (act) {
+               act->set_sensitive (onoff);
+       }
+}
+
+void
+Editor::set_xjadeo_sensitive (bool onoff)
+{
+       xjadeo_proc_action->set_sensitive(onoff);
+}
+
+void
+Editor::toggle_xjadeo_proc (int state)
+{
+       switch(state) {
+               case 1:
+                       xjadeo_proc_action->set_active(true);
+                       break;
+               case 0:
+                       xjadeo_proc_action->set_active(false);
+                       break;
+               default:
+                       xjadeo_proc_action->set_active(!xjadeo_proc_action->get_active());
+                       break;
+       }
+       bool onoff = xjadeo_proc_action->get_active();
+       xjadeo_ontop_action->set_sensitive(onoff);
+       xjadeo_timecode_action->set_sensitive(onoff);
+       xjadeo_frame_action->set_sensitive(onoff);
+       xjadeo_osdbg_action->set_sensitive(onoff);
+       xjadeo_fullscreen_action->set_sensitive(onoff);
+       xjadeo_letterbox_action->set_sensitive(onoff);
+       xjadeo_zoom_100->set_sensitive(onoff);
+}
+
+void
+Editor::set_xjadeo_proc ()
+{
+       if (xjadeo_proc_action->get_active()) {
+               ARDOUR_UI::instance()->video_timeline->open_video_monitor();
+       } else {
+               ARDOUR_UI::instance()->video_timeline->close_video_monitor();
+       }
+}
+
+void
+Editor::toggle_xjadeo_viewoption (int what, int state)
+{
+       Glib::RefPtr<Gtk::ToggleAction> action;
+       switch (what) {
+               case 1:
+                       action = xjadeo_ontop_action;
+                       break;
+               case 2:
+                       action = xjadeo_timecode_action;
+                       break;
+               case 3:
+                       action = xjadeo_frame_action;
+                       break;
+               case 4:
+                       action = xjadeo_osdbg_action;
+                       break;
+               case 5:
+                       action = xjadeo_fullscreen_action;
+                       break;
+               case 6:
+                       action = xjadeo_letterbox_action;
+                       break;
+               case 7:
+                       return;
+               default:
+                       return;
+       }
+
+       switch(state) {
+               case 1:
+                       action->set_active(true);
+                       break;
+               case 0:
+                       action->set_active(false);
+                       break;
+               default:
+                       action->set_active(!action->get_active());
+                       break;
+       }
+}
+
+void
+Editor::set_xjadeo_viewoption (int what)
+{
+       Glib::RefPtr<Gtk::ToggleAction> action;
+       switch (what) {
+               case 1:
+                       action = xjadeo_ontop_action;
+                       break;
+               case 2:
+                       action = xjadeo_timecode_action;
+                       break;
+               case 3:
+                       action = xjadeo_frame_action;
+                       break;
+               case 4:
+                       action = xjadeo_osdbg_action;
+                       break;
+               case 5:
+                       action = xjadeo_fullscreen_action;
+                       break;
+               case 6:
+                       action = xjadeo_letterbox_action;
+                       break;
+               case 7:
+                       ARDOUR_UI::instance()->video_timeline->control_video_monitor(what, 0);
+                       return;
+               default:
+                       return;
+       }
+       if (action->get_active()) {
+               ARDOUR_UI::instance()->video_timeline->control_video_monitor(what, 1);
+       } else {
+               ARDOUR_UI::instance()->video_timeline->control_video_monitor(what, 0);
+       }
+}
+
 void
 Editor::toggle_measure_visibility ()
 {
@@ -1419,19 +1600,17 @@ Editor::parameter_changed (std::string p)
        ENSURE_GUI_THREAD (*this, &Editor::parameter_changed, p)
 
        if (p == "auto-loop") {
-               update_loop_range_view (true);
+               update_loop_range_view ();
        } else if (p == "punch-in") {
-               update_punch_range_view (true);
+               update_punch_range_view ();
        } else if (p == "punch-out") {
-               update_punch_range_view (true);
+               update_punch_range_view ();
        } else if (p == "timecode-format") {
                update_just_timecode ();
        } else if (p == "show-region-fades") {
                update_region_fade_visibility ();
        } else if (p == "edit-mode") {
                edit_mode_selector.set_active_text (edit_mode_to_string (Config->get_edit_mode()));
-       } else if (p == "subframes-per-frame") {
-               update_just_timecode ();
        } else if (p == "show-track-meters") {
                toggle_meter_updating();
        } else if (p == "show-summary") {
@@ -1483,14 +1662,27 @@ Editor::parameter_changed (std::string p)
                        }
                }
        } else if (p == "show-region-gain") {
-               set_gain_envelope_visibility (Config->get_show_region_gain ());
+               set_gain_envelope_visibility ();
+       } else if (p == "remote-model") {
+               if (_routes) {
+                       _routes->reset_remote_control_ids ();
+               }
+       } else if (p == "use-tooltips") {
+
+               /* this doesn't really belong here but it has to go somewhere */
+
+               if (Config->get_use_tooltips()) {
+                       Gtkmm2ext::enable_tooltips ();
+               } else {
+                       Gtkmm2ext::disable_tooltips ();
+               }
        }
 }
 
 void
 Editor::reset_focus ()
 {
-       track_canvas->grab_focus();
+       _track_canvas->grab_focus();
 }
 
 void
@@ -1547,6 +1739,8 @@ Editor::register_region_actions ()
        /* Toggle `locked' status of selected regions */
        toggle_reg_sens (_region_actions, "toggle-region-lock", _("Lock"), sigc::mem_fun(*this, &Editor::toggle_region_lock));
 
+       toggle_reg_sens (_region_actions, "toggle-region-video-lock", _("Lock to Video"), sigc::mem_fun(*this, &Editor::toggle_region_video_lock));
+
        toggle_reg_sens (
                _region_actions,
                "toggle-region-lock-style",
@@ -1599,15 +1793,15 @@ Editor::register_region_actions ()
                _region_actions, "toggle-region-fades", _("Fades"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_region_fades), 0)
                );
 
-       /* Open the dialogue to duplicate selected regions */
-       reg_sens (_region_actions, "duplicate-region", _("Duplicate"), sigc::bind (sigc::mem_fun (*this, &Editor::duplicate_dialog), false));
+       /* Duplicate selected regions */
+       reg_sens (_region_actions, "duplicate-region", _("Duplicate"), sigc::bind (sigc::mem_fun (*this, &Editor::duplicate_range), false));
 
        /* Open the dialogue to duplicate selected regions multiple times */
        reg_sens (
                _region_actions,
                "multi-duplicate-region",
                _("Multi-Duplicate..."),
-               sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_dialog), true)
+               sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_range), true)
                );
 
        /* Fill tracks with selected regions */
@@ -1694,7 +1888,7 @@ Editor::register_region_actions ()
        reg_sens (_region_actions, "quantize-region", _("Quantize..."), sigc::mem_fun (*this, &Editor::quantize_region));
        reg_sens (_region_actions, "insert-patch-change", _("Insert Patch Change..."), sigc::bind (sigc::mem_fun (*this, &Editor::insert_patch_change), false));
        reg_sens (_region_actions, "insert-patch-change-context", _("Insert Patch Change..."), sigc::bind (sigc::mem_fun (*this, &Editor::insert_patch_change), true));
-       reg_sens (_region_actions, "fork-region", _("Fork"), sigc::mem_fun (*this, &Editor::fork_region));
+       reg_sens (_region_actions, "fork-region", _("Unlink from other copies"), sigc::mem_fun (*this, &Editor::fork_region));
        reg_sens (_region_actions, "strip-region-silence", _("Strip Silence..."), sigc::mem_fun (*this, &Editor::strip_region_silence));
        reg_sens (_region_actions, "set-selection-from-region", _("Set Range Selection"), sigc::mem_fun (*this, &Editor::set_selection_from_region));