diff options
author | Mike Blumenkrantz <zmike@osg.samsung.com> | 2016-09-06 11:11:51 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@osg.samsung.com> | 2016-09-06 11:12:31 -0400 |
commit | 5da62d9adf9c2ff6672ffbe6765e53a9937e0e24 (patch) | |
tree | 09a33ac63629429f8ae7c14df502bfcb181d0b18 | |
parent | 686dc747d6f6c481614fd5d0a7a1fb413da0ca5f (diff) | |
download | enlightenment-5da62d9adf9c2ff6672ffbe6765e53a9937e0e24.tar.gz |
add drop handlers for gadgets
a simple wrapper around existing e_dnd functionality
-rw-r--r-- | src/bin/e_gadget.c | 59 | ||||
-rw-r--r-- | src/bin/e_gadget.h | 10 |
2 files changed, 69 insertions, 0 deletions
diff --git a/src/bin/e_gadget.c b/src/bin/e_gadget.c index d5bf1b086b..ba5e41a0e3 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 863828a09b..f44f634f40 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); |