[gimp/metadata-browser] Bug 653907 - Help-browser fails to sort top-level items



commit 4b04ccac1b66cac1d99798d06c1f380318be2de7
Author: Ulf-D. Ehlert <ulfehlert svn gnome org>
Date:   Mon Jan 9 20:04:28 2012 +0100

    Bug 653907 - Help-browser fails to sort top-level items
    
    Sort help-browser items by a new attribute "sort", if available (to be
    provided by the "gimp-help.xml" file).

 plug-ins/help-browser/dialog.c |   35 +++++++++++++++++++++++++++--------
 plug-ins/help/gimphelpitem.c   |    3 +++
 plug-ins/help/gimphelpitem.h   |    4 +++-
 plug-ins/help/gimphelplocale.c |    6 +++++-
 4 files changed, 38 insertions(+), 10 deletions(-)
---
diff --git a/plug-ins/help-browser/dialog.c b/plug-ins/help-browser/dialog.c
index cbefd83..3a2dde0 100644
--- a/plug-ins/help-browser/dialog.c
+++ b/plug-ins/help-browser/dialog.c
@@ -360,38 +360,57 @@ browser_dialog_make_index_foreach (const gchar    *help_id,
                                    GimpHelpItem   *item,
                                    GimpHelpLocale *locale)
 {
-#if 0
+  gchar *sort_key = item->title;
+#if DEBUG_SORT_HELP_ITEMS
   g_printerr ("%s: processing %s (parent %s)\n",
               G_STRFUNC,
               item->title  ? item->title  : "NULL",
               item->parent ? item->parent : "NULL");
 #endif
 
-  if (item->title)
+  if (item->sort &&
+      g_regex_match_simple("^[0-9]+([.][0-9]+)*$", item->sort, 0, 0))
     {
-      gchar **indices = g_strsplit (item->title, ".", -1);
+      sort_key = item->sort;
+#if DEBUG_SORT_HELP_ITEMS
+      g_printerr("%s: sort key = %s\n", G_STRFUNC, sort_key);
+#endif
+    }
+  item->index = 0;
+
+  if (sort_key)
+    {
+      const gint max_tokens = GIMP_HELP_BROWSER_INDEX_MAX_DEPTH;
+      gchar* *indices = g_strsplit (sort_key, ".", max_tokens + 1);
       gint    i;
 
-      for (i = 0; i < 5; i++)
+      for (i = 0; i < max_tokens; i++)
         {
           gunichar c;
 
           if (! indices[i])
-            break;
+            {
+              /* make sure that all item->index's are comparable */
+              item->index <<= (8 * (max_tokens - i));
+              break;
+            }
 
+          item->index <<= 8;  /* NOP if i = 0 */
           c = g_utf8_get_char (indices[i]);
-
           if (g_unichar_isdigit (c))
             {
-              item->index += atoi (indices[i]) << (8 * (5 - i));
+              item->index += atoi (indices[i]);
             }
           else if (g_utf8_strlen (indices[i], -1) == 1)
             {
-              item->index += (c & 0xFF) << (8 * (5 - i));
+              item->index += (c & 0xFF);
             }
         }
 
       g_strfreev (indices);
+#if DEBUG_SORT_HELP_ITEMS
+  g_printerr("%s: index = %lu\n", G_STRFUNC, item->index);
+#endif
     }
 
   if (item->parent && strlen (item->parent))
diff --git a/plug-ins/help/gimphelpitem.c b/plug-ins/help/gimphelpitem.c
index 4cee042..7e5e663 100644
--- a/plug-ins/help/gimphelpitem.c
+++ b/plug-ins/help/gimphelpitem.c
@@ -46,12 +46,14 @@
 GimpHelpItem *
 gimp_help_item_new (const gchar *ref,
                     const gchar *title,
+                    const gchar *sort,
                     const gchar *parent)
 {
   GimpHelpItem *item = g_slice_new0 (GimpHelpItem);
 
   item->ref    = g_strdup (ref);
   item->title  = g_strdup (title);
+  item->sort   = g_strdup (sort);
   item->parent = g_strdup (parent);
 
   return item;
@@ -62,6 +64,7 @@ gimp_help_item_free (GimpHelpItem *item)
 {
   g_free (item->ref);
   g_free (item->title);
+  g_free (item->sort);
   g_free (item->parent);
 
   g_list_free (item->children);
diff --git a/plug-ins/help/gimphelpitem.h b/plug-ins/help/gimphelpitem.h
index a8bbe7e..3d590fd 100644
--- a/plug-ins/help/gimphelpitem.h
+++ b/plug-ins/help/gimphelpitem.h
@@ -28,16 +28,18 @@ struct _GimpHelpItem
 {
   gchar *ref;
   gchar *title;
+  gchar *sort;   /* optional sort key provided by doc team */
   gchar *parent;
 
   /*  extra fields used by the help-browser  */
   GList *children;
-  gint   index;
+  gulong index;
 };
 
 
 GimpHelpItem * gimp_help_item_new  (const gchar   *ref,
                                     const gchar   *title,
+                                    const gchar   *sort,
                                     const gchar   *parent);
 void           gimp_help_item_free (GimpHelpItem  *item);
 
diff --git a/plug-ins/help/gimphelplocale.c b/plug-ins/help/gimphelplocale.c
index 494a1c6..a9768ee 100644
--- a/plug-ins/help/gimphelplocale.c
+++ b/plug-ins/help/gimphelplocale.c
@@ -451,6 +451,7 @@ locale_parser_parse_item (LocaleParser  *parser,
   const gchar *id     = NULL;
   const gchar *ref    = NULL;
   const gchar *title  = NULL;
+  const gchar *sort   = NULL;  /* optional sort key provided by doc team */
   const gchar *parent = NULL;
 
   for (; *names && *values; names++, values++)
@@ -464,6 +465,9 @@ locale_parser_parse_item (LocaleParser  *parser,
       if (! strcmp (*names, "title"))
         title = *values;
 
+      if (! strcmp (*names, "sort"))
+        sort = *values;
+
       if (! strcmp (*names, "parent"))
         parent = *values;
     }
@@ -479,7 +483,7 @@ locale_parser_parse_item (LocaleParser  *parser,
 
       g_hash_table_insert (parser->locale->help_id_mapping,
                            g_strdup (id),
-                           gimp_help_item_new (ref, title, parent));
+                           gimp_help_item_new (ref, title, sort, parent));
 
 #ifdef GIMP_HELP_DEBUG
       g_printerr ("help (%s): added mapping \"%s\" -> \"%s\"\n",



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