[gnome-contacts] ContactList: use a SimpleQuery for the search filter.
- From: Niels De Graef <nielsdg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-contacts] ContactList: use a SimpleQuery for the search filter.
- Date: Sun, 21 Jan 2018 13:10:46 +0000 (UTC)
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]