elm_photo update for dnd
authorHyoyoung Chang <hyoyoung.chang@samsung.com>
Fri, 17 Sep 2010 03:11:58 +0000 (12:11 +0900)
committerHyoyoung Chang <hyoyoung.chang@samsung.com>
Fri, 17 Sep 2010 03:11:58 +0000 (12:11 +0900)
src/lib/elm_photo.c

index 849306a..5b955af 100644 (file)
  * 
  * 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 :*/