yakov pushed a commit to branch master.

http://git.enlightenment.org/tools/erigo.git/commit/?id=aac7fd9b446199c4e47de555cd9c98817a16da92

commit aac7fd9b446199c4e47de555cd9c98817a16da92
Author: Yakov Goldberg <yako...@samsung.com>
Date:   Tue Nov 17 17:08:01 2015 +0200

    Refactoring popup internals
    
    Get rid of global variables and save all needed data in object itself.
    It allows to have multiple popup windows.
---
 src/bin/gui/popup.c | 66 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 29 deletions(-)

diff --git a/src/bin/gui/popup.c b/src/bin/gui/popup.c
index f031257..072fd70 100644
--- a/src/bin/gui/popup.c
+++ b/src/bin/gui/popup.c
@@ -5,58 +5,66 @@
 
 #include "elm_widget.h"
 
-/* Only one popup at the moment is supported */
-static Eo *_popup = NULL;
+#define POPUP_WIN "__popup_win__"
+#define POPUP_CB "__popup_cb__"
+#define POPUP_CB_DATA "__popup_cb_data___"
 
-/* User callback to be called after popup closes. */
-static Popup_Cb _popup_cb = NULL;
-static void *_data = NULL;
+
+#define DATA_SET(btn, popup, cb, data) \
+   ({ \
+        eo_do(btn, eo_key_data_set(POPUP_WIN, popup)); \
+        eo_do(btn, eo_key_data_set(POPUP_CB, cb)); \
+        eo_do(btn, eo_key_data_set(POPUP_CB_DATA, data)); \
+    })
 
 static Eina_Bool
-_popup_close_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description 
*desc EINA_UNUSED, void *event_info EINA_UNUSED)
+_popup_close_cb(void *data, Eo *obj, const Eo_Event_Description *desc 
EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Popup_Button_Type _pressed_button_type = (uintptr_t) data;
    /* Delete popup and call a callback afterwards. */
-   eo_del(_popup);
 
-   if (_popup_cb)
+   Eo *popup;
+   Popup_Cb cb;
+   void *cb_data;
+
+   eo_do(obj, popup = eo_key_data_get(POPUP_WIN));
+   eo_do(obj, cb = eo_key_data_get(POPUP_CB));
+   eo_do(obj, cb_data = eo_key_data_get(POPUP_CB_DATA));
+
+   eo_del(popup);
+
+   if (cb)
      {
-       _popup_cb(_pressed_button_type, _data);
+        cb(_pressed_button_type, cb_data);
      }
-
-   _popup = NULL;
-   _popup_cb = NULL;
-   _data = 0;
    return EINA_TRUE;
 }
 
 void
 popup_show(void *parent, const char *title, const char *text, 
Popup_Button_Type button_type, Popup_Cb cb, void *data)
 {
-   if (_popup) return;
-   _popup = eo_add(ELM_POPUP_CLASS, parent);
-   _popup_cb = cb;
-   _data = data;
+   Eo *popup = eo_add(ELM_POPUP_CLASS, parent);
 
-   eo_do(_popup, elm_obj_widget_part_text_set("title,text", title));
-   eo_do(_popup, elm_obj_widget_part_text_set(NULL, text));
+   eo_do(popup, elm_obj_widget_part_text_set("title,text", title),
+                elm_obj_widget_part_text_set(NULL, text));
 
    if (button_type & POPUP_OK_BUTTON)
      {
-        Eo *btn = eo_add(ELM_BUTTON_CLASS, _popup);
-        eo_do(btn, elm_obj_widget_part_text_set(NULL, "OK"));
-        eo_do(_popup, elm_obj_container_content_set("button1", btn));
-        eo_do(btn, 
eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _popup_close_cb, 
(void*)(uintptr_t) POPUP_OK_BUTTON));
+        Eo *btn = eo_add(ELM_BUTTON_CLASS, popup);
+        eo_do(btn, elm_obj_widget_part_text_set(NULL, "OK"),
+                   
eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _popup_close_cb, 
(void*)(uintptr_t) POPUP_OK_BUTTON));
+        eo_do(popup, elm_obj_container_content_set("button1", btn));
+        DATA_SET(btn, popup, cb, data);
      }
 
    if (button_type & POPUP_CANCEL_BUTTON)
      {
-        Eo *btn = eo_add(ELM_BUTTON_CLASS, _popup);
-        eo_do(btn, elm_obj_widget_part_text_set(NULL, "Cancel"));
-        eo_do(_popup, elm_obj_container_content_set("button2", btn));
-        eo_do(btn, 
eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _popup_close_cb, 
(void*)(uintptr_t) POPUP_CANCEL_BUTTON));
+        Eo *btn = eo_add(ELM_BUTTON_CLASS, popup);
+        eo_do(btn, elm_obj_widget_part_text_set(NULL, "Cancel"),
+                   
eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _popup_close_cb, 
(void*)(uintptr_t) POPUP_CANCEL_BUTTON));
+        eo_do(popup, elm_obj_container_content_set("button2", btn));
+        DATA_SET(btn, popup, cb, data);
      }
-
-   eo_do(_popup, efl_gfx_visible_set(EINA_TRUE));
+   eo_do(popup, efl_gfx_visible_set(EINA_TRUE));
 }
 

-- 


Reply via email to