playlist: Remove old playlist code

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-11-13 22:07:18 -05:00
parent 7d5b9b8ba1
commit 688bd1aa29
14 changed files with 1 additions and 772 deletions

View File

@ -1,14 +1,8 @@
# Copyright 2021 (c) Anna Schumaker. # Copyright 2021 (c) Anna Schumaker.
from . import column from gi.repository import Gtk
from . import controls
from . import footer from . import footer
from . import header from . import header
from . import model
from . import runtime
from . import view from . import view
from gi.repository import Gtk
import audio
import tagdb
class Panel(Gtk.Box): class Panel(Gtk.Box):
def __init__(self): def __init__(self):
@ -28,67 +22,3 @@ class Panel(Gtk.Box):
def set_playlist(self, plist): def set_playlist(self, plist):
self.header.set_playlist(plist) self.header.set_playlist(plist)
self.window.set_playlist(plist) self.window.set_playlist(plist)
Model = model.TagModel()
def on_filter_pending(filter, pending):
runtime.set_visible_count(FilterModel.get_n_items())
FilterModel = Gtk.FilterListModel()
FilterModel.connect("notify::pending", on_filter_pending)
FilterModel.set_filter(Model.Controls.filter)
FilterModel.set_model(Model)
Selection = Gtk.MultiSelection()
Selection.set_model(FilterModel)
def on_row_activate(view, position):
track = FilterModel.get_item(position)
if audio.play_track(track):
Model.tag.track_selected(track)
tagdb.save()
View = Gtk.ColumnView()
View.connect("activate", on_row_activate)
View.add_css_class("data-table")
View.set_enable_rubberband(True)
View.set_hexpand(True)
View.set_vexpand(True)
View.set_model(Selection)
View.append_column(column.OldColumn("#", "tracknumber"))
View.append_column(column.OldColumn("Title", "title", width=250, expand=True))
View.append_column(column.OldColumn("Length", "length", align=100))
View.append_column(column.OldColumn("Artist", "artist", width=150))
View.append_column(column.OldColumn("Album", "album", width=150))
View.append_column(column.OldColumn("Year", "year"))
View.append_column(column.OldColumn("Count", "playcount"))
View.append_column(column.OldColumn("Last Played", "lastplayed", width=150))
Scroll = Gtk.ScrolledWindow()
Scroll.set_child(View)
def scroll_to_track(track):
adj = View.get_vadjustment()
for i in range(FilterModel.get_n_items()):
if FilterModel.get_item(i) == track:
Selection.select_item(i, True)
pos = (max(i - 5, 0) / FilterModel.get_n_items())
adj.set_value(pos * adj.get_upper())
return
def scroll_to_current(*args):
scroll_to_track(audio.Player.track)
Model.Controls.jump.connect("clicked", scroll_to_current)
def on_tracks_changed(player, prev, new):
scroll_to_track(new)
audio.Player.connect("track-changed", on_tracks_changed)
Box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
Box.append(Model.Controls)
Box.append(Scroll)
Box.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL))
Box.append(runtime.Box)

View File

