playlist: Create a function for changing the current tag

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-06-29 17:08:11 -04:00
parent eac9bde353
commit e21eca37ae
4 changed files with 55 additions and 12 deletions

View File

@ -4,24 +4,43 @@ from gi.repository import GObject, Gio
class TagModel(GObject.GObject, Gio.ListModel):
def __init__(self, tag=None):
GObject.GObject.__init__(self)
self.items = [ ]
self.__set_tag__(tag)
def __set_tag__(self, tag):
self.tag = tag
if self.tag != None:
self.items = self.tag.tracks.copy()
self.tag.TrackAdded.register(self.track_added)
self.tag.TrackRemoved.register(self.track_removed)
return len(self.items)
def __unset_tag__(self):
n = len(self.items)
if self.tag:
self.tag.TrackAdded.unregister(self.track_added)
self.tag.TrackRemoved.unregister(self.track_removed)
self.items.clear()
return n
def do_get_item_type(self):
return GObject.TYPE_PYOBJECT
def do_get_n_items(self):
if self.tag:
return len(self.tag)
return 0
return len(self.items)
def do_get_item(self, n):
if self.tag:
return self.tag[n]
def do_get_object(self, n):
return self.tag[n]
if n < len(self.items):
return self.items[n]
def switch_tag(self, tag):
prev = len(self.tag) if self.tag else 0
self.tag = tag
self.items_changed(0, prev, len(self.tag))
self.items_changed(0, self.__unset_tag__(),
self.__set_tag__(tag))
def track_added(self, tag, track, pos):
self.items.insert(pos, track)
self.items_changed(pos, 0, 1)
def track_removed(self, tag, track, pos):
self.items.remove(track)
return self.items_changed(pos, 1, 0)

View File

@ -20,17 +20,32 @@ class TestTagModel(unittest.TestCase):
self.assertIsInstance(m, GObject.Object)
self.assertIsInstance(m, Gio.ListModel)
self.assertEqual(m.tag, t)
self.assertEqual(m.items, [ ])
self.assertEqual(m.get_item_type(), GObject.TYPE_PYOBJECT)
self.assertEqual(m.get_n_items(), 0)
self.assertIsNone(m.get_item(0))
t.add_track(fake.Track(1))
def test_tag_model_add_remove(self):
t = tag.Tag("Test")
m = model.TagModel(t)
track = fake.Track(1)
t.add_track(track)
self.assertEqual(m.items, [ track ])
self.assertEqual(m.get_n_items(), 1)
self.assertEqual(m.get_item(0), fake.Track(1))
t.remove_track(track)
self.assertEqual(m.items, [ ])
self.assertEqual(m.get_n_items(), 0)
self.assertIsNone(m.get_item(0))
def test_tag_model_init_none(self):
m = model.TagModel()
self.assertEqual(m.items, [ ])
self.assertEqual(m.get_n_items(), 0)
self.assertIsNone(m.get_item(0))
@ -47,6 +62,9 @@ class TestTagModel(unittest.TestCase):
m.switch_tag(t)
self.assertEqual(self.changed, (0, 0, 2))
self.assertIn(m.track_added, t.TrackAdded.subscribers)
m.switch_tag(u)
self.assertEqual(self.changed, (0, 2, 1))
self.assertIn(m.track_added, u.TrackAdded.subscribers)
self.assertNotIn(m.track_added, t.TrackAdded.subscribers)

View File

@ -2,6 +2,7 @@
from . import tagrow
from gi.repository import Gtk
import lib
import playlist
import trackdb
class TagBox(Gtk.ScrolledWindow):
@ -23,6 +24,7 @@ class TagBox(Gtk.ScrolledWindow):
if header == True:
self.listbox.set_header_func(self.header_func)
self.listbox.connect("row-activated", self.row_activated)
self.listbox.connect("row-selected", self.row_selected)
tagstore.Added.register(self.tag_added)
tagstore.Removed.register(self.tag_removed)
@ -48,6 +50,9 @@ class TagBox(Gtk.ScrolledWindow):
def row_activated(self, listbox, row):
trackdb.Stack.push(row.tag)
def row_selected(self, listbox, row):
playlist.Model.switch_tag(row.tag)
def sort_func(self, lhs, rhs):
if lhs.tag < rhs.tag:
return -1

View File

@ -1,5 +1,6 @@
# Copyright 2021 (c) Anna Schumaker.
from gi.repository import Gtk
import lib
import playlist
import unittest