Merge lp:~mterry/indicator-datetime/sort-names-and-cleanup into lp:indicator-datetime/0.3

Proposed by Michael Terry
Status: Merged
Merged at revision: 80
Proposed branch: lp:~mterry/indicator-datetime/sort-names-and-cleanup
Merge into: lp:indicator-datetime/0.3
Diff against target: 252 lines (+70/-45)
2 files modified
src/datetime-prefs-locations.c (+25/-33)
src/timezone-completion.c (+45/-12)
To merge this branch: bzr merge lp:~mterry/indicator-datetime/sort-names-and-cleanup
Reviewer Review Type Date Requested Status
Indicator Applet Developers Pending
Review via email: mp+54610@code.launchpad.net

Description of the change

This branch does two things:

1) Sort location names (and puts any string that starts with the entered text at the front)
2) Cleans up some uses of a more awkward api for tree models

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/datetime-prefs-locations.c'
2--- src/datetime-prefs-locations.c 2011-02-24 16:01:03 +0000
3+++ src/datetime-prefs-locations.c 2011-03-23 21:08:29 +0000
4@@ -35,6 +35,10 @@
5
6 #define DATETIME_DIALOG_UI_FILE PKGDATADIR "/datetime-dialog.ui"
7
8+#define COL_NAME 0
9+#define COL_TIME 1
10+#define COL_ZONE 2
11+
12 static void
13 handle_add (GtkWidget * button, GtkTreeView * tree)
14 {
15@@ -84,7 +88,7 @@
16 GtkTreeIter iter;
17
18 if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path)) {
19- gtk_list_store_set (store, &iter, 0, new_text, -1);
20+ gtk_list_store_set (store, &iter, COL_NAME, new_text, -1);
21 }
22 }
23
24@@ -92,28 +96,28 @@
25 timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model,
26 GtkTreeIter * iter, gpointer user_data)
27 {
28- GValue zone_value = {0}, name_value = {0};
29 const gchar * zone, * name;
30
31- gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_ZONE, &zone_value);
32- zone = g_value_get_string (&zone_value);
33+ gtk_tree_model_get (model, iter,
34+ TIMEZONE_COMPLETION_ZONE, &zone,
35+ TIMEZONE_COMPLETION_NAME, &name,
36+ -1);
37
38- gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_NAME, &name_value);
39- name = g_value_get_string (&name_value);
40+ g_debug("match selected: %s, %s", name, zone);
41
42 if (zone == NULL || zone[0] == 0) {
43- GValue lon_value = {0}, lat_value = {0};
44 const gchar * strlon, * strlat;
45 gdouble lon = 0.0, lat = 0.0;
46
47- gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_LONGITUDE, &lon_value);
48- strlon = g_value_get_string (&lon_value);
49+ gtk_tree_model_get (model, iter,
50+ TIMEZONE_COMPLETION_LONGITUDE, &strlon,
51+ TIMEZONE_COMPLETION_LATITUDE, &strlat,
52+ -1);
53+
54 if (strlon != NULL && strlon[0] != 0) {
55 lon = strtod(strlon, NULL);
56 }
57
58- gtk_tree_model_get_value (model, iter, TIMEZONE_COMPLETION_LATITUDE, &lat_value);
59- strlat = g_value_get_string (&lat_value);
60 if (strlat != NULL && strlat[0] != 0) {
61 lat = strtod(strlat, NULL);
62 }
63@@ -125,12 +129,9 @@
64 GtkListStore * store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (widget), "store"));
65 GtkTreeIter * store_iter = (GtkTreeIter *)g_object_get_data (G_OBJECT (widget), "store_iter");
66 if (store != NULL && store_iter != NULL) {
67- gtk_list_store_set (store, store_iter, 0, name, 2, zone, -1);
68+ gtk_list_store_set (store, store_iter, COL_NAME, name, COL_ZONE, zone, -1);
69 }
70
71- g_value_unset (&name_value);
72- g_value_unset (&zone_value);
73-
74 return FALSE; // Do normal action too
75 }
76
77@@ -169,11 +170,9 @@
78 GtkTreeIter iter;
79 if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
80 do {
81- GValue zone_value = {0};
82 const gchar * strzone;
83
84- gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter, 2, &zone_value);
85- strzone = g_value_get_string (&zone_value);
86+ gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_ZONE, &strzone, -1);
87
88 if (strzone != NULL && strzone[0] != 0) {
89 GTimeZone * tz = g_time_zone_new (strzone);
90@@ -181,15 +180,13 @@
91 gchar * format = generate_format_string_at_time (now_tz);
92 gchar * time_str = g_date_time_format (now_tz, format);
93
94- gtk_list_store_set (store, &iter, 1, time_str, -1);
95+ gtk_list_store_set (store, &iter, COL_TIME, time_str, -1);
96
97 g_free (time_str);
98 g_free (format);
99 g_date_time_unref (now_tz);
100 g_time_zone_unref (tz);
101 }
102-
103- g_value_unset (&zone_value);
104 } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
105 }
106
107@@ -211,7 +208,7 @@
108 split_settings_location (*striter, &zone, &name);
109
110 gtk_list_store_append (GTK_LIST_STORE (store), &iter);
111- gtk_list_store_set (GTK_LIST_STORE (store), &iter, 0, name, 2, zone, -1);
112+ gtk_list_store_set (GTK_LIST_STORE (store), &iter, COL_NAME, name, COL_ZONE, zone, -1);
113
114 g_free (zone);
115 g_free (name);
116@@ -234,23 +231,18 @@
117 GtkTreeIter iter;
118 if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
119 do {
120- GValue zone_value = {0}, name_value = {0};
121 const gchar * strzone, * strname;
122
123- gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter, 0, &name_value);
124- gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter, 2, &zone_value);
125-
126- strzone = g_value_get_string (&zone_value);
127- strname = g_value_get_string (&name_value);
128+ gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
129+ COL_NAME, &strname,
130+ COL_ZONE, &strzone,
131+ -1);
132
133 if (strzone != NULL && strzone[0] != 0 && strname != NULL && strname[0] != 0) {
134 gchar * settings_string = g_strdup_printf("%s %s", strzone, strname);
135 g_variant_builder_add (&builder, "s", settings_string);
136 g_free (settings_string);
137 }
138-
139- g_value_unset (&zone_value);
140- g_value_unset (&name_value);
141 } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
142 }
143
144@@ -304,7 +296,7 @@
145 g_signal_connect (cell, "edited", G_CALLBACK (handle_edit), store);
146 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1,
147 _("Location"), cell,
148- "text", 0, NULL);
149+ "text", COL_NAME, NULL);
150 GtkTreeViewColumn * loc_col = gtk_tree_view_get_column (GTK_TREE_VIEW (tree), 0);
151 gtk_tree_view_column_set_expand (loc_col, TRUE);
152 g_object_set_data (G_OBJECT (completion), "name-cell", cell);
153@@ -312,7 +304,7 @@
154 cell = gtk_cell_renderer_text_new ();
155 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1,
156 _("Time"), cell,
157- "text", 1, NULL);
158+ "text", COL_TIME, NULL);
159
160 GtkTreeSelection * selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
161 gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
162
163=== modified file 'src/timezone-completion.c'
164--- src/timezone-completion.c 2011-03-23 15:58:50 +0000
165+++ src/timezone-completion.c 2011-03-23 21:08:29 +0000
166@@ -87,6 +87,39 @@
167 g_signal_emit_by_name (priv->entry, "changed");
168 }
169
170+static gint
171+sort_zone (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,
172+ gpointer user_data)
173+{
174+ /* Anything that has text as a prefix goes first, in mostly sorted order.
175+ Then everything else goes after, in mostly sorted order. */
176+ const gchar *casefolded_text = (const gchar *)user_data;
177+
178+ const gchar *namea = NULL, *nameb = NULL;
179+ gtk_tree_model_get (model, a, TIMEZONE_COMPLETION_NAME, &namea, -1);
180+ gtk_tree_model_get (model, b, TIMEZONE_COMPLETION_NAME, &nameb, -1);
181+
182+ gchar *casefolded_namea = NULL, *casefolded_nameb = NULL;
183+ casefolded_namea = g_utf8_casefold (namea, -1);
184+ casefolded_nameb = g_utf8_casefold (nameb, -1);
185+
186+ gboolean amatches = FALSE, bmatches = FALSE;
187+ amatches = strncmp (casefolded_text, casefolded_namea, strlen(casefolded_text)) == 0;
188+ bmatches = strncmp (casefolded_text, casefolded_nameb, strlen(casefolded_text)) == 0;
189+
190+ gint rv;
191+ if (amatches && !bmatches)
192+ rv = -1;
193+ else if (bmatches && !amatches)
194+ rv = 1;
195+ else
196+ rv = g_utf8_collate (casefolded_namea, casefolded_nameb);
197+
198+ g_free (casefolded_namea);
199+ g_free (casefolded_nameb);
200+ return rv;
201+}
202+
203 static void
204 json_parse_ready (GObject *object, GAsyncResult *res, gpointer user_data)
205 {
206@@ -179,6 +212,13 @@
207 TIMEZONE_COMPLETION_LONGITUDE, longitude,
208 TIMEZONE_COMPLETION_LATITUDE, latitude,
209 -1);
210+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (store),
211+ TIMEZONE_COMPLETION_NAME, sort_zone,
212+ g_utf8_casefold(priv->request_text, -1),
213+ g_free);
214+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
215+ TIMEZONE_COMPLETION_NAME,
216+ GTK_SORT_ASCENDING);
217 }
218
219 prev_name = name;
220@@ -340,16 +380,13 @@
221 data_func (GtkCellLayout *cell_layout, GtkCellRenderer *cell,
222 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
223 {
224- GValue name_val = {0}, admin1_val = {0}, country_val = {0};
225 const gchar * name, * admin1, * country;
226
227- gtk_tree_model_get_value (GTK_TREE_MODEL (tree_model), iter, TIMEZONE_COMPLETION_NAME, &name_val);
228- gtk_tree_model_get_value (GTK_TREE_MODEL (tree_model), iter, TIMEZONE_COMPLETION_ADMIN1, &admin1_val);
229- gtk_tree_model_get_value (GTK_TREE_MODEL (tree_model), iter, TIMEZONE_COMPLETION_COUNTRY, &country_val);
230-
231- name = g_value_get_string (&name_val);
232- admin1 = g_value_get_string (&admin1_val);
233- country = g_value_get_string (&country_val);
234+ gtk_tree_model_get (GTK_TREE_MODEL (tree_model), iter,
235+ TIMEZONE_COMPLETION_NAME, &name,
236+ TIMEZONE_COMPLETION_ADMIN1, &admin1,
237+ TIMEZONE_COMPLETION_COUNTRY, &country,
238+ -1);
239
240 gchar * user_name;
241 if (admin1 == NULL || admin1[0] == 0) {
242@@ -359,10 +396,6 @@
243 }
244
245 g_object_set (G_OBJECT (cell), "markup", user_name, NULL);
246-
247- g_value_unset (&name_val);
248- g_value_unset (&admin1_val);
249- g_value_unset (&country_val);
250 }
251
252 static void

Subscribers

People subscribed via source and target branches