[gucharmap] Also sort the block chapters list
- From: Christian Persch <chpe src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gucharmap] Also sort the block chapters list
- Date: Wed, 6 Jan 2010 21:14:39 +0000 (UTC)
commit d3607d59adc92abe4c756fe755a59d69e4ece22c
Author: Christian Persch <chpe gnome org>
Date: Wed Jan 6 22:13:20 2010 +0100
Also sort the block chapters list
gucharmap/gucharmap-block-chapters-model.c | 66 +++++++++++++++++++++++++---
1 files changed, 59 insertions(+), 7 deletions(-)
---
diff --git a/gucharmap/gucharmap-block-chapters-model.c b/gucharmap/gucharmap-block-chapters-model.c
index 003b749..957371d 100644
--- a/gucharmap/gucharmap-block-chapters-model.c
+++ b/gucharmap/gucharmap-block-chapters-model.c
@@ -27,12 +27,43 @@
enum
{
- BLOCK_CHAPTERS_MODEL_ID = 0,
- BLOCK_CHAPTERS_MODEL_LABEL,
- BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR,
+ BLOCK_CHAPTERS_MODEL_ID = GUCHARMAP_CHAPTERS_MODEL_COLUMN_ID,
+ BLOCK_CHAPTERS_MODEL_LABEL = GUCHARMAP_CHAPTERS_MODEL_COLUMN_LABEL,
+ BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR = 2,
BLOCK_CHAPTERS_MODEL_NUM_COLUMNS
};
+static int
+compare_iters (GtkTreeModel *model,
+ GtkTreeIter *iter_a,
+ GtkTreeIter *iter_b,
+ gpointer user_data)
+{
+ UnicodeBlock *block_a, *block_b;
+ char *label_a, *label_b;
+ int ret;
+
+ gtk_tree_model_get (model, iter_a, BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR, &block_a, -1);
+ gtk_tree_model_get (model, iter_b, BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR, &block_b, -1);
+
+ if (block_a == NULL && block_b != NULL)
+ return -1;
+ else if (block_a != NULL && block_b == NULL)
+ return 1;
+ else if (block_a == NULL && block_b == NULL)
+ return 0;
+
+ gtk_tree_model_get (model, iter_a, BLOCK_CHAPTERS_MODEL_LABEL, &label_a, -1);
+ gtk_tree_model_get (model, iter_b, BLOCK_CHAPTERS_MODEL_LABEL, &label_b, -1);
+
+ ret = strcmp (label_a, label_b);
+
+ g_free (label_a);
+ g_free (label_b);
+
+ return ret;
+}
+
static void
gucharmap_block_chapters_model_init (GucharmapBlockChaptersModel *model)
{
@@ -67,6 +98,14 @@ gucharmap_block_chapters_model_init (GucharmapBlockChaptersModel *model)
BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR, unicode_blocks + i,
-1);
}
+
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model),
+ GUCHARMAP_CHAPTERS_MODEL_COLUMN_LABEL,
+ (GtkTreeIterCompareFunc) compare_iters,
+ NULL, NULL);
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
+ GUCHARMAP_CHAPTERS_MODEL_COLUMN_LABEL,
+ GTK_SORT_ASCENDING);
}
static GucharmapCodepointList *
@@ -104,28 +143,41 @@ character_to_iter (GucharmapChaptersModel *chapters,
GtkTreeIter *_iter)
{
GtkTreeModel *model = GTK_TREE_MODEL (chapters);
- GtkTreeIter iter;
+ GtkTreeIter iter, all_iter;
+ gboolean all_iter_set = TRUE;
if (wc > UNICHAR_MAX)
return FALSE;
- /* skip "All" block */
if (!gtk_tree_model_get_iter_first (model, &iter))
return FALSE;
- while (gtk_tree_model_iter_next (model, &iter))
+ do
{
UnicodeBlock *unicode_block;
+
gtk_tree_model_get (model, &iter, BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR, &unicode_block, -1);
+
+ /* skip "All" block */
+ if (unicode_block == NULL)
+ {
+ all_iter = iter;
+ all_iter_set = TRUE;
+ continue;
+ }
+
if (wc >= unicode_block->start && wc <= unicode_block->end)
{
*_iter = iter;
return TRUE;
}
}
+ while (gtk_tree_model_iter_next (model, &iter));
/* "All" is the last resort */
- return gtk_tree_model_get_iter_first (model, _iter);
+ g_assert (all_iter_set);
+ *_iter = all_iter;
+ return TRUE;
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]