elementary: Fix repeated undo of character deletion

Let's not trigger further undo stack changes when we undo changes.
This commit is contained in:
Andy Williams 2016-06-14 22:47:22 +01:00
parent d6dd63f762
commit 6c0d51322b
4 changed files with 99 additions and 5 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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);
}