@ -102,45 +102,3 @@ def SubtitleColumn(): return Column("Subtitle", SubtitleFactory(), width=150, ex
def YearColumn(): return Column("Year", YearFactory()) def YearColumn(): return Column("Year", YearFactory())
def PlayCountColumn(): return Column("Count", PlayCountFactory()) def PlayCountColumn(): return Column("Count", PlayCountFactory())
def LastPlayedColumn(): return Column("Last Played", LastPlayedFactory()) def LastPlayedColumn(): return Column("Last Played", LastPlayedFactory())
class OldColumn(Gtk.ColumnViewColumn):
def __init__(self, title, field, width=-1, expand=False, align=0):
Gtk.ColumnViewColumn.__init__(self)
self.field = field
self.align = align
self.factory = Gtk.SignalListItemFactory()
self.factory.connect("bind", self.on_bind)
self.factory.connect("setup", self.on_setup)
self.factory.connect("teardown", self.on_teardown)
self.factory.connect("unbind", self.on_unbind)
settings.initialize(f"column.{title}", width)
self.set_factory(self.factory)
self.set_fixed_width(settings.get_int(f"column.{title}"))
self.set_expand(expand)
self.set_resizable(True)
self.set_title(title)
self.connect("notify::fixed-width", self.on_width_changed)
def on_width_changed(self, col, param):
settings.set(f"column.{self.get_title()}", self.get_fixed_width())
def on_bind(self, factory, listitem):
track = listitem.get_item()
text = GLib.markup_escape_text(track[self.field])
if track == audio.Player.track:
text = f"<b>{text}</b>"
listitem.get_child().set_markup(text)
listitem.get_child().set_xalign(self.align)
def on_setup(self, factory, listitem):
listitem.set_child(Gtk.Label())
def on_teardown(self, factory, listitem):
listitem.set_child(None)
def on_unbind(self, factory, listitem):
pass

View File

@ -1,69 +0,0 @@
# Copyright 2021 (c) Anna Schumaker.
from . import filter
from . import popover
from gi.repository import Gtk
import tagdb
class Controls(Gtk.Box):
def __init__(self):
Gtk.Box.__init__(self)
self.tag = None
self.filter = filter.Filter()
self.search = Gtk.SearchEntry()
self.search.set_property("placeholder-text", "Type to filter tracks")
self.search.connect("search-changed", self.search_changed)
self.search.set_hexpand(True)
self.append(self.search)
self.random = Gtk.ToggleButton()
self.random.set_icon_name("media-playlist-shuffle")
self.random.connect("toggled", self.random_toggled)
self.random.set_sensitive(False)
self.append(self.random)
self.loop = Gtk.ToggleButton()
self.loop.set_icon_name("media-playlist-repeat")
self.loop.connect("toggled", self.loop_toggled)
self.loop.set_sensitive(False)
self.append(self.loop)
self.jump = Gtk.Button.new_from_icon_name("go-jump")
self.jump.set_sensitive(False)
self.append(self.jump)
self.add_popover = popover.AddPopover()
self.add = Gtk.MenuButton()
self.add.set_icon_name("list-add")
self.add.set_popover(self.add_popover)
self.add.set_sensitive(False)
self.append(self.add)
self.add_css_class("linked")
def set_tag(self, tag):
self.tag = tag
self.add.set_sensitive(tag is not None)
self.jump.set_sensitive(tag is not None)
self.random.set_sensitive(tag.can_random())
self.random.set_active(tag.random)
self.loop.set_sensitive(tag.can_loop())
self.loop.set_active(tag.loop)
def random_toggled(self, toggle):
self.tag.random = toggle.get_active()
tagdb.save()
def loop_toggled(self, toggle):
self.tag.loop = toggle.get_active()
tagdb.save()
def search_changed(self, search):
try:
self.filter.set_search_text(search.get_text())
self.search.remove_css_class("warning")
except:
self.search.add_css_class("warning")

View File

@ -1,28 +0,0 @@
# Copyright 2021 (c) Anna Schumaker.
from gi.repository import Gtk
import re
class Filter(Gtk.CustomFilter):
def __init__(self):
Gtk.CustomFilter.__init__(self)
self.text = None
self.pattern = re.compile("")
self.set_filter_func(self.filter_func)
def filter_func(self, track):
for field in [ "artist", "album", "title" ]:
if self.pattern.search(track[field]) != None:
return True
return False
def set_search_text(self, text):
change = Gtk.FilterChange.DIFFERENT
if self.text == None or self.text in text:
Gtk.FilterChange.MORE_STRICT
elif text in self.text:
Gtk.FilterChange.LESS_STRICT
self.pattern = re.compile(text, re.I)
self.text = text
self.changed(change)

View File

@ -1,12 +1,8 @@
# Copyright 2021 (c) Anna Schumaker. # Copyright 2021 (c) Anna Schumaker.
import audio
import lib import lib
from gi.repository import GObject from gi.repository import GObject
from gi.repository import Gio from gi.repository import Gio
from gi.repository import Gtk from gi.repository import Gtk
from lib import bus
from . import controls
from . import runtime
class PlaylistModel(GObject.GObject, Gio.ListModel): class PlaylistModel(GObject.GObject, Gio.ListModel):
def __init__(self): def __init__(self):
@ -211,70 +207,3 @@ class FlatSortModel(Gtk.FlattenListModel):
def disable(self, field): def disable(self, field):
self.get_model().get_item(0).remove(field) self.get_model().get_item(0).remove(field)
self.get_model().get_item(1).get_filter().changed() self.get_model().get_item(1).get_filter().changed()
class TagModel(GObject.GObject, Gio.ListModel):
def __init__(self, tag=None):
GObject.GObject.__init__(self)
self.Controls = controls.Controls()
self.bus = bus.Bus(1)
self.items = [ ]
self.__set_tag__(tag)
audio.Player.connect("track-changed", self.on_tracks_changed)
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)
self.Controls.set_tag(tag)
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):
return len(self.items)
def do_get_item(self, n):
if n < len(self.items):
return self.items[n]
def items_changed(self, pos, removed, added):
super().items_changed(pos, removed, added)
runtime.set_runtime(self.tag.runtime)
runtime.set_visible_count(len(self.items))
def switch_tag(self, tag):
removed = self.__unset_tag__()
added = self.__set_tag__(tag)
self.items_changed(0, removed, added)
def do_track_added(self, tag, track, pos):
self.items.insert(pos, track)
self.items_changed(pos, 0, 1)
def track_added(self, tag, track, pos):
self.bus.board(self.do_track_added, tag, track, pos)
def do_track_removed(self, tag, track, pos):
self.items.remove(track)
self.items_changed(pos, 1, 0)
def track_removed(self, tag, track, pos):
self.bus.board(self.do_track_removed, tag, track, pos)
def on_tracks_changed(self, player, prev, new):
if prev in self.items:
self.items_changed(self.items.index(prev), 1, 1)
if new in self.items:
self.items_changed(self.items.index(new), 1, 1)

