clever fixes to make keyboard-driven trimming work nicely
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 9 Jan 2008 21:07:18 +0000 (21:07 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 9 Jan 2008 21:07:18 +0000 (21:07 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2856 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour.bindings.in
gtk2_ardour/editor.h
gtk2_ardour/editor_ops.cc
gtk2_ardour/editor_selection.cc

index a171e903496656c2301aac037ba019cd47dd006a..f8c1b2d27835cea45ae49217871d0092271bb819 100644 (file)
 (gtk_accel_path "<Actions>/Editor/set-fade-out-length" "backslash")
 (gtk_accel_path "<Actions>/Editor/trim-from-start" "<%TERTIARY%>braceleft")
 (gtk_accel_path "<Actions>/Editor/trim-to-end" "<%TERTIARY%>braceright")
-;(gtk_accel_path "<Actions>/Editor/trim-front" "a")
-;(gtk_accel_path "<Actions>/Editor/trim-back" "s")
+(gtk_accel_path "<Actions>/Editor/trim-front" "j")
+(gtk_accel_path "<Actions>/Editor/trim-back" "k")
 (gtk_accel_path "<Actions>/Editor/goto-mark-1" "KP_1")
 (gtk_accel_path "<Actions>/Editor/goto-mark-2" "KP_2")
 (gtk_accel_path "<Actions>/Editor/goto-mark-3" "KP_3")
index 599b7d5815a9ab3b2ded2fa1fbd85fc69d9d01a0..25883dbcf8454fb66b742346874cfcbb13bd1f8c 100644 (file)
@@ -1966,6 +1966,18 @@ class Editor : public PublicEditor
 
        TimeAxisView* entered_track;
        RegionView*   entered_regionview;
+
+       class ExclusiveRegionSelection {
+         public:
+               ExclusiveRegionSelection (Editor&, RegionView*);
+               ~ExclusiveRegionSelection ();
+
+         private:
+               Editor& editor;
+               RegionView* regionview;
+               bool remove;
+       };
+
        void ensure_entered_region_selected (bool op_acts_on_objects = false);
        void ensure_entered_track_selected (bool op_acts_on_objects = false);
        bool clear_entered_track;
index 59e3e39cdd32e467fec085eae37492bbb26ab61b..45bf4c60d1b33c147b0074c63367298d2656cbf8 100644 (file)
@@ -3171,7 +3171,7 @@ Editor::trim_region_to_punch ()
 void
 Editor::trim_region_to_location (const Location& loc, const char* str)
 {
-       ensure_entered_region_selected ();
+       ExclusiveRegionSelection ers (*this, entered_regionview);
 
        RegionSelection& rs (get_regions_for_action ());
 
@@ -3222,6 +3222,8 @@ Editor::trim_region_to_location (const Location& loc, const char* str)
 void
 Editor::trim_region_to_edit_point ()
 {
+       ExclusiveRegionSelection ers (*this, entered_regionview);
+
        RegionSelection& rs (get_regions_for_action ());
        nframes64_t where = get_preferred_edit_position();
 
@@ -3264,6 +3266,8 @@ Editor::trim_region_to_edit_point ()
 void
 Editor::trim_region_from_edit_point ()
 {
+       ExclusiveRegionSelection ers (*this, entered_regionview);
+
        RegionSelection& rs (get_regions_for_action ());
        nframes64_t where = get_preferred_edit_position();
 
@@ -4609,27 +4613,29 @@ Editor::ensure_entered_track_selected (bool op_really_wants_one_track_if_none_ar
 void
 Editor::ensure_entered_region_selected (bool op_really_wants_one_region_if_none_are_selected)
 {
-       if (entered_regionview && mouse_mode == MouseObject) {
-
-               /* heuristic:
-
-                  - if there is no existing selection, don't change it. the operation will thus apply to "all"
-
-                  - if there is an existing selection, but the entered regionview isn't in it, add it. this
-                      avoids key-mouse ops on unselected regions from interfering with an existing selection,
-                      but also means that the operation will apply to the pointed-at region.
-               */
-
-               if (!selection->regions.empty()) {
-                       if (find (selection->regions.begin(), selection->regions.end(), entered_regionview) != selection->regions.end()) {
-                               selection->add (entered_regionview);
-                       }
-               } else {
-                       /* there is no selection, but this operation requires/prefers selected objects */
+       if (!entered_regionview || mouse_mode != MouseObject) {
+               return;
+       }
 
-                       if (op_really_wants_one_region_if_none_are_selected) {
-                               selection->set (entered_regionview, false);
-                       }
+       
+       /* heuristic:
+          
+       - if there is no existing selection, don't change it. the operation will thus apply to "all"
+       
+       - if there is an existing selection, but the entered regionview isn't in it, add it. this
+       avoids key-mouse ops on unselected regions from interfering with an existing selection,
+       but also means that the operation will apply to the pointed-at region.
+       */
+       
+       if (!selection->regions.empty()) {
+               if (!selection->selected (entered_regionview)) {
+                       selection->add (entered_regionview);
+               }
+       } else {
+               /* there is no selection, but this operation requires/prefers selected objects */
+               
+               if (op_really_wants_one_region_if_none_are_selected) {
+                       selection->set (entered_regionview, false);
                }
        }
 }
@@ -4649,6 +4655,8 @@ Editor::trim_region_back ()
 void
 Editor::trim_region (bool front)
 {
+       ExclusiveRegionSelection ers (*this, entered_regionview);
+
        nframes64_t where = get_preferred_edit_position();
        RegionSelection& rs = get_regions_for_action ();
 
@@ -4671,6 +4679,7 @@ Editor::trim_region (bool front)
                        session->add_command(new MementoCommand<Playlist>(*pl.get(), &before, &after));
                }
        }
+
        commit_reversible_command ();
 }
 
index f1248fb13a2258ebafbbe156c760a9d4d8c9ace5..8e1d35ca6906c24d09fa62f4a6619f903b66e540 100644 (file)
@@ -1325,3 +1325,28 @@ Editor::deselect_all ()
 {
        selection->clear ();
 }
+
+Editor::ExclusiveRegionSelection::ExclusiveRegionSelection (Editor& ed, RegionView* rv)
+       : editor (ed),
+         regionview (rv)
+{
+
+       if (!rv || ed.current_mouse_mode() != Editing::MouseObject) {
+               return;
+       }
+       
+       if (ed.get_selection().regions.empty() && !ed.get_selection().selected (rv)) {
+               ed.get_selection().set (rv, false);
+               remove = true;
+       } else {
+               remove = false;
+       }
+}
+
+Editor::ExclusiveRegionSelection::~ExclusiveRegionSelection ()
+{
+       if (remove) {
+               editor.get_selection().remove (regionview);
+       }
+}
+