efl

Форк
0
/
test_dnd.c 
1390 строк · 44.6 Кб
1
#ifdef HAVE_CONFIG_H
2
# include "elementary_config.h"
3
#endif
4
#include <Elementary.h>
5

6
#define FILESEP "file://"
7
#define FILESEP_LEN sizeof(FILESEP) - 1
8

9
static const char *img[9] =
10
{
11
   "panel_01.jpg",
12
   "plant_01.jpg",
13
   "rock_01.jpg",
14
   "rock_02.jpg",
15
   "sky_01.jpg",
16
   "sky_02.jpg",
17
   "sky_03.jpg",
18
   "sky_04.jpg",
19
   "wood_01.jpg",
20
};
21

22
struct _anim_icon_st
23
{
24
   int start_x;
25
   int start_y;
26
   Evas_Object *o;
27
};
28
typedef struct _anim_icon_st anim_icon_st;
29

30
struct _drag_anim_st
31
{
32
   Evas_Object *icwin;
33
   Evas *e;
34
   Evas_Coord mdx;     /* Mouse-down x */
35
   Evas_Coord mdy;     /* Mouse-down y */
36
   Eina_List *icons;   /* List of icons to animate (anim_icon_st) */
37
   Ecore_Timer *tm;
38
   Ecore_Animator *ea;
39
   Evas_Object *gl;
40
};
41
typedef struct _drag_anim_st drag_anim_st;
42

43
#define DRAG_TIMEOUT 0.3
44
#define ANIM_TIME 0.5
45

46
static Eina_Bool _5s_cancel = EINA_FALSE;
47
static Ecore_Timer *_5s_timeout = NULL;
48

49
static int
50
_item_ptr_cmp(const void *d1, const void *d2)
51
{
52
   return ((const char *) d1 - (const char *) d2);
53
}
54

55
static Elm_Genlist_Item_Class *itc1;
56
static Elm_Gengrid_Item_Class *gic;
57

58
static const char *
59
_drag_data_build(Eina_List **items)
60
{
61
   const char *drag_data = NULL;
62
   if (*items)
63
     {
64
        Eina_Strbuf *str;
65
        Eina_List *l;
66
        Elm_Object_Item *it;
67
        const char *t;
68
        int i = 0;
69

70
        str = eina_strbuf_new();
71
        if (!str) return NULL;
72

73
        /* drag data in form: file://URI1\nfile://URI2 */
74
        EINA_LIST_FOREACH(*items, l, it)
75
          {
76
             t = (char *)elm_object_item_data_get(it);
77
             if (t)
78
               {
79
                  if (i > 0)
80
                    eina_strbuf_append(str, "\n");
81
                  eina_strbuf_append(str, FILESEP);
82
                  eina_strbuf_append(str, t);
83
                  i++;
84
               }
85
          }
86
        drag_data = eina_strbuf_string_steal(str);
87
        eina_strbuf_free(str);
88
     }
89
   return drag_data;
90
}
91

92
static char *
93
_drag_data_extract(char **drag_data)
94
{
95
   char *uri = NULL;
96
   if (!drag_data)
97
     return uri;
98

99
   char *p = *drag_data;
100
   if (!p)
101
     return uri;
102
   char *s = strstr(p, FILESEP);
103
   if (s)
104
     p += FILESEP_LEN;
105
   s = strchr(p, '\n');
106
   uri = p;
107
   if (s)
108
     {
109
        if (s - p > 0)
110
          {
111
             char *s1 = s - 1;
112
             if (s1[0] == '\r')
113
               s1[0] = '\0';
114
             else
115
               {
116
                  char *s2 = s + 1;
117
                  if (s2[0] == '\r')
118
                    {
119
                       s[0] = '\0';
120
                       s++;
121
                    }
122
                  else
123
                    s[0] = '\0';
124
               }
125
          }
126
        else
127
          s[0] = '\0';
128
        s++;
129
     }
130
   else
131
     p = NULL;
132
   *drag_data = s;
133

134
   return uri;
135
}
136

137
static char *
138
gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
139
{
140
   return strdup(data);
141
}
142

143
static Evas_Object *
144
gl_content_get(void *data, Evas_Object *obj, const char *part)
145
{
146
   if (!strcmp(part, "elm.swallow.icon"))
147
     {
148
        Evas_Object *icon = elm_icon_add(obj);
149
        elm_image_file_set(icon, data, NULL);
150
        evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
151
        evas_object_show(icon);
152
        return icon;
153
     }
154
   return NULL;
155
}
156

157
static void
158
gl_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
159
{
160
   eina_stringshare_del(data);
161
}
162

163
static void
164
_win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
165
{
166
   printf("<%s> <%d> will del <%p>\n", __func__, __LINE__, data);
167
   elm_drop_item_container_del(data);
168
   elm_drag_item_container_del(data);
169

170
   if (gic) elm_gengrid_item_class_free(gic);
171
   gic = NULL;
172
   if (itc1) elm_genlist_item_class_free(itc1);
173
   itc1 = NULL;
174
}
175

176
static Elm_Object_Item *
177
_gl_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret EINA_UNUSED, int *yposret)
178
{  /* This function returns pointer to item under (x,y) coords */
179
   printf("<%s> <%d> obj=<%p>\n", __func__, __LINE__, obj);
180
   Elm_Object_Item *gli;
181
   gli = elm_genlist_at_xy_item_get(obj, x, y, yposret);
182
   if (gli)
183
     printf("over <%s>, gli=<%p> yposret %i\n",
184
           (char *)elm_object_item_data_get(gli), gli, *yposret);
185
   else
186
     printf("over none, yposret %i\n", *yposret);
187
   return gli;
188
}
189

190
static Elm_Object_Item *
191
_grid_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret, int *yposret)
192
{  /* This function returns pointer to item under (x,y) coords */
193
   printf("<%s> <%d> obj=<%p>\n", __func__, __LINE__, obj);
194
   Elm_Object_Item *item;
195
   item = elm_gengrid_at_xy_item_get(obj, x, y, xposret, yposret);
196
   if (item)
197
     printf("over <%s>, item=<%p> xposret %i yposret %i\n",
198
           (char *)elm_object_item_data_get(item), item, *xposret, *yposret);
199
   else
200
     printf("over none, xposret %i yposret %i\n", *xposret, *yposret);
201
   return item;
202
}
203

204
static void
205
_gl_poscb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Evas_Coord x, Evas_Coord y, int xposret, int yposret, Elm_Xdnd_Action action EINA_UNUSED)
206
{
207
   printf("<%s> <%d> obj: %p, item: %p <%s>, x y: %d %d, posret: %d %d\n",
208
          __func__, __LINE__, obj, it, elm_object_item_text_get(it),
209
          x, y, xposret, yposret);
210
}
211

