[gucharmap] lib: Enable alphabetical sorting of the Unicode blocks



commit ed586efd7516204cacc34a50cbe2995c206f8036
Author: Ingo Brückl <ib wupperonline de>
Date:   Sat Oct 3 15:12:06 2020 +0200

    lib: Enable alphabetical sorting of the Unicode blocks
    
    Sort the tree view column and not directly the model.
    
    Add a string containing the block start to the block chapters model and
    sort using this by default.
    
    Each time the column header of the Unicode blocks is clicked, the column
    to be sorted will switch between block start and block name, but nothing
    but the block name column will ever be displayed.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=620180
    Fixes: https://gitlab.gnome.org/GNOME/gucharmap/-/issues/35

 gucharmap/gucharmap-block-chapters-model.c  | 56 ++++++++++++++++++++++++++---
 gucharmap/gucharmap-chapters-view.c         |  4 +++
 gucharmap/gucharmap-private.h               |  1 +
 gucharmap/gucharmap-script-chapters-model.c |  5 ++-
 4 files changed, 58 insertions(+), 8 deletions(-)
---
diff --git a/gucharmap/gucharmap-block-chapters-model.c b/gucharmap/gucharmap-block-chapters-model.c
index ae7fac35..67fc23e1 100644
--- a/gucharmap/gucharmap-block-chapters-model.c
+++ b/gucharmap/gucharmap-block-chapters-model.c
@@ -28,18 +28,39 @@
 enum 
 {
   BLOCK_CHAPTERS_MODEL_ID = 0,
-  BLOCK_CHAPTERS_MODEL_LABEL,
+  BLOCK_CHAPTERS_MODEL_LABEL = GUCHARMAP_CHAPTERS_MODEL_COLUMN_LABEL,
+  BLOCK_CHAPTERS_MODEL_BLOCK,
   BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR,
   BLOCK_CHAPTERS_MODEL_NUM_COLUMNS
 };
 
