From 531db75a27595f3ebe357633bccc7f7e7e355008 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 3 Jun 2022 10:51:57 -0600 Subject: [PATCH] temporal: when dragging tempo/meter, move in points list as well We spliced the point back into the tempo and meter lists correctly, but failed to do the same thing for the same object's position in the points list. --- libs/temporal/tempo.cc | 109 ++++++++++++++++++++++++++++++----------- 1 file changed, 81 insertions(+), 28 deletions(-) diff --git a/libs/temporal/tempo.cc b/libs/temporal/tempo.cc index 49515d678a..92104410bf 100644 --- a/libs/temporal/tempo.cc +++ b/libs/temporal/tempo.cc @@ -1340,25 +1340,53 @@ TempoMap::move_meter (MeterPoint const & mp, timepos_t const & when, bool earlie const superclock_t old_sc = mp.sclock(); - Meters::iterator current = _meters.end(); - Meters::iterator insert_before = _meters.end(); + /* reset position of this meter */ + const_cast (&mp)->set (sc, beats, bbt); - for (Meters::iterator m = _meters.begin(); m != _meters.end(); ++m) { - if (*m == mp) { - current = m; - } - if (insert_before == _meters.end() && (m->sclock() > sc)) { - insert_before = m; + { + + Meters::iterator current = _meters.end(); + Meters::iterator insert_before = _meters.end(); + + for (Meters::iterator m = _meters.begin(); m != _meters.end(); ++m) { + if (*m == mp) { + current = m; + } + if (insert_before == _meters.end() && (m->sclock() > sc)) { + insert_before = m; + } } + + /* existing meter must have been found */ + assert (current != _meters.end()); + + /* reposition in list */ + _meters.splice (insert_before, _meters, current); + } - /* existing meter must have been found */ - assert (current != _meters.end()); + { + + Points::iterator current = _points.end(); + Points::iterator insert_before = _points.end(); + + for (Points::iterator m = _points.begin(); m != _points.end(); ++m) { + if (*m == mp) { + current = m; + } + if (insert_before == _points.end() && (m->sclock() > sc)) { + insert_before = m; + } + } + + /* existing meter must have been found */ + assert (current != _points.end()); + + /* reposition in list */ + _points.splice (insert_before, _points, current); + + } - /* reset position of this meter */ - current->set (sc, beats, bbt); - /* reposition in list */ - _meters.splice (insert_before, _meters, current); /* recompute 3 domain positions for everything after this */ reset_starting_at (std::min (sc, old_sc)); @@ -1404,26 +1432,51 @@ TempoMap::move_tempo (TempoPoint const & tp, timepos_t const & when, bool push) } const superclock_t old_sc = tp.sclock(); + /* reset position of this tempo */ + const_cast (&tp)->set (sc, beats, bbt); - Tempos::iterator current = _tempos.end(); - Tempos::iterator insert_before = _tempos.end(); + /* move to correct position in tempo list */ - for (Tempos::iterator t = _tempos.begin(); t != _tempos.end(); ++t) { - if (*t == tp) { - current = t; - } - if (insert_before == _tempos.end() && (t->sclock() > sc)) { - insert_before = t; + { + Tempos::iterator current = _tempos.end(); + Tempos::iterator insert_before = _tempos.end(); + + for (Tempos::iterator t = _tempos.begin(); t != _tempos.end(); ++t) { + if (*t == tp) { + current = t; + } + if (insert_before == _tempos.end() && (t->sclock() > sc)) { + insert_before = t; + } } + + /* existing tempo must have been found */ + assert (current != _tempos.end()); + /* reposition in list */ + _tempos.splice (insert_before, _tempos, current); } - /* existing tempo must have been found */ - assert (current != _tempos.end()); + /* move to correct position in points list */ - /* reset position of this tempo */ - current->set (sc, beats, bbt); - /* reposition in list */ - _tempos.splice (insert_before, _tempos, current); + { + Points::iterator current = _points.end(); + Points::iterator insert_before = _points.end(); + + for (Points::iterator t = _points.begin(); t != _points.end(); ++t) { + if (*t == tp) { + current = t; + } + if (insert_before == _points.end() && (t->sclock() > sc)) { + insert_before = t; + } + } + + /* existing tempo must have been found */ + assert (current != _points.end()); + + /* reposition in list */ + _points.splice (insert_before, _points, current); + } /* recompute 3 domain positions for everything after this */ reset_starting_at (std::min (sc, old_sc));