212
static Eina_Bool
213
_gl_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret)
214
{  /* This function is called when data is dropped on the genlist */
215
   printf("<%s> <%d> str=<%s>\n", __func__, __LINE__, (char *) ev->data);
216
   if (!ev->data)
217
     return EINA_FALSE;
218
   if (ev->len <= 0)
219
     return EINA_FALSE;
220

221
   char *dd = eina_strndup(ev->data, ev->len);
222
   if (!dd) return EINA_FALSE;
223
   char *p = dd;
224

225
   char *s =  _drag_data_extract(&p);
226
   while (s)
227
     {
228
        switch(yposret)
229
          {
230
           case -1:  /* Dropped on top-part of the it item */
231
                {
232
                   elm_genlist_item_insert_before(obj,
233
                         itc1, strdup(s), NULL, it,
234
                         ELM_GENLIST_ITEM_NONE,
235
                         NULL, NULL);
236
                   break;
237
                }
238
           case  0:  /* Dropped on center of the it item      */
239
           case  1:  /* Dropped on botton-part of the it item */
240
                {
241
                   if (!it) it = elm_genlist_last_item_get(obj);
242
                   if (it) it = elm_genlist_item_insert_after(obj,
243
                                      itc1, strdup(s), NULL, it,
244
                                      ELM_GENLIST_ITEM_NONE,
245
                                                              NULL, NULL);
246
                   else
247
                     it = elm_genlist_item_append(obj,
248
                                itc1, strdup(s), NULL,
249
                                ELM_GENLIST_ITEM_NONE,
250
                                NULL, NULL);
251
                   break;
252
                }
253
           default:
254
                {
255
                   free(dd);
256
                   return EINA_FALSE;
257
                }
258
          }
259

260
        s = _drag_data_extract(&p);
261
     }
262
   free(dd);
263

264
   return EINA_TRUE;
265
}
266

267
static Eina_Bool
268
_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)
269
{  /* This function is called when data is dropped on the genlist */
270
   printf("<%s> <%d> str=<%s>\n", __func__, __LINE__, (char *) ev->data);
271
   if (!ev->data)
272
     return EINA_FALSE;
273
   if (ev->len <= 0)
274
     return EINA_FALSE;
275

276
   char *dd = eina_strndup(ev->data, ev->len);
277
   if (!dd) return EINA_FALSE;
278
   char *p = dd;
279
   char *s = _drag_data_extract(&p);
280
   while(s)
281
     {
282
        if (it)
283
          it = elm_gengrid_item_insert_after(obj, gic, eina_stringshare_add(s), it, NULL, NULL);
284
        else
285
          it = elm_gengrid_item_append(obj, gic, eina_stringshare_add(s), NULL, NULL);
286
        s = _drag_data_extract(&p);
287
     }
288
   free(dd);
289

290
   return EINA_TRUE;
291
}
292

293
static void _gl_obj_mouse_move( void *data, Evas *e, Evas_Object *obj, void *event_info);
294
static void _gl_obj_mouse_up( void *data, Evas *e, Evas_Object *obj, void *event_info);
295

296
static void
297
anim_st_free(drag_anim_st *anim_st)
298
{  /* Stops and free mem of ongoing animation */
299
   printf("<%s> <%d>\n", __func__, __LINE__);
300
   if (anim_st)
301
     {
302
        evas_object_event_callback_del_full
303
           (anim_st->gl, EVAS_CALLBACK_MOUSE_MOVE, _gl_obj_mouse_move, anim_st);
304
        evas_object_event_callback_del_full
305
           (anim_st->gl, EVAS_CALLBACK_MOUSE_UP, _gl_obj_mouse_up, anim_st);
306
        if (anim_st->tm)
307
          {
308
             ecore_timer_del(anim_st->tm);
309
             anim_st->tm = NULL;
310
          }
311

312
        if (anim_st->ea)
313
          {
314
             ecore_animator_del(anim_st->ea);
315
             anim_st->ea = NULL;
316
          }
317

318
        anim_icon_st *st;
319

320
        EINA_LIST_FREE(anim_st->icons, st)
321
          {
322
             evas_object_hide(st->o);
323
             evas_object_del(st->o);
324
             free(st);
325
          }
326

327
        free(anim_st);
328
     }
329
}
330

331
static Eina_Bool
332
_drag_anim_play(void *data, double pos)
333
{  /* Impl of the animation of icons, called on frame time */
334
   drag_anim_st *anim_st = data;
335
   printf("<%s> <%d>\n", __func__, __LINE__);
336
   Eina_List *l;
337
   anim_icon_st *st;
338

339
   if (anim_st)
340
     {
341
        if (pos > 0.99)
342
          {
343
             anim_st->ea = NULL;  /* Avoid deleting on mouse up */
344

345
             EINA_LIST_FOREACH(anim_st->icons, l, st)
346
                evas_object_hide(st->o);   /* Hide animated icons */
347
             anim_st_free(anim_st);
348
             return ECORE_CALLBACK_CANCEL;
349
          }
350

351
        EINA_LIST_FOREACH(anim_st->icons, l, st)
352
          {
353
             int x, y, w, h;
354
             Evas_Coord xm, ym;
355
             evas_object_geometry_get(st->o, NULL, NULL, &w, &h);
356
             evas_pointer_canvas_xy_get(anim_st->e, &xm, &ym);
357
             x = st->start_x + (pos * (xm - (st->start_x + (w/2))));
358
             y = st->start_y + (pos * (ym - (st->start_y + (h/2))));
359
             evas_object_move(st->o, x, y);
360
          }
361

362
        return ECORE_CALLBACK_RENEW;
363
     }
364

365
   return ECORE_CALLBACK_CANCEL;
366
}
367

368
static Eina_Bool
369
_gl_anim_start(void *data)
370
{  /* Start icons animation before actually drag-starts */
371
   drag_anim_st *anim_st = data;
372
   printf("<%s> <%d>\n", __func__, __LINE__);
373
   int yposret = 0;
374

375
   Eina_List *l;
376
   Eina_List *items = eina_list_clone(elm_genlist_selected_items_get(anim_st->gl));
377
   Elm_Object_Item *gli = elm_genlist_at_xy_item_get(anim_st->gl,
378
         anim_st->mdx, anim_st->mdy, &yposret);
379
   if (gli)
380
     {  /* Add the item mouse is over to the list if NOT seleced */
381
        void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
382
        if (!p)
383
          items = eina_list_append(items, gli);
384
     }
385

386
   EINA_LIST_FOREACH(items, l, gli)
387
     {  /* Now add icons to animation window */
388
        Evas_Object *o = elm_object_item_part_content_get(gli,
389
              "elm.swallow.icon");
390

391
        if (o)
392
          {
393
             int w, h;
394
             const char *f;
395
             const char *g;
396
             anim_icon_st *st = calloc(1, sizeof(*st));
397
             elm_image_file_get(o, &f, &g);
398
             Evas_Object *ic = elm_icon_add(anim_st->gl);
399
             elm_image_file_set(ic, f, g);
400
             evas_object_geometry_get(o, &st->start_x, &st->start_y, &w, &h);
401
             evas_object_size_hint_align_set(ic,
402
                   EVAS_HINT_FILL, EVAS_HINT_FILL);
403
             evas_object_size_hint_weight_set(ic,
404
                   EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
405

406
             evas_object_move(ic, st->start_x, st->start_y);
407
             evas_object_resize(ic, w, h);
408
             evas_object_show(ic);
409

410
             st->o = ic;
411
             anim_st->icons = eina_list_append(anim_st->icons, st);
412
          }
413
     }
414

415
   eina_list_free(items);
416

417
   anim_st->tm = NULL;
418
   anim_st->ea = ecore_animator_timeline_add(DRAG_TIMEOUT,
419
         _drag_anim_play, anim_st);
420

421
   return ECORE_CALLBACK_CANCEL;
422
}
423

424
static void
425
_gl_obj_mouse_up(
426
   void *data,
427
   Evas *e EINA_UNUSED,
428
   Evas_Object *obj EINA_UNUSED,
429
   void *event_info EINA_UNUSED)
430
{  /* Cancel any drag waiting to start on timeout */
431
   drag_anim_st *anim_st = data;
432
   anim_st_free(anim_st);
433
}
434

435
static void
436
_gl_obj_mouse_move(
437
   void *data,
438
   Evas *e EINA_UNUSED,
439
   Evas_Object *obj EINA_UNUSED,
440
   void *event_info)
441
{  /* Cancel any drag waiting to start on timeout */
442

443
   if (((Evas_Event_Mouse_Move *)event_info)->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
444
     {
445
        drag_anim_st *anim_st = data;
446
        anim_st_free(anim_st);
447
     }
448
}
449

450
static void
451
_gl_obj_mouse_down(
452
   void *data,
453
   Evas *e EINA_UNUSED,
454
   Evas_Object *obj EINA_UNUSED,
455
   void *event_info)
456
{  /* Launch a timer to start drag animation */
457
   Evas_Event_Mouse_Down *ev = event_info;
458
   drag_anim_st *anim_st = calloc(1, sizeof(*anim_st));
459
   anim_st->e = e;
460
   anim_st->mdx = ev->canvas.x;
461
   anim_st->mdy = ev->canvas.y;
462
   anim_st->gl = data;
463
   anim_st->tm = ecore_timer_add(DRAG_TIMEOUT, _gl_anim_start, anim_st);
464
   evas_object_event_callback_add(data, EVAS_CALLBACK_MOUSE_UP,
465
         _gl_obj_mouse_up, anim_st);
466
   evas_object_event_callback_add(data, EVAS_CALLBACK_MOUSE_MOVE,
467
         _gl_obj_mouse_move, anim_st);
468
}
469
/* END   - Handling drag start animation */
470

471
static void
472
_gl_dragdone(void *data, Evas_Object *obj EINA_UNUSED, Eina_Bool doaccept)
473
{
474
   printf("<%s> <%d> data=<%p> doaccept=<%d>\n",
475
         __func__, __LINE__, data, doaccept);
476

477
   Elm_Object_Item *it;
478
   Eina_List *l;
479

480
   if (_5s_cancel)
481
     {
482
        ecore_timer_del(_5s_timeout);
483
        _5s_timeout = NULL;
484
     }
485

486
   if (doaccept)
487
     {  /* Remove items dragged out (accepted by target) */
488
        EINA_LIST_FOREACH(data, l, it)
489
           elm_object_item_del(it);
490
     }
491

492
   eina_list_free(data);
493
   return;
494
}
495

496
static Eina_Bool
497
_5s_timeout_gone(void *data)
498
{
499
   printf("Cancel DnD\n");
500
   elm_drag_cancel(data);
501
   _5s_timeout = NULL;
502
   return ECORE_CALLBACK_CANCEL;
503
}
504

505
static Evas_Object *
506
_gl_createicon(void *data, Evas_Object *win, Evas_Coord *xoff, Evas_Coord *yoff)
507
{
508
   printf("<%s> <%d>\n", __func__, __LINE__);
509
   Evas_Object *icon = NULL;
510
   Evas_Object *o = elm_object_item_part_content_get(data, "elm.swallow.icon");
511

512
   if (o)
513
     {
514
        int xm, ym, w = 30, h = 30;
515
        const char *f;
516
        const char *g;
517
        elm_image_file_get(o, &f, &g);
518
        evas_pointer_canvas_xy_get(evas_object_evas_get(o), &xm, &ym);
519
        if (xoff) *xoff = xm - (w/2);
520
        if (yoff) *yoff = ym - (h/2);
521
        icon = elm_icon_add(win);
522
        elm_image_file_set(icon, f, g);
523
        evas_object_size_hint_align_set(icon,
524
              EVAS_HINT_FILL, EVAS_HINT_FILL);
525
        evas_object_size_hint_weight_set(icon,
526
              EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
527
        if (xoff && yoff) evas_object_move(icon, *xoff, *yoff);
528
        evas_object_resize(icon, w, h);
529
     }
530

531
   return icon;
532
}
533

534
static Eina_List *
535
_gl_icons_get(void *data)
536
{  /* Start icons animation before actually drag-starts */
537
   printf("<%s> <%d>\n", __func__, __LINE__);
538
   int yposret = 0;
539

540
   Eina_List *l;
541

542
   Eina_List *icons = NULL;
543

544
   Evas_Coord xm, ym;
545
   evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym);
546
   Eina_List *items = eina_list_clone(elm_genlist_selected_items_get(data));
547
   Elm_Object_Item *gli = elm_genlist_at_xy_item_get(data,
548
         xm, ym, &yposret);
549
   if (gli)
550
     {  /* Add the item mouse is over to the list if NOT seleced */
551
        void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
552
        if (!p)
553
          items = eina_list_append(items, gli);
554
     }
555

556
   EINA_LIST_FOREACH(items, l, gli)
557
     {  /* Now add icons to animation window */
558
        Evas_Object *o = elm_object_item_part_content_get(gli,
559
              "elm.swallow.icon");
560

561
        if (o)
562
          {
563
             int x, y, w, h;
564
             const char *f, *g;
565
             elm_image_file_get(o, &f, &g);
566
             Evas_Object *ic = elm_icon_add(data);
567
             elm_image_file_set(ic, f, g);
568
             evas_object_geometry_get(o, &x, &y, &w, &h);
569
             evas_object_size_hint_align_set(ic,
570
                   EVAS_HINT_FILL, EVAS_HINT_FILL);
571
             evas_object_size_hint_weight_set(ic,
572
                   EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
573

574
             evas_object_move(ic, x, y);
575
             evas_object_resize(ic, w, h);
576
             evas_object_show(ic);
577

578
             icons =  eina_list_append(icons, ic);
579
          }
580
     }
581

582
   eina_list_free(items);
583
   return icons;
584
}
585

586
static const char *
587
_gl_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items)
588
{  /* Construct a string of dragged info, user frees returned string */
589
   const char *drag_data = NULL;
590
   printf("<%s> <%d>\n", __func__, __LINE__);
591

592
   *items = eina_list_clone(elm_genlist_selected_items_get(obj));
593
   if (it)
594
     {  /* Add the item mouse is over to the list if NOT seleced */
595
        void *p = eina_list_search_unsorted(*items, _item_ptr_cmp, it);
596
        if (!p)
597
          *items = eina_list_append(*items, it);
598
     }
599
   drag_data = _drag_data_build(items);
600
   printf("<%s> <%d> Sending <%s>\n", __func__, __LINE__, drag_data);
601

602
   return drag_data;
603
}
604

605
static const char *
606
_grid_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items)
607
{  /* Construct a string of dragged info, user frees returned string */
608
   const char *drag_data = NULL;
609
   printf("<%s> <%d>\n", __func__, __LINE__);
610

611
   *items = eina_list_clone(elm_gengrid_selected_items_get(obj));
612
   if (it)
613
     {  /* Add the item mouse is over to the list if NOT seleced */
614
        void *p = eina_list_search_unsorted(*items, _item_ptr_cmp, it);
615
        if (!p)
616
          *items = eina_list_append(*items, it);
617
     }
618
   drag_data = _drag_data_build(items);
619
   printf("<%s> <%d> Sending <%s>\n", __func__, __LINE__, drag_data);
620

621
   return drag_data;
622
}
623

624
static Eina_Bool
625
_gl_dnd_default_anim_data_getcb(Evas_Object *obj,  /* The genlist object */
626
      Elm_Object_Item *it,
627
      Elm_Drag_User_Info *info)
628
{  /* This called before starting to drag, mouse-down was on it */
629
   info->format = ELM_SEL_FORMAT_TARGETS;
630
   info->createicon = _gl_createicon;
631
   info->createdata = it;
632
   info->icons = _gl_icons_get(obj);
633
   info->dragdone = _gl_dragdone;
634

635
   /* Now, collect data to send for drop from ALL selected items */
636
   /* Save list pointer to remove items after drop and free list on done */
637
   info->data = _gl_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
638
   printf("%s - data = %s\n", __func__, info->data);
639
   info->acceptdata = info->donecbdata;
640

641
   if (info->data)
642
     return EINA_TRUE;
643
   else
644
     return EINA_FALSE;
645
}
646

647
static Eina_Bool
648
_gl_data_getcb(Evas_Object *obj,  /* The genlist object */
649
      Elm_Object_Item *it,
650
      Elm_Drag_User_Info *info)
651
{  /* This called before starting to drag, mouse-down was on it */
652
   info->format = ELM_SEL_FORMAT_TARGETS;
653
   info->createicon = _gl_createicon;
654
   info->createdata = it;
655
   info->dragdone = _gl_dragdone;
656

657
   /* Now, collect data to send for drop from ALL selected items */
658
   /* Save list pointer to remove items after drop and free list on done */
659
   info->data = _gl_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
660
   info->acceptdata = info->donecbdata;
661

662
   if (info->data)
663
     return EINA_TRUE;
664
   else
665
     return EINA_FALSE;
666
}
667

668
static Eina_List *
669
_grid_icons_get(void *data)
670
{  /* Start icons animation before actually drag-starts */
671
   printf("<%s> <%d>\n", __func__, __LINE__);
672

673
   Eina_List *l;
674

675
   Eina_List *icons = NULL;
676

677
   Evas_Coord xm, ym;
678
   evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym);
679
   Eina_List *items = eina_list_clone(elm_gengrid_selected_items_get(data));
680
   Elm_Object_Item *gli = elm_gengrid_at_xy_item_get(data,
681
         xm, ym, NULL, NULL);
682
   if (gli)
683
     {  /* Add the item mouse is over to the list if NOT seleced */
684
        void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli);
685
        if (!p)
686
          items = eina_list_append(items, gli);
687
     }
688

689
   EINA_LIST_FOREACH(items, l, gli)
690
     {  /* Now add icons to animation window */
691
        Evas_Object *o = elm_object_item_part_content_get(gli,
692
              "elm.swallow.icon");
693

694
        if (o)
695
          {
696
             int x, y, w, h;
697
             const char *f, *g;
698
             elm_image_file_get(o, &f, &g);
699
             Evas_Object *ic = elm_icon_add(data);
700
             elm_image_file_set(ic, f, g);
701
             evas_object_geometry_get(o, &x, &y, &w, &h);
702
             evas_object_size_hint_align_set(ic,
703
                   EVAS_HINT_FILL, EVAS_HINT_FILL);
704
             evas_object_size_hint_weight_set(ic,
705
                   EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
706

707
             evas_object_move(ic, x, y);
708
             evas_object_resize(ic, w, h);
709
             evas_object_show(ic);
710

711
             icons =  eina_list_append(icons, ic);
712
          }
713
     }
714

715
   eina_list_free(items);
716
   return icons;
717
}
718

719
static void
720
_gl_dragstart(void *data EINA_UNUSED, Evas_Object *obj)
721
{
722
   printf("<%s> <%d>\n", __func__, __LINE__);
723
   if (_5s_cancel)
724
     _5s_timeout = ecore_timer_add(5.0, _5s_timeout_gone, obj);
725
}
726

727
static Eina_Bool
728
_grid_data_getcb(Evas_Object *obj,  /* The genlist object */
729
                 Elm_Object_Item *it,
730
                 Elm_Drag_User_Info *info)