+static void
+sort_column_changed_cb (GtkTreeSortable *sortable,
+                       gpointer user_data)
+{
+  GucharmapChaptersModel *model = GUCHARMAP_CHAPTERS_MODEL (sortable);
+
+  if (model->priv->sort_column == BLOCK_CHAPTERS_MODEL_BLOCK)
+    model->priv->sort_column = BLOCK_CHAPTERS_MODEL_LABEL;
+  else
+    model->priv->sort_column = BLOCK_CHAPTERS_MODEL_BLOCK;
+
+  g_signal_handlers_block_by_func(sortable, G_CALLBACK(sort_column_changed_cb), NULL);
+  gtk_tree_sortable_set_sort_column_id (sortable,
+                                        model->priv->sort_column,
+                                        GTK_SORT_ASCENDING);
+  g_signal_handlers_unblock_by_func(sortable, G_CALLBACK(sort_column_changed_cb), NULL);
+}
+
 static void
 gucharmap_block_chapters_model_init (GucharmapBlockChaptersModel *model)
 {
+  GucharmapChaptersModel *chapters_model = GUCHARMAP_CHAPTERS_MODEL (model);
   GtkListStore *store = GTK_LIST_STORE (model);
   GtkTreeIter iter;
   guint i;
   GType types[] = {
+    G_TYPE_STRING,
     G_TYPE_STRING,
     G_TYPE_STRING,
     G_TYPE_POINTER
@@ -51,22 +72,34 @@ gucharmap_block_chapters_model_init (GucharmapBlockChaptersModel *model)
   gtk_list_store_set (store, &iter,
                       BLOCK_CHAPTERS_MODEL_ID, "All",
                       BLOCK_CHAPTERS_MODEL_LABEL, _("All"), 
+                      BLOCK_CHAPTERS_MODEL_BLOCK, "",
                       BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR, NULL, 
                       -1);
 
   for (i = 0;  i < G_N_ELEMENTS (unicode_blocks); i++)
     {
+      static gchar block_start[12];
       const char *block_name;
 
+      g_snprintf (block_start, sizeof (block_start), "%012" G_GUINT32_FORMAT, unicode_blocks[i].start);
       block_name = unicode_blocks_strings + unicode_blocks[i].block_name_index;
 
       gtk_list_store_append (store, &iter);
       gtk_list_store_set (store, &iter,
                           BLOCK_CHAPTERS_MODEL_ID, block_name,
                           BLOCK_CHAPTERS_MODEL_LABEL, _(block_name),
+                          BLOCK_CHAPTERS_MODEL_BLOCK, block_start,
                           BLOCK_CHAPTERS_MODEL_UNICODE_BLOCK_PTR, unicode_blocks + i,
                           -1);
     }
+
+  g_signal_connect (model, "sort-column-changed", G_CALLBACK (sort_column_changed_cb), NULL);
+
+  /* This will switch to its default BLOCK_CHAPTERS_MODEL_BLOCK when
+   * gucharmap_chapters_view_set_model() calls
+   * gtk_tree_sortable_set_sort_column_id() and triggers
+   * "sort-column-changed". */
+  chapters_model->priv->sort_column = BLOCK_CHAPTERS_MODEL_LABEL;
 }
 
 static GucharmapCodepointList *
@@ -104,28 +137,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
diff --git a/gucharmap/gucharmap-chapters-view.c b/gucharmap/gucharmap-chapters-view.c
index d424ed52..f71cc794 100644
--- a/gucharmap/gucharmap-chapters-view.c
+++ b/gucharmap/gucharmap-chapters-view.c
@@ -124,6 +124,10 @@ gucharmap_chapters_view_set_model (GucharmapChaptersView *view,
     return;
 
   gtk_tree_view_column_set_title (priv->column, gucharmap_chapters_model_get_title (model));
+  gtk_tree_view_column_set_sort_column_id (priv->column, model->priv->sort_column);
+  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
+                                        model->priv->sort_column,
+                                        GTK_SORT_ASCENDING);
 
   /* Need to re-set this here since it's set to -1 when the tree view model changes! */
   gtk_tree_view_set_search_column (tree_view, GUCHARMAP_CHAPTERS_MODEL_COLUMN_LABEL);
diff --git a/gucharmap/gucharmap-private.h b/gucharmap/gucharmap-private.h
index e912f7f2..a7d6e928 100644
--- a/gucharmap/gucharmap-private.h
+++ b/gucharmap/gucharmap-private.h
@@ -31,6 +31,7 @@ G_GNUC_INTERNAL gboolean _gucharmap_unicode_has_nameslist_entry (gunichar uc);
 
 struct _GucharmapChaptersModelPrivate {
   GucharmapCodepointList *book_list;
+  int sort_column;
 };
 
 struct _GucharmapChartablePrivate {
diff --git a/gucharmap/gucharmap-script-chapters-model.c b/gucharmap/gucharmap-script-chapters-model.c
index 1800bd1f..fe5c5252 100644
--- a/gucharmap/gucharmap-script-chapters-model.c
+++ b/gucharmap/gucharmap-script-chapters-model.c
@@ -30,6 +30,7 @@
 static void
 gucharmap_script_chapters_model_init (GucharmapScriptChaptersModel *model)
 {
+  GucharmapChaptersModel *chapters_model = GUCHARMAP_CHAPTERS_MODEL (model);
   GtkListStore *store = GTK_LIST_STORE (model);
   const gchar **unicode_scripts;
   GtkTreeIter iter;
@@ -52,9 +53,7 @@ gucharmap_script_chapters_model_init (GucharmapScriptChaptersModel *model)
     }
   g_free (unicode_scripts);
 
-  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
-                                        GUCHARMAP_CHAPTERS_MODEL_COLUMN_LABEL,
-                                        GTK_SORT_ASCENDING);
+  chapters_model->priv->sort_column = GUCHARMAP_CHAPTERS_MODEL_COLUMN_LABEL;
 }
 
 static GucharmapCodepointList *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]