From eac9bde353813bdd1cde2c14c07d2745851cdb59 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Tue, 29 Jun 2021 17:01:30 -0400 Subject: [PATCH] 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 --- playlist/__init__.py | 17 +++++++++-------- playlist/column.py | 25 ++++++++++++++++++++++++- playlist/test_column.py | 10 +++++++--- test_playlist.py | 1 + 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/playlist/__init__.py b/playlist/__init__.py index df967d2..28225da 100644 --- a/playlist/__init__.py +++ b/playlist/__init__.py @@ -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) diff --git a/playlist/column.py b/playlist/column.py index fd54b3d..8e1996e 100644 --- a/playlist/column.py +++ b/playlist/column.py @@ -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 diff --git a/playlist/test_column.py b/playlist/test_column.py index ca2fa77..3f23287 100644 --- a/playlist/test_column.py +++ b/playlist/test_column.py @@ -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) diff --git a/test_playlist.py b/test_playlist.py index 8ca2537..4441252 100644 --- a/test_playlist.py +++ b/test_playlist.py @@ -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)