From 27534800522361a2e99f7fe231aaf1dc8399e8ad Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 11 Oct 2021 15:13:59 -0400 Subject: [PATCH] lib: Create a custom filter Popover For displaying errors in the regex that the user has entered Implements: Issue #4 (Create common filtering widgets) Signed-off-by: Anna Schumaker --- lib/filter.py | 22 +++++++++++++++++++++- lib/test_filter.py | 15 +++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/filter.py b/lib/filter.py index 42f76fd..524da09 100644 --- a/lib/filter.py +++ b/lib/filter.py @@ -1,6 +1,7 @@ # Copyright 2021 (c) Anna Schumaker. import re from gi.repository import Gtk +from . import version class Regex(Gtk.Filter): def __init__(self): @@ -24,10 +25,23 @@ class Regex(Gtk.Filter): self.changed(change) +class Popover(Gtk.Popover): + def __init__(self): + Gtk.Popover.__init__(self) + self.set_child(Gtk.Label()) + self.set_autohide(False) + + def popup(self, text): + self.get_child().set_text(text) + if not version.TESTING: + super().popup() + + class Entry(Gtk.SearchEntry): def __init__(self, filter): Gtk.SearchEntry.__init__(self) self.filter = filter + self.popover = Popover() self.set_margin_top(5) self.set_margin_bottom(5) @@ -36,10 +50,16 @@ class Entry(Gtk.SearchEntry): self.set_property("placeholder-text", "Type to filter") self.connect("search-changed", self.changed) + self.popover.set_parent(self) + + def __del__(self): + self.popover.unparent() def changed(self, entry): try: self.filter.set_pattern(self.get_text()) self.remove_css_class("warning") - except: + self.popover.popdown() + except re.error as e: self.add_css_class("warning") + self.popover.popup(str(e)) diff --git a/lib/test_filter.py b/lib/test_filter.py index 53c71be..b75f5f2 100644 --- a/lib/test_filter.py +++ b/lib/test_filter.py @@ -40,18 +40,33 @@ class TestRegex(unittest.TestCase): self.assertFalse(filter.search("cde")) +class TestPopover(unittest.TestCase): + def test_init(self): + popover = lib.filter.Popover() + self.assertIsInstance(popover, Gtk.Popover) + self.assertIsInstance(popover.get_child(), Gtk.Label) + self.assertFalse(popover.get_autohide()) + + def test_popup(self): + popover = lib.filter.Popover() + popover.popup("test") + self.assertEqual(popover.get_child().get_text(), "test") + + class TestEntry(unittest.TestCase): def test_init(self): filter = lib.filter.Regex() entry = lib.filter.Entry(filter) self.assertIsInstance(entry, Gtk.SearchEntry) + self.assertIsInstance(entry.popover, lib.filter.Popover) self.assertEqual(entry.get_property("placeholder-text"), "Type to filter") self.assertEqual(entry.get_margin_top(), 5) self.assertEqual(entry.get_margin_bottom(), 5) self.assertEqual(entry.get_margin_start(), 5) self.assertEqual(entry.get_margin_end(), 5) self.assertEqual(entry.filter, filter) + self.assertEqual(entry.popover.get_parent(), entry) def test_changed(self): filter = lib.filter.Regex()