dee

Merge lp:~ken-vandine/dee/collator_desc into lp:dee

Proposed by Ken VanDine
Status: Merged
Merged at revision: 283
Proposed branch: lp:~ken-vandine/dee/collator_desc
Merge into: lp:dee
Diff against target: 302 lines (+175/-6)
6 files modified
dee/dee-filters.c (+105/-0)
dee/dee-filters.h (+2/-0)
tests/test-filter-model.c (+54/-5)
vapi/dee-1.0-custom.vala (+5/-0)
vapi/dee-1.0.gi (+6/-0)
vapi/dee-1.0.vapi (+3/-1)
To merge this branch: bzr merge lp:~ken-vandine/dee/collator_desc
Reviewer Review Type Date Requested Status
Mikkel Kamstrup Erlandsen (community) Approve
Review via email: mp+66299@code.launchpad.net

Description of the change

* Added a descending version of the collator filter
* specify a free_function for Filter in the vapi

To post a comment you must log in.
Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

 review approve

Didn't test this, but looks good

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'dee/dee-filters.c'
2--- dee/dee-filters.c 2011-03-17 08:58:36 +0000
3+++ dee/dee-filters.c 2011-06-29 13:26:35 +0000
4@@ -84,6 +84,11 @@
5 DeeFilterModel *filter_model,
6 gpointer user_data);
7
8+static void _dee_filter_collator_desc_map_notify (DeeModel *orig_model,
9+ DeeModelIter *orig_iter,
10+ DeeFilterModel *filter_model,
11+ gpointer user_data);
12+
13 static void
14 _dee_filter_collator_map_func (DeeModel *orig_model,
15 DeeFilterModel *filter_model,
16@@ -109,6 +114,30 @@
17 }
18
19 static void
20+_dee_filter_collator_desc_map_func (DeeModel *orig_model,
21+ DeeFilterModel *filter_model,
22+ gpointer user_data)
23+{
24+ DeeModelIter *iter, *end;
25+ CollatorFilter *filter;
26+
27+ g_return_if_fail (user_data != NULL);
28+
29+ filter = (CollatorFilter *) user_data;
30+ filter->collation_key_tag =
31+ dee_model_register_tag (orig_model, (GDestroyNotify) g_free);
32+
33+ iter = dee_model_get_first_iter (orig_model);
34+ end = dee_model_get_last_iter (orig_model);
35+ while (iter != end)
36+ {
37+ _dee_filter_collator_desc_map_notify (orig_model, iter, filter_model, filter);
38+ iter = dee_model_next (orig_model, iter);
39+ }
40+
41+}
42+
43+static void
44 _dee_filter_collator_map_notify (DeeModel *orig_model,
45 DeeModelIter *orig_iter,
46 DeeFilterModel *filter_model,
47@@ -154,6 +183,51 @@
48 }
49
50 static void
51+_dee_filter_collator_desc_map_notify (DeeModel *orig_model,
52+ DeeModelIter *orig_iter,
53+ DeeFilterModel *filter_model,
54+ gpointer user_data)
55+{
56+ DeeModelIter *iter, *end;
57+ CollatorFilter *filter;
58+ const gchar *column_value, *test_value;
59+ gchar *collation_key;
60+
61+ g_return_if_fail (user_data != NULL);
62+ g_return_if_fail (orig_iter != NULL);
63+
64+ filter = (CollatorFilter *) user_data;
65+
66+ /* Build and set collation ley for the current row */
67+ column_value = dee_model_get_string (orig_model, orig_iter, filter->column);
68+ collation_key = g_utf8_collate_key (column_value, -1);
69+ dee_model_set_tag (orig_model, orig_iter,
70+ filter->collation_key_tag, collation_key); // steal collation_key
71+
72+ iter = dee_model_get_first_iter (DEE_MODEL (filter_model));
73+ end = dee_model_get_last_iter (DEE_MODEL (filter_model));
74+ while (iter != end)
75+ {
76+ test_value = dee_model_get_tag (orig_model, iter, filter->collation_key_tag);
77+ if (g_strcmp0 (test_value, column_value) > 0)
78+ {
79+ iter = dee_model_next (DEE_MODEL (filter_model), iter);
80+ }
81+ else
82+ {
83+ dee_filter_model_insert_iter_before (filter_model, orig_iter, iter);
84+ iter = NULL;
85+ break;
86+ }
87+ }
88+
89+ if (iter == end)
90+ {
91+ dee_filter_model_append_iter(filter_model, orig_iter);
92+ }
93+}
94+
95+static void
96 _dee_filter_key_map_func (DeeModel *orig_model,
97 DeeFilterModel *filter_model,
98 gpointer user_data)
99@@ -357,6 +431,37 @@
100 }
101
102 /**
103+ * dee_filter_new_collator_desc:
104+ * @column: The index of a column containing the strings to sort after
105+ *
106+ * Create a #DeeFilter that takes string values from a column in the model
107+ * and builds a #DeeFilterModel with the rows sorted descending according to the
108+ * collation rules of the current locale.
109+ *
110+ * Returns: (transfer full): A newly allocated #DeeFilter. Do not modify it.
111+ * Free with g_free().
112+ */
113+DeeFilter*
114+dee_filter_new_collator_desc (guint column)
115+{
116+ DeeFilter *filter;
117+ CollatorFilter *collator;
118+
119+ filter = g_new0 (DeeFilter, 1);
120+ filter->map_func = _dee_filter_collator_desc_map_func;
121+ filter->map_notify = _dee_filter_collator_desc_map_notify;
122+
123+ collator = g_new0 (CollatorFilter, 1);
124+ collator->column = column;
125+
126+ filter->destroy = (GDestroyNotify) g_free;
127+ filter->user_data =collator;
128+
129+ return filter;
130+}
131+
132+
133+/**
134 * dee_filter_new_for_key_column:
135 * @column: The index of a column containing the string key to match
136 *
137
138=== modified file 'dee/dee-filters.h'
139--- dee/dee-filters.h 2011-03-17 08:58:36 +0000
140+++ dee/dee-filters.h 2011-06-29 13:26:35 +0000
141@@ -32,6 +32,8 @@
142
143 DeeFilter* dee_filter_new_collator (guint column);
144
145+DeeFilter* dee_filter_new_collator_desc (guint column);
146+
147 DeeFilter* dee_filter_new_for_key_column (guint column, const gchar *key);
148
149 DeeFilter* dee_filter_new_for_any_column (guint column, GVariant *value);
150
151=== modified file 'tests/test-filter-model.c'
152--- tests/test-filter-model.c 2011-03-17 08:58:36 +0000
153+++ tests/test-filter-model.c 2011-06-29 13:26:35 +0000
154@@ -39,7 +39,9 @@
155 gconstpointer data);
156 static void test_discard_all_append_notify (FilterFixture *fix,
157 gconstpointer data);
158-static void test_collator (FilterFixture *fix,
159+static void test_collator_asc (FilterFixture *fix,
160+ gconstpointer data);
161+static void test_collator_desc (FilterFixture *fix,
162 gconstpointer data);
163 static void test_key (FilterFixture *fix,
164 gconstpointer data);
165@@ -62,8 +64,10 @@
166 setup, test_discard_all, teardown);
167 g_test_add (DOMAIN"/DiscardAllAppendNotify", FilterFixture, 0,
168 setup, test_discard_all_append_notify, teardown);
169- g_test_add (DOMAIN"/Collator", FilterFixture, 0,
170- setup, test_collator, teardown);
171+ g_test_add (DOMAIN"/CollatorAscending", FilterFixture, 0,
172+ setup, test_collator_asc, teardown);
173+ g_test_add (DOMAIN"/CollatorDescending", FilterFixture, 0,
174+ setup, test_collator_desc, teardown);
175 g_test_add (DOMAIN"/Key", FilterFixture, 0,
176 setup, test_key, teardown);
177 g_test_add (DOMAIN"/Any", FilterFixture, 0,
178@@ -301,9 +305,9 @@
179 g_object_unref (m);
180 }
181
182-/* Test dee_filter_new_collator() */
183+/* Test dee_filter_new_collator() ascending */
184 static void
185-test_collator (FilterFixture *fix, gconstpointer data)
186+test_collator_asc (FilterFixture *fix, gconstpointer data)
187 {
188 DeeModelIter *r0, *r1, *r2, *r3, *r4, *r5;
189 DeeFilter *collator = dee_filter_new_collator (1);
190@@ -336,12 +340,57 @@
191 /* Appending to the end of the sorted model is a special case in the code,
192 * so double check on that... */
193 dee_model_append (fix->model, 5, "Zzzz");
194+ r0 = dee_model_get_iter_at_row (m, 0);
195 r5 = dee_model_get_iter_at_row (m, 5);
196+ g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r0, 1));
197 g_assert_cmpstr ("Zzzz", ==, dee_model_get_string (m, r5, 1));
198
199 g_object_unref (m);
200 }
201
202+/* Test dee_filter_new_collator_desc() descending*/
203+static void
204+test_collator_desc (FilterFixture *fix, gconstpointer data)
205+{
206+ DeeModelIter *r0, *r1, *r2, *r3, *r4, *r5;
207+ DeeFilter *collator = dee_filter_new_collator_desc (1);
208+ DeeModel *m = dee_filter_model_new (collator, fix->model);
209+
210+ g_free (collator);
211+
212+ /* Test alphabetic sorting after initial construction */
213+ r0 = dee_model_get_iter_at_row (m, 0);
214+ r1 = dee_model_get_iter_at_row (m, 1);
215+ r2 = dee_model_get_iter_at_row (m, 2);
216+ g_assert_cmpstr ("Zero", ==, dee_model_get_string (m, r0, 1));
217+ g_assert_cmpstr ("Two", ==, dee_model_get_string (m, r1, 1));
218+ g_assert_cmpstr ("One", ==, dee_model_get_string (m, r2, 1));
219+
220+ /* Test alphabetic sorting after updates */
221+ dee_model_append (fix->model, 3, "Three");
222+ dee_model_append (fix->model, 4, "Four");
223+ r0 = dee_model_get_iter_at_row (m, 0);
224+ r1 = dee_model_get_iter_at_row (m, 1);
225+ r2 = dee_model_get_iter_at_row (m, 2);
226+ r3 = dee_model_get_iter_at_row (m, 3);
227+ r4 = dee_model_get_iter_at_row (m, 4);
228+ g_assert_cmpstr ("Zero", ==, dee_model_get_string (m, r0, 1));
229+ g_assert_cmpstr ("Two", ==, dee_model_get_string (m, r1, 1));
230+ g_assert_cmpstr ("Three", ==, dee_model_get_string (m, r2, 1));
231+ g_assert_cmpstr ("One", ==, dee_model_get_string (m, r3, 1));
232+ g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r4, 1));
233+
234+ /* Appending to the end of the sorted model is a special case in the code,
235+ * so double check on that... */
236+ dee_model_append (fix->model, 5, "Zzzz");
237+ r0 = dee_model_get_iter_at_row (m, 0);
238+ r5 = dee_model_get_iter_at_row (m, 5);
239+ g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r5, 1));
240+ g_assert_cmpstr ("Zzzz", ==, dee_model_get_string (m, r0, 1));
241+
242+ g_object_unref (m);
243+}
244+
245 static void
246 _test_orig_ordering (FilterFixture *fix,
247 DeeFilter *filter)
248
249=== modified file 'vapi/dee-1.0-custom.vala'
250--- vapi/dee-1.0-custom.vala 2010-08-11 10:41:35 +0000
251+++ vapi/dee-1.0-custom.vala 2011-06-29 13:26:35 +0000
252@@ -15,6 +15,11 @@
253 [NoAccessorMethod]
254 public unowned Filter filter { get; construct; }
255 }
256+ [Compact]
257+ [CCode (free_function = "g_free", cheader_filename = "dee.h")]
258+ public class Filter {
259+ }
260+
261
262 [CCode (cheader_filename = "dee.h")]
263 public interface ResultSet: GLib.Object
264
265=== modified file 'vapi/dee-1.0.gi'
266--- vapi/dee-1.0.gi 2011-03-17 09:00:37 +0000
267+++ vapi/dee-1.0.gi 2011-06-29 13:26:35 +0000
268@@ -82,6 +82,12 @@
269 <parameter name="column" type="guint"/>
270 </parameters>
271 </method>
272+ <method name="new_collator_desc" symbol="dee_filter_new_collator_desc">
273+ <return-type type="DeeFilter*"/>
274+ <parameters>
275+ <parameter name="column" type="guint"/>
276+ </parameters>
277+ </method>
278 <method name="new_for_any_column" symbol="dee_filter_new_for_any_column">
279 <return-type type="DeeFilter*"/>
280 <parameters>
281
282=== modified file 'vapi/dee-1.0.vapi'
283--- vapi/dee-1.0.vapi 2011-03-17 09:00:37 +0000
284+++ vapi/dee-1.0.vapi 2011-06-29 13:26:35 +0000
285@@ -31,7 +31,7 @@
286 public string primary_path { get; construct; }
287 }
288 [Compact]
289- [CCode (cheader_filename = "dee.h")]
290+ [CCode (free_function = "g_free", cheader_filename = "dee.h")]
291 public class Filter {
292 public weak GLib.DestroyNotify destroy;
293 public weak Dee.ModelMapFunc map_func;
294@@ -40,6 +40,8 @@
295 [CCode (has_construct_function = false)]
296 public Filter.collator (uint column);
297 [CCode (has_construct_function = false)]
298+ public Filter.collator_desc (uint column);
299+ [CCode (has_construct_function = false)]
300 public Filter.for_any_column (uint column, GLib.Variant value);
301 [CCode (has_construct_function = false)]
302 public Filter.for_key_column (uint column, string key);

Subscribers

People subscribed via source and target branches

to all changes: