2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
18 #include <vconf-keys.h>
20 #include "gl-albums.h"
21 #include "gl-gridview.h"
22 #include "gl-listview.h"
23 #include "gl-controlbar.h"
24 #include "gl-ui-util.h"
26 #include "gl-button.h"
27 #include "gl-db-handler.h"
29 #include "gl-progressbar.h"
30 #include "gl-strings.h"
32 /* Width and height of album item */
33 #define GL_ALBUM_ITEM_WIDTH 358
34 #define GL_ALBUM_ITEM_HEIGHT 360
36 #define GL_ALBUM_COVER_THUMB_1 1
37 #define GL_ALBUM_COVER_THUMB_2 2
38 #define GL_ALBUM_COVER_THUMB_3 3
40 /* Size of album icon */
41 #define GL_COVER_SIZE 318
42 /* Size of table padding */
43 #define GL_COVER_PAD 3
44 #define GL_COVER_PAD_1 2
45 /* Pure size of album icon; value: 196 */
46 #define GL_COVER_ICON_S (GL_COVER_SIZE - 2 * GL_COVER_PAD)
48 * Album icon is set by elm_table,
49 * it's divided into 3x3, 9 grids, each grid size is 64
51 #define GL_COVER_GRID_S 102
53 #define GL_COVER_2X_GRID_S (GL_COVER_ICON_S - GL_COVER_GRID_S - GL_COVER_PAD)
55 /* Album color level and alpha value */
56 #define GL_ALBUM_TEXT_COLOR_CNT 6
57 #define GL_ALBUM_TEXT_COLOR_ALPHA 255
59 #define GL_CHECKBOX_STYLE_ALBUM "gallery/album"
60 #define GL_CHECKBOX_STYLE_ALBUM_GRID "gallery/album/grid"
61 #define GL_GENGRID_STYLE_ALBUM "unclipped"
62 #define GL_ALBUM_CHECKBOX "elm.swallow.end"
63 #define GL_ALBUM_CHECKBOX_GRID "elm.swallow.check_grid"
64 #define GL_ALBUM_RENAME "elm.swallow.rename"
65 #define GL_GENGRID_STYLE_ALBUM_VIEW "gallery/albums_view"
66 #define GL_GENGRID_STYLE_ALBUM_VIEW_BLUE "gallery/albums_view_blue"
76 * Album "All albums", "Camera shots"
77 * bg color is 25:25:25
79 static struct gl_color bg_color[] = {
89 static void _gl_albums_drag_up(void *data, Evas_Object *obj, void *event_info)
93 static void _gl_albums_drag_right(void *data, Evas_Object *obj,
98 static void _gl_albums_drag_down(void *data, Evas_Object *obj, void *event_info)
102 static void _gl_albums_drag_left(void *data, Evas_Object *obj, void *event_info)
106 static void _gl_albums_drag_stop(void *data, Evas_Object *obj, void *event_info)
110 void _gl_albums_realized(void *data, Evas_Object *obj, void *event_info)
114 static void _gl_albums_selected(void *data, Evas_Object *obj, void *event_info)
118 static void _gl_albums_unselected(void *data, Evas_Object *obj,
123 static void _gl_albums_clicked(void *data, Evas_Object *obj, void *event_info)
127 static void _gl_albums_longpress(void *data, Evas_Object *obj, void *event_info)
131 static void _gl_albums_comeback_from_view_cb(void *data,
132 Evas_Object *obj, void *event_info)
135 gl_appdata *ad = (gl_appdata *)data;
137 /* Reset aul launch flag if change to albums view */
138 ad->albuminfo.aul_launch_by_mime = false;
139 ad->albuminfo.aul_launch_type = GL_AUL_T_NONE;
141 gl_albums_del_grid_append_idler(ad);
142 gl_albums_comeback_from_view(ad);
144 gl_ui_disable_toolbar_item(ad, false, GL_NAVI_ALBUMS, false);
147 static Eina_Bool _gl_albums_append_grid_idler(void *data)
149 GL_CHECK_CANCEL(data);
151 /* Try to get other medias from DB and append them to gridview */
152 int ret = gl_grid_idler_append_items(data);
154 gl_dbg("Failed to append grid items!");
155 /* Maybe all medias were already showed */
156 if (ret == MB_SVC_ERROR_DB_NO_RECORD)
157 gl_dbg("No any more records!");
159 gl_dbg("Successful to append grid items!");
162 /* Remove idler after all items appended */
163 gl_albums_del_grid_append_idler(data);
165 return ECORE_CALLBACK_CANCEL;
169 * @Brif Update checkbox state and album cover and update selectioninfo.
171 * @Param data gl_appdata.
172 * @Param album_item album item.
173 * @Param check_obj object of checkbox.
174 * @Param b_ck_box true: Checkbox selection, false: album cover selection.
176 static int _gl_albums_update_check_state(void *data,
177 gl_cluster *album_item,
178 Evas_Object *check_obj, bool b_ck_box)
180 GL_CHECK_VAL(album_item, -1);
181 GL_CHECK_VAL(album_item->cluster, -1);
182 GL_CHECK_VAL(album_item->cluster->uuid, -1);
183 GL_CHECK_VAL(check_obj, -1);
184 GL_CHECK_VAL(data, -1);
185 gl_appdata *ad = (gl_appdata *)data;
186 gl_dbg("Select checkbox[1]/album_cover[0]: %d.", b_ck_box);
188 /* Update state of checkbox */
189 album_item->checked = !album_item->checked;
190 gl_dbg("album (%s) check state: %d", album_item->cluster->display_name,
191 album_item->checked);
194 * If album cover selected, update checkbox icon manually,
195 * If checkbox selected, its icon is updated by system automatically.
197 Evas_Object *ck = NULL;
198 if (b_ck_box == false)
199 ck = elm_object_item_part_content_get(album_item->item,
202 ck = elm_object_item_part_content_get(album_item->item,
203 GL_ALBUM_CHECKBOX_GRID);
204 elm_check_state_set(ck, album_item->checked);
206 if (album_item->checked) {
207 gl_dbg("Append:%s, id:%s", album_item->cluster->display_name,
208 album_item->cluster->uuid);
209 gl_db_albums_selected_list_append(ad, album_item);
211 gl_dbg("Remove:%s, id:%s", album_item->cluster->display_name,
212 album_item->cluster->uuid);
213 gl_db_albums_selected_list_remove(ad, album_item);
216 /* Display selectioninfo */
217 int cnt = gl_db_get_albums_selected_cnt(ad);
218 gl_ui_create_selinfo(ad, ad->albuminfo.edit_layout,
219 ad->albuminfo.nf_it_edit, ad->albuminfo.albums_cnt,
225 static void _gl_albums_check_changed(void *data, Evas_Object *obj,
230 gl_cluster *album_item = (gl_cluster *)data;
231 GL_CHECK(album_item->ad);
232 gl_appdata *ad = (gl_appdata *)album_item->ad;
235 if (gl_get_view_mode(ad) != GL_VIEW_ALBUMS_EDIT) {
236 gl_dbgE("Wrong view mode!");
240 /* Checkbox selected, b_ck_box=true */
241 _gl_albums_update_check_state(ad, album_item, obj, true);
244 static void _gl_albums_check_grid_changed(void *data, Evas_Object *obj,
249 gl_cluster *album_item = (gl_cluster *)data;
250 GL_CHECK(album_item->ad);
251 gl_appdata *ad = (gl_appdata *)album_item->ad;
254 if (gl_get_view_mode(ad) != GL_VIEW_ALBUMS_EDIT) {
255 gl_dbgE("Wrong view mode!");
258 /* gl_dbg("EditMode"); */
261 /* Grid checkbox selected, b_ck_box=false */
262 _gl_albums_update_check_state(ad, album_item, obj, false);
265 /* Callback of normal icon */
266 static void __gl_albums_sel_cb(void *data,Evas_Object *obj, void *event_info)
268 GL_CHECK(event_info);
270 gl_cluster *album_item = (gl_cluster *)data;
271 GL_CHECK(album_item->cluster);
272 GL_CHECK(album_item->ad);
273 gl_appdata *ad = (gl_appdata *)album_item->ad;
274 Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
276 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
279 int view_mode = gl_get_view_mode(ad);
280 gl_dbg("view mode: %d.", view_mode);
281 if (view_mode != GL_VIEW_ALBUMS_EDIT) {
282 if (album_item->cluster->count == 0) {
283 gl_dbgW("Empty album, return;");
286 gl_albums_sel_album(album_item);
290 static void __gl_rename_album_job_cb(void *userdata)
293 gl_cluster *album_item = (gl_cluster *)userdata;
294 gl_ui_rename_album(album_item);
298 static void _gl_albums_rename_btn_cb(void *data, Evas_Object *obj,
303 gl_cluster *album_item = (gl_cluster *)data;
304 gl_appdata *ad = (gl_appdata *)album_item->ad;
306 /* Return if album selected */
307 if (!album_item->checked) {
308 gl_dbgW("Album checked!");
312 /* Album cover selected, b_ck_box=false, deselect checkbox */
313 Evas_Object *ck = NULL;
314 ck = elm_object_item_part_content_get(album_item->item,
316 _gl_albums_update_check_state(ad, album_item, ck, false);
318 if(ad->maininfo.rename_album_job) {
319 ecore_job_del(ad->maininfo.rename_album_job);
320 ad->maininfo.rename_album_job = NULL;
322 ad->maininfo.rename_album_job = ecore_job_add(__gl_rename_album_job_cb,album_item);
325 char *_gl_albums_get_text(void *data, Evas_Object *obj, const char *part)
328 GL_CHECK_NULL(strlen(part));
330 gl_cluster *album_item = (gl_cluster *)data;
331 GL_CHECK_NULL(album_item->cluster);
332 GL_CHECK_NULL(album_item->cluster->display_name);
333 GL_CHECK_NULL(album_item->cluster->uuid);
334 GL_CHECK_NULL(album_item->ad);
335 gl_appdata *ad = (gl_appdata *)album_item->ad;
336 char buf[GL_ALBUM_NAME_LEN_MAX] = { 0, };
338 if (!strcmp(part, "elm.text.name")) {
340 if (album_item->cluster->display_name &&
341 strlen(album_item->cluster->display_name))
342 snprintf(buf, sizeof(buf), "%s",
343 (char *)(album_item->cluster->display_name));
344 else if (gl_db_is_root_path(ad, album_item->cluster->uuid, NULL))
345 snprintf(buf, sizeof(buf), GL_ALBUM_PHOME_ROOT_NAME);
347 gl_dbgE("Album name[%s] is wrong!",
348 album_item->cluster->display_name);
349 } else if (!strcmp(part, "elm.text.date")) {
352 char date1[GL_DATE_INFO_LEN_MAX] = { 0, };
353 char date2[GL_DATE_INFO_LEN_MAX] = { 0, };
354 char date3[GL_DATE_INFO_LEN_MAX] = { 0, };
356 int item_count = GL_ALBUM_COVER_THUMB_NUM;
357 gl_item **items1 = ad->albuminfo.cover_thumbs;
358 gl_albums_free_cover_thumbs(ad);
360 gl_db_get_first_several_items(album_item,
362 MINFO_MEDIA_SORT_BY_DATE_DESC);
365 if (item_count <= 0) {
366 gl_dbg("Empty album...");
367 ad->albuminfo.album_medias_cnt = 0;
371 ad->albuminfo.album_medias_cnt = item_count;
372 if (items1[0] == NULL || items1[0]->item == NULL) {
373 gl_dbgE("[Error] Invalid item!");
374 ad->albuminfo.album_medias_cnt = 0;
377 memcpy(&album_item->item_mtime,
378 &(items1[0]->item->mtime), sizeof(time_t));
382 int sort_t = MINFO_MEDIA_SORT_BY_DATE_ASC;
383 memset(items2, 0x00, item_count * sizeof(int));
384 gl_db_get_first_several_items(album_item,
388 if (item_count <= 0) {
389 gl_dbg("Empty album...");
392 memset(&t1, 0x00, sizeof(struct tm));
393 localtime_r((time_t *)&(album_item->item_mtime),
395 strftime(date1, sizeof(date1), "%Y.%m.%d", &t1);
396 strftime(date3, sizeof(date3), "%Y.%m", &t1);
398 if (items2[0] == NULL
399 || items2[0]->item == NULL) {
400 gl_dbgE("Invalid items2[0].");
401 ad->albuminfo.album_medias_cnt = 0;
404 memset(&t2, 0x00, sizeof(struct tm));
405 localtime_r((time_t *)&(items2[0]->item->mtime),
407 strftime(date2, sizeof(date2), "%Y.%m.%d", &t2);
409 if (!strcmp(date1, date2)) {
410 g_strlcpy(buf, date1, sizeof(buf));
412 strftime(date2, sizeof(date2), "%Y.%m",
414 snprintf(buf, sizeof(buf), "%s - %s",
419 for (i = 0; i < item_count; i++) {
420 gl_db_destroy_item(items2[i]);
423 } else if (!strcmp(part, "elm.text.count")) {
424 gl_db_update_item_cnt(album_item);
425 snprintf(buf, sizeof(buf), "%d",
426 (int)(album_item->cluster->count));
433 static Evas_Object *_gl_albums_add_1_icon_bg(Evas_Object *obj, gl_item *git,
437 Evas_Object *bg = elm_bg_add(obj);
439 elm_bg_load_size_set(bg, wid, hei);
441 _gl_ui_elm_bg_file_set(bg, git);
443 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
445 evas_object_size_hint_align_set(bg, 0.5, 0.5);
446 evas_object_show(bg);
451 static Evas_Object *_gl_albums_add_1st_icon_bg(Evas_Object *obj, gl_item *git,
455 Evas_Object *bg = elm_bg_add(obj);
457 elm_bg_load_size_set(bg, wid, hei);
459 _gl_ui_elm_bg_file_set(bg, git);
461 evas_object_size_hint_min_set(bg, wid, hei);
462 evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL,
464 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
466 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
467 evas_object_show(bg);
471 static Evas_Object *_gl_albums_add_3_icon_bg(Evas_Object *obj, gl_item **items,
472 int length, double scale)
480 Evas_Object *bg = NULL;
482 Evas_Object *tb = elm_table_add(obj);
484 elm_table_padding_set(tb, GL_COVER_PAD * scale, GL_COVER_PAD * scale);
487 for (i = 1; i < length; i++) {
492 wid = (int)(GL_COVER_2X_GRID_S * scale);
495 wid = (int)(GL_COVER_GRID_S * scale);
496 hei = (int)(GL_COVER_2X_GRID_S * scale);
498 elm_bg_load_size_set(bg, wid, hei);
499 evas_object_size_hint_min_set(bg, wid, hei);
500 elm_table_padding_set(tb, GL_COVER_PAD_1 * scale,
501 GL_COVER_PAD_1 * scale);
503 _gl_ui_elm_bg_file_set(bg, git);
505 evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL,
507 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
509 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL,
512 elm_table_pack(tb, bg, 0, 0, 2, 2);
514 tp_val = EVAS_ASPECT_CONTROL_VERTICAL;
515 evas_object_size_hint_aspect_set(bg, tp_val, 1, 1);
516 elm_table_pack(tb, bg, 2, 0, 1, 2);
518 evas_object_show(bg);
524 static Evas_Object *_gl_albums_add_4_icon_bg(Evas_Object *obj, gl_item **items,
525 int length, double scale)
533 Evas_Object *bg = NULL;
535 Evas_Object *tb = elm_table_add(obj);
537 elm_table_padding_set(tb, GL_COVER_PAD * scale, GL_COVER_PAD * scale);
538 elm_table_padding_set(tb, GL_COVER_PAD_1 * scale,
539 GL_COVER_PAD_1 * scale);
541 for (i = 1; i < length; i++) {
546 wid = (int)(GL_COVER_2X_GRID_S * scale);
549 wid = (int)(GL_COVER_GRID_S * scale);
552 elm_bg_load_size_set(bg, wid, hei);
553 evas_object_size_hint_min_set(bg, wid, hei);
555 _gl_ui_elm_bg_file_set(bg, git);
557 evas_object_size_hint_aspect_set(bg,
558 EVAS_ASPECT_CONTROL_VERTICAL,
560 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
562 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL,
565 elm_table_pack(tb, bg, 0, 0, 2, 2);
567 elm_table_pack(tb, bg, 2, 0, 1, 1);
569 elm_table_pack(tb, bg, 2, 1, 1, 1);
570 evas_object_show(bg);
576 static Evas_Object *_gl_albums_add_7_icon_bg(Evas_Object *obj, gl_cluster *album,
577 gl_item **items, int length, int idx,
580 GL_CHECK_NULL(album);
581 GL_CHECK_NULL(album->cluster);
582 GL_CHECK_NULL(album->cluster->uuid);
589 Evas_Object *bg = NULL;
591 Evas_Object *tb = elm_table_add(obj);
593 elm_table_padding_set(tb, GL_COVER_PAD * scale, GL_COVER_PAD * scale);
595 wid = (int)(GL_COVER_GRID_S * scale);
598 for (i = 1; i < GL_ALBUM_COVER_THUMB_NUM; i++) {
603 elm_bg_load_size_set(bg, wid, hei);
604 _gl_ui_elm_bg_file_set(bg, git);
606 Evas *evas = evas_object_evas_get(obj);
608 bg = evas_object_rectangle_add(evas);
610 if (!g_strcmp0(album->cluster->uuid, GL_ALBUM_ALL_ID) ||
611 gl_db_is_default_album(album->ad, album->cluster))
612 j = GL_ALBUM_TEXT_COLOR_CNT;
614 j = idx % GL_ALBUM_TEXT_COLOR_CNT;
615 evas_object_color_set(bg, bg_color[j].r, bg_color[j].g,
617 GL_ALBUM_TEXT_COLOR_ALPHA);
620 evas_object_size_hint_aspect_set(bg,
621 EVAS_ASPECT_CONTROL_VERTICAL,
623 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
625 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL,
627 elm_table_pack(tb, bg, (int)((i - 1) % 3), (int)((i - 1) / 3),
629 evas_object_show(bg);
635 Evas_Object *_gl_albums_get_content(void *data, Evas_Object *obj, const char *part)
638 GL_CHECK_NULL(strlen(part));
640 gl_cluster *album_item = (gl_cluster *)data;
641 GL_CHECK_NULL(album_item->cluster);
642 GL_CHECK_NULL(album_item->ad);
643 gl_appdata *ad = (gl_appdata *)album_item->ad;
644 double scale = ad->maininfo.win_scale;
645 GL_CHECK_NULL(album_item->cluster->uuid);
646 const char *al_id = album_item->cluster->uuid;
647 int view_mode = gl_get_view_mode(ad);
648 int idx = album_item->index;
651 if ((!strcmp(part, "elm.swallow.firsticon")) ||
652 (!strcmp(part, "elm.swallow.icon")) ||
653 (!strcmp(part, "elm.swallow.onlyicon"))) {
654 if (view_mode != GL_VIEW_ALBUMS &&
655 view_mode != GL_VIEW_ALBUMS_EDIT)
658 gl_item **items = ad->albuminfo.cover_thumbs;
659 int len = ad->albuminfo.album_medias_cnt;
661 gl_dbg("Empty local album.");
665 Evas_Object *bg = NULL;
668 gl_item *gl_it = NULL;
670 if (!strcmp(part, "elm.swallow.onlyicon")) {
671 if (len != GL_ALBUM_COVER_THUMB_1) {
674 wid = (int)(GL_COVER_ICON_S * scale);
677 bg = _gl_albums_add_1_icon_bg(obj, gl_it, wid,
683 if (!strcmp(part, "elm.swallow.firsticon")) {
685 if (len <= GL_ALBUM_COVER_THUMB_1) {
688 wid = (int)(GL_COVER_GRID_S * scale);
691 bg = _gl_albums_add_1st_icon_bg(obj, gl_it, wid,
698 if (!strcmp(part, "elm.swallow.icon")) {
700 Evas_Object *tb = NULL;
701 if (len == GL_ALBUM_COVER_THUMB_1) {
703 } else if (len == GL_ALBUM_COVER_THUMB_2) {
704 wid = (int)(GL_COVER_ICON_S * scale);
705 hei = (int)(GL_COVER_2X_GRID_S * scale);
707 bg = _gl_albums_add_1_icon_bg(obj, gl_it, wid,
710 } else if (len == GL_ALBUM_COVER_THUMB_3) {
711 tb = _gl_albums_add_3_icon_bg(obj, items, len,
713 } else if (len < GL_ALBUM_COVER_THUMB_NUM) {
714 len = GL_ALBUM_COVER_THUMB_NUM_SEC;
715 tb = _gl_albums_add_4_icon_bg(obj, items, len,
719 * Set 7 grid for 'All' album
720 * and 'Camera shots'.
722 Mcluster *mclu = album_item->cluster;
724 is_def = gl_db_is_default_album(ad, mclu);
726 if (!g_strcmp0(al_id, GL_ALBUM_ALL_ID) ||
728 tb = _gl_albums_add_7_icon_bg(obj,
736 al_len = GL_ALBUM_COVER_THUMB_NUM_SEC;
737 tb = _gl_albums_add_4_icon_bg(obj,
743 evas_object_show(tb);
746 } else if (!strcmp(part, "label_bg")) {
747 Evas *evas = evas_object_evas_get(obj);
749 Evas_Object *bg = NULL;
750 bg = evas_object_rectangle_add(evas);
753 * for "All albums", and "Camera shots", their colors should be
754 * 25:25:25 by new gui
756 if (!g_strcmp0(al_id, GL_ALBUM_ALL_ID) ||
757 gl_db_is_default_album(ad, album_item->cluster))
758 j = GL_ALBUM_TEXT_COLOR_CNT;
760 j = idx % GL_ALBUM_TEXT_COLOR_CNT;
761 evas_object_color_set(bg, bg_color[j].r, bg_color[j].g,
763 GL_ALBUM_TEXT_COLOR_ALPHA);
765 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
767 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL,
769 evas_object_show(bg);
771 } else if (!strcmp(part, GL_ALBUM_CHECKBOX_GRID) &&
772 view_mode == GL_VIEW_ALBUMS_EDIT) {
773 Evas_Object *ck = NULL;
774 ck = elm_check_add(obj);
776 elm_object_style_set(ck, GL_CHECKBOX_STYLE_ALBUM_GRID);
777 evas_object_repeat_events_set(ck, EINA_TRUE);
778 elm_check_state_set(ck, album_item->checked);
779 evas_object_smart_callback_add(ck, "changed",
780 _gl_albums_check_grid_changed,
782 evas_object_show(ck);
784 } else if (!strcmp(part, GL_ALBUM_CHECKBOX) &&
785 view_mode == GL_VIEW_ALBUMS_EDIT) {
786 Evas_Object *ck = NULL;
787 ck = elm_check_add(obj);
789 elm_object_style_set(ck, GL_CHECKBOX_STYLE_ALBUM);
790 evas_object_propagate_events_set(ck, EINA_FALSE);
791 elm_check_state_set(ck, album_item->checked);
792 evas_object_smart_callback_add(ck, "changed",
793 _gl_albums_check_changed,
795 evas_object_show(ck);
797 } else if (!strcmp(part, GL_ALBUM_RENAME) &&
798 view_mode == GL_VIEW_ALBUMS_EDIT) {
800 * Fixme: In My Files app, it's unable to rename
801 * 'My video clips', 'Wallpapers' and 'My photo clips'.
802 * Maybe we need to remove rename button
803 * from these three albums cover.
807 * Don't add rename button to 'All albums',
808 * and 'Camera shot'[default album]
810 if (!g_strcmp0(al_id, GL_ALBUM_ALL_ID) ||
811 gl_db_is_default_album(ad, album_item->cluster))
814 Evas_Object *btn = NULL;
815 btn = _gl_but_create_but(obj, GL_BUT_NONE,
816 GL_BUTTON_STYLE_RENAME);
818 evas_object_propagate_events_set(btn, EINA_FALSE);
819 evas_object_smart_callback_add(btn, "clicked",
820 _gl_albums_rename_btn_cb, data);
826 static int _gl_albums_create_items(void *data, Evas_Object *parent)
828 GL_CHECK_VAL(parent, -1);
829 GL_CHECK_VAL(data, -1);
830 gl_appdata *ad = (gl_appdata *)data;
832 gl_cluster *album_item = NULL;
834 int view_mode = gl_get_view_mode(ad);
837 /* Clear albums view */
838 elm_gengrid_clear(parent);
840 ad->albuminfo.albumgic.item_style = GL_GENGRID_STYLE_ALBUM_VIEW;
841 ad->albuminfo.albumgic.func.text_get = _gl_albums_get_text;
842 ad->albuminfo.albumgic.func.content_get = _gl_albums_get_content;
843 /* Show blue folder name */
844 ad->albuminfo.albumgic_blue.item_style = GL_GENGRID_STYLE_ALBUM_VIEW_BLUE;
845 ad->albuminfo.albumgic_blue.func.text_get = _gl_albums_get_text;
846 ad->albuminfo.albumgic_blue.func.content_get = _gl_albums_get_content;
848 GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
849 GL_CHECK_VAL(ad->albuminfo.cluster_list->clist, -1);
850 Eina_List *clist = ad->albuminfo.cluster_list->clist;
851 length = eina_list_count(clist);
852 gl_dbg("Albums length: %d", length);
853 const char *al_id = NULL;
854 Elm_Gengrid_Item_Class *pgic = &(ad->albuminfo.albumgic);
855 Elm_Gengrid_Item_Class *pgic_blue = &(ad->albuminfo.albumgic_blue);
858 for (i = 0; i < length; i++) {
859 album_item = eina_list_nth(clist, i);
860 GL_CHECK_VAL(album_item, -1);
861 GL_CHECK_VAL(album_item->cluster, -1);
862 GL_CHECK_VAL(album_item->cluster->display_name, -1);
863 GL_CHECK_VAL(album_item->cluster->uuid, -1);
864 al_id = album_item->cluster->uuid;
867 if (view_mode == GL_VIEW_ALBUMS_EDIT) {
868 if (!g_strcmp0(al_id, GL_ALBUM_ALL_ID) )
872 /* Show blue folder name */
873 if (!g_strcmp0(album_item->cluster->uuid, GL_ALBUM_ALL_ID) ||
874 gl_db_is_default_album(ad, album_item->cluster))
875 album_item->item = elm_gengrid_item_append(parent,
881 album_item->item = elm_gengrid_item_append(parent, pgic,
885 album_item->index = item_cnt;
887 gl_dbg("Append[%s], id=%s.", album_item->cluster->display_name,
891 ad->albuminfo.albums_cnt = item_cnt;
896 int gl_albums_sel_album(gl_cluster *album_item)
898 GL_CHECK_VAL(album_item, -1);
899 GL_CHECK_VAL(album_item->cluster, -1);
900 GL_CHECK_VAL(album_item->cluster->uuid, -1);
901 GL_CHECK_VAL(album_item->ad, -1);
902 gl_appdata *ad = (gl_appdata *)album_item->ad;
903 GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
904 GL_CHECK_VAL(ad->albuminfo.cluster_list->clist, -1);
905 int view_mode = gl_get_view_mode(ad);
907 if (view_mode != GL_VIEW_ALBUMS) {
908 gl_dbgE("Wrong view mode!");
914 Evas_Object *layout = NULL;
915 char *al_na = album_item->cluster->display_name;
916 Evas_Object *navi = ad->maininfo.navi_bar;
917 gl_dbg("current %s album, id=%s, cluster_index=%d",
918 al_na, album_item->cluster->uuid, album_item->index);
919 ad->albuminfo.current_album = album_item;
921 gl_albums_del_grid_append_idler(ad);
923 gl_db_get_item_list(ad, album_item, GL_FIRST_VIEW_START_POS,
924 GL_FIRST_VIEW_END_POS);
926 gl_set_view_mode(ad, GL_VIEW_THUMBS);
927 /* Save the index of current selected album */
928 ad->albuminfo.cluster_list->cur_pos = album_item->index;
929 gl_dbg("Album index: %d", album_item->index);
930 layout = gl_ui_create_view_ly(navi);
931 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
933 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
934 Evas_Object *gv = gl_grid_create_view(ad, navi, GL_GRID_ALL);
935 elm_object_part_content_set(layout, "elm.swallow.view", gv);
936 ad->gridinfo.all_view = gv;
937 ad->gridinfo.layout = layout;
939 /* View mode reset, Update view mode */
940 view_mode = gl_get_view_mode(ad);
941 if (view_mode != GL_VIEW_THUMBS) {
942 gl_dbgE("View mode is wrong!");
946 gl_navi_mode mode = GL_NAVI_THUMBS;
947 /* check root case */
948 if (gl_db_is_root_path(ad, album_item->cluster->uuid, NULL))
949 al_na = GL_ALBUM_PHOME_ROOT_NAME;
952 elm_gengrid_clear(ad->albuminfo.view);
954 gl_ui_create_title_and_push(ad, navi, layout, mode, al_na);
956 gl_dbg("albums_view 0x%x cleared", ad->albuminfo.view);
958 Evas_Object *bk_btn = NULL;
959 bk_btn = elm_object_item_part_content_get(ad->gridinfo.nf_it,
960 GE_NAVIFRAME_PREB_BTN);
961 elm_object_style_set(bk_btn, GL_BUTTON_STYLE_NAVI_PRE);
962 evas_object_smart_callback_add(bk_btn, "clicked",
963 _gl_albums_comeback_from_view_cb, ad);
965 edje_object_signal_emit(_EDJ(layout), "elm,swallow_view,state,default",
967 gl_dbg("Done albums selected");
969 if (ad->maininfo.medias_cnt == (GL_FIRST_VIEW_END_POS + 1)) {
970 gl_dbg("\n\n\tIdler to append other medias--Start\n");
971 Ecore_Idler *ap_idl = NULL;
972 ap_idl = ecore_idler_add(_gl_albums_append_grid_idler, ad);
973 ad->gridinfo.append_idler = ap_idl;
979 Evas_Object *gl_albums_create_view(void *data, Evas_Object *parent)
981 GL_CHECK_NULL(parent);
983 gl_appdata *ad = (gl_appdata *)data;
984 GL_CHECK_NULL(ad->albuminfo.cluster_list);
987 gl_albums_free_cover_thumbs(ad);
988 memset(ad->albuminfo.cover_thumbs, 0x00,
989 GL_ALBUM_COVER_THUMB_NUM * sizeof(int));
990 ad->albuminfo.album_medias_cnt = 0;
992 Evas_Object *grid = elm_gengrid_add(parent);
993 elm_object_style_set(grid, GL_GENGRID_STYLE_ALBUM);
995 double scale_factor = ad->maininfo.win_scale;
996 gl_dbg("Own scale: %f, elm_config_scale_get =%f", scale_factor,
997 elm_config_scale_get());
998 elm_gengrid_item_size_set(grid,
999 (int)(GL_ALBUM_ITEM_WIDTH * scale_factor),
1000 (int)(GL_ALBUM_ITEM_HEIGHT * scale_factor));
1002 elm_gengrid_align_set(grid, 0.5, 0.0);
1004 /* Vertical scrolling. */
1005 elm_gengrid_horizontal_set(grid, EINA_FALSE);
1006 elm_gengrid_bounce_set(grid, EINA_FALSE, EINA_TRUE);
1007 elm_gengrid_multi_select_set(grid, EINA_TRUE);
1009 evas_object_smart_callback_add(grid, "selected", _gl_albums_selected,
1011 evas_object_smart_callback_add(grid, "unselected",
1012 _gl_albums_unselected, NULL);
1013 evas_object_smart_callback_add(grid, "clicked", _gl_albums_clicked,
1015 evas_object_smart_callback_add(grid, "longpressed",
1016 _gl_albums_longpress, NULL);
1017 evas_object_smart_callback_add(grid, "drag,start,up",
1018 _gl_albums_drag_up, NULL);
1019 evas_object_smart_callback_add(grid, "drag,start,right",
1020 _gl_albums_drag_right, NULL);
1021 evas_object_smart_callback_add(grid, "drag,start,down",
1022 _gl_albums_drag_down, NULL);
1023 evas_object_smart_callback_add(grid, "drag,start,left",
1024 _gl_albums_drag_left, NULL);
1025 evas_object_smart_callback_add(grid, "drag,stop", _gl_albums_drag_stop,
1027 evas_object_smart_callback_add(grid, "realized", _gl_albums_realized,
1030 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND,
1033 gl_get_mass_storage_state(ad);
1034 if (ad->maininfo.app_exit_mode == GL_APP_EXIT_NONE) {
1035 if (ad->maininfo.view_mode != GL_VIEW_THUMBS)
1036 _gl_albums_create_items(ad, grid);
1038 /* show no contents none album exists */
1039 if (ad->maininfo.app_exit_mode ||
1040 gl_check_gallery_empty(ad)) {
1041 evas_object_del(grid);
1044 /* Set the grid view mode for creating nocontents view */
1045 ad->gridinfo.grid_view_mode = GL_GRID_ALBUMS;
1046 Evas_Object *noc = gl_ui_create_nocontents_full(ad);
1047 evas_object_show(noc);
1048 ad->albuminfo.nocontents = noc;
1052 ad->albuminfo.nocontents = NULL;
1053 evas_object_show(grid);
1056 gl_dbg("gl_albums_create_view:done");
1061 /* From thumbnails view to albums view */
1062 int gl_albums_comeback_from_view(void *data)
1065 GL_CHECK_VAL(data, -1);
1066 gl_appdata *ad = (gl_appdata *)data;
1068 gl_ui_destroy_notiinfo(ad);
1070 gl_grid_clear_view(ad);
1071 gl_list_clear_view(ad);
1073 ad->albuminfo.current_album = NULL;
1074 gl_albums_update_items(ad);
1076 evas_object_show(ad->albuminfo.view);
1078 gl_set_view_mode(ad, GL_VIEW_ALBUMS);
1079 ad->albuminfo.seg_mode = GL_CTRL_SEG_ALL;
1084 /* From albums edit view to albums view */
1085 int gl_albums_change_to_view(void *data)
1087 GL_CHECK_VAL(data, -1);
1088 gl_appdata *ad = (gl_appdata *)data;
1089 GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
1092 GL_CHECK_VAL(ad->albuminfo.view, -1);
1093 gl_set_view_mode(ad, GL_VIEW_ALBUMS);
1094 /* changed to show no contents if needed */
1095 if (gl_check_gallery_empty(ad)) {
1096 if (ad->albuminfo.view)
1097 evas_object_del(ad->albuminfo.view);
1099 /* Set the grid view mode for creating nocontents view */
1100 ad->gridinfo.grid_view_mode = GL_GRID_ALBUMS;
1101 Evas_Object *noc = gl_ui_create_nocontents_full(ad);
1102 ad->albuminfo.nocontents = noc;
1103 ad->albuminfo.view = noc;
1104 evas_object_show(noc);
1106 Evas_Object *old_view = NULL;
1107 old_view = elm_object_part_content_unset(ad->albuminfo.layout,
1108 "elm.swallow.view");
1109 evas_object_del(old_view);
1110 elm_object_part_content_set(ad->albuminfo.layout,
1111 "elm.swallow.view", noc);
1113 _gl_albums_create_items(ad, ad->albuminfo.view);
1119 /* Update albums view */
1120 int gl_albums_update_items(void *data)
1122 GL_CHECK_VAL(data, -1);
1123 gl_appdata *ad = (gl_appdata *)data;
1124 GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
1125 int view_mode = gl_get_view_mode(ad);
1127 /* Changed to show no contents if needed */
1128 if (gl_check_gallery_empty(ad)) {
1129 /* Set the grid view mode for creating nocontents view */
1130 ad->gridinfo.grid_view_mode = GL_GRID_ALBUMS;
1132 evas_object_del(ad->albuminfo.view);
1134 Evas_Object *noc = gl_ui_create_nocontents_full(ad);
1135 ad->albuminfo.nocontents = noc;
1136 ad->albuminfo.view = noc;
1137 evas_object_show(noc);
1139 Evas_Object *old_view = NULL;
1140 old_view = elm_object_part_content_unset(ad->albuminfo.layout,
1141 "elm.swallow.view");
1142 evas_object_del(old_view);
1143 elm_object_part_content_set(ad->albuminfo.layout, "elm.swallow.view",
1146 if (view_mode == GL_VIEW_ALBUMS_EDIT) {
1147 _gl_albums_create_items(ad, ad->albuminfo.edit_view);
1149 if (ad->albuminfo.nocontents) {
1151 * current view is nocontents,
1152 * unset it first then create albums view.
1154 gl_albums_remove_nocontents(ad);
1156 Evas_Object *al_view = NULL;
1157 al_view = ad->albuminfo.view;
1158 _gl_albums_create_items(ad, al_view);
1166 /* Update albums list and refresh albums view, remove invalid widgets */
1167 int gl_albums_update_view(void *data)
1169 GL_CHECK_VAL(data, -1);
1170 gl_appdata *ad = (gl_appdata *)data;
1171 int view_mode = gl_get_view_mode(ad);
1172 gl_dbg("view_mode: %d.", view_mode);
1174 gl_albums_free_cover_thumbs(ad);
1175 memset(ad->albuminfo.cover_thumbs, 0x00,
1176 GL_ALBUM_COVER_THUMB_NUM * sizeof(int));
1178 if (view_mode == GL_VIEW_ALBUMS) {
1179 /* Update mass storage state */
1180 gl_get_mass_storage_state(ad);
1181 /* Update albums list*/
1182 gl_refresh_albums_list(ad);
1184 if (ad->albuminfo.nocontents) {
1185 gl_albums_remove_nocontents(ad);
1186 } else if (!gl_check_gallery_empty(ad)) {
1187 _gl_albums_create_items(ad, ad->albuminfo.view);
1188 if (ad->albuminfo.cluster_list->edit_cnt)
1189 gl_ui_disable_toolbar_item(ad, false,
1193 gl_ui_disable_toolbar_item(ad, true,
1197 gl_dbg("View is empty.");
1198 gl_albums_update_items(ad);
1199 gl_ui_disable_toolbar_item(ad, true, GL_NAVI_ALBUMS,
1202 } else if (view_mode == GL_VIEW_ALBUMS_EDIT ||
1203 view_mode == GL_VIEW_ALBUMS_RENAME) {
1204 if (gl_db_update_cluster_list(ad) != GL_DB_SUCCESS) {
1205 gl_dbgE("gl_db_update_cluster_list failed!");
1209 if (gl_check_gallery_empty(ad) ||
1210 ad->albuminfo.cluster_list->edit_cnt == 0) {
1211 /* Remove invalid widgets */
1212 gl_del_invalid_widgets(ad, GL_INVALID_NONE);
1214 gl_dbg("Edit view is empty, back to albums view");
1215 gl_ui_edit_cancel(ad);
1217 gl_ui_disable_toolbar_item(ad, true, GL_NAVI_ALBUMS,
1220 int sel_cnt = gl_db_get_albums_selected_cnt(ad);
1221 int invalid_m = GL_INVALID_NONE;
1222 /* Album selected for rename was deleted */
1223 if (view_mode == GL_VIEW_ALBUMS_RENAME) {
1224 if (ad->albuminfo.selected_album == NULL) {
1225 gl_dbgW("Rename invalid album!");
1226 invalid_m = GL_INVALID_RENAME_ALBUM;
1227 /* Remove invalid widgets */
1228 gl_del_invalid_widgets(ad, invalid_m);
1229 /* Disable control bar buttons */
1230 gl_ui_disable_toolbar_items(ad,
1231 ad->albuminfo.nf_it_edit);
1233 /* Reset view mode */
1234 gl_set_view_mode(ad,
1235 GL_VIEW_ALBUMS_EDIT);
1237 } else if (sel_cnt == 0) {
1238 /* If none albums selected */
1239 gl_dbgW("None albums selected!");
1240 /* Disable control bar buttons */
1241 gl_ui_disable_toolbar_items(ad,
1242 ad->albuminfo.nf_it_edit);
1243 /* Remove invalid widgets */
1244 gl_del_invalid_widgets(ad, invalid_m);
1245 /* Reset view mode */
1246 gl_set_view_mode(ad, GL_VIEW_ALBUMS_EDIT);
1249 /* Update edit view, other update view in cancel callback */
1250 Evas_Object *edit_view = ad->albuminfo.edit_view;
1251 if (gl_get_view_mode(ad) == GL_VIEW_ALBUMS_EDIT) {
1252 _gl_albums_create_items(ad, edit_view);
1254 /* Cluster list updated, clear view */
1255 elm_gengrid_clear(edit_view);
1263 * Remove nocontents view and show albums view.
1264 * gallery is empty->home key tapped
1265 * ->take photos with camera->back to gallery;
1267 int gl_albums_remove_nocontents(void *data)
1269 GL_CHECK_VAL(data, -1);
1270 gl_appdata *ad = (gl_appdata *)data;
1271 Evas_Object *layout_inner = NULL;
1274 if (ad->albuminfo.nocontents && !gl_check_gallery_empty(ad)) {
1275 gl_dbg("Remove nocontents view then create albums view.");
1277 evas_object_del(ad->albuminfo.nocontents);
1278 ad->albuminfo.nocontents = NULL;
1280 layout_inner = gl_albums_create_view(ad, ad->maininfo.navi_bar);
1282 Evas_Object *old_view = NULL;
1283 old_view = elm_object_part_content_unset(ad->albuminfo.layout,
1284 "elm.swallow.view");
1285 evas_object_del(old_view);
1286 elm_object_part_content_set(ad->albuminfo.layout, "elm.swallow.view",
1288 evas_object_show(layout_inner);
1289 ad->albuminfo.view = layout_inner;
1291 gl_ui_disable_toolbar_item(ad, false, GL_NAVI_ALBUMS, false);
1293 gl_dbg("Nocontents was removed or Gallery is empty!");
1299 int gl_albums_del_grid_append_idler(void *data)
1301 GL_CHECK_VAL(data, -1);
1302 gl_appdata *ad = (gl_appdata *)data;
1304 if (ad->gridinfo.append_idler) {
1305 ecore_idler_del(ad->gridinfo.append_idler);
1306 ad->gridinfo.append_idler = NULL;
1312 int gl_albums_free_cover_thumbs(void *data)
1315 GL_CHECK_VAL(data, -1);
1316 gl_appdata *ad = (gl_appdata *)data;
1319 for (i = 0; i < GL_ALBUM_COVER_THUMB_NUM; i++) {
1320 if (ad->albuminfo.cover_thumbs[i]) {
1321 gl_db_destroy_item(ad->albuminfo.cover_thumbs[i]);
1322 ad->albuminfo.cover_thumbs[i] = NULL;
1329 /* Free resources allocated for albums view */
1330 int gl_albums_free_data(void *data)
1333 GL_CHECK_VAL(data, -1);
1334 gl_appdata *ad = (gl_appdata *)data;
1336 gl_albums_del_grid_append_idler(data);
1338 gl_albums_free_cover_thumbs(data);
1340 if (ad->albuminfo.move_album_id) {
1341 free(ad->albuminfo.move_album_id);
1342 ad->albuminfo.move_album_id = NULL;