~unity-team/dee/dee-0.5

« back to all changes in this revision

Viewing changes to dee/dee-filters.c

  • Committer: Mikkel Kamstrup Erlandsen
  • Date: 2011-07-14 08:38:24 UTC
  • mfrom: (281.2.2 dee-collator-desc)
  • Revision ID: mikkel.kamstrup@gmail.com-20110714083824-2hgb2o9lm4aykazl
Merge Ken VanDine's branch lp:~ken-vandine/dee/collator_desc:

 * Added a descending version of the collator filter
 * Specify a free_function for Dee.Filter in the vapi

Show diffs side-by-side

added added

removed removed

Lines of Context:
84
84
                                             DeeFilterModel *filter_model,
85
85
                                             gpointer user_data);
86
86
 
 
87
static void _dee_filter_collator_desc_map_notify (DeeModel *orig_model,
 
88
                                                  DeeModelIter *orig_iter,
 
89
                                                  DeeFilterModel *filter_model,
 
90
                                                  gpointer user_data);
 
91
 
87
92
static void
88
93
_dee_filter_collator_map_func (DeeModel *orig_model,
89
94
                               DeeFilterModel *filter_model,
109
114
}
110
115
 
111
116
static 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
 
 
140
static void
112
141
_dee_filter_collator_map_notify (DeeModel *orig_model,
113
142
                                 DeeModelIter *orig_iter,
114
143
                                 DeeFilterModel *filter_model,
154
183
}
155
184
 
156
185
static 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
 
 
230
static void
157
231
_dee_filter_key_map_func (DeeModel *orig_model,
158
232
                          DeeFilterModel *filter_model,
159
233
                          gpointer user_data)
357
431
}
358
432
 
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
 */
 
444
DeeFilter*
 
445
dee_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
465
 * dee_filter_new_for_key_column:
361
466
 * @column: The index of a column containing the string key to match
362
467
 *