#include "ephoto.h" #define CONFIG_VERSION 21 static int _ephoto_config_load(Ephoto *ephoto); static Eina_Bool _ephoto_on_config_save(void *data); static int _ephoto_gadget_config_load(Ephoto *ephoto); static Eina_Bool _ephoto_gadget_on_config_save(void *data); static Eet_Data_Descriptor *edd = NULL; static Eet_Data_Descriptor *gedd = NULL; static Eet_Data_Descriptor *gedds = NULL; static void _config_save_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto *ephoto = evas_object_data_get(popup, "ephoto"); const char *path; const char *text = elm_object_text_get(ephoto->config->open_dir); if (!strcmp(text, _("Root Directory"))) path = "/"; else if (!strcmp(text, _("Home Directory"))) path = eina_environment_home_get(); else if (!strcmp(text, _("Last Open Directory"))) path = "Last"; else path = elm_object_text_get(ephoto->config->open_dir_custom); if (ecore_file_is_dir(path) || !strcmp(path, "Last")) eina_stringshare_replace(&ephoto->config->open, path); if (strcmp(path, ephoto->config->directory) && strcmp(path, "Last") && ecore_file_exists(path)) { char *rp = ecore_file_realpath(path); ephoto_directory_browser_clear(ephoto); ephoto_thumb_browser_clear(ephoto); eina_stringshare_replace(&ephoto->config->directory, rp); ephoto_directory_browser_top_dir_set(ephoto, ephoto->config->directory); ephoto_directory_browser_initialize_structure(ephoto, rp); free(rp); } ephoto->config->prompts = elm_check_state_get(ephoto->config->show_prompts); ephoto->config->drop = elm_check_state_get(ephoto->config->move_drop); ephoto->config->movess = elm_check_state_get(ephoto->config->slide_move); ephoto->config->smooth = elm_check_state_get(ephoto->config->smooth_scale); ephoto->config->folders = elm_check_state_get(ephoto->config->show_folders); ephoto->config->thumbnail_aspect = elm_check_state_get(ephoto->config->thumb_aspect); if (elm_spinner_value_get(ephoto->config->panel_size) > 0) { ephoto->config->left_size = (elm_spinner_value_get(ephoto->config->panel_size) / 0.05) * 0.05; ephoto->config->right_size = (elm_spinner_value_get(ephoto->config->panel_size) / 0.05) * 0.05; evas_object_size_hint_weight_set(ephoto->dir_browser, ephoto->config->left_size, EVAS_HINT_EXPAND); } if (elm_spinner_value_get(ephoto->config->slide_time) > 0) ephoto->config->slideshow_timeout = elm_spinner_value_get(ephoto->config->slide_time); if (elm_object_text_get(ephoto->config->slide_trans)) eina_stringshare_replace(&ephoto->config->slideshow_transition, elm_object_text_get(ephoto->config->slide_trans)); evas_object_del(popup); elm_object_focus_set(ephoto->pager, EINA_TRUE); if (ephoto->state == EPHOTO_STATE_THUMB) ephoto_thumb_browser_recalc(ephoto); else ephoto->thumb_browser_dirty = EINA_TRUE; } static void _open_hv_select(void *data, Evas_Object *obj, void *event_info) { Ephoto *ephoto = data; elm_object_text_set(obj, elm_object_item_text_get(event_info)); if (!strcmp(elm_object_item_text_get(event_info), _("Custom Directory"))) elm_object_disabled_set(ephoto->config->open_dir_custom, EINA_FALSE); else elm_object_disabled_set(ephoto->config->open_dir_custom, EINA_TRUE); } static void _config_general(Ephoto *ephoto, Evas_Object *parent) { Evas_Object *table, *check, *hoversel, *entry, *label, *spinner; char buf[PATH_MAX]; table = elm_table_add(parent); EPHOTO_EXPAND(table); EPHOTO_FILL(table); elm_box_pack_end(parent, table); evas_object_show(table); check = elm_check_add(table); elm_object_text_set(check, _("Show Folders On Start")); EPHOTO_ALIGN(check, EVAS_HINT_FILL, 0.5); elm_check_state_set(check, ephoto->config->folders); elm_table_pack(table, check, 0, 0, 1, 1); evas_object_show(check); ephoto->config->show_folders = check; check = elm_check_add(table); elm_object_text_set(check, _("Prompt Before Changing The Filesystem")); EPHOTO_FILL(check); elm_check_state_set(check, ephoto->config->prompts); elm_table_pack(table, check, 0, 1, 1, 1); evas_object_show(check); ephoto->config->show_prompts = check; check = elm_check_add(table); elm_object_text_set(check, _("Move Files When Dropped")); EPHOTO_FILL(check); elm_check_state_set(check, ephoto->config->drop); elm_table_pack(table, check, 0, 2, 1, 1); evas_object_show(check); ephoto->config->move_drop = check; check = elm_check_add(table); elm_object_text_set(check, _("Smooth Scale Images")); EPHOTO_FILL(check); elm_check_state_set(check, ephoto->config->smooth); elm_table_pack(table, check, 0, 3, 1, 1); evas_object_show(check); ephoto->config->smooth_scale = check; check = elm_check_add(table); elm_object_text_set(check, _("Keep Aspect on Thumbnails")); EPHOTO_FILL(check); elm_check_state_set(check, ephoto->config->thumbnail_aspect); elm_table_pack(table, check, 0, 4, 1, 1); evas_object_show(check); ephoto->config->thumb_aspect = check; label = elm_label_add(table); elm_object_text_set(label, _("File Panel Size")); EPHOTO_ALIGN(label, 0.5, 0.5); elm_table_pack(table, label, 0, 5, 1, 1); evas_object_show(label); spinner = elm_spinner_add(table); elm_spinner_editable_set(spinner, EINA_TRUE); snprintf(buf, PATH_MAX, "%%1.2f %s", _("Weight (1.0 Max)")); elm_spinner_label_format_set(spinner, buf); elm_spinner_step_set(spinner, .05); elm_spinner_value_set(spinner, ephoto->config->left_size); elm_spinner_min_max_set(spinner, 0, 1); EPHOTO_WEIGHT(spinner, EVAS_HINT_EXPAND, EVAS_HINT_FILL); EPHOTO_FILL(spinner); elm_table_pack(table, spinner, 0, 6, 1, 1); evas_object_show(spinner); ephoto->config->panel_size = spinner; label = elm_label_add(table); elm_object_text_set(label, _("Top Level Directory")); EPHOTO_ALIGN(label, 0.5, 0.5); elm_table_pack(table, label, 0, 7, 1, 1); evas_object_show(label); hoversel = elm_hoversel_add(table); elm_hoversel_hover_parent_set(hoversel, ephoto->win); elm_hoversel_item_add(hoversel, _("Root Directory"), NULL, 0, _open_hv_select, ephoto); elm_hoversel_item_add(hoversel, _("Home Directory"), NULL, 0, _open_hv_select, ephoto); elm_hoversel_item_add(hoversel, _("Last Open Directory"), NULL, 0, _open_hv_select, ephoto); elm_hoversel_item_add(hoversel, _("Custom Directory"), NULL, 0, _open_hv_select, ephoto); elm_object_text_set(hoversel, ephoto->config->open); evas_object_data_set(hoversel, "ephoto", ephoto); EPHOTO_WEIGHT(hoversel, EVAS_HINT_EXPAND, EVAS_HINT_FILL); EPHOTO_FILL(hoversel); elm_table_pack(table, hoversel, 0, 8, 1, 1); evas_object_show(hoversel); ephoto->config->open_dir = hoversel; entry = elm_entry_add(table); elm_entry_single_line_set(entry, EINA_TRUE); elm_entry_scrollable_set(entry, EINA_TRUE); elm_object_text_set(entry, _("Custom Directory")); elm_object_disabled_set(entry, EINA_TRUE); elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); EPHOTO_EXPAND(entry); EPHOTO_FILL(entry); elm_table_pack(table, entry, 0, 9, 1, 1); evas_object_show(entry); ephoto->config->open_dir_custom = entry; } static void _hv_select(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) { elm_object_text_set(obj, elm_object_item_text_get(event_info)); } static void _spinner_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { double val; char buf[PATH_MAX]; val = elm_spinner_value_get(obj); snprintf(buf, PATH_MAX, "%%1.0f %s", ngettext("second", "seconds", val)); elm_spinner_label_format_set(obj, buf); } static Eina_List * _ephoto_transitions_list_get(const char *str) { Eina_List *list = NULL; const char *s, *b; if (!str) return NULL; for (b = s = str; 1; s++) { if ((*s == ' ') || (!*s)) { char *t = malloc(s - b + 1); if (t) { strncpy(t, b, s - b); t[s - b] = 0; list = eina_list_append(list, eina_stringshare_add(t)); free(t); } b = s + 1; } if (!*s) break; } return list; } static void _config_slideshow(Ephoto *ephoto, Evas_Object *parent) { Eina_List *transitions; Evas_Object *table, *check, *label, *spinner, *hoversel; const Eina_List *l; const char *transition; char buf[PATH_MAX]; table = elm_table_add(parent); EPHOTO_EXPAND(table); EPHOTO_FILL(table); elm_box_pack_end(parent, table); evas_object_show(table); check = elm_check_add(table); elm_object_text_set(check, _("Moving Slideshow")); EPHOTO_ALIGN(check, 0.5, 0.0); elm_check_state_set(check, ephoto->config->movess); elm_table_pack(table, check, 0, 0, 2, 1); evas_object_show(check); ephoto->config->slide_move = check; label = elm_label_add(table); memset(buf, 0, PATH_MAX); snprintf(buf, PATH_MAX, "%s:", _("Show Each Slide For")); elm_object_text_set(label, buf); EPHOTO_FILL(label); elm_table_pack(table, label, 0, 1, 1, 1); evas_object_show(label); spinner = elm_spinner_add(table); elm_spinner_editable_set(spinner, EINA_TRUE); memset(buf, 0, PATH_MAX); snprintf(buf, PATH_MAX, "%%1.0f %s", _("seconds")); evas_object_smart_callback_add(spinner, "changed", _spinner_changed, NULL); elm_spinner_label_format_set(spinner, buf); elm_spinner_step_set(spinner, 1); elm_spinner_value_set(spinner, ephoto->config->slideshow_timeout); elm_spinner_min_max_set(spinner, 1, 60); elm_table_pack(table, spinner, 1, 1, 1, 1); evas_object_show(spinner); ephoto->config->slide_time = spinner; label = elm_label_add(table); memset(buf, 0, PATH_MAX); snprintf(buf, PATH_MAX, "%s:", _("Slide Transition")); elm_object_text_set(label, buf); EPHOTO_FILL(label); elm_table_pack(table, label, 0, 2, 1, 1); evas_object_show(label); transitions = _ephoto_transitions_list_get(edje_object_data_get(elm_layout_edje_get (ephoto->slideshow), "transitions")); hoversel = elm_hoversel_add(table); elm_hoversel_hover_parent_set(hoversel, ephoto->win); EINA_LIST_FOREACH(transitions, l, transition) elm_hoversel_item_add(hoversel, transition, NULL, 0, _hv_select, transition); elm_hoversel_item_add(hoversel, "none", NULL, 0, _hv_select, NULL); elm_object_text_set(hoversel, ephoto->config->slideshow_transition); EPHOTO_EXPAND(hoversel); EPHOTO_FILL(hoversel); elm_table_pack(table, hoversel, 1, 2, 1, 1); evas_object_show(hoversel); ephoto->config->slide_trans = hoversel; } static Evas_Object * _config_settings(Ephoto *ephoto, Evas_Object *parent, Eina_Bool slideshow) { Evas_Object *box; box = elm_box_add(parent); elm_box_horizontal_set(box, EINA_FALSE); EPHOTO_EXPAND(box); EPHOTO_FILL(box); evas_object_show(box); if (!slideshow) _config_general(ephoto, box); else _config_slideshow(ephoto, box); return box; } static void _link_anchor_bt(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { char buf[PATH_MAX]; Evas_Object *av = data; const char *link = evas_object_data_get(obj, "link"); elm_entry_anchor_hover_end(av); #ifdef _WIN32 snprintf(buf, PATH_MAX, "start %s", link); #else snprintf(buf, PATH_MAX, "xdg-open %s", link); #endif ecore_exe_run(buf, NULL); } static void _copy_anchor_bt(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { char buf[PATH_MAX]; Evas_Object *av = data; const char *link = evas_object_data_get(obj, "link"); elm_entry_anchor_hover_end(av); snprintf(buf, PATH_MAX, "%s", link); elm_cnp_selection_set(av, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_MARKUP, buf, strlen(buf)); } static void _link_anchor(void *data, Evas_Object *obj, void *event_info) { Evas_Object *av = data; Evas_Object *button; Elm_Entry_Anchor_Hover_Info *ei = event_info; button = elm_button_add(obj); elm_object_text_set(button, _("Open Link In Browser")); elm_object_part_content_set(ei->hover, "middle", button); evas_object_smart_callback_add(button, "clicked", _link_anchor_bt, av); evas_object_data_set(button, "link", strdup(ei->anchor_info->name)); evas_object_show(button); button = elm_button_add(obj); elm_object_text_set(button, _("Copy Link")); elm_object_part_content_set(ei->hover, "bottom", button); evas_object_smart_callback_add(button, "clicked", _copy_anchor_bt, av); evas_object_data_set(button, "link", strdup(ei->anchor_info->name)); evas_object_show(button); } static Evas_Object * _config_bindings(Evas_Object *parent) { Evas_Object *box, *entry; Eina_Strbuf *sbuf = eina_strbuf_new(); box = elm_box_add(parent); elm_box_horizontal_set(box, EINA_FALSE); EPHOTO_EXPAND(box); EPHOTO_FILL(box); evas_object_show(box); entry = elm_entry_add(box); elm_entry_editable_set(entry, EINA_FALSE); elm_entry_line_wrap_set(entry, ELM_WRAP_NONE); EPHOTO_WEIGHT(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); EPHOTO_FILL(entry); eina_strbuf_append_printf(sbuf, _("General Bindings
" "F1: Settings Panel
" "F5: Start Slideshow
" "F11: Toggle Fullscreen
" "Ctrl+Shift+f: Toggle File Selector