View File

@ -1,84 +0,0 @@
# Copyright 2021 (c) Anna Schumaker.
from gi.repository import Gtk, Gio, GObject
import tagdb
Exclude = [ "Collection", "New Tracks", "Previous" ]
Icons = { "Favorites" : "emmental-favorites",
"Up Next" : "edit-redo" }
class AddPopoverRow(Gtk.ListBoxRow):
def __init__(self, tag):
Gtk.ListBoxRow.__init__(self)
self.tag = tag
image = Icons.get(tag.name, "audio-x-generic")
self.icon = Gtk.Image.new_from_icon_name(image)
self.label = Gtk.Label.new(str=str(tag))
self.box = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 5)
self.box.append(self.icon)
self.box.append(self.label)
self.set_child(self.box)
class AddPopover(Gtk.Popover):
def __init__(self):
Gtk.Popover.__init__(self)
self.box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
self.listbox = Gtk.ListBox()
self.listbox.set_sort_func(self.sort_func)
self.listbox.connect("row-activated", self.row_activated)
self.box.append(self.listbox)
for tag in tagdb.tags.User.tags():
if tag.name not in Exclude:
self.user_added(tag)
self.entry = Gtk.Entry()
self.entry.set_placeholder_text("New Playlist")
self.entry.set_icon_from_icon_name(Gtk.EntryIconPosition.PRIMARY, "list-add")
self.entry.connect("activate", self.entry_activate)
self.box.append(self.entry)
tagdb.tags.User.Added.register(self.user_added)
tagdb.tags.User.Removed.register(self.user_removed)
self.set_child(self.box)
def do_add_selected(self, tag):
from . import FilterModel
from . import Selection
bitset = Selection.get_selection()
for i in range(bitset.get_minimum(), bitset.get_maximum() + 1):
track = FilterModel.get_item(i)
track.add_to_playlist(tag.name)
tagdb.save()
self.popdown()
def row_activated(self, listbox, row):
self.do_add_selected(row.tag)
def entry_activate(self, entry):
tag = tagdb.tags.User.add(entry.get_text())
self.do_add_selected(tag)
entry.set_text("")
def sort_func(self, lhs, rhs):
if lhs.tag < rhs.tag:
return -1
if rhs.tag < lhs.tag:
return 1
return 0
def user_added(self, tag):
self.listbox.append(AddPopoverRow(tag))
def user_removed(self, tag):
for i in range(len(tagdb.tags.User)):
row = self.listbox.get_row_at_index(i)
if row is not None and row.tag == tag:
self.listbox.remove(row)
return

View File

