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;

-- 


Reply via email to