731
{
732
   /* This called before starting to drag, mouse-down was on it */
733
   info->format = ELM_SEL_FORMAT_TARGETS;
734
   info->createicon = _gl_createicon;
735
   info->createdata = it;
736
   info->dragstart = _gl_dragstart;
737
   info->icons = _grid_icons_get(obj);
738
   info->dragdone = _gl_dragdone;
739

740
   /* Now, collect data to send for drop from ALL selected items */
741
   /* Save list pointer to remove items after drop and free list on done */
742
   info->data = _grid_get_drag_data(obj, it, (Eina_List **) &info->donecbdata);
743
   printf("%s %d- data = %s\n", __func__, __LINE__, info->data);
744
   info->acceptdata = info->donecbdata;
745

746
   if (info->data)
747
     return EINA_TRUE;
748
   else
749
     return EINA_FALSE;
750
}
751

752
void
753
test_dnd_genlist_default_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
754
{
755
   char buf[PATH_MAX];
756
   Evas_Object *win, *gl, *bxx, *bx2, *lb;
757
   int i, j;
758

759
   win = elm_win_util_standard_add("dnd-genlist-default-anim", "DnD-Genlist-Default-Anim");
760
   elm_win_autodel_set(win, EINA_TRUE);
761

762
   bxx = elm_box_add(win);
763
   elm_box_horizontal_set(bxx, EINA_FALSE);
764
   evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
765
   elm_win_resize_object_add(win, bxx);
766
   evas_object_show(bxx);
767

768
   lb = elm_label_add(win);
769
   elm_object_text_set(lb, "Drag and drop between genlists with default anim.");
770
   evas_object_size_hint_min_set(lb, 0, 50);
771
   evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5);
772
   evas_object_show(lb);
773
   elm_box_pack_end(bxx, lb);
774

775
   bx2 = elm_box_add(win);
776
   elm_box_horizontal_set(bx2, EINA_TRUE);
777
   evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
778
   evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
779
   evas_object_show(bx2);
780
   elm_box_pack_end(bxx, bx2);
781

782
   itc1 = elm_genlist_item_class_new();
783
   itc1->item_style     = "default";
784
   itc1->func.text_get = gl_text_get;
785
   itc1->func.content_get  = gl_content_get;
786
   itc1->func.del       = NULL;
787

788
   for (j = 0; j < 2; j++)
789
     {
790
        gl = elm_genlist_add(win);
791

792
        /* START Drag and Drop handling */
793
        evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
794
        elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
795
        elm_drop_item_container_add(gl,
796
              ELM_SEL_FORMAT_TARGETS,
797
              _gl_item_getcb,
798
              NULL, NULL,
799
              NULL, NULL,
800
              _gl_poscb, NULL,
801
              _gl_dropcb, NULL);
802

803
        elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
804
              _gl_item_getcb, _gl_dnd_default_anim_data_getcb);
805

806
        // FIXME: This causes genlist to resize the horiz axis very slowly :(
807
        // Reenable this and resize the window horizontally, then try to resize it back
808
        //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
809
        evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
810
        evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
811
        elm_box_pack_end(bx2, gl);
812
        evas_object_show(gl);
813

814
        for (i = 0; i < 20; i++)
815
          {
816
             snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
817
             const char *path = eina_stringshare_add(buf);
818
             elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
819
          }
820
     }
821

822
   evas_object_resize(win, 680 * elm_config_scale_get(),
823
                           800 * elm_config_scale_get());
824
   evas_object_show(win);
825
}
826

827
void
828
test_dnd_genlist_user_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
829
{
830
   char buf[PATH_MAX];
831
   Evas_Object *win, *gl, *bxx;
832
   int i, j;
833

834
   win = elm_win_util_standard_add("dnd-genlist-user-anim", "DnD-Genlist-User-Anim");
835
   elm_win_autodel_set(win, EINA_TRUE);
836

837
   bxx = elm_box_add(win);
838
   elm_box_horizontal_set(bxx, EINA_TRUE);
839
   evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
840
   elm_win_resize_object_add(win, bxx);
841
   evas_object_show(bxx);
842

843
   itc1 = elm_genlist_item_class_new();
844
   itc1->item_style     = "default";
845
   itc1->func.text_get = gl_text_get;
846
   itc1->func.content_get  = gl_content_get;
847
   itc1->func.del       = NULL;
848

849
   for (j = 0; j < 2; j++)
850
     {
851
        gl = elm_genlist_add(win);
852

853
        /* START Drag and Drop handling */
854
        evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
855
        elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
856
        elm_drop_item_container_add(gl,
857
              ELM_SEL_FORMAT_TARGETS,
858
              _gl_item_getcb,
859
              NULL, NULL,
860
              NULL, NULL,
861
              NULL, NULL,
862
              _gl_dropcb, NULL);
863

864
        elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
865
              _gl_item_getcb, _gl_data_getcb);
866

867
        /* We add mouse-down, up callbacks to start/stop drag animation */
868
        evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN,
869
              _gl_obj_mouse_down, gl);
870
        /* END Drag and Drop handling */
871

872
        // FIXME: This causes genlist to resize the horiz axis very slowly :(
873
        // Reenable this and resize the window horizontally, then try to resize it back
874
        //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
875
        evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
876
        evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
877
        elm_box_pack_end(bxx, gl);
878
        evas_object_show(gl);
879

880
        for (i = 0; i < 20; i++)
881
          {
882
             snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
883
             const char *path = eina_stringshare_add(buf);
884
             elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
885
          }
886
     }
887

888
   evas_object_resize(win, 680 * elm_config_scale_get(),
889
                           800 * elm_config_scale_get());
890
   evas_object_show(win);
891
}
892

