db: Preserve the current track when adding tracks

We have to be careful not to check track positions against playlists
where current == -1, because this could drastically slow down adding new
tracks because SQLite would need to find the position for every track

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-11-17 10:57:10 -05:00
parent e94a737718
commit 2f747ccaa6
2 changed files with 32 additions and 1 deletions

View File

@ -57,6 +57,9 @@ class Playlist(GObject.GObject):
f"WHERE trackid=?", [ track.rowid ])
return cur.fetchone()[1] - 1
def track_adjusts_current(self, track):
return self.current > -1 and self.get_track_index(track) <= self.current
def add_track(self, track):
self.emit("track-added", track)
@ -132,7 +135,9 @@ class Playlist(GObject.GObject):
def refreshed(self): pass
@GObject.Signal(arg_types=(GObject.TYPE_PYOBJECT,))
def track_added(self, track): pass
def track_added(self, track):
if self.track_adjusts_current(track):
self.current += 1
@GObject.Signal(arg_types=(GObject.TYPE_PYOBJECT,))
def track_removed(self, track): pass

View File

@ -40,6 +40,32 @@ class TestPlaylist(unittest.TestCase):
with self.assertRaises(NotImplementedError):
plist.delete()
def test_add_track(self):
plist = db.user.Table.find("Test Playlist")
track1 = db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg")
track2 = db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg")
track3 = db.make_fake_track(3, 3, "Track 3", "/a/b/c/3.ogg")
plist.sort = [ "tracks.number ASC" ]
plist.add_track(track2)
self.assertEqual(plist.get_track(0), track2)
self.assertEqual(plist.current, -1)
self.assertFalse(plist.track_adjusts_current(track2))
plist.current = 0
self.assertTrue(plist.track_adjusts_current(track2))
plist.add_track(track1)
self.assertEqual(plist.get_track(0), track1)
self.assertEqual(plist.get_track(1), track2)
self.assertEqual(plist.current, 1)
plist.add_track(track3)
self.assertEqual(plist.get_track(0), track1)
self.assertEqual(plist.get_track(1), track2)
self.assertEqual(plist.get_track(2), track3)
self.assertEqual(plist.current, 1)
def test_current(self):
plist = db.user.Table.find("Test Playlist")
self.assertEqual(plist.get_property("current"), -1)