playlist: Remove old playlist code
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
7d5b9b8ba1
commit
688bd1aa29
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
|
@ -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)
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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)
|
|
@ -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)
|
||||
|
|
|
@ -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())
|
|
@ -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")
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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(), "")
|
|
@ -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")
|
Loading…
Reference in New Issue