yakov pushed a commit to branch master. http://git.enlightenment.org/tools/erigo.git/commit/?id=4856c69885a5cef8c19497306f9e554840534d72
commit 4856c69885a5cef8c19497306f9e554840534d72 Author: Yakov Goldberg <yako...@samsung.com> Date: Mon Aug 24 18:14:36 2015 +0300 Add undo/redo support to widget's name/publicity change Now change of widget's name or public property can be undoed/redoed. --- src/bin/gui/descview.c | 30 +++++++++++++++++++++++------- src/bin/gui/editor.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/bin/gui/prop_layout.c | 1 - src/lib/undoredo.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/lib/undoredo.h | 4 +++- 5 files changed, 119 insertions(+), 9 deletions(-) diff --git a/src/bin/gui/descview.c b/src/bin/gui/descview.c index d4e872e..121916c 100644 --- a/src/bin/gui/descview.c +++ b/src/bin/gui/descview.c @@ -32,9 +32,16 @@ descview_build(const Gui_Widget *wdg) static Eina_Bool _wdg_public_change_cb(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) { - Eina_Bool state; - eo_do(obj, state = elm_obj_check_state_get()); - wdg_public_set(data, state); + Gui_Widget *wdg = data; + Eina_Bool new_state, old_state; + eo_do(obj, new_state = elm_obj_check_state_get()); + old_state = wdg_public_get(wdg); + wdg_public_set(wdg, new_state); + + const Gui_Context *ctx = wdg_context_get(wdg); + Gui_Memento *memento = NULL; + memento = gui_memento_new(wdg_eid_get(wdg), MEMENTO_WIDGET_PUBLIC, (void *) (intptr_t) old_state, (void *) (intptr_t) new_state); + gui_context_memento_add((Gui_Context *) ctx, memento); return EO_CALLBACK_CONTINUE; } @@ -43,10 +50,19 @@ static Eina_Bool _wdg_name_change_cb(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) { Gui_Widget *wdg = data; - const char *str = NULL; - eo_do(obj, str = elm_obj_widget_part_text_get(NULL)); - widget_name_change(wdg, str); - + const char *new_name = NULL; + char *old_name = NULL; + eo_do(obj, new_name = elm_obj_widget_part_text_get(NULL)); + old_name = strdup(wdg_name_get(wdg)); + /* If name change was successful, save memento. */ + if (widget_name_change(wdg, new_name)) + { + const Gui_Context *ctx = wdg_context_get(wdg); + Gui_Memento *memento = NULL; + memento = gui_memento_new(wdg_eid_get(wdg), MEMENTO_WIDGET_NAME, (void *) old_name, (void *) new_name); + gui_context_memento_add((Gui_Context *) ctx, memento); + } + free(old_name); return EO_CALLBACK_CONTINUE; } diff --git a/src/bin/gui/editor.c b/src/bin/gui/editor.c index f4fe11a..df5dc2d 100644 --- a/src/bin/gui/editor.c +++ b/src/bin/gui/editor.c @@ -3102,6 +3102,26 @@ _editor_undo(const Gui_Context *ctx) wdg_parent_set(wdg, eid_name_get(old_parent_id)); break; } + case MEMENTO_WIDGET_NAME: + { + Eid *wdg_id = gui_memento_wdg_get(memento); + if (wdg_id) + { + const char *old_name = (const char *)gui_memento_old_pointer_get(memento); + widget_name_change(wdg_get(wdg_id), old_name); + } + break; + } + case MEMENTO_WIDGET_PUBLIC: + { + Eid *wdg_id = gui_memento_wdg_get(memento); + if (wdg_id) + { + Eina_Bool old_public_state = (Eina_Bool) (intptr_t) gui_memento_old_pointer_get(memento); + wdg_public_set(wdg_get(wdg_id), old_public_state); + } + break; + } case MEMENTO_ACTION: { Eid *action_id = gui_memento_wdg_get(memento); @@ -3303,6 +3323,26 @@ _editor_redo(const Gui_Context *ctx) wdg_parent_set(wdg, eid_name_get(new_parent_id)); break; } + case MEMENTO_WIDGET_NAME: + { + Eid *wdg_id = gui_memento_wdg_get(memento); + if (wdg_id) + { + const char *new_name = (const char *) gui_memento_new_pointer_get(memento); + widget_name_change(wdg_get(wdg_id), new_name); + } + break; + } + case MEMENTO_WIDGET_PUBLIC: + { + Eid *wdg_id = gui_memento_wdg_get(memento); + if (wdg_id) + { + Eina_Bool new_public_state = (Eina_Bool) (intptr_t) gui_memento_new_pointer_get(memento); + wdg_public_set(wdg_get(wdg_id), new_public_state); + } + break; + } case MEMENTO_ACTION: { Eid *action_id = gui_memento_wdg_get(memento); @@ -3382,7 +3422,13 @@ _editor_undo_redo_post(const Gui_Memento *memento) } case MEMENTO_NONE: case MEMENTO_ACTION: + case MEMENTO_WIDGET_NAME: + { + break; + } + case MEMENTO_WIDGET_PUBLIC: { + proplayout_view_switch(DESCRIPTION_TYPE); break; } default: diff --git a/src/bin/gui/prop_layout.c b/src/bin/gui/prop_layout.c index 06ce705..52ed271 100644 --- a/src/bin/gui/prop_layout.c +++ b/src/bin/gui/prop_layout.c @@ -226,7 +226,6 @@ proplayout_build(const Gui_Widget *wdg) * This callback is used in Egui Layout JSON. */ void _proplayout_toolbar_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) -//(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info) { Elm_Object_Item *it = event_info; elm_toolbar_item_selected_set(it, EINA_TRUE); diff --git a/src/lib/undoredo.c b/src/lib/undoredo.c index 321499c..ac864ac 100644 --- a/src/lib/undoredo.c +++ b/src/lib/undoredo.c @@ -50,6 +50,16 @@ struct _Gui_Memento Eid *old_parent; Eid *new_parent; }; + struct + { + char *old_name; + char *new_name; + }; + struct + { + Eina_Bool old_public_state; + Eina_Bool new_public_state; + }; }; }; @@ -134,6 +144,18 @@ gui_memento_new(Eid *id, Gui_Memento_Type type, void *old_pointer, void *new_poi memento->new_parent = (Eid *) new_pointer; break; } + case MEMENTO_WIDGET_NAME: + { + memento->old_name = strdup((char *) old_pointer); + memento->new_name = strdup((char *) new_pointer); + break; + } + case MEMENTO_WIDGET_PUBLIC: + { + memento->old_public_state = (intptr_t) old_pointer; + memento->new_public_state = (intptr_t) new_pointer; + break; + } case MEMENTO_NONE: { break; @@ -198,9 +220,18 @@ gui_memento_del(Gui_Memento *memento) } case MEMENTO_WIDGET: case MEMENTO_WIDGET_PARENT: + case MEMENTO_WIDGET_PUBLIC: { break; } + case MEMENTO_WIDGET_NAME: + { + if (memento->old_name) + free(memento->old_name); + if (memento->new_name) + free(memento->new_name); + break; + } case MEMENTO_NONE: { break; @@ -294,6 +325,14 @@ gui_memento_old_pointer_get(const Gui_Memento *memento) { return (void *) memento->old_parent; } + case MEMENTO_WIDGET_NAME: + { + return (void *) memento->old_name; + } + case MEMENTO_WIDGET_PUBLIC: + { + return (void *) (intptr_t) memento->old_public_state; + } case MEMENTO_NONE: { break; @@ -343,6 +382,14 @@ gui_memento_new_pointer_get(const Gui_Memento *memento) { return (void *) memento->new_parent; } + case MEMENTO_WIDGET_NAME: + { + return (void *) memento->new_name; + } + case MEMENTO_WIDGET_PUBLIC: + { + return (void *) (intptr_t) memento->new_public_state; + } case MEMENTO_NONE: { break; diff --git a/src/lib/undoredo.h b/src/lib/undoredo.h index d608855..b31a3bb 100644 --- a/src/lib/undoredo.h +++ b/src/lib/undoredo.h @@ -12,7 +12,9 @@ typedef enum MEMENTO_OBJ_CONTAINER_PROPERTY, MEMENTO_ITEM_CONTAINER_ITEM, MEMENTO_WIDGET, - MEMENTO_WIDGET_PARENT + MEMENTO_WIDGET_PARENT, + MEMENTO_WIDGET_NAME, + MEMENTO_WIDGET_PUBLIC } Gui_Memento_Type; typedef struct _Gui_Memento Gui_Memento; --