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



Author: aurisj
Date: Mon Jun 30 19:57:29 2008
New Revision: 26026
URL: http://svn.gnome.org/viewvc/gimp?rev=26026&view=rev

Log:
2008-06-30  Aurimas JuÅka  <aurisj svn gnome org>

	* app/widgets/gimpdatafactoryview.[ch]
	* app/widgets/gimptagentry.[ch]: tag assignment GUI support.



Modified:
   branches/soc-2008-tagging/ChangeLog
   branches/soc-2008-tagging/app/widgets/gimpdatafactoryview.c
   branches/soc-2008-tagging/app/widgets/gimpdatafactoryview.h
   branches/soc-2008-tagging/app/widgets/gimptagentry.c
   branches/soc-2008-tagging/app/widgets/gimptagentry.h

Modified: branches/soc-2008-tagging/app/widgets/gimpdatafactoryview.c
==============================================================================
--- branches/soc-2008-tagging/app/widgets/gimpdatafactoryview.c	(original)
+++ branches/soc-2008-tagging/app/widgets/gimpdatafactoryview.c	Mon Jun 30 19:57:29 2008
@@ -54,6 +54,8 @@
 
 static void   gimp_data_factory_view_activate_item  (GimpContainerEditor *editor,
                                                      GimpViewable        *viewable);
+static void   gimp_data_factory_view_select_item    (GimpContainerEditor *editor,
+                                                     GimpViewable        *viewable);
 static void gimp_data_factory_view_tree_name_edited (GtkCellRendererText *cell,
                                                      const gchar         *path,
                                                      const gchar         *name,
@@ -70,6 +72,7 @@
 {
   GimpContainerEditorClass *editor_class = GIMP_CONTAINER_EDITOR_CLASS (klass);
 
+  editor_class->select_item   = gimp_data_factory_view_select_item;
   editor_class->activate_item = gimp_data_factory_view_activate_item;
 }
 
@@ -83,6 +86,8 @@
   view->refresh_button   = NULL;
 
   view->filtered_container = NULL;
+
+  view->selected_items   = NULL;
 }
 
 GtkWidget *
@@ -134,7 +139,6 @@
 {
   GimpContainerEditor *editor;
   gchar               *str;
-  GtkWidget           *tag_query_entry;
 
   g_return_val_if_fail (GIMP_IS_DATA_FACTORY_VIEW (factory_view), FALSE);
   g_return_val_if_fail (GIMP_IS_DATA_FACTORY (factory), FALSE);
@@ -221,23 +225,60 @@
 
   gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
 
-  tag_query_entry = gimp_tag_entry_new (GIMP_FILTERED_CONTAINER (factory_view->filtered_container),
-                                        GIMP_TAG_ENTRY_MODE_QUERY);
-  gtk_widget_show (tag_query_entry);
-
   editor = GIMP_CONTAINER_EDITOR (factory_view);
 
+  factory_view->query_tag_entry =
+      gimp_tag_entry_new (GIMP_FILTERED_CONTAINER (factory_view->filtered_container),
+                          GIMP_TAG_ENTRY_MODE_QUERY);
+  gtk_widget_show (factory_view->query_tag_entry);
   gtk_box_pack_start (GTK_BOX (editor->view),
-                      tag_query_entry,
+                      factory_view->query_tag_entry,
                       FALSE, FALSE, 0);
   gtk_box_reorder_child (GTK_BOX (editor->view),
-                         tag_query_entry, 0);
+                         factory_view->query_tag_entry, 0);
 
+  factory_view->assign_tag_entry =
+      gimp_tag_entry_new (GIMP_FILTERED_CONTAINER (factory_view->filtered_container),
+                          GIMP_TAG_ENTRY_MODE_ASSIGN);
+  gimp_tag_entry_set_selected_items (GIMP_TAG_ENTRY (factory_view->assign_tag_entry),
+                                     factory_view->selected_items);
+  g_list_free (factory_view->selected_items);
+  factory_view->selected_items = NULL;
+  gtk_widget_show (factory_view->assign_tag_entry);
+  gtk_box_pack_end (GTK_BOX (editor->view),
+                    factory_view->assign_tag_entry,
+                    FALSE, FALSE, 0);
 
   return TRUE;
 }
 
 static void
