forked from enlightenment/efl
elementary: Fix repeated undo of character deletion
Let's not trigger further undo stack changes when we undo changes.
This commit is contained in:
parent
d6dd63f762
commit
6c0d51322b
|
@ -1043,7 +1043,7 @@ _elm_code_widget_change_free(Elm_Code_Widget_Change_Info *info)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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 *code;
|
||||||
Elm_Code_Line *line;
|
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);
|
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);
|
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);
|
if (undo)
|
||||||
_elm_code_widget_undo_change_add(widget, change);
|
{
|
||||||
_elm_code_widget_change_free(change);
|
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
|
static void
|
||||||
|
|
|
@ -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_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(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);
|
void _elm_code_widget_newline(Elm_Code_Widget *widget);
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ _elm_code_widget_undo_change(Evas_Object *widget,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
elm_code_widget_cursor_position_set(widget, info->start_col, info->start_line);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,43 @@ START_TEST (elm_code_test_widget_undo_text_insert)
|
||||||
}
|
}
|
||||||
END_TEST
|
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)
|
START_TEST (elm_code_test_widget_undo_newline)
|
||||||
{
|
{
|
||||||
Elm_Code *code;
|
Elm_Code *code;
|
||||||
|
@ -157,9 +194,50 @@ START_TEST (elm_code_test_widget_undo_delete)
|
||||||
}
|
}
|
||||||
END_TEST
|
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)
|
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);
|
||||||
|
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_newline);
|
||||||
tcase_add_test(tc, elm_code_test_widget_undo_delete);
|
tcase_add_test(tc, elm_code_test_widget_undo_delete);
|
||||||
|
tcase_add_test(tc, elm_code_test_widget_undo_delete_multiple);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue