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



Author: aurisj
Date: Sun Jul 20 10:52:32 2008
New Revision: 26243
URL: http://svn.gnome.org/viewvc/gimp?rev=26243&view=rev

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

	* app/widgets/gimptagentry.c: treat tags as jellybeans (as atomic
	objects). When pressing backspace or delete, first select the whole
	tag, on the second press actually delete.



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

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	Sun Jul 20 10:52:32 2008
@@ -55,6 +55,10 @@
 static gboolean gimp_tag_entry_focus_out       (GtkWidget         *widget,
                                                 GdkEventFocus     *event,
                                                 gpointer           user_data);
+static void     gimp_tag_entry_backspace       (GtkEntry          *entry);
+static void     gimp_tag_entry_delete_from_cursor (GtkEntry            *entry,
+                                                   GtkDeleteType        delete_type,
+                                                   gint                 count);
 static void     gimp_tag_entry_query_tag       (GimpTagEntry      *entry);
 
 static void     gimp_tag_entry_assign_tags     (GimpTagEntry      *tag_entry);
@@ -79,6 +83,8 @@
                                                 GdkEventExpose    *event,
                                                 gpointer           user_data);
 
+static gboolean gimp_tag_entry_select_jellybean (GimpTagEntry             *entry);
+
 
 G_DEFINE_TYPE (GimpTagEntry, gimp_tag_entry, GTK_TYPE_ENTRY);
 
@@ -88,7 +94,10 @@
 static void
 gimp_tag_entry_class_init (GimpTagEntryClass *klass)
 {
-  /*GObjectClass *object_class = G_OBJECT_CLASS (klass);*/
+  GtkEntryClass        *entry_class = GTK_ENTRY_CLASS (klass);
+
+  entry_class->backspace                = gimp_tag_entry_backspace;
+  entry_class->delete_from_cursor       = gimp_tag_entry_delete_from_cursor;
 }
 
 static void
@@ -705,3 +714,93 @@
   return FALSE;
 }
 
+static void
+gimp_tag_entry_backspace (GtkEntry     *entry)
+{
+  if (! gimp_tag_entry_select_jellybean (GIMP_TAG_ENTRY (entry)))
+    {
+      GTK_ENTRY_CLASS (parent_class)->backspace (entry);
+    }
+}
+
+static void
+gimp_tag_entry_delete_from_cursor (GtkEntry            *entry,
+                                   GtkDeleteType        delete_type,
+                                   gint                 count)
+{
+  if (count != 1
+      || ! gimp_tag_entry_select_jellybean (GIMP_TAG_ENTRY (entry)))
+    {
+      GTK_ENTRY_CLASS (parent_class)->delete_from_cursor (entry, delete_type,
+                                                          count);
+    }
+}
+
+static gboolean
+gimp_tag_entry_select_jellybean (GimpTagEntry             *entry)
+{
+  gchar        *original_string;
+  gchar        *jellybean_start;
+  gchar        *jellybean;
+  gchar        *cursor;
+  gint          position;
+  gint          i;
+  gunichar      separator;
+  gunichar      c;
+  gint          selection_start;
+  gint          selection_end;
+
+  gtk_editable_get_selection_bounds (GTK_EDITABLE (entry),
+                                     &selection_start, &selection_end);
+  if (selection_start != selection_end)
+    {
+      return FALSE;
+    }
+
+  original_string = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+  position = gtk_editable_get_position (GTK_EDITABLE (entry));
+  cursor = original_string;
+  jellybean_start = original_string;
+  separator = g_utf8_get_char (TAG_SEPARATOR_STR);
+  for (i = 0; i < position; i++)
+    {
+      c = g_utf8_get_char (cursor);
+      cursor = g_utf8_next_char (cursor);
+      if (c == separator)
+        {
+          jellybean_start = cursor;
+        }
+    }
+  do
+    {
+      c = g_utf8_get_char (cursor);
+      cursor = g_utf8_next_char (cursor);
+      if (c == separator)
+        {
+          *cursor = '\0';
+          break;
+        }
+    } while (c);
+
+  jellybean = jellybean_start;
+  while (*jellybean
+         && g_unichar_isspace (g_utf8_get_char (jellybean)))
+    {
+      jellybean = g_utf8_next_char (jellybean);
+    }
+  if (strlen (jellybean) <= 0)
+    {
+      return FALSE;
+    }
+
+  selection_start = g_utf8_pointer_to_offset (original_string, jellybean);
+  selection_end = g_utf8_pointer_to_offset (original_string,
+                                            jellybean + strlen (jellybean));
+  g_free (original_string);
+
+  gtk_editable_select_region (GTK_EDITABLE (entry),
+                             selection_start, selection_end);
+
+  return TRUE;
+}
+



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