forked from enlightenment/ephoto
Bug fixes, keybinding work, add rotation to single browser, remove photocam until is fixed/can rotate, slideshow starts in window. See summary for more.
Remove libexif support and code as this is now done outside of Ephoto. Remove all photocam code until photocam can rotate like elm_image and doesn't crash on certain jpegs and while zooming. Slideshow now starts in window, as usual press F11 for fullscreen. Single brower now does rotations. There is still a keybinding bug that needs to be fixed where keybindings are passed through to other pages within the naviframe.
This commit is contained in:
parent
b65afab7a0
commit
ef82e33746
25
configure.ac
25
configure.ac
|
@ -85,31 +85,6 @@ AC_SUBST(LTLIBINTL)
|
|||
PKG_CHECK_MODULES([ELEMENTARY], [elementary ecore-file ethumb_client])
|
||||
PKG_CHECK_MODULES([EFREET_MIME], [efreet-mime])
|
||||
|
||||
AC_ARG_ENABLE([libexif],
|
||||
[AC_HELP_STRING([--enable-libexif], [enable libexif support @<:@default=yes@:>@])],
|
||||
[
|
||||
if test "x${enableval}" = "xyes" ; then
|
||||
_ephoto_enable_libexif="yes"
|
||||
else
|
||||
_ephoto_enable_libexif="no"
|
||||
fi
|
||||
],
|
||||
[_ephoto_enable_libexif="yes"]
|
||||
)
|
||||
|
||||
AC_MSG_RESULT([${_ephoto_enable_libexif}])
|
||||
|
||||
have_libexif="No"
|
||||
|
||||
if test "x${_ephoto_enable_libexif}" = "xyes" ; then
|
||||
PKG_CHECK_MODULES(EXIF, libexif, [
|
||||
have_libexif="Yes"
|
||||
AC_DEFINE(HAVE_LIBEXIF, 1, [have libexif support])
|
||||
],[
|
||||
have_libexif="No"
|
||||
])
|
||||
fi
|
||||
|
||||
want_quicklaunch="auto"
|
||||
AC_ARG_ENABLE([quicklaunch],
|
||||
[AC_HELP_STRING([--disable-quicklaunch],
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
MAINTAINERCLEANFILES = *.o config.h.in config.h Makefile.in Makefile stamp-h1
|
||||
|
||||
INCLUDES = \
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_srcdir)/src/bin \
|
||||
-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
|
||||
-DGETTEXT_PACKAGE=\"$(PACKAGE)\" \
|
||||
-DLOCALEDIR=\"$(localedir)\" \
|
||||
@ELEMENTARY_CFLAGS@ @EFREET_MIME_CFLAGS@ @EXIF_CFLAGS@
|
||||
@ELEMENTARY_CFLAGS@ @EFREET_MIME_CFLAGS@
|
||||
|
||||
bin_PROGRAMS = ephoto
|
||||
if BUILD_QUICKLAUNCH
|
||||
|
@ -22,7 +22,7 @@ _sources = \
|
|||
ephoto_slideshow.c
|
||||
|
||||
|
||||
_libs = @ELEMENTARY_LIBS@ @EFREET_MIME_LIBS@ @EXIF_LIBS@
|
||||
_libs = @ELEMENTARY_LIBS@ @EFREET_MIME_LIBS@
|
||||
|
||||
ephoto_SOURCES = $(_sources)
|
||||
ephoto_LDADD = $(_libs)
|
||||
|
|
|
@ -37,8 +37,6 @@ Evas_Object *ephoto_thumb_add(Ephoto *ephoto, Evas_Object *parent, const char *p
|
|||
void ephoto_thumb_path_set(Evas_Object *o, const char *path);
|
||||
void ephoto_directory_set(Ephoto *ephoto, const char *path);
|
||||
|
||||
Ephoto_Orient ephoto_file_orient_get(const char *path);
|
||||
|
||||
Eina_Bool ephoto_config_init(Ephoto *em);
|
||||
void ephoto_config_save(Ephoto *em);
|
||||
void ephoto_config_free(Ephoto *em);
|
||||
|
@ -49,13 +47,13 @@ Evas_Object *ephoto_single_browser_add(Ephoto *ephoto, Evas_Object *parent);
|
|||
void ephoto_single_browser_entry_set(Evas_Object *obj, Ephoto_Entry *entry);
|
||||
void ephoto_single_browser_path_pending_set(Evas_Object *obj, const char *path);
|
||||
/* smart callbacks called:
|
||||
* "back" - the user want to go back to the previous screen.
|
||||
* "back" - the user wants to go back to the previous screen.
|
||||
*/
|
||||
|
||||
Evas_Object *ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent);
|
||||
void ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry);
|
||||
/* smart callbacks called:
|
||||
* "back" - the user want to go back to the previous screen.
|
||||
* "back" - the user wants to go back to the previous screen.
|
||||
*/
|
||||
|
||||
Evas_Object *ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent);
|
||||
|
|
|
@ -27,6 +27,7 @@ _ephoto_thumb_browser_show(Ephoto *ephoto, Ephoto_Entry *entry)
|
|||
ephoto_single_browser_entry_set(ephoto->single_browser, NULL);
|
||||
ephoto_slideshow_entry_set(ephoto->slideshow, NULL);
|
||||
elm_naviframe_item_simple_promote(ephoto->pager, ephoto->thumb_browser);
|
||||
elm_object_focus_set(ephoto->thumb_browser, EINA_TRUE);
|
||||
_ephoto_state_set(ephoto, EPHOTO_STATE_THUMB);
|
||||
ephoto_title_set(ephoto, NULL);
|
||||
|
||||
|
@ -40,6 +41,7 @@ _ephoto_single_browser_show(Ephoto *ephoto, Ephoto_Entry *entry)
|
|||
DBG("entry '%s'", entry->path);
|
||||
ephoto_single_browser_entry_set(ephoto->single_browser, entry);
|
||||
elm_naviframe_item_simple_promote(ephoto->pager, ephoto->single_browser);
|
||||
elm_object_focus_set(ephoto->single_browser, EINA_TRUE);
|
||||
_ephoto_state_set(ephoto, EPHOTO_STATE_SINGLE);
|
||||
}
|
||||
|
||||
|
@ -49,6 +51,7 @@ _ephoto_slideshow_show(Ephoto *ephoto, Ephoto_Entry *entry)
|
|||
DBG("entry '%s'", entry->path);
|
||||
ephoto_slideshow_entry_set(ephoto->slideshow, entry);
|
||||
elm_naviframe_item_simple_promote(ephoto->pager, ephoto->slideshow);
|
||||
elm_object_focus_set(ephoto->slideshow, EINA_TRUE);
|
||||
_ephoto_state_set(ephoto, EPHOTO_STATE_SLIDESHOW);
|
||||
}
|
||||
|
||||
|
@ -179,6 +182,7 @@ ephoto_window_add(const char *path)
|
|||
evas_object_show(ephoto->bg);
|
||||
|
||||
ephoto->pager = elm_naviframe_add(ephoto->win);
|
||||
elm_naviframe_prev_btn_auto_pushed_set(ephoto->pager, EINA_FALSE);
|
||||
elm_object_style_set(ephoto->pager, "fade_invisible");
|
||||
evas_object_size_hint_weight_set
|
||||
(ephoto->pager, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||
|
|
|
@ -1,15 +1,5 @@
|
|||
#include "ephoto.h"
|
||||
|
||||
#ifdef HAVE_LIBEXIF
|
||||
#include <libexif/exif-data.h>
|
||||
#endif
|
||||
|
||||
/* ROTATION is disabled until we do it properly, and properly means
|
||||
* elm_photocam and elm_image rotates their images internally.
|
||||
* Rotating the scroller is not correct and was rejected by Raster and others.
|
||||
*/
|
||||
//#define ROTATION
|
||||
|
||||
#define ZOOM_STEP 0.2
|
||||
|
||||
typedef struct _Ephoto_Single_Browser Ephoto_Single_Browser;
|
||||
|
@ -31,8 +21,8 @@ struct _Ephoto_Single_Browser
|
|||
|
||||
struct _Ephoto_Viewer
|
||||
{
|
||||
Evas_Object *photocam;
|
||||
Evas_Object *scroller;
|
||||
Evas_Object *table;
|
||||
Evas_Object *image;
|
||||
double zoom;
|
||||
Eina_Bool fit:1;
|
||||
|
@ -42,29 +32,6 @@ static void _zoom_set(Ephoto_Single_Browser *sb, double zoom);
|
|||
static void _zoom_in(Ephoto_Single_Browser *sb);
|
||||
static void _zoom_out(Ephoto_Single_Browser *sb);
|
||||
|
||||
static Eina_Bool
|
||||
_path_is_jpeg(const char *path_stringshared)
|
||||
{
|
||||
size_t len = eina_stringshare_strlen(path_stringshared);
|
||||
const char *ext;
|
||||
|
||||
if (len < sizeof(".jpg")) return EINA_FALSE;
|
||||
ext = path_stringshared + len - (sizeof(".jpg") - 1);
|
||||
if (strcasecmp(ext, ".jpg") == 0) return EINA_TRUE;
|
||||
|
||||
if (len < sizeof(".jpeg")) return EINA_FALSE;
|
||||
ext = path_stringshared + len - (sizeof(".jpeg") - 1);
|
||||
if (strcasecmp(ext, ".jpeg") == 0) return EINA_TRUE;
|
||||
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
_viewer_photocam_loaded(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
|
||||
{
|
||||
elm_photocam_paused_set(obj, EINA_FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
_viewer_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
|
||||
{
|
||||
|
@ -80,54 +47,50 @@ _viewer_add(Evas_Object *parent, const char *path)
|
|||
int err;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(v, NULL);
|
||||
if (_path_is_jpeg(path))
|
||||
|
||||
Evas_Coord w, h;
|
||||
const char *group = NULL;
|
||||
const char *ext = strrchr(path, '.');
|
||||
if (ext)
|
||||
{
|
||||
obj = v->photocam = elm_photocam_add(parent);
|
||||
EINA_SAFETY_ON_NULL_GOTO(obj, error);
|
||||
err = elm_photocam_file_set(obj, path);
|
||||
if (err != EVAS_LOAD_ERROR_NONE) goto load_error;
|
||||
elm_photocam_paused_set(obj, EINA_TRUE);
|
||||
evas_object_smart_callback_add
|
||||
(obj, "loaded", _viewer_photocam_loaded, v);
|
||||
}
|
||||
else
|
||||
{
|
||||
Evas_Coord w, h;
|
||||
const char *group = NULL;
|
||||
const char *ext = strrchr(path, '.');
|
||||
if (ext)
|
||||
ext++;
|
||||
if ((strcasecmp(ext, "edj") == 0))
|
||||
{
|
||||
ext++;
|
||||
if ((strcasecmp(ext, "edj") == 0))
|
||||
if (edje_file_group_exists(path, "e/desktop/background"))
|
||||
group = "e/desktop/background";
|
||||
else
|
||||
{
|
||||
if (edje_file_group_exists(path, "e/desktop/background"))
|
||||
group = "e/desktop/background";
|
||||
else
|
||||
{
|
||||
Eina_List *g = edje_file_collection_list(path);
|
||||
group = eina_list_data_get(g);
|
||||
edje_file_collection_list_free(g);
|
||||
}
|
||||
Eina_List *g = edje_file_collection_list(path);
|
||||
group = eina_list_data_get(g);
|
||||
edje_file_collection_list_free(g);
|
||||
}
|
||||
}
|
||||
obj = v->scroller = elm_scroller_add(parent);
|
||||
EINA_SAFETY_ON_NULL_GOTO(obj, error);
|
||||
v->image = elm_image_add(parent);
|
||||
elm_image_file_set(v->image, path, group);
|
||||
err = evas_object_image_load_error_get(elm_image_object_get(v->image));
|
||||
if (err != EVAS_LOAD_ERROR_NONE) goto load_error;
|
||||
elm_image_object_size_get(v->image, &w, &h);
|
||||
evas_object_size_hint_align_set(v->image, 0.5, 0.5);
|
||||
evas_object_size_hint_min_set(v->image, w, h);
|
||||
evas_object_size_hint_max_set(v->image, w, h);
|
||||
elm_object_content_set(v->scroller, v->image);
|
||||
evas_object_show(v->scroller);
|
||||
evas_object_show(v->image);
|
||||
}
|
||||
}
|
||||
}
|
||||
obj = v->scroller = elm_scroller_add(parent);
|
||||
EINA_SAFETY_ON_NULL_GOTO(obj, error);
|
||||
evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||
evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||
evas_object_data_set(obj, "viewer", v);
|
||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _viewer_del, v);
|
||||
evas_object_show(obj);
|
||||
|
||||
v->table = elm_table_add(v->scroller);
|
||||
evas_object_size_hint_weight_set(v->table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||
evas_object_size_hint_align_set(v->table, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||
elm_object_content_set(v->scroller, v->table);
|
||||
evas_object_show(v->table);
|
||||
|
||||
v->image = elm_image_add(v->table);
|
||||
elm_image_preload_disabled_set(v->image, EINA_FALSE);
|
||||
elm_image_file_set(v->image, path, group);
|
||||
err = evas_object_image_load_error_get(elm_image_object_get(v->image));
|
||||
if (err != EVAS_LOAD_ERROR_NONE) goto load_error;
|
||||
elm_image_object_size_get(v->image, &w, &h);
|
||||
evas_object_size_hint_min_set(v->image, w, h);
|
||||
evas_object_size_hint_max_set(v->image, w, h);
|
||||
elm_table_pack(v->table, v->image, 0, 0, 1, 1);
|
||||
evas_object_show(v->image);
|
||||
|
||||
return obj;
|
||||
|
||||
load_error:
|
||||
|
@ -142,16 +105,13 @@ static void
|
|||
_viewer_zoom_apply(Ephoto_Viewer *v, double zoom)
|
||||
{
|
||||
v->zoom = zoom;
|
||||
if (v->photocam) elm_photocam_zoom_set(v->photocam, 1.0 / zoom);
|
||||
else
|
||||
{
|
||||
Evas_Coord w, h;
|
||||
evas_object_image_size_get(elm_image_object_get(v->image), &w, &h);
|
||||
w *= zoom;
|
||||
h *= zoom;
|
||||
evas_object_size_hint_min_set(v->image, w, h);
|
||||
evas_object_size_hint_max_set(v->image, w, h);
|
||||
}
|
||||
|
||||
Evas_Coord w, h;
|
||||
evas_object_image_size_get(elm_image_object_get(v->image), &w, &h);
|
||||
w *= zoom;
|
||||
h *= zoom;
|
||||
evas_object_size_hint_min_set(v->image, w, h);
|
||||
evas_object_size_hint_max_set(v->image, w, h);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -160,16 +120,8 @@ _viewer_zoom_fit_apply(Ephoto_Viewer *v)
|
|||
Evas_Coord cw, ch, iw, ih;
|
||||
double zx, zy, zoom;
|
||||
|
||||
if (v->photocam)
|
||||
{
|
||||
evas_object_geometry_get(v->photocam, NULL, NULL, &cw, &ch);
|
||||
elm_photocam_image_size_get(v->photocam, &iw, &ih);
|
||||
}
|
||||
else
|
||||
{
|
||||
evas_object_geometry_get(v->scroller, NULL, NULL, &cw, &ch);
|
||||
evas_object_image_size_get(elm_image_object_get(v->image), &iw, &ih);
|
||||
}
|
||||
evas_object_geometry_get(v->scroller, NULL, NULL, &cw, &ch);
|
||||
evas_object_image_size_get(elm_image_object_get(v->image), &iw, &ih);
|
||||
|
||||
if ((cw <= 0) || (ch <= 0)) return; /* object still not resized */
|
||||
EINA_SAFETY_ON_TRUE_RETURN(iw <= 0);
|
||||
|
@ -197,12 +149,8 @@ _viewer_zoom_set(Evas_Object *obj, double zoom)
|
|||
|
||||
if (v->fit)
|
||||
{
|
||||
if (v->photocam)
|
||||
evas_object_event_callback_del_full
|
||||
(v->photocam, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
else
|
||||
evas_object_event_callback_del_full
|
||||
(v->scroller, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
evas_object_event_callback_del_full
|
||||
(v->scroller, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
v->fit = EINA_FALSE;
|
||||
}
|
||||
}
|
||||
|
@ -224,12 +172,8 @@ _viewer_zoom_fit(Evas_Object *obj)
|
|||
if (v->fit) return;
|
||||
v->fit = EINA_TRUE;
|
||||
|
||||
if (v->photocam)
|
||||
evas_object_event_callback_add
|
||||
(v->photocam, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
else
|
||||
evas_object_event_callback_add
|
||||
(v->scroller, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
evas_object_event_callback_add
|
||||
(v->scroller, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
|
||||
_viewer_zoom_fit_apply(v);
|
||||
}
|
||||
|
@ -237,177 +181,78 @@ _viewer_zoom_fit(Evas_Object *obj)
|
|||
static void
|
||||
_orient_apply(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
#ifdef ROTATION
|
||||
const char *sig;
|
||||
Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer");
|
||||
int w, h;
|
||||
EINA_SAFETY_ON_NULL_RETURN(v);
|
||||
|
||||
elm_table_unpack(v->table, v->image);
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sig = "state,rotate,0";
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sig = "state,rotate,90";
|
||||
elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_90);
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sig = "state,rotate,180";
|
||||
elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_180);
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sig = "state,rotate,270";
|
||||
elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_270);
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sig = "state,flip,horiz";
|
||||
elm_image_orient_set(v->image, ELM_IMAGE_FLIP_HORIZONTAL);
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sig = "state,flip,vert";
|
||||
elm_image_orient_set(v->image, ELM_IMAGE_FLIP_VERTICAL);
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sig = "state,flip,horiz,90";
|
||||
elm_image_orient_set(v->image, ELM_IMAGE_FLIP_TRANSPOSE);
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sig = "state,flip,vert,90";
|
||||
elm_image_orient_set(v->image, ELM_IMAGE_FLIP_TRANSVERSE);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
DBG("orient: %d, signal '%s'", sb->orient, sig);
|
||||
edje_object_signal_emit(sb->orient_edje, sig, "ephoto");
|
||||
#else
|
||||
(void)sb;
|
||||
#endif
|
||||
elm_image_object_size_get(v->image, &w, &h);
|
||||
evas_object_size_hint_min_set(v->image, w, h);
|
||||
evas_object_size_hint_max_set(v->image, w, h);
|
||||
elm_table_pack(v->table, v->image, 0, 0, 1, 1);
|
||||
if (v->fit)
|
||||
_viewer_zoom_fit_apply(v);
|
||||
else
|
||||
_viewer_zoom_set(sb->viewer, _viewer_zoom_get(sb->viewer));
|
||||
DBG("orient: %d", sb->orient);
|
||||
}
|
||||
|
||||
#ifdef ROTATION
|
||||
static void
|
||||
_rotate_counterclock(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sb->orient = EPHOTO_ORIENT_0;
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sb->orient = EPHOTO_ORIENT_180;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
break;
|
||||
}
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
_orient_apply(sb);
|
||||
}
|
||||
|
||||
static void
|
||||
_rotate_clock(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sb->orient = EPHOTO_ORIENT_180;
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sb->orient = EPHOTO_ORIENT_0;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
break;
|
||||
}
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
_orient_apply(sb);
|
||||
}
|
||||
|
||||
static void
|
||||
_flip_horiz(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sb->orient = EPHOTO_ORIENT_0;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sb->orient = EPHOTO_ORIENT_180;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
break;
|
||||
}
|
||||
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
_orient_apply(sb);
|
||||
}
|
||||
|
||||
static void
|
||||
_flip_vert(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sb->orient = EPHOTO_ORIENT_180;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sb->orient = EPHOTO_ORIENT_0;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
break;
|
||||
}
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
_orient_apply(sb);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info)
|
||||
|
@ -435,40 +280,6 @@ _last_entry_find(Ephoto_Single_Browser *sb)
|
|||
return eina_list_last_data_get(sb->ephoto->entries);
|
||||
}
|
||||
|
||||
Ephoto_Orient
|
||||
ephoto_file_orient_get(const char *path)
|
||||
{
|
||||
#ifndef HAVE_LIBEXIF
|
||||
(void) path;
|
||||
return EPHOTO_ORIENT_0;
|
||||
#else
|
||||
Ephoto_Orient orient = EPHOTO_ORIENT_0;
|
||||
ExifData *exif;
|
||||
ExifEntry *entry;
|
||||
ExifByteOrder bo;
|
||||
|
||||
if (!_path_is_jpeg(path)) return orient;
|
||||
|
||||
exif = exif_data_new_from_file(path);
|
||||
if (!exif) goto end;
|
||||
bo = exif_data_get_byte_order(exif);
|
||||
entry = exif_data_get_entry(exif, EXIF_TAG_ORIENTATION);
|
||||
if (!entry) goto end_entry;
|
||||
|
||||
orient = exif_get_short(entry->data, bo);
|
||||
DBG("orient=%d", orient);
|
||||
if ((orient < 1) || (orient > 8))
|
||||
{
|
||||
ERR("exif orient not supported: %d", orient);
|
||||
orient = EPHOTO_ORIENT_0;
|
||||
}
|
||||
|
||||
end_entry:
|
||||
exif_data_free(exif);
|
||||
end:
|
||||
return orient;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
_ephoto_single_browser_recalc(Ephoto_Single_Browser *sb)
|
||||
|
@ -491,8 +302,6 @@ _ephoto_single_browser_recalc(Ephoto_Single_Browser *sb)
|
|||
evas_object_event_callback_add
|
||||
(sb->viewer, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel, sb);
|
||||
ephoto_title_set(sb->ephoto, bname);
|
||||
sb->orient = ephoto_file_orient_get(sb->entry->path);
|
||||
_orient_apply(sb);
|
||||
|
||||
elm_table_pack(sb->table, sb->panel, 0, 0, 1, 1);
|
||||
}
|
||||
|
@ -642,7 +451,6 @@ _go_last(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
|
|||
_last_entry(sb);
|
||||
}
|
||||
|
||||
#ifdef ROTATION
|
||||
static void
|
||||
_go_rotate_counterclock(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
|
||||
{
|
||||
|
@ -670,7 +478,6 @@ _go_flip_vert(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__
|
|||
Ephoto_Single_Browser *sb = data;
|
||||
_flip_vert(sb);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
_slideshow(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
|
||||
|
@ -732,15 +539,14 @@ _key_down(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event
|
|||
|
||||
if (!strcmp(k, "Escape"))
|
||||
evas_object_smart_callback_call(sb->main, "back", sb->entry);
|
||||
else if (!strcmp(k, "Left") || !strcmp(k, "BackSpace"))
|
||||
else if (!strcmp(k, "Left"))
|
||||
_prev_entry(sb);
|
||||
else if (!strcmp(k, "Right") || !strcmp(k, "space"))
|
||||
else if (!strcmp(k, "Right"))
|
||||
_next_entry(sb);
|
||||
else if (!strcmp(k, "Home"))
|
||||
_first_entry(sb);
|
||||
else if (!strcmp(k, "End"))
|
||||
_last_entry(sb);
|
||||
#if ROTATION
|
||||
else if (!strcmp(k, "bracketleft"))
|
||||
{
|
||||
if (!shift) _rotate_counterclock(sb);
|
||||
|
@ -751,12 +557,16 @@ _key_down(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event
|
|||
if (!shift) _rotate_clock(sb);
|
||||
else _flip_vert(sb);
|
||||
}
|
||||
#endif
|
||||
else if (!strcmp(k, "F5"))
|
||||
{
|
||||
if (sb->entry)
|
||||
evas_object_smart_callback_call(sb->main, "slideshow", sb->entry);
|
||||
}
|
||||
else if (!strcmp(k, "F11"))
|
||||
{
|
||||
Evas_Object *win = sb->ephoto->win;
|
||||
elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -896,12 +706,26 @@ ephoto_single_browser_add(Ephoto *ephoto, Evas_Object *parent)
|
|||
|
||||
elm_toolbar_item_separator_set(elm_toolbar_item_append(sb->bar, NULL, NULL, NULL, NULL), EINA_TRUE);
|
||||
|
||||
icon = elm_toolbar_item_append(sb->bar, "emblem-system", "Settings", _settings, sb);
|
||||
icon = elm_toolbar_item_append(sb->bar, "object-rotate-left", "Rotate Left", _go_rotate_counterclock, sb);
|
||||
elm_toolbar_item_priority_set(icon, 50);
|
||||
|
||||
icon = elm_toolbar_item_append(sb->bar, "stock_about", "About", _about, sb);
|
||||
icon = elm_toolbar_item_append(sb->bar, "object-rotate-right", "Rotate Right", _go_rotate_clock, sb);
|
||||
elm_toolbar_item_priority_set(icon, 40);
|
||||
|
||||
icon = elm_toolbar_item_append(sb->bar, "object-flip-horizontal", "Flip Horizontal", _go_flip_horiz, sb);
|
||||
elm_toolbar_item_priority_set(icon, 30);
|
||||
|
||||
icon = elm_toolbar_item_append(sb->bar, "object-flip-vertical", "Flip Vertical", _go_flip_vert, sb);
|
||||
elm_toolbar_item_priority_set(icon, 20);
|
||||
|
||||
elm_toolbar_item_separator_set(elm_toolbar_item_append(sb->bar, NULL, NULL, NULL, NULL), EINA_TRUE);
|
||||
|
||||
icon = elm_toolbar_item_append(sb->bar, "emblem-system", "Settings", _settings, sb);
|
||||
elm_toolbar_item_priority_set(icon, 10);
|
||||
|
||||
icon = elm_toolbar_item_append(sb->bar, "stock_about", "About", _about, sb);
|
||||
elm_toolbar_item_priority_set(icon, 0);
|
||||
|
||||
elm_object_content_set(sb->panel, sb->bar);
|
||||
evas_object_show(sb->bar);
|
||||
|
||||
|
|
|
@ -93,53 +93,11 @@ ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
_image_resized(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *image, void *event_info __UNUSED__)
|
||||
{
|
||||
Evas_Map *map = evas_map_new(4);
|
||||
Evas_Coord cx, cy, x, y, w, h;
|
||||
int orient = (long)evas_object_data_get(image, "orient");
|
||||
|
||||
evas_object_geometry_get(image, &x, &y, &w, &h);
|
||||
evas_map_util_points_populate_from_geometry(map, x, y, w, h, 0);
|
||||
cx = x + w / 2;
|
||||
cy = y + h / 2;
|
||||
|
||||
switch (orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
evas_map_util_rotate(map, 90.0, cx, cy);
|
||||
evas_object_map_enable_set(image, EINA_TRUE);
|
||||
evas_object_map_set(image, map);
|
||||
printf("rotated 90 around %d,%d (%dx%d)\n", cx, cy, w, h);
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
evas_map_util_rotate(map, 180.0, cx, cy);
|
||||
evas_object_map_enable_set(image, EINA_TRUE);
|
||||
evas_object_map_set(image, map);
|
||||
printf("rotated 180 around %d,%d (%d,%d %dx%d)\n", cx, cy, x, y, w, h);
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
evas_map_util_rotate(map, 270.0, cx, cy);
|
||||
evas_object_map_enable_set(image, EINA_TRUE);
|
||||
evas_object_map_set(image, map);
|
||||
printf("rotated 270 around %d,%d (%dx%d)\n", cx, cy, w, h);
|
||||
break;
|
||||
default:
|
||||
ERR("unknown orient %d", orient);
|
||||
}
|
||||
|
||||
evas_map_free(map);
|
||||
}
|
||||
|
||||
static Evas_Object *
|
||||
_slideshow_item_get(void *data, Evas_Object *obj)
|
||||
{
|
||||
Ephoto_Entry *entry = data;
|
||||
/* TODO use viewer from ephoto_single_browser.c */
|
||||
/* TODO consider using exif rotation, see ephoto_single_browser.c */
|
||||
|
||||
const char *group = NULL;
|
||||
const char *ext = strrchr(entry->path, '.');
|
||||
if (ext)
|
||||
|
@ -161,11 +119,6 @@ _slideshow_item_get(void *data, Evas_Object *obj)
|
|||
elm_image_file_set(image, entry->path, group);
|
||||
elm_object_style_set(image, "shadow");
|
||||
|
||||
evas_object_data_set
|
||||
(image, "orient", (void*)(long)ephoto_file_orient_get(entry->path));
|
||||
evas_object_event_callback_add
|
||||
(image, EVAS_CALLBACK_RESIZE, _image_resized, NULL);
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
|
@ -198,7 +151,7 @@ ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry)
|
|||
elm_slideshow_clear(ss->slideshow);
|
||||
if (!entry) return;
|
||||
|
||||
elm_win_fullscreen_set(ss->ephoto->win, EINA_TRUE);
|
||||
//elm_win_fullscreen_set(ss->ephoto->win, EINA_TRUE);
|
||||
EINA_LIST_FOREACH(ss->ephoto->entries, l, itr)
|
||||
{
|
||||
Elm_Object_Item *slideshow_item;
|
||||
|
|
|
@ -268,36 +268,23 @@ _key_down(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event
|
|||
{
|
||||
Ephoto_Thumb_Browser *tb = data;
|
||||
Evas_Event_Key_Down *ev = event_info;
|
||||
Eina_Bool alt = evas_key_modifier_is_set(ev->modifiers, "Alt");
|
||||
const char *k = ev->keyname;
|
||||
|
||||
if (alt)
|
||||
{
|
||||
if (!strcmp(k, "Up"))
|
||||
{
|
||||
if (strcmp(tb->ephoto->config->directory, "/"))
|
||||
{
|
||||
char *parent = ecore_file_dir_get
|
||||
(tb->ephoto->config->directory);
|
||||
if (parent)
|
||||
ephoto_directory_set(tb->ephoto, parent);
|
||||
free(parent);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(k, "F5"))
|
||||
{
|
||||
Elm_Object_Item *it = elm_gengrid_selected_item_get(tb->grid);
|
||||
Ephoto_Entry *entry;
|
||||
if (it) entry = elm_object_item_data_get(it);
|
||||
else entry = eina_list_nth(tb->grid_items, 0);
|
||||
else entry = eina_list_nth(tb->ephoto->entries, 0);
|
||||
|
||||
if (entry)
|
||||
evas_object_smart_callback_call(tb->main, "slideshow", entry);
|
||||
}
|
||||
else if (!strcmp(k, "F11"))
|
||||
{
|
||||
Evas_Object *win = tb->ephoto->win;
|
||||
elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue