2 # include "elementary_config.h"
4 #include <Elementary.h>
6 static const char *img[9] =
25 typedef struct _anim_icon_st anim_icon_st;
31 Evas_Coord mdx; /* Mouse-down x */
32 Evas_Coord mdy; /* Mouse-down y */
33 Eina_List *icons; /* List of icons to animate (anim_icon_st) */
38 typedef struct _drag_anim_st drag_anim_st;
40 #define DRAG_TIMEOUT 0.3
43 static Eina_Bool _5s_cancel = EINA_FALSE;
44 static Ecore_Timer *_5s_timeout = NULL;
47 _item_ptr_cmp(const void *d1, const void *d2)
52 static Elm_Genlist_Item_Class *itc1;
53 static Elm_Gengrid_Item_Class *gic;
56 gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
62 gl_content_get(void *data, Evas_Object *obj, const char *part)
64 if (!strcmp(part, "elm.swallow.icon"))
66 Evas_Object *icon = elm_icon_add(obj);
67 elm_image_file_set(icon, data, NULL);
68 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
69 evas_object_show(icon);
76 _win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
78 printf("<%s> <%d> will del <%p>\n", __func__, __LINE__, data);
79 elm_drop_item_container_del(data);
80 elm_drag_item_container_del(data);
82 if (gic) elm_gengrid_item_class_free(gic);
84 if (itc1) elm_genlist_item_class_free(itc1);
88 static Elm_Object_Item *
89 _gl_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret EINA_UNUSED, int *yposret)
90 { /* This function returns pointer to item under (x,y) coords */
91 printf("<%s> <%d> obj=<%p>\n", __func__, __LINE__, obj);
93 gli = elm_genlist_at_xy_item_get(obj, x, y, yposret);
95 printf("over <%s>, gli=<%p> yposret %i\n",
96 (char *)elm_object_item_data_get(gli), gli, *yposret);
98 printf("over none, yposret %i\n", *yposret);
102 static Elm_Object_Item *
103 _grid_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret, int *yposret)
104 { /* This function returns pointer to item under (x,y) coords */
105 printf("<%s> <%d> obj=<%p>\n", __func__, __LINE__, obj);
106 Elm_Object_Item *item;
107 item = elm_gengrid_at_xy_item_get(obj, x, y, xposret, yposret);
109 printf("over <%s>, item=<%p> xposret %i yposret %i\n",
110 (char *)elm_object_item_data_get(item), item, *xposret, *yposret);
112 printf("over none, xposret %i yposret %i\n", *xposret, *yposret);
117 _gl_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret)
118 { /* This function is called when data is dropped on the genlist */
119 printf("<%s> <%d> str=<%s>\n", __func__, __LINE__, (char *) ev->data);
128 char *p2 = strchr(p, '#');
132 printf("Item %s\n", p);
135 case -1: /* Dropped on top-part of the it item */
137 elm_genlist_item_insert_before(obj,
138 itc1, strdup(p), NULL, it,
139 ELM_GENLIST_ITEM_NONE,
143 case 0: /* Dropped on center of the it item */
144 case 1: /* Dropped on botton-part of the it item */
146 if (!it) it = elm_genlist_last_item_get(obj);
147 if (it) it = elm_genlist_item_insert_after(obj,
148 itc1, strdup(p), NULL, it,
149 ELM_GENLIST_ITEM_NONE,
152 it = elm_genlist_item_append(obj,
153 itc1, strdup(p), NULL,
154 ELM_GENLIST_ITEM_NONE,
170 _grid_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret EINA_UNUSED)
171 { /* This function is called when data is dropped on the genlist */
172 printf("<%s> <%d> str=<%s>\n", __func__, __LINE__, (char *) ev->data);
181 char *p2 = strchr(p, '#');
185 printf("Item %s\n", p);
186 if (!it) it = elm_gengrid_last_item_get(obj);
187 if (it) it = elm_gengrid_item_insert_after(obj, gic, strdup(p), it, NULL, NULL);
188 else it = elm_gengrid_item_append(obj, gic, strdup(p), NULL, NULL);
197 static void _gl_obj_mouse_move( void *data, Evas *e, Evas_Object *obj, void *event_info);
198 static void _gl_obj_mouse_up( void *data, Evas *e, Evas_Object *obj, void *event_info);
201 anim_st_free(drag_anim_st *anim_st)
202 { /* Stops and free mem of ongoing animation */
203 printf("<%s> <%d>\n", __func__, __LINE__);
206 evas_object_event_callback_del_full
207 (anim_st->gl, EVAS_CALLBACK_MOUSE_MOVE, _gl_obj_mouse_move, anim_st);
208 evas_object_event_callback_del_full
209 (anim_st->gl, EVAS_CALLBACK_MOUSE_UP, _gl_obj_mouse_up, anim_st);
212 ecore_timer_del(anim_st->tm);
218 ecore_animator_del(anim_st->ea);
224 EINA_LIST_FREE(anim_st->icons, st)
226 evas_object_hide(st->o);
227 evas_object_del(st->o);
236 _drag_anim_play(void *data, double pos)
237 { /* Impl of the animation of icons, called on frame time */
238 drag_anim_st *anim_st = data;
239 printf("<%s> <%d>\n", __func__, __LINE__);
247 anim_st->ea = NULL; /* Avoid deleting on mouse up */
249 EINA_LIST_FOREACH(anim_st->icons, l, st)
250 evas_object_hide(st->o); /* Hide animated icons */
251 anim_st_free(anim_st);
252 return ECORE_CALLBACK_CANCEL;
255 EINA_LIST_FOREACH(anim_st->icons, l, st)
259 evas_object_geometry_get(st->o, NULL, NULL, &w, &h);
260 evas_pointer_canvas_xy_get(anim_st->e, &xm, &ym);
261 x = st->start_x + (pos * (xm - (st->start_x + (w/2))));
262 y = st->start_y + (pos * (ym - (st->start_y + (h/2))));
263 evas_object_move(st->o, x, y);
266 return ECORE_CALLBACK_RENEW;
269 return ECORE_CALLBACK_CANCEL;
273 _gl_anim_start(void *data)
274 { /* Start icons animation before actually drag-starts */
275 drag_anim_st *anim_st = data;
276 printf("<%s> <%d>\n", __func__, __LINE__);
280 Eina_List *items = eina_list_clone(elm_genlist_selected_items_get(anim_st->gl));
281 Elm_Object_Item *gli = elm_genlist_at_xy_item_get(anim_st->gl,
282 anim_st->mdx, anim_st->mdy, &yposret);
284 { /* Add the item mouse is over to the list if NOT seleced */
285 void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
287 items = eina_list_append(items, gli);
290 EINA_LIST_FOREACH(items, l, gli)
291 { /* Now add icons to animation window */
292 Evas_Object *o = elm_object_item_part_content_get(gli,
300 anim_icon_st *st = calloc(1, sizeof(*st));
301 elm_image_file_get(o, &f, &g);
302 Evas_Object *ic = elm_icon_add(anim_st->gl);
303 elm_image_file_set(ic, f, g);
304 evas_object_geometry_get(o, &st->start_x, &st->start_y, &w, &h);
305 evas_object_size_hint_align_set(ic,
306 EVAS_HINT_FILL, EVAS_HINT_FILL);
307 evas_object_size_hint_weight_set(ic,
308 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
310 evas_object_move(ic, st->start_x, st->start_y);
311 evas_object_resize(ic, w, h);
312 evas_object_show(ic);
315 anim_st->icons = eina_list_append(anim_st->icons, st);
319 eina_list_free(items);
322 anim_st->ea = ecore_animator_timeline_add(DRAG_TIMEOUT,
323 _drag_anim_play, anim_st);
325 return ECORE_CALLBACK_CANCEL;
332 Evas_Object *obj EINA_UNUSED,
333 void *event_info EINA_UNUSED)
334 { /* Cancel any drag waiting to start on timeout */
335 drag_anim_st *anim_st = data;
336 anim_st_free(anim_st);
343 Evas_Object *obj EINA_UNUSED,
345 { /* Cancel any drag waiting to start on timeout */
347 if (((Evas_Event_Mouse_Move *)event_info)->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
349 drag_anim_st *anim_st = data;
350 anim_st_free(anim_st);
358 Evas_Object *obj EINA_UNUSED,
360 { /* Launch a timer to start drag animation */
361 Evas_Event_Mouse_Down *ev = event_info;
362 drag_anim_st *anim_st = calloc(1, sizeof(*anim_st));
364 anim_st->mdx = ev->canvas.x;
365 anim_st->mdy = ev->canvas.y;
367 anim_st->tm = ecore_timer_add(DRAG_TIMEOUT, _gl_anim_start, anim_st);
368 evas_object_event_callback_add(data, EVAS_CALLBACK_MOUSE_UP,
369 _gl_obj_mouse_up, anim_st);
370 evas_object_event_callback_add(data, EVAS_CALLBACK_MOUSE_MOVE,
371 _gl_obj_mouse_move, anim_st);
373 /* END - Handling drag start animation */
376 _gl_dragdone(void *data, Evas_Object *obj EINA_UNUSED, Eina_Bool doaccept)
378 printf("<%s> <%d> data=<%p> doaccept=<%d>\n",
379 __func__, __LINE__, data, doaccept);
386 ecore_timer_del(_5s_timeout);
391 { /* Remove items dragged out (accepted by target) */
392 EINA_LIST_FOREACH(data, l, it)
393 elm_object_item_del(it);
396 eina_list_free(data);
401 _5s_timeout_gone(void *data)
403 printf("Cancel DnD\n");
404 elm_drag_cancel(data);
406 return ECORE_CALLBACK_CANCEL;
410 _gl_createicon(void *data, Evas_Object *win, Evas_Coord *xoff, Evas_Coord *yoff)
412 printf("<%s> <%d>\n", __func__, __LINE__);
413 Evas_Object *icon = NULL;
414 Evas_Object *o = elm_object_item_part_content_get(data, "elm.swallow.icon");
418 int xm, ym, w = 30, h = 30;
421 elm_image_file_get(o, &f, &g);
422 evas_pointer_canvas_xy_get(evas_object_evas_get(o), &xm, &ym);
423 if (xoff) *xoff = xm - (w/2);
424 if (yoff) *yoff = ym - (h/2);
425 icon = elm_icon_add(win);
426 elm_image_file_set(icon, f, g);
427 evas_object_size_hint_align_set(icon,
428 EVAS_HINT_FILL, EVAS_HINT_FILL);
429 evas_object_size_hint_weight_set(icon,
430 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
431 if (xoff && yoff) evas_object_move(icon, *xoff, *yoff);
432 evas_object_resize(icon, w, h);
439 _gl_icons_get(void *data)
440 { /* Start icons animation before actually drag-starts */
441 printf("<%s> <%d>\n", __func__, __LINE__);
446 Eina_List *icons = NULL;
449 evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym);
450 Eina_List *items = eina_list_clone(elm_genlist_selected_items_get(data));
451 Elm_Object_Item *gli = elm_genlist_at_xy_item_get(data,
454 { /* Add the item mouse is over to the list if NOT seleced */
455 void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
457 items = eina_list_append(items, gli);
460 EINA_LIST_FOREACH(items, l, gli)
461 { /* Now add icons to animation window */
462 Evas_Object *o = elm_object_item_part_content_get(gli,
469 elm_image_file_get(o, &f, &g);
470 Evas_Object *ic = elm_icon_add(data);
471 elm_image_file_set(ic, f, g);
472 evas_object_geometry_get(o, &x, &y, &w, &h);
473 evas_object_size_hint_align_set(ic,
474 EVAS_HINT_FILL, EVAS_HINT_FILL);
475 evas_object_size_hint_weight_set(ic,
476 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
478 evas_object_move(ic, x, y);
479 evas_object_resize(ic, w, h);
480 evas_object_show(ic);
482 icons = eina_list_append(icons, ic);
486 eina_list_free(items);
491 _gl_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items)
492 { /* Construct a string of dragged info, user frees returned string */
493 const char *drag_data = NULL;
494 printf("<%s> <%d>\n", __func__, __LINE__);
496 *items = eina_list_clone(elm_genlist_selected_items_get(obj));
498 { /* Add the item mouse is over to the list if NOT seleced */
499 void *p = eina_list_search_unsorted(*items, _item_ptr_cmp, it);
501 *items = eina_list_append(*items, it);
505 { /* Now we can actually compose string to send and start dragging */
508 unsigned int len = 0;
510 EINA_LIST_FOREACH(*items, l, it)
512 t = (char *)elm_object_item_data_get(it);
517 drag_data = malloc(len + eina_list_count(*items) * 2 + 8);
518 strcpy((char *) drag_data, "file://");
520 EINA_LIST_FOREACH(*items, l, it)
522 t = (char *)elm_object_item_data_get(it);
525 strcat((char *) drag_data, "#");
526 strcat((char *) drag_data, t);
529 strcat((char *) drag_data, "#");
531 printf("<%s> <%d> Sending <%s>\n", __func__, __LINE__, drag_data);
538 _grid_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items)
539 { /* Construct a string of dragged info, user frees returned string */
540 const char *drag_data = NULL;
541 printf("<%s> <%d>\n", __func__, __LINE__);
543 *items = eina_list_clone(elm_gengrid_selected_items_get(obj));
545 { /* Add the item mouse is over to the list if NOT seleced */
546 void *p = eina_list_search_unsorted(*items, _item_ptr_cmp, it);
548 *items = eina_list_append(*items, it);
552 { /* Now we can actually compose string to send and start dragging */
555 unsigned int len = 0;
557 EINA_LIST_FOREACH(*items, l, it)
559 t = (char *)elm_object_item_data_get(it);
564 drag_data = malloc(len + eina_list_count(*items) * 2 + 8);
565 strcpy((char *) drag_data, "file://");
567 EINA_LIST_FOREACH(*items, l, it)
569 t = (char *)elm_object_item_data_get(it);
572 strcat((char *) drag_data, "#");
573 strcat((char *) drag_data, t);
576 strcat((char *) drag_data, "#");
578 printf("<%s> <%d> Sending <%s>\n", __func__, __LINE__, drag_data);
585 _gl_dnd_default_anim_data_getcb(Evas_Object *obj, /* The genlist object */
587 Elm_Drag_User_Info *info)
588 { /* This called before starting to drag, mouse-down was on it */
589 info->format = ELM_SEL_FORMAT_TARGETS;
590 info->createicon = _gl_createicon;
591 info->createdata = it;
592 info->icons = _gl_icons_get(obj);
593 info->dragdone = _gl_dragdone;
595 /* Now, collect data to send for drop from ALL selected items */
596 /* Save list pointer to remove items after drop and free list on done */
597 info->data = _gl_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
598 printf("%s - data = %s\n", __FUNCTION__, info->data);
599 info->acceptdata = info->donecbdata;
608 _gl_data_getcb(Evas_Object *obj, /* The genlist object */
610 Elm_Drag_User_Info *info)
611 { /* This called before starting to drag, mouse-down was on it */
612 info->format = ELM_SEL_FORMAT_TARGETS;
613 info->createicon = _gl_createicon;
614 info->createdata = it;
615 info->dragdone = _gl_dragdone;
617 /* Now, collect data to send for drop from ALL selected items */
618 /* Save list pointer to remove items after drop and free list on done */
619 info->data = _gl_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
620 info->acceptdata = info->donecbdata;
629 _grid_icons_get(void *data)
630 { /* Start icons animation before actually drag-starts */
631 printf("<%s> <%d>\n", __func__, __LINE__);
635 Eina_List *icons = NULL;
638 evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym);
639 Eina_List *items = eina_list_clone(elm_gengrid_selected_items_get(data));
640 Elm_Object_Item *gli = elm_gengrid_at_xy_item_get(data,
643 { /* Add the item mouse is over to the list if NOT seleced */
644 void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
646 items = eina_list_append(items, gli);
649 EINA_LIST_FOREACH(items, l, gli)
650 { /* Now add icons to animation window */
651 Evas_Object *o = elm_object_item_part_content_get(gli,
658 elm_image_file_get(o, &f, &g);
659 Evas_Object *ic = elm_icon_add(data);
660 elm_image_file_set(ic, f, g);
661 evas_object_geometry_get(o, &x, &y, &w, &h);
662 evas_object_size_hint_align_set(ic,
663 EVAS_HINT_FILL, EVAS_HINT_FILL);
664 evas_object_size_hint_weight_set(ic,
665 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
667 evas_object_move(ic, x, y);
668 evas_object_resize(ic, w, h);
669 evas_object_show(ic);
671 icons = eina_list_append(icons, ic);
675 eina_list_free(items);
680 _gl_dragstart(void *data EINA_UNUSED, Evas_Object *obj)
682 printf("<%s> <%d>\n", __func__, __LINE__);
684 _5s_timeout = ecore_timer_add(5.0, _5s_timeout_gone, obj);
688 _grid_data_getcb(Evas_Object *obj, /* The genlist object */
690 Elm_Drag_User_Info *info)
691 { /* This called before starting to drag, mouse-down was on it */
692 info->format = ELM_SEL_FORMAT_TARGETS;
693 info->createicon = _gl_createicon;
694 info->createdata = it;
695 info->dragstart = _gl_dragstart;
696 info->icons = _grid_icons_get(obj);
697 info->dragdone = _gl_dragdone;
699 /* Now, collect data to send for drop from ALL selected items */
700 /* Save list pointer to remove items after drop and free list on done */
701 info->data = _grid_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
702 printf("%s - data = %s\n", __FUNCTION__, info->data);
703 info->acceptdata = info->donecbdata;
712 test_dnd_genlist_default_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
715 Evas_Object *win, *gl, *bxx;
718 win = elm_win_util_standard_add("dnd-genlist-default-anim", "DnD-Genlist-Default-Anim");
719 elm_win_autodel_set(win, EINA_TRUE);
721 bxx = elm_box_add(win);
722 elm_box_horizontal_set(bxx, EINA_TRUE);
723 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
724 elm_win_resize_object_add(win, bxx);
725 evas_object_show(bxx);
727 itc1 = elm_genlist_item_class_new();
728 itc1->item_style = "default";
729 itc1->func.text_get = gl_text_get;
730 itc1->func.content_get = gl_content_get;
731 itc1->func.del = NULL;
733 for (j = 0; j < 2; j++)
735 gl = elm_genlist_add(win);
737 /* START Drag and Drop handling */
738 evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
739 elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
740 elm_drop_item_container_add(gl,
741 ELM_SEL_FORMAT_TARGETS,
748 elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
749 _gl_item_getcb, _gl_dnd_default_anim_data_getcb);
751 // FIXME: This causes genlist to resize the horiz axis very slowly :(
752 // Reenable this and resize the window horizontally, then try to resize it back
753 //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
754 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
755 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
756 elm_box_pack_end(bxx, gl);
757 evas_object_show(gl);
759 for (i = 0; i < 20; i++)
761 snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
762 const char *path = eina_stringshare_add(buf);
763 elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
767 evas_object_resize(win, 680, 800);
768 evas_object_show(win);
772 test_dnd_genlist_user_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
775 Evas_Object *win, *gl, *bxx;
778 win = elm_win_util_standard_add("dnd-genlist-user-anim", "DnD-Genlist-User-Anim");
779 elm_win_autodel_set(win, EINA_TRUE);
781 bxx = elm_box_add(win);
782 elm_box_horizontal_set(bxx, EINA_TRUE);
783 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
784 elm_win_resize_object_add(win, bxx);
785 evas_object_show(bxx);
787 itc1 = elm_genlist_item_class_new();
788 itc1->item_style = "default";
789 itc1->func.text_get = gl_text_get;
790 itc1->func.content_get = gl_content_get;
791 itc1->func.del = NULL;
793 for (j = 0; j < 2; j++)
795 gl = elm_genlist_add(win);
797 /* START Drag and Drop handling */
798 evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
799 elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
800 elm_drop_item_container_add(gl,
801 ELM_SEL_FORMAT_TARGETS,
808 elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
809 _gl_item_getcb, _gl_data_getcb);
811 /* We add mouse-down, up callbacks to start/stop drag animation */
812 evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN,
813 _gl_obj_mouse_down, gl);
814 /* END Drag and Drop handling */
816 // FIXME: This causes genlist to resize the horiz axis very slowly :(
817 // Reenable this and resize the window horizontally, then try to resize it back
818 //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
819 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
820 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
821 elm_box_pack_end(bxx, gl);
822 evas_object_show(gl);
824 for (i = 0; i < 20; i++)
826 snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
827 const char *path = eina_stringshare_add(buf);
828 elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
832 evas_object_resize(win, 680, 800);
833 evas_object_show(win);
837 test_dnd_genlist_gengrid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
840 Evas_Object *win, *bxx;
843 win = elm_win_util_standard_add("dnd-genlist-gengrid", "DnD-Genlist-Gengrid");
844 elm_win_autodel_set(win, EINA_TRUE);
846 bxx = elm_box_add(win);
847 elm_box_horizontal_set(bxx, EINA_TRUE);
848 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
849 elm_win_resize_object_add(win, bxx);
850 evas_object_show(bxx);
853 itc1 = elm_genlist_item_class_new();
854 itc1->item_style = "default";
855 itc1->func.text_get = gl_text_get;
856 itc1->func.content_get = gl_content_get;
857 itc1->func.del = NULL;
859 Evas_Object *gl = elm_genlist_add(win);
860 evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
862 /* START Drag and Drop handling */
863 elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
864 elm_drop_item_container_add(gl, ELM_SEL_FORMAT_TARGETS, _gl_item_getcb, NULL, NULL,
865 NULL, NULL, NULL, NULL, _gl_dropcb, NULL);
867 elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
868 _gl_item_getcb, _gl_dnd_default_anim_data_getcb);
869 /* END Drag and Drop handling */
871 // FIXME: This causes genlist to resize the horiz axis very slowly :(
872 // Reenable this and resize the window horizontally, then try to resize it back
873 //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
874 evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
875 evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
876 elm_box_pack_end(bxx, gl);
877 evas_object_show(gl);
879 for (i = 0; i < 20; i++)
881 snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
882 const char *path = eina_stringshare_add(buf);
883 elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
888 Evas_Object *grid = elm_gengrid_add(win);
889 evas_object_smart_callback_add(win, "delete,request", _win_del, grid);
890 elm_gengrid_item_size_set(grid,
891 elm_config_scale_get() * 150,
892 elm_config_scale_get() * 150);
893 elm_gengrid_horizontal_set(grid, EINA_FALSE);
894 elm_gengrid_reorder_mode_set(grid, EINA_FALSE);
895 elm_gengrid_multi_select_set(grid, EINA_TRUE); /* We allow multi drag */
896 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
897 evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
899 gic = elm_gengrid_item_class_new();
900 gic->item_style = "default";
901 gic->func.text_get = gl_text_get;
902 gic->func.content_get = gl_content_get;
904 elm_drop_item_container_add(grid, ELM_SEL_FORMAT_TARGETS, _grid_item_getcb, NULL, NULL,
905 NULL, NULL, NULL, NULL, _grid_dropcb, NULL);
907 elm_drag_item_container_add(grid, ANIM_TIME, DRAG_TIMEOUT,
908 _grid_item_getcb, _grid_data_getcb);
909 for (i = 0; i < 20; i++)
911 snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
912 const char *path = eina_stringshare_add(buf);
913 elm_gengrid_item_append(grid, gic, path, NULL, NULL);
915 elm_box_pack_end(bxx, grid);
916 evas_object_show(grid);
919 evas_object_resize(win, 680, 800);
920 evas_object_show(win);
923 static Eina_Bool _drop_box_button_new_cb(void *data, Evas_Object *obj, Elm_Selection_Data *ev)
925 Evas_Object *win = data;
926 char *p = strchr(ev->data, '#');
930 char *p2 = strchr(p, '#');
934 Evas_Object *ic = elm_icon_add(win);
935 elm_image_file_set(ic, p, NULL);
936 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
937 Evas_Object *bt = elm_button_add(win);
938 elm_object_text_set(bt, "Dropped button");
939 elm_object_part_content_set(bt, "icon", ic);
940 elm_box_pack_end(obj, bt);
941 evas_object_show(bt);
942 evas_object_show(ic);
950 void _enter_but_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
952 printf("Entered %s - drop it here and I will never print this line anymore.\n", __FUNCTION__);
955 static Eina_Bool _drop_but_icon_change_cb(void *data, Evas_Object *obj, Elm_Selection_Data *ev)
957 Evas_Object *win = data;
958 Evas_Object *ic = elm_icon_add(win);
959 char *p = strchr(ev->data, '#');
960 if (!p) return EINA_FALSE;
962 char *p2 = strchr(p, '#');
963 if (!p2) return EINA_FALSE;
965 elm_image_file_set(ic, p, NULL);
966 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
967 evas_object_del(elm_object_part_content_get(obj, "icon"));
968 elm_object_part_content_set(obj, "icon", ic);
969 evas_object_show(ic);
973 /* Callback used to test multi-callbacks feature */
974 static Eina_Bool _drop_but_cb_remove_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev EINA_UNUSED)
976 printf("Second callback called - removing it\n");
977 elm_drop_target_del(obj, ELM_SEL_FORMAT_TARGETS, _enter_but_cb, NULL, NULL, NULL, NULL, NULL, _drop_but_cb_remove_cb, NULL);
981 static Eina_Bool _drop_bg_change_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev)
983 char *p = strchr(ev->data, '#');
984 if (!p) return EINA_FALSE;
986 char *p2 = strchr(p, '#');
987 if (!p2) return EINA_FALSE;
989 elm_bg_file_set(obj, p, NULL);
994 _5s_cancel_ck_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
996 _5s_cancel = elm_check_state_get(obj);
1000 test_dnd_multi_features(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1003 Evas_Object *win, *bxx, *bg;
1006 win = elm_win_util_standard_add("dnd-multi-features", "DnD-Multi Features");
1007 elm_win_autodel_set(win, EINA_TRUE);
1009 bg = elm_bg_add(win);
1010 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1011 elm_drop_target_add(bg, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_bg_change_cb, NULL);
1012 elm_win_resize_object_add(win, bg);
1014 /* And show the background. */
1015 evas_object_show(bg);
1016 bxx = elm_box_add(win);
1017 elm_box_horizontal_set(bxx, EINA_TRUE);
1018 evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1019 elm_win_resize_object_add(win, bxx);
1020 evas_object_show(bxx);
1023 Evas_Object *grid = elm_gengrid_add(bxx);
1024 evas_object_smart_callback_add(win, "delete,request", _win_del, grid);
1025 elm_gengrid_item_size_set(grid,
1026 elm_config_scale_get() * 100,
1027 elm_config_scale_get() * 100);
1028 elm_gengrid_horizontal_set(grid, EINA_FALSE);
1029 elm_gengrid_reorder_mode_set(grid, EINA_FALSE);
1030 elm_gengrid_multi_select_set(grid, EINA_TRUE); /* We allow multi drag */
1031 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1032 evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
1034 gic = elm_gengrid_item_class_new();
1035 gic->item_style = "default";
1036 gic->func.text_get = gl_text_get;
1037 gic->func.content_get = gl_content_get;
1039 elm_drag_item_container_add(grid, ANIM_TIME, DRAG_TIMEOUT,
1040 _grid_item_getcb, _grid_data_getcb);
1041 for (i = 0; i < 10; i++)
1043 snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
1044 const char *path = eina_stringshare_add(buf);
1045 Elm_Object_Item *item = elm_gengrid_item_append(grid, gic, path, NULL, NULL);
1046 elm_object_item_part_text_set(item, "elm.text", path);
1048 elm_box_pack_end(bxx, grid);
1049 evas_object_show(grid);
1053 Evas_Object *ic, *bt;
1054 Evas_Object *vert_box = elm_box_add(bxx);
1055 evas_object_size_hint_weight_set(vert_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1056 elm_box_pack_end(bxx, vert_box);
1057 evas_object_show(vert_box);
1058 elm_drop_target_add(vert_box, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_box_button_new_cb, win);
1060 _5s_cancel = EINA_FALSE;
1061 Evas_Object *ck = elm_check_add(vert_box);
1062 elm_object_style_set(ck, "toggle");
1063 elm_object_text_set(ck, "Cancel after 5s:");
1064 elm_check_state_set(ck, _5s_cancel);
1065 evas_object_smart_callback_add(ck, "changed", _5s_cancel_ck_changed, NULL);
1066 elm_box_pack_end(vert_box, ck);
1067 evas_object_show(ck);
1069 ic = elm_icon_add(win);
1070 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1071 elm_image_file_set(ic, buf, NULL);
1072 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1073 bt = elm_button_add(win);
1074 elm_object_text_set(bt, "Multi-callbacks check");
1075 elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_but_icon_change_cb, win);
1076 elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, _enter_but_cb, NULL, NULL, NULL, NULL, NULL, _drop_but_cb_remove_cb, NULL);
1077 elm_object_part_content_set(bt, "icon", ic);
1078 elm_box_pack_end(vert_box, bt);
1079 evas_object_show(bt);
1080 evas_object_show(ic);
1082 ic = elm_icon_add(win);
1083 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1084 elm_image_file_set(ic, buf, NULL);
1085 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1086 bt = elm_button_add(win);
1087 elm_object_text_set(bt, "Drop into me to change my icon");
1088 elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_but_icon_change_cb, win);
1089 elm_object_part_content_set(bt, "icon", ic);
1090 elm_box_pack_end(vert_box, bt);
1091 evas_object_show(bt);
1092 evas_object_show(ic);
1094 ic = elm_icon_add(win);
1095 snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1096 elm_image_file_set(ic, buf, NULL);
1097 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1098 bt = elm_button_add(win);
1099 elm_object_text_set(bt, "No action on drop");
1100 elm_object_part_content_set(bt, "icon", ic);
1101 elm_box_pack_end(vert_box, bt);
1102 evas_object_show(bt);
1103 evas_object_show(ic);
1105 evas_object_resize(win, 680, 800);
1106 evas_object_show(win);