*
* 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;
Evas_Object *img;
int size;
Eina_Bool fill;
+ Ecore_Timer *longtimer;
};
static const char *widtype = NULL;
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)
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
*
_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,
* @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
*/
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);
}
_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 :*/