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:
parent
3ae543b8e7
commit
2753480052
|
@ -1,6 +1,7 @@
|
||||||
# Copyright 2021 (c) Anna Schumaker.
|
# Copyright 2021 (c) Anna Schumaker.
|
||||||
import re
|
import re
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
from . import version
|
||||||
|
|
||||||
class Regex(Gtk.Filter):
|
class Regex(Gtk.Filter):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -24,10 +25,23 @@ class Regex(Gtk.Filter):
|
||||||
self.changed(change)
|
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):
|
class Entry(Gtk.SearchEntry):
|
||||||
def __init__(self, filter):
|
def __init__(self, filter):
|
||||||
Gtk.SearchEntry.__init__(self)
|
Gtk.SearchEntry.__init__(self)
|
||||||
self.filter = filter
|
self.filter = filter
|
||||||
|
self.popover = Popover()
|
||||||
|
|
||||||
self.set_margin_top(5)
|
self.set_margin_top(5)
|
||||||
self.set_margin_bottom(5)
|
self.set_margin_bottom(5)
|
||||||
|
@ -36,10 +50,16 @@ class Entry(Gtk.SearchEntry):
|
||||||
|
|
||||||
self.set_property("placeholder-text", "Type to filter")
|
self.set_property("placeholder-text", "Type to filter")
|
||||||
self.connect("search-changed", self.changed)
|
self.connect("search-changed", self.changed)
|
||||||
|
self.popover.set_parent(self)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.popover.unparent()
|
||||||
|
|
||||||
def changed(self, entry):
|
def changed(self, entry):
|
||||||
try:
|
try:
|
||||||
self.filter.set_pattern(self.get_text())
|
self.filter.set_pattern(self.get_text())
|
||||||
self.remove_css_class("warning")
|
self.remove_css_class("warning")
|
||||||
except:
|
self.popover.popdown()
|
||||||
|
except re.error as e:
|
||||||
self.add_css_class("warning")
|
self.add_css_class("warning")
|
||||||
|
self.popover.popup(str(e))
|
||||||
|
|
|
@ -40,18 +40,33 @@ class TestRegex(unittest.TestCase):
|
||||||
self.assertFalse(filter.search("cde"))
|
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):
|
class TestEntry(unittest.TestCase):
|
||||||
def test_init(self):
|
def test_init(self):
|
||||||
filter = lib.filter.Regex()
|
filter = lib.filter.Regex()
|
||||||
entry = lib.filter.Entry(filter)
|
entry = lib.filter.Entry(filter)
|
||||||
|
|
||||||
self.assertIsInstance(entry, Gtk.SearchEntry)
|
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_property("placeholder-text"), "Type to filter")
|
||||||
self.assertEqual(entry.get_margin_top(), 5)
|
self.assertEqual(entry.get_margin_top(), 5)
|
||||||
self.assertEqual(entry.get_margin_bottom(), 5)
|
self.assertEqual(entry.get_margin_bottom(), 5)
|
||||||
self.assertEqual(entry.get_margin_start(), 5)
|
self.assertEqual(entry.get_margin_start(), 5)
|
||||||
self.assertEqual(entry.get_margin_end(), 5)
|
self.assertEqual(entry.get_margin_end(), 5)
|
||||||
self.assertEqual(entry.filter, filter)
|
self.assertEqual(entry.filter, filter)
|
||||||
|
self.assertEqual(entry.popover.get_parent(), entry)
|
||||||
|
|
||||||
def test_changed(self):
|
def test_changed(self):
|
||||||
filter = lib.filter.Regex()
|
filter = lib.filter.Regex()
|
||||||
|
|
Loading…
Reference in New Issue