sidebar: Create a Section for Decades
This section shows a tree of Decade and Year playlists. I use the year-alt icon from the gnome icon-library as the section header. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
f8494cf47b
commit
3ba46db064
|
@ -0,0 +1,49 @@
|
|||
# Copyright 2022 (c) Anna Schumaker.
|
||||
"""Displays our decade and year tree."""
|
||||
from gi.repository import GObject
|
||||
from .. import db
|
||||
from . import row
|
||||
from . import section
|
||||
|
||||
|
||||
class DecadeRow(row.TreeRow):
|
||||
"""A TreeRow for setting Decade & Year icons properly."""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Initialize a GenreRow."""
|
||||
super().__init__(*args, **kwargs)
|
||||
self.child = row.Row()
|
||||
|
||||
def do_bind(self) -> None:
|
||||
"""Bind the decade and year number to the row year property."""
|
||||
super().do_bind()
|
||||
if isinstance(self.item, db.decades.Decade):
|
||||
self.bind_and_set_property("decade", "year")
|
||||
else:
|
||||
self.bind_and_set_property("year", "year")
|
||||
|
||||
|
||||
class Section(section.Section):
|
||||
"""A sidebar Section for the decade and year playlist tree."""
|
||||
|
||||
year_table = GObject.Property(type=db.years.Table)
|
||||
|
||||
def __init__(self, decade_table: db.decades.Table,
|
||||
year_table: db.years.Table):
|
||||
"""Initialize our decade & year section."""
|
||||
super().__init__(decade_table, DecadeRow, title="Decades & Years",
|
||||
subtitle="0 decades, 0 years",
|
||||
icon_name="year-alt", year_table=year_table)
|
||||
self.year_table.connect("items-changed", self.__update_subtitle)
|
||||
|
||||
def __update_subtitle(self, table: db.years.Table, position: int,
|
||||
removed: int, added: int) -> None:
|
||||
self.subtitle = self.do_get_subtitle(0)
|
||||
|
||||
def do_get_subtitle(self, n_items: int) -> str:
|
||||
"""Return a subtitle for this section."""
|
||||
n_decades = len(self.table)
|
||||
s_decades = "s" if n_decades != 1 else ""
|
||||
n_years = len(self.year_table)
|
||||
s_years = "s" if n_years != 1 else ""
|
||||
return f"{n_decades} decade{s_decades}, {n_years} year{s_years}"
|
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 13 1 v 13 h 1 v -13 z m -12 3 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m -9 3 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m -9 3 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m 3 0 v 2 h 2 v -2 z m 0 0" fill="#222222"/></svg>
|
After Width: | Height: | Size: 445 B |
|
@ -0,0 +1,63 @@
|
|||
# Copyright 2022 (c) Anna Schumaker.
|
||||
"""Tests our decade / year section and tree."""
|
||||
import emmental.sidebar.decade
|
||||
import tests.util
|
||||
import unittest.mock
|
||||
from gi.repository import Gtk
|
||||
|
||||
|
||||
class TestDecade(tests.util.TestCase):
|
||||
"""Test our Decade section."""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up common variables."""
|
||||
super().setUp()
|
||||
self.decades = emmental.sidebar.decade.Section(self.sql.decades,
|
||||
self.sql.years)
|
||||
|
||||
def test_init(self):
|
||||
"""Test that the decade section is set up correctly."""
|
||||
self.assertIsInstance(self.decades, emmental.sidebar.section.Section)
|
||||
self.assertEqual(self.decades._factory.row_type,
|
||||
emmental.sidebar.decade.DecadeRow)
|
||||
|
||||
self.assertEqual(self.decades.table, self.sql.decades)
|
||||
self.assertEqual(self.decades.year_table, self.sql.years)
|
||||
self.assertEqual(self.decades.icon_name, "year-alt")
|
||||
self.assertEqual(self.decades.title, "Decades & Years")
|
||||
|
||||
def test_subtitle(self):
|
||||
"""Test that the subtitle property is set properly."""
|
||||
self.assertEqual(self.decades.subtitle, "0 decades, 0 years")
|
||||
self.sql.decades.create(1980)
|
||||
self.assertEqual(self.decades.subtitle, "1 decade, 0 years")
|
||||
self.sql.years.create(1985)
|
||||
self.assertEqual(self.decades.subtitle, "1 decade, 1 year")
|
||||
self.sql.years.create(1988)
|
||||
self.assertEqual(self.decades.subtitle, "1 decade, 2 years")
|
||||
self.sql.decades.create(1990)
|
||||
self.assertEqual(self.decades.subtitle, "2 decades, 2 years")
|
||||
|
||||
def test_decade_row(self):
|
||||
"""Test the decaderow widget."""
|
||||
treeitem = Gtk.TreeListRow()
|
||||
treeitem.get_item = unittest.mock.Mock()
|
||||
listitem = Gtk.ListItem()
|
||||
listitem.get_item = unittest.mock.Mock(return_value=treeitem)
|
||||
|
||||
treeitem.get_item.return_value = self.sql.decades.create(1980)
|
||||
row = emmental.sidebar.decade.DecadeRow(listitem)
|
||||
self.assertIsInstance(row, emmental.sidebar.row.TreeRow)
|
||||
self.assertIsInstance(row.child, emmental.sidebar.row.Row)
|
||||
self.assertTrue(row.indented)
|
||||
|
||||
row.bind()
|
||||
self.assertEqual(row.child.name, "The 1980s")
|
||||
self.assertEqual(row.child.year, 1980)
|
||||
row.unbind()
|
||||
|
||||
treeitem.get_item.return_value = self.sql.years.create(1988)
|
||||
row.bind()
|
||||
self.assertEqual(row.child.name, "1988")
|
||||
self.assertEqual(row.child.year, 1988)
|
||||
row.unbind()
|
Loading…
Reference in New Issue