ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=6c0d51322b6ae3fd006153c5384dc754e3d709d6

commit 6c0d51322b6ae3fd006153c5384dc754e3d709d6
Author: Andy Williams <[email protected]>
Date:   Tue Jun 14 22:47:22 2016 +0100

    elementary: Fix repeated undo of character deletion
    
    Let's not trigger further undo stack changes when we undo changes.
---
 src/lib/elementary/elm_code_widget.c             | 23 +++++--
 src/lib/elementary/elm_code_widget_private.h     |  1 +
 src/lib/elementary/elm_code_widget_undo.c        |  2 +-
 src/tests/elementary/elm_code_test_widget_undo.c | 78 ++++++++++++++++++++++++
 4 files changed, 99 insertions(+), 5 deletions(-)

diff --git a/src/lib/elementary/elm_code_widget.c 
b/src/lib/elementary/elm_code_widget.c
index 34e6279..dd72f6d 100644
--- a/src/lib/elementary/elm_code_widget.c
+++ b/src/lib/elementary/elm_code_widget.c
@@ -1043,7 +1043,7 @@ _elm_code_widget_change_free(Elm_Code_Widget_Change_Info 
*info)
 }
 
 void
-_elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const char 
*text, int length)
+_elm_code_widget_text_at_cursor_insert_do(Elm_Code_Widget *widget, const char 
*text, int length, Eina_Bool undo)
 {
    Elm_Code *code;
    Elm_Code_Line *line;
@@ -1071,9 +1071,24 @@ _elm_code_widget_text_at_cursor_insert(Elm_Code_Widget 
*widget, const char *text
    elm_obj_code_widget_cursor_position_set(widget, col + col_width, row);
    eo_event_callback_call(widget, ELM_OBJ_CODE_WIDGET_EVENT_CHANGED_USER, 
NULL);
 
-   change = _elm_code_widget_change_create(col, row, col + col_width - 1, row, 
text, length, EINA_TRUE);
-   _elm_code_widget_undo_change_add(widget, change);
-   _elm_code_widget_change_free(change);
+   if (undo)
+     {
+        change = _elm_code_widget_change_create(col, row, col + col_width - 1, 
row, text, length, EINA_TRUE);
+        _elm_code_widget_undo_change_add(widget, change);
+        _elm_code_widget_change_free(change);
+     }
+}
+
+void
+_elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const char 
*text, int length)
+{
+   _elm_code_widget_text_at_cursor_insert_do(widget, text, length, EINA_TRUE);
+}
+
+void
+_elm_code_widget_text_at_cursor_insert_no_undo(Elm_Code_Widget *widget, const 
char *text, int length)
+{
+   _elm_code_widget_text_at_cursor_insert_do(widget, text, length, EINA_FALSE);
 }
 
 static void
diff --git a/src/lib/elementary/elm_code_widget_private.h 
b/src/lib/elementary/elm_code_widget_private.h
index 09c5003..c3c5bb0 100644
--- a/src/lib/elementary/elm_code_widget_private.h
+++ b/src/lib/elementary/elm_code_widget_private.h
@@ -48,6 +48,7 @@ typedef struct
 void _elm_code_widget_cell_size_get(Elm_Code_Widget *widget, Evas_Coord 
*width, Evas_Coord *height);
 
 void _elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const 
char *text, int length);
+void _elm_code_widget_text_at_cursor_insert_no_undo(Elm_Code_Widget *widget, 
const char *text, int length);
 
 void _elm_code_widget_newline(Elm_Code_Widget *widget);
 
diff --git a/src/lib/elementary/elm_code_widget_undo.c 
b/src/lib/elementary/elm_code_widget_undo.c
index ccf621b..7c9113f 100644
--- a/src/lib/elementary/elm_code_widget_undo.c
+++ b/src/lib/elementary/elm_code_widget_undo.c
@@ -46,7 +46,7 @@ _elm_code_widget_undo_change(Evas_Object *widget,
    else
      {
         elm_code_widget_cursor_position_set(widget, info->start_col, 
info->start_line);
-        _elm_code_widget_text_at_cursor_insert(widget, info->content, 
info->length);
+        _elm_code_widget_text_at_cursor_insert_no_undo(widget, info->content, 
info->length);
      }
 }
 
