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 <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2022-06-27 12:57:47 -04:00
parent 318b2564ce
commit c899c15c42
4 changed files with 103 additions and 0 deletions

View File

@ -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])

View File

@ -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)

View File

@ -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}")

View File

@ -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."""