From 6210b63a136287388176ee947409fedbd67343db Mon Sep 17 00:00:00 2001 From: nick_m Date: Sat, 14 Nov 2015 03:05:53 +1100 Subject: [PATCH] Ardour::Region - add method required to fix #6673. --- libs/ardour/ardour/region.h | 1 + libs/ardour/region.cc | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index 60999bf73a..a8a1475fb8 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -212,6 +212,7 @@ class LIBARDOUR_API Region void set_length (framecnt_t); void set_start (framepos_t); void set_position (framepos_t); + void set_initial_position (framepos_t); void special_set_position (framepos_t); virtual void update_after_tempo_map_change (); void nudge_position (frameoffset_t); diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 516adb6ee5..bd99403cb7 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -591,6 +591,44 @@ Region::set_position (framepos_t pos) } +/** A gui may need to create a region, then place it in an initial + * position determined by the user. + * When this takes place within one gui operation, we have to reset + * _last_position to prevent an implied move. + */ +void +Region::set_initial_position (framepos_t pos) +{ + if (!can_move()) { + return; + } + + if (_position != pos) { + _position = pos; + + /* check that the new _position wouldn't make the current + length impossible - if so, change the length. + + XXX is this the right thing to do? + */ + + if (max_framepos - _length < _position) { + _last_length = _length; + _length = max_framepos - _position; + } + + recompute_position_from_lock_style (); + /* ensure that this move doesn't cause a range move */ + _last_position = _position; + } + + + /* do this even if the position is the same. this helps out + a GUI that has moved its representation already. + */ + send_change (Properties::position); +} + void Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute) {