+gimp_data_factory_view_select_item (GimpContainerEditor *editor,
+                                    GimpViewable        *viewable)
+{
+  GimpDataFactoryView *view = GIMP_DATA_FACTORY_VIEW (editor);
+  GList               *active_items = NULL;
+
+  if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item)
+    GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item (editor, viewable);
+
+  if (view->assign_tag_entry)
+    {
+      if (viewable)
+        {
+          active_items = g_list_append (active_items, viewable);
+        }
+      gimp_tag_entry_set_selected_items (GIMP_TAG_ENTRY (view->assign_tag_entry),
+                                         active_items);
+      g_list_free (active_items);
+    }
+  else
+    {
+      active_items = g_list_append (active_items, viewable);
+    }
+}
+
+static void
 gimp_data_factory_view_activate_item (GimpContainerEditor *editor,
                                       GimpViewable        *viewable)
 {

Modified: branches/soc-2008-tagging/app/widgets/gimpdatafactoryview.h
==============================================================================
--- branches/soc-2008-tagging/app/widgets/gimpdatafactoryview.h	(original)
+++ branches/soc-2008-tagging/app/widgets/gimpdatafactoryview.h	Mon Jun 30 19:57:29 2008
@@ -43,6 +43,10 @@
   GimpDataFactory     *factory;
   GimpContainer       *filtered_container;
 
+  GtkWidget           *query_tag_entry;
+  GtkWidget           *assign_tag_entry;
+  GList               *selected_items;
+
   GtkWidget           *edit_button;
   GtkWidget           *new_button;
   GtkWidget           *duplicate_button;

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	Mon Jun 30 19:57:29 2008
@@ -31,15 +31,21 @@
 #include "core/gimpfilteredcontainer.h"
 #include "core/gimpcontext.h"
 #include "core/gimpviewable.h"
+#include "core/gimptagged.h"
 
 #include "gimptagentry.h"
 
-
+static void     gimp_tag_entry_activate        (GtkEntry          *entry,
+                                                gpointer           unused);
 static void     gimp_tag_entry_changed         (GtkEntry          *entry,
-                                                GimpTagEntry      *view);
+                                                gpointer           unused);
 
 static void     gimp_tag_entry_query_tag       (GimpTagEntry      *entry);
 
+static void     gimp_tag_entry_assign_tags     (GimpTagEntry      *tag_entry);
+static void     gimp_tag_entry_item_set_tags   (GimpTagged        *entry,
+                                                GList             *tags);
+
 static gchar ** gimp_tag_entry_parse_tags      (GimpTagEntry      *entry);
 
 G_DEFINE_TYPE (GimpTagEntry, gimp_tag_entry, GTK_TYPE_ENTRY);
@@ -50,15 +56,22 @@
 static void
 gimp_tag_entry_class_init (GimpTagEntryClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  /*GObjectClass *object_class = G_OBJECT_CLASS (klass);*/
 }
 
 static void
 gimp_tag_entry_init (GimpTagEntry *entry)
 {
+  entry->tagged_container      = NULL;
+  entry->selected_items          = NULL;
+  entry->mode                  = GIMP_TAG_ENTRY_MODE_QUERY;
+
+  g_signal_connect (entry, "activate",
+                    G_CALLBACK (gimp_tag_entry_activate),
+                    NULL);
   g_signal_connect (entry, "changed",
                     G_CALLBACK (gimp_tag_entry_changed),
-                    entry);
+                    NULL);
 }
 
 GtkWidget *
@@ -79,18 +92,30 @@
 }
 
 static void
+gimp_tag_entry_activate (GtkEntry              *entry,
+                         gpointer               unused)
+{
+  GimpTagEntry         *tag_entry;
+
+  tag_entry = GIMP_TAG_ENTRY (entry);
+
+  if (tag_entry->mode == GIMP_TAG_ENTRY_MODE_ASSIGN)
+    {
+      gimp_tag_entry_assign_tags (GIMP_TAG_ENTRY (entry));
+    }
+}
+
+static void
 gimp_tag_entry_changed (GtkEntry          *entry,
-                        GimpTagEntry      *view)
+                        gpointer           unused)
 {
   GimpTagEntry         *tag_entry;
 
   tag_entry = GIMP_TAG_ENTRY (entry);
 
-  switch (tag_entry->mode)
+  if (tag_entry->mode == GIMP_TAG_ENTRY_MODE_QUERY)
     {
-      case GIMP_TAG_ENTRY_MODE_QUERY:
-          gimp_tag_entry_query_tag (entry);
-          break;
+      gimp_tag_entry_query_tag (GIMP_TAG_ENTRY (entry));
     }
 }
 
