summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@osg.samsung.com>2016-09-06 11:11:51 -0400
committerMike Blumenkrantz <zmike@osg.samsung.com>2016-09-06 11:12:31 -0400
commit5da62d9adf9c2ff6672ffbe6765e53a9937e0e24 (patch)
tree09a33ac63629429f8ae7c14df502bfcb181d0b18
parent686dc747d6f6c481614fd5d0a7a1fb413da0ca5f (diff)
downloadenlightenment-5da62d9adf9c2ff6672ffbe6765e53a9937e0e24.tar.gz
add drop handlers for gadgets
a simple wrapper around existing e_dnd functionality
-rw-r--r--src/bin/e_gadget.c59
-rw-r--r--src/bin/e_gadget.h10
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);