From c899c15c4262b009dc1e82cfa172b6a74b869536 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 27 Jun 2022 12:57:47 -0400 Subject: [PATCH] nowplaying: Create a custom Label for displaying tags This Label supports setting a prefix that is applied to the displayed string and setting a font size in pixels. Signed-off-by: Anna Schumaker --- emmental/gsetup.py | 4 +++ emmental/nowplaying/label.py | 36 ++++++++++++++++++++ tests/nowplaying/test_label.py | 62 ++++++++++++++++++++++++++++++++++ tests/test_gsetup.py | 1 + 4 files changed, 103 insertions(+) create mode 100644 emmental/nowplaying/label.py create mode 100644 tests/nowplaying/test_label.py diff --git a/emmental/gsetup.py b/emmental/gsetup.py index c90b26e..f672ad6 100644 --- a/emmental/gsetup.py +++ b/emmental/gsetup.py @@ -6,6 +6,7 @@ import sqlite3 import gi import xdg.BaseDirectory +gi.require_version("Pango", "1.0") gi.require_version("Gdk", "4.0") gi.require_version("Gtk", "4.0") gi.require_version("Adw", "1") @@ -56,6 +57,9 @@ def print_versions(): __print_version("GStreamer", gi.repository.Gst.version().major, gi.repository.Gst.version().minor, gi.repository.Gst.version().micro) + __print_version("Pango", gi.repository.Pango.VERSION_MAJOR, + gi.repository.Pango.VERSION_MINOR, + gi.repository.Pango.VERSION_MICRO) __print_version("SQLite", sqlite3.sqlite_version_info[0], sqlite3.sqlite_version_info[1], sqlite3.sqlite_version_info[2]) diff --git a/emmental/nowplaying/label.py b/emmental/nowplaying/label.py new file mode 100644 index 0000000..31a961d --- /dev/null +++ b/emmental/nowplaying/label.py @@ -0,0 +1,36 @@ +# Copyright 2022 (c) Anna Schumaker. +"""A Gtk.Label set up for displaying nowplaying tags.""" +from gi.repository import GObject +from gi.repository import Gtk +from gi.repository import Pango + + +class Label(Gtk.Label): + """A Gtk.Label wrapped in a ScrolledWindow for displaying tags.""" + + prefix = GObject.Property(type=str) + size = GObject.Property(type=int) + + def __init__(self, prefix="", **kwargs): + """Initialize our Label.""" + super().__init__(prefix=prefix, xalign=0, **kwargs) + self.connect("notify::size", self.__set_size) + + @GObject.Property(type=str) + def text(self) -> str: + """Get the text set to the label (without any prefix).""" + return self.get_text()[len(self.prefix):] + + @text.setter + def text(self, text: str) -> None: + """Set text to the label (adding any prefix).""" + text = f"{self.prefix}{text}" if text else "" + self.set_text(text) + + def __set_size(self, label: Gtk.Label, param) -> None: + # Note that we have to create a new Pango.AttrList here because + # Gtk.Label.get_attributes() returns a COPY of the AttrList, so + # any modifications won't take effect. + attrlist = Pango.AttrList.new() + attrlist.insert(Pango.attr_size_new_absolute(self.size * Pango.SCALE)) + self.set_attributes(attrlist) diff --git a/tests/nowplaying/test_label.py b/tests/nowplaying/test_label.py new file mode 100644 index 0000000..4b3fcd2 --- /dev/null +++ b/tests/nowplaying/test_label.py @@ -0,0 +1,62 @@ +# Copyright 2022 (c) Anna Schumaker. +"""Tests our modified Gtk.Label.""" +import unittest +import emmental.nowplaying.label +from gi.repository import GLib +from gi.repository import Gtk +from gi.repository import Pango + + +class TestLabel(unittest.TestCase): + """Test case for our custom Label.""" + + def setUp(self, prefix=""): + """Set up common variables.""" + self.label = emmental.nowplaying.label.Label(prefix=prefix) + + def test_init(self): + """Test that the label is configured correctly.""" + self.assertIsInstance(self.label, Gtk.Label) + + self.assertIsNone(self.label.get_attributes()) + self.assertEqual(self.label.get_xalign(), 0) + + label = emmental.nowplaying.label.Label(visible=False) + self.assertFalse(label.get_visible()) + + def test_set_text(self): + """Test setting label text.""" + self.assertEqual(self.label.text, "") + self.assertEqual(self.label.get_text(), "") + + for text in ["Test Text", ""]: + with self.subTest(text=text): + self.label.text = text + self.assertEqual(self.label.text, text) + self.assertEqual(self.label.get_text(), text) + + def test_prefix(self): + """Test the prefix property.""" + self.setUp(prefix="Prefix ") + self.assertEqual(self.label.prefix, "Prefix ") + + self.assertEqual(self.label.text, "") + self.assertEqual(self.label.get_text(), "") + + for text in ["Test Text", ""]: + with self.subTest(text=text): + self.label.text = text + self.assertEqual(self.label.text, text) + self.assertEqual(self.label.get_text(), + "Prefix Test Text" if len(text) else "") + + def test_size(self): + """Test the size property.""" + self.assertEqual(self.label.size, 0) + expected = f"0 {GLib.MAXUINT} absolute-size" + + for size in [42, 20]: + with self.subTest(size=size): + self.label.size = size + self.assertEqual(self.label.get_attributes().to_string(), + f"{expected} {size * Pango.SCALE}") diff --git a/tests/test_gsetup.py b/tests/test_gsetup.py index 14aa3a5..e713e65 100644 --- a/tests/test_gsetup.py +++ b/tests/test_gsetup.py @@ -15,6 +15,7 @@ class TestGSetup(unittest.TestCase): self.assertEqual(gi.get_required_version("Gtk"), "4.0") self.assertEqual(gi.get_required_version("Adw"), "1") self.assertEqual(gi.get_required_version("Gst"), "1.0") + self.assertEqual(gi.get_required_version("Pango"), "1.0") def test_adw(self): """Check that libadwaita style has been set."""