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.
from . import column
from . import controls
from gi.repository import Gtk
from . import footer
from . import header
from . import model
from . import runtime
from . import view
from gi.repository import Gtk
import audio
import tagdb
class Panel(Gtk.Box):
def __init__(self):
@ -28,67 +22,3 @@ class Panel(Gtk.Box):
def set_playlist(self, plist):
self.header.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 PlayCountColumn(): return Column("Count", PlayCountFactory())
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.
import audio
import lib
from gi.repository import GObject
from gi.repository import Gio
from gi.repository import Gtk
from lib import bus
from . import controls
from . import runtime
class PlaylistModel(GObject.GObject, Gio.ListModel):
def __init__(self):
@ -211,70 +207,3 @@ class FlatSortModel(Gtk.FlattenListModel):
def disable(self, field):
self.get_model().get_item(0).remove(field)
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 unittest
from gi.repository import Gtk
from lib import settings
from . import column
class FakeListItem:
@ -190,30 +189,3 @@ class TestColumns(unittest.TestCase):
self.assertIsInstance(col, column.Column)
self.assertIsInstance(col.get_factory(), column.LastPlayedFactory)
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 Gio
from gi.repository import Gtk
from . import controls
from . import model
from . import runtime
from lib import bus
from lib import fake
from lib import tag
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[1].get_n_items(), 5)
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.
import db
import lib
import playlist
import unittest
from gi.repository import Gtk
@ -39,45 +38,3 @@ class TestPanel(unittest.TestCase):
panel.set_playlist(collection)
self.assertEqual(panel.header.get_last_child().get_first_child().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")