@ -1,40 +0,0 @@
# Copyright 2021 (c) Anna Schumaker.
from gi.repository import Gtk
Runtime = Gtk.Label()
Runtime.set_halign(Gtk.Align.END)
Runtime.set_hexpand(True)
Visible = Gtk.Label()
Visible.set_halign(Gtk.Align.START)
Visible.set_hexpand(True)
def set_runtime(seconds):
res = [ ]
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
if d > 0:
res.append(f"{d} day{'s' if d != 1 else ''}")
if h > 0:
res.append(f"{h} hour{'s' if h != 1 else ''}")
if m > 0:
res.append(f"{m} minute{'s' if m != 1 else ''}")
if s > 0 or seconds == 0:
res.append(f"{s} second{'s' if s != 1 else ''}")
Runtime.set_text(", ".join(res))
set_runtime(0)
def set_visible_count(count):
if count == 1:
Visible.set_text(f"Showing {count} track")
else:
Visible.set_text(f"Showing {count} tracks")
set_visible_count(0)
Box = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
Box.set_margin_start(5)
Box.set_margin_end(5)
Box.append(Visible)
Box.append(Runtime)

View File

@ -3,7 +3,6 @@ import db
import lib import lib
import unittest import unittest
from gi.repository import Gtk from gi.repository import Gtk
from lib import settings
from . import column from . import column
class FakeListItem: class FakeListItem:
@ -190,30 +189,3 @@ class TestColumns(unittest.TestCase):
self.assertIsInstance(col, column.Column) self.assertIsInstance(col, column.Column)
self.assertIsInstance(col.get_factory(), column.LastPlayedFactory) self.assertIsInstance(col.get_factory(), column.LastPlayedFactory)
self.assertEqual(col.get_title(), "Last Played") self.assertEqual(col.get_title(), "Last Played")
class TestPlaylistColumn(unittest.TestCase):
def tearDown(self):
settings.reset()
def test_playlist_column_init(self):
col = column.OldColumn("Test", "test")
self.assertIsInstance(col, Gtk.ColumnViewColumn)
self.assertIsInstance(col.factory, Gtk.SignalListItemFactory)
self.assertEqual(col.get_title(), "Test")
self.assertEqual(col.field, "test")
self.assertEqual(col.align, 0)
self.assertEqual(col.get_factory(), col.factory)
self.assertTrue(col.get_resizable())
self.assertFalse(col.get_expand())
col = column.OldColumn("Test2", "test", expand=True)
self.assertTrue(col.get_expand())
def test_playlist_column_width(self):
col = column.OldColumn("Test", "test", width=100)
self.assertEqual(settings.get_int("column.Test"), 100)
col.set_fixed_width(200)
self.assertEqual(settings.get_int("column.Test"), 200)

View File

@ -1,70 +0,0 @@
# Copyright 2021 (c) Anna Schumaker.
from . import controls
from . import filter
from . import popover
from gi.repository import Gtk
import tagdb
import unittest
class TestPlaylistControls(unittest.TestCase):
def test_playlist_controls_init(self):
ctrl = controls.Controls()
self.assertIsInstance(ctrl, Gtk.Box)
self.assertIsInstance(ctrl.search, Gtk.SearchEntry)
self.assertIsInstance(ctrl.random, Gtk.ToggleButton)
self.assertIsInstance(ctrl.loop, Gtk.ToggleButton)
self.assertIsInstance(ctrl.jump, Gtk.Button)
self.assertIsInstance(ctrl.add_popover, popover.AddPopover)
self.assertIsInstance(ctrl.add, Gtk.MenuButton)
self.assertIsInstance(ctrl.filter, filter.Filter)
self.assertEqual(ctrl.random.get_icon_name(), "media-playlist-shuffle")
self.assertEqual(ctrl.loop.get_icon_name(), "media-playlist-repeat")
self.assertEqual(ctrl.jump.get_icon_name(), "go-jump")
self.assertEqual(ctrl.add.get_icon_name(), "list-add")
self.assertEqual(ctrl.add.get_popover(), ctrl.add_popover)
self.assertEqual(ctrl.search.get_property("placeholder-text"),
"Type to filter tracks")
self.assertTrue(ctrl.has_css_class("linked"))
self.assertTrue(ctrl.search.get_hexpand())
self.assertIn(ctrl.search, ctrl)
self.assertIn(ctrl.random, ctrl)
self.assertIn(ctrl.loop, ctrl)
self.assertIn(ctrl.jump, ctrl)
self.assertIn(ctrl.add, ctrl)
def test_playlist_controls_set_tag(self):
ctrl = controls.Controls()
fav = tagdb.tags.User["Favorites"]
prev = tagdb.tags.User["Previous"]
self.assertIsNone(ctrl.tag)
self.assertFalse(ctrl.random.get_sensitive())
self.assertFalse(ctrl.random.get_active())
self.assertFalse(ctrl.loop.get_sensitive())
self.assertFalse(ctrl.loop.get_active())
self.assertFalse(ctrl.jump.get_sensitive())
self.assertFalse(ctrl.add.get_sensitive())
fav.random = True
fav.loop = True
ctrl.set_tag(fav)
self.assertEqual(ctrl.tag, fav)
self.assertTrue(ctrl.random.get_sensitive())
self.assertTrue(ctrl.random.get_active())
self.assertTrue(ctrl.loop.get_sensitive())
self.assertTrue(ctrl.loop.get_active())
self.assertTrue(ctrl.jump.get_sensitive())
self.assertTrue(ctrl.add.get_sensitive())
ctrl.set_tag(prev)
self.assertEqual(ctrl.tag, prev)
self.assertFalse(ctrl.random.get_sensitive())
self.assertFalse(ctrl.random.get_active())
self.assertFalse(ctrl.loop.get_sensitive())
self.assertFalse(ctrl.loop.get_active())
self.assertTrue(ctrl.jump.get_sensitive())
self.assertTrue(ctrl.add.get_sensitive())