893
void
894
test_dnd_genlist_gengrid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
895
{
896
   char buf[PATH_MAX];
897
   Evas_Object *win, *bxx;
898
   int i;
899

900
   win = elm_win_util_standard_add("dnd-genlist-gengrid", "DnD-Genlist-Gengrid");
901
   elm_win_autodel_set(win, EINA_TRUE);
902

903
   bxx = elm_box_add(win);
904
   elm_box_horizontal_set(bxx, EINA_TRUE);
905
   evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
906
   elm_win_resize_object_add(win, bxx);
907
   evas_object_show(bxx);
908

909
     {
910
        itc1 = elm_genlist_item_class_new();
911
        itc1->item_style     = "default";
912
        itc1->func.text_get = gl_text_get;
913
        itc1->func.content_get  = gl_content_get;
914
        itc1->func.del       = NULL;
915

916
        Evas_Object *gl = elm_genlist_add(win);
917
        evas_object_smart_callback_add(win, "delete,request", _win_del, gl);
918

919
        /* START Drag and Drop handling */
920
        elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */
921
        elm_drop_item_container_add(gl, ELM_SEL_FORMAT_TARGETS, _gl_item_getcb, NULL, NULL,
922
              NULL, NULL, NULL, NULL, _gl_dropcb, NULL);
923

924
        elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT,
925
              _gl_item_getcb, _gl_dnd_default_anim_data_getcb);
926
        /* END Drag and Drop handling */
927

928
        // FIXME: This causes genlist to resize the horiz axis very slowly :(
929
        // Reenable this and resize the window horizontally, then try to resize it back
930
        //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
931
        evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
932
        evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
933
        elm_box_pack_end(bxx, gl);
934
        evas_object_show(gl);
935

936
        for (i = 0; i < 20; i++)
937
          {
938
             snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
939
             const char *path = eina_stringshare_add(buf);
940
             elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
941
          }
942
     }
943

944
     {
945
        Evas_Object *grid = elm_gengrid_add(win);
946
        evas_object_smart_callback_add(win, "delete,request", _win_del, grid);
947
        elm_gengrid_item_size_set(grid,
948
                                  ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150));
949
        elm_gengrid_horizontal_set(grid, EINA_FALSE);
950
        elm_gengrid_reorder_mode_set(grid, EINA_FALSE);
951
        elm_gengrid_multi_select_set(grid, EINA_TRUE); /* We allow multi drag */
952
        evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
953
        evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
954

955
        gic = elm_gengrid_item_class_new();
956
        gic->item_style = "default";
957
        gic->func.text_get = gl_text_get;
958
        gic->func.content_get = gl_content_get;
959
        gic->func.del = gl_del_cb;
960

961
        elm_drop_item_container_add(grid, ELM_SEL_FORMAT_TARGETS, _grid_item_getcb, NULL, NULL,
962
              NULL, NULL, NULL, NULL, _grid_dropcb, NULL);
963

964
        elm_drag_item_container_add(grid, ANIM_TIME, DRAG_TIMEOUT,
965
                                    _grid_item_getcb, _grid_data_getcb);
966
        for (i = 0; i < 20; i++)
967
          {
968
             snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
969
             const char *path = eina_stringshare_add(buf);
970
             elm_gengrid_item_append(grid, gic, path, NULL, NULL);
971
          }
972
        elm_box_pack_end(bxx, grid);
973
        evas_object_show(grid);
974
     }
975

976
   evas_object_resize(win, 680 * elm_config_scale_get(),
977
                           800 * elm_config_scale_get());
978
   evas_object_show(win);
979
}
980

981
static Eina_Bool _drop_box_button_new_cb(void *data, Evas_Object *obj, Elm_Selection_Data *ev)
982
{
983
   Evas_Object *win = data;
984
   if (ev->len <= 0)
985
     return EINA_FALSE;
986

987
   char *dd = eina_strndup(ev->data, ev->len);
988
   if (!dd) return EINA_FALSE;
989
   char *p = dd;
990
   char *s = _drag_data_extract(&p);
991
   while (s)
992
     {
993
        Evas_Object *ic = elm_icon_add(win);
994
        elm_image_file_set(ic, s, NULL);
995
        evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
996
        Evas_Object *bt = elm_button_add(win);
997
        elm_object_text_set(bt, "Dropped button");
998
        elm_object_part_content_set(bt, "icon", ic);
999
        elm_box_pack_end(obj, bt);
1000
        evas_object_show(bt);
1001
        evas_object_show(ic);
1002
        s = _drag_data_extract(&p);
1003
     }
1004
   free(dd);
1005

1006
   return EINA_TRUE;
1007
}
1008

1009
void _enter_but_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
1010
{
1011
   printf("Entered %s - drop it here and I will never print this line anymore.\n", __func__);
1012
}
1013

1014
static Eina_Bool _drop_but_icon_change_cb(void *data, Evas_Object *obj, Elm_Selection_Data *ev)
1015
{
1016
   Evas_Object *win = data;
1017
   Evas_Object *ic;
1018
   if (ev->len <= 0)
1019
     return EINA_FALSE;
1020

1021
   char *dd = eina_strndup(ev->data, ev->len);
1022
   if (!dd) return EINA_FALSE;
1023
   char *p = dd;
1024
   char *s = _drag_data_extract(&p);
1025
   ic = elm_icon_add(win);
1026
   elm_image_file_set(ic, s, NULL);
1027
   evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1028
   evas_object_del(elm_object_part_content_get(obj, "icon"));
1029
   elm_object_part_content_set(obj, "icon", ic);
1030
   evas_object_show(ic);
1031
   free(dd);
1032

1033
   return EINA_TRUE;
1034
}
1035

1036
/* Callback used to test multi-callbacks feature */
1037
static Eina_Bool _drop_but_cb_remove_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev EINA_UNUSED)
1038
{
1039
   printf("Second callback called - removing it\n");
1040
   elm_drop_target_del(obj, ELM_SEL_FORMAT_TARGETS, _enter_but_cb, NULL, NULL, NULL, NULL, NULL, _drop_but_cb_remove_cb, NULL);
1041
   return EINA_TRUE;
1042
}
1043

1044
static Eina_Bool _drop_bg_change_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev)
1045
{
1046
   if (ev->len <= 0)
1047
     return EINA_FALSE;
1048

1049
   char *dd = eina_strndup(ev->data, ev->len);
1050
   if (!dd) return EINA_FALSE;
1051
   char *p = dd;
1052
   char *s = _drag_data_extract(&p);
1053
   elm_bg_file_set(obj, s, NULL);
1054
   free(dd);
1055

1056
   return EINA_TRUE;
1057
}
1058

1059
static void
1060
_5s_cancel_ck_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
1061
{
1062
   _5s_cancel = elm_check_state_get(obj);
1063
}
1064