" "Thumbnail Browser Bindings
" "Ctrl++: Zoom In
" "Ctrl+-: Zoom Out
" "Ctrl+Tab: View Image
" "Ctrl+c: Copy Image
" "Ctrl+x: Cut Image
" "Ctrl+v: Paste Image
" "Ctrl+a: Select All
" "Ctrl+f: Toggle Search
" "Ctrl+Delete: Delete Image
" "F2: Rename Image
" "Escape: Clear Selection

" "Single Browser Bindings
" "Ctrl+Shift+0: Zoom 1:1
" "Ctrl++: Zoom In
" "Ctrl+-: Zoom Out
" "Ctrl+0: Zoom Fit
" "Ctrl+Shift+l: Rotate Counter Clockwise
" "Ctrl+l: Flip Horizontal
" "Ctrl+Shift+r: Rotate Clockwise
" "Ctrl+r: Flip Vertical
" "Ctrl+Shift+s: Save Image As
" "Ctrl+s: Save Image
" "Ctrl+u: Reset Image
" "Ctrl+y: Redo
" "Ctrl+Shift+z: Redo
" "Ctrl+z: Undo
" "Home: Navigate First
" "Left Arrow: Navigate Previous
" "Right Arrow: Navigate Next
" "Space: Navigate Next
" "End: Navigate Last
" "Ctrl+Delete: Delete Image
" "F2 Rename Image
" "Escape: Return to Thumbnail Browser

