[gimp] app: simplify mouse selection by using iters instead of indices



commit 78ea82df1fee8fce16ce39ddffb1a78f9c860835
Author: Michael Natterer <mitch gimp org>
Date:   Tue Mar 2 12:23:29 2010 +0100

    app: simplify mouse selection by using iters instead of indices
    
    This also removes the evil code dupication added yesterday, and is
    generally less and cleaner code.

 app/tools/gimptexttool-editor.c |   93 +++++++++++---------------------------
 app/tools/gimptexttool.h        |    2 +-
 2 files changed, 28 insertions(+), 67 deletions(-)
---
diff --git a/app/tools/gimptexttool-editor.c b/app/tools/gimptexttool-editor.c
index e4e9fd3..29ddf1b 100644
--- a/app/tools/gimptexttool-editor.c
+++ b/app/tools/gimptexttool-editor.c
@@ -84,10 +84,10 @@ static void   gimp_text_tool_editor_destroy     (GtkWidget       *dialog,
                                                  GimpTextTool    *text_tool);
 static void   gimp_text_tool_enter_text         (GimpTextTool    *text_tool,
                                                  const gchar     *str);
-static gint   gimp_text_tool_xy_to_index        (GimpTextTool    *text_tool,
+static void   gimp_text_tool_xy_to_iter         (GimpTextTool    *text_tool,
                                                  gdouble          x,
                                                  gdouble          y,
-                                                 gboolean        *trailing);
+                                                 GtkTextIter     *iter);
 static void   gimp_text_tool_im_commit          (GtkIMContext    *context,
                                                  const gchar     *str,
                                                  GimpTextTool    *text_tool);
