nowplaying: Create an Autopause Button

This is a PopoverButton that has an autopause.Entry set as the child. I
also override the displayed icon to show the current autopause count.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2022-09-26 16:48:35 -04:00
parent 7cd77d3aed
commit bf8d7fac1b
2 changed files with 74 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import re
from gi.repository import GObject from gi.repository import GObject
from gi.repository import GLib from gi.repository import GLib
from gi.repository import Gtk from gi.repository import Gtk
from .. import buttons
class Entry(Gtk.Entry): class Entry(Gtk.Entry):
@ -87,3 +88,29 @@ class Entry(Gtk.Entry):
self.value > -1) self.value > -1)
self.set_icon_sensitive(Gtk.EntryIconPosition.SECONDARY, self.set_icon_sensitive(Gtk.EntryIconPosition.SECONDARY,
self.value < 99) self.value < 99)
class Button(buttons.PopoverButton):
"""A PopoverButton that displays Autopause count."""
value = GObject.Property(type=int, default=-1, minimum=-1, maximum=99)
def __init__(self, **kwargs):
"""Initialize an Autopause Button."""
super().__init__(popover_child=Entry(), **kwargs)
self._arrow = Gtk.Image(icon_name="pan-down-symbolic", margin_top=6)
self._count = Gtk.Label(yalign=0, halign=Gtk.Align.CENTER,
margin_top=3)
self._overlay = Gtk.Overlay(child=self._arrow)
self._overlay.add_overlay(self._count)
self.bind_property("value", self.popover_child, "value",
GObject.BindingFlags.BIDIRECTIONAL)
self.connect("notify::value", self.__notify_value)
self._count.set_markup("<small></small>")
self.set_child(self._overlay)
def __notify_value(self, button: buttons.PopoverButton, param) -> None:
text = str(self.value) if self.value > -1 else ""
self._count.set_markup(f"<small>{text}</small>")

View File

@ -146,3 +146,50 @@ class TestAutopauseEntry(unittest.TestCase):
self.entry.set_text(text) self.entry.set_text(text)
self.entry.emit("activate") self.entry.emit("activate")
self.assertEqual(self.entry.value, value, f"text=\"{text}\"") self.assertEqual(self.entry.value, value, f"text=\"{text}\"")
class TestAutopauseButton(unittest.TestCase):
"""Test our Autopause Popover Button."""
def setUp(self):
"""Set up common variables."""
self.button = emmental.nowplaying.autopause.Button()
def test_init(self):
"""Test the autopause button."""
self.assertIsInstance(self.button, emmental.buttons.PopoverButton)
self.assertIsInstance(self.button._overlay, Gtk.Overlay)
self.assertIsInstance(self.button.popover_child,
emmental.nowplaying.autopause.Entry)
self.assertEqual(self.button.get_child(), self.button._overlay)
def test_arrow(self):
"""Test that the arrow image was set up properly."""
self.assertIsInstance(self.button._arrow, Gtk.Image)
self.assertEqual(self.button._arrow.get_icon_name(),
"pan-down-symbolic")
self.assertEqual(self.button._arrow.get_margin_top(), 6)
self.assertEqual(self.button._overlay.get_child(), self.button._arrow)
def test_count(self):
"""Test that the count label was set up properly."""
self.assertIsInstance(self.button._count, Gtk.Label)
self.assertEqual(self.button._count.get_yalign(), 0)
self.assertEqual(self.button._count.get_halign(), Gtk.Align.CENTER)
self.assertEqual(self.button._count.get_margin_top(), 3)
self.assertEqual(self.button._count.get_text(), "")
def test_value(self):
"""Test the value property."""
self.assertEqual(self.button.value, -1)
self.button.value = 0
self.assertEqual(self.button.popover_child.value, 0)
self.assertEqual(self.button._count.get_text(), "0")
self.button.popover_child.value = 1
self.assertEqual(self.button.value, 1)
self.assertEqual(self.button._count.get_text(), "1")
self.button.value = -1
self.assertEqual(self.button._count.get_text(), "")