[gimp] app: simplify mouse selection by using iters instead of indices
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: simplify mouse selection by using iters instead of indices
- Date: Tue, 2 Mar 2010 17:43:48 +0000 (UTC)
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]