[gnome-contacts] ContactList: use a SimpleQuery for the search filter.



commit e4b39a6ffca43ca022c1f90ddc3b28c8cae2205c
Author: Niels De Graef <nielsdegraef gmail com>
Date:   Sun Jan 21 14:08:52 2018 +0100

    ContactList: use a SimpleQuery for the search filter.
    
    This also lets us remove a lot of code where the filtered-status of a
    contact was saved (which led to more memory usage). So hurray for less
    bloat and less memory usage!

 src/contacts-contact-list.vala |   56 ++++++++--------------------------------
 src/contacts-contact.vala      |   45 --------------------------------
 src/contacts-list-pane.vala    |   19 +++++++------
 3 files changed, 21 insertions(+), 99 deletions(-)
---
diff --git a/src/contacts-contact-list.vala b/src/contacts-contact-list.vala
index cee21f2..3e59e33 100644
--- a/src/contacts-contact-list.vala
+++ b/src/contacts-contact-list.vala
@@ -34,7 +34,6 @@ public class Contacts.ContactList : ListBox {
     public CheckButton selector_button;
     // Whether the selector should always be visible (or only on hover)
     private bool checkbox_exposed = false;
-    public bool filtered;
 
     public ContactDataRow(Contact c) {
       this.contact = c;
@@ -67,9 +66,7 @@ public class Contacts.ContactList : ListBox {
       this.show_all ();
     }
 
-    public void update_data (bool filtered) {
-      this.filtered = filtered;
-
+    public void update () {
       // Update widgets
       this.label.set_text (this.contact.display_name);
       this.avatar.set_image.begin (this.contact.individual, this.contact);
@@ -100,15 +97,17 @@ public class Contacts.ContactList : ListBox {
   private Map<Contact, ContactDataRow> contacts = new HashMap<Contact, ContactDataRow> ();
   int nr_contacts_marked = 0;
 
-  string []? filter_values;
+  private Query filter_query;
 
   private Store store;
 
   public UiState state { get; set; }
 
-  public ContactList (Store store) {
+  public ContactList (Store store, Query query) {
     this.selection_mode = Gtk.SelectionMode.BROWSE;
     this.store = store;
+    this.filter_query = query;
+    this.filter_query.notify.connect (() => { invalidate_filter (); });
 
     this.notify["state"].connect ( () => { on_ui_state_changed(); });
 
@@ -121,7 +120,7 @@ public class Contacts.ContactList : ListBox {
     get_style_context ().add_class ("contacts-contact-list");
 
     set_sort_func ((a, b) => compare_data (a as ContactDataRow, b as ContactDataRow));
-    set_filter_func (filter);
+    set_filter_func (filter_row);
     set_header_func (update_header);
 
     show ();
@@ -194,48 +193,15 @@ public class Contacts.ContactList : ListBox {
     return label;
   }
 
-  public void set_filter_values (string []? values) {
-    if (filter_values == values)
-      return;
-
-    if (filter_values == null)
-      set_placeholder (null);
-    else {
-      var l = new Label (_("No results matched search"));
-      l.show ();
-      set_placeholder (l);
-    }
-    filter_values = values;
-    update_all_filtered ();
-    invalidate_filter ();
-  }
-
-  private bool calculate_filtered (Contact c) {
-    if (c.is_hidden)
-      return false;
-
-    if (filter_values == null || filter_values.length == 0)
-      return true;
-
-    return c.contains_strings (filter_values);
-  }
-
-  private void update_all_filtered () {
-    foreach (var widget in get_children ()) {
-      var row = widget as ContactDataRow;
-      row.filtered = calculate_filtered (row.contact);
-    }
-  }
-
   private void contact_changed_cb (Store store, Contact c) {
     var data = contacts.get (c);
-    data.update_data (calculate_filtered (c));
+    data.update ();
     data.changed();
   }
 
   private void contact_added_cb (Store store, Contact c) {
     var row =  new ContactDataRow(c);
-    row.update_data (calculate_filtered (c));
+    row.update ();
     row.selector_button.toggled.connect ( () => { on_row_checkbox_toggled (row); });
     row.selector_button.visible = (this.state == UiState.SELECTING);
 
@@ -274,9 +240,9 @@ public class Contacts.ContactList : ListBox {
 #endif
   }
 
-  private bool filter (ListBoxRow row) {
-    var data = row as ContactDataRow;
-    return data.filtered;
+  private bool filter_row (ListBoxRow row) {
+    var indiv = ((ContactDataRow) row).contact.individual;
+    return this.filter_query.is_match (indiv) > 0;
   }
 
   public void select_contact (Contact? contact) {
diff --git a/src/contacts-contact.vala b/src/contacts-contact.vala
index 82d2f6e..5073a68 100644
--- a/src/contacts-contact.vala
+++ b/src/contacts-contact.vala
@@ -51,8 +51,6 @@ public class Contacts.Contact : GLib.Object  {
     return false;
   }
 
-  private string filter_data;
-
   public signal void changed ();
   public signal void personas_changed ();
 
@@ -172,14 +170,6 @@ public class Contacts.Contact : GLib.Object  {
     return false;
   }
 
-  public bool contains_strings (string [] strings) {
-    foreach (string i in strings) {
-      if (! (i in filter_data))
-       return false;
-    }
-    return true;
-  }
-
   private static bool has_pref (AbstractFieldDetails details) {
     var evolution_pref = details.get_parameter_values ("x-evolution-ui-slot");
     if (evolution_pref != null && Utils.get_first (evolution_pref) == "1")
@@ -364,39 +354,6 @@ public class Contacts.Contact : GLib.Object  {
     queue_changed (false);
   }
 
-  private void update_filter_data () {
-    var builder = new StringBuilder ();
-    if (individual.alias != null) {
-      builder.append (Utils.canonicalize_for_search (individual.alias));
-      builder.append_unichar (' ');
-    }
-    if (individual.full_name != null) {
-      builder.append (Utils.canonicalize_for_search (individual.full_name));
-      builder.append_unichar (' ');
-    }
-    if (individual.nickname != null) {
-      builder.append (Utils.canonicalize_for_search (individual.nickname));
-      builder.append_unichar (' ');
-    }
-    var im_addresses = individual.im_addresses;
-    foreach (var detail in im_addresses.get_values ()) {
-      var addr = detail.value;
-      builder.append (addr.casefold ());
-      builder.append_unichar (' ');
-    }
-    var emails = individual.email_addresses;
-    foreach (var email in emails) {
-      builder.append (email.value.casefold ());
-      builder.append_unichar (' ');
-    }
-    var phone_numbers = individual.phone_numbers;
-    foreach (var phone in phone_numbers) {
-      builder.append (phone.value.casefold ());
-      builder.append_unichar (' ');
-    }
-    filter_data = builder.str;
-  }
-
   private void update () {
     foreach (var email in individual.email_addresses) {
       TypeSet.general.type_seen (email);
@@ -405,8 +362,6 @@ public class Contacts.Contact : GLib.Object  {
     foreach (var phone in individual.phone_numbers) {
       TypeSet.phone.type_seen (phone);
     }
-
-    update_filter_data ();
   }
 
   /* We claim something is "removable" if at least one persona is removable,
diff --git a/src/contacts-list-pane.vala b/src/contacts-list-pane.vala
index 59582a9..710cdd0 100644
--- a/src/contacts-list-pane.vala
+++ b/src/contacts-list-pane.vala
@@ -30,6 +30,7 @@ public class Contacts.ListPane : Frame {
 
   [GtkChild]
   public SearchEntry filter_entry;
+  private SimpleQuery filter_query;
 
   [GtkChild]
   private Button link_button;
@@ -49,11 +50,17 @@ public class Contacts.ListPane : Frame {
 
   public ListPane (Store contacts_store) {
     this.store = contacts_store;
-
     this.notify["state"].connect ( () => { on_ui_state_changed(); });
 
+    // Build the filter query
+    string[] filtered_fields = Query.MATCH_FIELDS_NAMES;
+    foreach (var field in Query.MATCH_FIELDS_ADDRESSES)
+      filtered_fields += field;
+    this.filter_query = new SimpleQuery ("", filtered_fields);
+
+
     // Load the ContactsView and connect the necessary signals
-    this.contacts_list = new ContactList (contacts_store);
+    this.contacts_list = new ContactList (contacts_store, this.filter_query);
     bind_property ("state", this.contacts_list, "state", BindingFlags.BIDIRECTIONAL | 
BindingFlags.SYNC_CREATE);
     this.contacts_list_container.add (this.contacts_list);
 
@@ -79,13 +86,7 @@ public class Contacts.ListPane : Frame {
 
   [GtkCallback]
   private void filter_entry_changed (Editable editable) {
-    if (Utils.string_is_empty (this.filter_entry.text)) {
-      this.contacts_list.set_filter_values (null);
-      return;
-    }
-
-    var str = Utils.canonicalize_for_search (this.filter_entry.text);
-    this.contacts_list.set_filter_values (str.split(" "));
+    this.filter_query.query_string = this.filter_entry.text;
   }
 
   public void select_contact (Contact? contact) {


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