playlist: Bind columns to a ListItemFactory

Gtk doesn't seem to provide a way to create a ListItem for testing, so I
skip testing this for now.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-06-29 17:01:30 -04:00
parent 9d2efcfedd
commit eac9bde353
4 changed files with 41 additions and 12 deletions

View File

@ -9,17 +9,18 @@ Selection = Gtk.SingleSelection()
Selection.set_model(Model)
View = Gtk.ColumnView()
View.add_css_class("data-table")
View.set_hexpand(True)
View.set_model(Selection)
View.append_column(column.Column("#"))
View.append_column(column.Column("Title", width=250, expand=True))
View.append_column(column.Column("Length"))
View.append_column(column.Column("Artist", width=150))
View.append_column(column.Column("Album", width=150))
View.append_column(column.Column("Year"))
View.append_column(column.Column("Count"))
View.append_column(column.Column("Last Played", width=150))
View.append_column(column.Column("#", "tracknumber"))
View.append_column(column.Column("Title", "title", width=250, expand=True))
View.append_column(column.Column("Length", "length", align=100))
View.append_column(column.Column("Artist", "artist", width=150))
View.append_column(column.Column("Album", "album", width=150))
View.append_column(column.Column("Year", "year"))
View.append_column(column.Column("Count", "playcount"))
View.append_column(column.Column("Last Played", "lastplayed", width=150))
Scroll = Gtk.ScrolledWindow()
Scroll.set_child(View)

View File

@ -3,11 +3,20 @@ from lib import settings
from gi.repository import Gtk
class Column(Gtk.ColumnViewColumn):
def __init__(self, title, width=-1, expand=False):
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)
@ -16,3 +25,17 @@ class Column(Gtk.ColumnViewColumn):
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()
listitem.get_child().set_text(track[self.field])
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

@ -9,18 +9,22 @@ class TestPlaylistColumn(unittest.TestCase):
settings.reset()
def test_playlist_column_init(self):
col = column.Column("Test")
col = column.Column("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.Column("Test2", expand=True)
col = column.Column("Test2", "test", expand=True)
self.assertTrue(col.get_expand())
def test_playlist_column_width(self):
col = column.Column("Test", width=100)
col = column.Column("Test", "test", width=100)
self.assertEqual(settings.get_int("column.Test"), 100)
col.set_fixed_width(200)

View File

@ -30,6 +30,7 @@ class TestPlaylist(unittest.TestCase):
self.assertEqual(playlist.Scroll.get_child(), playlist.View)
self.assertTrue(playlist.View.get_hexpand())
self.assertTrue(playlist.View.has_css_class("data-table"))
for (i, c) in enumerate(playlist.View.get_columns()):
self.assertEqual(c.get_title(), columns[i].title)