Merge lp:~ken-vandine/dee/collator_desc into lp:dee
- collator_desc
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mikkel Kamstrup Erlandsen (community) | Approve | ||
Review via email: mp+66299@code.launchpad.net |
Commit message
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.
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 | 84 | DeeFilterModel *filter_model, | 84 | DeeFilterModel *filter_model, |
6 | 85 | gpointer user_data); | 85 | gpointer user_data); |
7 | 86 | 86 | ||
8 | 87 | static void _dee_filter_collator_desc_map_notify (DeeModel *orig_model, | ||
9 | 88 | DeeModelIter *orig_iter, | ||
10 | 89 | DeeFilterModel *filter_model, | ||
11 | 90 | gpointer user_data); | ||
12 | 91 | |||
13 | 87 | static void | 92 | static void |
14 | 88 | _dee_filter_collator_map_func (DeeModel *orig_model, | 93 | _dee_filter_collator_map_func (DeeModel *orig_model, |
15 | 89 | DeeFilterModel *filter_model, | 94 | DeeFilterModel *filter_model, |
16 | @@ -109,6 +114,30 @@ | |||
17 | 109 | } | 114 | } |
18 | 110 | 115 | ||
19 | 111 | static void | 116 | static void |
20 | 117 | _dee_filter_collator_desc_map_func (DeeModel *orig_model, | ||
21 | 118 | DeeFilterModel *filter_model, | ||
22 | 119 | gpointer user_data) | ||
23 | 120 | { | ||
24 | 121 | DeeModelIter *iter, *end; | ||
25 | 122 | CollatorFilter *filter; | ||
26 | 123 | |||
27 | 124 | g_return_if_fail (user_data != NULL); | ||
28 | 125 | |||
29 | 126 | filter = (CollatorFilter *) user_data; | ||
30 | 127 | filter->collation_key_tag = | ||
31 | 128 | dee_model_register_tag (orig_model, (GDestroyNotify) g_free); | ||
32 | 129 | |||
33 | 130 | iter = dee_model_get_first_iter (orig_model); | ||
34 | 131 | end = dee_model_get_last_iter (orig_model); | ||
35 | 132 | while (iter != end) | ||
36 | 133 | { | ||
37 | 134 | _dee_filter_collator_desc_map_notify (orig_model, iter, filter_model, filter); | ||
38 | 135 | iter = dee_model_next (orig_model, iter); | ||
39 | 136 | } | ||
40 | 137 | |||
41 | 138 | } | ||
42 | 139 | |||
43 | 140 | static void | ||
44 | 112 | _dee_filter_collator_map_notify (DeeModel *orig_model, | 141 | _dee_filter_collator_map_notify (DeeModel *orig_model, |
45 | 113 | DeeModelIter *orig_iter, | 142 | DeeModelIter *orig_iter, |
46 | 114 | DeeFilterModel *filter_model, | 143 | DeeFilterModel *filter_model, |
47 | @@ -154,6 +183,51 @@ | |||
48 | 154 | } | 183 | } |
49 | 155 | 184 | ||
50 | 156 | static void | 185 | static void |
51 | 186 | _dee_filter_collator_desc_map_notify (DeeModel *orig_model, | ||
52 | 187 | DeeModelIter *orig_iter, | ||
53 | 188 | DeeFilterModel *filter_model, | ||
54 | 189 | gpointer user_data) | ||
55 | 190 | { | ||
56 | 191 | DeeModelIter *iter, *end; | ||
57 | 192 | CollatorFilter *filter; | ||
58 | 193 | const gchar *column_value, *test_value; | ||
59 | 194 | gchar *collation_key; | ||
60 | 195 | |||
61 | 196 | g_return_if_fail (user_data != NULL); | ||
62 | 197 | g_return_if_fail (orig_iter != NULL); | ||
63 | 198 | |||
64 | 199 | filter = (CollatorFilter *) user_data; | ||
65 | 200 | |||
66 | 201 | /* Build and set collation ley for the current row */ | ||
67 | 202 | column_value = dee_model_get_string (orig_model, orig_iter, filter->column); | ||
68 | 203 | collation_key = g_utf8_collate_key (column_value, -1); | ||
69 | 204 | dee_model_set_tag (orig_model, orig_iter, | ||
70 | 205 | filter->collation_key_tag, collation_key); // steal collation_key | ||
71 | 206 | |||
72 | 207 | iter = dee_model_get_first_iter (DEE_MODEL (filter_model)); | ||
73 | 208 | end = dee_model_get_last_iter (DEE_MODEL (filter_model)); | ||
74 | 209 | while (iter != end) | ||
75 | 210 | { | ||
76 | 211 | test_value = dee_model_get_tag (orig_model, iter, filter->collation_key_tag); | ||
77 | 212 | if (g_strcmp0 (test_value, column_value) > 0) | ||
78 | 213 | { | ||
79 | 214 | iter = dee_model_next (DEE_MODEL (filter_model), iter); | ||
80 | 215 | } | ||
81 | 216 | else | ||
82 | 217 | { | ||
83 | 218 | dee_filter_model_insert_iter_before (filter_model, orig_iter, iter); | ||
84 | 219 | iter = NULL; | ||
85 | 220 | break; | ||
86 | 221 | } | ||
87 | 222 | } | ||
88 | 223 | |||
89 | 224 | if (iter == end) | ||
90 | 225 | { | ||
91 | 226 | dee_filter_model_append_iter(filter_model, orig_iter); | ||
92 | 227 | } | ||
93 | 228 | } | ||
94 | 229 | |||
95 | 230 | static void | ||
96 | 157 | _dee_filter_key_map_func (DeeModel *orig_model, | 231 | _dee_filter_key_map_func (DeeModel *orig_model, |
97 | 158 | DeeFilterModel *filter_model, | 232 | DeeFilterModel *filter_model, |
98 | 159 | gpointer user_data) | 233 | gpointer user_data) |
99 | @@ -357,6 +431,37 @@ | |||
100 | 357 | } | 431 | } |
101 | 358 | 432 | ||
102 | 359 | /** | 433 | /** |
103 | 434 | * dee_filter_new_collator_desc: | ||
104 | 435 | * @column: The index of a column containing the strings to sort after | ||
105 | 436 | * | ||
106 | 437 | * Create a #DeeFilter that takes string values from a column in the model | ||
107 | 438 | * and builds a #DeeFilterModel with the rows sorted descending according to the | ||
108 | 439 | * collation rules of the current locale. | ||
109 | 440 | * | ||
110 | 441 | * Returns: (transfer full): A newly allocated #DeeFilter. Do not modify it. | ||
111 | 442 | * Free with g_free(). | ||
112 | 443 | */ | ||
113 | 444 | DeeFilter* | ||
114 | 445 | dee_filter_new_collator_desc (guint column) | ||
115 | 446 | { | ||
116 | 447 | DeeFilter *filter; | ||
117 | 448 | CollatorFilter *collator; | ||
118 | 449 | |||
119 | 450 | filter = g_new0 (DeeFilter, 1); | ||
120 | 451 | filter->map_func = _dee_filter_collator_desc_map_func; | ||
121 | 452 | filter->map_notify = _dee_filter_collator_desc_map_notify; | ||
122 | 453 | |||
123 | 454 | collator = g_new0 (CollatorFilter, 1); | ||
124 | 455 | collator->column = column; | ||
125 | 456 | |||
126 | 457 | filter->destroy = (GDestroyNotify) g_free; | ||
127 | 458 | filter->user_data =collator; | ||
128 | 459 | |||
129 | 460 | return filter; | ||
130 | 461 | } | ||
131 | 462 | |||
132 | 463 | |||
133 | 464 | /** | ||
134 | 360 | * dee_filter_new_for_key_column: | 465 | * dee_filter_new_for_key_column: |
135 | 361 | * @column: The index of a column containing the string key to match | 466 | * @column: The index of a column containing the string key to match |
136 | 362 | * | 467 | * |
137 | 363 | 468 | ||
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 | 32 | 32 | ||
143 | 33 | DeeFilter* dee_filter_new_collator (guint column); | 33 | DeeFilter* dee_filter_new_collator (guint column); |
144 | 34 | 34 | ||
145 | 35 | DeeFilter* dee_filter_new_collator_desc (guint column); | ||
146 | 36 | |||
147 | 35 | DeeFilter* dee_filter_new_for_key_column (guint column, const gchar *key); | 37 | DeeFilter* dee_filter_new_for_key_column (guint column, const gchar *key); |
148 | 36 | 38 | ||
149 | 37 | DeeFilter* dee_filter_new_for_any_column (guint column, GVariant *value); | 39 | DeeFilter* dee_filter_new_for_any_column (guint column, GVariant *value); |
150 | 38 | 40 | ||
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 | 39 | gconstpointer data); | 39 | gconstpointer data); |
156 | 40 | static void test_discard_all_append_notify (FilterFixture *fix, | 40 | static void test_discard_all_append_notify (FilterFixture *fix, |
157 | 41 | gconstpointer data); | 41 | gconstpointer data); |
159 | 42 | static void test_collator (FilterFixture *fix, | 42 | static void test_collator_asc (FilterFixture *fix, |
160 | 43 | gconstpointer data); | ||
161 | 44 | static void test_collator_desc (FilterFixture *fix, | ||
162 | 43 | gconstpointer data); | 45 | gconstpointer data); |
163 | 44 | static void test_key (FilterFixture *fix, | 46 | static void test_key (FilterFixture *fix, |
164 | 45 | gconstpointer data); | 47 | gconstpointer data); |
165 | @@ -62,8 +64,10 @@ | |||
166 | 62 | setup, test_discard_all, teardown); | 64 | setup, test_discard_all, teardown); |
167 | 63 | g_test_add (DOMAIN"/DiscardAllAppendNotify", FilterFixture, 0, | 65 | g_test_add (DOMAIN"/DiscardAllAppendNotify", FilterFixture, 0, |
168 | 64 | setup, test_discard_all_append_notify, teardown); | 66 | setup, test_discard_all_append_notify, teardown); |
171 | 65 | g_test_add (DOMAIN"/Collator", FilterFixture, 0, | 67 | g_test_add (DOMAIN"/CollatorAscending", FilterFixture, 0, |
172 | 66 | setup, test_collator, teardown); | 68 | setup, test_collator_asc, teardown); |
173 | 69 | g_test_add (DOMAIN"/CollatorDescending", FilterFixture, 0, | ||
174 | 70 | setup, test_collator_desc, teardown); | ||
175 | 67 | g_test_add (DOMAIN"/Key", FilterFixture, 0, | 71 | g_test_add (DOMAIN"/Key", FilterFixture, 0, |
176 | 68 | setup, test_key, teardown); | 72 | setup, test_key, teardown); |
177 | 69 | g_test_add (DOMAIN"/Any", FilterFixture, 0, | 73 | g_test_add (DOMAIN"/Any", FilterFixture, 0, |
178 | @@ -301,9 +305,9 @@ | |||
179 | 301 | g_object_unref (m); | 305 | g_object_unref (m); |
180 | 302 | } | 306 | } |
181 | 303 | 307 | ||
183 | 304 | /* Test dee_filter_new_collator() */ | 308 | /* Test dee_filter_new_collator() ascending */ |
184 | 305 | static void | 309 | static void |
186 | 306 | test_collator (FilterFixture *fix, gconstpointer data) | 310 | test_collator_asc (FilterFixture *fix, gconstpointer data) |
187 | 307 | { | 311 | { |
188 | 308 | DeeModelIter *r0, *r1, *r2, *r3, *r4, *r5; | 312 | DeeModelIter *r0, *r1, *r2, *r3, *r4, *r5; |
189 | 309 | DeeFilter *collator = dee_filter_new_collator (1); | 313 | DeeFilter *collator = dee_filter_new_collator (1); |
190 | @@ -336,12 +340,57 @@ | |||
191 | 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, |
192 | 337 | * so double check on that... */ | 341 | * so double check on that... */ |
193 | 338 | dee_model_append (fix->model, 5, "Zzzz"); | 342 | dee_model_append (fix->model, 5, "Zzzz"); |
194 | 343 | r0 = dee_model_get_iter_at_row (m, 0); | ||
195 | 339 | r5 = dee_model_get_iter_at_row (m, 5); | 344 | r5 = dee_model_get_iter_at_row (m, 5); |
196 | 345 | g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r0, 1)); | ||
197 | 340 | g_assert_cmpstr ("Zzzz", ==, dee_model_get_string (m, r5, 1)); | 346 | g_assert_cmpstr ("Zzzz", ==, dee_model_get_string (m, r5, 1)); |
198 | 341 | 347 | ||
199 | 342 | g_object_unref (m); | 348 | g_object_unref (m); |
200 | 343 | } | 349 | } |
201 | 344 | 350 | ||
202 | 351 | /* Test dee_filter_new_collator_desc() descending*/ | ||
203 | 352 | static void | ||
204 | 353 | test_collator_desc (FilterFixture *fix, gconstpointer data) | ||
205 | 354 | { | ||
206 | 355 | DeeModelIter *r0, *r1, *r2, *r3, *r4, *r5; | ||
207 | 356 | DeeFilter *collator = dee_filter_new_collator_desc (1); | ||
208 | 357 | DeeModel *m = dee_filter_model_new (collator, fix->model); | ||
209 | 358 | |||
210 | 359 | g_free (collator); | ||
211 | 360 | |||
212 | 361 | /* Test alphabetic sorting after initial construction */ | ||
213 | 362 | r0 = dee_model_get_iter_at_row (m, 0); | ||
214 | 363 | r1 = dee_model_get_iter_at_row (m, 1); | ||
215 | 364 | r2 = dee_model_get_iter_at_row (m, 2); | ||
216 | 365 | g_assert_cmpstr ("Zero", ==, dee_model_get_string (m, r0, 1)); | ||
217 | 366 | g_assert_cmpstr ("Two", ==, dee_model_get_string (m, r1, 1)); | ||
218 | 367 | g_assert_cmpstr ("One", ==, dee_model_get_string (m, r2, 1)); | ||
219 | 368 | |||
220 | 369 | /* Test alphabetic sorting after updates */ | ||
221 | 370 | dee_model_append (fix->model, 3, "Three"); | ||
222 | 371 | dee_model_append (fix->model, 4, "Four"); | ||
223 | 372 | r0 = dee_model_get_iter_at_row (m, 0); | ||
224 | 373 | r1 = dee_model_get_iter_at_row (m, 1); | ||
225 | 374 | r2 = dee_model_get_iter_at_row (m, 2); | ||
226 | 375 | r3 = dee_model_get_iter_at_row (m, 3); | ||
227 | 376 | r4 = dee_model_get_iter_at_row (m, 4); | ||
228 | 377 | g_assert_cmpstr ("Zero", ==, dee_model_get_string (m, r0, 1)); | ||
229 | 378 | g_assert_cmpstr ("Two", ==, dee_model_get_string (m, r1, 1)); | ||
230 | 379 | g_assert_cmpstr ("Three", ==, dee_model_get_string (m, r2, 1)); | ||
231 | 380 | g_assert_cmpstr ("One", ==, dee_model_get_string (m, r3, 1)); | ||
232 | 381 | g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r4, 1)); | ||
233 | 382 | |||
234 | 383 | /* Appending to the end of the sorted model is a special case in the code, | ||
235 | 384 | * so double check on that... */ | ||
236 | 385 | dee_model_append (fix->model, 5, "Zzzz"); | ||
237 | 386 | r0 = dee_model_get_iter_at_row (m, 0); | ||
238 | 387 | r5 = dee_model_get_iter_at_row (m, 5); | ||
239 | 388 | g_assert_cmpstr ("Four", ==, dee_model_get_string (m, r5, 1)); | ||
240 | 389 | g_assert_cmpstr ("Zzzz", ==, dee_model_get_string (m, r0, 1)); | ||
241 | 390 | |||
242 | 391 | g_object_unref (m); | ||
243 | 392 | } | ||
244 | 393 | |||
245 | 345 | static void | 394 | static void |
246 | 346 | _test_orig_ordering (FilterFixture *fix, | 395 | _test_orig_ordering (FilterFixture *fix, |
247 | 347 | DeeFilter *filter) | 396 | DeeFilter *filter) |
248 | 348 | 397 | ||
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 | 15 | [NoAccessorMethod] | 15 | [NoAccessorMethod] |
254 | 16 | public unowned Filter filter { get; construct; } | 16 | public unowned Filter filter { get; construct; } |
255 | 17 | } | 17 | } |
256 | 18 | [Compact] | ||
257 | 19 | [CCode (free_function = "g_free", cheader_filename = "dee.h")] | ||
258 | 20 | public class Filter { | ||
259 | 21 | } | ||
260 | 22 | |||
261 | 18 | 23 | ||
262 | 19 | [CCode (cheader_filename = "dee.h")] | 24 | [CCode (cheader_filename = "dee.h")] |
263 | 20 | public interface ResultSet: GLib.Object | 25 | public interface ResultSet: GLib.Object |
264 | 21 | 26 | ||
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 | 82 | <parameter name="column" type="guint"/> | 82 | <parameter name="column" type="guint"/> |
270 | 83 | </parameters> | 83 | </parameters> |
271 | 84 | </method> | 84 | </method> |
272 | 85 | <method name="new_collator_desc" symbol="dee_filter_new_collator_desc"> | ||
273 | 86 | <return-type type="DeeFilter*"/> | ||
274 | 87 | <parameters> | ||
275 | 88 | <parameter name="column" type="guint"/> | ||
276 | 89 | </parameters> | ||
277 | 90 | </method> | ||
278 | 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"> |
279 | 86 | <return-type type="DeeFilter*"/> | 92 | <return-type type="DeeFilter*"/> |
280 | 87 | <parameters> | 93 | <parameters> |
281 | 88 | 94 | ||
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 | 31 | public string primary_path { get; construct; } | 31 | public string primary_path { get; construct; } |
287 | 32 | } | 32 | } |
288 | 33 | [Compact] | 33 | [Compact] |
290 | 34 | [CCode (cheader_filename = "dee.h")] | 34 | [CCode (free_function = "g_free", cheader_filename = "dee.h")] |
291 | 35 | public class Filter { | 35 | public class Filter { |
292 | 36 | public weak GLib.DestroyNotify destroy; | 36 | public weak GLib.DestroyNotify destroy; |
293 | 37 | public weak Dee.ModelMapFunc map_func; | 37 | public weak Dee.ModelMapFunc map_func; |
294 | @@ -40,6 +40,8 @@ | |||
295 | 40 | [CCode (has_construct_function = false)] | 40 | [CCode (has_construct_function = false)] |
296 | 41 | public Filter.collator (uint column); | 41 | public Filter.collator (uint column); |
297 | 42 | [CCode (has_construct_function = false)] | 42 | [CCode (has_construct_function = false)] |
298 | 43 | public Filter.collator_desc (uint column); | ||
299 | 44 | [CCode (has_construct_function = false)] | ||
300 | 43 | public Filter.for_any_column (uint column, GLib.Variant value); | 45 | public Filter.for_any_column (uint column, GLib.Variant value); |
301 | 44 | [CCode (has_construct_function = false)] | 46 | [CCode (has_construct_function = false)] |
302 | 45 | public Filter.for_key_column (uint column, string key); | 47 | public Filter.for_key_column (uint column, string key); |
review approve
Didn't test this, but looks good