gimp r26318 - in branches/soc-2008-tagging: . app/core app/widgets



Author: aurisj
Date: Sat Jul 26 18:23:52 2008
New Revision: 26318
URL: http://svn.gnome.org/viewvc/gimp?rev=26318&view=rev

Log:
2008-07-26  Aurimas JuÅka  <aurisj svn gnome org>

	* app/core/core-types.h
	* app/core/gimpdata.c
	* app/core/gimpfilteredcontainer.c
	* app/core/gimptag.[ch]
	* app/core/gimptagcache.c
	* app/core/gimptagged.h
	* app/widgets/gimpcombotagentry.c
	* app/widgets/gimptagentry.c: made GimpTag an object and updated all
	places to treat it as such. This allows correctly compare various tags
	and change implementation in one place.



Modified:
   branches/soc-2008-tagging/ChangeLog
   branches/soc-2008-tagging/app/core/core-types.h
   branches/soc-2008-tagging/app/core/gimpdata.c
   branches/soc-2008-tagging/app/core/gimpfilteredcontainer.c
   branches/soc-2008-tagging/app/core/gimptag.c
   branches/soc-2008-tagging/app/core/gimptag.h
   branches/soc-2008-tagging/app/core/gimptagcache.c
   branches/soc-2008-tagging/app/core/gimptagged.h
   branches/soc-2008-tagging/app/widgets/gimpcombotagentry.c
   branches/soc-2008-tagging/app/widgets/gimptagentry.c

Modified: branches/soc-2008-tagging/app/core/core-types.h
==============================================================================
--- branches/soc-2008-tagging/app/core/core-types.h	(original)
+++ branches/soc-2008-tagging/app/core/core-types.h	Sat Jul 26 18:23:52 2008
@@ -172,9 +172,7 @@
 
 /*  tags  */
 
-typedef GQuark                      GimpTag;
-#define gimp_tag_new(name)          g_quark_from_string (name)
-#define gimp_tag_get_name(tag)      g_quark_to_string (name)
+typedef struct _GimpTag             GimpTag;
 
 
 /*  functions  */

Modified: branches/soc-2008-tagging/app/core/gimpdata.c
==============================================================================
--- branches/soc-2008-tagging/app/core/gimpdata.c	(original)
+++ branches/soc-2008-tagging/app/core/gimpdata.c	Sat Jul 26 18:23:52 2008
@@ -42,6 +42,7 @@
 #include "gimp-utils.h"
 #include "gimpdata.h"
 #include "gimpmarshal.h"
+#include "gimptag.h"
 #include "gimptagged.h"
 
 #include "gimp-intl.h"
@@ -89,9 +90,9 @@
 static void      gimp_data_real_dirty        (GimpData              *data);
 
 static gboolean  gimp_data_add_tag           (GimpTagged            *tagged,
-                                              GimpTag                tag);
+                                              GimpTag               *tag);
 static gboolean  gimp_data_remove_tag        (GimpTagged            *tagged,
-                                              GimpTag                tag);
+                                              GimpTag               *tag);
 static GList *   gimp_data_get_tags          (GimpTagged            *tagged);
 static gchar *   gimp_data_get_identifier    (GimpTagged            *tagged);
 static gchar *   gimp_data_get_checksum      (GimpTagged            *tagged);
