From 9415c5cf431c5d904b34633b4929d330f18eea50 Mon Sep 17 00:00:00 2001 From: Hyoyoung Chang Date: Fri, 17 Sep 2010 12:11:58 +0900 Subject: [PATCH] elm_photo update for dnd --- src/lib/elm_photo.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 117 insertions(+), 8 deletions(-) diff --git a/src/lib/elm_photo.c b/src/lib/elm_photo.c index 849306a..5b955af 100644 --- a/src/lib/elm_photo.c +++ b/src/lib/elm_photo.c @@ -10,8 +10,10 @@ * * Signals that you can add callbacks for are: * - * clicked - This is called when a user has clicked the photo - * + * - clicked: This is called when a user has clicked the photo + * - drop: Something was dropped on the widget + * - drag,start: Someone started dragging the image out of the object + * - drag,end: Dragged item was dropped (somewhere) */ typedef struct _Widget_Data Widget_Data; @@ -22,6 +24,7 @@ struct _Widget_Data Evas_Object *img; int size; Eina_Bool fill; + Ecore_Timer *longtimer; }; static const char *widtype = NULL; @@ -29,6 +32,7 @@ static void _del_hook(Evas_Object *obj); static void _theme_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _del_hook(Evas_Object *obj) @@ -92,11 +96,94 @@ _icon_move_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v static void +_drag_done_cb(void *unused __UNUSED__, Evas_Object *obj) +{ + elm_object_scroll_freeze_pop(obj); + evas_object_smart_callback_call(obj, "drag,end", NULL); +} + +static Eina_Bool +_longpress(void *objv) +{ + Widget_Data *wd = elm_widget_data_get(objv); + Evas_Object *tmp; + const char *file; + char *buf; + + printf("Long press: start drag!\n"); + wd->longtimer = NULL; /* clear: must return NULL now */ + evas_object_event_callback_del(objv, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move); + + tmp = _els_smart_icon_object_get(wd->img); + file = NULL; + evas_object_image_file_get(tmp,&file,NULL); + if (file) + { + /* FIXME: Deal with relative paths */ + buf = malloc(strlen(file) + strlen("file://") + 1); + sprintf(buf, "%s%s","file://",file); + elm_drag_start(objv, ELM_SEL_FORMAT_IMAGE, buf, _drag_done_cb, NULL); + free(buf); + } + elm_object_scroll_freeze_push(objv); + + evas_object_smart_callback_call(objv, "drag,start", NULL); + + return 0; /* Don't call again */ +} + +static void +_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event) +{ + Widget_Data *wd = elm_widget_data_get(data); + Evas_Event_Mouse_Move *move = event; + + /* Sanity */ + if (!wd->longtimer) + { + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move); + return; + } + + /* if the event is held, stop waiting */ + if (move->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + { + /* Moved too far: No longpress for you! */ + ecore_timer_del(wd->longtimer); + wd->longtimer = NULL; + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, + _mouse_move); + } +} + +static void +_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(data); + + if (wd->longtimer) ecore_timer_del(wd->longtimer); + + /* FIXME: Hard coded timeout */ + wd->longtimer = ecore_timer_add(0.7,_longpress, data); + evas_object_event_callback_add(obj,EVAS_CALLBACK_MOUSE_MOVE, + _mouse_move,data); +} + +static void _mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { + Widget_Data *wd = elm_widget_data_get(data); + + if (wd && wd->longtimer) + { + ecore_timer_del(wd->longtimer); + wd->longtimer = NULL; + } + evas_object_smart_callback_call(data, "clicked", NULL); } + /** * Add a new photo to the parent * @@ -138,11 +225,14 @@ elm_photo_add(Evas_Object *parent) _els_smart_icon_scale_set(wd->img, elm_widget_scale_get(obj) * _elm_config->scale); evas_object_event_callback_add(wd->img, EVAS_CALLBACK_MOUSE_UP, _mouse_up, obj); + evas_object_event_callback_add(wd->img, EVAS_CALLBACK_MOUSE_DOWN, + _mouse_down, obj); evas_object_repeat_events_set(wd->img, 1); edje_object_part_swallow(wd->frm, "elm.swallow.content", wd->img); evas_object_show(wd->img); elm_widget_sub_object_add(obj, wd->img); + wd->longtimer = NULL; icon = _els_smart_icon_object_get(wd->img); evas_object_event_callback_add(icon, EVAS_CALLBACK_MOVE, @@ -159,7 +249,7 @@ elm_photo_add(Evas_Object *parent) * @param obj The photo object * @param file The path to file that will be used as photo * - * @return (1 = sucess, 0 = error) + * @return (1 = success, 0 = error) * * @ingroup Photo */ @@ -191,12 +281,10 @@ elm_photo_size_set(Evas_Object *obj, int size) ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->size = size; - if(size >= 0) - _els_smart_icon_scale_size_set(wd->img, size); - else - _els_smart_icon_scale_size_set(wd->img, 0); + wd->size = (size > 0) ? size : 0; + + _els_smart_icon_scale_size_set(wd->img, wd->size); _sizing_eval(obj); } @@ -220,3 +308,24 @@ elm_photo_fill_inside_set(Evas_Object *obj, Eina_Bool fill) _sizing_eval(obj); } +/** + * Set editability of the photo. + * + * An editable photo can be dragged to or from, and can be cut or pasted too. + * Note that pasting an image or dropping an item on the image will delete the + * existing content. + * + * @param obj The photo object. + * @param set To set of clear editablity. + */ +EAPI void +elm_photo_editable_set(Evas_Object *obj, Eina_Bool set) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + + if (!wd) return;; + _els_smart_icon_edit_set(wd->img, set, obj); +} + +/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ -- 2.7.4