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:
Anna Schumaker 2022-10-19 13:29:06 -04:00
parent 97bf9d48db
commit 61dfc2a586
5 changed files with 93 additions and 7 deletions

View File

@ -240,6 +240,50 @@ class AlbumString(InscriptionRow):
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):
"""A Track Row to display Album art."""

View File

@ -37,6 +37,7 @@ class TrackView(Gtk.Frame):
self.__append_column("Length", "length", row.LengthString,
xalign=1.0, numeric=True)
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,
width=250, visible=False)
self.__append_column("Release", "release", row.AlbumString,

View File

@ -127,6 +127,7 @@ class TestSettings(unittest.TestCase):
self.assertEqual(self.settings["tracklist.title.size"], 300)
self.assertEqual(self.settings["tracklist.length.size"], -1)
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.release.size"], 115)
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.length.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.release.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.length.visible"])
self.assertTrue(self.settings["tracklist.artist.visible"])
self.assertTrue(self.settings["tracklist.album.visible"])
self.assertFalse(self.settings["tracklist.album-artist.visible"])
self.assertTrue(self.settings["tracklist.release.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.length.visible"])
self.assertFalse(self.settings["tracklist.artist.visible"])
self.assertFalse(self.settings["tracklist.album.visible"])
self.assertTrue(self.settings["tracklist.album-artist.visible"])
self.assertFalse(self.settings["tracklist.release.visible"])
self.assertFalse(self.settings["tracklist.play-count.visible"])

View File

@ -23,7 +23,7 @@ class TestTrackRowWidgets(tests.util.TestCase):
self.library = self.sql.libraries.create(pathlib.Path("/a/b"))
self.album = self.sql.albums.create("Test Album", "Artist", "2023",
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.track = self.sql.tracks.create(self.library,
pathlib.Path("/a/b/1.ogg"),
@ -170,6 +170,27 @@ class TestTrackRowWidgets(tests.util.TestCase):
row.unbind()
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):
"""Test the Album Cover widget."""
self.assertDictEqual(emmental.tracklist.row.AlbumCover.Cache, {})

View File

@ -187,7 +187,23 @@ class TestTrackViewColumns(tests.util.TestCase):
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 = 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."""
self.assertEqual(self.columns[i].get_title(), "Album Artist")
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.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."""
self.assertEqual(self.columns[i].get_title(), "Release")
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.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."""
self.assertEqual(self.columns[i].get_title(), "Play Count")
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.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."""
self.assertEqual(self.columns[i].get_title(), "Last Started")
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.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."""
self.assertEqual(self.columns[i].get_title(), "Last Played")
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.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."""
self.assertEqual(self.columns[i].get_title(), "Filepath")
self.assertEqual(self.columns[i].get_fixed_width(), -1)