tracklist: Create a MediumName TrackRow
The MediumName TrackRow is used to combine the album and medium names into a single string. This means we won't need to have a separate medium name column that is empty for most tracks. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
97bf9d48db
commit
61dfc2a586
|
@ -240,6 +240,50 @@ class AlbumString(InscriptionRow):
|
||||||
self.bind_to_self("mediumid", "mediumid")
|
self.bind_to_self("mediumid", "mediumid")
|
||||||
|
|
||||||
|
|
||||||
|
class MediumString(InscriptionRow):
|
||||||
|
"""A Track Row to display Album and Medium names."""
|
||||||
|
|
||||||
|
album = GObject.Property(type=str)
|
||||||
|
medium = GObject.Property(type=str)
|
||||||
|
|
||||||
|
def __init__(self, listitem: Gtk.ListItem, property: str, **kwargs):
|
||||||
|
"""Initialize a MediumName inscription."""
|
||||||
|
super().__init__(listitem, property, **kwargs)
|
||||||
|
self.connect("notify", self.__update_string)
|
||||||
|
|
||||||
|
def __unbind_medium_name(self) -> None:
|
||||||
|
binding = getattr(self, "medium_binding", None)
|
||||||
|
if binding is not None:
|
||||||
|
binding.unbind()
|
||||||
|
setattr(self, "medium_binding", None)
|
||||||
|
|
||||||
|
def __rebind_medium_name(self) -> None:
|
||||||
|
medium = self.item.get_medium()
|
||||||
|
self.medium = medium.name
|
||||||
|
setattr(self, "medium_binding",
|
||||||
|
medium.bind_property("name", self, "medium"))
|
||||||
|
|
||||||
|
def __update_string(self, row: InscriptionRow, param) -> None:
|
||||||
|
match param.name:
|
||||||
|
case "mediumid":
|
||||||
|
self.rebind_album("album", to_self=True)
|
||||||
|
self.__rebind_medium_name()
|
||||||
|
case "album" | "medium":
|
||||||
|
medium = f":\n{self.medium}" if len(self.medium) else ""
|
||||||
|
album = self.item.get_medium().get_album().name
|
||||||
|
self.child.set_text(f"{album}{medium}")
|
||||||
|
|
||||||
|
def do_bind(self) -> None:
|
||||||
|
"""Bind an album name and medium name to the Inscription."""
|
||||||
|
super().do_bind()
|
||||||
|
self.bind_to_self("mediumid", "mediumid")
|
||||||
|
|
||||||
|
def do_unbind(self) -> None:
|
||||||
|
"""Unbind the album and medium name from the Inscription."""
|
||||||
|
super().do_unbind()
|
||||||
|
self.__unbind_medium_name()
|
||||||
|
|
||||||
|
|
||||||
class AlbumCover(TrackRow):
|
class AlbumCover(TrackRow):
|
||||||
"""A Track Row to display Album art."""
|
"""A Track Row to display Album art."""
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ class TrackView(Gtk.Frame):
|
||||||
self.__append_column("Length", "length", row.LengthString,
|
self.__append_column("Length", "length", row.LengthString,
|
||||||
xalign=1.0, numeric=True)
|
xalign=1.0, numeric=True)
|
||||||
self.__append_column("Artist", "artist", row.TrackString, width=250)
|
self.__append_column("Artist", "artist", row.TrackString, width=250)
|
||||||
|
self.__append_column("Album", "name", row.MediumString, width=350)
|
||||||
self.__append_column("Album Artist", "artist", row.AlbumString,
|
self.__append_column("Album Artist", "artist", row.AlbumString,
|
||||||
width=250, visible=False)
|
width=250, visible=False)
|
||||||
self.__append_column("Release", "release", row.AlbumString,
|
self.__append_column("Release", "release", row.AlbumString,
|
||||||
|
|
|
@ -127,6 +127,7 @@ class TestSettings(unittest.TestCase):
|
||||||
self.assertEqual(self.settings["tracklist.title.size"], 300)
|
self.assertEqual(self.settings["tracklist.title.size"], 300)
|
||||||
self.assertEqual(self.settings["tracklist.length.size"], -1)
|
self.assertEqual(self.settings["tracklist.length.size"], -1)
|
||||||
self.assertEqual(self.settings["tracklist.artist.size"], 250)
|
self.assertEqual(self.settings["tracklist.artist.size"], 250)
|
||||||
|
self.assertEqual(self.settings["tracklist.album.size"], 350)
|
||||||
self.assertEqual(self.settings["tracklist.album-artist.size"], 250)
|
self.assertEqual(self.settings["tracklist.album-artist.size"], 250)
|
||||||
self.assertEqual(self.settings["tracklist.release.size"], 115)
|
self.assertEqual(self.settings["tracklist.release.size"], 115)
|
||||||
self.assertEqual(self.settings["tracklist.play-count.size"], 135)
|
self.assertEqual(self.settings["tracklist.play-count.size"], 135)
|
||||||
|
@ -143,6 +144,7 @@ class TestSettings(unittest.TestCase):
|
||||||
self.assertEqual(self.settings["tracklist.title.size"], 123)
|
self.assertEqual(self.settings["tracklist.title.size"], 123)
|
||||||
self.assertEqual(self.settings["tracklist.length.size"], 123)
|
self.assertEqual(self.settings["tracklist.length.size"], 123)
|
||||||
self.assertEqual(self.settings["tracklist.artist.size"], 123)
|
self.assertEqual(self.settings["tracklist.artist.size"], 123)
|
||||||
|
self.assertEqual(self.settings["tracklist.album.size"], 123)
|
||||||
self.assertEqual(self.settings["tracklist.album-artist.size"], 123)
|
self.assertEqual(self.settings["tracklist.album-artist.size"], 123)
|
||||||
self.assertEqual(self.settings["tracklist.release.size"], 123)
|
self.assertEqual(self.settings["tracklist.release.size"], 123)
|
||||||
self.assertEqual(self.settings["tracklist.play-count.size"], 123)
|
self.assertEqual(self.settings["tracklist.play-count.size"], 123)
|
||||||
|
@ -158,6 +160,7 @@ class TestSettings(unittest.TestCase):
|
||||||
self.assertTrue(self.settings["tracklist.title.visible"])
|
self.assertTrue(self.settings["tracklist.title.visible"])
|
||||||
self.assertTrue(self.settings["tracklist.length.visible"])
|
self.assertTrue(self.settings["tracklist.length.visible"])
|
||||||
self.assertTrue(self.settings["tracklist.artist.visible"])
|
self.assertTrue(self.settings["tracklist.artist.visible"])
|
||||||
|
self.assertTrue(self.settings["tracklist.album.visible"])
|
||||||
self.assertFalse(self.settings["tracklist.album-artist.visible"])
|
self.assertFalse(self.settings["tracklist.album-artist.visible"])
|
||||||
self.assertTrue(self.settings["tracklist.release.visible"])
|
self.assertTrue(self.settings["tracklist.release.visible"])
|
||||||
self.assertTrue(self.settings["tracklist.play-count.visible"])
|
self.assertTrue(self.settings["tracklist.play-count.visible"])
|
||||||
|
@ -174,6 +177,7 @@ class TestSettings(unittest.TestCase):
|
||||||
self.assertFalse(self.settings["tracklist.title.visible"])
|
self.assertFalse(self.settings["tracklist.title.visible"])
|
||||||
self.assertFalse(self.settings["tracklist.length.visible"])
|
self.assertFalse(self.settings["tracklist.length.visible"])
|
||||||
self.assertFalse(self.settings["tracklist.artist.visible"])
|
self.assertFalse(self.settings["tracklist.artist.visible"])
|
||||||
|
self.assertFalse(self.settings["tracklist.album.visible"])
|
||||||
self.assertTrue(self.settings["tracklist.album-artist.visible"])
|
self.assertTrue(self.settings["tracklist.album-artist.visible"])
|
||||||
self.assertFalse(self.settings["tracklist.release.visible"])
|
self.assertFalse(self.settings["tracklist.release.visible"])
|
||||||
self.assertFalse(self.settings["tracklist.play-count.visible"])
|
self.assertFalse(self.settings["tracklist.play-count.visible"])
|
||||||
|
|
|
@ -23,7 +23,7 @@ class TestTrackRowWidgets(tests.util.TestCase):
|
||||||
self.library = self.sql.libraries.create(pathlib.Path("/a/b"))
|
self.library = self.sql.libraries.create(pathlib.Path("/a/b"))
|
||||||
self.album = self.sql.albums.create("Test Album", "Artist", "2023",
|
self.album = self.sql.albums.create("Test Album", "Artist", "2023",
|
||||||
cover=tests.util.COVER_JPG)
|
cover=tests.util.COVER_JPG)
|
||||||
self.medium = self.sql.media.create(self.album, "", number=1)
|
self.medium = self.sql.media.create(self.album, "Medium", number=1)
|
||||||
self.year = self.sql.years.create(2023)
|
self.year = self.sql.years.create(2023)
|
||||||
self.track = self.sql.tracks.create(self.library,
|
self.track = self.sql.tracks.create(self.library,
|
||||||
pathlib.Path("/a/b/1.ogg"),
|
pathlib.Path("/a/b/1.ogg"),
|
||||||
|
@ -170,6 +170,27 @@ class TestTrackRowWidgets(tests.util.TestCase):
|
||||||
row.unbind()
|
row.unbind()
|
||||||
self.assertIsNone(row.album_binding)
|
self.assertIsNone(row.album_binding)
|
||||||
|
|
||||||
|
def test_medium_string(self):
|
||||||
|
"""Test the Medium String widget."""
|
||||||
|
row = emmental.tracklist.row.MediumString(self.listitem, "name")
|
||||||
|
self.assertIsInstance(row, emmental.tracklist.row.InscriptionRow)
|
||||||
|
self.assertEqual(row.property, "name")
|
||||||
|
self.assertEqual(row.medium, "")
|
||||||
|
|
||||||
|
row.bind()
|
||||||
|
self.assertEqual(row.medium, "Medium")
|
||||||
|
self.assertEqual(row.child.get_text(), "Test Album:\nMedium")
|
||||||
|
|
||||||
|
self.medium.rename("New Name")
|
||||||
|
self.assertEqual(row.medium, "New Name")
|
||||||
|
self.assertEqual(row.child.get_text(), "Test Album:\nNew Name")
|
||||||
|
|
||||||
|
album = self.sql.albums.create("Other Album", "Other Artist", "2023")
|
||||||
|
medium = self.sql.media.create(album, "", number=4)
|
||||||
|
self.track.mediumid = medium.mediumid
|
||||||
|
self.assertEqual(row.medium, "")
|
||||||
|
self.assertEqual(row.child.get_text(), "Other Album")
|
||||||
|
|
||||||
def test_album_cover(self):
|
def test_album_cover(self):
|
||||||
"""Test the Album Cover widget."""
|
"""Test the Album Cover widget."""
|
||||||
self.assertDictEqual(emmental.tracklist.row.AlbumCover.Cache, {})
|
self.assertDictEqual(emmental.tracklist.row.AlbumCover.Cache, {})
|
||||||
|
|
|
@ -187,7 +187,23 @@ class TestTrackViewColumns(tests.util.TestCase):
|
||||||
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
||||||
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
|
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
|
||||||
|
|
||||||
def test_album_artist_column(self, i: int = 6):
|
def test_album_column(self, i: int = 6):
|
||||||
|
"""Test the artist column."""
|
||||||
|
self.assertEqual(self.columns[i].get_title(), "Album")
|
||||||
|
self.assertEqual(self.columns[i].get_fixed_width(), 350)
|
||||||
|
self.assertTrue(self.columns[i].get_resizable())
|
||||||
|
self.assertTrue(self.columns[i].get_visible())
|
||||||
|
|
||||||
|
factory = self.columns[i].get_factory()
|
||||||
|
self.assertIsInstance(factory, emmental.factory.Factory)
|
||||||
|
self.assertEqual(factory.row_type, emmental.tracklist.row.MediumString)
|
||||||
|
|
||||||
|
factory.emit("setup", self.listitem)
|
||||||
|
self.assertEqual(self.listitem.listrow.property, "name")
|
||||||
|
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
||||||
|
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
|
||||||
|
|
||||||
|
def test_album_artist_column(self, i: int = 7):
|
||||||
"""Test the album artist column."""
|
"""Test the album artist column."""
|
||||||
self.assertEqual(self.columns[i].get_title(), "Album Artist")
|
self.assertEqual(self.columns[i].get_title(), "Album Artist")
|
||||||
self.assertEqual(self.columns[i].get_fixed_width(), 250)
|
self.assertEqual(self.columns[i].get_fixed_width(), 250)
|
||||||
|
@ -203,7 +219,7 @@ class TestTrackViewColumns(tests.util.TestCase):
|
||||||
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
||||||
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
|
self.assertFalse(self.listitem.listrow.child.has_css_class("numeric"))
|
||||||
|
|
||||||
def test_release_column(self, i: int = 7):
|
def test_release_column(self, i: int = 8):
|
||||||
"""Test the release date column."""
|
"""Test the release date column."""
|
||||||
self.assertEqual(self.columns[i].get_title(), "Release")
|
self.assertEqual(self.columns[i].get_title(), "Release")
|
||||||
self.assertEqual(self.columns[i].get_fixed_width(), 115)
|
self.assertEqual(self.columns[i].get_fixed_width(), 115)
|
||||||
|
@ -219,7 +235,7 @@ class TestTrackViewColumns(tests.util.TestCase):
|
||||||
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
||||||
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
|
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
|
||||||
|
|
||||||
def test_playcount_column(self, i: int = 8):
|
def test_playcount_column(self, i: int = 9):
|
||||||
"""Test the play count column."""
|
"""Test the play count column."""
|
||||||
self.assertEqual(self.columns[i].get_title(), "Play Count")
|
self.assertEqual(self.columns[i].get_title(), "Play Count")
|
||||||
self.assertEqual(self.columns[i].get_fixed_width(), 135)
|
self.assertEqual(self.columns[i].get_fixed_width(), 135)
|
||||||
|
@ -236,7 +252,7 @@ class TestTrackViewColumns(tests.util.TestCase):
|
||||||
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
||||||
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
|
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
|
||||||
|
|
||||||
def test_last_started_column(self, i: int = 9):
|
def test_last_started_column(self, i: int = 10):
|
||||||
"""Test the last started column."""
|
"""Test the last started column."""
|
||||||
self.assertEqual(self.columns[i].get_title(), "Last Started")
|
self.assertEqual(self.columns[i].get_title(), "Last Started")
|
||||||
self.assertEqual(self.columns[i].get_fixed_width(), 250)
|
self.assertEqual(self.columns[i].get_fixed_width(), 250)
|
||||||
|
@ -253,7 +269,7 @@ class TestTrackViewColumns(tests.util.TestCase):
|
||||||
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
||||||
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
|
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
|
||||||
|
|
||||||
def test_last_played_column(self, i: int = 10):
|
def test_last_played_column(self, i: int = 11):
|
||||||
"""Test the last played column."""
|
"""Test the last played column."""
|
||||||
self.assertEqual(self.columns[i].get_title(), "Last Played")
|
self.assertEqual(self.columns[i].get_title(), "Last Played")
|
||||||
self.assertEqual(self.columns[i].get_fixed_width(), 250)
|
self.assertEqual(self.columns[i].get_fixed_width(), 250)
|
||||||
|
@ -270,7 +286,7 @@ class TestTrackViewColumns(tests.util.TestCase):
|
||||||
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
self.assertEqual(self.listitem.listrow.child.get_xalign(), 0.0)
|
||||||
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
|
self.assertTrue(self.listitem.listrow.child.has_css_class("numeric"))
|
||||||
|
|
||||||
def test_filepath_column(self, i: int = 11):
|
def test_filepath_column(self, i: int = 12):
|
||||||
"""Test the last played column."""
|
"""Test the last played column."""
|
||||||
self.assertEqual(self.columns[i].get_title(), "Filepath")
|
self.assertEqual(self.columns[i].get_title(), "Filepath")
|
||||||
self.assertEqual(self.columns[i].get_fixed_width(), -1)
|
self.assertEqual(self.columns[i].get_fixed_width(), -1)
|
||||||
|
|
Loading…
Reference in New Issue