View File

@ -1,15 +0,0 @@
# Copyright 2021 (c) Anna Schumaker.
from . import filter
from gi.repository import Gtk
import unittest
class TestPlaylistFilter(unittest.TestCase):
def test_playlist_filter_init(self):
f = filter.Filter()
self.assertIsInstance(f, Gtk.CustomFilter)
self.assertIsNone(f.text)
self.assertEqual(f.pattern.pattern, "")
f.set_search_text("text")
self.assertEqual(f.text, "text")
self.assertEqual(f.pattern.pattern, "text")

View File

@ -5,12 +5,7 @@ import unittest
from gi.repository import GObject from gi.repository import GObject
from gi.repository import Gio from gi.repository import Gio
from gi.repository import Gtk from gi.repository import Gtk
from . import controls
from . import model from . import model
from . import runtime
from lib import bus
from lib import fake
from lib import tag
class TestPlaylistModel(unittest.TestCase): class TestPlaylistModel(unittest.TestCase):
@ -356,79 +351,3 @@ class TestFlatSortModel(unittest.TestCase):
self.assertEqual(models.models[0].get_n_items(), 4) self.assertEqual(models.models[0].get_n_items(), 4)
self.assertEqual(models.models[1].get_n_items(), 5) self.assertEqual(models.models[1].get_n_items(), 5)
self.assertEqual(sort.get_n_enabled(), 4) self.assertEqual(sort.get_n_enabled(), 4)
class TestTagModel(unittest.TestCase):
def setUp(self):
self.changed = (None, None, None)
def items_changed_cb(self, model, position, removed, added):
self.changed = (position, removed, added)
def test_tag_model_init(self):
t = tag.Tag("Test")
m = model.TagModel(t)
self.assertIsInstance(m, GObject.Object)
self.assertIsInstance(m, Gio.ListModel)
self.assertIsInstance(m.bus, bus.Bus)
self.assertIsInstance(m.Controls, controls.Controls)
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))
def test_tag_model_add_remove(self):
t = tag.Tag("Test")
m = model.TagModel(t)
track = fake.Track(1)
t.add_track(track)
m.bus.complete()
self.assertEqual(m.items, [ track ])
self.assertEqual(m.get_n_items(), 1)
self.assertEqual(m.get_item(0), fake.Track(1))
self.assertEqual(runtime.Runtime.get_text(), "1 second")
self.assertEqual(runtime.Visible.get_text(), "Showing 1 track")
t.remove_track(track)
m.bus.complete()
self.assertEqual(m.items, [ ])
self.assertEqual(m.get_n_items(), 0)
self.assertIsNone(m.get_item(0))
self.assertEqual(runtime.Runtime.get_text(), "0 seconds")
self.assertEqual(runtime.Visible.get_text(), "Showing 0 tracks")
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))
def test_tag_model_switch_tag(self):
t = tag.Tag("A")
t.add_track(fake.Track(1))
t.add_track(fake.Track(2))
u = tag.Tag("B")
u.add_track(fake.Track(5))
m = model.TagModel()
m.connect("items-changed", self.items_changed_cb)
m.switch_tag(t)
self.assertEqual(self.changed, (0, 0, 2))
self.assertIn(m.track_added, t.TrackAdded.subscribers)
self.assertEqual(runtime.Visible.get_text(), "Showing 2 tracks")
self.assertEqual(runtime.Runtime.get_text(), "3 seconds")
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)
self.assertEqual(runtime.Visible.get_text(), "Showing 1 track")
self.assertEqual(runtime.Runtime.get_text(), "5 seconds")