diff --git a/src/tests/elementary/elm_code_test_widget_undo.c 
b/src/tests/elementary/elm_code_test_widget_undo.c
index b07a294..ddfc7b0 100644
--- a/src/tests/elementary/elm_code_test_widget_undo.c
+++ b/src/tests/elementary/elm_code_test_widget_undo.c
@@ -58,6 +58,43 @@ START_TEST (elm_code_test_widget_undo_text_insert)
 }
 END_TEST
 
+START_TEST (elm_code_test_widget_undo_text_insert_multiple)
+{
+   Elm_Code *code;
+   Elm_Code_File *file;
+   Elm_Code_Line *line;
+   Elm_Code_Widget *widget;
+   Evas_Object *win;
+   unsigned int length;
+   const char *content;
+
+   elm_init(1, NULL);
+   code = elm_code_create();
+   file = elm_code_file_new(code);
+   elm_code_file_line_append(file, "test", 4, NULL);
+
+   win = elm_win_add(NULL, "entry", ELM_WIN_BASIC);
+   widget = elm_code_widget_add(win, code);
+
+   _elm_code_widget_text_at_cursor_insert(widget, "a", 1);
+   _elm_code_widget_text_at_cursor_insert(widget, "b", 1);
+   line = elm_code_file_line_get(file, 1);
+   content = elm_code_line_text_get(line, &length);
+   ck_assert_strn_eq("abtest", content, length);
+
+   elm_code_widget_undo(widget);
+   content = elm_code_line_text_get(line, &length);
+   ck_assert_strn_eq("atest", content, length);
+
+   elm_code_widget_undo(widget);
+   content = elm_code_line_text_get(line, &length);
+   ck_assert_strn_eq("test", content, length);
+
+   elm_code_free(code);
+   elm_shutdown();
+}
+END_TEST
+
 START_TEST (elm_code_test_widget_undo_newline)
 {
    Elm_Code *code;
@@ -157,9 +194,50 @@ START_TEST (elm_code_test_widget_undo_delete)
 }
 END_TEST
 
+START_TEST (elm_code_test_widget_undo_delete_multiple)
+{
+   Elm_Code *code;
+   Elm_Code_File *file;
+   Elm_Code_Line *line;
+   Elm_Code_Widget *widget;
+   Evas_Object *win;
+   unsigned int length;
+   const char *content;
+
+   elm_init(1, NULL);
+   code = elm_code_create();
+   file = elm_code_file_new(code);
+   elm_code_file_line_append(file, "test", 4, NULL);
+
+   win = elm_win_add(NULL, "entry", ELM_WIN_BASIC);
+   widget = elm_code_widget_add(win, code);
+
+   elm_code_widget_cursor_position_set(widget, 4, 1);
+   _elm_code_widget_backspace(widget);
+   _elm_code_widget_backspace(widget);
+
+   line = elm_code_file_line_get(file, 1);
+   content = elm_code_line_text_get(line, &length);
+   ck_assert_strn_eq("tt", content, length);
+
+   elm_code_widget_undo(widget);
+   content = elm_code_line_text_get(line, &length);
+   ck_assert_strn_eq("tet", content, length);
+
+   elm_code_widget_undo(widget);
+   content = elm_code_line_text_get(line, &length);
+   ck_assert_strn_eq("test", content, length);
+
+   elm_code_free(code);
+   elm_shutdown();
+}
+END_TEST
+
 void elm_code_test_widget_undo(TCase *tc)
 {
    tcase_add_test(tc, elm_code_test_widget_undo_text_insert);
+   tcase_add_test(tc, elm_code_test_widget_undo_text_insert_multiple);
    tcase_add_test(tc, elm_code_test_widget_undo_newline);
    tcase_add_test(tc, elm_code_test_widget_undo_delete);
+   tcase_add_test(tc, elm_code_test_widget_undo_delete_multiple);
 }

-- 


Reply via email to