" "Slideshow Bindings
" "Space: Play/Pause Slideshow
" "Home: Navigate First
" "Left Arrow: Navigate Previous
" "Right Arrow: Navigate Next
" "End: Navigate Last
" "Escape: Quit Slideshow
")); elm_object_text_set(entry, eina_strbuf_string_get(sbuf)); elm_box_pack_end(box, entry); evas_object_show(entry); return box; } static Evas_Object * _config_about(Evas_Object *parent) { Evas_Object *box, *entry, *img, *lbl; Eina_Strbuf *sbuf = eina_strbuf_new(); char ver[PATH_MAX]; FILE *f; box = elm_box_add(parent); elm_box_horizontal_set(box, EINA_FALSE); EPHOTO_EXPAND(box); EPHOTO_FILL(box); evas_object_show(box); img = elm_image_add(box); evas_object_image_size_set(elm_image_object_get(img), 100, 100); evas_object_size_hint_min_set(img, 200, 100); evas_object_size_hint_max_set(img, 200, 100); elm_image_preload_disabled_set(img, EINA_FALSE); elm_image_file_set(img, PACKAGE_DATA_DIR "/images/ephoto.png", NULL); elm_box_pack_end(box, img); evas_object_show(img); snprintf(ver, PATH_MAX, "Ephoto
Version: %s
", PACKAGE_VERSION); lbl = elm_label_add(box); elm_object_text_set(lbl, ver); EPHOTO_WEIGHT(lbl, EVAS_HINT_EXPAND, EVAS_HINT_FILL); EPHOTO_FILL(lbl); elm_box_pack_end(box, lbl); evas_object_show(lbl); entry = elm_entry_add(box); elm_entry_anchor_hover_style_set(entry, "popout"); elm_entry_anchor_hover_parent_set(entry, parent); elm_entry_editable_set(entry, EINA_FALSE); elm_entry_context_menu_disabled_set(entry, EINA_TRUE); elm_entry_line_wrap_set(entry, ELM_WRAP_WORD); EPHOTO_WEIGHT(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); EPHOTO_FILL(entry); eina_strbuf_append_printf(sbuf, _("Ephoto is a comprehensive image viewer based on the EFL. For more" "information, please visit the Ephoto project page:
" "" "http://www.smhouston.us/ephoto/

