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 <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-10-11 15:13:59 -04:00
parent 3ae543b8e7
commit 2753480052
2 changed files with 36 additions and 1 deletions

View File

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

View File

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