@@ -275,24 +275,14 @@ gimp_text_tool_editor_button_press (GimpTextTool        *text_tool,
   GtkTextBuffer *buffer = GTK_TEXT_BUFFER (text_tool->buffer);
   GtkTextIter    cursor;
   GtkTextIter    selection;
-  gint           index;
-  gboolean       trailing;
 
-  index = gimp_text_tool_xy_to_index (text_tool, x, y, &trailing);
-
-  gimp_text_buffer_get_iter_at_index (text_tool->buffer, &cursor, index, TRUE);
-  if (trailing)
-    {
-      gtk_text_iter_forward_char (&cursor);
-      index = gimp_text_buffer_get_iter_index (text_tool->buffer,
-                                               &cursor, TRUE);
-    }
+  gimp_text_tool_xy_to_iter (text_tool, x, y, &cursor);
 
   selection = cursor;
 
-  text_tool->select_start_index = index;
-  text_tool->select_words       = FALSE;
-  text_tool->select_lines       = FALSE;
+  text_tool->select_start_iter = cursor;
+  text_tool->select_words      = FALSE;
+  text_tool->select_lines      = FALSE;
 
   switch (press_type)
     {
@@ -348,24 +338,18 @@ gimp_text_tool_editor_motion (GimpTextTool *text_tool,
                               gdouble       y)
 {
   GtkTextBuffer *buffer = GTK_TEXT_BUFFER (text_tool->buffer);
+  GtkTextIter    old_cursor;
+  GtkTextIter    old_selection;
   GtkTextIter    cursor;
   GtkTextIter    selection;
-  gint           cursor_index;
-  gint           selection_index;
-  gint           index;
-  gboolean       trailing;
-
-  index = gimp_text_tool_xy_to_index (text_tool, x, y, &trailing);
 
-  gtk_text_buffer_get_iter_at_mark (buffer, &cursor,
+  gtk_text_buffer_get_iter_at_mark (buffer, &old_cursor,
                                     gtk_text_buffer_get_insert (buffer));
-  gtk_text_buffer_get_iter_at_mark (buffer, &selection,
+  gtk_text_buffer_get_iter_at_mark (buffer, &old_selection,
                                     gtk_text_buffer_get_selection_bound (buffer));
 
-  cursor_index    = gimp_text_buffer_get_iter_index (text_tool->buffer,
-                                                     &cursor, TRUE);
-  selection_index = gimp_text_buffer_get_iter_index (text_tool->buffer,
-                                                     &selection, TRUE);
+  gimp_text_tool_xy_to_iter (text_tool, x, y, &cursor);
+  selection = text_tool->select_start_iter;
 
   if (text_tool->select_words ||
       text_tool->select_lines)
@@ -373,19 +357,7 @@ gimp_text_tool_editor_motion (GimpTextTool *text_tool,
       GtkTextIter start;
       GtkTextIter end;
 
-      gimp_text_buffer_get_iter_at_index (text_tool->buffer, &cursor,
-                                          index, TRUE);
-      if (trailing)
-        {
-          gtk_text_iter_forward_char (&cursor);
-          index = gimp_text_buffer_get_iter_index (text_tool->buffer,
-                                                   &cursor, TRUE);
-        }
-
-      gimp_text_buffer_get_iter_at_index (text_tool->buffer, &selection,
-                                          text_tool->select_start_index, TRUE);
-
-      if (index <= text_tool->select_start_index)
+      if (gtk_text_iter_compare (&cursor, &selection) < 0)
         {
           start = cursor;
           end   = selection;
@@ -411,7 +383,7 @@ gimp_text_tool_editor_motion (GimpTextTool *text_tool,
           gtk_text_iter_forward_to_line_end (&end);
         }
 
-      if (index <= text_tool->select_start_index)
+      if (gtk_text_iter_compare (&cursor, &selection) < 0)
         {
           cursor    = start;
           selection = end;
@@ -422,24 +394,9 @@ gimp_text_tool_editor_motion (GimpTextTool *text_tool,
           cursor    = end;
         }
     }
-  else
-    {
-      gimp_text_buffer_get_iter_at_index (text_tool->buffer, &cursor,
-                                          index, TRUE);
-      if (trailing)
-        {
-          gtk_text_iter_forward_char (&cursor);
-          index = gimp_text_buffer_get_iter_index (text_tool->buffer,
-                                                   &cursor, TRUE);
-        }
-    }
 
-  if (cursor_index    != gimp_text_buffer_get_iter_index (text_tool->buffer,
-                                                          &cursor,
-                                                          TRUE) ||
-      selection_index != gimp_text_buffer_get_iter_index (text_tool->buffer,
-                                                          &selection,
-                                                          TRUE))
+  if (! gtk_text_iter_equal (&cursor,    &old_cursor) ||
+      ! gtk_text_iter_equal (&selection, &old_selection))
     {
       gimp_draw_tool_pause (GIMP_DRAW_TOOL (text_tool));
 
@@ -1230,15 +1187,16 @@ gimp_text_tool_enter_text (GimpTextTool *text_tool,
   gimp_draw_tool_resume (GIMP_DRAW_TOOL (text_tool));
 }
 
-static gint
-gimp_text_tool_xy_to_index (GimpTextTool *text_tool,
-                            gdouble       x,
-                            gdouble       y,
-                            gboolean     *trailing)
+static void
+gimp_text_tool_xy_to_iter (GimpTextTool *text_tool,
+                           gdouble       x,
+                           gdouble       y,
+                           GtkTextIter  *iter)
 {
   PangoLayout    *layout;
   PangoRectangle  ink_extents;
   gint            index;
+  gint            trailing;
 
   gimp_text_tool_ensure_layout (text_tool);
 
@@ -1257,9 +1215,12 @@ gimp_text_tool_xy_to_index (GimpTextTool *text_tool,
   pango_layout_xy_to_index (layout,
                             x * PANGO_SCALE,
                             y * PANGO_SCALE,
-                            &index, trailing);
+                            &index, &trailing);
 
-  return index;
+  gimp_text_buffer_get_iter_at_index (text_tool->buffer, iter, index, TRUE);
+
+  if (trailing)
+    gtk_text_iter_forward_char (iter);
 }
 
 static void
diff --git a/app/tools/gimptexttool.h b/app/tools/gimptexttool.h
index e4cacb7..4e9da23 100644
--- a/app/tools/gimptexttool.h
+++ b/app/tools/gimptexttool.h
@@ -69,7 +69,7 @@ struct _GimpTextTool
   GtkWidget      *style_editor;
 
   gboolean        selecting;
-  gint            select_start_index;
+  GtkTextIter     select_start_iter;
   gboolean        select_words;
   gboolean        select_lines;
 



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