View File

@ -1,6 +1,5 @@
# Copyright 2021 (c) Anna Schumaker. # Copyright 2021 (c) Anna Schumaker.
import db import db
import lib
import playlist import playlist
import unittest import unittest
from gi.repository import Gtk from gi.repository import Gtk
@ -39,45 +38,3 @@ class TestPanel(unittest.TestCase):
panel.set_playlist(collection) panel.set_playlist(collection)
self.assertEqual(panel.header.get_last_child().get_first_child().playlist, collection) self.assertEqual(panel.header.get_last_child().get_first_child().playlist, collection)
self.assertEqual(panel.get_playlist(), collection) self.assertEqual(panel.get_playlist(), collection)
class ColumnEV:
def __init__(self, title, width, expand):
self.title = title
self.width = width
self.expand = expand
columns = [ ColumnEV("#", -1, False),
ColumnEV("Title", 250, True),
ColumnEV("Length", -1, False),
ColumnEV("Artist", 150, False),
ColumnEV("Album", 150, False),
ColumnEV("Year", -1, False),
ColumnEV("Count", -1, False),
ColumnEV("Last Played", 150, False) ]
class TestPlaylist(unittest.TestCase):
def test_playlist_init(self):
self.assertIsInstance(playlist.Model, playlist.model.TagModel)
self.assertIsInstance(playlist.FilterModel, Gtk.FilterListModel)
self.assertIsInstance(playlist.Selection, Gtk.MultiSelection)
self.assertIsInstance(playlist.View, Gtk.ColumnView)
self.assertIsInstance(playlist.Scroll, Gtk.ScrolledWindow)
self.assertEqual(playlist.FilterModel.get_model(), playlist.Model)
self.assertEqual(playlist.FilterModel.get_filter(),
playlist.Model.Controls.filter)
self.assertEqual(playlist.Selection.get_model(), playlist.FilterModel)
self.assertEqual(playlist.View.get_model(), playlist.Selection)
self.assertEqual(playlist.Scroll.get_child(), playlist.View)
self.assertTrue(playlist.View.get_hexpand())
self.assertTrue(playlist.View.get_vexpand())
self.assertTrue(playlist.View.has_css_class("data-table"))
self.assertTrue(playlist.View.get_enable_rubberband())
for (i, c) in enumerate(playlist.View.get_columns()):
self.assertEqual(c.get_title(), columns[i].title)
self.assertEqual(c.get_fixed_width(), columns[i].width)
self.assertEqual(c.get_expand(), columns[i].expand)

View File

