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:
parent
318b2564ce
commit
c899c15c42
|
@ -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])
|
||||
|
|
|
@ -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)
|
|
@ -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}")
|
|
@ -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."""
|
||||
|
|
Loading…
Reference in New Issue