diff options
-rw-r--r-- | gtk2_ardour/ardour-sae.menus | 2 | ||||
-rw-r--r-- | gtk2_ardour/ardour.bindings.in | 10 | ||||
-rw-r--r-- | gtk2_ardour/ardour.menus | 5 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 6 | ||||
-rw-r--r-- | gtk2_ardour/editor_actions.cc | 4 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 7 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 40 | ||||
-rw-r--r-- | libs/ardour/ardour/audioregion.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/region.h | 4 | ||||
-rw-r--r-- | libs/ardour/audioregion.cc | 22 | ||||
-rw-r--r-- | libs/ardour/playlist.cc | 3 |
11 files changed, 87 insertions, 20 deletions
diff --git a/gtk2_ardour/ardour-sae.menus b/gtk2_ardour/ardour-sae.menus index f24559f0de..94974b6028 100644 --- a/gtk2_ardour/ardour-sae.menus +++ b/gtk2_ardour/ardour-sae.menus @@ -119,7 +119,7 @@ <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'> diff --git a/gtk2_ardour/ardour.bindings.in b/gtk2_ardour/ardour.bindings.in index 2adcd116a3..6e5c4c30c2 100644 --- a/gtk2_ardour/ardour.bindings.in +++ b/gtk2_ardour/ardour.bindings.in @@ -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") @@ -122,7 +122,7 @@ ; (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" "") @@ -131,7 +131,7 @@ ; (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" "") @@ -241,7 +241,7 @@ ; (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" "") @@ -322,6 +322,8 @@ (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") diff --git a/gtk2_ardour/ardour.menus b/gtk2_ardour/ardour.menus index 07d902321e..4aa97b8996 100644 --- a/gtk2_ardour/ardour.menus +++ b/gtk2_ardour/ardour.menus @@ -120,6 +120,9 @@ <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'> @@ -164,6 +167,8 @@ <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'/> diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 372b83bf24..deb8ea6106 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -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 (); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 02ad04f377..86ea9510ba 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -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); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 3d853d0cef..0a3f6a9134 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -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); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 6276d942c1..f0290c2d35 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -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 (); +} diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index ff32199771..934b396a8e 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -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 (); diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index ca8c5855a9..8acbc8b39b 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -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; diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index a72e8070c3..86844deed1 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -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 diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index afcbdc93be..37c7a4e5c8 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -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 ()) { |