@ -1,76 +0,0 @@
# Copyright 2021 (c) Anna Schumaker.
from . import popover
from gi.repository import Gtk
import tagdb
import unittest
class TestAddPopover(unittest.TestCase):
def setUp(self):
tagdb.reset()
def test_add_popover_init(self):
pop = popover.AddPopover()
self.assertIsInstance(pop, Gtk.Popover)
self.assertIsInstance(pop.box, Gtk.Box)
self.assertIsInstance(pop.listbox, Gtk.ListBox)
self.assertIsInstance(pop.entry, Gtk.Entry)
self.assertEqual(pop.entry.get_placeholder_text(), "New Playlist")
self.assertEqual(pop.entry.get_icon_name(Gtk.EntryIconPosition.PRIMARY),
"list-add")
self.assertEqual(pop.get_child(), pop.box)
self.assertIn(pop.listbox, pop.box)
self.assertIn(pop.entry, pop.box)
def test_add_popover_row(self):
tag = tagdb.tags.User["Favorites"]
row = popover.AddPopoverRow(tag)
self.assertEqual(popover.Exclude,
[ "Collection", "New Tracks", "Previous" ])
self.assertEqual(popover.Icons, { "Favorites" : "emmental-favorites",
"Up Next" : "edit-redo" })
self.assertIsInstance(row.box, Gtk.Box)
self.assertIsInstance(row.icon, Gtk.Image)
self.assertIsInstance(row.label, Gtk.Label)
self.assertEqual(row.tag, tag)
self.assertEqual(row.icon.get_icon_name(), "emmental-favorites")
self.assertEqual(row.label.get_text(), "Favorites")
self.assertEqual(row.box.get_spacing(), 5)
self.assertEqual(row.get_child(), row.box)
self.assertIn(row.icon, row.box)
self.assertIn(row.label, row.box)
def test_add_popover_list(self):
pop = popover.AddPopover()
user = tagdb.tags.User
self.assertEqual(pop.listbox.get_row_at_index(0).tag, user["Favorites"])
self.assertEqual(pop.listbox.get_row_at_index(1).tag, user["Up Next"])
self.assertIsNone(pop.listbox.get_row_at_index(2))
tag = user.add("Test")
self.assertEqual(pop.listbox.get_row_at_index(0).tag, user["Favorites"])
self.assertEqual(pop.listbox.get_row_at_index(1).tag, user["Test"])
self.assertEqual(pop.listbox.get_row_at_index(2).tag, user["Up Next"])
self.assertIsNone(pop.listbox.get_row_at_index(3))
user.remove(tag)
self.assertEqual(pop.listbox.get_row_at_index(0).tag, user["Favorites"])
self.assertEqual(pop.listbox.get_row_at_index(1).tag, user["Up Next"])
self.assertIsNone(pop.listbox.get_row_at_index(2))
def test_add_popover_entry(self):
pop = popover.AddPopover()
pop.entry.set_text("Test")
pop.entry_activate(pop.entry)
tag = tagdb.tags.User["Test"]
self.assertIsNotNone(tag)
self.assertEqual(pop.entry.get_text(), "")

View File

@ -1,54 +0,0 @@
# Copyright 2021 (c) Anna Schumaker.
from . import runtime
from gi.repository import Gtk
import unittest
class TestPlaylistRuntime(unittest.TestCase):
def setUp(self):
runtime.set_runtime(0)
runtime.set_visible_count(0)
def test_runtime_init(self):
self.assertIsInstance(runtime.Runtime, Gtk.Label)
self.assertIsInstance(runtime.Visible, Gtk.Label)
self.assertIsInstance(runtime.Box, Gtk.Box)
self.assertEqual(runtime.Runtime.get_text(), "0 seconds")
self.assertEqual(runtime.Runtime.get_halign(), Gtk.Align.END)
self.assertTrue(runtime.Runtime.get_hexpand())
self.assertEqual(runtime.Visible.get_text(), "Showing 0 tracks")
self.assertEqual(runtime.Visible.get_halign(), Gtk.Align.START)
self.assertTrue(runtime.Visible.get_hexpand())
self.assertEqual(runtime.Box.get_margin_start(), 5)
self.assertEqual(runtime.Box.get_margin_end(), 5)
self.assertIn(runtime.Visible, runtime.Box)
self.assertIn(runtime.Runtime, runtime.Box)
def test_runtime_set_runtime(self):
runtime.set_runtime(0)
self.assertEqual(runtime.Runtime.get_text(), "0 seconds")
runtime.set_runtime(1)
self.assertEqual(runtime.Runtime.get_text(), "1 second")
runtime.set_runtime(60)
self.assertEqual(runtime.Runtime.get_text(), "1 minute")
runtime.set_runtime(125)
self.assertEqual(runtime.Runtime.get_text(), "2 minutes, 5 seconds")
runtime.set_runtime(3600)
self.assertEqual(runtime.Runtime.get_text(), "1 hour")
runtime.set_runtime(7320)
self.assertEqual(runtime.Runtime.get_text(), "2 hours, 2 minutes")
runtime.set_runtime(86400)
self.assertEqual(runtime.Runtime.get_text(), "1 day")
runtime.set_runtime(180000)
self.assertEqual(runtime.Runtime.get_text(), "2 days, 2 hours")
def test_runtime_set_visible_count(self):
runtime.set_visible_count(0)
self.assertEqual(runtime.Visible.get_text(), "Showing 0 tracks")
runtime.set_visible_count(1)
self.assertEqual(runtime.Visible.get_text(), "Showing 1 track")
runtime.set_visible_count(3)
self.assertEqual(runtime.Visible.get_text(), "Showing 3 tracks")