@@ -360,38 +361,40 @@
 
 static gboolean
 gimp_data_add_tag (GimpTagged *tagged,
-                   GimpTag     tag)
+                   GimpTag    *tag)
 {
   GimpData *data = GIMP_DATA (tagged);
   GList    *list;
 
   for (list = data->tags; list; list = list->next)
     {
-      GimpTag this = GPOINTER_TO_UINT (list->data);
+      GimpTag *this = GIMP_TAG (list->data);
 
-      if (this == tag)
+      if (gimp_tag_equals (tag, this))
         return FALSE;
     }
 
-  data->tags = g_list_prepend (data->tags, GUINT_TO_POINTER (tag));
+  g_object_ref (tag);
+  data->tags = g_list_prepend (data->tags, tag);
 
   return TRUE;
 }
 
 static gboolean
 gimp_data_remove_tag (GimpTagged *tagged,
-                      GimpTag     tag)
+                      GimpTag    *tag)
 {
   GimpData *data = GIMP_DATA (tagged);
   GList    *list;
 
   for (list = data->tags; list; list = list->next)
     {
-      GimpTag this = GPOINTER_TO_UINT (list->data);
+      GimpTag *this = GIMP_TAG (list->data);
 
-      if (this == tag)
+      if (gimp_tag_equals (tag, this))
         {
           data->tags = g_list_delete_link (data->tags, list);
+          g_object_unref (tag);
           return TRUE;
         }
     }

Modified: branches/soc-2008-tagging/app/core/gimpfilteredcontainer.c
==============================================================================
--- branches/soc-2008-tagging/app/core/gimpfilteredcontainer.c	(original)
+++ branches/soc-2008-tagging/app/core/gimpfilteredcontainer.c	Sat Jul 26 18:23:52 2008
@@ -29,6 +29,7 @@
 #include "core-types.h"
 
 #include "gimp.h"
+#include "gimptag.h"
 #include "gimptagged.h"
 #include "gimplist.h"
 #include "gimpfilteredcontainer.h"
@@ -54,10 +55,10 @@
 static void         gimp_filtered_container_src_thaw           (GimpContainer         *src_container,
                                                                 GimpFilteredContainer *filtered_container);
 static void         gimp_filtered_container_tag_added          (GimpTagged            *tagged,
-                                                                GimpTag                tag,
+                                                                GimpTag               *tag,
                                                                 GimpFilteredContainer  *filtered_container);
 static void         gimp_filtered_container_tag_removed        (GimpTagged            *tagged,
-                                                                GimpTag                tag,
+                                                                GimpTag               *tag,
                                                                 GimpFilteredContainer  *filtered_container);
 static void         gimp_filtered_container_tagged_item_added  (GimpTagged             *tagged,
                                                                 GimpFilteredContainer  *filtered_container);
@@ -147,7 +148,9 @@
 
   filtered_container->src_container = src_container;
   GIMP_CONTAINER (filtered_container)->children_type = children_type;
-  filtered_container->tag_ref_counts = g_hash_table_new (g_direct_hash, g_direct_equal);
+  filtered_container->tag_ref_counts =
+      g_hash_table_new ((GHashFunc)gimp_tag_get_hash,
+                        (GEqualFunc)gimp_tag_equals);
 
   gimp_filtered_container_filter (filtered_container);
 
@@ -199,7 +202,8 @@
       object_tag = gimp_tagged_get_tags (GIMP_TAGGED (object));
       while (object_tag)
         {
-          if (object_tag->data == filter_tag->data)
+          if (gimp_tag_equals (GIMP_TAG (object_tag->data),
+                               GIMP_TAG (filter_tag->data)))
             {
               break;
             }
@@ -294,7 +298,7 @@
   while (tag_iterator)
     {
       gimp_filtered_container_tag_added (tagged,
-                                         GPOINTER_TO_UINT (tag_iterator->data),
+                                         GIMP_TAG (tag_iterator->data),
                                          filtered_container);
       tag_iterator = g_list_next (tag_iterator);
     }
@@ -324,7 +328,7 @@
   while (tag_iterator)
     {
       gimp_filtered_container_tag_removed (tagged,
-                                           GPOINTER_TO_UINT (tag_iterator->data),
+                                           GIMP_TAG (tag_iterator->data),
                                            filtered_container);
       tag_iterator = g_list_next (tag_iterator);
     }
@@ -333,38 +337,36 @@
 
 static void
 gimp_filtered_container_tag_added (GimpTagged            *tagged,
-                                   GimpTag                tag,
-                                   GimpFilteredContainer  *filtered_container)
+                                   GimpTag               *tag,
+                                   GimpFilteredContainer *filtered_container)
 {
   gint                  ref_count;
 
   ref_count = GPOINTER_TO_INT (g_hash_table_lookup (filtered_container->tag_ref_counts,
-                                                    GUINT_TO_POINTER (tag)));
+                                                    tag));
   ref_count++;
   g_hash_table_insert (filtered_container->tag_ref_counts,
-                       GUINT_TO_POINTER (tag),
-                       GINT_TO_POINTER (ref_count));
+                       tag, GINT_TO_POINTER (ref_count));
 }
 
 static void
 gimp_filtered_container_tag_removed (GimpTagged                  *tagged,
-                                     GimpTag                      tag,
+                                     GimpTag                     *tag,
                                      GimpFilteredContainer       *filtered_container)
 {
   gint                  ref_count;
 
   ref_count = GPOINTER_TO_INT (g_hash_table_lookup (filtered_container->tag_ref_counts,
-                                                    GUINT_TO_POINTER (tag)));
+                                                    tag));
   ref_count--;
   if (ref_count > 0)
     {
       g_hash_table_insert (filtered_container->tag_ref_counts,
-                           GUINT_TO_POINTER (tag),
-                           GINT_TO_POINTER (ref_count));
+                           tag, GINT_TO_POINTER (ref_count));
     }
   else
     {
-      g_hash_table_remove (filtered_container->tag_ref_counts,
-                           GUINT_TO_POINTER (tag));
+      g_hash_table_remove (filtered_container->tag_ref_counts, tag);
     }
 }
