home · contact · privacy
Browser: Further refactor filtering code. master
authorChristian Heller <c.heller@plomlompom.de>
Mon, 11 Nov 2024 17:12:17 +0000 (18:12 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 11 Nov 2024 17:12:17 +0000 (18:12 +0100)
browser.py

index df219d22f7dce1275f4486eeb7f0781830bdd492..dd84621e6951a5c03b5da9a5f19b51a8bf190899 100755 (executable)
@@ -170,11 +170,11 @@ class SorterAndFilterer(GObject.GObject):
     def __init__(self, name: str) -> None:
         super().__init__()
         self.name = name
+        self.filter = ''
 
     def setup_on_bind(self,
                       widget: Gtk.Box,
                       on_filter_activate: Callable,
-                      filter_text: str,
                       vals: AttrValsByVisibility,
                       ) -> None:
         """Set up SorterAndFilterer label, values listing, filter entry."""
@@ -192,15 +192,24 @@ class SorterAndFilterer(GObject.GObject):
         self.widget.values.set_text(', '.join(vals_listed))
         self.widget.values.set_use_markup(True)
         # filter input
-        filter_buffer = self.widget.filter.get_buffer()
-        filter_buffer.set_text(filter_text, -1)
-        self.widget.filter.connect('activate', on_filter_activate)
+
+        def filter_activate() -> None:
+            self.widget.filter_input.remove_css_class('temp')
+            self.filter = self.widget.filter_input.get_buffer().get_text()
+            on_filter_activate()
+
+        filter_buffer = self.widget.filter_input.get_buffer()
+        filter_buffer.set_text(self.filter, -1)  # triggers 'temp' class set,
+        self.widget.filter_input.remove_css_class('temp')  # that's why …
+        self.widget.filter_input.connect(
+                'activate',
+                lambda _: filter_activate())
         filter_buffer.connect(
                 'inserted_text',
-                lambda a, b, c, d: self.widget.filter.add_css_class('temp'))
+                lambda a, b, c, d: self.widget.filter_input.add_css_class('temp'))
         filter_buffer.connect(
                 'deleted_text',
-                lambda a, b, c: self.widget.filter.add_css_class('temp'))
+                lambda a, b, c: self.widget.filter_input.add_css_class('temp'))
 
 
 class SorterAndFiltererOrder:
@@ -208,7 +217,6 @@ class SorterAndFiltererOrder:
 
     def __init__(self, as_list: list[SorterAndFilterer]) -> None:
         self._list = as_list
-        self.filter_inputs: FilterInputs = {}
 
     def __eq__(self, other) -> bool:
         return self._list == other._list
@@ -466,28 +474,20 @@ class GalleryConfig():
                     visible=False, max_width_chars=35,
                     wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR)
             item_widget.label = Gtk.Label(hexpand=True)
-            item_widget.filter = Gtk.Entry(placeholder_text='filter?')
+            item_widget.filter_input = Gtk.Entry(placeholder_text='filter?')
             hbox = Gtk.Box(orientation=OR_H)
             hbox.append(item_widget.label)
-            hbox.append(item_widget.filter)
+            hbox.append(item_widget.filter_input)
             item_widget.append(hbox)
             item_widget.append(item_widget.values)
             list_item.set_child(item_widget)
 
         def bind_sorter_list_item(_, list_item: SorterAndFilterer) -> None:
-
-            def on_filter_activate(entry: Gtk.Box) -> None:
-                entry.remove_css_class('temp')
-                text: str = entry.get_buffer().get_text()
-                if '' != text.rstrip():
-                    self.order.filter_inputs[sorter.name] = text
-                elif sorter.name in self.order.filter_inputs:
-                    del self.order.filter_inputs[sorter.name]
-                self._filter_inputs_changed = True
-
+            def on_filter_activate():
+                self._filter_changed = True
             sorter: SorterAndFilterer = list_item.props.item
-            sorter.setup_on_bind(list_item.props.child, on_filter_activate,
-                                 self.order.filter_inputs.get(sorter.name, ''),
+            sorter.setup_on_bind(list_item.props.child,
+                                 on_filter_activate,
                                  self._gallery_items_attrs[sorter.name])
 
         def select_sort_order(_a, _b, _c) -> None:
@@ -508,7 +508,7 @@ class GalleryConfig():
                 self.order.sync_from(self._tmp_order)
                 self._tmp_order = None
                 self._gallery_request_update(build_grid=True)
-            if self._filter_inputs_changed:
+            if self._filter_changed:
                 self._gallery_request_update(build_grid=True)
             self._gallery_update_settings(
                     per_row=self._btn_per_row.get_value_as_int(),
@@ -517,14 +517,14 @@ class GalleryConfig():
                     recurse_dirs=self._btn_recurse.get_active())
             self._gallery_request_update(select=True)
             self._set_recurse_changed = False
-            self._filter_inputs_changed = False
+            self._filter_changed = False
 
         def full_reload() -> None:
             apply_config()
             self._gallery_request_update(load=True)
             self._btn_apply.set_sensitive(True)
 
-        self._filter_inputs_changed = False
+        self._filter_changed = False
         self._set_recurse_changed = False
         self._last_selected: Optional[Gtk.Widget] = None
 
@@ -914,16 +914,16 @@ class Gallery:
                     return False
                 return True
 
-            if attr_name not in self._sort_order.filter_inputs:
-                return True
             if val is None:
                 return False
-            pattern = self._sort_order.filter_inputs[attr_name]
-            if attr_name in number_attributes:
-                if not passes_number_filter(attr_name, pattern, val):
+            for filterer in [f for f in self._sort_order
+                             if f.name == attr_name]:
+                if attr_name in number_attributes:
+                    if not passes_number_filter(attr_name, filterer.filter,
+                                                val):
+                        return False
+                elif not re_search(filterer.filter, val):
                     return False
-            elif not re_search(pattern, val):
-                return False
             return True
 
         def update_items_attrs() -> None:
@@ -934,7 +934,7 @@ class Gallery:
                 for attr_name, vals in basic_items_attrs.items():
                     items_attrs[attr_name] = {'incl': [], 'excl': []}
                     for v in vals:
-                        k = ('incl' if passes_filter(attr_name, v) else 'excl')
+                        k = 'incl' if passes_filter(attr_name, v) else 'excl'
                         items_attrs[attr_name][k] += [v]
                 return items_attrs