e9b7ff7460602e03235daaaab3ebc5ecf6573e7d
[apps/home/gallery.git] / src / features / gl-gridview.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
4   * Licensed under the Flora License, Version 1.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *     http://www.tizenopensource.org/license
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16
17 #include "gl-debug.h"
18 #include "gl-gridview.h"
19 #include "gl-ui-util.h"
20 #include "gl-util.h"
21 #include "gl-albums.h"
22 #include "gl-db-handler.h"
23 #include "gl-ext-ug-load.h"
24 #include "gl-ext-exec.h"
25
26 /* Icon swallowed to part "elm.swallow.icon" */
27 #define GL_GRID_ICON_SIZE 156
28 #define GL_GRID_TOUCH_RANGE 20
29
30 #define GL_PHOTOFRAME_STYLE_VIDEO_BOOKMARK "default_layout_video_bookmark"
31 #define GL_PHOTOFRAME_STYLE_VIDEO "default_layout_video"
32 #define GL_PHOTOFRAME_STYLE_DEFAULT "default_layout"
33 #define GL_GENGRID_ITEM_STYLE_THUMBNAIL "gallery/thumbnail_view"
34
35
36 static void
37 _gl_grid_drag_up(void *data, Evas_Object * obj, void *event_info)
38 {
39 }
40
41 static void
42 _gl_grid_drag_right(void *data, Evas_Object * obj, void *event_info)
43 {
44 }
45
46 static void
47 _gl_grid_drag_down(void *data, Evas_Object * obj, void *event_info)
48 {
49 }
50
51 static void
52 _gl_grid_drag_left(void *data, Evas_Object * obj, void *event_info)
53 {
54 }
55
56 static void
57 _gl_grid_drag_stop(void *data, Evas_Object * obj, void *event_info)
58 {
59 }
60
61 static void
62 _gl_grid_selected(void *data, Evas_Object * obj, void *event_info)
63 {
64 }
65
66 static void
67 _gl_grid_unselected(void *data, Evas_Object * obj, void *event_info)
68 {
69 }
70
71 static void
72 _gl_grid_clicked(void *data, Evas_Object * obj, void *event_info)
73 {
74 }
75
76 static void
77 _gl_grid_longpress(void *data, Evas_Object * obj, void *event_info)
78 {
79 }
80
81 static void
82 _gl_grid_sel_icon(void *data)
83 {
84         gl_dbg("");
85         gl_grid_sel_cb(data, NULL, NULL);
86 }
87
88 static void
89 _gl_grid_item_check_changed(void *data, Evas_Object * obj, void *event_info)
90 {
91         GL_CHECK(obj);
92         GL_CHECK(data);
93         gl_item *gitem = (gl_item *) data;
94         GL_CHECK(gitem->ad);
95         gl_appdata *ad = (gl_appdata *)gitem->ad;
96         int view_mode = gl_get_view_mode(ad);
97         gl_dbg("");
98
99         if (view_mode != GL_VIEW_THUMBS_EDIT)
100                 return;
101
102         Eina_Bool checked = elm_check_state_get(obj);
103         gitem->checked = checked;
104         if (checked)
105         {
106                 gl_dbg("Append:%s", gitem->item->file_url);
107                 gl_db_selected_list_append(ad, gitem);
108         }
109         else
110         {
111                 gl_dbg("Remove:%s", gitem->item->file_url);
112                 gl_db_selected_list_remove(ad, gitem);
113         }
114
115         /* Display selectioninfo */
116         int cnt = gl_db_selected_list_count(ad);
117         gl_ui_create_selinfo(ad, ad->gridinfo.edit_layout,
118                              ad->gridinfo.nf_it_edit, ad->gridinfo.thumbs_cnt,
119                              cnt, false);
120 }
121
122 static void
123 _gl_grid_shrink_resp_cb(void *data, Evas_Object * obj,
124         const char *emission, const char *source)
125 {
126         GL_CHECK(data);
127         gl_dbg("");
128
129         _gl_grid_sel_icon(data);
130         edje_object_signal_callback_del(obj, "shrink,expand,done", "bg",
131                                         _gl_grid_shrink_resp_cb);
132 }
133
134 Evas_Object *
135 _gl_grid_get_content(void *data, Evas_Object * obj, const char *part)
136 {
137         GL_CHECK_NULL(part);
138         GL_CHECK_NULL(strlen(part));
139         GL_CHECK_NULL(data);
140         gl_item *gitem = (gl_item *) data;
141         GL_CHECK_NULL(gitem->item);
142         GL_CHECK_NULL(gitem->ad);
143         gl_appdata *ad = (gl_appdata *)gitem->ad;
144         int view_mode = gl_get_view_mode(ad);
145         int item_size = ad->gridinfo.icon_size;
146
147         if (!strcmp(part, "elm.swallow.icon"))
148         {
149                 Evas_Object *layout = elm_layout_add(obj);
150                 GL_CHECK_NULL(layout);
151                 Evas_Object *bg = elm_bg_add(obj);
152                 GL_CHECK_NULL(bg);
153                 elm_bg_load_size_set(bg, item_size, item_size);
154
155                 int all_cnt = ad->maininfo.medias_cnt;
156
157                 /* Only one photo in a  album */
158                 char *path = NULL;
159                 if (all_cnt < 2 && gitem->item->type == MINFO_ITEM_IMAGE) {
160                         path = _GETICON(gitem->item->file_url);
161                         if (gl_is_image_valid(ad, path) == false)
162                                 path = _GETICON(gitem->item->thumb_url);
163                         elm_bg_file_set(bg, path, NULL);
164                 } else {
165                         path = _gl_get_thumb(ad, gitem->item->file_url,
166                                              &gitem->item->thumb_url);
167                         if (path) {
168                                 elm_bg_file_set(bg, path, NULL);
169                                 free(path);
170                                 path = NULL;
171                         } else {
172                                 elm_bg_file_set(bg, gitem->item->thumb_url,
173                                                 NULL);
174                         }
175                 }
176
177                 evas_object_size_hint_max_set(bg, item_size, item_size);
178                 evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
179                 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
180                 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
181
182                 if (gitem->item->type == MINFO_ITEM_VIDEO)
183                 {
184                         int bk_len = 0;
185                         // Set bookmark icon.
186                         if (gitem->item->meta_info == NULL ||
187                             gitem->item->meta_info->video_info == NULL)
188                         {
189                                 bk_len = 0;
190                         }
191                         else
192                         {
193                                 bk_len = g_list_length(gitem->item->meta_info->video_info->bookmarks);
194                         }
195                         if (bk_len)
196                         {
197                                 elm_layout_theme_set(layout, GL_CLASS_GENGRID,
198                                         GL_GRP_PHOTOFRAME, GL_PHOTOFRAME_STYLE_VIDEO_BOOKMARK);
199                         }
200                         else
201                         {
202                                 elm_layout_theme_set(layout, GL_CLASS_GENGRID,
203                                         GL_GRP_PHOTOFRAME, GL_PHOTOFRAME_STYLE_VIDEO);
204                         }
205                         elm_object_part_content_set(layout, "elm.swallow.icon", bg);
206
207                         if (bk_len)
208                         {
209                                 Evas_Object *icon = elm_icon_add(obj);
210                                 elm_icon_file_set(icon, GL_THUMB_BOOKMARK, NULL);
211                                 evas_object_show(icon);
212                                 elm_object_part_content_set(layout, "elm.swallow.bookmarkicon", icon);
213                         }
214
215                         // Set duration text
216                         /* Running time of the video */
217                         if (gitem->item->meta_info &&
218                             gitem->item->meta_info->video_info)
219                         {
220                                 char ret_str[GL_FILE_PATH_LEN_MAX] = { 0, };
221                                 unsigned int v_dur = gitem->item->meta_info->video_info->duration;
222                                 int duration = floor(v_dur / GL_TIME_MSEC_PER_SEC);
223                                 int dur_hr = 0;
224                                 int dur_min = 0;
225                                 int dur_sec = 0;
226                                 int tmp = 0;
227
228                                 if (duration >= GL_TIME_SEC_PER_HOUR)
229                                 {
230                                         dur_sec = duration % GL_TIME_SEC_PER_MIN;
231                                         tmp = floor(duration / GL_TIME_SEC_PER_MIN);
232                                         dur_min = tmp % GL_TIME_MIN_PER_HOUR;
233                                         dur_hr = floor(tmp / GL_TIME_MIN_PER_HOUR);
234                                 }
235                                 else if (duration >= GL_TIME_SEC_PER_MIN)
236                                 {
237                                         dur_hr = 0;
238                                         dur_min = floor(duration / GL_TIME_SEC_PER_MIN);
239                                         dur_sec = duration % GL_TIME_SEC_PER_MIN;
240                                 }
241                                 else
242                                 {
243                                         dur_hr = 0;
244                                         dur_min = 0;
245                                         dur_sec = duration % GL_TIME_SEC_PER_MIN;
246                                 }
247
248                                 snprintf(ret_str, sizeof(ret_str),
249                                         "%02d:%02d:%02d", dur_hr, dur_min, dur_sec);
250                                 ret_str[strlen(ret_str)] = '\0';
251                                 elm_object_part_text_set(layout, "elm.text", ret_str);
252                         }
253                 }
254                 else
255                 {
256                         elm_layout_theme_set(layout, GL_CLASS_GENGRID,
257                                 GL_GRP_PHOTOFRAME, GL_PHOTOFRAME_STYLE_DEFAULT);
258                         elm_object_part_content_set(layout, "elm.swallow.icon", bg);
259                 }
260
261                 evas_object_show(layout);
262                 evas_object_event_callback_add(layout,
263                         EVAS_CALLBACK_MOUSE_DOWN, gl_grid_item_mouse_down, gitem);
264                 evas_object_event_callback_add(layout,
265                         EVAS_CALLBACK_MOUSE_UP, gl_grid_item_mouse_up, gitem);
266
267                 return layout;
268         }
269         else if (!strcmp(part, "elm.swallow.end") &&
270                  (view_mode == GL_VIEW_THUMBS_EDIT))
271         {
272                 Evas_Object *ck = NULL;
273
274                 ck = elm_check_add(obj);
275                 GL_CHECK_NULL(ck);
276                 elm_object_style_set(ck, GL_CHECKBOX_STYLE_GRID);
277                 evas_object_propagate_events_set(ck, EINA_FALSE);
278
279                 gitem->check_obj = ck;
280                 elm_check_state_set(ck, gitem->checked);
281
282                 evas_object_smart_callback_add(ck, "changed",
283                         _gl_grid_item_check_changed, data);
284                 evas_object_show(ck);
285
286                 return ck;
287         }
288
289         return NULL;
290 }
291
292 static bool
293 _gl_grid_create_items(void *data, Evas_Object * parent)
294 {
295         GL_CHECK_FALSE(data);
296         gl_appdata *ad = (gl_appdata *)data;
297         int i = 0;
298         int item_cnt = 0;
299         gl_item *gitem = NULL;
300         int ret = -1;
301         /* Get all medias count of current album */
302         int cnt = ad->maininfo.medias_cnt;
303         gl_dbg("List count : %d gv_mode : %d", cnt, ad->gridinfo.grid_view_mode);
304
305         ad->gridinfo.thumbgic.item_style = GL_GENGRID_ITEM_STYLE_THUMBNAIL;
306         ad->gridinfo.thumbgic.func.text_get = NULL;
307         ad->gridinfo.thumbgic.func.content_get = _gl_grid_get_content;
308
309         elm_gengrid_clear(parent);
310         for (i = 1; i <= cnt; i++)
311         {
312                 gl_db_get_item_by_index(ad, i, false, &gitem);
313                 if (gitem == NULL || gitem->item == NULL ||
314                     gitem->item->uuid == NULL) {
315                         gl_dbgE("Invalid gitem. continue...");
316                         continue;
317                 }
318
319                 if (!gitem->item->file_url)
320                 {
321                         gl_dbg("file_url is invalid.");
322                         ret = minfo_delete_media_id(ad->maininfo.db_handle,
323                                                         gitem->item->uuid);
324                         if (ret < 0)
325                         {
326                                 continue;
327                         }
328                         gl_db_selected_list_remove(ad, gitem);
329                         gl_db_item_list_remove(ad, gitem);
330                         cnt--;
331                         i--;
332                         gitem = NULL;
333                         continue;
334                 }
335
336                 if (ad->gridinfo.back_to_normal)
337                         gitem->checked = false;
338
339                 if (ad->gridinfo.grid_view_mode == GL_GRID_IMAGES &&
340                     gitem->item->type != MINFO_ITEM_IMAGE)
341                     continue;
342
343                 gitem->elm_item = elm_gengrid_item_append(parent,
344                                                         &(ad->gridinfo.thumbgic),
345                                                         gitem,
346                                                         gl_grid_sel_cb,
347                                                         gitem);
348                 item_cnt++;
349                 gitem->sequence = item_cnt;
350
351         }
352
353         elm_gengrid_select_mode_set(parent, ELM_OBJECT_SELECT_MODE_NONE);
354
355         ad->gridinfo.thumbs_cnt = item_cnt;
356         ad->gridinfo.back_to_normal = false;
357
358         if (item_cnt == 0)
359         {
360                 return EINA_FALSE;
361         }
362         else
363         {
364                 return EINA_TRUE;
365         }
366 }
367
368 void
369 gl_grid_item_mouse_down(void *data, Evas * e,
370         Evas_Object * obj, void *event_info)
371 {
372         GL_CHECK(obj);
373         GL_CHECK(event_info);
374         GL_CHECK(data);
375         gl_item *gitem = (gl_item *) data;
376         GL_CHECK(gitem->ad);
377         gl_appdata *ad = (gl_appdata *)gitem->ad;
378         Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *) event_info;
379
380         ad->gridinfo.touch_info.x = ev->output.x;
381         ad->gridinfo.touch_info.y = ev->output.y;
382
383         if (ad->uginfo.ug_called_by_me == NULL)
384         {
385                 edje_object_signal_emit(_EDJ(obj), "mouse,down,shrink", "bg");
386                 ad->gridinfo.touch_info.b_pressed = true;
387         }
388 }
389
390 void
391 gl_grid_item_mouse_up(void *data, Evas * e,
392         Evas_Object * obj, void *event_info)
393 {
394         GL_CHECK(data);
395         gl_item *gitem = (gl_item *) data;
396         GL_CHECK(gitem->ad);
397         gl_appdata *ad = (gl_appdata *)gitem->ad;
398
399         if (!event_info || !obj)
400         {
401                 goto RET_WO_EXEC;
402         }
403
404         Evas_Event_Mouse_Up *ev = event_info;
405         if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD ||
406             ev->event_flags & EVAS_EVENT_FLAG_ON_SCROLL)
407         {
408                 goto RET_WO_EXEC;
409         }
410         if ((abs(ad->gridinfo.touch_info.x - ev->output.x) > GL_GRID_TOUCH_RANGE) ||
411             (abs(ad->gridinfo.touch_info.y - ev->output.y) > GL_GRID_TOUCH_RANGE))
412         {
413                 goto RET_WO_EXEC;
414         }
415
416         gl_dbg("");
417
418         if (ad->gridinfo.touch_info.b_pressed)
419         {
420                 edje_object_signal_emit(_EDJ(obj), "mouse,up,expand", "bg");
421                 edje_object_signal_callback_add(_EDJ(obj),
422                         "shrink,expand,done", "bg", _gl_grid_shrink_resp_cb, data);
423                 ad->gridinfo.touch_info.b_pressed = false;
424         }
425         return;
426
427       RET_WO_EXEC:
428         if (ad->gridinfo.touch_info.b_pressed)
429         {
430                 edje_object_signal_emit(_EDJ(obj), "mouse,up,expand", "bg");
431                 ad->gridinfo.touch_info.b_pressed = false;
432         }
433 }
434
435 static int
436 _gl_grid_set_view_property(Evas_Object * gv)
437 {
438         elm_gengrid_align_set(gv, 0.5, 0.0);
439         // vertical scrolling
440         elm_gengrid_horizontal_set(gv, EINA_FALSE);
441         elm_gengrid_bounce_set(gv, EINA_FALSE, EINA_TRUE);
442         elm_gengrid_multi_select_set(gv, EINA_TRUE);
443
444         evas_object_smart_callback_add(gv, "selected", _gl_grid_selected, NULL);
445         evas_object_smart_callback_add(gv, "unselected", _gl_grid_unselected, NULL);
446         evas_object_smart_callback_add(gv, "clicked", _gl_grid_clicked, NULL);
447         evas_object_smart_callback_add(gv, "longpressed", _gl_grid_longpress, NULL);
448         evas_object_smart_callback_add(gv, "drag,start,up", _gl_grid_drag_up, NULL);
449         evas_object_smart_callback_add(gv, "drag,start,right", _gl_grid_drag_right, NULL);
450         evas_object_smart_callback_add(gv, "drag,start,down", _gl_grid_drag_down, NULL);
451         evas_object_smart_callback_add(gv, "drag,start,left", _gl_grid_drag_left, NULL);
452         evas_object_smart_callback_add(gv, "drag,stop", _gl_grid_drag_stop, NULL);
453         evas_object_size_hint_weight_set(gv, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
454
455         return 0;
456 }
457
458 /*
459 * Set new view to all/image_grid_view.
460 *
461 * b_noc, true: it's nocontents view, false: normal view.
462 */
463 static int _gl_grid_set_view(void *data, Evas_Object *view, bool b_noc)
464 {
465         GL_CHECK_VAL(data, -1);
466         gl_appdata *ad = (gl_appdata *)data;
467         gl_grid_mode view_mode = ad->gridinfo.grid_view_mode;
468
469         switch (view_mode) {
470         case GL_GRID_ALL:
471                 ad->gridinfo.all_view = view;
472                 if (b_noc)
473                         gl_grid_set_nocontents(ad, view);
474                 else
475                         gl_grid_set_nocontents(ad, NULL);
476                 break;
477         case GL_GRID_IMAGES:
478                 ad->gridinfo.image_view = view;
479                 if (b_noc)
480                         gl_grid_set_nocontents(ad, view);
481                 else
482                         gl_grid_set_nocontents(ad, NULL);
483                 break;
484         default:
485                 break;
486         }
487
488         return 0;
489 }
490
491 void
492 gl_grid_sel_cb(void *data, Evas_Object * obj, void *event_info)
493 {
494         GL_CHECK(data);
495         gl_item *gitem = (gl_item *) data;
496         GL_CHECK(gitem->item);
497         GL_CHECK(gitem->item->file_url);
498         GL_CHECK(strlen(gitem->item->file_url));
499         GL_CHECK(gitem->ad);
500         gl_appdata *ad = (gl_appdata *)gitem->ad;
501         int view_mode = gl_get_view_mode(ad);
502         gl_dbg("");
503
504         if (view_mode != GL_VIEW_THUMBS)
505                 return;
506         else
507                 gl_dbg("ViewMode");
508
509         if (gitem->item->type == MINFO_ITEM_IMAGE ||
510             gitem->item->type == MINFO_ITEM_VIDEO)
511         {
512                 gl_dbg("Loading UG-IMAGE(VIDEO)-VIEWER");
513                 gl_ext_load_iv_ug(ad, gitem);
514         }
515 }
516
517 /*
518 * When select album, show first (GL_FIRST_VIEW_END_POS+1) medias.
519 * Then use idler to get other medias from DB and appened
520 * them to gridview.
521 * In order to reduce transit time of first show of thumbnails view.
522 * Cause most of time is spent for getting records from DB,
523 * so we get first (GL_FIRST_VIEW_END_POS+1) items and show thumbnails view,
524 * it will accelerate view show.
525 */
526 int
527 gl_grid_idler_append_items(void *data)
528 {
529         GL_CHECK_VAL(data, -1);
530         gl_appdata *ad = (gl_appdata *)data;
531         GL_CHECK_VAL(ad->albuminfo.current_album, -1);
532         GL_CHECK_VAL(ad->gridinfo.all_view, -1);
533         int i = 0;
534         int item_cnt = 0;
535         gl_item *gitem = NULL;
536         /* Get all medias count of current album */
537         int cnt = ad->maininfo.medias_cnt;
538         int ret = -1;
539
540         gl_dbg("First view medias count: %d; girdview mode: %d",
541                 cnt, ad->gridinfo.grid_view_mode);
542         if (ad->maininfo.medias_cnt != (GL_FIRST_VIEW_END_POS + 1))
543         {
544                 gl_dbg("No any more items, return!");
545                 return -1;
546         }
547         /* Get other items from DB */
548         ret = gl_db_get_item_list(ad, ad->albuminfo.current_album,
549                                   (GL_FIRST_VIEW_END_POS + 1),
550                                   GL_GET_UNTIL_LAST_RECORD);
551         gl_dbg("\n\n############gl_db_get_item_list Error code: %d#################\n", ret);
552         if (ret < 0)
553         {
554                 gl_dbg("gl_db_get_item_list ERROR, return!");
555                 return ret;
556         }
557
558         cnt = ad->maininfo.medias_cnt;
559         gl_dbg("Grid view all medias count: %d", cnt);
560
561         if (ad->gridinfo.grid_view_mode != GL_GRID_ALL)
562         {
563                 /* Event gridview mode is wrong, we still need to get other records */
564                 gl_dbg("Gridview mode is wrong, return!");
565                 return -1;
566         }
567
568         /* From (GL_FIRST_VIEW_END_POS + 2)th item to last one */
569         i = GL_FIRST_VIEW_END_POS + 2;
570
571         for (; i <= cnt; i++)
572         {
573                 gl_db_get_item_by_index(ad, i, false, &gitem);
574                 if (gitem == NULL || gitem->item == NULL ||
575                     gitem->item->uuid == NULL ) {
576                         gl_dbgE("Invalid gitem, continue...");
577                         continue;
578                 }
579
580                 if (!gitem->item->file_url)
581                 {
582                         gl_dbg("file_url is invalid.");
583                         minfo_delete_media_id(ad->maininfo.db_handle, gitem->item->uuid);
584                         gl_db_selected_list_remove(ad, gitem);
585                         gl_db_item_list_remove(ad, gitem);
586                         cnt--;
587                         i--;
588                         gitem = NULL;
589                         continue;
590                 }
591
592                 if (ad->gridinfo.grid_view_mode == GL_GRID_IMAGES &&
593                     gitem->item->type != MINFO_ITEM_IMAGE)
594                     continue;
595
596                 gitem->elm_item = elm_gengrid_item_append(ad->gridinfo.all_view,
597                                                                 &(ad->gridinfo.thumbgic),
598                                                                 gitem,
599                                                                 gl_grid_sel_cb,
600                                                                 gitem);
601                 item_cnt++;
602                 gitem->sequence = item_cnt + GL_FIRST_VIEW_END_POS + 1;
603         }
604
605         gl_dbg("\n\n<<<<<<<<Use idler to append other medias--Done<<<<<<<<<\n");
606         if (item_cnt == 0)
607         {
608                 return -1;
609         }
610         else
611         {
612                 ad->gridinfo.thumbs_cnt = item_cnt + GL_FIRST_VIEW_END_POS + 1;
613                 gl_dbg("All count appended: %d", ad->gridinfo.thumbs_cnt);
614                 return 0;
615         }
616 }
617
618 Evas_Object *gl_grid_create_view(void *data, Evas_Object * parent, gl_grid_mode mode)
619 {
620         GL_CHECK_NULL(parent);
621         GL_CHECK_NULL(data);
622         gl_appdata *ad = (gl_appdata *)data;
623         Evas_Object *grid = NULL;
624         int icon_size = 0;
625         int item_w = 0;
626         int item_h = 0;
627         ad->gridinfo.grid_view_mode = mode;
628         grid = elm_gengrid_add(ad->maininfo.navi_bar);
629         double scale_factor = ad->maininfo.win_scale;
630         gl_dbg("Own scale: %f, elm_config_scale_get =%f", scale_factor, elm_config_scale_get());
631         icon_size = (int)(GL_GRID_ICON_SIZE * scale_factor);
632         item_w = (int)(GL_GRID_ITEM_SIZE_W * scale_factor);
633         item_h = (int)(GL_GRID_ITEM_SIZE_H * scale_factor);
634
635         if (!_gl_grid_create_items(ad, grid)) {
636                 evas_object_del(grid);
637                 grid = NULL;
638                 Evas_Object *noc = gl_ui_create_nocontents_full(ad);
639                 gl_grid_set_nocontents(ad, noc);
640                 evas_object_show(noc);
641                 return noc;
642         } else {
643                 gl_dbg("gl_grid_item_cnt : %d", ad->gridinfo.thumbs_cnt);
644                 if (ad->gridinfo.thumbs_cnt == GL_GRID_ITEM_ZOOM_LEVEL_01_CNT) {
645                         icon_size *= GL_GRID_ITEM_ZOOM_LEVEL_01;
646                         item_w *= GL_GRID_ITEM_ZOOM_LEVEL_01;
647                         item_h *= GL_GRID_ITEM_ZOOM_LEVEL_01;
648                 } else if (ad->gridinfo.thumbs_cnt <= GL_GRID_ITEM_ZOOM_LEVEL_02_CNT) {
649                         icon_size *= GL_GRID_ITEM_ZOOM_LEVEL_02;
650                         item_w *= GL_GRID_ITEM_ZOOM_LEVEL_02;
651                         item_h *= GL_GRID_ITEM_ZOOM_LEVEL_02;
652                 }
653
654                 ad->gridinfo.icon_size = icon_size;
655                 gl_grid_set_nocontents(ad, NULL);
656                 evas_object_show(grid);
657         }
658
659         elm_gengrid_item_size_set(grid, item_w, item_h);
660         gl_dbg("Gengrid item width: %d, height: %d, icon size: %d.", item_w,
661                item_h, icon_size);
662
663         _gl_grid_set_view_property(grid);
664
665         return grid;
666 }
667
668 int
669 gl_grid_change_to_edit(void *data)
670 {
671         GL_CHECK_VAL(data, -1);
672         gl_appdata *ad = (gl_appdata *)data;
673         GL_CHECK_VAL(ad->gridinfo.edit_view, -1);
674         gl_dbg("");
675         int view_mode = gl_get_view_mode(ad);
676         bool b_ret = false;
677
678         if (view_mode != GL_VIEW_THUMBS_EDIT)
679         {
680                 gl_dbg("Error: not in edit mode");
681                 return -1;
682         }
683
684         b_ret = _gl_grid_create_items(ad, ad->gridinfo.edit_view);
685         gl_grid_set_item_size(ad, NULL);
686
687         if (!b_ret) {
688                 gl_dbgE("Create items failed!");
689                 return -1;
690         } else {
691                 return 0;
692         }
693 }
694
695 int
696 gl_grid_change_to_view(void *data)
697 {
698         GL_CHECK_VAL(data, -1);
699         gl_appdata *ad = (gl_appdata *)data;
700         gl_dbg("");
701         int gridview_mode = ad->gridinfo.grid_view_mode;
702         bool b_ret = false;
703
704         if (ad->gridinfo.all_view == NULL
705             && ad->gridinfo.image_view == NULL)
706         {
707                 gl_dbg("Error : Any gridview doesn't exist");
708                 return -1;
709         }
710
711         ad->gridinfo.back_to_normal = true;     // back from edit mode, save state.
712
713         if (gridview_mode == GL_GRID_ALL)
714                 b_ret = _gl_grid_create_items(ad, ad->gridinfo.all_view);
715         else if (gridview_mode == GL_GRID_IMAGES)
716                 b_ret = _gl_grid_create_items(ad, ad->gridinfo.image_view);
717         gl_grid_set_item_size(ad, NULL);
718
719         if (!b_ret) {
720                 gl_dbgE("Create items failed!");
721                 return -1;
722         } else {
723                 return 0;
724         }
725 }
726
727 /**
728 * Get all/image_grid_view.
729 *
730 * True returned if it's normal view, if it's nocontents view return false.
731 */
732 bool gl_grid_get_view(void *data, Evas_Object **view)
733 {
734         GL_CHECK_FALSE(data);
735         gl_appdata *ad = (gl_appdata *)data;
736         gl_grid_mode view_mode = ad->gridinfo.grid_view_mode;
737         Evas_Object *gv = NULL;
738         bool b_view = false;
739
740         switch (view_mode) {
741         case GL_GRID_ALL:
742                 gv = ad->gridinfo.all_view;
743                 if (gv && ad->gridinfo.all_nocontents == NULL)
744                         b_view = true;
745                 break;
746         case GL_GRID_IMAGES:
747                 gv = ad->gridinfo.image_view;
748                 if (gv && ad->gridinfo.image_nocontents == NULL)
749                         b_view = true;
750                 break;
751         default:
752                 break;
753         }
754
755         /* Nocontents */
756         if (!b_view)
757                 gl_dbg("Previous view is Nocontents...");
758
759         /* Return view */
760         if (view)
761                 *view = gv;
762
763         return b_view;
764 }
765
766 /* Assign new value to all/image_grid_nocontents */
767 int gl_grid_set_nocontents(void *data, Evas_Object *noc)
768 {
769         GL_CHECK_VAL(data, -1);
770         gl_appdata *ad = (gl_appdata *)data;
771         gl_grid_mode view_mode = ad->gridinfo.grid_view_mode;
772
773         switch (view_mode) {
774         case GL_GRID_ALL:
775                 ad->gridinfo.all_nocontents = noc;
776                 break;
777         case GL_GRID_IMAGES:
778                 ad->gridinfo.image_nocontents = noc;
779                 break;
780         default:
781                 break;
782         }
783
784         return 0;
785 }
786
787 int gl_grid_update_items_cnt(void *data, int new_cnt)
788 {
789         GL_CHECK_VAL(data, -1);
790         gl_appdata *ad = (gl_appdata *)data;
791
792         gl_dbg("gridview display item count=%d", new_cnt);
793         ad->gridinfo.updated_thumbs_cnt = new_cnt;
794
795         return 0;
796 }
797
798 int gl_grid_set_item_size(void *data, Evas_Object * gridview)
799 {
800         GL_CHECK_VAL(data, -1);
801         gl_appdata *ad = (gl_appdata *)data;
802         int icon_size = (int)(GL_GRID_ICON_SIZE * ad->maininfo.win_scale);
803         int item_w = (int)(GL_GRID_ITEM_SIZE_W * ad->maininfo.win_scale);
804         int item_h = (int)(GL_GRID_ITEM_SIZE_H * ad->maininfo.win_scale);
805         int cnt = 0;
806         Evas_Object *gv = NULL;
807         int view_mode = gl_get_view_mode(ad);
808
809         if (gridview) {
810                 gv = gridview;
811         } else {
812                 bool b_view = false;
813                 if (view_mode == GL_VIEW_THUMBS_EDIT) {
814                         b_view = true;
815                         gv = ad->gridinfo.edit_view;
816                 } else {
817                         b_view = gl_grid_get_view(ad, &gv);
818                 }
819
820                 if (!b_view || !gv) {
821                         gl_dbgE("gridview is invalid!");
822                         return -1;
823                 }
824         }
825
826         if (ad->gridinfo.updated_thumbs_cnt <= 0) {
827                 cnt = ad->gridinfo.thumbs_cnt;
828         } else {
829                 cnt = ad->gridinfo.updated_thumbs_cnt;
830                 ad->gridinfo.updated_thumbs_cnt = 0;
831         }
832
833         if (cnt == GL_GRID_ITEM_ZOOM_LEVEL_01_CNT) {
834                 icon_size *= GL_GRID_ITEM_ZOOM_LEVEL_01;
835                 item_w *= GL_GRID_ITEM_ZOOM_LEVEL_01;
836                 item_h *= GL_GRID_ITEM_ZOOM_LEVEL_01;
837         } else if (cnt <= GL_GRID_ITEM_ZOOM_LEVEL_02_CNT) {
838                 icon_size *= GL_GRID_ITEM_ZOOM_LEVEL_02;
839                 item_w *= GL_GRID_ITEM_ZOOM_LEVEL_02;
840                 item_h *= GL_GRID_ITEM_ZOOM_LEVEL_02;
841         }
842
843         ad->gridinfo.icon_size = icon_size;
844         elm_gengrid_item_size_set(gv, item_w, item_h);
845         gl_dbg("Gengrid item width: %d, height: %d, icon size: %d.", item_w,
846                item_h, icon_size);
847         return 0;
848 }
849
850 Eina_Bool
851 gl_grid_update_items(void *data)
852 {
853         GL_CHECK_FALSE(data);
854         gl_appdata *ad = (gl_appdata *)data;
855         Eina_Bool res = EINA_FALSE;
856         Evas_Object *gv = NULL;
857         int view_mode = gl_get_view_mode(ad);
858         bool b_view = false;
859         gl_dbg("");
860
861         if (view_mode == GL_VIEW_THUMBS_EDIT)
862         {
863                 gl_dbg("\n\nEdit_Mode\n");
864                 gv = ad->gridinfo.edit_view;
865         }
866         else
867         {
868                 b_view = gl_grid_get_view(ad, &gv);
869                 GL_CHECK_FALSE(gv);
870         }
871         if (b_view) {
872                 res = _gl_grid_create_items(ad, gv);
873                 if (!res)
874                 {
875                         gl_dbg("_gl_grid_create_items() return false...");
876                         evas_object_hide(gv);
877                         evas_object_del(gv);
878                         _gl_grid_set_view(ad, NULL, false);
879                         Evas_Object *noc = gl_ui_create_nocontents_full(ad);
880                         evas_object_show(noc);
881                         _gl_grid_set_view(ad, noc, true);
882
883                         elm_object_part_content_unset(ad->gridinfo.layout, "elm.swallow.view");
884                         elm_object_part_content_set(ad->gridinfo.layout, "elm.swallow.view",
885                                                noc);
886                 }
887                 else
888                 {
889                         gl_grid_set_item_size(ad, gv);
890                 }
891         }
892         else
893         {
894                 gl_dbg("Remove nocontents view.");
895                 evas_object_hide(gv);
896                 evas_object_del(gv);
897                 _gl_grid_set_view(ad, NULL, false);
898                 bool b_noc = false;
899                 int view_m = ad->gridinfo.grid_view_mode;
900
901                 Evas_Object *view = NULL;
902                 view = gl_grid_create_view(ad, ad->maininfo.navi_bar, view_m);
903                 if ((view_m == GL_GRID_IMAGES &&
904                      ad->gridinfo.image_nocontents) ||
905                     (view_m == GL_GRID_ALL &&
906                      ad->gridinfo.all_nocontents))
907                         b_noc = true;
908
909                 /* No nocotents removed, gridview created, enable edit button */
910                 if (!b_noc)
911                         gl_ui_disable_toolbar_item(ad, false,
912                                                    GL_NAVI_THUMBS,
913                                                    false);
914                 else
915                         b_noc = true;
916                 _gl_grid_set_view(ad, view, b_noc);
917
918                 elm_object_part_content_unset(ad->gridinfo.layout, "elm.swallow.view");
919                 elm_object_part_content_set(ad->gridinfo.layout, "elm.swallow.view", view);
920         }
921
922         return res;
923 }
924
925 int
926 gl_grid_clear_view(void *data)
927 {
928         GL_CHECK_VAL(data, -1);
929         gl_appdata *ad = (gl_appdata *)data;
930
931         if (ad->gridinfo.all_view != NULL)
932         {
933                 evas_object_del(ad->gridinfo.all_view);
934                 ad->gridinfo.all_view = NULL;
935         }
936
937         if (ad->gridinfo.image_view != NULL)
938         {
939                 evas_object_del(ad->gridinfo.image_view);
940                 ad->gridinfo.image_view = NULL;
941         }
942
943         ad->gridinfo.all_nocontents = NULL;
944         ad->gridinfo.image_nocontents = NULL;
945
946         ad->gridinfo.edit_it = NULL;
947
948         return 0;
949 }