discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=5da62d9adf9c2ff6672ffbe6765e53a9937e0e24

commit 5da62d9adf9c2ff6672ffbe6765e53a9937e0e24
Author: Mike Blumenkrantz <[email protected]>
Date:   Tue Sep 6 11:11:51 2016 -0400

    add drop handlers for gadgets
    
    a simple wrapper around existing e_dnd functionality
---
 src/bin/e_gadget.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/bin/e_gadget.h | 10 +++++++++
 2 files changed, 69 insertions(+)

diff --git a/src/bin/e_gadget.c b/src/bin/e_gadget.c
index d5bf1b0..ba5e41a 100644
--- a/src/bin/e_gadget.c
+++ b/src/bin/e_gadget.c
@@ -64,6 +64,8 @@ struct E_Gadget_Config
       void *data;
    } allow_deny;
 
+   Eina_Hash *drop_handlers;
+
    double x, y; //fixed % positioning
    double w, h; //fixed % sizing
    Evas_Point offset; //offset from mouse down
@@ -262,6 +264,7 @@ _gadget_object_free(E_Object *eobj)
         evas_object_event_callback_del_full(zgc->display, EVAS_CALLBACK_DEL, 
_gadget_del, zgc);
         E_FREE_FUNC(zgc->display, evas_object_del);
      }
+   E_FREE_FUNC(zgc->drop_handlers, eina_hash_free);
    E_FREE_FUNC(zgc->gadget, evas_object_del);
    E_FREE_FUNC(zgc->cfg_object, evas_object_del);
    E_FREE_FUNC(zgc->style.obj, evas_object_del);
@@ -1389,6 +1392,62 @@ e_gadget_type_iterator_get(void)
    return gadget_types ? eina_hash_iterator_key_new(gadget_types) : NULL;
 }
 
+static void
+_gadget_drop_handler_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object 
*obj, void *event_info EINA_UNUSED)
+{
+   int x, y, w, h;
+
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+   e_drop_handler_geometry_set(data, x, y, w, h);
+}
+
+static void
+_gadget_drop_handler_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, 
void *event_info EINA_UNUSED)
+{
+   E_Gadget_Config *zgc = data;
+
+   eina_hash_del_by_key(zgc->drop_handlers, &obj);
+   e_object_del(evas_object_data_get(obj, "gadget_drop_handler"));
+}
+
+E_API Evas_Object *
+e_gadget_drop_handler_add(Evas_Object *g, void *data,
+                                        void (*enter_cb)(void *data, const 
char *type, void *event),
+                                        void (*move_cb)(void *data, const char 
*type, void *event),
+                                        void (*leave_cb)(void *data, const 
char *type, void *event),
+                                        void (*drop_cb)(void *data, const char 
*type, void *event),
+                                        const char **types, unsigned int 
num_types)
+{
+   E_Gadget_Config *zgc;
+   int x, y, w, h;
+   Evas_Object *drop_object;
+   E_Drop_Handler *drop_handler;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(g, NULL);
+   zgc = evas_object_data_get(g, "__e_gadget");
+   EINA_SAFETY_ON_NULL_RETURN_VAL(zgc, NULL);
+
+   if (!zgc->drop_handlers)
+     zgc->drop_handlers = eina_hash_pointer_new((Eina_Free_Cb)evas_object_del);
+
+   evas_object_geometry_get(zgc->display, &x, &y, &w, &h);
+   drop_handler = e_drop_handler_add(zgc->e_obj_inherit, NULL, data,
+                        enter_cb, move_cb, leave_cb, drop_cb,
+                        types, num_types, x, y, w, h);
+   drop_object = evas_object_rectangle_add(e_comp->evas);
+   evas_object_color_set(drop_object, 0, 0, 0, 0);
+   e_object_data_set(E_OBJECT(drop_handler), drop_object);
+   evas_object_data_set(drop_object, "gadget_drop_handler", drop_handler);
+   evas_object_geometry_set(drop_object, x, y, w, h);
+   evas_object_pass_events_set(drop_object, 1);
+   evas_object_layer_set(drop_object, evas_object_layer_get(zgc->display));
+   evas_object_event_callback_add(drop_object, EVAS_CALLBACK_MOVE, 
_gadget_drop_handler_moveresize, drop_handler);
+   evas_object_event_callback_add(drop_object, EVAS_CALLBACK_RESIZE, 
_gadget_drop_handler_moveresize, drop_handler);
+   evas_object_event_callback_add(drop_object, EVAS_CALLBACK_DEL, 
_gadget_drop_handler_del, zgc);
+   eina_hash_add(zgc->drop_handlers, &drop_object, drop_handler);
+   return drop_object;
+}
+
 E_API Evas_Object *
 e_gadget_util_layout_style_init(Evas_Object *g, Evas_Object *style)
 {
diff --git a/src/bin/e_gadget.h b/src/bin/e_gadget.h
index 863828a..f44f634 100644
--- a/src/bin/e_gadget.h
+++ b/src/bin/e_gadget.h
@@ -130,6 +130,16 @@ E_API void e_gadget_type_add(const char *type, 
E_Gadget_Create_Cb callback, E_Ga
 E_API void e_gadget_type_del(const char *type);
 E_API Eina_Iterator *e_gadget_type_iterator_get(void);
 
+/* drop region initially matches gadget size, resizes to match returned 
object's size
+ * handler is removed when returned object is deleted
+ */
+E_API Evas_Object *e_gadget_drop_handler_add(Evas_Object *g, void *data,
+                                        void (*enter_cb)(void *data, const 
char *type, void *event),
+                                        void (*move_cb)(void *data, const char 
*type, void *event),
+                                        void (*leave_cb)(void *data, const 
char *type, void *event),
+                                        void (*drop_cb)(void *data, const char 
*type, void *event),
+                                        const char **types, unsigned int 
num_types);
+
 E_API Evas_Object *e_gadget_util_layout_style_init(Evas_Object *g, Evas_Object 
*style);
 E_API void e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, 
Evas_Object *pos_obj);
 E_API void e_gadget_util_allow_deny_ctxpopup(Evas_Object *g, const char *text, 
Evas_Smart_Cb allow_cb, Evas_Smart_Cb deny_cb, const void *data);

-- 


Reply via email to