+

Modified: branches/soc-2008-tagging/app/core/gimptag.c
==============================================================================
--- branches/soc-2008-tagging/app/core/gimptag.c	(original)
+++ branches/soc-2008-tagging/app/core/gimptag.c	Sat Jul 26 18:23:52 2008
@@ -1,3 +1,23 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimptag.c
+ * Copyright (C) 2008 Aurimas JuÅka <aurisj svn gnome org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
 
 #include "config.h"
 
@@ -7,22 +27,154 @@
 
 #include "gimptag.h"
 
-GimpTag
-gimp_tag_from_string (const gchar      *string)
+G_DEFINE_TYPE (GimpTag, gimp_tag, GIMP_TYPE_OBJECT)
+
+#define parent_class gimp_tag_parent_class
+
+static void
+gimp_tag_class_init (GimpTagClass      *klass)
 {
-  if (g_utf8_strchr (string, -1, ','))
+}
+
+static void
+gimp_tag_init (GimpTag         *tag)
+{
+  tag->tag              = 0;
+  tag->collate_key      = 0;
+}
+
+GimpTag *
+gimp_tag_new (const char *tag_string)
+{
+  GimpTag      *tag;
+  gchar        *case_folded;
+  gchar        *collate_key;
+
+  g_return_val_if_fail (tag_string != NULL, NULL);
+  g_return_val_if_fail (gimp_tag_string_is_valid (tag_string), NULL);
+
+  tag = g_object_new (GIMP_TYPE_TAG, NULL);
+
+  tag->tag = g_quark_from_string (tag_string);
+
+  case_folded = g_utf8_casefold (tag_string, -1);
+  collate_key = g_utf8_collate_key (case_folded, -1);
+  tag->collate_key = g_quark_from_string (collate_key);
+  g_free (collate_key);
+  g_free (case_folded);
+
+  return tag;
+}
+
+GimpTag *
+gimp_tag_try_new (const char *tag_string)
+{
+  GimpTag      *tag;
+  gchar        *case_folded;
+  gchar        *collate_key;
+  GQuark        tag_quark;
+  GQuark        collate_key_quark;
+
+  if (! tag_string
+      || ! gimp_tag_string_is_valid (tag_string))
+    {
+     return NULL;
+    }
+
+
+  tag_quark = g_quark_from_string (tag_string);
+  if (! tag_quark)
+    {
+      return NULL;
+    }
+
+  case_folded = g_utf8_casefold (tag_string, -1);
+  collate_key = g_utf8_collate_key (case_folded, -1);
+  collate_key_quark = g_quark_from_string (collate_key);
+  g_free (collate_key);
+  g_free (case_folded);
+
+  if (! collate_key_quark)
     {
-      return 0;
+      return NULL;
     }
 
-  return g_quark_from_string (string);
+  tag = g_object_new (GIMP_TYPE_TAG, NULL);
+  tag->tag = tag_quark;
+  tag->collate_key = collate_key_quark;
+  return tag;
+}
+
+const gchar *
+gimp_tag_get_name (GimpTag           *tag)
+{
+  g_return_val_if_fail (GIMP_IS_TAG (tag), NULL);
+
+  return g_quark_to_string (tag->tag);
+}
+
+guint
+gimp_tag_get_hash (GimpTag       *tag)
+{
+  g_return_val_if_fail (GIMP_IS_TAG (tag), -1);
+
+  return tag->collate_key;
+}
+
+gboolean
+gimp_tag_equals (GimpTag             *tag,
+                 GimpTag             *other)
+{
+  g_return_val_if_fail (GIMP_IS_TAG (tag), FALSE);
+  g_return_val_if_fail (GIMP_IS_TAG (tag), FALSE);
+
+  return tag->tag == other->tag;
 }
 
 int
 gimp_tag_compare_func (const void         *p1,
                        const void         *p2)
 {
-  return strcmp (g_quark_to_string (GPOINTER_TO_UINT (p1)),
-                 g_quark_to_string (GPOINTER_TO_UINT (p2)));
+  GimpTag      *t1 = GIMP_TAG (p1);
+  GimpTag      *t2 = GIMP_TAG (p2);
+
+  return g_strcmp0 (g_quark_to_string (t1->collate_key),
+                    g_quark_to_string (t2->collate_key));
+}
+
+gint
+gimp_tag_compare_with_string (GimpTag          *tag,
+                              const char       *tag_string)
+{
+  gchar        *case_folded;
+  const gchar  *collate_key;
+  gchar        *collate_key2;
+  gint          result;
+
+  g_return_val_if_fail (GIMP_IS_TAG (tag), 0);
+  g_return_val_if_fail (tag_string != NULL, 0);
+  g_return_val_if_fail (! gimp_tag_string_is_valid (tag_string), 0);
+
+  collate_key = g_quark_to_string (tag->collate_key);
+  case_folded = g_utf8_casefold (tag_string, -1);
+  collate_key2 = g_utf8_collate_key (case_folded, -1);
+  result = g_strcmp0 (collate_key, collate_key2);
+  g_free (collate_key2);
+  g_free (case_folded);
+
+  return result;
+}
+
+gboolean
+gimp_tag_string_is_valid (const gchar      *string)
+{
+  g_return_val_if_fail (string, FALSE);
+
+  if (g_utf8_strchr (string, -1, ','))
+    {
+      return FALSE;
+    }
+
+  return TRUE;
 }
 

