diff options
author | nick_m <mainsbridge@gmail.com> | 2015-11-14 03:05:53 +1100 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2015-11-14 03:05:53 +1100 |
commit | 6210b63a136287388176ee947409fedbd67343db (patch) | |
tree | a0ea0fe1535339df1d788032f2929c7b03a65bf7 | |
parent | 4b25c80cb9547e1ce87e556db735d33315ab5045 (diff) |
Ardour::Region - add method required to fix #6673.
-rw-r--r-- | libs/ardour/ardour/region.h | 1 | ||||
-rw-r--r-- | libs/ardour/region.cc | 38 |
2 files changed, 39 insertions, 0 deletions
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) { |