trim at edit point added, keybindings altered (in progress); more subtle improvements...
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 19 Nov 2007 23:58:02 +0000 (23:58 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 19 Nov 2007 23:58:02 +0000 (23:58 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2701 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour-sae.menus
gtk2_ardour/ardour.bindings.in
gtk2_ardour/ardour.menus
gtk2_ardour/editor.h
gtk2_ardour/editor_actions.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/editor_ops.cc
libs/ardour/ardour/audioregion.h
libs/ardour/ardour/region.h
libs/ardour/audioregion.cc
libs/ardour/playlist.cc

index f24559f0dec0b2dc355f9d9e220289fb96d7d290..94974b6028304f64e7bb776f83501889a2996741 100644 (file)
                        <menuitem action='set-mouse-mode-timefx'/>
                        <separator/>
                        <menuitem action='cycle-edit-point'/>
-                       <menuitem action='cycle-edit-mode'/>
+                       <menuitem action='toggle-edit-mode'/>
                </menu>
         </menu>         
        <menu name='Regions' action='Regions'>
index 2adcd116a3ecd659f14d4a13c0c24bfcfedb8081..6e5c4c30c276b386dc8937ef2e16aa7505a0e0fe 100644 (file)
@@ -13,7 +13,7 @@
 (gtk_accel_path "<Actions>/Editor/cycle-snap-mode" "<Alt>KP_Decimal")
 (gtk_accel_path "<Actions>/Editor/cycle-snap-choice" "KP_Decimal")
 (gtk_accel_path "<Actions>/Editor/cycle-edit-point" "KP_Divide")
-(gtk_accel_path "<Actions>/Editor/cycle-edit-mode" "KP_Multiply")
+(gtk_accel_path "<Actions>/Editor/toggle-edit-mode" "KP_Multiply")
 ; (gtk_accel_path "<Actions>/redirectmenu/copy" "")
 ; (gtk_accel_path "<Actions>/options/MeterFalloffFaster" "")
 (gtk_accel_path "<Actions>/Transport/ToggleRollForgetCapture" "<Control>space")
 ; (gtk_accel_path "<Actions>/Editor/snap-magnetic" "")
 ; (gtk_accel_path "<Actions>/Editor/playhead-to-range-end" "")
 (gtk_accel_path "<Actions>/Editor/scroll-playhead-forward" "<Shift>rightarrow")
-(gtk_accel_path "<Actions>/Editor/align-regions-sync-relative" "a")
+(gtk_accel_path "<Actions>/Editor/align-regions-sync-relative" "y")
 ; (gtk_accel_path "<Actions>/Editor/EditSelectRegionOptions" "")
 (gtk_accel_path "<Actions>/Editor/crop" "c")
 ; (gtk_accel_path "<Actions>/redirectmenu/newsend" "")
 ; (gtk_accel_path "<Actions>/RegionList/rlRemove" "")
 (gtk_accel_path "<Actions>/Transport/GotoStart" "Home")
 (gtk_accel_path "<Actions>/Editor/scroll-playhead-backward" "<Shift>leftarrow")
-(gtk_accel_path "<Actions>/Editor/split-region" "s")
+(gtk_accel_path "<Actions>/Editor/split-region" "d")
 ; (gtk_accel_path "<Actions>/Transport/ToggleAutoInput" "")
 ; (gtk_accel_path "<Actions>/Snap/snap-to-thirtyseconds" "")
 ; (gtk_accel_path "<Actions>/Snap/snap-to-minutes" "")
 ; (gtk_accel_path "<Actions>/Snap/snap-to-asixteenthbeat" "")
 (gtk_accel_path "<Actions>/Editor/select-all-in-punch-range" "<Control>d")
 ; (gtk_accel_path "<Actions>/redirectmenu/edit" "")
-(gtk_accel_path "<Actions>/Editor/duplicate-region" "d")
+(gtk_accel_path "<Actions>/Editor/duplicate-region" "p")
 (gtk_accel_path "<Actions>/Editor/multi-duplicate-region" "<Alt>d")
 ; (gtk_accel_path "<Actions>/JACK/JACKLatency2048" "")
 ; (gtk_accel_path "<Actions>/Editor/ToggleWaveformsWhileRecording" "")
 (gtk_accel_path "<Actions>/Editor/set-fade-out-length" "backslash")
 (gtk_accel_path "<Actions>/Editor/trim-from-start" "<Shift>braceleft")
 (gtk_accel_path "<Actions>/Editor/trim-to-end" "<Shift>braceright")
+(gtk_accel_path "<Actions>/Editor/trim-front" "a")
+(gtk_accel_path "<Actions>/Editor/trim-back" "s")
 (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 07d902321e5a97940db28c549d26f8f14bc2c433..4aa97b89961c674b48f5e5bf714ab1d31bd97190 100644 (file)
                        <menuitem action='set-mouse-mode-gain'/>
                        <menuitem action='set-mouse-mode-zoom'/>
                        <menuitem action='set-mouse-mode-timefx'/>
+                       <separator/>
+                       <menuitem action='cycle-edit-point'/>
+                       <menuitem action='toggle-edit-mode'/>
           </menu>
         </menu>         
        <menu name='Select' action='Select'>
                   <menuitem action='set-fade-in-length'/>
                   <menuitem action='set-fade-out-length'/>
                    <separator/>       
+                  <menuitem action='trim-back'/>
+                  <menuitem action='trim-front'/>
                   <menuitem action='trim-from-start'/>
                   <menuitem action='trim-to-end'/>
                   <menuitem action='trim-region-to-loop'/>
index 372b83bf2415cd36b829805ea6a5e9aa683c1036..deb8ea6106d3b8b77ca0467e3e7a001dafcd7e32 100644 (file)
@@ -1632,7 +1632,11 @@ class Editor : public PublicEditor
 
        void trim_finished_callback (ArdourCanvas::Item*, GdkEvent*);
        void thaw_region_after_trim (RegionView& rv);
-       
+
+       void trim_region_front();
+       void trim_region_back();
+       void trim_region (bool front);
+
        void trim_region_to_edit_point ();
        void trim_region_from_edit_point ();
        void trim_region_to_loop ();
index 02ad04f37701784e7c2f9ef0ba7d1bf0cb3a82f7..86ea9510ba4db2d1eeec9bd68962450c5fe239de 100644 (file)
@@ -222,6 +222,10 @@ Editor::register_actions ()
        act = ActionManager::register_action (editor_actions, "edit-to-playhead", _("Edit to Playhead"), bind (mem_fun(*this, &Editor::cursor_align), false));
        ActionManager::session_sensitive_actions.push_back (act);
 
+       act = ActionManager::register_action (editor_actions, "trim-front", _("Trim front at edit point"), mem_fun(*this, &Editor::trim_region_front));
+       ActionManager::session_sensitive_actions.push_back (act);
+       act = ActionManager::register_action (editor_actions, "trim-back", _("Trim back at edit point"), mem_fun(*this, &Editor::trim_region_back));
+       ActionManager::session_sensitive_actions.push_back (act);
 
        act = ActionManager::register_action (editor_actions, "trim-from-start", _("Start to edit point"), mem_fun(*this, &Editor::trim_region_from_edit_point));
        ActionManager::session_sensitive_actions.push_back (act);
index 3d853d0cef4733173c16431bc2b499bb8c498972..0a3f6a9134d9bc86243b7cdb877f51d9d3c16086 100644 (file)
@@ -3029,6 +3029,13 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
        
        if ((pointer_y_span = (drag_info.last_trackview->order - tv->order)) != 0) {
 
+               /* drop any splice-induced selection madness */
+
+               if (!pre_drag_region_selection.empty()) {
+                       selection->set (pre_drag_region_selection);
+                       pre_drag_region_selection.clear ();
+               }
+
                int32_t children = 0, numtracks = 0;
                // XXX hard coding track limit, oh my, so very very bad
                bitset <1024> tracks (0x00);
index 6276d942c1226ecda4a7137352e3e77a3aac4a98..f0290c2d355dc3ea9dd2769011b9e9d133f8772c 100644 (file)
@@ -4152,3 +4152,43 @@ Editor::ensure_entered_selected (bool op_really_wants_one_region_if_none_are_sel
                }
        }
 }
+
+void
+Editor::trim_region_front ()
+{
+       trim_region (true);
+}
+
+void
+Editor::trim_region_back ()
+{
+       trim_region (false);
+}
+
+void
+Editor::trim_region (bool front)
+{
+       nframes64_t where = get_preferred_edit_position();
+       RegionSelection& rs = get_regions_for_action ();
+
+       if (rs.empty()) {
+               return;
+       }
+
+       begin_reversible_command (front ? _("trim front") : _("trim back"));
+
+       for (list<RegionView*>::const_iterator i = rs.by_layer().begin(); i != rs.by_layer().end(); ++i) {
+               if (!(*i)->region()->locked()) {
+                       boost::shared_ptr<Playlist> pl = (*i)->region()->playlist();
+                       XMLNode &before = pl->get_state();
+                       if (front) {
+                               (*i)->region()->trim_front (where, this);       
+                       } else {
+                               (*i)->region()->trim_end (where, this); 
+                       }
+                       XMLNode &after = pl->get_state();
+                       session->add_command(new MementoCommand<Playlist>(*pl.get(), &before, &after));
+               }
+       }
+       commit_reversible_command ();
+}
index ff32199771b7dd434ded9f773d0026f985667904..934b396a8eae58c027e268d315d3271b9f5666f4 100644 (file)
@@ -167,9 +167,9 @@ class AudioRegion : public Region
                                 nframes_t skip_frames = 0) const;
 
        bool verify_start (nframes_t position);
-       bool verify_length (nframes_t position);
+       bool verify_length (nframes_t& length);
        bool verify_start_mutable (nframes_t& start);
-       bool verify_start_and_length (nframes_t start, nframes_t length);
+       bool verify_start_and_length (nframes_t start, nframes_t& length);
        void recompute_at_start ();
        void recompute_at_end ();
 
index ca8c5855a9194f6709074dee06c40b89bc9ef9ca..8acbc8b39b12a7d5878bd8f7a7f9536c62c0c5af 100644 (file)
@@ -209,9 +209,9 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        void first_edit ();
        
        virtual bool verify_start (nframes_t) = 0;
-       virtual bool verify_start_and_length (nframes_t, nframes_t) = 0;
+       virtual bool verify_start_and_length (nframes_t, nframes_t&) = 0;
        virtual bool verify_start_mutable (nframes_t&_start) = 0;
-       virtual bool verify_length (nframes_t) = 0;
+       virtual bool verify_length (nframes_t&) = 0;
        virtual void recompute_at_start () = 0;
        virtual void recompute_at_end () = 0;
        
index a72e8070c3ec9c9052d5e51a7a8b683f21478381..86844deed159e55dba7326515ef385d7c8e24378 100644 (file)
@@ -330,7 +330,7 @@ AudioRegion::listen_to_my_curves ()
 }
 
 bool
