# Copyright 2021 (c) Anna Schumaker. import re from gi.repository import Gtk from . import version class Regex(Gtk.Filter): def __init__(self): Gtk.Filter.__init__(self) self.pattern = re.compile("") def do_match(self, item): raise NotImplementedError def search(self, text): return self.pattern.search(text) != None def set_pattern(self, pattern): change = Gtk.FilterChange.DIFFERENT if pattern in self.pattern.pattern: change = Gtk.FilterChange.LESS_STRICT elif self.pattern.pattern in pattern: change = Gtk.FilterChange.MORE_STRICT self.pattern = re.compile(pattern, re.I) 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) self.set_margin_start(5) self.set_margin_end(5) 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") self.popover.popdown() except re.error as e: self.add_css_class("warning") self.popover.popup(str(e))