" "Ephoto also has a page on the Enlightenment wiki:
" "" "https://phab.enlightenment.org/w/projects/ephoto

" "Ephoto's source can be found through Enlightenment's git:
" "" "http://git.enlightenment.org/apps/ephoto.git

" "Authors:
")); f = fopen(PACKAGE_DATA_DIR "/AUTHORS", "r"); if (f) { char buf[PATH_MAX]; while (fgets(buf, sizeof(buf), f)) { int len; len = strlen(buf); if (len > 0) { if (buf[len - 1] == '\n') { buf[len - 1] = 0; len--; } if (len > 0) { char *p; do { p = strchr(buf, '<'); if (p) *p = 0; } while (p); do { p = strchr(buf, '>'); if (p) *p = 0; } while (p); eina_strbuf_append_printf(sbuf, "%s
", buf); } if (len == 0) eina_strbuf_append_printf(sbuf, "
"); } } fclose(f); } elm_object_text_set(entry, eina_strbuf_string_get(sbuf)); evas_object_smart_callback_add(entry, "anchor,hover,opened", _link_anchor, entry); elm_box_pack_end(box, entry); evas_object_show(entry); return box; } static void _list_clicked(void *data, Evas_Object *o, void *event EINA_UNUSED) { Evas_Object *page = data; Evas_Object *settings = evas_object_data_get(o, "settings"); Evas_Object *slideshow = evas_object_data_get(o, "slideshow"); Evas_Object *kb = evas_object_data_get(o, "bindings"); Evas_Object *about = evas_object_data_get(o, "about"); Evas_Object *pager = evas_object_data_get(o, "pager"); evas_object_hide(settings); evas_object_hide(slideshow); evas_object_hide(kb); evas_object_hide(about); elm_box_unpack(pager, settings); elm_box_unpack(pager, slideshow); elm_box_unpack(pager, kb); elm_box_unpack(pager, about); elm_box_pack_end(pager, page); evas_object_show(page); } static int _ephoto_config_load(Ephoto *ephoto) { Eet_File *ef; char buf[4096], buf2[4096]; snprintf(buf2, sizeof(buf2), "%s/ephoto", efreet_config_home_get()); ecore_file_mkpath(buf2); snprintf(buf, sizeof(buf), "%s/ephoto.cfg", buf2); ef = eet_open(buf, EET_FILE_MODE_READ); if (!ef) { ephoto_config_free(ephoto); ephoto->config = calloc(1, sizeof(Ephoto_Config)); return 0; } ephoto->config = eet_data_read(ef, edd, "config"); eet_close(ef); if (!ephoto->config || ephoto->config->config_version > CONFIG_VERSION) { ephoto_config_free(ephoto); ephoto->config = calloc(1, sizeof(Ephoto_Config)); return 0; } if (ephoto->config->config_version < CONFIG_VERSION) { ecore_file_unlink(buf); ephoto_config_free(ephoto); ephoto->config = calloc(1, sizeof(Ephoto_Config)); return 0; } return 1; } static Eina_Bool _ephoto_on_config_save(void *data) { Ephoto *ephoto = data; Eet_File *ef; char buf[4096], buf2[4096]; snprintf(buf, sizeof(buf), "%s/ephoto/ephoto.cfg", efreet_config_home_get()); snprintf(buf2, sizeof(buf2), "%s.tmp", buf); if (ephoto->config->window_width < 15) ephoto->config->window_width = 15; if (ephoto->config->window_height < 15) ephoto->config->window_height = 15; ef = eet_open(buf2, EET_FILE_MODE_WRITE); if (!ef) goto save_end; eet_data_write(ef, edd, "config", ephoto->config, 1); if (eet_close(ef)) goto save_end; if (!ecore_file_mv(buf2, buf)) goto save_end; save_end: ecore_file_unlink(buf2); return ECORE_CALLBACK_CANCEL; } void ephoto_config_main(Ephoto *ephoto) { Evas_Object *popup, *box, *scroller, *table, *list, *ic; Evas_Object *slideshow, *settings, *kb, *about, *pager; Elm_Object_Item *slideshowi, *settingsi, *kbi, *abouti; popup = elm_popup_add(ephoto->win); elm_popup_scrollable_set(popup, EINA_TRUE); elm_object_part_text_set(popup, "title,text", _("Settings Panel")); elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); evas_object_smart_callback_add(popup, "block,clicked", _config_save_cb, popup); box = elm_box_add(popup); EPHOTO_EXPAND(box); EPHOTO_FILL(box); evas_object_size_hint_min_set(box, ephoto->config->window_width / 2, ephoto->config->window_height / 2); evas_object_show(box); scroller = elm_scroller_add(box); EPHOTO_EXPAND(scroller); EPHOTO_FILL(scroller); elm_box_pack_end(box, scroller); evas_object_show(scroller); table = elm_table_add(scroller); elm_table_homogeneous_set(table, EINA_FALSE); EPHOTO_EXPAND(table); EPHOTO_FILL(table); evas_object_show(table); list = elm_list_add(table); elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS); elm_scroller_content_min_limit(list, 1, 1); EPHOTO_WEIGHT(list, EVAS_HINT_FILL, EVAS_HINT_EXPAND); EPHOTO_FILL(list); elm_table_pack(table, list, 0, 0, 1, 1); evas_object_show(list); pager = elm_box_add(table); EPHOTO_EXPAND(pager); EPHOTO_FILL(pager); elm_table_pack(table, pager, 1, 0, 2, 1); evas_object_show(pager); settings = _config_settings(ephoto, pager, EINA_FALSE); kb = _config_bindings(pager); about = _config_about(pager); slideshow = _config_settings(ephoto, pager, EINA_TRUE); evas_object_data_set(list, "settings", settings); evas_object_data_set(list, "slideshow", slideshow); evas_object_data_set(list, "bindings", kb); evas_object_data_set(list, "about", about); evas_object_data_set(list, "pager", pager); ic = elm_icon_add(list); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "preferences-system"); evas_object_show(ic); settingsi = elm_list_item_append(list, _("General"), ic, NULL, _list_clicked, settings); ic = elm_icon_add(list); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "media-playback-start"); evas_object_show(ic); slideshowi = elm_list_item_append(list, _("Slideshow"), ic, NULL, _list_clicked, slideshow); ic = elm_icon_add(list); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "input-keyboard"); evas_object_show(ic); kbi = elm_list_item_append(list, _("Bindings"), ic, NULL, _list_clicked, kb); ic = elm_icon_add(list); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "help-about"); evas_object_show(ic); abouti = elm_list_item_append(list, _("About"), ic, NULL, _list_clicked, about); elm_list_go(list); elm_object_item_data_set(settingsi, settings); elm_object_item_data_set(slideshowi, slideshow); elm_object_item_data_set(kbi, kb); elm_object_item_data_set(abouti, about); _list_clicked(settings, NULL, NULL); elm_list_item_selected_set(settingsi, EINA_TRUE); elm_object_content_set(scroller, table); elm_object_content_set(popup, box); evas_object_data_set(popup, "ephoto", ephoto); evas_object_show(popup); if (ephoto->config->firstrun) elm_list_item_selected_set(abouti, EINA_TRUE); } void ephoto_config_save(Ephoto *ephoto) { _ephoto_on_config_save(ephoto); } void ephoto_config_free(Ephoto *ephoto) { if (ephoto->config) { eina_stringshare_del(ephoto->config->directory); eina_stringshare_del(ephoto->config->slideshow_transition); free(ephoto->config); ephoto->config = NULL; } } Eina_Bool ephoto_config_init(Ephoto *ephoto) { Eet_Data_Descriptor_Class eddc; if (!eet_eina_stream_data_descriptor_class_set(&eddc, sizeof(eddc), "Ephoto_Config", sizeof(Ephoto_Config))) { return EINA_FALSE; } if (!edd) edd = eet_data_descriptor_stream_new(&eddc); #undef T #undef D #define T Ephoto_Config #define D edd #define C_VAL(edd, type, member, dtype) \ EET_DATA_DESCRIPTOR_ADD_BASIC(edd, type, #member, member, dtype) C_VAL(D, T, config_version, EET_T_INT); C_VAL(D, T, thumb_size, EET_T_INT); C_VAL(D, T, thumb_gen_size, EET_T_INT); C_VAL(D, T, directory, EET_T_STRING); C_VAL(D, T, slideshow_timeout, EET_T_DOUBLE); C_VAL(D, T, slideshow_transition, EET_T_STRING); C_VAL(D, T, window_width, EET_T_INT); C_VAL(D, T, window_height, EET_T_INT); C_VAL(D, T, fsel_hide, EET_T_INT); C_VAL(D, T, left_size, EET_T_DOUBLE); C_VAL(D, T, right_size, EET_T_DOUBLE); C_VAL(D, T, open, EET_T_STRING); C_VAL(D, T, prompts, EET_T_INT); C_VAL(D, T, drop, EET_T_INT); C_VAL(D, T, movess, EET_T_INT); C_VAL(D, T, smooth, EET_T_INT); C_VAL(D, T, firstrun, EET_T_INT); C_VAL(D, T, folders, EET_T_INT); C_VAL(D, T, thumbnail_aspect, EET_T_INT); switch (_ephoto_config_load(ephoto)) { case 0: /* Start a new config */ ephoto->config->config_version = CONFIG_VERSION; ephoto->config->slideshow_timeout = 4.0; ephoto->config->slideshow_transition = eina_stringshare_add("fade"); ephoto->config->window_width = 900 * elm_config_scale_get(); ephoto->config->window_height = 500 * elm_config_scale_get(); ephoto->config->fsel_hide = 0; ephoto->config->left_size = .25; ephoto->config->right_size = .25; ephoto->config->open = eina_stringshare_add(eina_environment_home_get()); ephoto->config->prompts = 1; ephoto->config->drop = 0; ephoto->config->movess = 1; ephoto->config->smooth = 1; ephoto->config->firstrun = 1; ephoto->config->folders = 1; ephoto->config->thumbnail_aspect = 0; break; default: return EINA_TRUE; } ephoto_config_save(ephoto); return EINA_TRUE; } static int _ephoto_gadget_config_load(Ephoto *ephoto) { Eet_File *ef; char buf[4096], buf2[4096]; snprintf(buf2, sizeof(buf2), "%s/ephoto", efreet_config_home_get()); ecore_file_mkpath(buf2); snprintf(buf, sizeof(buf), "%s/ephoto_gadget.cfg", buf2); ef = eet_open(buf, EET_FILE_MODE_READ); if (!ef) { ephoto_gadget_config_free(ephoto); ephoto->gadget_config = calloc(1, sizeof(Ephoto_Gadget_Config)); return 0; } ephoto->gadget_config = eet_data_read(ef, gedd, "gadget_config"); eet_close(ef); if (!ephoto->gadget_config || ephoto->gadget_config->config_version > CONFIG_VERSION) { ephoto_gadget_config_free(ephoto); ephoto->gadget_config = calloc(1, sizeof(Ephoto_Gadget_Config)); return 0; } if (ephoto->gadget_config->config_version < CONFIG_VERSION) { ecore_file_unlink(buf); ephoto_gadget_config_free(ephoto); ephoto->gadget_config = calloc(1, sizeof(Ephoto_Gadget_Config)); return 0; } return 1; } static Eina_Bool _ephoto_gadget_on_config_save(void *data) { Ephoto *ephoto = data; Eet_File *ef; char buf[4096], buf2[4096]; snprintf(buf, sizeof(buf), "%s/ephoto/ephoto_gadget.cfg", efreet_config_home_get()); snprintf(buf2, sizeof(buf2), "%s.tmp", buf); ef = eet_open(buf2, EET_FILE_MODE_WRITE); if (!ef) goto save_end; eet_data_write(ef, gedd, "gadget_config", ephoto->gadget_config, 1); if (eet_close(ef)) goto save_end; if (!ecore_file_mv(buf2, buf)) goto save_end; save_end: ecore_file_unlink(buf2); return ECORE_CALLBACK_CANCEL; } void ephoto_gadget_config_save(Ephoto *ephoto) { _ephoto_gadget_on_config_save(ephoto); } void ephoto_gadget_config_free(Ephoto *ephoto) { Ephoto_Gadget_Config_Item *gci; if (ephoto->gadget_config) { if (eina_list_count(ephoto->gadget_config->config_items)) { EINA_LIST_FREE(ephoto->gadget_config->config_items, gci) { eina_stringshare_del(gci->profile); eina_stringshare_del(gci->directory); free(gci); } } free(ephoto->gadget_config); } ephoto->gadget_config = NULL; } Ephoto_Gadget_Config_Item * ephoto_gadget_config_item_get(Ephoto *ephoto, int id, const char *profile) { Eina_List *l; Ephoto_Gadget_Config_Item *gci; EINA_LIST_FOREACH(ephoto->gadget_config->config_items, l, gci) { if (gci->id == id && eina_streq(profile, gci->profile)) return gci; } gci = calloc(1, sizeof(Ephoto_Gadget_Config_Item)); gci->id = id; gci->profile = eina_stringshare_add(profile); gci->directory = eina_stringshare_add(eina_environment_home_get());; gci->slideshow_timeout = 3; ephoto->gadget_config->config_items = eina_list_append(ephoto->gadget_config->config_items, gci); return gci; } Eina_Bool ephoto_gadget_config_init(Ephoto *ephoto) { Eet_Data_Descriptor_Class geddc; if (!eet_eina_stream_data_descriptor_class_set(&geddc, sizeof(geddc), "Ephoto_Gadget_Config", sizeof(Ephoto_Gadget_Config))) { return EINA_FALSE; } if (!gedd) gedd = eet_data_descriptor_stream_new(&geddc); if (!eet_eina_stream_data_descriptor_class_set(&geddc, sizeof(geddc), "Ephoto_Gadget_Config_Item", sizeof(Ephoto_Gadget_Config_Item))) { return EINA_FALSE; } if (!gedds) gedds = eet_data_descriptor_stream_new(&geddc); #undef GT #undef GD #define GT Ephoto_Gadget_Config #define GD gedd #define GST Ephoto_Gadget_Config_Item #define GS gedds #define GC_VAL(gedd, type, member, dtype) \ EET_DATA_DESCRIPTOR_ADD_BASIC(gedd, type, #member, member, dtype) #define GCS_VAL(edds, type, member, dtype) \ EET_DATA_DESCRIPTOR_ADD_BASIC(gedds, type, #member, member, dtype) GCS_VAL(GS, GST, id, EET_T_INT); GCS_VAL(GS, GST, profile, EET_T_STRING); GCS_VAL(GS, GST, directory, EET_T_STRING); GCS_VAL(GS, GST, slideshow_timeout, EET_T_DOUBLE); GC_VAL(GD, GT, config_version, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_LIST(gedd, Ephoto_Gadget_Config, "config_items", config_items, gedds); switch (_ephoto_gadget_config_load(ephoto)) { case 0: /* Start a new config */ ephoto->gadget_config->config_version = CONFIG_VERSION; break; default: return EINA_TRUE; } ephoto_gadget_config_save(ephoto); return EINA_TRUE; }