# Python imports # Lib imports import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports class QuerySelectorList(Gtk.Box): def __init__(self): super(QuerySelectorList, self).__init__() self._setup_styling() self._setup_signals() def _setup_styling(self): self.set_orientation(1) def _setup_signals(self): ... class QueryController(Gtk.Popover): def __init__(self): super(QueryController, self).__init__() self._query_selector_list = QuerySelectorList() self.queryable_widgets = [] self._setup_styling() self._setup_signals() self._subscribe_to_events() self._load_widgets() def _setup_styling(self): self.set_position(3) self.set_size_request(256, 480) def _setup_signals(self): ... def _subscribe_to_events(self): event_system.subscribe("register_to_query_controller", self._register_to_query_controller) event_system.subscribe("handle_search_query", self._handle_search_query) def _load_widgets(self): scroll_win = Gtk.ScrolledWindow() viewport = Gtk.Viewport() viewport.add(self._query_selector_list) scroll_win.add(viewport) self.add(scroll_win) scroll_win.show_all() def _register_to_query_controller(self, widget, provider): self.queryable_widgets.append([widget, provider]) def _handle_search_query(self, widget, query): self.set_relative_to(widget) self.clear_children(self._query_selector_list) for _widget, collector in self.queryable_widgets: if query.lower() in collector().lower(): path = self.get_path_names(_widget) button = Gtk.Button(label=path) button.connect("button-release-event", self._focus_widget, _widget) self._query_selector_list.add(button) self._query_selector_list.show_all() self.show() def _focus_widget(self, widget = None, eve = None, target_widget = None): target_widget.show() target_widget.grab_focus() def clear_children(self, widget: type) -> None: for child in widget.get_children(): widget.remove(child) def get_path_names(self, widget): i = 0 while i < 15: i += 1 if "page_widget.Page" in str(widget.__class__): return f"{widget.get_parent().get_parent()._name} > {widget._name}" else: widget = widget.get_parent() return None