diff --git a/meson.build b/meson.build index 01ddeed..aae480f 100644 --- a/meson.build +++ b/meson.build @@ -13,9 +13,10 @@ cfg = configuration_data() ##### dependencies efl_version = '>= 1.19.0' -elm = dependency('elementary', required: true, version: efl_version) -edje = dependency('edje', required: true, version: efl_version) -eipc = dependency('ecore-ipc', required: true, version: efl_version) +elm = dependency('elementary', required: true, version: efl_version) +edje = dependency('edje', required: true, version: efl_version) +eipc = dependency('ecore-ipc', required: true, version: efl_version) +exif = dependency('libexif', required: false, version: '>= 0.6.0') ##### check for windows dependency if build_machine.system() == 'windows' win = dependency('evil', version: efl_version) @@ -34,10 +35,7 @@ cc = meson.get_compiler('c') ##### get edje command edje_cmd = join_paths(edje.get_pkgconfig_variable('prefix'), 'bin', 'edje_cc') -##### translations -if get_option('nls') == true - subdir('po') -endif + ##### config.h cfg.set_quoted('PACKAGE' , proj) cfg.set_quoted('PACKAGE_NAME' , proj) @@ -61,11 +59,25 @@ endif ##### Check for arpa/inet and netinet/in.h if cc.has_header('arpa/inet.h') == true cfg.set ('HAVE_ARPA_INET_H' , 1) +else + cfg.set ('HAVE_ARPA_INET_H' , 0) endif if cc.has_header('netinet/in.h') == true cfg.set ('HAVE_NETINET_IN_H' , 1) +else + cfg.set ('HAVE_NETINET_IN_H' , 0) +endif +if exif.found() == true + cfg.set ('HAVE_LIBEXIF' , 1) +else + cfg.set ('HAVE_LIBEXIF' , 0) endif configure_file(output: 'config.h', configuration: cfg) +##### translations +if get_option('nls') == true + subdir('po') +endif + subdir('src') subdir('data') diff --git a/src/bin/ephoto.h b/src/bin/ephoto.h index d5626d7..961c501 100644 --- a/src/bin/ephoto.h +++ b/src/bin/ephoto.h @@ -159,6 +159,11 @@ void ephoto_filter_emboss(Ephoto *ephoto, Evas_Object *image); void ephoto_filter_histogram_eq(Ephoto *ephoto, Evas_Object *image); /*file functions*/ +#ifdef HAVE_LIBEXIF +Eina_Bool ephoto_file_has_exif(const char *file); +Eina_Hash *ephoto_file_get_exif_data(Ephoto *ephoto, const char *file); +void ephoto_file_exif_data(Ephoto *ephoto, const char *file); +#endif void ephoto_file_save_image(Ephoto *ephoto, Ephoto_Entry *entry, Evas_Object *image); void ephoto_file_save_image_as(Ephoto *ephoto, Ephoto_Entry *entry, diff --git a/src/bin/ephoto_config.c b/src/bin/ephoto_config.c index 0d87649..892333d 100644 --- a/src/bin/ephoto_config.c +++ b/src/bin/ephoto_config.c @@ -144,7 +144,7 @@ _config_general(Ephoto *ephoto, Evas_Object *parent) elm_spinner_step_set(spinner, .05); elm_spinner_value_set(spinner, ephoto->config->left_size); elm_spinner_min_max_set(spinner, 0, 1); - EPHOTO_EXPAND(spinner); + 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); @@ -248,7 +248,7 @@ _config_slideshow(Ephoto *ephoto, Evas_Object *parent) check = elm_check_add(table); elm_object_text_set(check, _("Moving Slideshow")); - EPHOTO_ALIGN(check, 0.5, 0.5); + 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); @@ -305,30 +305,20 @@ _config_slideshow(Ephoto *ephoto, Evas_Object *parent) static Evas_Object * _config_settings(Ephoto *ephoto, Evas_Object *parent, Eina_Bool slideshow) { - Evas_Object *frame, *vbox; + Evas_Object *box; - frame = elm_frame_add(parent); - if (!slideshow) - elm_object_text_set(frame, _("General")); - else - elm_object_text_set(frame, _("Slideshow")); - EPHOTO_EXPAND(frame); - EPHOTO_FILL(frame); - evas_object_show(frame); - - vbox = elm_box_add(frame); - elm_box_horizontal_set(vbox, EINA_FALSE); - EPHOTO_EXPAND(vbox); - EPHOTO_FILL(vbox); - elm_object_content_set(frame, vbox); - evas_object_show(vbox); + 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, vbox); + _config_general(ephoto, box); else - _config_slideshow(ephoto, vbox); + _config_slideshow(ephoto, box); - return frame; + return box; } static void @@ -389,29 +379,16 @@ _link_anchor(void *data, Evas_Object *obj, void *event_info) static Evas_Object * _config_bindings(Evas_Object *parent) { - Evas_Object *frame, *box, *scroller, *entry; + Evas_Object *box, *entry; Eina_Strbuf *sbuf = eina_strbuf_new(); - frame = elm_frame_add(parent); - elm_object_text_set(frame, _("Bindings")); - EPHOTO_EXPAND(frame); - EPHOTO_FILL(frame); - evas_object_show(frame); - box = elm_box_add(parent); elm_box_horizontal_set(box, EINA_FALSE); EPHOTO_EXPAND(box); EPHOTO_FILL(box); - elm_object_content_set(frame, box); 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); - - entry = elm_entry_add(scroller); + 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); @@ -465,38 +442,24 @@ _config_bindings(Evas_Object *parent) "End: Navigate Last
" "Escape: Quit Slideshow
")); elm_object_text_set(entry, eina_strbuf_string_get(sbuf)); - elm_object_content_set(scroller, entry); + elm_box_pack_end(box, entry); evas_object_show(entry); - return frame; + return box; } static Evas_Object * _config_about(Evas_Object *parent) { - Evas_Object *frame, *box, *entry, *img, *lbl; - Evas_Object *scroller; + Evas_Object *box, *entry, *img, *lbl; Eina_Strbuf *sbuf = eina_strbuf_new(); char ver[PATH_MAX]; FILE *f; - frame = elm_frame_add(parent); - elm_object_text_set(frame, _("About")); - EPHOTO_EXPAND(frame); - EPHOTO_FILL(frame); - evas_object_show(frame); - - scroller = elm_scroller_add(frame); - EPHOTO_EXPAND(scroller); - EPHOTO_FILL(scroller); - elm_object_content_set(frame, scroller); - evas_object_show(scroller); - - box = elm_box_add(frame); + box = elm_box_add(parent); elm_box_horizontal_set(box, EINA_FALSE); EPHOTO_EXPAND(box); EPHOTO_FILL(box); - elm_object_content_set(scroller, box); evas_object_show(box); img = elm_image_add(box); @@ -512,7 +475,7 @@ _config_about(Evas_Object *parent) lbl = elm_label_add(box); elm_object_text_set(lbl, ver); - EPHOTO_EXPAND(lbl); + EPHOTO_WEIGHT(lbl, EVAS_HINT_EXPAND, EVAS_HINT_FILL); EPHOTO_FILL(lbl); elm_box_pack_end(box, lbl); evas_object_show(lbl); @@ -586,7 +549,7 @@ _config_about(Evas_Object *parent) elm_box_pack_end(box, entry); evas_object_show(entry); - return frame; + return box; } static void @@ -598,11 +561,17 @@ _list_clicked(void *data, Evas_Object *o, void *event EINA_UNUSED) 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); } @@ -677,8 +646,8 @@ save_end: void ephoto_config_main(Ephoto *ephoto) { - Evas_Object *popup, *table, *list, *ic; - Evas_Object *slideshow, *settings, *kb, *about; + 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); @@ -687,32 +656,49 @@ ephoto_config_main(Ephoto *ephoto) elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); evas_object_smart_callback_add(popup, "block,clicked", _config_save_cb, popup); - table = elm_table_add(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); - - settings = _config_settings(ephoto, table, EINA_FALSE); - elm_table_pack(table, settings, 1, 0, 1, 1); - kb = _config_bindings(table); - elm_table_pack(table, kb, 1, 0, 1, 1); - about = _config_about(table); - elm_table_pack(table, about, 1, 0, 1, 1); - slideshow = _config_settings(ephoto, table, EINA_TRUE); - elm_table_pack(table, slideshow, 1, 0, 1, 1); + 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_EXPAND(list); + 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); @@ -748,14 +734,13 @@ ephoto_config_main(Ephoto *ephoto) elm_object_item_data_set(slideshowi, slideshow); elm_object_item_data_set(kbi, kb); elm_object_item_data_set(abouti, about); - evas_object_hide(slideshow); - evas_object_hide(kb); - evas_object_hide(about); + _list_clicked(settings, NULL, NULL); elm_list_item_selected_set(settingsi, EINA_TRUE); - evas_object_show(table); - elm_object_content_set(popup, table); + elm_object_content_set(scroller, table); + + elm_object_content_set(popup, box); evas_object_data_set(popup, "ephoto", ephoto); evas_object_show(popup); diff --git a/src/bin/ephoto_file.c b/src/bin/ephoto_file.c index f83f5a4..66dddf0 100644 --- a/src/bin/ephoto_file.c +++ b/src/bin/ephoto_file.c @@ -1,4 +1,129 @@ #include "ephoto.h" +#ifdef HAVE_LIBEXIF +#include + +Eina_Bool +ephoto_file_has_exif(const char *file) +{ + ExifData *ed = exif_data_new_from_file(file); + + ed = exif_data_new_from_file(file); + if (!ed) return EINA_FALSE; + + exif_data_unref(ed); + return EINA_TRUE; +} + +Eina_Hash * +ephoto_file_get_exif_data(Ephoto *ephoto EINA_UNUSED, const char *file) +{ + ExifData *ed = exif_data_new_from_file(file); + ExifEntry *ee = NULL; + Eina_Hash *hash = eina_hash_string_superfast_new(NULL); + unsigned int tag, val; + const char *title = NULL; + char value[1024]; + + if (!ed) return NULL; + for (tag = 0; tag < 0xffff; tag++) + { + title = exif_tag_get_title(tag); + for (val = 0; val < EXIF_IFD_COUNT; val++) + { + ee = exif_content_get_entry(ed->ifd[val], tag); + if (ee) + { + exif_entry_ref(ee); + exif_entry_get_value(ee, value, 1024); + eina_hash_add(hash, eina_stringshare_add(title), + eina_stringshare_add(value)); + exif_entry_unref(ee); + } + } + } + exif_data_unref(ed); + return hash; +} + +static void +_exif_save_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + + evas_object_del(popup); +} + +void +ephoto_file_exif_data(Ephoto *ephoto, const char *file) +{ + Eina_Hash *hash = NULL; + Eina_Iterator *it = NULL; + Eina_Hash_Tuple *t = NULL; + Evas_Object *popup, *box, *scroller, *list, *label, *entry; + const char *key = NULL, *value = NULL; + int i = 0; + + hash = ephoto_file_get_exif_data(ephoto, file); + + popup = elm_popup_add(ephoto->win); + elm_popup_scrollable_set(popup, EINA_TRUE); + elm_object_part_text_set(popup, "title,text", _("Image Properties")); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + evas_object_smart_callback_add(popup, "block,clicked", _exif_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); + + list = elm_table_add(scroller); + elm_table_homogeneous_set(list, EINA_FALSE); + EPHOTO_EXPAND(list); + EPHOTO_FILL(list); + elm_object_content_set(scroller, list); + evas_object_show(list); + + it = eina_hash_iterator_tuple_new(hash); + EINA_ITERATOR_FOREACH(it, t) + { + key = t->key; + value = t->data; + + label = elm_label_add(list); + elm_object_text_set(label, key); + EPHOTO_ALIGN(label, 0.0, 0.5); + elm_table_pack(list, label, 0, i, 1, 1); + evas_object_show(label); + + entry = elm_entry_add(list); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + elm_object_text_set(entry, value); + EPHOTO_EXPAND(entry); + EPHOTO_FILL(entry); + elm_table_pack(list, entry, 1, i, 1, 1); + evas_object_show(entry); + + i++; + } + eina_iterator_free(it); + + evas_object_data_set(popup, "ephoto", ephoto); + elm_object_part_content_set(popup, "default", box); + evas_object_show(popup); +} +#endif static void _complete_ok(void *data, Evas_Object *obj EINA_UNUSED, diff --git a/src/bin/ephoto_single_browser.c b/src/bin/ephoto_single_browser.c index eda1b98..c20ac7e 100644 --- a/src/bin/ephoto_single_browser.c +++ b/src/bin/ephoto_single_browser.c @@ -1091,6 +1091,17 @@ _upload_image(void *data, Evas_Object *obj EINA_UNUSED, ephoto_file_upload_image(sb->ephoto, sb->entry); } +static void +_view_exif(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Single_Browser *sb = data; + +#ifdef HAVE_LIBEXIF + ephoto_file_exif_data(sb->ephoto, sb->entry->path); +#endif +} + static void _delete_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1905,6 +1916,11 @@ _add_edit_menu_items(Ephoto_Single_Browser *sb, Evas_Object *menu) _delete_image, sb); elm_menu_item_add(menu, menu_it, "document-send", _("Upload"), _upload_image, sb); +#ifdef HAVE_LIBEXIF + if (ephoto_file_has_exif(sb->entry->path)) + elm_menu_item_add(menu, menu_it, "document-properties", _("Properties"), + _view_exif, sb); +#endif elm_menu_item_separator_add(menu, NULL); elm_menu_item_add(menu, NULL, "zoom-fit", _("Zoom Fit"), _zoom_fit_cb, sb); diff --git a/src/bin/ephoto_thumb_browser.c b/src/bin/ephoto_thumb_browser.c index 8de8b52..b7073b7 100644 --- a/src/bin/ephoto_thumb_browser.c +++ b/src/bin/ephoto_thumb_browser.c @@ -1765,7 +1765,7 @@ _ephoto_main_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNU if (it) { evas_object_data_del(tb->main, "rename_item"); - evas_object_data_set(tb->main, "rename_item", tb); + evas_object_data_set(tb->main, "rename_item", it); _grid_menu_rename_cb(tb, NULL, NULL); } } diff --git a/src/bin/meson.build b/src/bin/meson.build index fe87d16..73b194f 100644 --- a/src/bin/meson.build +++ b/src/bin/meson.build @@ -2,7 +2,8 @@ inc = include_directories('.', '../..') deps = [ elm, edje, - eipc + eipc, + exif ] executable('ephoto', [ 'ephoto.c',