Modified: branches/soc-2008-tagging/app/core/gimptag.h
==============================================================================
--- branches/soc-2008-tagging/app/core/gimptag.h	(original)
+++ branches/soc-2008-tagging/app/core/gimptag.h	Sat Jul 26 18:23:52 2008
@@ -1,12 +1,68 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimptag.h
+ * Copyright (C) 2008 Aurimas JuÅka <aurisj svn gnome org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
 
 #ifndef __GIMP_TAG_H__
 #define __GIMP_TAG_H__
 
-GimpTag         gimp_tag_from_string   (const gchar      *string);
-#define         gimp_tag_to_string      g_quark_to_string
+#include "gimpobject.h"
 
-int             gimp_tag_compare_func  (const void       *p1,
-                                        const void       *p2);
+#define GIMP_TYPE_TAG                   (gimp_tag_get_type ())
+#define GIMP_TAG(obj)                   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_TAG, GimpTag))
+#define GIMP_TAG_CLASS(klass)           (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_TAG, GimpTagClass))
+#define GIMP_IS_TAG(obj)                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_TAG))
+#define GIMP_IS_TAG_CLASS(klass)        (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_TAG))
+#define GIMP_TAG_GET_CLASS(obj)         (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_TAG, GimpTagClass))
+
+typedef struct _GimpTagClass    GimpTagClass;
+
+struct _GimpTag
+{
+  GimpObject            parent_instance;
+
+  GQuark                tag;
+  GQuark                collate_key;
+};
+
+struct _GimpTagClass
+{
+  GimpObjectClass       parent_class;
+};
+
+GType           gimp_tag_get_type              (void) G_GNUC_CONST;
+
+GimpTag        *gimp_tag_new                   (const gchar    *tag_string);
+
+GimpTag        *gimp_tag_try_new               (const gchar    *tag_string);
+
+const gchar    *gimp_tag_get_name              (GimpTag        *tag);
+guint           gimp_tag_get_hash              (GimpTag        *tag);
+
+gboolean        gimp_tag_equals                (GimpTag        *tag,
+                                                GimpTag        *other);
+gint            gimp_tag_compare_func          (const void     *p1,
+                                                const void     *p2);
+gint            gimp_tag_compare_with_string   (GimpTag        *tag,
+                                                const gchar    *string);
+
+gboolean        gimp_tag_string_is_valid       (const gchar    *tag_string);
 
 #endif // __GIMP_TAG_H__
 

