From cd4caf7df82d4d14d14e4196bb7ecc51df7ca2fc Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sat, 6 Aug 2022 08:33:46 -0400 Subject: [PATCH] sidebar: Create row Title widgets This widget displays a title and subtitle line, with some added styling. Signed-off-by: Anna Schumaker --- emmental/sidebar/title.py | 33 +++++++++++++++++++ tests/sidebar/test_title.py | 64 +++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 emmental/sidebar/title.py create mode 100644 tests/sidebar/test_title.py diff --git a/emmental/sidebar/title.py b/emmental/sidebar/title.py new file mode 100644 index 0000000..4cb25ec --- /dev/null +++ b/emmental/sidebar/title.py @@ -0,0 +1,33 @@ +# Copyright 2022 (c) Anna Schumaker. +"""Helper widgets for sidebar rows titles.""" +from gi.repository import GObject +from gi.repository import Pango +from gi.repository import Gtk + + +class Title(Gtk.Box): + """Row Title and Subtitle.""" + + title = GObject.Property(type=str) + subtitle = GObject.Property(type=str) + + def __init__(self, title: str = "", subtitle: str = "", **kwargs): + """Initialize a row Title widget.""" + super().__init__(orientation=Gtk.Orientation.VERTICAL, + title=title, subtitle=subtitle, tooltip_text=title, + hexpand=True, valign=Gtk.Align.CENTER, + margin_top=6, margin_bottom=6, **kwargs) + self._title = Gtk.Label(label=self.title, xalign=0, + ellipsize=Pango.EllipsizeMode.END) + self._subtitle = Gtk.Label(label=self.subtitle, xalign=0, + ellipsize=Pango.EllipsizeMode.END) + + self._title.add_css_class("header") + self._subtitle.add_css_class("caption") + + self.bind_property("title", self, "tooltip-text") + self.bind_property("title", self._title, "label") + self.bind_property("subtitle", self._subtitle, "label") + + self.append(self._title) + self.append(self._subtitle) diff --git a/tests/sidebar/test_title.py b/tests/sidebar/test_title.py new file mode 100644 index 0000000..6744a1a --- /dev/null +++ b/tests/sidebar/test_title.py @@ -0,0 +1,64 @@ +# Copyright 2022 (c) Anna Schumaker. +"""Tests our title widgets.""" +import unittest +import emmental.sidebar.title +from gi.repository import Pango +from gi.repository import Gtk + + +class TestTitle(unittest.TestCase): + """Tests the row title widget.""" + + def setUp(self): + """Initialize common variables.""" + self.title = emmental.sidebar.title.Title() + + def test_init(self): + """Test that the row Title is set up properly.""" + self.assertIsInstance(self.title, Gtk.Box) + self.assertEqual(self.title.get_orientation(), + Gtk.Orientation.VERTICAL) + self.assertEqual(self.title.get_valign(), Gtk.Align.CENTER) + self.assertEqual(self.title.get_margin_top(), 6) + self.assertEqual(self.title.get_margin_bottom(), 6) + self.assertTrue(self.title.get_hexpand()) + + def test_title(self): + """Test the title property.""" + self.assertIsInstance(self.title._title, Gtk.Label) + self.assertEqual(self.title.title, "") + self.assertEqual(self.title.get_first_child(), self.title._title) + self.assertIsNone(self.title.get_tooltip_text()) + + self.assertEqual(self.title._title.get_text(), "") + self.assertEqual(self.title._title.get_xalign(), 0) + self.assertEqual(self.title._title.get_ellipsize(), + Pango.EllipsizeMode.END) + self.assertTrue(self.title._title.has_css_class("header")) + + self.title.title = "Test Title" + self.assertEqual(self.title._title.get_text(), "Test Title") + self.assertEqual(self.title.get_tooltip_text(), "Test Title") + + title2 = emmental.sidebar.title.Title(title="Other Title") + self.assertEqual(title2._title.get_text(), "Other Title") + self.assertEqual(title2.get_tooltip_text(), "Other Title") + + def test_subtitle(self): + """Test the subtitle property.""" + self.assertIsInstance(self.title._subtitle, Gtk.Label) + self.assertEqual(self.title.subtitle, "") + self.assertEqual(self.title._title.get_next_sibling(), + self.title._subtitle) + + self.assertEqual(self.title._subtitle.get_text(), "") + self.assertEqual(self.title._subtitle.get_xalign(), 0) + self.assertEqual(self.title._subtitle.get_ellipsize(), + Pango.EllipsizeMode.END) + self.assertTrue(self.title._subtitle.has_css_class("caption")) + + self.title.subtitle = "Test Subtitle" + self.assertEqual(self.title._subtitle.get_text(), "Test Subtitle") + + title2 = emmental.sidebar.title.Title(subtitle="Other Subtitle") + self.assertEqual(title2._subtitle.get_text(), "Other Subtitle")