playlist: Create a SortRow

To collect all the widgets used for a single row of sorting and emit
signals when they are interacted with.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-11-10 11:48:58 -05:00
parent 5d4ad35131
commit 8adfb51082
2 changed files with 112 additions and 0 deletions

View File

@ -69,3 +69,48 @@ class FieldLabel(Gtk.Label):
"Play Count" : "tracks.playcount",
"Last Played" : "tracks.lastplayed",
"Order Added" : "playlist_map.rowid"}.get(text, text)
class SortRow(Gtk.Box):
def __init__(self):
Gtk.Box.__init__(self, spacing=5)
self.switch = Gtk.Switch(valign=Gtk.Align.CENTER)
self.label = FieldLabel()
self.direction = DirectionButton()
self.updown = UpDownBox()
self.append(self.switch)
self.append(self.label)
self.append(self.direction)
self.append(self.updown)
self.switch.connect("notify::active", self.switch_active)
self.direction.connect("clicked", self.reverse)
self.updown.connect("move-up", self.moved_up)
self.updown.connect("move-down", self.moved_down)
def set_item(self, text, index, n_active):
(field, direction) = text.split()
self.switch.set_active(index < n_active)
self.switch.set_sensitive("rowid" not in field)
self.label.set_field(field, index < n_active)
self.direction.set_direction(direction, index < n_active)
self.updown.set_active(index < n_active, index == 0,
index == n_active - 1)
def switch_active(self, switch, param): self.emit("switched", switch.get_active())
def reverse(self, button): self.emit("reversed")
def moved_up(self, button): self.emit("move-up")
def moved_down(self, button): self.emit("move-down")
@GObject.Signal(arg_types=(bool,))
def switched(self, switch): pass
@GObject.Signal
def reversed(self): pass
@GObject.Signal
def move_up(self): pass
@GObject.Signal
def move_down(self): pass

View File

@ -127,3 +127,70 @@ class TestFieldLabel(unittest.TestCase):
self.assertEqual(label.get_text(), "Order Added")
self.assertEqual(label.get_field(), "playlist_map.rowid")
self.assertFalse(label.get_sensitive())
class TestSortRow(unittest.TestCase):
def on_switched(self, row, enabled):
self.enabled = enabled
def on_reversed(self, row):
self.reversed = True
def on_move_up(self, row):
self.move_up = True
def on_move_down(self, row):
self.move_down = True
def test_init(self):
row = sort.SortRow()
self.assertIsInstance(row, Gtk.Box)
self.assertIsInstance(row.switch, Gtk.Switch)
self.assertIsInstance(row.label, sort.FieldLabel)
self.assertIsInstance(row.direction, sort.DirectionButton)
self.assertIsInstance(row.updown, sort.UpDownBox)
self.assertEqual(row.get_spacing(), 5)
self.assertEqual(row.switch.get_valign(), Gtk.Align.CENTER)
self.assertEqual(row.get_first_child(), row.switch)
self.assertEqual(row.switch.get_next_sibling(), row.label)
self.assertEqual(row.label.get_next_sibling(), row.direction)
self.assertEqual(row.direction.get_next_sibling(), row.updown)
def test_set_item(self):
row = sort.SortRow()
row.set_item("tracks.number ASC", 0, 3)
self.assertTrue(row.switch.get_active())
self.assertTrue(row.switch.get_sensitive())
self.assertEqual(row.label.get_field(), "tracks.number")
self.assertTrue(row.label.get_sensitive())
self.assertEqual(row.direction.get_icon_name(), "view-sort-ascending")
self.assertTrue(row.direction.get_sensitive())
self.assertFalse(row.updown.get_first_child().get_sensitive())
self.assertTrue(row.updown.get_last_child().get_sensitive())
row.set_item("playlist_map.rowid ASC", 1, 2)
self.assertTrue(row.switch.get_active())
self.assertFalse(row.switch.get_sensitive())
def test_signals(self):
row = sort.SortRow()
row.connect("switched", self.on_switched)
row.connect("reversed", self.on_reversed)
row.connect("move-up", self.on_move_up)
row.connect("move-down", self.on_move_down)
row.switch.set_active(True)
self.assertTrue(self.enabled)
row.switch.set_active(False)
self.assertFalse(self.enabled)
row.direction.emit("clicked")
self.assertTrue(self.reversed)
row.updown.emit("move-up")
self.assertTrue(self.move_up)
row.updown.emit("move-down")
self.assertTrue(self.move_down)