DnD: cancel feature during drag

This can be tested by running "Features DnD" test. Enable the 5s cancel
timeout, drag an item and wait for the cancellation.
This commit is contained in:
Daniel Zaoui 2013-11-28 16:06:46 +02:00
parent 75914e85d6
commit e67db2c832
3 changed files with 84 additions and 0 deletions

View File

@ -40,6 +40,9 @@ typedef struct _drag_anim_st drag_anim_st;
#define DRAG_TIMEOUT 0.3
#define ANIM_TIME 0.5
static Eina_Bool _5s_cancel = EINA_FALSE;
static Ecore_Timer *_5s_timeout = NULL;
static int
_item_ptr_cmp(const void *d1, const void *d2)
{
@ -378,6 +381,12 @@ _gl_dragdone(void *data, Evas_Object *obj EINA_UNUSED, Eina_Bool doaccept)
Elm_Object_Item *it;
Eina_List *l;
if (_5s_cancel)
{
ecore_timer_del(_5s_timeout);
_5s_timeout = NULL;
}
if (doaccept)
{ /* Remove items dragged out (accepted by target) */
EINA_LIST_FOREACH(data, l, it)
@ -388,6 +397,15 @@ _gl_dragdone(void *data, Evas_Object *obj EINA_UNUSED, Eina_Bool doaccept)
return;
}
static Eina_Bool
_5s_timeout_gone(void *data)
{
printf("Cancel DnD\n");
Evas_Object *obj = data;
elm_drag_cancel(obj);
return ECORE_CALLBACK_CANCEL;
}
static Evas_Object *
_gl_createicon(void *data, Evas_Object *win, Evas_Coord *xoff, Evas_Coord *yoff)
{
@ -658,6 +676,14 @@ _grid_icons_get(void *data)
return icons;
}
static void
_gl_dragstart(void *data EINA_UNUSED, Evas_Object *obj)
{
printf("<%s> <%d>\n", __func__, __LINE__);
if (_5s_cancel)
_5s_timeout = ecore_timer_add(5.0, _5s_timeout_gone, obj);
}
static Eina_Bool
_grid_data_getcb(Evas_Object *obj, /* The genlist object */
Elm_Object_Item *it,
@ -666,6 +692,7 @@ _grid_data_getcb(Evas_Object *obj, /* The genlist object */
info->format = ELM_SEL_FORMAT_TARGETS;
info->createicon = _gl_createicon;
info->createdata = it;
info->dragstart = _gl_dragstart;
info->icons = _grid_icons_get(obj);
info->dragdone = _gl_dragdone;
@ -959,6 +986,12 @@ static Eina_Bool _drop_bg_change_cb(void *data EINA_UNUSED, Evas_Object *obj, El
return EINA_TRUE;
}
static void
_5s_cancel_ck_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
_5s_cancel = elm_check_state_get(obj);
}
void
test_dnd_multi_features(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
@ -1019,6 +1052,15 @@ test_dnd_multi_features(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo
evas_object_show(vert_box);
elm_drop_target_add(vert_box, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_box_button_new_cb, win);
_5s_cancel = EINA_FALSE;
Evas_Object *ck = elm_check_add(vert_box);
elm_object_style_set(ck, "toggle");
elm_object_text_set(ck, "Cancel after 5s:");
elm_check_state_set(ck, _5s_cancel);
evas_object_smart_callback_add(ck, "changed", _5s_cancel_ck_changed, NULL);
elm_box_pack_end(vert_box, ck);
evas_object_show(ck);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
elm_image_file_set(ic, buf, NULL);

View File

@ -4245,3 +4245,30 @@ elm_drag_item_container_add(Evas_Object *obj, double anim_tm, double tm_to_drag,
}
/* END - Support elm containers for Drag */
/* END - Support elm containers for Drag and Drop */
EAPI Eina_Bool
elm_drag_cancel(Evas_Object *obj)
{
#ifdef HAVE_ELEMENTARY_X
Ecore_X_Window xwin = _x11_elm_widget_xwin_get(obj);
if (xwin)
{
ecore_x_pointer_ungrab();
ELM_SAFE_FREE(handler_up, ecore_event_handler_del);
ELM_SAFE_FREE(handler_status, ecore_event_handler_del);
ecore_x_dnd_abort(xwin);
}
#endif
#ifdef HAVE_ELEMENTARY_WAYLAND
/* Have to complete here.
* if (elm_win_wl_window_get(obj)) ... */
#endif
ELM_SAFE_FREE(dragwin, evas_object_del);
dragdonecb = NULL;
dragacceptcb = NULL;
dragposcb = NULL;
dragwidget = NULL;
doaccept = EINA_FALSE;
return EINA_TRUE;
}

View File

@ -367,6 +367,21 @@ EAPI Eina_Bool elm_drag_start(Evas_Object *obj, Elm_Sel_Format format,
Elm_Drag_Pos dragpos, void *dragdata,
Elm_Drag_Accept acceptcb, void *acceptdata,
Elm_Drag_State dragdone, void *donecbdata);
/**
* @brief Cancels the current drag operation
*
* It can only be initiated from the source window.
*
* @param obj The source of the current drag.
* @return Returns EINA_TRUE, if successful, or EINA_FALSE if not.
*
* @ingroup CopyPaste
*
* @since 1.9
*/
EAPI Eina_Bool elm_drag_cancel(Evas_Object *obj);
/**
* @brief Changes the current drag action
*