@@ -120,6 +145,65 @@
                                       query_list);
 }
 
+static void
+gimp_tag_entry_assign_tags (GimpTagEntry       *tag_entry)
+{
+  GList                *selected_iterator = NULL;
+  GimpTagged           *selected_item;
+  gchar               **parsed_tags;
+  gint                  count;
+  gint                  i;
+  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)
+        {
+          tag = g_quark_from_string (parsed_tags[i]);
+          tag_list = g_list_append (tag_list, GUINT_TO_POINTER (tag));
+        }
+    }
+  g_strfreev (parsed_tags);
+
+  selected_iterator = tag_entry->selected_items;
+  while (selected_iterator)
+    {
+      selected_item = GIMP_TAGGED (selected_iterator->data);
+      gimp_tag_entry_item_set_tags (selected_item, tag_list);
+      selected_iterator = g_list_next (selected_iterator);
+    }
+  g_list_free (tag_list);
+}
+
+static void
+gimp_tag_entry_item_set_tags (GimpTagged       *tagged,
+                              GList            *tags)
+{
+  GList        *old_tags;
+  GList        *tags_iterator;
+
+  old_tags = g_list_copy (gimp_tagged_get_tags (tagged));
+  tags_iterator = old_tags;
+  while (tags_iterator)
+    {
+      gimp_tagged_remove_tag (tagged,
+                              GPOINTER_TO_UINT (tags_iterator->data));
+      tags_iterator = g_list_next (tags_iterator);
+    }
+  g_list_free (old_tags);
+
+  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));
+      tags_iterator = g_list_next (tags_iterator);
+    }
+}
+
 static gchar **
 gimp_tag_entry_parse_tags (GimpTagEntry        *entry)
 {
@@ -129,7 +213,7 @@
   gint                  length;
   gint                  i;
 
-  tag_str = gtk_entry_get_text (GIMP_TAG_ENTRY (entry));
+  tag_str = gtk_entry_get_text (GTK_ENTRY (entry));
   split_tags = g_strsplit (tag_str, ",", 0);
   length = g_strv_length (split_tags);
   parsed_tags = g_malloc ((length + 1) * sizeof (gchar **));
@@ -143,3 +227,16 @@
   return parsed_tags;
 }
 
+void
+gimp_tag_entry_set_selected_items (GimpTagEntry            *entry,
+                                   GList                   *items)
+{
+  if (entry->selected_items)
+    {
+      g_list_free (entry->selected_items);
+      entry->selected_items = NULL;
+    }
+
+  entry->selected_items = g_list_copy (items);
+}
+

Modified: branches/soc-2008-tagging/app/widgets/gimptagentry.h
==============================================================================
--- branches/soc-2008-tagging/app/widgets/gimptagentry.h	(original)
+++ branches/soc-2008-tagging/app/widgets/gimptagentry.h	Mon Jun 30 19:57:29 2008
@@ -34,7 +34,7 @@
 typedef enum
 {
   GIMP_TAG_ENTRY_MODE_QUERY,
-  GIMP_TAG_ENTRY_MODE_ENTER,
+  GIMP_TAG_ENTRY_MODE_ASSIGN,
 } GimpTagEntryMode;
 
 typedef struct _GimpTagEntryClass  GimpTagEntryClass;
@@ -44,6 +44,7 @@
   GtkEntry                      parent_instance;
 
   GimpFilteredContainer        *tagged_container;
+  GList                        *selected_items;
   GimpTagEntryMode              mode;
 };
 
@@ -58,5 +59,8 @@
 GtkWidget * gimp_tag_entry_new      (GimpFilteredContainer     *tagged_container,
                                      GimpTagEntryMode           mode);
 
+void        gimp_tag_entry_set_selected_items (GimpTagEntry        *tag_entry,
+                                               GList               *items);
+
 
 #endif  /*  __GIMP_TAG_ENTRY_H__  */



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