yakov pushed a commit to branch master. http://git.enlightenment.org/tools/erigo.git/commit/?id=5e647bf120677acf290af6893d1b3fc82739abdc
commit 5e647bf120677acf290af6893d1b3fc82739abdc Author: Yakov Goldberg <yako...@samsung.com> Date: Sun Nov 8 18:15:29 2015 +0200 Refactoring squash mechanism in memento_finalize() --- src/lib/undoredo.c | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/lib/undoredo.c b/src/lib/undoredo.c index 8563693..c3f36b6 100644 --- a/src/lib/undoredo.c +++ b/src/lib/undoredo.c @@ -6,7 +6,6 @@ struct _Memento_Command { Eid *eid; // wdg, action... Memento_Type type; - Eina_Bool delete_me : 1; union { struct @@ -278,17 +277,15 @@ memento_is_finalized(const Memento *memento) Eina_Bool memento_finalize(Memento *memento) { - Eina_List *itr, *itr2; + Eina_List *itr; Memento_Command *cmd, *cmd_next; memento->finalized = EINA_TRUE; - Eina_Bool change = EINA_TRUE; - while (change) + while (1) { - change = EINA_FALSE; + Eina_Bool cmd_del = EINA_FALSE; EINA_LIST_FOREACH(memento->cmds, itr, cmd) { - if (cmd->delete_me) continue; Eina_List *next = eina_list_next(itr); if (next) { @@ -301,13 +298,17 @@ memento_finalize(Memento *memento) void *tmp = cmd->new_ptr; cmd->new_ptr = cmd_next->new_ptr; cmd_next->new_ptr = tmp; - cmd_next->delete_me = EINA_TRUE; - change = EINA_TRUE; + + cmd_del = EINA_TRUE; + itr = next; + cmd = cmd_next; + break; } } if (cmd->old_ptr == cmd->new_ptr) { - cmd->delete_me = EINA_TRUE; + cmd_del = EINA_TRUE; + break; } if (cmd->type == MEMENTO_OBJ_CONTAINER_ITEM) { @@ -317,26 +318,25 @@ memento_finalize(Memento *memento) from_list = obj_container_contents_list_get(cmd->old_ptr); to_list = obj_container_contents_list_get(cmd->new_ptr); if (eina_list_count(from_list) != eina_list_count(to_list)) continue; - cmd->delete_me = EINA_TRUE; + cmd_del = EINA_TRUE; while (from_list) { if (obj_container_item_eid_get(eina_list_data_get(from_list)) != obj_container_item_eid_get(eina_list_data_get(to_list))) { - cmd->delete_me = EINA_FALSE; + cmd_del = EINA_FALSE; break; } from_list = eina_list_next(from_list); to_list = eina_list_next(to_list); } - + if (cmd_del) break; } if (cmd->type == MEMENTO_PROPERTY) { if (!prop_cmp(cmd->old_ptr, cmd->new_ptr)) { - cmd->delete_me = EINA_TRUE; /* To the moment of gui_context_finalize(), new property already is set in wdg. * Undo/redo works by adding/removing property pointer in wdg. * So if memento will be deleted, we will not be able to remove property from widgetŠ± @@ -346,16 +346,19 @@ memento_finalize(Memento *memento) Gui_Widget *wdg = wdg_get(cmd->eid); wdg_prop_remove(wdg, cmd->new_ptr); wdg_prop_add(wdg, cmd->old_ptr); + cmd_del = EINA_TRUE; + break; } } } - EINA_LIST_FOREACH_SAFE(memento->cmds, itr, itr2, cmd) + if (cmd_del) { - if (cmd->delete_me) - { - memento->cmds = eina_list_remove_list(memento->cmds, itr); - _cmd_del(cmd); - } + memento->cmds = eina_list_remove_list(memento->cmds, itr); + _cmd_del(cmd); + } + else + { + break; } } return !!memento->cmds; --