Modified: branches/soc-2008-tagging/app/core/gimptagcache.c
==============================================================================
--- branches/soc-2008-tagging/app/core/gimptagcache.c	(original)
+++ branches/soc-2008-tagging/app/core/gimptagcache.c	Sat Jul 26 18:23:52 2008
@@ -127,6 +127,7 @@
         {
           GimpTagCacheRecord *rec =
               &g_array_index (cache->records, GimpTagCacheRecord, i);
+          g_list_foreach (rec->tags, (GFunc)g_object_unref, NULL);
           g_list_free (rec->tags);
         }
       g_array_free (cache->records, TRUE);
@@ -213,9 +214,10 @@
                   while (tag_iterator)
                     {
                       printf ("assigning cached tag: %s to %s\n",
-                              g_quark_to_string (GPOINTER_TO_UINT (tag_iterator->data)),
+                              gimp_tag_get_name (GIMP_TAG (tag_iterator->data)),
                               identifier);
-                      gimp_tagged_add_tag (tagged, GPOINTER_TO_UINT (tag_iterator->data));
+                      gimp_tagged_add_tag (tagged, GIMP_TAG (tag_iterator->data));
+
                       tag_iterator = g_list_next (tag_iterator);
                     }
                   rec->referenced = TRUE;
@@ -245,9 +247,10 @@
                   while (tag_iterator)
                     {
                       printf ("assigning cached tag: %s to %s\n",
-                              g_quark_to_string (GPOINTER_TO_UINT (tag_iterator->data)),
+                              gimp_tag_get_name (GIMP_TAG (tag_iterator->data)),
                               identifier);
-                      gimp_tagged_add_tag (tagged, GPOINTER_TO_UINT (tag_iterator->data));
+                      gimp_tagged_add_tag (tagged, GIMP_TAG (tag_iterator->data));
+
                       tag_iterator = g_list_next (tag_iterator);
                     }
                   rec->referenced = TRUE;
@@ -343,7 +346,7 @@
       tag_iterator = cache_rec->tags;
       while (tag_iterator)
         {
-          tag_string = g_markup_escape_text (gimp_tag_to_string (GPOINTER_TO_UINT (tag_iterator->data)), -1);
+          tag_string = g_markup_escape_text (gimp_tag_get_name (GIMP_TAG (tag_iterator->data)), -1);
           g_string_append_printf (buf, "\t\t<tag>%s</tag>\n", tag_string);
           g_free (tag_string);
           tag_iterator = g_list_next (tag_iterator);
@@ -395,7 +398,7 @@
   filename = g_build_filename (gimp_directory (), GIMP_TAG_CACHE_FILE, NULL);
   printf ("reading tag cache to %s\n", filename);
   error = NULL;
-  if (!g_file_get_contents (filename, &buffer, &length, &error))
+  if (! g_file_get_contents (filename, &buffer, &length, &error))
     {
       printf ("Error while reading tag cache: %s\n", error->message);
       g_error_free (error);
@@ -490,7 +493,7 @@
   ParseData            *parse_data = (ParseData*) user_data;
   const gchar          *current_element;
   gchar                 buffer[2048];
-  GQuark                tag_quark;
+  GimpTag              *tag;
 
   current_element = g_markup_parse_context_get_element (context);
   if (current_element
@@ -509,9 +512,9 @@
       printf ("assigning tag %s to %s\n", buffer,
               g_quark_to_string (parse_data->current_record.identifier));
 
-      tag_quark = g_quark_from_string (buffer);
+      tag = gimp_tag_new (buffer);
       parse_data->current_record.tags = g_list_append (parse_data->current_record.tags,
-                                                        GUINT_TO_POINTER (tag_quark));
+                                                       tag);
     }
 }
 

Modified: branches/soc-2008-tagging/app/core/gimptagged.h
==============================================================================
--- branches/soc-2008-tagging/app/core/gimptagged.h	(original)
+++ branches/soc-2008-tagging/app/core/gimptagged.h	Sat Jul 26 18:23:52 2008
@@ -37,15 +37,15 @@
 
   /*  signals            */
   void       (* tag_added)   (GimpTagged *tagged,
-                              GimpTag     tag);
+                              GimpTag    *tag);
   void       (* tag_removed) (GimpTagged *tagged,
-                              GimpTag     tag);
+                              GimpTag    *tag);
 
   /*  virtual functions  */
   gboolean   (* add_tag)     (GimpTagged *tagged,
-                              GimpTag     tag);
+                              GimpTag    *tag);
   gboolean   (* remove_tag)  (GimpTagged *tagged,
-                              GimpTag     tag);
+                              GimpTag    *tag);
   GList    * (* get_tags)    (GimpTagged *tagged);
 
   gchar    * (* get_identifier) (GimpTagged *tagged);
@@ -56,9 +56,9 @@
 GType      gimp_tagged_interface_get_type (void) G_GNUC_CONST;
 
 void       gimp_tagged_add_tag            (GimpTagged *tagged,
-                                           GimpTag     tag);
+                                           GimpTag    *tag);
 void       gimp_tagged_remove_tag         (GimpTagged *tagged,
-                                           GimpTag     tag);
+                                           GimpTag    *tag);
 GList    * gimp_tagged_get_tags           (GimpTagged *tagged);
 
 gchar    * gimp_tagged_get_identifier     (GimpTagged *tagged);

Modified: branches/soc-2008-tagging/app/widgets/gimpcombotagentry.c
==============================================================================
--- branches/soc-2008-tagging/app/widgets/gimpcombotagentry.c	(original)
+++ branches/soc-2008-tagging/app/widgets/gimpcombotagentry.c	Sat Jul 26 18:23:52 2008
@@ -42,7 +42,7 @@
 
 typedef struct
 {
-  GimpTag               tag;
+  GimpTag              *tag;
   GdkRectangle          bounds;
   gboolean              selected;
 } PopupTagData;