1065
void
1066
test_dnd_multi_features(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1067
{
1068
   char buf[PATH_MAX];
1069
   Evas_Object *win, *bxx, *bg;
1070
   int i;
1071

1072
   win = elm_win_util_standard_add("dnd-multi-features", "DnD-Multi Features");
1073
   elm_win_autodel_set(win, EINA_TRUE);
1074

1075
   bg = elm_bg_add(win);
1076
   evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1077
   elm_drop_target_add(bg, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_bg_change_cb, NULL);
1078
   elm_win_resize_object_add(win, bg);
1079

1080
   /* And show the background. */
1081
   evas_object_show(bg);
1082
   bxx = elm_box_add(win);
1083
   elm_box_horizontal_set(bxx, EINA_TRUE);
1084
   evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1085
   elm_win_resize_object_add(win, bxx);
1086
   evas_object_show(bxx);
1087

1088
     {
1089
        Evas_Object *grid = elm_gengrid_add(bxx);
1090
        evas_object_smart_callback_add(win, "delete,request", _win_del, grid);
1091
        elm_gengrid_item_size_set(grid,
1092
                                  ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100));
1093
        elm_gengrid_horizontal_set(grid, EINA_FALSE);
1094
        elm_gengrid_reorder_mode_set(grid, EINA_FALSE);
1095
        elm_gengrid_multi_select_set(grid, EINA_TRUE); /* We allow multi drag */
1096
        evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1097
        evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
1098

1099
        gic = elm_gengrid_item_class_new();
1100
        gic->item_style = "default";
1101
        gic->func.text_get = gl_text_get;
1102
        gic->func.content_get = gl_content_get;
1103

1104
        elm_drag_item_container_add(grid, ANIM_TIME, DRAG_TIMEOUT,
1105
              _grid_item_getcb, _grid_data_getcb);
1106
        for (i = 0; i < 10; i++)
1107
          {
1108
             snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]);
1109
             const char *path = eina_stringshare_add(buf);
1110
             elm_gengrid_item_append(grid, gic, path, NULL, NULL);
1111
          }
1112
        elm_box_pack_end(bxx, grid);
1113
        evas_object_show(grid);
1114
     }
1115

1116
     {
1117
        Evas_Object *ic, *bt;
1118
        Evas_Object *vert_box = elm_box_add(bxx);
1119
        evas_object_size_hint_weight_set(vert_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1120
        elm_box_pack_end(bxx, vert_box);
1121
        evas_object_show(vert_box);
1122
        elm_drop_target_add(vert_box, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_box_button_new_cb, win);
1123

1124
        _5s_cancel = EINA_FALSE;
1125
        Evas_Object *ck = elm_check_add(vert_box);
1126
        elm_object_style_set(ck, "toggle");
1127
        elm_object_text_set(ck, "Cancel after 5s:");
1128
        elm_check_state_set(ck, _5s_cancel);
1129
        evas_object_smart_callback_add(ck, "changed", _5s_cancel_ck_changed, NULL);
1130
        elm_box_pack_end(vert_box, ck);
1131
        evas_object_show(ck);
1132

1133
        ic = elm_icon_add(win);
1134
        snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1135
        elm_image_file_set(ic, buf, NULL);
1136
        evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1137
        bt = elm_button_add(win);
1138
        elm_object_text_set(bt, "Multi-callbacks check");
1139
        elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_but_icon_change_cb, win);
1140
        elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, _enter_but_cb, NULL, NULL, NULL, NULL, NULL, _drop_but_cb_remove_cb, NULL);
1141
        elm_object_part_content_set(bt, "icon", ic);
1142
        elm_box_pack_end(vert_box, bt);
1143
        evas_object_show(bt);
1144
        evas_object_show(ic);
1145

1146
        ic = elm_icon_add(win);
1147
        snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1148
        elm_image_file_set(ic, buf, NULL);
1149
        evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1150
        bt = elm_button_add(win);
1151
        elm_object_text_set(bt, "Drop into me to change my icon");
1152
        elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_but_icon_change_cb, win);
1153
        elm_object_part_content_set(bt, "icon", ic);
1154
        elm_box_pack_end(vert_box, bt);
1155
        evas_object_show(bt);
1156
        evas_object_show(ic);
1157

1158
        ic = elm_icon_add(win);
1159
        snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1160
        elm_image_file_set(ic, buf, NULL);
1161
        evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1162
        bt = elm_button_add(win);
1163
        elm_object_text_set(bt, "No action on drop");
1164
        elm_object_part_content_set(bt, "icon", ic);
1165
        elm_box_pack_end(vert_box, bt);
1166
        evas_object_show(bt);
1167
        evas_object_show(ic);
1168
     }
1169
   evas_object_resize(win, 680 * elm_config_scale_get(),
1170
                           800 * elm_config_scale_get());
1171
   evas_object_show(win);
1172
}
1173

1174
static void
1175
_enter_cb(void *data EINA_UNUSED, Evas_Object *obj)
1176
{
1177
   printf("%s: obj: %s %p enter\n", __func__,
1178
          evas_object_type_get(obj), obj);
1179
}
1180

1181
static void
1182
_leave_cb(void *data EINA_UNUSED, Evas_Object *obj)
1183
{
1184
   printf("%s: obj: %s %p leave\n", __func__,
1185
          evas_object_type_get(obj), obj);
1186
}
1187

1188
static void
1189
_pos_cb(void *data EINA_UNUSED, Evas_Object *obj, Evas_Coord x, Evas_Coord y, Elm_Xdnd_Action action)
1190
{
1191
   printf("%s: obj: %s %p pos: %d %d, action: %d\n", __func__,
1192
          evas_object_type_get(obj), obj, x, y, action);
1193
}
1194

1195
static Eina_Bool
1196
_label_drop_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev)
1197
{
1198
   const char *text = ev->data;
1199
   printf("%s: obj: %s %p drop data: %s\n", __func__,
1200
          evas_object_type_get(obj), obj, text);
1201
   elm_object_text_set(obj, text);
1202
   return EINA_TRUE;
1203
}
1204

1205
static Eina_Bool
1206
_image_drop_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev)
1207
{
1208
   char *f = (char*)eina_memdup(ev->data, ev->len, 1);
1209

1210
   printf("%s: obj: %s %p drop data: %s\n", __func__,
1211
          evas_object_type_get(obj), obj, f);
1212
   elm_image_file_set(obj, f, NULL);
1213
   free(f);
1214
   return EINA_TRUE;
1215
}
1216

1217
static Evas_Object *
1218
_label_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, Evas_Coord *yoff)
1219
{
1220
   Evas_Object *lb = data;
1221
   Evas_Object *icon;
1222
   const char *text;
1223
   Evas_Coord x, y, w, h;
1224
   int xm, ym;
1225

1226
   icon = elm_label_add(parent);
1227
   text = elm_object_text_get(lb);
1228
   elm_object_text_set(icon, text);
1229

1230
   evas_object_geometry_get(lb, &x, &y, &w, &h);
1231
   evas_object_move(icon, x, y);
1232
   evas_object_resize(icon, w, h);
1233
   evas_object_show(icon);
1234

1235
   evas_pointer_canvas_xy_get(evas_object_evas_get(lb), &xm, &ym);
1236
   if (xoff) *xoff = xm - (w / 2);
1237
   if (yoff) *yoff = ym - (h / 2);
1238

1239
   return icon;
1240
}
1241