-AudioRegion::verify_length (nframes_t len)
+AudioRegion::verify_length (nframes_t& len)
 {
        boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
 
@@ -338,16 +338,19 @@ AudioRegion::verify_length (nframes_t len)
                return true;
        }
 
+       nframes_t maxlen = 0;
+
        for (uint32_t n=0; n < sources.size(); ++n) {
-               if (_start > sources[n]->length() - len) {
-                       return false;
-               }
+               maxlen = max (maxlen, sources[n]->length() - _start);
        }
+       
+       len = min (len, maxlen);
+       
        return true;
 }
 
 bool
-AudioRegion::verify_start_and_length (nframes_t new_start, nframes_t new_length)
+AudioRegion::verify_start_and_length (nframes_t new_start, nframes_t& new_length)
 {
        boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
 
@@ -355,11 +358,14 @@ AudioRegion::verify_start_and_length (nframes_t new_start, nframes_t new_length)
                return true;
        }
 
+       nframes_t maxlen = 0;
+
        for (uint32_t n=0; n < sources.size(); ++n) {
-               if (new_length > sources[n]->length() - new_start) {
-                       return false;
-               }
+               maxlen = max (maxlen, sources[n]->length() - new_start);
        }
+
+       new_length = min (new_length, maxlen);
+
        return true;
 }
 bool
index afcbdc93bea4dcb07c9f0d66e7a36cd0ce845fe9..37c7a4e5c8fb6f68c1cf941698d55482fcf6f6af 100644 (file)
@@ -1155,11 +1155,10 @@ Playlist::region_bounds_changed (Change what_changed, boost::shared_ptr<Region>
                
                if (what_changed & ARDOUR::LengthChanged) {
                        delta += (nframes64_t) region->length() - (nframes64_t) region->last_length();
-
                } 
 
                if (delta) {
-                       possibly_splice (region->last_position(), delta, region);
+                       possibly_splice (region->last_position() + region->last_length(), delta, region);
                }
 
                if (holding_state ()) {