@@ -404,9 +404,9 @@
   tag_iterator = tag_list;
   for (i = 0; i < popup_data->tag_count; i++)
     {
-      popup_data->tag_data[i].tag = GPOINTER_TO_UINT (tag_iterator->data);
+      popup_data->tag_data[i].tag = GIMP_TAG (tag_iterator->data);
       popup_data->tag_data[i].selected = FALSE;
-      list_tag = gimp_tag_to_string (popup_data->tag_data[i].tag);
+      list_tag = gimp_tag_get_name (popup_data->tag_data[i].tag);
       for (j = 0; j < current_count; j++)
         {
           if (! strcmp (current_tags[j], list_tag))
@@ -517,7 +517,7 @@
   for (i = 0; i < popup_data->tag_count; i++)
     {
       pango_layout_set_text (popup_data->layout,
-                             g_quark_to_string (popup_data->tag_data[i].tag), -1);
+                             gimp_tag_get_name (popup_data->tag_data[i].tag), -1);
       pango_layout_get_size (popup_data->layout,
                              &popup_data->tag_data[i].bounds.width,
                              &popup_data->tag_data[i].bounds.height);
@@ -561,7 +561,7 @@
   for (i = 0; i < popup_data->tag_count; i++)
     {
       pango_layout_set_text (popup_data->layout,
-                             g_quark_to_string (popup_data->tag_data[i].tag), -1);
+                             gimp_tag_get_name (popup_data->tag_data[i].tag), -1);
       if (popup_data->tag_data[i].selected)
         {
           pango_layout_set_attributes (popup_data->layout,
@@ -653,7 +653,7 @@
       gint              y;
       gint              i;
       GdkRectangle     *bounds;
-      GimpTag           tag;
+      GimpTag          *tag;
 
       button_event = (GdkEventButton *) event;
       x = button_event->x;
@@ -724,7 +724,7 @@
 
   tag_data->selected = ! tag_data->selected;
 
-  tag = gimp_tag_to_string (tag_data->tag);
+  tag = gimp_tag_get_name (tag_data->tag);
   current_tags = gimp_tag_entry_parse_tags (GIMP_TAG_ENTRY (combo_entry->tag_entry));
   tag_str = g_string_new ("");
   length = g_strv_length (current_tags);

Modified: branches/soc-2008-tagging/app/widgets/gimptagentry.c
==============================================================================
--- branches/soc-2008-tagging/app/widgets/gimptagentry.c	(original)
+++ branches/soc-2008-tagging/app/widgets/gimptagentry.c	Sat Jul 26 18:23:52 2008
@@ -261,7 +261,7 @@
   gchar                       **parsed_tags;
   gint                          count;
   gint                          i;
-  GimpTag                       tag;
+  GimpTag                      *tag;
   GList                        *query_list = NULL;
 
   parsed_tags = gimp_tag_entry_parse_tags (entry);
@@ -270,8 +270,11 @@
     {
       if (strlen (parsed_tags[i]) > 0)
         {
-          tag = g_quark_try_string (parsed_tags[i]);
-          query_list = g_list_append (query_list, GUINT_TO_POINTER (tag));
+          tag = gimp_tag_try_new (parsed_tags[i]);
+          if (tag)
+            {
+              query_list = g_list_append (query_list, tag);
+            }
         }
     }
   g_strfreev (parsed_tags);
@@ -341,17 +344,17 @@
   gchar               **parsed_tags;
   gint                  count;
   gint                  i;
-  GimpTag               tag;
+  GimpTag              *tag;
   GList                *tag_list = NULL;
 
   parsed_tags = gimp_tag_entry_parse_tags (tag_entry);
   count = g_strv_length (parsed_tags);
   for (i = 0; i < count; i++)
     {
-      if (strlen (parsed_tags[i]) > 0)
+      if (gimp_tag_string_is_valid (parsed_tags[i]))
         {
-          tag = g_quark_from_string (parsed_tags[i]);
-          tag_list = g_list_append (tag_list, GUINT_TO_POINTER (tag));
+          tag = gimp_tag_new (parsed_tags[i]);
+          tag_list = g_list_append (tag_list, tag);
         }
     }
   g_strfreev (parsed_tags);
@@ -363,6 +366,8 @@
       gimp_tag_entry_item_set_tags (selected_item, tag_list);
       selected_iterator = g_list_next (selected_iterator);
     }
+
+  g_list_foreach (tag_list, (GFunc)g_object_unref, NULL);
   g_list_free (tag_list);
 }
 
@@ -377,8 +382,7 @@
   tags_iterator = old_tags;
   while (tags_iterator)
     {
-      gimp_tagged_remove_tag (tagged,
-                              GPOINTER_TO_UINT (tags_iterator->data));
+      gimp_tagged_remove_tag (tagged, GIMP_TAG (tags_iterator->data));
       tags_iterator = g_list_next (tags_iterator);
     }
   g_list_free (old_tags);
@@ -386,8 +390,8 @@
   tags_iterator = tags;
   while (tags_iterator)
     {
-      printf ("tagged: %s\n", g_quark_to_string (GPOINTER_TO_UINT (tags_iterator->data)));
-      gimp_tagged_add_tag (tagged, GPOINTER_TO_UINT (tags_iterator->data));
+      printf ("tagged: %s\n", gimp_tag_get_name (GIMP_TAG (tags_iterator->data)));
+      gimp_tagged_add_tag (tagged, GIMP_TAG (tags_iterator->data));
       tags_iterator = g_list_next (tags_iterator);
     }
 }
@@ -441,7 +445,7 @@
   GList        *tag_list;
   GList        *tag_iterator;
   gint          insert_pos;
-  GimpTag       tag;
+  GimpTag      *tag;
   gchar        *text;
 
   gtk_editable_delete_text (GTK_EDITABLE (tag_entry), 0, -1);
@@ -459,8 +463,8 @@
   tag_iterator = tag_list;
   while (tag_iterator)
     {
-      tag = GPOINTER_TO_UINT (tag_iterator->data);
-      text = g_strdup_printf ("%s, ", g_quark_to_string (tag));
+      tag = GIMP_TAG (tag_iterator->data);
+      text = g_strdup_printf ("%s, ", gimp_tag_get_name (tag));
       gtk_editable_insert_text (GTK_EDITABLE (tag_entry), text, strlen (text),
                                 &insert_pos);
       g_free (text);
@@ -521,7 +525,8 @@
   GList        *candidates = NULL;
   GList        *all_tags;
   GList        *tag_iterator;
-  GimpTag       tag;
+  GimpTag      *tag;
+  const gchar  *tag_name;
   gint          i;
   gint          length;
 
@@ -536,13 +541,14 @@
   length = g_strv_length (used_tags);
   while (tag_iterator)
     {
-      tag = GPOINTER_TO_UINT (tag_iterator->data);
-      if (g_str_has_prefix (g_quark_to_string (tag), prefix))
+      tag = GIMP_TAG (tag_iterator->data);
+      tag_name = gimp_tag_get_name (tag);
+      if (g_str_has_prefix (tag_name, prefix))
         {
           /* check if tag is not already entered */
           for (i = 0; i < length; i++)
             {
-              if (! strcmp (g_quark_to_string (tag), used_tags[i]))
+              if (! strcmp (tag_name, used_tags[i]))
                 {
                   break;
                 }
@@ -587,7 +593,7 @@
   length = g_list_length (candidates);
   if (length < 2)
     {
-      candidate_string = g_quark_to_string (GPOINTER_TO_UINT (candidates->data));
+      candidate_string = gimp_tag_get_name (GIMP_TAG (candidates->data));
       return g_strdup (candidate_string + prefix_length);
     }
 
@@ -595,8 +601,7 @@
   candidate_iterator = candidates;
   for (i = 0; i < length; i++)
     {
-      candidate_string =
-          g_quark_to_string (GPOINTER_TO_UINT (candidate_iterator->data));
+      candidate_string = gimp_tag_get_name (GIMP_TAG (candidate_iterator->data));
       completions[i] = candidate_string + prefix_length;
       candidate_iterator = g_list_next (candidate_iterator);
     }
@@ -615,7 +620,7 @@
           d = g_utf8_get_char (completions[i]);
           if (c != d)
             {
-              candidate_string = g_quark_to_string (GPOINTER_TO_UINT (candidates->data));
+              candidate_string = gimp_tag_get_name (GIMP_TAG (candidates->data));
               candidate_string += prefix_length;
               completion_end = g_utf8_offset_to_pointer (candidate_string,
                                                          num_chars_match);
@@ -634,7 +639,7 @@
     } while (c);
   g_free (completions);
 
-  candidate_string = g_quark_to_string (GPOINTER_TO_UINT (candidates->data));
+  candidate_string = gimp_tag_get_name (GIMP_TAG (candidates->data));
   return g_strdup (candidate_string + prefix_length);
 }
 



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