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',