1242
static void
1243
_label_drag_done_cb(void *data, Evas_Object *obj EINA_UNUSED)
1244
{
1245
   free(data);
1246
}
1247

1248
static void
1249
_label_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1250
{
1251
   Evas_Object *lb = data;
1252
   const char *mkup = elm_object_text_get(lb);
1253
   char *text = evas_textblock_text_markup_to_utf8(NULL, mkup);
1254

1255
   if (!text)
1256
     {
1257
        printf("Cannot convert text\n");
1258
     }
1259
   elm_drag_start(lb, ELM_SEL_FORMAT_TEXT, text, ELM_XDND_ACTION_COPY,
1260
                  _label_create_icon, lb,
1261
                  NULL, NULL, NULL, NULL,
1262
                  _label_drag_done_cb, text);
1263
}
1264

1265
static Evas_Object *
1266
_image_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, Evas_Coord *yoff)
1267
{
1268
   Evas_Object *ic;
1269
   Evas_Object *io = data;
1270
   const char *f, *g;
1271
   Evas_Coord x, y, w, h, xm, ym;
1272

1273
   elm_image_file_get(io, &f, &g);
1274
   ic = elm_image_add(parent);
1275
   elm_image_file_set(ic, f, g);
1276
   evas_object_geometry_get(io, &x, &y, &w, &h);
1277
   evas_object_move(ic, x, y);
1278
   evas_object_resize(ic, 60, 60);
1279
   evas_object_show(ic);
1280

1281
   evas_pointer_canvas_xy_get(evas_object_evas_get(io), &xm, &ym);
1282
   if (xoff) *xoff = xm - 30;
1283
   if (yoff) *yoff = ym - 30;
1284

1285
   return ic;
1286
}
1287

1288
static void
1289
_image_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1290
{
1291
   Evas_Object *io = data;
1292
   const char *f;
1293
   char dd[PATH_MAX];
1294

1295
   elm_image_file_get(io, &f, NULL);
1296
   snprintf(dd, sizeof(dd), "file://%s", f);
1297

1298
   elm_drag_start(io, ELM_SEL_FORMAT_IMAGE, dd, ELM_XDND_ACTION_COPY,
1299
                  _image_create_icon, io,
1300
                  NULL, NULL, NULL, NULL, NULL, NULL);
1301
}
1302

1303
void
1304
test_dnd_types(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1305
{
1306
   Evas_Object *win, *bx, *bx1, *lb, *io, *en;
1307
   int i;
1308

1309
   win = elm_win_util_standard_add("dnd-types", "DnD types");
1310
   elm_win_autodel_set(win, EINA_TRUE);
1311

1312
   bx = elm_box_add(win);
1313
   elm_box_horizontal_set(bx, EINA_TRUE);
1314
   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1315
   elm_win_resize_object_add(win, bx);
1316
   evas_object_show(bx);
1317

1318
   for(i = 0; i < 2; i++)
1319
     {
1320
        char buf[PATH_MAX];
1321
        bx1 = elm_box_add(win);
1322
        evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1323
        evas_object_size_hint_align_set(bx1, EVAS_HINT_FILL, EVAS_HINT_FILL);
1324
        elm_box_pack_end(bx, bx1);
1325
        evas_object_show(bx1);
1326

1327
        lb = elm_label_add(win);
1328
        if (i == 0)
1329
          elm_object_text_set(lb, "This is an label.<br/>You can drag or drop text here.<br/>"
1330
                              "This is a larger label with newlines<br/>"
1331
                              "to make it bigger, bit it won't expand or wrap<br/>"
1332
                              "just be a block of text that can't change its<br/>"
1333
                              "formatting as it's fixed based on text<br/>");
1334
        else
1335
          elm_object_text_set(lb, "Another label for drag and drop test.<br/>"
1336
                              "A small label. You can drag or drop text.<br/><br/><br/>");
1337
        elm_drop_target_add(lb, ELM_SEL_FORMAT_TEXT,
1338
                            _enter_cb, NULL,
1339
                            _leave_cb, NULL,
1340
                            _pos_cb, NULL,
1341
                            _label_drop_cb, NULL);
1342
        evas_object_event_callback_add(lb, EVAS_CALLBACK_MOUSE_DOWN, _label_mouse_down_cb, lb);
1343
        elm_box_pack_end(bx1, lb);
1344
        evas_object_show(lb);
1345

1346
        en = elm_entry_add(win);
1347
        if (i == 0)
1348
          {
1349
             elm_object_text_set(en,
1350
                                 "Entry:<br/>You can only drop <b>text</> here.<br/>"
1351
                                 "This is an entry widget in this window that<br/>"
1352
                                 "uses markup <b>like this</> for styling.");
1353
             elm_entry_cnp_mode_set(en, ELM_CNP_MODE_PLAINTEXT);
1354
          }
1355
        else
1356
          {
1357
             elm_object_text_set(en,
1358
                                 "Entry:<br/>You can drop <b>text or image</> here.<br/>"
1359
                                 "This is an entry widget in this window that<br/>"
1360
                                 "uses markup <b>like this</> for styling.");
1361

1362
          }
1363
        evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1364
        evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
1365
        elm_box_pack_end(bx1, en);
1366
        evas_object_show(en);
1367

1368
        if (i == 0)
1369
          snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
1370
        else
1371
          snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get());
1372
        io = elm_image_add(win);
1373
        elm_image_file_set(io, buf, NULL);
1374
        evas_object_size_hint_weight_set(io, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1375
        evas_object_size_hint_align_set(io, EVAS_HINT_FILL, EVAS_HINT_FILL);
1376
        evas_object_size_hint_min_set(io, 100, 100);
1377
        elm_drop_target_add(io, ELM_SEL_FORMAT_IMAGE,
1378
                            _enter_cb, NULL,
1379
                            _leave_cb, NULL,
1380
                            _pos_cb, NULL,
1381
                            _image_drop_cb, NULL);
1382
        evas_object_event_callback_add(io, EVAS_CALLBACK_MOUSE_DOWN, _image_mouse_down_cb, io);
1383
        elm_box_pack_end(bx1, io);
1384
        evas_object_show(io);
1385
     }
1386

1387
   evas_object_show(win);
1388
   evas_object_resize(win, 400 * elm_config_scale_get(),
1389
                           400 * elm_config_scale_get());
1390
}
1391

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.