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
=== modified file 'dee/dee-filters.c'
--- dee/dee-filters.c 2011-03-17 08:58:36 +0000
+++ dee/dee-filters.c 2011-06-29 13:26:35 +0000
@@ -84,6 +84,11 @@
84 DeeFilterModel *filter_model,84 DeeFilterModel *filter_model,
85 gpointer user_data);85 gpointer user_data);
8686
87static void _dee_filter_collator_desc_map_notify (DeeModel *orig_model,
88 DeeModelIter *orig_iter,
89 DeeFilterModel *filter_model,
90 gpointer user_data);
91
87static void92static void
88_dee_filter_collator_map_func (DeeModel *orig_model,93_dee_filter_collator_map_func (DeeModel *orig_model,
89 DeeFilterModel *filter_model,94 DeeFilterModel *filter_model,
@@ -109,6 +114,30 @@
109}114}
110115
111static void116static void
117_dee_filter_collator_desc_map_func (DeeModel *orig_model,
118 DeeFilterModel *filter_model,
119 gpointer user_data)
120{
121 DeeModelIter *iter, *end;
122 CollatorFilter *filter;
123
124 g_return_if_fail (user_data != NULL);
125
126 filter = (CollatorFilter *) user_data;
127 filter->collation_key_tag =
128 dee_model_register_tag (orig_model, (GDestroyNotify) g_free);
129
130 iter = dee_model_get_first_iter (orig_model);
131 end = dee_model_get_last_iter (orig_model);
132 while (iter != end)
133 {
134 _dee_filter_collator_desc_map_notify (orig_model, iter, filter_model, filter);
135 iter = dee_model_next (orig_model, iter);
136 }
137
138}
139
140static void
112_dee_filter_collator_map_notify (DeeModel *orig_model,141_dee_filter_collator_map_notify (DeeModel *orig_model,
113 DeeModelIter *orig_iter,142 DeeModelIter *orig_iter,
114 DeeFilterModel *filter_model,143 DeeFilterModel *filter_model,
@@ -154,6 +183,51 @@
154}183}
155184
156static void185static void
186_dee_filter_collator_desc_map_notify (DeeModel *orig_model,
187 DeeModelIter *orig_iter,
188 DeeFilterModel *filter_model,
189 gpointer user_data)
190{
191 DeeModelIter *iter, *end;
192 CollatorFilter *filter;
193 const gchar *column_value, *test_value;
194 gchar *collation_key;
195
196 g_return_if_fail (user_data != NULL);
197 g_return_if_fail (orig_iter != NULL);
198
199 filter = (CollatorFilter *) user_data;
200
201 /* Build and set collation ley for the current row */
202 column_value = dee_model_get_string (orig_model, orig_iter, filter->column);
203 collation_key = g_utf8_collate_key (column_value, -1);
204 dee_model_set_tag (orig_model, orig_iter,
205 filter->collation_key_tag, collation_key); // steal collation_key
206
207 iter = dee_model_get_first_iter (DEE_MODEL (filter_model));
208 end = dee_model_get_last_iter (DEE_MODEL (filter_model));
209 while (iter != end)
210 {
211 test_value = dee_model_get_tag (orig_model, iter, filter->collation_key_tag);
212 if (g_strcmp0 (test_value, column_value) > 0)
213 {
214 iter = dee_model_next (DEE_MODEL (filter_model), iter);
215 }
216 else
217 {
218 dee_filter_model_insert_iter_before (filter_model, orig_iter, iter);
219 iter = NULL;
220 break;
221 }
222 }
223
224 if (iter == end)
225 {
226 dee_filter_model_append_iter(filter_model, orig_iter);
227 }
228}
229
230static void
157_dee_filter_key_map_func (DeeModel *orig_model,231_dee_filter_key_map_func (DeeModel *orig_model,
158 DeeFilterModel *filter_model,232 DeeFilterModel *filter_model,
159 gpointer user_data)233 gpointer user_data)
@@ -357,6 +431,37 @@
357}431}
358432
359/**433/**
434 * dee_filter_new_collator_desc:
435 * @column: The index of a column containing the strings to sort after
436 *
437 * Create a #DeeFilter that takes string values from a column in the model
438 * and builds a #DeeFilterModel with the rows sorted descending according to the
439 * collation rules of the current locale.
440 *
441 * Returns: (transfer full): A newly allocated #DeeFilter. Do not modify it.
442 * Free with g_free().
443 */
444DeeFilter*
445dee_filter_new_collator_desc (guint column)
446{
447 DeeFilter *filter;
448 CollatorFilter *collator;
449
450 filter = g_new0 (DeeFilter, 1);
451 filter->map_func = _dee_filter_collator_desc_map_func;
452 filter->map_notify = _dee_filter_collator_desc_map_notify;
453
454 collator = g_new0 (CollatorFilter, 1);
455 collator->column = column;
456
457 filter->destroy = (GDestroyNotify) g_free;
458 filter->user_data =collator;
459
460 return filter;
461}
462
463
464/**
360 * dee_filter_new_for_key_column:465 * dee_filter_new_for_key_column:
361 * @column: The index of a column containing the string key to match466 * @column: The index of a column containing the string key to match
362 *467 *
363468
=== modified file 'dee/dee-filters.h'
--- dee/dee-filters.h 2011-03-17 08:58:36 +0000
+++ dee/dee-filters.h 2011-06-29 13:26:35 +0000
@@ -32,6 +32,8 @@
3232
33DeeFilter* dee_filter_new_collator (guint column);33DeeFilter* dee_filter_new_collator (guint column);
3434
35DeeFilter* dee_filter_new_collator_desc (guint column);
36
35DeeFilter* dee_filter_new_for_key_column (guint column, const gchar *key);37DeeFilter* dee_filter_new_for_key_column (guint column, const gchar *key);
3638
37DeeFilter* dee_filter_new_for_any_column (guint column, GVariant *value);39DeeFilter* dee_filter_new_for_any_column (guint column, GVariant *value);
3840
=== modified file 'tests/test-filter-model.c'
--- tests/test-filter-model.c 2011-03-17 08:58:36 +0000
+++ tests/test-filter-model.c 2011-06-29 13:26:35 +0000
@@ -39,7 +39,9 @@
39 gconstpointer data);39 gconstpointer data);
40static void test_discard_all_append_notify (FilterFixture *fix,40static void test_discard_all_append_notify (FilterFixture *fix,
41 gconstpointer data);41 gconstpointer data);
42static void test_collator (FilterFixture *fix,42static void test_collator_asc (FilterFixture *fix,
43 gconstpointer data);
44static void test_collator_desc (FilterFixture *fix,
43 gconstpointer data);45 gconstpointer data);
44static void test_key (FilterFixture *fix,46static void test_key (FilterFixture *fix,
45 gconstpointer data);47 gconstpointer data);
@@ -62,8 +64,10 @@
62 setup, test_discard_all, teardown);64 setup, test_discard_all, teardown);
63 g_test_add (DOMAIN"/DiscardAllAppendNotify", FilterFixture, 0,65 g_test_add (DOMAIN"/DiscardAllAppendNotify", FilterFixture, 0,
64 setup, test_discard_all_append_notify, teardown);66 setup, test_discard_all_append_notify, teardown);
65 g_test_add (DOMAIN"/Collator", FilterFixture, 0,67 g_test_add (DOMAIN"/CollatorAscending", FilterFixture, 0,
66 setup, test_collator, teardown);68 setup, test_collator_asc, teardown);
69 g_test_add (DOMAIN"/CollatorDescending", FilterFixture, 0,
70 setup, test_collator_desc, teardown);
67 g_test_add (DOMAIN"/Key", FilterFixture, 0,71 g_test_add (DOMAIN"/Key", FilterFixture, 0,
68 setup, test_key, teardown);72 setup, test_key, teardown);
69 g_test_add (DOMAIN"/Any", FilterFixture, 0,73 g_test_add (DOMAIN"/Any", FilterFixture, 0,
@@ -301,9 +305,9 @@
301 g_object_unref (m);305 g_object_unref (m);
302}306}
303307
304/* Test dee_filter_new_collator() */308/* Test dee_filter_new_collator() ascending */
305static void309static void
306test_collator (FilterFixture *fix, gconstpointer data)310test_collator_asc (FilterFixture *fix, gconstpointer data)
307{311{
308 DeeModelIter *r0, *r1, *r2, *r3, *r4, *r5;312 DeeModelIter *r0, *r1, *r2, *r3, *r4, *r5;
309 DeeFilter *collator = dee_filter_new_collator (1);313 DeeFilter *collator = dee_filter_new_collator (1);
@@ -336,12 +340,57 @@
336 /* Appending to the end of the sorted model is a special case in the code,340 /* Appending to the end of the sorted model is a special case in the code,
337 * so double check on that... */341 * so double check on that... */
338 dee_model_append (fix->model, 5, "Zzzz");342 dee_model_append (fix->model, 5, "Zzzz");
343 r0 = dee_model_get_iter_at_row (m, 0);
339 r5 = dee_model_get_iter_at_row (m, 5);344 r5 = dee_model_get_iter_at_row (m, 5);
345 g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r0, 1));
340 g_assert_cmpstr ("Zzzz", ==, dee_model_get_string (m, r5, 1));346 g_assert_cmpstr ("Zzzz", ==, dee_model_get_string (m, r5, 1));
341347
342 g_object_unref (m);348 g_object_unref (m);
343}349}
344350
351/* Test dee_filter_new_collator_desc() descending*/
352static void
353test_collator_desc (FilterFixture *fix, gconstpointer data)
354{
355 DeeModelIter *r0, *r1, *r2, *r3, *r4, *r5;
356 DeeFilter *collator = dee_filter_new_collator_desc (1);
357 DeeModel *m = dee_filter_model_new (collator, fix->model);
358
359 g_free (collator);
360
361 /* Test alphabetic sorting after initial construction */
362 r0 = dee_model_get_iter_at_row (m, 0);
363 r1 = dee_model_get_iter_at_row (m, 1);
364 r2 = dee_model_get_iter_at_row (m, 2);
365 g_assert_cmpstr ("Zero", ==, dee_model_get_string (m, r0, 1));
366 g_assert_cmpstr ("Two", ==, dee_model_get_string (m, r1, 1));
367 g_assert_cmpstr ("One", ==, dee_model_get_string (m, r2, 1));
368
369 /* Test alphabetic sorting after updates */
370 dee_model_append (fix->model, 3, "Three");
371 dee_model_append (fix->model, 4, "Four");
372 r0 = dee_model_get_iter_at_row (m, 0);
373 r1 = dee_model_get_iter_at_row (m, 1);
374 r2 = dee_model_get_iter_at_row (m, 2);
375 r3 = dee_model_get_iter_at_row (m, 3);
376 r4 = dee_model_get_iter_at_row (m, 4);
377 g_assert_cmpstr ("Zero", ==, dee_model_get_string (m, r0, 1));
378 g_assert_cmpstr ("Two", ==, dee_model_get_string (m, r1, 1));
379 g_assert_cmpstr ("Three", ==, dee_model_get_string (m, r2, 1));
380 g_assert_cmpstr ("One", ==, dee_model_get_string (m, r3, 1));
381 g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r4, 1));
382
383 /* Appending to the end of the sorted model is a special case in the code,
384 * so double check on that... */
385 dee_model_append (fix->model, 5, "Zzzz");
386 r0 = dee_model_get_iter_at_row (m, 0);
387 r5 = dee_model_get_iter_at_row (m, 5);
388 g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r5, 1));
389 g_assert_cmpstr ("Zzzz", ==, dee_model_get_string (m, r0, 1));
390
391 g_object_unref (m);
392}
393
345static void394static void
346_test_orig_ordering (FilterFixture *fix,395_test_orig_ordering (FilterFixture *fix,
347 DeeFilter *filter)396 DeeFilter *filter)
348397
=== modified file 'vapi/dee-1.0-custom.vala'
--- vapi/dee-1.0-custom.vala 2010-08-11 10:41:35 +0000
+++ vapi/dee-1.0-custom.vala 2011-06-29 13:26:35 +0000
@@ -15,6 +15,11 @@
15 [NoAccessorMethod]15 [NoAccessorMethod]
16 public unowned Filter filter { get; construct; }16 public unowned Filter filter { get; construct; }
17 }17 }
18 [Compact]
19 [CCode (free_function = "g_free", cheader_filename = "dee.h")]
20 public class Filter {
21 }
22
18 23
19 [CCode (cheader_filename = "dee.h")]24 [CCode (cheader_filename = "dee.h")]
20 public interface ResultSet: GLib.Object25 public interface ResultSet: GLib.Object
2126
=== modified file 'vapi/dee-1.0.gi'
--- vapi/dee-1.0.gi 2011-03-17 09:00:37 +0000
+++ vapi/dee-1.0.gi 2011-06-29 13:26:35 +0000
@@ -82,6 +82,12 @@
82 <parameter name="column" type="guint"/>82 <parameter name="column" type="guint"/>
83 </parameters>83 </parameters>
84 </method>84 </method>
85 <method name="new_collator_desc" symbol="dee_filter_new_collator_desc">
86 <return-type type="DeeFilter*"/>
87 <parameters>
88 <parameter name="column" type="guint"/>
89 </parameters>
90 </method>
85 <method name="new_for_any_column" symbol="dee_filter_new_for_any_column">91 <method name="new_for_any_column" symbol="dee_filter_new_for_any_column">
86 <return-type type="DeeFilter*"/>92 <return-type type="DeeFilter*"/>
87 <parameters>93 <parameters>
8894
=== modified file 'vapi/dee-1.0.vapi'
--- vapi/dee-1.0.vapi 2011-03-17 09:00:37 +0000
+++ vapi/dee-1.0.vapi 2011-06-29 13:26:35 +0000
@@ -31,7 +31,7 @@
31 public string primary_path { get; construct; }31 public string primary_path { get; construct; }
32 }32 }
33 [Compact]33 [Compact]
34 [CCode (cheader_filename = "dee.h")]34 [CCode (free_function = "g_free", cheader_filename = "dee.h")]
35 public class Filter {35 public class Filter {
36 public weak GLib.DestroyNotify destroy;36 public weak GLib.DestroyNotify destroy;
37 public weak Dee.ModelMapFunc map_func;37 public weak Dee.ModelMapFunc map_func;
@@ -40,6 +40,8 @@
40 [CCode (has_construct_function = false)]40 [CCode (has_construct_function = false)]
41 public Filter.collator (uint column);41 public Filter.collator (uint column);
42 [CCode (has_construct_function = false)]42 [CCode (has_construct_function = false)]
43 public Filter.collator_desc (uint column);
44 [CCode (has_construct_function = false)]
43 public Filter.for_any_column (uint column, GLib.Variant value);45 public Filter.for_any_column (uint column, GLib.Variant value);
44 [CCode (has_construct_function = false)]46 [CCode (has_construct_function = false)]
45 public Filter.for_key_column (uint column, string key);47 public Filter.for_key_column (uint column, string key);

Subscribers

People subscribed via source and target branches

to all changes: