[libadwaita/wip/exalm/pref-window: 19/19] preferences-window: Bind search model lazily




commit a3f5365e36081fcf36782947cc6e6ff757ee4536
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Mon Mar 29 15:04:21 2021 +0500

    preferences-window: Bind search model lazily
    
    The row state depends on the number of pages in the window, and we weren't
    updating the rows if it changes.
    
    While we can notify all rows when it happens, a much easier and more
    efficient way is to instead bind the model lazily when we start search.
    Additionally, we can unbind it when it ends so we don't keep the rows
    around when not needed.

 src/adw-preferences-window.c  | 28 ++++++++++++++++++++++------
 src/adw-preferences-window.ui |  2 ++
 2 files changed, 24 insertions(+), 6 deletions(-)
---
diff --git a/src/adw-preferences-window.c b/src/adw-preferences-window.c
index 778d22a..9d27294 100644
--- a/src/adw-preferences-window.c
+++ b/src/adw-preferences-window.c
@@ -256,6 +256,26 @@ search_result_activated_cb (AdwPreferencesWindow *self,
   gtk_window_set_focus_visible (GTK_WINDOW (self), TRUE);
 }
 
+static void
+search_results_map (AdwPreferencesWindow *self)
+{
+  AdwPreferencesWindowPrivate *priv = adw_preferences_window_get_instance_private (self);
+
+  gtk_list_box_bind_model (priv->search_results,
+                           G_LIST_MODEL (priv->filter_model),
+                           (GtkListBoxCreateWidgetFunc) new_search_row_for_preference,
+                           self,
+                           NULL);
+}
+
+static void
+search_results_unmap (AdwPreferencesWindow *self)
+{
+  AdwPreferencesWindowPrivate *priv = adw_preferences_window_get_instance_private (self);
+
+  gtk_list_box_bind_model (priv->search_results, NULL, NULL, NULL, NULL);
+}
+
 static void
 try_remove_subpages (AdwPreferencesWindow *self)
 {
@@ -505,6 +525,8 @@ adw_preferences_window_class_init (AdwPreferencesWindowClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, search_started_cb);
   gtk_widget_class_bind_template_callback (widget_class, search_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, search_result_activated_cb);
+  gtk_widget_class_bind_template_callback (widget_class, search_results_map);
+  gtk_widget_class_bind_template_callback (widget_class, search_results_unmap);
   gtk_widget_class_bind_template_callback (widget_class, stop_search_cb);
 }
 
@@ -537,12 +559,6 @@ adw_preferences_window_init (AdwPreferencesWindow *self)
   model = G_LIST_MODEL (gtk_flatten_list_model_new (model));
   priv->filter_model = gtk_filter_list_model_new (model, priv->filter);
 
-  gtk_list_box_bind_model (priv->search_results,
-                           G_LIST_MODEL (priv->filter_model),
-                           (GtkListBoxCreateWidgetFunc) new_search_row_for_preference,
-                           self,
-                           NULL);
-
   gtk_search_entry_set_key_capture_widget (priv->search_entry, GTK_WIDGET (self));
 }
 
diff --git a/src/adw-preferences-window.ui b/src/adw-preferences-window.ui
index f7442c2..72e4a70 100644
--- a/src/adw-preferences-window.ui
+++ b/src/adw-preferences-window.ui
@@ -120,6 +120,8 @@
                                             <property name="selection-mode">none</property>
                                             <property name="valign">start</property>
                                             <signal name="row-activated" 
handler="search_result_activated_cb" swapped="yes"/>
+                                            <signal name="map" handler="search_results_map" swapped="yes"/>
+                                            <signal name="unmap" handler="search_results_unmap" 
swapped="yes"/>
                                             <style>
                                               <class name="content"/>
                                             </style>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]