From cf25f7c5610cbb151c987003949964b0e6be58c5 Mon Sep 17 00:00:00 2001 From: Stephen Houston Date: Tue, 24 Nov 2015 16:21:21 -0600 Subject: [PATCH] Ephoto: Add file operations, context menus, sorting, and more. --- src/bin/Makefile.am | 3 + src/bin/ephoto.c | 84 +- src/bin/ephoto.h | 239 +-- src/bin/ephoto_bcg.c | 295 +-- src/bin/ephoto_color.c | 250 +-- src/bin/ephoto_config.c | 254 +-- src/bin/ephoto_cropper.c | 494 ++--- src/bin/ephoto_filters.c | 398 ++-- src/bin/ephoto_hsv.c | 293 +-- src/bin/ephoto_main.c | 536 +++--- src/bin/ephoto_single_browser.c | 2053 ++++++++++++--------- src/bin/ephoto_slideshow.c | 437 +++-- src/bin/ephoto_thumb_browser.c | 3064 +++++++++++++++++++++++++++---- 13 files changed, 5807 insertions(+), 2593 deletions(-) diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 6cba033..89e7d08 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -6,6 +6,9 @@ ephoto_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/src/bin \ -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ + -Wall \ + -Wextra \ + -Wshadow \ @EFL_CFLAGS@ ephoto_LDADD = @EFL_LIBS@ if HAVE_PO diff --git a/src/bin/ephoto.c b/src/bin/ephoto.c index a103e54..dff68ae 100644 --- a/src/bin/ephoto.c +++ b/src/bin/ephoto.c @@ -2,9 +2,6 @@ static void _ephoto_display_usage(void); -/* Global log domain pointer */ -int __log_domain = -1; - EAPI int elm_main(int argc, char **argv) { @@ -23,79 +20,70 @@ elm_main(int argc, char **argv) textdomain(PACKAGE); #endif - __log_domain = eina_log_domain_register("ephoto", EINA_COLOR_ORANGE); - if (!__log_domain) - { - EINA_LOG_ERR("Could not register log domain: Ephoto"); - r = 1; - goto end_log_domain; - } - if (!efreet_mime_init()) - ERR("Could not init efreet_mime!"); + printf("Could not initialize Efreet_Mime!\n"); elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); - DBG("Logging initialized"); if (argc > 2) { - printf("Too Many Arguments!\n"); - _ephoto_display_usage(); - r = 1; - goto end; + printf("Too Many Arguments!\n"); + _ephoto_display_usage(); + r = 1; + goto end; } else if (argc < 2) { - Evas_Object *win = ephoto_window_add(NULL); - if (!win) - { - r = 1; - goto end; - } + Evas_Object *win = ephoto_window_add(NULL); + + if (!win) + { + r = 1; + goto end; + } } else if (!strncmp(argv[1], "--help", 6)) { - _ephoto_display_usage(); - r = 0; - goto end; + _ephoto_display_usage(); + r = 0; + goto end; } else { - char *real = ecore_file_realpath(argv[1]); - if (!real) - { - printf("invalid file or directory: '%s'\n", argv[1]); - r = 1; - goto end; - } - Evas_Object *win = ephoto_window_add(real); - free(real); - if (!win) - { - r = 1; - goto end; - } + char *real = ecore_file_realpath(argv[1]); + + if (!real) + { + printf("invalid file or directory: '%s'\n", argv[1]); + r = 1; + goto end; + } + Evas_Object *win = ephoto_window_add(real); + + free(real); + if (!win) + { + r = 1; + goto end; + } } elm_run(); - end: - eina_log_domain_unregister(__log_domain); + end: efreet_mime_shutdown(); - end_log_domain: eio_shutdown(); return r; } -/*Display useage commands for ephoto*/ +/* Display useage commands for ephoto */ static void _ephoto_display_usage(void) { - printf("Ephoto Usage: \n" - "ephoto --help : This page\n" - "ephoto filename : Specifies a file to open\n" - "ephoto dirname : Specifies a directory to open\n"); + printf("Ephoto Usage: \n" "ephoto --help : This page\n" + "ephoto filename : Specifies a file to open\n" + "ephoto dirname : Specifies a directory to open\n"); } ELM_MAIN() diff --git a/src/bin/ephoto.h b/src/bin/ephoto.h index a4ed9d6..bb77678 100644 --- a/src/bin/ephoto.h +++ b/src/bin/ephoto.h @@ -1,34 +1,38 @@ #ifndef _EPHOTO_H_ -#define _EPHOTO_H_ +# define _EPHOTO_H_ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include -#ifdef HAVE_PO -#include -#endif +# ifdef HAVE_PO +# include +# endif -#ifdef HAVE_GETTEXT -#include "gettext.h" +#if HAVE_GETTEXT && ENABLE_NLS +#define _(string) gettext (string) +#else +#define _(string) (string) +#define ngettext(String1, String2, Var) Var == 1 ? String1 : String2 #endif typedef struct _Ephoto_Config Ephoto_Config; @@ -38,77 +42,88 @@ typedef struct _Ephoto_Event_Entry_Create Ephoto_Event_Entry_Create; typedef enum _Ephoto_State Ephoto_State; typedef enum _Ephoto_Orient Ephoto_Orient; +typedef enum _Ephoto_Sort Ephoto_Sort; Evas_Object *ephoto_window_add(const char *path); -void ephoto_title_set(Ephoto *ephoto, const char *title); -void ephoto_thumb_size_set(Ephoto *ephoto, int size); -Evas_Object *ephoto_thumb_add(Ephoto *ephoto, Evas_Object *parent, const char *path); -void ephoto_thumb_path_set(Evas_Object *obj, const char *path); -void ephoto_directory_set(Ephoto *ephoto, const char *path); +void ephoto_title_set(Ephoto *ephoto, const char *title); +void ephoto_thumb_size_set(Ephoto *ephoto, int size); +Evas_Object *ephoto_thumb_add(Ephoto *ephoto, Evas_Object *parent, + const char *path); +void ephoto_thumb_path_set(Evas_Object *obj, const char *path); +void ephoto_directory_set(Ephoto *ephoto, const char *path, + Elm_Widget_Item *expanded, Eina_Bool dirs_only); -Eina_Bool ephoto_config_init(Ephoto *em); -void ephoto_config_save(Ephoto *em); -void ephoto_config_free(Ephoto *em); -void ephoto_config_general(Ephoto *em); -void ephoto_config_slideshow(Ephoto *em); -void ephoto_config_about(Ephoto *em); +Eina_Bool ephoto_config_init(Ephoto *em); +void ephoto_config_save(Ephoto *em); +void ephoto_config_free(Ephoto *em); +void ephoto_config_general(Ephoto *em); +void ephoto_config_slideshow(Ephoto *em); +void ephoto_config_about(Ephoto *em); 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); -void ephoto_single_browser_image_data_update(Evas_Object *main, Evas_Object *image, Eina_Bool finished, unsigned int *image_data, int w, int h); -void ephoto_single_browser_cancel_editing(Evas_Object *main, Evas_Object *image); - /* smart callbacks called: - * "back" - the user wants to go back to the previous screen. - */ +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); +void ephoto_single_browser_image_data_update(Evas_Object *main, + Evas_Object *image, Eina_Bool finished, unsigned int *image_data, int w, + int h); +void ephoto_single_browser_cancel_editing(Evas_Object *main, + Evas_Object *image); +/* smart callbacks called: "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 wants to go back to the previous screen. - */ +void ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry); + +/* smart callbacks called: "back" - the user wants to go back to the previous + * screen. */ Evas_Object *ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent); +void ephoto_thumb_browser_fsel_clear(Ephoto *ephoto); -/* smart callbacks called: - * "selected" - an item in the thumb browser is selected. The selected Ephoto_Entry is passed as event_info argument. - */ +/* smart callbacks called: "selected" - an item in the thumb browser is + * selected. The selected Ephoto_Entry is passed as event_info argument. */ -void ephoto_cropper_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image_parent, Evas_Object *image); -void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image); -void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image); -void ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image); -void ephoto_filter_blur(Evas_Object *main, Evas_Object *image); -void ephoto_filter_sharpen(Evas_Object *main, Evas_Object *image); -void ephoto_filter_black_and_white(Evas_Object *main, Evas_Object *image); -void ephoto_filter_old_photo(Evas_Object *main, Evas_Object *image); -void ephoto_filter_histogram_eq(Evas_Object *main, Evas_Object *image); +void ephoto_cropper_add(Evas_Object *main, Evas_Object *parent, + Evas_Object *image_parent, Evas_Object *image); +void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, + Evas_Object *image); +void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, + Evas_Object *image); +void ephoto_color_add(Evas_Object *main, Evas_Object *parent, + Evas_Object *image); +void ephoto_filter_blur(Evas_Object *main, Evas_Object *image); +void ephoto_filter_sharpen(Evas_Object *main, Evas_Object *image); +void ephoto_filter_black_and_white(Evas_Object *main, Evas_Object *image); +void ephoto_filter_old_photo(Evas_Object *main, Evas_Object *image); +void ephoto_filter_histogram_eq(Evas_Object *main, Evas_Object *image); enum _Ephoto_State { - EPHOTO_STATE_THUMB, - EPHOTO_STATE_SINGLE, - EPHOTO_STATE_SLIDESHOW + EPHOTO_STATE_THUMB, + EPHOTO_STATE_SINGLE, + EPHOTO_STATE_SLIDESHOW }; -enum _Ephoto_Orient /* matches with exif orientation tag */ +enum _Ephoto_Orient { - EPHOTO_ORIENT_0 = 1, - EPHOTO_ORIENT_FLIP_HORIZ = 2, - EPHOTO_ORIENT_180 = 3, - EPHOTO_ORIENT_FLIP_VERT = 4, - EPHOTO_ORIENT_FLIP_VERT_90 = 5, - EPHOTO_ORIENT_90 = 6, - EPHOTO_ORIENT_FLIP_HORIZ_90 = 7, - EPHOTO_ORIENT_270 = 8 + EPHOTO_ORIENT_0 = 1, + EPHOTO_ORIENT_FLIP_HORIZ = 2, + EPHOTO_ORIENT_180 = 3, + EPHOTO_ORIENT_FLIP_VERT = 4, + EPHOTO_ORIENT_FLIP_VERT_90 = 5, + EPHOTO_ORIENT_90 = 6, + EPHOTO_ORIENT_FLIP_HORIZ_90 = 7, + EPHOTO_ORIENT_270 = 8 +}; + +enum _Ephoto_Sort +{ + EPHOTO_SORT_ALPHABETICAL_ASCENDING, + EPHOTO_SORT_ALPHABETICAL_DESCENDING, + EPHOTO_SORT_MODTIME_ASCENDING, + EPHOTO_SORT_MODTIME_DESCENDING }; -/* TODO: split into window & global config, allow multi window - * - * This also requires single instance, as 2 instances changing the - * same configuration will lead to problems. - * - * Single instance is better done as DBus, using FDO standard methods. - */ struct _Ephoto_Config { int config_version; @@ -122,11 +137,15 @@ struct _Ephoto_Config int fsel_hide; int tool_hide; const char *open; + int prompts; + int drop; Evas_Object *slide_time; Evas_Object *slide_trans; Evas_Object *hide_toolbar; Evas_Object *open_dir; Evas_Object *open_dir_custom; + Evas_Object *show_prompts; + Evas_Object *move_drop; }; struct _Ephoto @@ -144,14 +163,16 @@ struct _Ephoto Eina_List *entries; Eina_List *direntries; - Eina_List *thumbs; /* live thumbs that need to be regenerated on changes */ + Eina_List *thumbs; - int thumb_gen_size; /* pending value for thumb_regen */ - Evas_Coord bottom_bar_size; - struct { + int thumb_gen_size; + Evas_Coord bottom_bar_size; + struct + { Ecore_Timer *thumb_regen; } timer; - struct { + struct + { Ecore_Job *change_dir; } job; @@ -166,10 +187,11 @@ struct _Ephoto struct _Ephoto_Entry { const char *path; - const char *basename; /* pointer inside path */ + const char *basename; const char *label; Ephoto *ephoto; Elm_Object_Item *item; + Elm_Object_Item *parent; Eina_List *free_listeners; Eina_Bool is_dir; }; @@ -179,17 +201,15 @@ struct _Ephoto_Event_Entry_Create Ephoto_Entry *entry; }; -Ephoto_Entry *ephoto_entry_new(Ephoto *ephoto, const char *path, const char *label, Eina_File_Type type); -void ephoto_entry_free(Ephoto_Entry *entry); -void ephoto_entry_free_listener_add(Ephoto_Entry *entry, void (*cb)(void *data, const Ephoto_Entry *entry), const void *data); -void ephoto_entry_free_listener_del(Ephoto_Entry *entry, void (*cb)(void *data, const Ephoto_Entry *entry), const void *data); -void ephoto_entries_free(Ephoto *ephoto); -int ephoto_entries_cmp(const void *pa, const void *pb); - -extern int __log_domain; -#define DBG(...) EINA_LOG_DOM_DBG(__log_domain, __VA_ARGS__) -#define INF(...) EINA_LOG_DOM_INFO(__log_domain, __VA_ARGS__) -#define ERR(...) EINA_LOG_DOM_ERR(__log_domain, __VA_ARGS__) +Ephoto_Entry *ephoto_entry_new(Ephoto *ephoto, const char *path, + const char *label, Eina_File_Type type); +void ephoto_entry_free(Ephoto_Entry *entry); +void ephoto_entry_free_listener_add(Ephoto_Entry *entry, + void (*cb) (void *data, const Ephoto_Entry *entry), const void *data); +void ephoto_entry_free_listener_del(Ephoto_Entry *entry, + void (*cb) (void *data, const Ephoto_Entry *entry), const void *data); +void ephoto_entries_free(Ephoto *ephoto); +int ephoto_entries_cmp(const void *pa, const void *pb); static inline Eina_Bool _ephoto_eina_file_direct_info_image_useful(const Eina_File_Direct_Info *info) @@ -197,29 +217,28 @@ _ephoto_eina_file_direct_info_image_useful(const Eina_File_Direct_Info *info) const char *type, *bname; int i = 0; - const char *filters[] = - { - "png", "jpeg", "jpg", "eet", "xpm", "tiff", "gif", "svg", "webp", "pmaps", - "bmp", "tga", "wbmp", "ico", "psd", "jp2k", "generic" + const char *filters[] = { + "png", "jpeg", "jpg", "eet", "xpm", "tiff", "gif", "svg", "webp", "pmaps", + "bmp", "tga", "wbmp", "ico", "psd", "jp2k", "generic" }; bname = info->path + info->name_start; - if (bname[0] == '.') return EINA_FALSE; + if (bname[0] == '.') + return EINA_FALSE; if ((info->type != EINA_FILE_REG) && (info->type != EINA_FILE_UNKNOWN)) - return EINA_FALSE; + return EINA_FALSE; type = strrchr(bname, '.'); - if(!type) return EINA_FALSE; - int count = sizeof(filters)/sizeof(filters[0]); - for (i=0; i < count; i++) + if (!type) + return EINA_FALSE; + int count = sizeof(filters) / sizeof(filters[0]); + + for (i = 0; i < count; i++) { - if (!strcasecmp(type+1, filters[i])) - return evas_object_image_extension_can_load_get(bname); + if (!strcasecmp(type + 1, filters[i])) + return evas_object_image_extension_can_load_get(bname); } return EINA_FALSE; - /* seems that this does not play nice with threads */ - //if (!(type = efreet_mime_type_get(info->path))) return EINA_FALSE; - //return strncmp(type, "image/", sizeof("image/") - 1) == 0; } extern int EPHOTO_EVENT_ENTRY_CREATE; diff --git a/src/bin/ephoto_bcg.c b/src/bin/ephoto_bcg.c index 70401c7..48a8512 100644 --- a/src/bin/ephoto_bcg.c +++ b/src/bin/ephoto_bcg.c @@ -21,221 +21,236 @@ static int _normalize_color(int color) { if (color < 0) - return 0; + return 0; else if (color > 255) - return 255; + return 255; else - return color; + return color; } static int _mul_color_alpha(int color, int alpha) { if (alpha > 0 && alpha < 255) - return (color * (255 / alpha)); + return color * (255 / alpha); else - return color; + return color; } static int _demul_color_alpha(int color, int alpha) { if (alpha > 0 && alpha < 255) - return ((color * alpha) / 255); + return (color * alpha) / 255; else - return color; + return color; } unsigned int * -_ephoto_bcg_adjust_brightness(Ephoto_BCG *ebcg, int brightness, unsigned int *image_data) +_ephoto_bcg_adjust_brightness(Ephoto_BCG *ebcg, int brightness, + unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h; + int x, y; int a, r, g, b, bb, gg, rr; im_data = malloc(sizeof(unsigned int) * ebcg->w * ebcg->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * ebcg->w * ebcg->h); + memcpy(im_data, image_data, sizeof(unsigned int) * ebcg->w * ebcg->h); else - memcpy(im_data, ebcg->original_im_data, sizeof(unsigned int) * ebcg->w * ebcg->h); + memcpy(im_data, ebcg->original_im_data, + sizeof(unsigned int) * ebcg->w * ebcg->h); ebcg->brightness = brightness; im_data_new = malloc(sizeof(unsigned int) * ebcg->w * ebcg->h); for (y = 0; y < ebcg->h; y++) { - p1 = im_data + (y * ebcg->w); - p2 = im_data_new + (y * ebcg->w); - for (x = 0; x < ebcg->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - bb = (int)b+ebcg->brightness; - gg = (int)g+ebcg->brightness; - rr = (int)r+ebcg->brightness; - bb = _normalize_color(bb); - gg = _normalize_color(gg); - rr = _normalize_color(rr); - bb = _demul_color_alpha(bb, a); - gg = _demul_color_alpha(gg, a); - rr = _demul_color_alpha(rr, a); - *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; - p2++; - p1++; - } + p1 = im_data + (y * ebcg->w); + p2 = im_data_new + (y * ebcg->w); + for (x = 0; x < ebcg->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + bb = (int) b + ebcg->brightness; + gg = (int) g + ebcg->brightness; + rr = (int) r + ebcg->brightness; + bb = _normalize_color(bb); + gg = _normalize_color(gg); + rr = _normalize_color(rr); + bb = _demul_color_alpha(bb, a); + gg = _demul_color_alpha(gg, a); + rr = _demul_color_alpha(rr, a); + *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; + p2++; + p1++; + } } - ephoto_single_browser_image_data_update(ebcg->main, ebcg->image, EINA_FALSE, im_data_new, ebcg->w, ebcg->h); + ephoto_single_browser_image_data_update(ebcg->main, ebcg->image, EINA_FALSE, + im_data_new, ebcg->w, ebcg->h); free(im_data); return im_data_new; } unsigned int * -_ephoto_bcg_adjust_contrast(Ephoto_BCG *ebcg, int contrast, unsigned int *image_data) +_ephoto_bcg_adjust_contrast(Ephoto_BCG *ebcg, int contrast, + unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h, top, bottom; + int x, y, top, bottom; int a, r, g, b, bb, gg, rr; float factor; im_data = malloc(sizeof(unsigned int) * ebcg->w * ebcg->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * ebcg->w * ebcg->h); + memcpy(im_data, image_data, sizeof(unsigned int) * ebcg->w * ebcg->h); else - memcpy(im_data, ebcg->original_im_data, sizeof(unsigned int) * ebcg->w * ebcg->h); + memcpy(im_data, ebcg->original_im_data, + sizeof(unsigned int) * ebcg->w * ebcg->h); ebcg->contrast = contrast; - top = ((255+(contrast))*259); - bottom = ((259-(contrast))*255); - factor = (float)top / (float)bottom; + top = ((255 + (contrast)) * 259); + bottom = ((259 - (contrast)) * 255); + factor = (float) top / (float) bottom; im_data_new = malloc(sizeof(unsigned int) * ebcg->w * ebcg->h); - + for (y = 0; y < ebcg->h; y++) { - p1 = im_data + (y * ebcg->w); - p2 = im_data_new + (y * ebcg->w); - for (x = 0; x < ebcg->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - bb = (int)((factor * (b - 128)) + 128); - gg = (int)((factor * (g - 128)) + 128); - rr = (int)((factor * (r - 128)) + 128); - bb = _normalize_color(bb); - gg = _normalize_color(gg); - rr = _normalize_color(rr); - bb = _demul_color_alpha(bb, a); - gg = _demul_color_alpha(gg, a); - rr = _demul_color_alpha(rr, a); - *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; - p2++; - p1++; - } - } - ephoto_single_browser_image_data_update(ebcg->main, ebcg->image, EINA_FALSE, im_data_new, ebcg->w, ebcg->h); + p1 = im_data + (y * ebcg->w); + p2 = im_data_new + (y * ebcg->w); + for (x = 0; x < ebcg->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + bb = (int) ((factor * (b - 128)) + 128); + gg = (int) ((factor * (g - 128)) + 128); + rr = (int) ((factor * (r - 128)) + 128); + bb = _normalize_color(bb); + gg = _normalize_color(gg); + rr = _normalize_color(rr); + bb = _demul_color_alpha(bb, a); + gg = _demul_color_alpha(gg, a); + rr = _demul_color_alpha(rr, a); + *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; + p2++; + p1++; + } + } + ephoto_single_browser_image_data_update(ebcg->main, ebcg->image, EINA_FALSE, + im_data_new, ebcg->w, ebcg->h); free(im_data); return im_data_new; } unsigned int * -_ephoto_bcg_adjust_gamma(Ephoto_BCG *ebcg, double gamma, unsigned int *image_data) +_ephoto_bcg_adjust_gamma(Ephoto_BCG *ebcg, double gamma, + unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h; + int x, y; int a, r, g, b, bb, gg, rr; im_data = malloc(sizeof(unsigned int) * ebcg->w * ebcg->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * ebcg->w * ebcg->h); + memcpy(im_data, image_data, sizeof(unsigned int) * ebcg->w * ebcg->h); else - memcpy(im_data, ebcg->original_im_data, sizeof(unsigned int) * ebcg->w * ebcg->h); + memcpy(im_data, ebcg->original_im_data, + sizeof(unsigned int) * ebcg->w * ebcg->h); - ebcg->gamma = 1/gamma; + ebcg->gamma = 1 / gamma; im_data_new = malloc(sizeof(unsigned int) * ebcg->w * ebcg->h); - + for (y = 0; y < ebcg->h; y++) { - p1 = im_data + (y * ebcg->w); - p2 = im_data_new + (y * ebcg->w); - for (x = 0; x < ebcg->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - bb = (int)(pow(((double)b/255), ebcg->gamma) * 255); - gg = (int)(pow(((double)g/255), ebcg->gamma) * 255); - rr = (int)(pow(((double)r/255), ebcg->gamma) * 255); - bb = _normalize_color(bb); - gg = _normalize_color(gg); - rr = _normalize_color(rr); - bb = _demul_color_alpha(bb, a); - gg = _demul_color_alpha(gg, a); - rr = _demul_color_alpha(rr, a); - *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; - p2++; - p1++; - } - } - ephoto_single_browser_image_data_update(ebcg->main, ebcg->image, EINA_FALSE, im_data_new, ebcg->w, ebcg->h); + p1 = im_data + (y * ebcg->w); + p2 = im_data_new + (y * ebcg->w); + for (x = 0; x < ebcg->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + bb = (int) (pow(((double) b / 255), ebcg->gamma) * 255); + gg = (int) (pow(((double) g / 255), ebcg->gamma) * 255); + rr = (int) (pow(((double) r / 255), ebcg->gamma) * 255); + bb = _normalize_color(bb); + gg = _normalize_color(gg); + rr = _normalize_color(rr); + bb = _demul_color_alpha(bb, a); + gg = _demul_color_alpha(gg, a); + rr = _demul_color_alpha(rr, a); + *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; + p2++; + p1++; + } + } + ephoto_single_browser_image_data_update(ebcg->main, ebcg->image, EINA_FALSE, + im_data_new, ebcg->w, ebcg->h); free(im_data); return im_data_new; } static void -_brightness_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_brightness_slider_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) { Ephoto_BCG *ebcg = data; int brightness; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; brightness = elm_slider_value_get(obj); image_data = _ephoto_bcg_adjust_brightness(ebcg, brightness, NULL); - image_data_two = _ephoto_bcg_adjust_contrast(ebcg, ebcg->contrast, image_data); - image_data_three = _ephoto_bcg_adjust_gamma(ebcg, ebcg->gamma, image_data_two); + image_data_two = + _ephoto_bcg_adjust_contrast(ebcg, ebcg->contrast, image_data); + _ephoto_bcg_adjust_gamma(ebcg, ebcg->gamma, image_data_two); } - static void -_contrast_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_contrast_slider_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) { Ephoto_BCG *ebcg = data; int contrast; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; contrast = elm_slider_value_get(obj); image_data = _ephoto_bcg_adjust_contrast(ebcg, contrast, NULL); - image_data_two = _ephoto_bcg_adjust_brightness(ebcg, ebcg->brightness, image_data); - image_data_three = _ephoto_bcg_adjust_gamma(ebcg, ebcg->gamma, image_data_two); + image_data_two = + _ephoto_bcg_adjust_brightness(ebcg, ebcg->brightness, image_data); + _ephoto_bcg_adjust_gamma(ebcg, ebcg->gamma, image_data_two); } static void -_gamma_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_gamma_slider_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) { Ephoto_BCG *ebcg = data; double gamma; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; gamma = elm_slider_value_get(obj); image_data = _ephoto_bcg_adjust_gamma(ebcg, gamma, NULL); - image_data_two = _ephoto_bcg_adjust_brightness(ebcg, ebcg->brightness, image_data); - image_data_three = _ephoto_bcg_adjust_contrast(ebcg, ebcg->contrast, image_data_two); + image_data_two = + _ephoto_bcg_adjust_brightness(ebcg, ebcg->brightness, image_data); + _ephoto_bcg_adjust_contrast(ebcg, ebcg->contrast, image_data_two); } static void -_bcg_reset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_bcg_reset(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_BCG *ebcg = data; @@ -249,20 +264,25 @@ _bcg_reset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSE } static void -_bcg_apply(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_bcg_apply(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_BCG *ebcg = data; unsigned int *image_data; int w, h; - image_data = evas_object_image_data_get(elm_image_object_get(ebcg->image), EINA_FALSE); + image_data = + evas_object_image_data_get(elm_image_object_get(ebcg->image), + EINA_FALSE); evas_object_image_size_get(elm_image_object_get(ebcg->image), &w, &h); - ephoto_single_browser_image_data_update(ebcg->main, ebcg->image, EINA_TRUE, image_data, w, h); + ephoto_single_browser_image_data_update(ebcg->main, ebcg->image, EINA_TRUE, + image_data, w, h); evas_object_del(ebcg->frame); } static void -_bcg_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_bcg_cancel(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_BCG *ebcg = data; @@ -278,16 +298,19 @@ _bcg_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUS } static void -_frame_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_frame_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_BCG *ebcg = data; + free(ebcg->original_im_data); free(ebcg); } -void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) +void +ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) { - Evas_Object *win, *box, *slider, *ic, *button; + Evas_Object *box, *slider, *ic, *button; Ephoto_BCG *ebcg; unsigned int *im_data; @@ -302,10 +325,14 @@ void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) ebcg->main = main; ebcg->parent = parent; ebcg->image = image; - im_data = evas_object_image_data_get(elm_image_object_get(ebcg->image), EINA_FALSE); - evas_object_image_size_get(elm_image_object_get(ebcg->image), &ebcg->w, &ebcg->h); + im_data = + evas_object_image_data_get(elm_image_object_get(ebcg->image), + EINA_FALSE); + evas_object_image_size_get(elm_image_object_get(ebcg->image), &ebcg->w, + &ebcg->h); ebcg->original_im_data = malloc(sizeof(unsigned int) * ebcg->w * ebcg->h); - memcpy(ebcg->original_im_data, im_data, sizeof(unsigned int) * ebcg->w * ebcg->h); + memcpy(ebcg->original_im_data, im_data, + sizeof(unsigned int) * ebcg->w * ebcg->h); ebcg->frame = elm_frame_add(parent); elm_object_text_set(ebcg->frame, _("Brightness/Contrast/Gamma")); @@ -313,7 +340,8 @@ void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) evas_object_size_hint_align_set(ebcg->frame, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(parent, ebcg->frame); evas_object_data_set(ebcg->frame, "ebcg", ebcg); - evas_object_event_callback_add(ebcg->frame, EVAS_CALLBACK_DEL, _frame_del, ebcg); + evas_object_event_callback_add(ebcg->frame, EVAS_CALLBACK_DEL, _frame_del, + ebcg); evas_object_show(ebcg->frame); box = elm_box_add(ebcg->frame); @@ -331,7 +359,8 @@ void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) elm_slider_unit_format_set(slider, "%1.0f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _brightness_slider_changed, ebcg); + evas_object_smart_callback_add(slider, "delay,changed", + _brightness_slider_changed, ebcg); elm_box_pack_end(box, slider); evas_object_show(slider); ebcg->bslider = slider; @@ -344,7 +373,8 @@ void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) elm_slider_unit_format_set(slider, "%1.0f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _contrast_slider_changed, ebcg); + evas_object_smart_callback_add(slider, "delay,changed", + _contrast_slider_changed, ebcg); elm_box_pack_end(box, slider); evas_object_show(slider); ebcg->cslider = slider; @@ -357,7 +387,8 @@ void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) elm_slider_unit_format_set(slider, "%1.2f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _gamma_slider_changed, ebcg); + evas_object_smart_callback_add(slider, "delay,changed", + _gamma_slider_changed, ebcg); elm_box_pack_end(box, slider); evas_object_show(slider); ebcg->gslider = slider; @@ -406,6 +437,6 @@ void ephoto_bcg_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) return; - error: - return; + error: + return; } diff --git a/src/bin/ephoto_color.c b/src/bin/ephoto_color.c index 218c960..94eb8c3 100644 --- a/src/bin/ephoto_color.c +++ b/src/bin/ephoto_color.c @@ -21,165 +21,173 @@ static int _normalize_color(int color) { if (color < 0) - return 0; + return 0; else if (color > 255) - return 255; + return 255; else - return color; + return color; } static int _mul_color_alpha(int color, int alpha) { if (alpha > 0 && alpha < 255) - return (color * (255 / alpha)); + return color * (255 / alpha); else - return color; + return color; } static int _demul_color_alpha(int color, int alpha) { if (alpha > 0 && alpha < 255) - return ((color * alpha) / 255); + return (color * alpha) / 255; else - return color; + return color; } unsigned int * _ephoto_color_adjust_red(Ephoto_Color *eco, int red, unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h; + int x, y; int a, r, g, b, rr; im_data = malloc(sizeof(unsigned int) * eco->w * eco->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * eco->w * eco->h); + memcpy(im_data, image_data, sizeof(unsigned int) * eco->w * eco->h); else - memcpy(im_data, eco->original_im_data, sizeof(unsigned int) * eco->w * eco->h); + memcpy(im_data, eco->original_im_data, + sizeof(unsigned int) * eco->w * eco->h); eco->red = red; im_data_new = malloc(sizeof(unsigned int) * eco->w * eco->h); for (y = 0; y < eco->h; y++) { - p1 = im_data + (y * eco->w); - p2 = im_data_new + (y * eco->w); - for (x = 0; x < eco->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - rr = (int)r+eco->red; - b = _normalize_color(b); - g = _normalize_color(g); - rr = _normalize_color(rr); - b = _demul_color_alpha(b, a); - g = _demul_color_alpha(g, a); - rr = _demul_color_alpha(rr, a); - *p2 = (a << 24) | (rr << 16) | (g << 8) | b; - p2++; - p1++; - } + p1 = im_data + (y * eco->w); + p2 = im_data_new + (y * eco->w); + for (x = 0; x < eco->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + rr = (int) r + eco->red; + b = _normalize_color(b); + g = _normalize_color(g); + rr = _normalize_color(rr); + b = _demul_color_alpha(b, a); + g = _demul_color_alpha(g, a); + rr = _demul_color_alpha(rr, a); + *p2 = (a << 24) | (rr << 16) | (g << 8) | b; + p2++; + p1++; + } } - ephoto_single_browser_image_data_update(eco->main, eco->image, EINA_FALSE, im_data_new, eco->w, eco->h); + ephoto_single_browser_image_data_update(eco->main, eco->image, EINA_FALSE, + im_data_new, eco->w, eco->h); free(im_data); return im_data_new; } unsigned int * -_ephoto_color_adjust_green(Ephoto_Color *eco, int green, unsigned int *image_data) +_ephoto_color_adjust_green(Ephoto_Color *eco, int green, + unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h; + int x, y; int a, r, g, b, gg; im_data = malloc(sizeof(unsigned int) * eco->w * eco->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * eco->w * eco->h); + memcpy(im_data, image_data, sizeof(unsigned int) * eco->w * eco->h); else - memcpy(im_data, eco->original_im_data, sizeof(unsigned int) * eco->w * eco->h); + memcpy(im_data, eco->original_im_data, + sizeof(unsigned int) * eco->w * eco->h); eco->green = green; im_data_new = malloc(sizeof(unsigned int) * eco->w * eco->h); for (y = 0; y < eco->h; y++) { - p1 = im_data + (y * eco->w); - p2 = im_data_new + (y * eco->w); - for (x = 0; x < eco->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - gg = (int)g+eco->green; - b = _normalize_color(b); - gg = _normalize_color(gg); - r = _normalize_color(r); - b = _demul_color_alpha(b, a); - gg = _demul_color_alpha(gg, a); - r = _demul_color_alpha(r, a); - *p2 = (a << 24) | (r << 16) | (gg << 8) | b; - p2++; - p1++; - } + p1 = im_data + (y * eco->w); + p2 = im_data_new + (y * eco->w); + for (x = 0; x < eco->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + gg = (int) g + eco->green; + b = _normalize_color(b); + gg = _normalize_color(gg); + r = _normalize_color(r); + b = _demul_color_alpha(b, a); + gg = _demul_color_alpha(gg, a); + r = _demul_color_alpha(r, a); + *p2 = (a << 24) | (r << 16) | (gg << 8) | b; + p2++; + p1++; + } } - ephoto_single_browser_image_data_update(eco->main, eco->image, EINA_FALSE, im_data_new, eco->w, eco->h); + ephoto_single_browser_image_data_update(eco->main, eco->image, EINA_FALSE, + im_data_new, eco->w, eco->h); free(im_data); return im_data_new; } unsigned int * -_ephoto_color_adjust_blue(Ephoto_Color *eco, int blue, unsigned int *image_data) +_ephoto_color_adjust_blue(Ephoto_Color *eco, int blue, + unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h; + int x, y; int a, r, g, b, bb; im_data = malloc(sizeof(unsigned int) * eco->w * eco->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * eco->w * eco->h); + memcpy(im_data, image_data, sizeof(unsigned int) * eco->w * eco->h); else - memcpy(im_data, eco->original_im_data, sizeof(unsigned int) * eco->w * eco->h); + memcpy(im_data, eco->original_im_data, + sizeof(unsigned int) * eco->w * eco->h); eco->blue = blue; im_data_new = malloc(sizeof(unsigned int) * eco->w * eco->h); for (y = 0; y < eco->h; y++) { - p1 = im_data + (y * eco->w); - p2 = im_data_new + (y * eco->w); - for (x = 0; x < eco->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - bb = (int)b+eco->blue; - bb = _normalize_color(bb); - g = _normalize_color(g); - r = _normalize_color(r); - bb = _demul_color_alpha(bb, a); - g = _demul_color_alpha(g, a); - r = _demul_color_alpha(r, a); - *p2 = (a << 24) | (r << 16) | (g << 8) | bb; - p2++; - p1++; - } + p1 = im_data + (y * eco->w); + p2 = im_data_new + (y * eco->w); + for (x = 0; x < eco->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + bb = (int) b + eco->blue; + bb = _normalize_color(bb); + g = _normalize_color(g); + r = _normalize_color(r); + bb = _demul_color_alpha(bb, a); + g = _demul_color_alpha(g, a); + r = _demul_color_alpha(r, a); + *p2 = (a << 24) | (r << 16) | (g << 8) | bb; + p2++; + p1++; + } } - ephoto_single_browser_image_data_update(eco->main, eco->image, EINA_FALSE, im_data_new, eco->w, eco->h); + ephoto_single_browser_image_data_update(eco->main, eco->image, EINA_FALSE, + im_data_new, eco->w, eco->h); free(im_data); return im_data_new; } @@ -189,43 +197,45 @@ _red_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Ephoto_Color *eco = data; int red; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; red = elm_slider_value_get(obj); image_data = _ephoto_color_adjust_red(eco, red, NULL); image_data_two = _ephoto_color_adjust_green(eco, eco->green, image_data); - image_data_three = _ephoto_color_adjust_blue(eco, eco->blue, image_data_two); + _ephoto_color_adjust_blue(eco, eco->blue, image_data_two); } - static void -_green_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_green_slider_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) { Ephoto_Color *eco = data; int green; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; green = elm_slider_value_get(obj); image_data = _ephoto_color_adjust_green(eco, green, NULL); image_data_two = _ephoto_color_adjust_red(eco, eco->red, image_data); - image_data_three = _ephoto_color_adjust_blue(eco, eco->blue, image_data_two); + _ephoto_color_adjust_blue(eco, eco->blue, image_data_two); } static void -_blue_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_blue_slider_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) { Ephoto_Color *eco = data; int blue; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; blue = elm_slider_value_get(obj); image_data = _ephoto_color_adjust_blue(eco, blue, NULL); image_data_two = _ephoto_color_adjust_red(eco, eco->red, image_data); - image_data_three = _ephoto_color_adjust_green(eco, eco->green, image_data_two); + _ephoto_color_adjust_green(eco, eco->green, image_data_two); } static void -_color_reset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_color_reset(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Color *eco = data; @@ -239,20 +249,24 @@ _color_reset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNU } static void -_color_apply(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_color_apply(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Color *eco = data; unsigned int *image_data; int w, h; - image_data = evas_object_image_data_get(elm_image_object_get(eco->image), EINA_FALSE); + image_data = + evas_object_image_data_get(elm_image_object_get(eco->image), EINA_FALSE); evas_object_image_size_get(elm_image_object_get(eco->image), &w, &h); - ephoto_single_browser_image_data_update(eco->main, eco->image, EINA_TRUE, image_data, w, h); + ephoto_single_browser_image_data_update(eco->main, eco->image, EINA_TRUE, + image_data, w, h); evas_object_del(eco->frame); } static void -_color_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_color_cancel(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Color *eco = data; @@ -268,16 +282,19 @@ _color_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UN } static void -_frame_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_frame_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Color *eco = data; + free(eco->original_im_data); free(eco); } -void ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) +void +ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) { - Evas_Object *win, *box, *slider, *ic, *button; + Evas_Object *box, *slider, *ic, *button; Ephoto_Color *eco; unsigned int *im_data; @@ -292,10 +309,13 @@ void ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image eco->main = main; eco->parent = parent; eco->image = image; - im_data = evas_object_image_data_get(elm_image_object_get(eco->image), EINA_FALSE); - evas_object_image_size_get(elm_image_object_get(eco->image), &eco->w, &eco->h); + im_data = + evas_object_image_data_get(elm_image_object_get(eco->image), EINA_FALSE); + evas_object_image_size_get(elm_image_object_get(eco->image), &eco->w, + &eco->h); eco->original_im_data = malloc(sizeof(unsigned int) * eco->w * eco->h); - memcpy(eco->original_im_data, im_data, sizeof(unsigned int) * eco->w * eco->h); + memcpy(eco->original_im_data, im_data, + sizeof(unsigned int) * eco->w * eco->h); eco->frame = elm_frame_add(parent); elm_object_text_set(eco->frame, _("Adjust Color Levels")); @@ -303,7 +323,8 @@ void ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image evas_object_size_hint_align_set(eco->frame, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(parent, eco->frame); evas_object_data_set(eco->frame, "eco", eco); - evas_object_event_callback_add(eco->frame, EVAS_CALLBACK_DEL, _frame_del, eco); + evas_object_event_callback_add(eco->frame, EVAS_CALLBACK_DEL, _frame_del, + eco); evas_object_show(eco->frame); box = elm_box_add(eco->frame); @@ -321,7 +342,8 @@ void ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image elm_slider_unit_format_set(slider, "%1.0f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _red_slider_changed, eco); + evas_object_smart_callback_add(slider, "delay,changed", _red_slider_changed, + eco); elm_box_pack_end(box, slider); evas_object_show(slider); eco->rslider = slider; @@ -334,7 +356,8 @@ void ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image elm_slider_unit_format_set(slider, "%1.0f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _green_slider_changed, eco); + evas_object_smart_callback_add(slider, "delay,changed", + _green_slider_changed, eco); elm_box_pack_end(box, slider); evas_object_show(slider); eco->gslider = slider; @@ -347,7 +370,8 @@ void ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image elm_slider_unit_format_set(slider, "%1.0f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _blue_slider_changed, eco); + evas_object_smart_callback_add(slider, "delay,changed", _blue_slider_changed, + eco); elm_box_pack_end(box, slider); evas_object_show(slider); eco->bslider = slider; @@ -396,6 +420,6 @@ void ephoto_color_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image return; - error: - return; + error: + return; } diff --git a/src/bin/ephoto_config.c b/src/bin/ephoto_config.c index 6b48d37..04906d7 100644 --- a/src/bin/ephoto_config.c +++ b/src/bin/ephoto_config.c @@ -1,6 +1,6 @@ #include "ephoto.h" -#define CONFIG_VERSION 11 +#define CONFIG_VERSION 13 static int _ephoto_config_load(Ephoto *ephoto); static Eina_Bool _ephoto_on_config_save(void *data); @@ -12,22 +12,21 @@ 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))) + if (!eet_eina_stream_data_descriptor_class_set(&eddc, sizeof(eddc), + "Ephoto_Config", sizeof(Ephoto_Config))) { - ERR("Unable to create the config data descriptor!"); - return EINA_FALSE; + return EINA_FALSE; } - if (!edd) edd = eet_data_descriptor_stream_new(&eddc); + 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) + 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); @@ -40,20 +39,26 @@ ephoto_config_init(Ephoto *ephoto) C_VAL(D, T, fsel_hide, EET_T_INT); C_VAL(D, T, tool_hide, EET_T_INT); C_VAL(D, T, open, EET_T_STRING); + C_VAL(D, T, prompts, EET_T_INT); + C_VAL(D, T, drop, 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; - ephoto->config->window_height = 600; - ephoto->config->fsel_hide = 0; - ephoto->config->tool_hide = 0; - break; - default: - return EINA_TRUE; + 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; + ephoto->config->window_height = 600; + ephoto->config->fsel_hide = 0; + ephoto->config->tool_hide = 0; + ephoto->config->open = eina_stringshare_add(getenv("HOME")); + ephoto->config->prompts = 1; + ephoto->config->drop = 0; + break; + + default: + return EINA_TRUE; } ephoto_config_save(ephoto); @@ -77,12 +82,13 @@ static void _close(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *popup = data; - + evas_object_del(popup); } static void -_save_general(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_save_general(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto *ephoto = evas_object_data_get(popup, "ephoto"); @@ -90,22 +96,23 @@ _save_general(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UN const char *text = elm_object_text_get(ephoto->config->open_dir); if (!strcmp(text, _("Root Directory"))) - path = "/"; + path = "/"; else if (!strcmp(text, _("Home Directory"))) - path = getenv("HOME"); + path = getenv("HOME"); else if (!strcmp(text, _("Last Open Directory"))) - path = "Last"; + path = "Last"; else - path = elm_object_text_get(ephoto->config->open_dir_custom); + 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); - ephoto->config->tool_hide = elm_check_state_get(ephoto->config->hide_toolbar); - + eina_stringshare_replace(&ephoto->config->open, path); + ephoto->config->tool_hide = + elm_check_state_get(ephoto->config->hide_toolbar); + ephoto->config->prompts = elm_check_state_get(ephoto->config->show_prompts); + ephoto->config->drop = elm_check_state_get(ephoto->config->move_drop); evas_object_del(popup); } - static void _open_hv_select(void *data, Evas_Object *obj, void *event_info) { @@ -113,16 +120,16 @@ _open_hv_select(void *data, Evas_Object *obj, void *event_info) 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); + 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); + elm_object_disabled_set(ephoto->config->open_dir_custom, EINA_TRUE); } void ephoto_config_general(Ephoto *ephoto) { - Evas_Object *popup, *box, *table, *check, *label, *hoversel, *entry, *ic, *button; + Evas_Object *popup, *box, *table, *check, *hoversel, *entry, *ic, *button; popup = elm_popup_add(ephoto->win); elm_popup_scrollable_set(popup, EINA_TRUE); @@ -145,20 +152,41 @@ ephoto_config_general(Ephoto *ephoto) evas_object_size_hint_align_set(check, 0.0, EVAS_HINT_FILL); elm_check_state_set(check, ephoto->config->tool_hide); elm_table_pack(table, check, 0, 1, 1, 1); - evas_object_show(check); + evas_object_show(check); ephoto->config->hide_toolbar = check; + check = elm_check_add(table); + elm_object_text_set(check, _("Prompt Before Changing The Filesystem")); + evas_object_size_hint_align_set(check, 0.0, EVAS_HINT_FILL); + elm_check_state_set(check, ephoto->config->prompts); + elm_table_pack(table, check, 0, 2, 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")); + evas_object_size_hint_align_set(check, 0.0, EVAS_HINT_FILL); + elm_check_state_set(check, ephoto->config->drop); + elm_table_pack(table, check, 0, 3, 1, 1); + evas_object_show(check); + ephoto->config->move_drop = check; + 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_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, _("Directory To Open Ephoto In")); evas_object_data_set(hoversel, "ephoto", ephoto); - evas_object_size_hint_weight_set(hoversel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(hoversel, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(hoversel, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(table, hoversel, 0, 2, 1, 1); + elm_table_pack(table, hoversel, 0, 4, 1, 1); evas_object_show(hoversel); ephoto->config->open_dir = hoversel; @@ -167,10 +195,11 @@ ephoto_config_general(Ephoto *ephoto) 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); + elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(table, entry, 0, 3, 1, 1); + elm_table_pack(table, entry, 0, 5, 1, 1); evas_object_show(entry); ephoto->config->open_dir_custom = entry; @@ -212,10 +241,11 @@ _save(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) Ephoto *ephoto = evas_object_data_get(popup, "ephoto"); if (elm_spinner_value_get(ephoto->config->slide_time) > 0) - ephoto->config->slideshow_timeout = elm_spinner_value_get(ephoto->config->slide_time); + 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)); - + eina_stringshare_replace(&ephoto->config->slideshow_transition, + elm_object_text_get(ephoto->config->slide_trans)); evas_object_del(popup); } @@ -226,7 +256,8 @@ _hv_select(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) } static void -_spinner_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +_spinner_changed(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) { double val; char buf[PATH_MAX]; @@ -262,7 +293,7 @@ ephoto_config_slideshow(Ephoto *ephoto) label = elm_label_add(table); memset(buf, 0, PATH_MAX); - snprintf(buf, PATH_MAX, "%s:", _("Show Each Slide For")); + snprintf(buf, PATH_MAX, "%s:", _("Show Each Slide For")); elm_object_text_set(label, buf); evas_object_size_hint_align_set(label, 0.0, EVAS_HINT_FILL); elm_table_pack(table, label, 0, 1, 1, 1); @@ -283,7 +314,7 @@ ephoto_config_slideshow(Ephoto *ephoto) label = elm_label_add(table); memset(buf, 0, PATH_MAX); - snprintf(buf, PATH_MAX, "%s:", _("Slide Transition")); + snprintf(buf, PATH_MAX, "%s:", _("Slide Transition")); elm_object_text_set(label, buf); evas_object_size_hint_align_set(label, 0.0, EVAS_HINT_FILL); elm_table_pack(table, label, 0, 2, 1, 1); @@ -291,11 +322,13 @@ ephoto_config_slideshow(Ephoto *ephoto) hoversel = elm_hoversel_add(table); elm_hoversel_hover_parent_set(hoversel, ephoto->win); - EINA_LIST_FOREACH(elm_slideshow_transitions_get(ephoto->slideshow), l, transition) - elm_hoversel_item_add(hoversel, transition, NULL, 0, _hv_select, transition); + EINA_LIST_FOREACH(elm_slideshow_transitions_get(ephoto->slideshow), 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); - evas_object_size_hint_weight_set(hoversel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(hoversel, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(hoversel, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_table_pack(table, hoversel, 1, 2, 1, 1); evas_object_show(hoversel); @@ -354,52 +387,54 @@ ephoto_config_about(Ephoto *ephoto) evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); eina_strbuf_append_printf(sbuf, - _("Ephoto is a comprehensive image viewer based on the EFL.
" - "For more information, please visit the Ephoto project 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:
")); + _("Ephoto is a comprehensive image viewer based on the EFL.
" + "For more information, please visit the Ephoto project 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; + char buf[PATH_MAX]; - len = strlen(buf); - if (len > 0) - { - if (buf[len - 1] == '\n') - { - buf[len - 1] = 0; - len--; - } - if (len > 0) - { - char *p; + while (fgets(buf, sizeof(buf), f)) + { + int len; - 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); + 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(label, eina_strbuf_string_get(sbuf)); elm_box_pack_end(box, label); @@ -435,9 +470,9 @@ _ephoto_config_load(Ephoto *ephoto) 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_free(ephoto); + ephoto->config = calloc(1, sizeof(Ephoto_Config)); + return 0; } ephoto->config = eet_data_read(ef, edd, "config"); @@ -445,17 +480,17 @@ _ephoto_config_load(Ephoto *ephoto) if (!ephoto->config || ephoto->config->config_version > CONFIG_VERSION) { - ephoto_config_free(ephoto); - ephoto->config = calloc(1, sizeof(Ephoto_Config)); - return 0; + 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; + ecore_file_unlink(buf); + ephoto_config_free(ephoto); + ephoto->config = calloc(1, sizeof(Ephoto_Config)); + return 0; } return 1; } @@ -471,16 +506,17 @@ _ephoto_on_config_save(void *data) snprintf(buf2, sizeof(buf2), "%s.tmp", buf); ef = eet_open(buf2, EET_FILE_MODE_WRITE); - if (!ef) goto save_end; + if (!ef) + goto save_end; eet_data_write(ef, edd, "config", ephoto->config, 1); - if (eet_close(ef)) goto save_end; + if (eet_close(ef)) + goto save_end; - if (!ecore_file_mv(buf2, buf)) goto save_end; + if (!ecore_file_mv(buf2, buf)) + goto save_end; - INF("Config saved"); - -save_end: + save_end: ecore_file_unlink(buf2); return ECORE_CALLBACK_CANCEL; diff --git a/src/bin/ephoto_cropper.c b/src/bin/ephoto_cropper.c index 4b0b307..cd9351c 100644 --- a/src/bin/ephoto_cropper.c +++ b/src/bin/ephoto_cropper.c @@ -17,42 +17,44 @@ struct _Ephoto_Cropper int starty; int offsetx; int offsety; - int resizing; + int resizing; }; static void -_calculate_cropper_size(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) +_calculate_cropper_size(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Ephoto_Cropper *ec = data; Edje_Message_Int_Set *msg; - char buf[PATH_MAX]; int w, h, cw, ch, iw, ih, nw, nh; double scalew, scaleh; evas_object_geometry_get(ec->layout, 0, 0, &w, &h); edje_object_part_geometry_get(elm_layout_edje_get(ec->layout), - "ephoto.swallow.cropper", 0, 0, &cw, &ch); + "ephoto.swallow.cropper", 0, 0, &cw, &ch); evas_object_image_size_get(elm_image_object_get(ec->image), &iw, &ih); - scalew = (double)cw/(double)w; - scaleh = (double)ch/(double)h; + scalew = (double) cw / (double) w; + scaleh = (double) ch / (double) h; - nw = iw*scalew; - nh = ih*scaleh; + nw = iw * scalew; + nh = ih * scaleh; elm_slider_value_set(ec->cropw, nw); - elm_slider_value_set(ec->croph, nh); + elm_slider_value_set(ec->croph, nh); - msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msg = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msg->count = 3; msg->val[0] = 11; msg->val[1] = nw; msg->val[2] = nh; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msg); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msg); } static void -_cropper_changed_width(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cropper_changed_width(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Cropper *ec = data; Edje_Message_Int_Set *msgl, *msgr; @@ -65,45 +67,48 @@ _cropper_changed_width(void *data, Evas_Object *obj EINA_UNUSED, void *event_inf evas_object_geometry_get(ec->cropper, &cx, 0, &cw, 0); evas_object_image_size_get(elm_image_object_get(ec->image), &iw, 0); - scalew = (double)mw/(double)iw; + scalew = (double) mw / (double) iw; - nw = lw*scalew; - left = (nw-cw)/2; - right = (nw-cw)/2; + nw = lw * scalew; + left = (nw - cw) / 2; + right = (nw - cw) / 2; - if ((cx+cw+right) >= (lx+lw)) + if ((cx + cw + right) >= (lx + lw)) { - right = (lx+lw)-(cx+cw); - left += left - right; + right = (lx + lw) - (cx + cw); + left += left - right; } - else if ((cx-left) <= lx) + else if ((cx - left) <= lx) { - left = cx-lx; - right += right - left; + left = cx - lx; + right += right - left; } left *= -1; - msgl = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msgl = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msgl->count = 3; msgl->val[0] = 8; msgl->val[1] = left; msgl->val[2] = 0; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msgl); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msgl); - msgr = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msgr = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msgr->count = 3; msgr->val[0] = 4; msgr->val[1] = right; msgr->val[2] = 0; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msgr); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msgr); } static void -_cropper_changed_height(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cropper_changed_height(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Cropper *ec = data; Edje_Message_Int_Set *msgt, *msgb; - int mh, ch, cy, nh, lh, ly, ih, left, top, bottom; + int mh, ch, cy, nh, lh, ly, ih, top, bottom; double scaleh; mh = elm_slider_value_get(ec->croph); @@ -112,98 +117,105 @@ _cropper_changed_height(void *data, Evas_Object *obj EINA_UNUSED, void *event_in evas_object_geometry_get(ec->cropper, 0, &cy, 0, &ch); evas_object_image_size_get(elm_image_object_get(ec->image), 0, &ih); - scaleh = (double)mh/(double)ih; - nh = lh*scaleh; - top = (nh-ch)/2; - bottom = (nh-ch)/2; + scaleh = (double) mh / (double) ih; + nh = lh * scaleh; + top = (nh - ch) / 2; + bottom = (nh - ch) / 2; - if ((cy+ch+bottom) >= (ly+lh)) + if ((cy + ch + bottom) >= (ly + lh)) { - bottom = (ly+lh)-(cy+ch); - top += top - bottom; + bottom = (ly + lh) - (cy + ch); + top += top - bottom; } - else if ((cy-top) <= ly) + else if ((cy - top) <= ly) { - top = cy-ly; - bottom += bottom - top; + top = cy - ly; + bottom += bottom - top; } top *= -1; - msgt = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msgt = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msgt->count = 3; msgt->val[0] = 2; msgt->val[1] = 0; msgt->val[2] = top; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msgt); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msgt); - msgb = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msgb = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msgb->count = 3; msgb->val[0] = 6; msgb->val[1] = 0; msgb->val[2] = bottom; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msgb); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msgb); } static void -_reset_crop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_reset_crop(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Cropper *ec = data; Edje_Message_Int_Set *msg; - msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msg = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msg->count = 3; msg->val[0] = 10; msg->val[1] = 0; msg->val[2] = 0; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msg); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msg); } static void -_apply_crop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_apply_crop(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Cropper *ec = data; Evas_Object *edje = elm_layout_edje_get(ec->layout); - const char *path, *key, *type;; int x, y, w, h, cx, cy, cw, ch, iw, ih; int nx, ny, nw, nh, i, j, tmpx, tmpy, ind, index; double scalex, scaley, scalew, scaleh; unsigned int *idata, *idata_new; evas_object_geometry_get(ec->layout, &x, &y, &w, &h); - edje_object_part_geometry_get(edje, "ephoto.swallow.cropper", &cx, &cy, &cw, &ch); + edje_object_part_geometry_get(edje, "ephoto.swallow.cropper", &cx, &cy, &cw, + &ch); evas_object_image_size_get(elm_image_object_get(ec->image), &iw, &ih); - idata = evas_object_image_data_get(elm_image_object_get(ec->image), EINA_FALSE); + idata = + evas_object_image_data_get(elm_image_object_get(ec->image), EINA_FALSE); - scalex = (double)cx/(double)w; - scaley = (double)cy/(double)h; - scalew = (double)cw/(double)w; - scaleh = (double)ch/(double)h; + scalex = (double) cx / (double) w; + scaley = (double) cy / (double) h; + scalew = (double) cw / (double) w; + scaleh = (double) ch / (double) h; - nx = iw*scalex; - ny = ih*scaley; - nw = iw*scalew; - nh = ih*scaleh; + nx = iw * scalex; + ny = ih * scaley; + nw = iw * scalew; + nh = ih * scaleh; index = 0; - idata_new = malloc(sizeof(unsigned int)*nw*nh); + idata_new = malloc(sizeof(unsigned int) * nw * nh); for (i = 0; i < nh; i++) { - tmpy = (i+ny)*iw; - for (j = 0; j < nw; j++) - { - tmpx = j+nx; - ind = tmpy+tmpx; - idata_new[index] = idata[ind]; - index++; - } + tmpy = (i + ny) * iw; + for (j = 0; j < nw; j++) + { + tmpx = j + nx; + ind = tmpy + tmpx; + idata_new[index] = idata[ind]; + index++; + } } elm_table_unpack(ec->image_parent, ec->box); elm_layout_content_unset(ec->layout, "ephoto.swallow.image"); elm_table_pack(ec->image_parent, ec->image, 0, 0, 1, 1); - ephoto_single_browser_image_data_update(ec->main, ec->image, EINA_TRUE, idata_new, nw, nh); + ephoto_single_browser_image_data_update(ec->main, ec->image, EINA_TRUE, + idata_new, nw, nh); evas_object_del(ec->frame); evas_object_del(ec->cropper); evas_object_del(ec->layout); @@ -211,7 +223,8 @@ _apply_crop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUS } static void -_cancel_crop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cancel_crop(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Cropper *ec = data; @@ -226,7 +239,8 @@ _cancel_crop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNU } static void -_cropper_both_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source) +_cropper_both_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source) { Ephoto_Cropper *ec = data; Edje_Message_Int_Set *msg; @@ -237,47 +251,52 @@ _cropper_both_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, const char *e evas_object_geometry_get(ec->layout, &lx, &ly, &lw, &lh); if (mx < lx) - mx = lx; - else if (mx > lx+lw) - mx = lx+lw; + mx = lx; + else if (mx > lx + lw) + mx = lx + lw; if (my < ly) - my = ly; - else if (my > ly+lh) - my = ly+lh; + my = ly; + else if (my > ly + lh) + my = ly + lh; - nx = mx-ec->startx; - ny = my-ec->starty; + nx = mx - ec->startx; + ny = my - ec->starty; ec->startx = mx; ec->starty = my; - msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msg = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msg->count = 3; if (!strcmp(source, "handle1")) - msg->val[0] = 1; + msg->val[0] = 1; else if (!strcmp(source, "handle3")) - msg->val[0] = 3; + msg->val[0] = 3; else if (!strcmp(source, "handle5")) - msg->val[0] = 5; + msg->val[0] = 5; else if (!strcmp(source, "handle7")) - msg->val[0] = 7; + msg->val[0] = 7; msg->val[1] = nx; msg->val[2] = ny; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msg); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msg); } static void -_cropper_both_mouse_up(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source) +_cropper_both_mouse_up(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source) { Ephoto_Cropper *ec = data; - edje_object_signal_callback_del_full(ec->cropper, "mouse,move", source, _cropper_both_mouse_move, ec); - edje_object_signal_callback_del_full(ec->cropper, "mouse,up,1", source, _cropper_both_mouse_up, ec); + edje_object_signal_callback_del_full(ec->cropper, "mouse,move", source, + _cropper_both_mouse_move, ec); + edje_object_signal_callback_del_full(ec->cropper, "mouse,up,1", source, + _cropper_both_mouse_up, ec); ec->resizing = 0; } static void -_cropper_resize_both(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source) +_cropper_resize_both(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source) { Ephoto_Cropper *ec = data; int mx, my, cx, cy; @@ -285,17 +304,20 @@ _cropper_resize_both(void *data, Evas_Object *obj EINA_UNUSED, const char *emiss ec->resizing = 1; evas_pointer_canvas_xy_get(evas_object_evas_get(ec->cropper), &mx, &my); evas_object_geometry_get(ec->cropper, &cx, &cy, 0, 0); - ec->offsetx = mx-cx; - ec->offsety = my-cy; + ec->offsetx = mx - cx; + ec->offsety = my - cy; ec->startx = mx; ec->starty = my; - edje_object_signal_callback_add(ec->cropper, "mouse,move", source, _cropper_both_mouse_move, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,up,1", source, _cropper_both_mouse_up, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,move", source, + _cropper_both_mouse_move, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,up,1", source, + _cropper_both_mouse_up, ec); } static void -_cropper_horiz_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source) +_cropper_horiz_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source) { Ephoto_Cropper *ec = data; Edje_Message_Int_Set *msg; @@ -306,36 +328,41 @@ _cropper_horiz_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, const char * evas_object_geometry_get(ec->layout, &lx, 0, &lw, 0); if (mx < lx) - mx = lx; - else if (mx > lx+lw) - mx = lx+lw; + mx = lx; + else if (mx > lx + lw) + mx = lx + lw; - nx = mx-ec->startx; + nx = mx - ec->startx; ec->startx = mx; - msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msg = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msg->count = 3; if (!strcmp(source, "handle4")) - msg->val[0] = 4; + msg->val[0] = 4; else if (!strcmp(source, "handle8")) - msg->val[0] = 8; + msg->val[0] = 8; msg->val[1] = nx; msg->val[2] = 0; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msg); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msg); } static void -_cropper_horiz_mouse_up(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source) +_cropper_horiz_mouse_up(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source) { Ephoto_Cropper *ec = data; - edje_object_signal_callback_del_full(ec->cropper, "mouse,move", source, _cropper_horiz_mouse_move, ec); - edje_object_signal_callback_del_full(ec->cropper, "mouse,up,1", source, _cropper_horiz_mouse_up, ec); + edje_object_signal_callback_del_full(ec->cropper, "mouse,move", source, + _cropper_horiz_mouse_move, ec); + edje_object_signal_callback_del_full(ec->cropper, "mouse,up,1", source, + _cropper_horiz_mouse_up, ec); ec->resizing = 0; } static void -_cropper_resize_horiz(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) +_cropper_resize_horiz(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Ephoto_Cropper *ec = data; int mx, my, cx, cy; @@ -343,17 +370,20 @@ _cropper_resize_horiz(void *data, Evas_Object *obj EINA_UNUSED, const char *emis ec->resizing = 1; evas_pointer_canvas_xy_get(evas_object_evas_get(ec->cropper), &mx, &my); evas_object_geometry_get(ec->cropper, &cx, &cy, 0, 0); - ec->offsetx = mx-cx; - ec->offsety = my-cy; + ec->offsetx = mx - cx; + ec->offsety = my - cy; ec->startx = mx; ec->starty = my; - edje_object_signal_callback_add(ec->cropper, "mouse,move", source, _cropper_horiz_mouse_move, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,up,1", source, _cropper_horiz_mouse_up, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,move", source, + _cropper_horiz_mouse_move, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,up,1", source, + _cropper_horiz_mouse_up, ec); } static void -_cropper_vert_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source) +_cropper_vert_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source) { Ephoto_Cropper *ec = data; Edje_Message_Int_Set *msg; @@ -364,36 +394,41 @@ _cropper_vert_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, const char *e evas_object_geometry_get(ec->layout, 0, &ly, 0, &lh); if (my < ly) - my = ly; - else if (my > ly+lh) - my = ly+lh; + my = ly; + else if (my > ly + lh) + my = ly + lh; - ny = my-ec->starty; + ny = my - ec->starty; ec->starty = my; - msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msg = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msg->count = 3; if (!strcmp(source, "handle2")) - msg->val[0] = 2; + msg->val[0] = 2; else if (!strcmp(source, "handle6")) - msg->val[0] = 6; + msg->val[0] = 6; msg->val[1] = 0; msg->val[2] = ny; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msg); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msg); } static void -_cropper_vert_mouse_up(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source) +_cropper_vert_mouse_up(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source) { Ephoto_Cropper *ec = data; - edje_object_signal_callback_del_full(ec->cropper, "mouse,move", source, _cropper_vert_mouse_move, ec); - edje_object_signal_callback_del_full(ec->cropper, "mouse,up,1", source, _cropper_vert_mouse_up, ec); + edje_object_signal_callback_del_full(ec->cropper, "mouse,move", source, + _cropper_vert_mouse_move, ec); + edje_object_signal_callback_del_full(ec->cropper, "mouse,up,1", source, + _cropper_vert_mouse_up, ec); ec->resizing = 0; } static void -_cropper_resize_vert(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) +_cropper_resize_vert(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Ephoto_Cropper *ec = data; int mx, my, cx, cy; @@ -401,63 +436,71 @@ _cropper_resize_vert(void *data, Evas_Object *obj EINA_UNUSED, const char *emiss ec->resizing = 1; evas_pointer_canvas_xy_get(evas_object_evas_get(ec->cropper), &mx, &my); evas_object_geometry_get(ec->cropper, &cx, &cy, 0, 0); - ec->offsetx = mx-cx; - ec->offsety = my-cy; + ec->offsetx = mx - cx; + ec->offsety = my - cy; ec->startx = mx; ec->starty = my; - edje_object_signal_callback_add(ec->cropper, "mouse,move", source, _cropper_vert_mouse_move, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,up,1", source, _cropper_vert_mouse_up, ec); - + edje_object_signal_callback_add(ec->cropper, "mouse,move", source, + _cropper_vert_mouse_move, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,up,1", source, + _cropper_vert_mouse_up, ec); } static void -_cropper_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) +_cropper_mouse_move(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Ephoto_Cropper *ec = data; + if (!ec->resizing) { - Edje_Message_Int_Set *msg; - int mx, my, cx, cy, cw, ch, nx, ny, lx, ly, lw, lh; + Edje_Message_Int_Set *msg; + int mx, my, cx, cy, cw, ch, nx, ny, lx, ly, lw, lh; - evas_pointer_canvas_xy_get(evas_object_evas_get(ec->cropper), &mx, &my); - evas_object_geometry_get(ec->cropper, &cx, &cy, &cw, &ch); - evas_object_geometry_get(ec->layout, &lx, &ly, &lw, &lh); + evas_pointer_canvas_xy_get(evas_object_evas_get(ec->cropper), &mx, &my); + evas_object_geometry_get(ec->cropper, &cx, &cy, &cw, &ch); + evas_object_geometry_get(ec->layout, &lx, &ly, &lw, &lh); - if (mx < lx) - mx = lx; - else if (mx > lx+lw) - mx = lx+lw; - if (my < ly) - my = ly; - else if (my > ly+lh) - my = ly+lh; + if (mx < lx) + mx = lx; + else if (mx > lx + lw) + mx = lx + lw; + if (my < ly) + my = ly; + else if (my > ly + lh) + my = ly + lh; - nx = mx-ec->startx; - ny = my-ec->starty; - ec->startx = mx; - ec->starty = my; + nx = mx - ec->startx; + ny = my - ec->starty; + ec->startx = mx; + ec->starty = my; - msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); - msg->count = 3; - msg->val[0] = 0; - msg->val[1] = nx; - msg->val[2] = ny; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msg); + msg = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); + msg->count = 3; + msg->val[0] = 0; + msg->val[1] = nx; + msg->val[2] = ny; + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msg); } } static void -_cropper_mouse_up(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) +_cropper_mouse_up(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Ephoto_Cropper *ec = data; - edje_object_signal_callback_del_full(ec->cropper, "mouse,move", "dragger", _cropper_mouse_move, ec); - edje_object_signal_callback_del_full(ec->cropper, "mouse,up,1", "dragger", _cropper_mouse_up, ec); + edje_object_signal_callback_del_full(ec->cropper, "mouse,move", "dragger", + _cropper_mouse_move, ec); + edje_object_signal_callback_del_full(ec->cropper, "mouse,up,1", "dragger", + _cropper_mouse_up, ec); } static void -_cropper_move(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) +_cropper_move(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Ephoto_Cropper *ec = data; int mx, my, cx, cy; @@ -466,15 +509,18 @@ _cropper_move(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EIN evas_object_geometry_get(ec->cropper, &cx, &cy, 0, 0); ec->startx = mx; ec->starty = my; - ec->offsetx = mx-cx; - ec->offsety = my-cy; + ec->offsetx = mx - cx; + ec->offsety = my - cy; - edje_object_signal_callback_add(ec->cropper, "mouse,move", "dragger", _cropper_mouse_move, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,up,1", "dragger", _cropper_mouse_up, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,move", "dragger", + _cropper_mouse_move, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,up,1", "dragger", + _cropper_mouse_up, ec); } static void -_image_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_image_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Cropper *ec = data; Edje_Message_Int_Set *msg; @@ -485,59 +531,66 @@ _image_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, voi evas_object_image_size_get(elm_image_object_get(ec->image), &iw, &ih); int nw, nh; + if (sw > sh) { - nw = sw; - nh = ih*((double)sw/(double)iw); - if (nh > sh) - { - int onw, onh; - onw = nw; - onh = nh; - nh = sh; - nw = onw*((double)nh/(double)onh); - } + nw = sw; + nh = ih * ((double) sw / (double) iw); + if (nh > sh) + { + int onw, onh; + + onw = nw; + onh = nh; + nh = sh; + nw = onw * ((double) nh / (double) onh); + } } else { - nh = sh; - nw = iw*((double)sh/(double)ih); - if (nw > sw) - { - int onw, onh; - onw = nw; - onh = nh; - nw = sw; - nh = onh*((double)nw/(double)onw); - } + nh = sh; + nw = iw * ((double) sh / (double) ih); + if (nw > sw) + { + int onw, onh; + + onw = nw; + onh = nh; + nw = sw; + nh = onh * ((double) nw / (double) onw); + } } - diffw = sw-nw; - diffh = sh-nh; + diffw = sw - nw; + diffh = sh - nh; diffw /= 2; diffh /= 2; - ix = sx+diffw; - iy = sy+diffh; + ix = sx + diffw; + iy = sy + diffh; evas_object_resize(ec->layout, nw, nh); evas_object_move(ec->layout, ix, iy); - msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int))); + msg = alloca(sizeof(Edje_Message_Int_Set) + (3 * sizeof(int))); msg->count = 3; msg->val[0] = 9; msg->val[1] = 0; msg->val[2] = 0; - edje_object_message_send(elm_layout_edje_get(ec->layout), EDJE_MESSAGE_INT_SET, 1, msg); + edje_object_message_send(elm_layout_edje_get(ec->layout), + EDJE_MESSAGE_INT_SET, 1, msg); } static void -_cropper_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cropper_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Cropper *ec = data; + free(ec); } void -ephoto_cropper_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image_parent, Evas_Object *image) +ephoto_cropper_add(Evas_Object *main, Evas_Object *parent, + Evas_Object *image_parent, Evas_Object *image) { Evas_Object *vbox, *ic, *button; Ephoto_Cropper *ec; @@ -559,40 +612,57 @@ ephoto_cropper_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image_pa ec->box = elm_box_add(image_parent); elm_box_homogeneous_set(ec->box, EINA_TRUE); elm_box_horizontal_set(ec->box, EINA_TRUE); - evas_object_size_hint_weight_set(ec->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(ec->box, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(ec->box, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_table_pack(image_parent, ec->box, 0, 0, 1, 1); evas_object_show(ec->box); ec->layout = elm_layout_add(ec->box); - elm_layout_file_set(ec->layout, PACKAGE_DATA_DIR "/themes/crop.edj", "ephoto,image,cropper,base"); - evas_object_size_hint_weight_set(ec->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_layout_file_set(ec->layout, PACKAGE_DATA_DIR "/themes/crop.edj", + "ephoto,image,cropper,base"); + evas_object_size_hint_weight_set(ec->layout, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(ec->layout, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(ec->box, ec->layout); evas_object_show(ec->layout); - evas_object_size_hint_weight_set(ec->image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(ec->image, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(ec->image, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_layout_content_set(ec->layout, "ephoto.swallow.image", ec->image); - evas_object_show(ec->image); + evas_object_show(ec->image); ec->cropper = edje_object_add(evas_object_evas_get(ec->layout)); - edje_object_file_set(ec->cropper, PACKAGE_DATA_DIR "/themes/crop.edj", "ephoto,image,cropper"); - edje_object_signal_callback_add(elm_layout_edje_get(ec->layout), "cropper,changed", "ephoto.swallow.cropper", _calculate_cropper_size, ec); + edje_object_file_set(ec->cropper, PACKAGE_DATA_DIR "/themes/crop.edj", + "ephoto,image,cropper"); + edje_object_signal_callback_add(elm_layout_edje_get(ec->layout), + "cropper,changed", "ephoto.swallow.cropper", _calculate_cropper_size, + ec); elm_layout_content_set(ec->layout, "ephoto.swallow.cropper", ec->cropper); evas_object_show(ec->cropper); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "dragger", _cropper_move, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle1", _cropper_resize_both, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle2", _cropper_resize_vert, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle3", _cropper_resize_both, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle4", _cropper_resize_horiz, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle5", _cropper_resize_both, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle6", _cropper_resize_vert, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle7", _cropper_resize_both, ec); - edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle8", _cropper_resize_horiz, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "dragger", + _cropper_move, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle1", + _cropper_resize_both, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle2", + _cropper_resize_vert, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle3", + _cropper_resize_both, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle4", + _cropper_resize_horiz, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle5", + _cropper_resize_both, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle6", + _cropper_resize_vert, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle7", + _cropper_resize_both, ec); + edje_object_signal_callback_add(ec->cropper, "mouse,down,1", "handle8", + _cropper_resize_horiz, ec); - evas_object_event_callback_add(ec->layout, EVAS_CALLBACK_RESIZE, _image_resize, ec); + evas_object_event_callback_add(ec->layout, EVAS_CALLBACK_RESIZE, + _image_resize, ec); evas_object_event_callback_add(ec->box, EVAS_CALLBACK_DEL, _cropper_del, ec); ec->frame = elm_frame_add(parent); @@ -615,10 +685,12 @@ ephoto_cropper_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image_pa elm_slider_step_set(ec->cropw, 1); elm_slider_unit_format_set(ec->cropw, "%1.0f"); elm_object_text_set(ec->cropw, _("Width")); - evas_object_size_hint_weight_set(ec->cropw, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ec->cropw, EVAS_HINT_EXPAND, + EVAS_HINT_FILL); evas_object_size_hint_align_set(ec->cropw, EVAS_HINT_FILL, 0.5); elm_box_pack_end(vbox, ec->cropw); - evas_object_smart_callback_add(ec->cropw, "slider,drag,stop", _cropper_changed_width, ec); + evas_object_smart_callback_add(ec->cropw, "slider,drag,stop", + _cropper_changed_width, ec); evas_object_show(ec->cropw); ec->croph = elm_slider_add(vbox); @@ -626,10 +698,12 @@ ephoto_cropper_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image_pa elm_slider_step_set(ec->croph, 1); elm_slider_unit_format_set(ec->croph, "%1.0f"); elm_object_text_set(ec->croph, _("Height")); - evas_object_size_hint_weight_set(ec->croph, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ec->croph, EVAS_HINT_EXPAND, + EVAS_HINT_FILL); evas_object_size_hint_align_set(ec->croph, EVAS_HINT_FILL, 0.5); elm_box_pack_end(vbox, ec->croph); - evas_object_smart_callback_add(ec->croph, "slider,drag,stop", _cropper_changed_height, ec); + evas_object_smart_callback_add(ec->croph, "slider,drag,stop", + _cropper_changed_height, ec); evas_object_show(ec->croph); ic = elm_icon_add(vbox); @@ -676,6 +750,6 @@ ephoto_cropper_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image_pa return; - error: - return; + error: + return; } diff --git a/src/bin/ephoto_filters.c b/src/bin/ephoto_filters.c index 0e19bf4..0b99ba2 100644 --- a/src/bin/ephoto_filters.c +++ b/src/bin/ephoto_filters.c @@ -4,30 +4,30 @@ static int _normalize_color(int color) { if (color < 0) - return 0; + return 0; else if (color > 255) - return 255; + return 255; else - return color; + return color; } static int _mul_color_alpha(int color, int alpha) { if (alpha > 0 && alpha < 255) - return (color * (255 / alpha)); + return color * (255 / alpha); else - return color; + return color; } static int _demul_color_alpha(int color, int alpha) { if (alpha > 0 && alpha < 255) - return ((color * alpha) / 255); + return (color * alpha) / 255; else - return color; -} + return color; +} void ephoto_filter_blur(Evas_Object *main, Evas_Object *image) @@ -38,7 +38,8 @@ ephoto_filter_blur(Evas_Object *main, Evas_Object *image) int a, r, g, b; int *as, *rs, *gs, *bs; - im_data = evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); + im_data = + evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); evas_object_image_size_get(elm_image_object_get(image), &w, &h); im_data_new = malloc(sizeof(unsigned int) * w * h); @@ -49,135 +50,133 @@ ephoto_filter_blur(Evas_Object *main, Evas_Object *image) for (y = 0; y < h; y++) { - my = y - rad; - mh = (rad << 1) + 1; - if (my < 0) - { - mh += my; - my = 0; - } - if ((my + mh) > h) - { - mh = h - my; - } - p1 = im_data_new + (y * w); - memset(as, 0, w * sizeof(int)); - memset(rs, 0, w * sizeof(int)); - memset(gs, 0, w * sizeof(int)); - memset(bs, 0, w * sizeof(int)); + my = y - rad; + mh = (rad << 1) + 1; + if (my < 0) + { + mh += my; + my = 0; + } + if ((my + mh) > h) + { + mh = h - my; + } + p1 = im_data_new + (y * w); + memset(as, 0, w * sizeof(int)); + memset(rs, 0, w * sizeof(int)); + memset(gs, 0, w * sizeof(int)); + memset(bs, 0, w * sizeof(int)); - for (yy = 0; yy < mh; yy++) - { - p2 = im_data + ((yy + my) * w); - for (x = 0; x < w; x++) - { - as[x] += (*p2 >> 24) & 0xff; - rs[x] += (*p2 >> 16) & 0xff; - gs[x] += (*p2 >> 8) & 0xff; - bs[x] += *p2 & 0xff; - p2++; - } - } - if (w > ((rad << 1) + 1)) - { - for (x = 0; x < w; x++) - { - a = 0; - r = 0; - g = 0; - b = 0; - mx = x - rad; - mw = (rad << 1) + 1; - if (mx < 0) - { - mw += mx; - mx = 0; - } - if ((mx + mw) > w) - { - mw = w - mx; - } - mt = mw * mh; - for (xx = mx; xx < (mw + mx); xx++) - { - a += as[xx]; - r += rs[xx]; - g += gs[xx]; - b += bs[xx]; - } - a = a / mt; - r = r / mt; - g = g / mt; - b = b / mt; - *p1 = (a << 24) | (r << 16) | (g << 8) | b; - p1 ++; - } - } + for (yy = 0; yy < mh; yy++) + { + p2 = im_data + ((yy + my) * w); + for (x = 0; x < w; x++) + { + as[x] += (*p2 >> 24) & 0xff; + rs[x] += (*p2 >> 16) & 0xff; + gs[x] += (*p2 >> 8) & 0xff; + bs[x] += *p2 & 0xff; + p2++; + } + } + if (w > ((rad << 1) + 1)) + { + for (x = 0; x < w; x++) + { + a = 0; + r = 0; + g = 0; + b = 0; + mx = x - rad; + mw = (rad << 1) + 1; + if (mx < 0) + { + mw += mx; + mx = 0; + } + if ((mx + mw) > w) + { + mw = w - mx; + } + mt = mw * mh; + for (xx = mx; xx < (mw + mx); xx++) + { + a += as[xx]; + r += rs[xx]; + g += gs[xx]; + b += bs[xx]; + } + a = a / mt; + r = r / mt; + g = g / mt; + b = b / mt; + *p1 = (a << 24) | (r << 16) | (g << 8) | b; + p1++; + } + } } free(as); free(rs); free(gs); free(bs); - - ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, w, h); + + ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, + w, h); } void -ephoto_filter_sharpen(Evas_Object *main, Evas_Object *image) +ephoto_filter_sharpen(Evas_Object *main, Evas_Object *image) { unsigned int *im_data, *im_data_new, *p1, *p2; int a, r, g, b, x, y, w, h; - int mul, mul2, tot; - int rad = 3; - im_data = evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); + im_data = + evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); evas_object_image_size_get(elm_image_object_get(image), &w, &h); im_data_new = malloc(sizeof(unsigned int) * w * h); - mul = (rad * 4) + 1; - mul2 = rad; - tot = mul - (mul2 * 4); - for (y = 1; y < (h - 1); y ++) + for (y = 1; y < (h - 1); y++) { - p1 = im_data + 1 + (y * w); - p2 = im_data_new + 1 + (y * w); - for (x = 1; x < (w - 1); x++) - { - b = (int)((p1[0]) & 0xff) * 5; - g = (int)((p1[0] >> 8) & 0xff) * 5; - r = (int)((p1[0] >> 16) & 0xff) * 5; - a = (int)((p1[0] >> 24) & 0xff) * 5; - b -= (int)((p1[-1]) & 0xff); - g -= (int)((p1[-1] >> 8) & 0xff); - r -= (int)((p1[-1] >> 16) & 0xff); - a -= (int)((p1[-1] >> 24) & 0xff); - b -= (int)((p1[1]) & 0xff); - g -= (int)((p1[1] >> 8) & 0xff); - r -= (int)((p1[1] >> 16) & 0xff); - a -= (int)((p1[1] >> 24) & 0xff); - b -= (int)((p1[-w]) & 0xff); - g -= (int)((p1[-w] >> 8) & 0xff); - r -= (int)((p1[-w] >> 16) & 0xff); - a -= (int)((p1[-w] >> 24) & 0xff); - b -= (int)((p1[-w]) & 0xff); - g -= (int)((p1[-w] >> 8) & 0xff); - r -= (int)((p1[-w] >> 16) & 0xff); - a -= (int)((p1[-w] >> 24) & 0xff); - a = (a & ((~a) >> 16)); - a = ((a | ((a & 256) - ((a & 256) >> 8)))); - r = (r & ((~r) >> 16)); - r = ((r | ((r & 256) - ((r & 256) >> 8)))); - g = (g & ((~g) >> 16)); - g = ((g | ((g & 256) - ((g & 256) >> 8)))); - b = (b & ((~b) >> 16)); - b = ((b | ((b & 256) - ((b & 256) >> 8)))); - *p2 = (a << 24) | (r << 16) | (g << 8) | b; - p2++; - p1++; - } + p1 = im_data + 1 + (y * w); + p2 = im_data_new + 1 + (y * w); + for (x = 1; x < (w - 1); x++) + { + b = (int) ((p1[0]) & 0xff) * 5; + g = (int) ((p1[0] >> 8) & 0xff) * 5; + r = (int) ((p1[0] >> 16) & 0xff) * 5; + a = (int) ((p1[0] >> 24) & 0xff) * 5; + b -= (int) ((p1[-1]) & 0xff); + g -= (int) ((p1[-1] >> 8) & 0xff); + r -= (int) ((p1[-1] >> 16) & 0xff); + a -= (int) ((p1[-1] >> 24) & 0xff); + b -= (int) ((p1[1]) & 0xff); + g -= (int) ((p1[1] >> 8) & 0xff); + r -= (int) ((p1[1] >> 16) & 0xff); + a -= (int) ((p1[1] >> 24) & 0xff); + b -= (int) ((p1[-w]) & 0xff); + g -= (int) ((p1[-w] >> 8) & 0xff); + r -= (int) ((p1[-w] >> 16) & 0xff); + a -= (int) ((p1[-w] >> 24) & 0xff); + b -= (int) ((p1[-w]) & 0xff); + g -= (int) ((p1[-w] >> 8) & 0xff); + r -= (int) ((p1[-w] >> 16) & 0xff); + a -= (int) ((p1[-w] >> 24) & 0xff); + a = (a & ((~a) >> 16)); + a = ((a | ((a & 256) - ((a & 256) >> 8)))); + r = (r & ((~r) >> 16)); + r = ((r | ((r & 256) - ((r & 256) >> 8)))); + g = (g & ((~g) >> 16)); + g = ((g | ((g & 256) - ((g & 256) >> 8)))); + b = (b & ((~b) >> 16)); + b = ((b | ((b & 256) - ((b & 256) >> 8)))); + *p2 = (a << 24) | (r << 16) | (g << 8) | b; + p2++; + p1++; + } } - ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, w, h); + ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, + w, h); } void @@ -186,26 +185,28 @@ ephoto_filter_black_and_white(Evas_Object *main, Evas_Object *image) unsigned int *im_data, *im_data_new; int gray, i, r, g, b, a, w, h; - im_data = evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); + im_data = + evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); evas_object_image_size_get(elm_image_object_get(image), &w, &h); im_data_new = malloc(sizeof(unsigned int) * w * h); for (i = 0; i < (w * h); i++) { - b = (int)((im_data[i]) & 0xff); - g = (int)((im_data[i] >> 8) & 0xff); - r = (int)((im_data[i] >> 16) & 0xff); - a = (int)((im_data[i] >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - gray = (int)((0.3 * r) + (0.59 * g) + (0.11 * b)); - if (a >= 0 && a < 255) - gray = (gray * a) / 255; - im_data_new[i] = (a << 24) | (gray << 16) | (gray << 8) | gray; + b = (int) ((im_data[i]) & 0xff); + g = (int) ((im_data[i] >> 8) & 0xff); + r = (int) ((im_data[i] >> 16) & 0xff); + a = (int) ((im_data[i] >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + gray = (int) ((0.3 * r) + (0.59 * g) + (0.11 * b)); + if (a >= 0 && a < 255) + gray = (gray * a) / 255; + im_data_new[i] = (a << 24) | (gray << 16) | (gray << 8) | gray; } - ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, w, h); + ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, + w, h); } void @@ -214,30 +215,32 @@ ephoto_filter_old_photo(Evas_Object *main, Evas_Object *image) unsigned int *im_data, *im_data_new; int i, r, rr, g, gg, b, bb, a, w, h; - im_data = evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); + im_data = + evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); evas_object_image_size_get(elm_image_object_get(image), &w, &h); im_data_new = malloc(sizeof(unsigned int) * w * h); for (i = 0; i < (w * h); i++) { - b = (int)((im_data[i]) & 0xff); - g = (int)((im_data[i] >> 8) & 0xff); - r = (int)((im_data[i] >> 16) & 0xff); - a = (int)((im_data[i] >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - rr = (int)((r* .393) + (g*.769) + (b*.189)); - rr = _normalize_color(rr); - gg = (int)((r* .349) + (g*.686) + (b*.168)); - gg = _normalize_color(gg); - bb = (int)((r* .272) + (g*.534) + (b*.131)); - bb = _normalize_color(bb); - bb = _demul_color_alpha(bb, a); - gg = _demul_color_alpha(gg, a); - rr = _demul_color_alpha(rr, a); - im_data_new[i] = (a << 24) | (rr << 16) | (gg << 8) | bb; + b = (int) ((im_data[i]) & 0xff); + g = (int) ((im_data[i] >> 8) & 0xff); + r = (int) ((im_data[i] >> 16) & 0xff); + a = (int) ((im_data[i] >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + rr = (int) ((r * .393) + (g * .769) + (b * .189)); + rr = _normalize_color(rr); + gg = (int) ((r * .349) + (g * .686) + (b * .168)); + gg = _normalize_color(gg); + bb = (int) ((r * .272) + (g * .534) + (b * .131)); + bb = _normalize_color(bb); + bb = _demul_color_alpha(bb, a); + gg = _demul_color_alpha(gg, a); + rr = _demul_color_alpha(rr, a); + im_data_new[i] = (a << 24) | (rr << 16) | (gg << 8) | bb; } - ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, w, h); + ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, + w, h); } void @@ -248,64 +251,65 @@ ephoto_filter_histogram_eq(Evas_Object *main, Evas_Object *image) int a, r, g, b, bb, gg, rr, norm, total; float hh, s, v, nv, sum; - im_data = evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); + im_data = + evas_object_image_data_get(elm_image_object_get(image), EINA_FALSE); evas_object_image_size_get(elm_image_object_get(image), &w, &h); im_data_new = malloc(sizeof(unsigned int) * w * h); total = w * h; for (i = 0; i < 256; i++) - hist[i] = 0; + hist[i] = 0; for (y = 0; y < h; y++) { - p1 = im_data + (y * w); - for (x = 0; x < w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); - norm = (int)round((double)v * (double)255); - hist[norm] += 1; - p1++; - } + p1 = im_data + (y * w); + for (x = 0; x < w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); + norm = (int) round((double) v * (double) 255); + hist[norm] += 1; + p1++; + } } sum = 0; for (i = 0; i < 256; i++) { - sum += ((double)hist[i] / (double)total); - cdf[i] = (int)round(sum * 255); + sum += ((double) hist[i] / (double) total); + cdf[i] = (int) round(sum * 255); } for (y = 0; y < h; y++) { - p1 = im_data + (y * w); - p2 = im_data_new + (y * w); - for (x = 0; x < w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); - norm = (int)round((double)v * (double)255); - nv = (float)cdf[norm] / (float)255; - evas_color_hsv_to_rgb(hh, s, nv, &rr, &gg, &bb); - bb = _normalize_color(bb); - gg = _normalize_color(gg); - rr = _normalize_color(rr); - bb = _demul_color_alpha(bb, a); - gg = _demul_color_alpha(gg, a); - rr = _demul_color_alpha(rr, a); - *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; - p2++; - p1++; - } + p1 = im_data + (y * w); + p2 = im_data_new + (y * w); + for (x = 0; x < w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); + norm = (int) round((double) v * (double) 255); + nv = (float) cdf[norm] / (float) 255; + evas_color_hsv_to_rgb(hh, s, nv, &rr, &gg, &bb); + bb = _normalize_color(bb); + gg = _normalize_color(gg); + rr = _normalize_color(rr); + bb = _demul_color_alpha(bb, a); + gg = _demul_color_alpha(gg, a); + rr = _demul_color_alpha(rr, a); + *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; + p2++; + p1++; + } } - ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, w, h); + ephoto_single_browser_image_data_update(main, image, EINA_TRUE, im_data_new, + w, h); } - diff --git a/src/bin/ephoto_hsv.c b/src/bin/ephoto_hsv.c index 12df48a..fcdcc5b 100644 --- a/src/bin/ephoto_hsv.c +++ b/src/bin/ephoto_hsv.c @@ -21,186 +21,194 @@ static int _normalize_color(int color) { if (color < 0) - return 0; + return 0; else if (color > 255) - return 255; + return 255; else - return color; + return color; } static int _mul_color_alpha(int color, int alpha) { if (alpha > 0 && alpha < 255) - return (color * (255 / alpha)); + return color * (255 / alpha); else - return color; + return color; } static int _demul_color_alpha(int color, int alpha) { if (alpha > 0 && alpha < 255) - return ((color * alpha) / 255); + return (color * alpha) / 255; else - return color; + return color; } unsigned int * _ephoto_hsv_adjust_hue(Ephoto_HSV *ehsv, double hue, unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h; + int x, y; int a, r, g, b, bb, gg, rr; float hh, s, v; im_data = malloc(sizeof(unsigned int) * ehsv->w * ehsv->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * ehsv->w * ehsv->h); + memcpy(im_data, image_data, sizeof(unsigned int) * ehsv->w * ehsv->h); else - memcpy(im_data, ehsv->original_im_data, sizeof(unsigned int) * ehsv->w * ehsv->h); + memcpy(im_data, ehsv->original_im_data, + sizeof(unsigned int) * ehsv->w * ehsv->h); im_data_new = malloc(sizeof(unsigned int) * ehsv->w * ehsv->h); for (y = 0; y < ehsv->h; y++) { - p1 = im_data + (y * ehsv->w); - p2 = im_data_new + (y * ehsv->w); - for (x = 0; x < ehsv->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); - hh += hue; - if (hh < 0) - hh += 360; - if (hh > 360) - hh -= 360; - evas_color_hsv_to_rgb(hh, s, v, &rr, &gg, &bb); - bb = _normalize_color(bb); - gg = _normalize_color(gg); - rr = _normalize_color(rr); - bb = _demul_color_alpha(bb, a); - gg = _demul_color_alpha(gg, a); - rr = _demul_color_alpha(rr, a); - *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; - p2++; - p1++; - } + p1 = im_data + (y * ehsv->w); + p2 = im_data_new + (y * ehsv->w); + for (x = 0; x < ehsv->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); + hh += hue; + if (hh < 0) + hh += 360; + if (hh > 360) + hh -= 360; + evas_color_hsv_to_rgb(hh, s, v, &rr, &gg, &bb); + bb = _normalize_color(bb); + gg = _normalize_color(gg); + rr = _normalize_color(rr); + bb = _demul_color_alpha(bb, a); + gg = _demul_color_alpha(gg, a); + rr = _demul_color_alpha(rr, a); + *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; + p2++; + p1++; + } } ehsv->hue = hue; - ephoto_single_browser_image_data_update(ehsv->main, ehsv->image, EINA_FALSE, im_data_new, ehsv->w, ehsv->h); + ephoto_single_browser_image_data_update(ehsv->main, ehsv->image, EINA_FALSE, + im_data_new, ehsv->w, ehsv->h); free(im_data); return im_data_new; } unsigned int * -_ephoto_hsv_adjust_saturation(Ephoto_HSV *ehsv, double saturation, unsigned int *image_data) +_ephoto_hsv_adjust_saturation(Ephoto_HSV *ehsv, double saturation, + unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h; + int x, y; int a, r, g, b, bb, gg, rr; float hh, s, v; - + im_data = malloc(sizeof(unsigned int) * ehsv->w * ehsv->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * ehsv->w * ehsv->h); + memcpy(im_data, image_data, sizeof(unsigned int) * ehsv->w * ehsv->h); else - memcpy(im_data, ehsv->original_im_data, sizeof(unsigned int) * ehsv->w * ehsv->h); + memcpy(im_data, ehsv->original_im_data, + sizeof(unsigned int) * ehsv->w * ehsv->h); im_data_new = malloc(sizeof(unsigned int) * ehsv->w * ehsv->h); for (y = 0; y < ehsv->h; y++) { - p1 = im_data + (y * ehsv->w); - p2 = im_data_new + (y * ehsv->w); - for (x = 0; x < ehsv->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); - s += s*((float)saturation / 100); - if (s < 0) - s = 0; - if (s > 1) - s = 1; - evas_color_hsv_to_rgb(hh, s, v, &rr, &gg, &bb); - bb = _normalize_color(bb); - gg = _normalize_color(gg); - rr = _normalize_color(rr); - bb = _demul_color_alpha(bb, a); - gg = _demul_color_alpha(gg, a); - rr = _demul_color_alpha(rr, a); - *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; - p2++; - p1++; - } + p1 = im_data + (y * ehsv->w); + p2 = im_data_new + (y * ehsv->w); + for (x = 0; x < ehsv->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); + s += s * ((float) saturation / 100); + if (s < 0) + s = 0; + if (s > 1) + s = 1; + evas_color_hsv_to_rgb(hh, s, v, &rr, &gg, &bb); + bb = _normalize_color(bb); + gg = _normalize_color(gg); + rr = _normalize_color(rr); + bb = _demul_color_alpha(bb, a); + gg = _demul_color_alpha(gg, a); + rr = _demul_color_alpha(rr, a); + *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; + p2++; + p1++; + } } ehsv->saturation = saturation; - ephoto_single_browser_image_data_update(ehsv->main, ehsv->image, EINA_FALSE, im_data_new, ehsv->w, ehsv->h); + ephoto_single_browser_image_data_update(ehsv->main, ehsv->image, EINA_FALSE, + im_data_new, ehsv->w, ehsv->h); free(im_data); return im_data_new; } unsigned int * -_ephoto_hsv_adjust_value(Ephoto_HSV *ehsv, double value, unsigned int *image_data) +_ephoto_hsv_adjust_value(Ephoto_HSV *ehsv, double value, + unsigned int *image_data) { unsigned int *im_data, *im_data_new, *p1, *p2; - int x, y, w, h; + int x, y; int a, r, g, b, bb, gg, rr; float hh, s, v; im_data = malloc(sizeof(unsigned int) * ehsv->w * ehsv->h); if (image_data) - memcpy(im_data, image_data, sizeof(unsigned int) * ehsv->w * ehsv->h); + memcpy(im_data, image_data, sizeof(unsigned int) * ehsv->w * ehsv->h); else - memcpy(im_data, ehsv->original_im_data, sizeof(unsigned int) * ehsv->w * ehsv->h); + memcpy(im_data, ehsv->original_im_data, + sizeof(unsigned int) * ehsv->w * ehsv->h); im_data_new = malloc(sizeof(unsigned int) * ehsv->w * ehsv->h); for (y = 0; y < ehsv->h; y++) { - p1 = im_data + (y * ehsv->w); - p2 = im_data_new + (y * ehsv->w); - for (x = 0; x < ehsv->w; x++) - { - b = (int)((*p1) & 0xff); - g = (int)((*p1 >> 8) & 0xff); - r = (int)((*p1 >> 16) & 0xff); - a = (int)((*p1 >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); - v += (v*((float)value/100)); - if (v < 0) - v = 0; - if (v > 1) - v = 1; - evas_color_hsv_to_rgb(hh, s, v, &rr, &gg, &bb); - bb = _normalize_color(bb); - gg = _normalize_color(gg); - rr = _normalize_color(rr); - bb = _demul_color_alpha(bb, a); - gg = _demul_color_alpha(gg, a); - rr = _demul_color_alpha(rr, a); - *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; - p2++; - p1++; - } + p1 = im_data + (y * ehsv->w); + p2 = im_data_new + (y * ehsv->w); + for (x = 0; x < ehsv->w; x++) + { + b = (int) ((*p1) & 0xff); + g = (int) ((*p1 >> 8) & 0xff); + r = (int) ((*p1 >> 16) & 0xff); + a = (int) ((*p1 >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + evas_color_rgb_to_hsv(r, g, b, &hh, &s, &v); + v += (v * ((float) value / 100)); + if (v < 0) + v = 0; + if (v > 1) + v = 1; + evas_color_hsv_to_rgb(hh, s, v, &rr, &gg, &bb); + bb = _normalize_color(bb); + gg = _normalize_color(gg); + rr = _normalize_color(rr); + bb = _demul_color_alpha(bb, a); + gg = _demul_color_alpha(gg, a); + rr = _demul_color_alpha(rr, a); + *p2 = (a << 24) | (rr << 16) | (gg << 8) | bb; + p2++; + p1++; + } } ehsv->value = value; - ephoto_single_browser_image_data_update(ehsv->main, ehsv->image, EINA_FALSE, im_data_new, ehsv->w, ehsv->h); + ephoto_single_browser_image_data_update(ehsv->main, ehsv->image, EINA_FALSE, + im_data_new, ehsv->w, ehsv->h); free(im_data); return im_data_new; } @@ -210,43 +218,46 @@ _hue_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Ephoto_HSV *ehsv = data; double hue; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; hue = elm_slider_value_get(obj); image_data = _ephoto_hsv_adjust_hue(ehsv, hue, NULL); - image_data_two = _ephoto_hsv_adjust_saturation(ehsv, ehsv->saturation, image_data); - image_data_three = _ephoto_hsv_adjust_value(ehsv, ehsv->value, image_data_two); + image_data_two = + _ephoto_hsv_adjust_saturation(ehsv, ehsv->saturation, image_data); + _ephoto_hsv_adjust_value(ehsv, ehsv->value, image_data_two); } - static void -_saturation_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_saturation_slider_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) { Ephoto_HSV *ehsv = data; double saturation; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; saturation = elm_slider_value_get(obj); image_data = _ephoto_hsv_adjust_saturation(ehsv, saturation, NULL); image_data_two = _ephoto_hsv_adjust_hue(ehsv, ehsv->hue, image_data); - image_data_three = _ephoto_hsv_adjust_value(ehsv, ehsv->value, image_data_two); + _ephoto_hsv_adjust_value(ehsv, ehsv->value, image_data_two); } static void -_value_slider_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_value_slider_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) { Ephoto_HSV *ehsv = data; double value; - unsigned int *image_data, *image_data_two, *image_data_three; + unsigned int *image_data, *image_data_two; value = elm_slider_value_get(obj); image_data = _ephoto_hsv_adjust_value(ehsv, value, NULL); image_data_two = _ephoto_hsv_adjust_hue(ehsv, ehsv->hue, image_data); - image_data_three = _ephoto_hsv_adjust_saturation(ehsv, ehsv->saturation, image_data_two); + _ephoto_hsv_adjust_saturation(ehsv, ehsv->saturation, image_data_two); } static void -_hsv_reset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_hsv_reset(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_HSV *ehsv = data; @@ -260,20 +271,25 @@ _hsv_reset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSE } static void -_hsv_apply(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_hsv_apply(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_HSV *ehsv = data; unsigned int *image_data; int w, h; - image_data = evas_object_image_data_get(elm_image_object_get(ehsv->image), EINA_FALSE); + image_data = + evas_object_image_data_get(elm_image_object_get(ehsv->image), + EINA_FALSE); evas_object_image_size_get(elm_image_object_get(ehsv->image), &w, &h); - ephoto_single_browser_image_data_update(ehsv->main, ehsv->image, EINA_TRUE, image_data, w, h); + ephoto_single_browser_image_data_update(ehsv->main, ehsv->image, EINA_TRUE, + image_data, w, h); evas_object_del(ehsv->frame); } static void -_hsv_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_hsv_cancel(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_HSV *ehsv = data; @@ -289,16 +305,19 @@ _hsv_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUS } static void -_frame_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_frame_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_HSV *ehsv = data; + free(ehsv->original_im_data); free(ehsv); } -void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) +void +ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) { - Evas_Object *win, *box, *slider, *ic, *button; + Evas_Object *box, *slider, *ic, *button; Ephoto_HSV *ehsv; unsigned int *im_data; @@ -313,10 +332,14 @@ void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) ehsv->main = main; ehsv->parent = parent; ehsv->image = image; - im_data = evas_object_image_data_get(elm_image_object_get(ehsv->image), EINA_FALSE); - evas_object_image_size_get(elm_image_object_get(ehsv->image), &ehsv->w, &ehsv->h); + im_data = + evas_object_image_data_get(elm_image_object_get(ehsv->image), + EINA_FALSE); + evas_object_image_size_get(elm_image_object_get(ehsv->image), &ehsv->w, + &ehsv->h); ehsv->original_im_data = malloc(sizeof(unsigned int) * ehsv->w * ehsv->h); - memcpy(ehsv->original_im_data, im_data, sizeof(unsigned int) * ehsv->w * ehsv->h); + memcpy(ehsv->original_im_data, im_data, + sizeof(unsigned int) * ehsv->w * ehsv->h); ehsv->frame = elm_frame_add(parent); elm_object_text_set(ehsv->frame, _("Hue/Saturation/Value")); @@ -324,7 +347,8 @@ void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) evas_object_size_hint_align_set(ehsv->frame, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(parent, ehsv->frame); evas_object_data_set(ehsv->frame, "ehsv", ehsv); - evas_object_event_callback_add(ehsv->frame, EVAS_CALLBACK_DEL, _frame_del, ehsv); + evas_object_event_callback_add(ehsv->frame, EVAS_CALLBACK_DEL, _frame_del, + ehsv); evas_object_show(ehsv->frame); box = elm_box_add(ehsv->frame); @@ -342,7 +366,8 @@ void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) elm_slider_unit_format_set(slider, "%1.0f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _hue_slider_changed, ehsv); + evas_object_smart_callback_add(slider, "delay,changed", _hue_slider_changed, + ehsv); elm_box_pack_end(box, slider); evas_object_show(slider); ehsv->hslider = slider; @@ -355,7 +380,8 @@ void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) elm_slider_unit_format_set(slider, "%1.2f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _saturation_slider_changed, ehsv); + evas_object_smart_callback_add(slider, "delay,changed", + _saturation_slider_changed, ehsv); elm_box_pack_end(box, slider); evas_object_show(slider); ehsv->sslider = slider; @@ -368,7 +394,8 @@ void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) elm_slider_unit_format_set(slider, "%1.2f"); evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_FILL); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); - evas_object_smart_callback_add(slider, "delay,changed", _value_slider_changed, ehsv); + evas_object_smart_callback_add(slider, "delay,changed", + _value_slider_changed, ehsv); elm_box_pack_end(box, slider); evas_object_show(slider); ehsv->vslider = slider; @@ -417,6 +444,6 @@ void ephoto_hsv_add(Evas_Object *main, Evas_Object *parent, Evas_Object *image) return; - error: - return; + error: + return; } diff --git a/src/bin/ephoto_main.c b/src/bin/ephoto_main.c index 2426fac..665f696 100644 --- a/src/bin/ephoto_main.c +++ b/src/bin/ephoto_main.c @@ -8,10 +8,18 @@ int EPHOTO_EVENT_POPULATE_ERROR = 0; typedef struct _Ephoto_Entry_Free_Listener Ephoto_Entry_Free_Listener; struct _Ephoto_Entry_Free_Listener { - void (*cb)(void *data, const Ephoto_Entry *dead); + void (*cb) (void *data, const Ephoto_Entry *dead); const void *data; }; +typedef struct _Ephoto_Dir_Data Ephoto_Dir_Data; +struct _Ephoto_Dir_Data +{ + Ephoto *ephoto; + Elm_Widget_Item *expanded; + Eina_Bool dirs_only; +}; + static void _ephoto_state_set(Ephoto *ephoto, Ephoto_State state) { @@ -22,8 +30,6 @@ _ephoto_state_set(Ephoto *ephoto, Ephoto_State state) static void _ephoto_thumb_browser_show(Ephoto *ephoto, Ephoto_Entry *entry) { - DBG("entry '%s'", entry ? entry->path : ""); - ephoto_single_browser_entry_set(ephoto->single_browser, NULL); ephoto_slideshow_entry_set(ephoto->slideshow, NULL); elm_naviframe_item_promote(ephoto->tb); @@ -32,13 +38,12 @@ _ephoto_thumb_browser_show(Ephoto *ephoto, Ephoto_Entry *entry) ephoto_title_set(ephoto, ephoto->config->directory); if ((entry) && (entry->item)) - elm_gengrid_item_bring_in(entry->item, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_gengrid_item_bring_in(entry->item, ELM_GENGRID_ITEM_SCROLLTO_IN); } static void _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); @@ -48,7 +53,6 @@ _ephoto_single_browser_show(Ephoto *ephoto, Ephoto_Entry *entry) static void _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); @@ -56,74 +60,92 @@ _ephoto_slideshow_show(Ephoto *ephoto, Ephoto_Entry *entry) } static void -_ephoto_single_browser_back(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +_ephoto_single_browser_back(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) { Ephoto *ephoto = data; Ephoto_Entry *entry = event_info; + _ephoto_thumb_browser_show(ephoto, entry); } static void -_ephoto_slideshow_back(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +_ephoto_slideshow_back(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) { Ephoto *ephoto = data; Ephoto_Entry *entry = event_info; + switch (ephoto->prev_state) { - case EPHOTO_STATE_SINGLE: - _ephoto_single_browser_show(ephoto, entry); - break; - case EPHOTO_STATE_THUMB: - _ephoto_thumb_browser_show(ephoto, entry); - break; - default: - ERR("unhandled previous state %d", ephoto->prev_state); + case EPHOTO_STATE_SINGLE: + _ephoto_single_browser_show(ephoto, entry); + break; + + case EPHOTO_STATE_THUMB: + _ephoto_thumb_browser_show(ephoto, entry); + break; + + default: + _ephoto_thumb_browser_show(ephoto, entry); } } static void -_ephoto_thumb_browser_view(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +_ephoto_thumb_browser_view(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) { Ephoto *ephoto = data; Ephoto_Entry *entry = event_info; + _ephoto_single_browser_show(ephoto, entry); } static void -_ephoto_thumb_browser_changed_directory(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_ephoto_thumb_browser_changed_directory(void *data, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto *ephoto = data; + ephoto_single_browser_entry_set(ephoto->single_browser, NULL); ephoto_slideshow_entry_set(ephoto->slideshow, NULL); } static void -_ephoto_thumb_browser_slideshow(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +_ephoto_thumb_browser_slideshow(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) { Ephoto *ephoto = data; Ephoto_Entry *entry = event_info; + _ephoto_slideshow_show(ephoto, entry); } static void -_ephoto_single_browser_slideshow(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +_ephoto_single_browser_slideshow(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) { Ephoto *ephoto = data; Ephoto_Entry *entry = event_info; + _ephoto_slideshow_show(ephoto, entry); } static void -_win_free(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_win_free(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto *ephoto = data; - if (ephoto->timer.thumb_regen) ecore_timer_del(ephoto->timer.thumb_regen); + + if (ephoto->timer.thumb_regen) + ecore_timer_del(ephoto->timer.thumb_regen); ephoto_config_save(ephoto); free(ephoto); } static void -_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto *ephoto = data; int w, h; @@ -131,8 +153,8 @@ _resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void * evas_object_geometry_get(ephoto->win, 0, 0, &w, &h); if (w && h) { - ephoto->config->window_width = w; - ephoto->config->window_height = h; + ephoto->config->window_width = w; + ephoto->config->window_height = h; } } @@ -141,6 +163,7 @@ ephoto_window_add(const char *path) { Ephoto *ephoto = calloc(1, sizeof(Ephoto)); char buf[PATH_MAX]; + EINA_SAFETY_ON_NULL_RETURN_VAL(ephoto, NULL); EPHOTO_EVENT_ENTRY_CREATE = ecore_event_type_new(); @@ -151,121 +174,121 @@ ephoto_window_add(const char *path) ephoto->win = elm_win_util_standard_add("ephoto", "Ephoto"); if (!ephoto->win) { - free(ephoto); - return NULL; + free(ephoto); + return NULL; } - evas_object_event_callback_add - (ephoto->win, EVAS_CALLBACK_FREE, _win_free, ephoto); - evas_object_event_callback_add - (ephoto->win, EVAS_CALLBACK_RESIZE, _resize_cb, ephoto); - + evas_object_event_callback_add(ephoto->win, EVAS_CALLBACK_FREE, _win_free, + ephoto); + evas_object_event_callback_add(ephoto->win, EVAS_CALLBACK_RESIZE, _resize_cb, + ephoto); elm_win_autodel_set(ephoto->win, EINA_TRUE); if (!ephoto_config_init(ephoto)) { - evas_object_del(ephoto->win); - return NULL; + evas_object_del(ephoto->win); + return NULL; } if ((ephoto->config->thumb_gen_size != 128) && (ephoto->config->thumb_gen_size != 256) && (ephoto->config->thumb_gen_size != 512)) - ephoto_thumb_size_set(ephoto, ephoto->config->thumb_size); + ephoto_thumb_size_set(ephoto, ephoto->config->thumb_size); ephoto->pager = elm_naviframe_add(ephoto->win); elm_naviframe_prev_btn_auto_pushed_set(ephoto->pager, EINA_FALSE); - evas_object_size_hint_weight_set - (ephoto->pager, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_fill_set - (ephoto->pager, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ephoto->pager, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(ephoto->pager, EVAS_HINT_FILL, + EVAS_HINT_FILL); elm_win_resize_object_add(ephoto->win, ephoto->pager); evas_object_show(ephoto->pager); ephoto->thumb_browser = ephoto_thumb_browser_add(ephoto, ephoto->pager); if (!ephoto->thumb_browser) { - ERR("could not add thumb browser"); - evas_object_del(ephoto->win); - return NULL; + evas_object_del(ephoto->win); + return NULL; } - ephoto->tb = elm_naviframe_item_push(ephoto->pager, NULL, NULL, NULL, ephoto->thumb_browser, "overlap"); + ephoto->tb = + elm_naviframe_item_push(ephoto->pager, NULL, NULL, NULL, + ephoto->thumb_browser, "overlap"); elm_naviframe_item_title_enabled_set(ephoto->tb, EINA_FALSE, EINA_FALSE); - evas_object_smart_callback_add - (ephoto->thumb_browser, "view", _ephoto_thumb_browser_view, ephoto); - evas_object_smart_callback_add - (ephoto->thumb_browser, "changed,directory", - _ephoto_thumb_browser_changed_directory, ephoto); - evas_object_smart_callback_add - (ephoto->thumb_browser, "slideshow", - _ephoto_thumb_browser_slideshow, ephoto); + evas_object_smart_callback_add(ephoto->thumb_browser, "view", + _ephoto_thumb_browser_view, ephoto); + evas_object_smart_callback_add(ephoto->thumb_browser, "changed,directory", + _ephoto_thumb_browser_changed_directory, ephoto); + evas_object_smart_callback_add(ephoto->thumb_browser, "slideshow", + _ephoto_thumb_browser_slideshow, ephoto); ephoto->single_browser = ephoto_single_browser_add(ephoto, ephoto->pager); if (!ephoto->single_browser) { - ERR("could not add single browser"); - evas_object_del(ephoto->win); - return NULL; + evas_object_del(ephoto->win); + return NULL; } - ephoto->sb = elm_naviframe_item_insert_after(ephoto->pager, ephoto->tb, - NULL, NULL, NULL, ephoto->single_browser, "overlap"); + ephoto->sb = + elm_naviframe_item_insert_after(ephoto->pager, ephoto->tb, NULL, NULL, + NULL, ephoto->single_browser, "overlap"); elm_naviframe_item_title_enabled_set(ephoto->sb, EINA_FALSE, EINA_FALSE); - evas_object_smart_callback_add - (ephoto->single_browser, "back", _ephoto_single_browser_back, ephoto); - evas_object_smart_callback_add - (ephoto->single_browser, "slideshow", - _ephoto_single_browser_slideshow, ephoto); + evas_object_smart_callback_add(ephoto->single_browser, "back", + _ephoto_single_browser_back, ephoto); + evas_object_smart_callback_add(ephoto->single_browser, "slideshow", + _ephoto_single_browser_slideshow, ephoto); ephoto->slideshow = ephoto_slideshow_add(ephoto, ephoto->pager); if (!ephoto->slideshow) { - ERR("could not add single browser"); - evas_object_del(ephoto->win); - return NULL; + evas_object_del(ephoto->win); + return NULL; } - ephoto->sl = elm_naviframe_item_insert_after(ephoto->pager, ephoto->sb, - NULL, NULL, NULL, ephoto->slideshow, "overlap"); + ephoto->sl = + elm_naviframe_item_insert_after(ephoto->pager, ephoto->sb, NULL, NULL, + NULL, ephoto->slideshow, "overlap"); elm_naviframe_item_title_enabled_set(ephoto->sl, EINA_FALSE, EINA_FALSE); - evas_object_smart_callback_add - (ephoto->slideshow, "back", _ephoto_slideshow_back, ephoto); + evas_object_smart_callback_add(ephoto->slideshow, "back", + _ephoto_slideshow_back, ephoto); if ((!path) || (!ecore_file_exists(path))) { - if (ephoto->config->open) - { - if (!strcmp(ephoto->config->open, "Last")) - path = ephoto->config->directory; - else - path = ephoto->config->open; - if ((path) && (!ecore_file_exists(path))) path = NULL; - } + if (ephoto->config->open) + { + if (!strcmp(ephoto->config->open, "Last")) + path = ephoto->config->directory; + else + path = ephoto->config->open; + if ((path) && (!ecore_file_exists(path))) + path = NULL; + } else if (!ephoto->config->open || path) - { - if (getcwd(buf, sizeof(buf))) - path = buf; - else - path = getenv("HOME"); - } + { + if (getcwd(buf, sizeof(buf))) + path = buf; + else + path = getenv("HOME"); + } } if (ecore_file_is_dir(path)) { - ephoto_directory_set(ephoto, path); - _ephoto_thumb_browser_show(ephoto, NULL); + ephoto_directory_set(ephoto, path, NULL, EINA_FALSE); + _ephoto_thumb_browser_show(ephoto, NULL); } else { - char *dir = ecore_file_dir_get(path); - ephoto_directory_set(ephoto, dir); - free(dir); - ephoto_single_browser_path_pending_set(ephoto->single_browser, path); + char *dir = ecore_file_dir_get(path); - elm_naviframe_item_simple_promote(ephoto->pager, - ephoto->single_browser); - ephoto->state = EPHOTO_STATE_SINGLE; + ephoto_directory_set(ephoto, dir, NULL, EINA_FALSE); + free(dir); + ephoto_single_browser_path_pending_set(ephoto->single_browser, path); + + elm_naviframe_item_simple_promote(ephoto->pager, + ephoto->single_browser); + ephoto->state = EPHOTO_STATE_SINGLE; } - evas_object_resize(ephoto->win, ephoto->config->window_width, ephoto->config->window_height); + evas_object_resize(ephoto->win, ephoto->config->window_width, + ephoto->config->window_height); evas_object_show(ephoto->win); return ephoto->win; @@ -278,62 +301,75 @@ ephoto_title_set(Ephoto *ephoto, const char *title) if (title) { - snprintf(buf, sizeof(buf), "Ephoto - %s", title); - elm_win_title_set(ephoto->win, buf); + snprintf(buf, sizeof(buf), "Ephoto - %s", title); + elm_win_title_set(ephoto->win, buf); } else - elm_win_title_set(ephoto->win, "Ephoto"); + elm_win_title_set(ephoto->win, "Ephoto"); } int ephoto_entries_cmp(const void *pa, const void *pb) { const Ephoto_Entry *a = pa, *b = pb; + return strcoll(a->basename, b->basename); } static void -_ephoto_populate_main(void *data, Eio_File *handler EINA_UNUSED, const Eina_File_Direct_Info *info) +_ephoto_populate_main(void *data, Eio_File *handler EINA_UNUSED, + const Eina_File_Direct_Info *info) { - Ephoto *ephoto = data; + Ephoto_Dir_Data *ed = data; Ephoto_Entry *e; Ephoto_Event_Entry_Create *ev; - e = ephoto_entry_new(ephoto, info->path, info->path + info->name_start, info->type); + e = ephoto_entry_new(ed->ephoto, info->path, info->path + info->name_start, + info->type); if (e->is_dir) { - if (!ephoto->direntries) - ephoto->direntries = eina_list_append(ephoto->direntries, e); - else - { - int near_cmp; - Eina_List *near_node = eina_list_search_sorted_near_list - (ephoto->direntries, ephoto_entries_cmp, e, &near_cmp); - if (near_cmp < 0) - ephoto->direntries = eina_list_append_relative_list - (ephoto->direntries, e, near_node); - else - ephoto->direntries = eina_list_prepend_relative_list - (ephoto->direntries, e, near_node); - } + if (!ed->ephoto->direntries) + ed->ephoto->direntries = eina_list_append(ed->ephoto->direntries, e); + else + { + int near_cmp; + Eina_List *near_node = + eina_list_search_sorted_near_list(ed->ephoto->direntries, + ephoto_entries_cmp, e, &near_cmp); + + if (near_cmp < 0) + ed->ephoto->direntries = + eina_list_append_relative_list(ed->ephoto->direntries, e, + near_node); + else + ed->ephoto->direntries = + eina_list_prepend_relative_list(ed->ephoto->direntries, e, + near_node); + } + e->parent = ed->expanded; } else { - if (!ephoto->entries) - ephoto->entries = eina_list_append(ephoto->entries, e); - else - { - int near_cmp; - Eina_List *near_node = eina_list_search_sorted_near_list - (ephoto->entries, ephoto_entries_cmp, e, &near_cmp); - if (near_cmp < 0) - ephoto->entries = eina_list_append_relative_list - (ephoto->entries, e, near_node); - else - ephoto->entries = eina_list_prepend_relative_list - (ephoto->entries, e, near_node); - } + if (!ed->ephoto->entries) + ed->ephoto->entries = eina_list_append(ed->ephoto->entries, e); + else + { + int near_cmp; + Eina_List *near_node = + eina_list_search_sorted_near_list(ed->ephoto->entries, + ephoto_entries_cmp, e, &near_cmp); + + if (near_cmp < 0) + ed->ephoto->entries = + eina_list_append_relative_list(ed->ephoto->entries, e, + near_node); + else + ed->ephoto->entries = + eina_list_prepend_relative_list(ed->ephoto->entries, e, + near_node); + } + e->parent = NULL; } ev = calloc(1, sizeof(Ephoto_Event_Entry_Create)); ev->entry = e; @@ -342,48 +378,54 @@ _ephoto_populate_main(void *data, Eio_File *handler EINA_UNUSED, const Eina_File } static Eina_Bool -_ephoto_populate_filter(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, const Eina_File_Direct_Info *info) +_ephoto_populate_filter(void *data, Eio_File *handler EINA_UNUSED, + const Eina_File_Direct_Info *info) { + Ephoto_Dir_Data *ed = data; const char *bname = info->path + info->name_start; - if (bname[0] == '.') return EINA_FALSE; - if (info->type == EINA_FILE_DIR) return EINA_TRUE; - - return _ephoto_eina_file_direct_info_image_useful(info); + if (bname[0] == '.') + return EINA_FALSE; + if (info->type == EINA_FILE_DIR) + return EINA_TRUE; + if (!ed->dirs_only) + return _ephoto_eina_file_direct_info_image_useful(info); + else + return EINA_FALSE; } static void _ephoto_populate_end(void *data, Eio_File *handler EINA_UNUSED) { - Ephoto *ephoto = data; - ephoto->ls = NULL; + Ephoto_Dir_Data *ed = data; + + ed->ephoto->ls = NULL; ecore_event_add(EPHOTO_EVENT_POPULATE_END, NULL, NULL, NULL); + free(ed); } static void -_ephoto_populate_error(void *data, Eio_File *handler, int error) +_ephoto_populate_error(void *data, Eio_File *handler, int error EINA_UNUSED) { - Ephoto *ephoto = data; - if (error) ERR("could not populate: %s", strerror(error)); + Ephoto_Dir_Data *ed = data; ecore_event_add(EPHOTO_EVENT_POPULATE_ERROR, NULL, NULL, NULL); - _ephoto_populate_end(ephoto, handler); + _ephoto_populate_end(ed->ephoto, handler); } static void -_ephoto_populate_entries(Ephoto *ephoto) +_ephoto_populate_entries(Ephoto_Dir_Data *ed) { - DBG("populate from '%s'", ephoto->config->directory); + Ephoto_Entry *entry; - ephoto_entries_free(ephoto); - - ephoto->ls = eio_file_stat_ls(ephoto->config->directory, - _ephoto_populate_filter, - _ephoto_populate_main, - _ephoto_populate_end, - _ephoto_populate_error, - ephoto); + if (!ed->dirs_only) + ephoto_entries_free(ed->ephoto); + else + EINA_LIST_FREE(ed->ephoto->direntries, entry) ephoto_entry_free(entry); + ed->ephoto->ls = + eio_file_stat_ls(ed->ephoto->config->directory, _ephoto_populate_filter, + _ephoto_populate_main, _ephoto_populate_end, _ephoto_populate_error, ed); ecore_event_add(EPHOTO_EVENT_POPULATE_START, NULL, NULL, NULL); } @@ -391,20 +433,29 @@ _ephoto_populate_entries(Ephoto *ephoto) static void _ephoto_change_dir(void *data) { - Ephoto *ephoto = data; - ephoto->job.change_dir = NULL; - _ephoto_populate_entries(ephoto); + Ephoto_Dir_Data *ed = data; + + ed->ephoto->job.change_dir = NULL; + _ephoto_populate_entries(ed); } void -ephoto_directory_set(Ephoto *ephoto, const char *path) +ephoto_directory_set(Ephoto *ephoto, const char *path, Evas_Object *expanded, + Eina_Bool dirs_only) { - EINA_SAFETY_ON_NULL_RETURN(ephoto); + Ephoto_Dir_Data *ed; + + ed = malloc(sizeof(Ephoto_Dir_Data)); + ed->ephoto = ephoto; + ed->expanded = expanded; + ed->dirs_only = dirs_only; ephoto_title_set(ephoto, NULL); eina_stringshare_replace(&ephoto->config->directory, path); - if (ephoto->job.change_dir) ecore_job_del(ephoto->job.change_dir); - ephoto->job.change_dir = ecore_job_add(_ephoto_change_dir, ephoto); + + if (ed->ephoto->job.change_dir) + ecore_job_del(ed->ephoto->job.change_dir); + ed->ephoto->job.change_dir = ecore_job_add(_ephoto_change_dir, ed); } static Eina_Bool @@ -414,34 +465,33 @@ _thumb_gen_size_changed_timer_cb(void *data) const Eina_List *l; Evas_Object *o; - if (ephoto->config->thumb_gen_size == ephoto->thumb_gen_size) goto end; - - INF("thumbnail generation size changed from %d to %d", - ephoto->config->thumb_gen_size, ephoto->thumb_gen_size); + if (ephoto->config->thumb_gen_size == ephoto->thumb_gen_size) + goto end; ephoto->config->thumb_gen_size = ephoto->thumb_gen_size; EINA_LIST_FOREACH(ephoto->thumbs, l, o) { Ethumb_Thumb_Format format; - format = (long)evas_object_data_get(o, "ephoto_format"); - if (format) - { - elm_thumb_format_set(o, format); - if (format == ETHUMB_THUMB_FDO) - { - if (ephoto->config->thumb_gen_size < 256) - elm_thumb_fdo_size_set(o, ETHUMB_THUMB_NORMAL); - else - elm_thumb_fdo_size_set(o, ETHUMB_THUMB_LARGE); - } - else - elm_thumb_size_set(o, ephoto->thumb_gen_size, ephoto->thumb_gen_size); - elm_thumb_reload(o); - } - } - end: + format = (long) evas_object_data_get(o, "ephoto_format"); + if (format) + { + elm_thumb_format_set(o, format); + if (format == ETHUMB_THUMB_FDO) + { + if (ephoto->config->thumb_gen_size < 256) + elm_thumb_fdo_size_set(o, ETHUMB_THUMB_NORMAL); + else + elm_thumb_fdo_size_set(o, ETHUMB_THUMB_LARGE); + } + else + elm_thumb_size_set(o, ephoto->thumb_gen_size, + ephoto->thumb_gen_size); + elm_thumb_reload(o); + } + } + end: ephoto->timer.thumb_regen = NULL; return EINA_FALSE; } @@ -451,63 +501,61 @@ ephoto_thumb_size_set(Ephoto *ephoto, int size) { if (ephoto->config->thumb_size != size) { - INF("thumbnail display size changed from %d to %d", - ephoto->config->thumb_size, size); - ephoto->config->thumb_size = size; + ephoto->config->thumb_size = size; } - if (size <= 128) ephoto->thumb_gen_size = 128; - else if (size <= 256) ephoto->thumb_gen_size = 256; - else ephoto->thumb_gen_size = 512; + if (size <= 128) + ephoto->thumb_gen_size = 128; + else if (size <= 256) + ephoto->thumb_gen_size = 256; + else + ephoto->thumb_gen_size = 512; - if (ephoto->timer.thumb_regen) ecore_timer_del(ephoto->timer.thumb_regen); - ephoto->timer.thumb_regen = ecore_timer_add - (0.1, _thumb_gen_size_changed_timer_cb, ephoto); + if (ephoto->timer.thumb_regen) + ecore_timer_del(ephoto->timer.thumb_regen); + ephoto->timer.thumb_regen = + ecore_timer_add(0.1, _thumb_gen_size_changed_timer_cb, ephoto); } static void -_thumb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +_thumb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) { Ephoto *ephoto = data; - ephoto->thumbs = eina_list_remove(ephoto->thumbs, obj); -} -static void -_load_error(void *data , Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) -{ - const char *path = data; - ERR("Error loading thumbnail: %s\n", path); + ephoto->thumbs = eina_list_remove(ephoto->thumbs, obj); } Evas_Object * ephoto_thumb_add(Ephoto *ephoto, Evas_Object *parent, const char *path) { Evas_Object *o; - EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); if (path) { - const char *ext = strrchr(path, '.'); - if (ext) - { - ext++; - if ((strcasecmp(ext, "edj") == 0)) - o = elm_icon_add(parent); - else - o = elm_thumb_add(parent); - } + const char *ext = strrchr(path, '.'); + + if (ext) + { + ext++; + if ((strcasecmp(ext, "edj") == 0)) + o = elm_icon_add(parent); + else + o = elm_thumb_add(parent); + } else - o = elm_thumb_add(parent); + o = elm_thumb_add(parent); + ephoto_thumb_path_set(o, path); } else - o = elm_thumb_add(parent); - if (!o) return NULL; + o = elm_thumb_add(parent); + if (!o) + return NULL; - if (path) ephoto_thumb_path_set(o, path); elm_object_style_set(o, "noframe"); ephoto->thumbs = eina_list_append(ephoto->thumbs, o); evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _thumb_del, ephoto); - evas_object_smart_callback_add(o, "generate,error", _load_error, path); + return o; } @@ -517,29 +565,30 @@ ephoto_thumb_path_set(Evas_Object *obj, const char *path) Ethumb_Thumb_Format format = ETHUMB_THUMB_FDO; const char *group = NULL; const char *ext = strrchr(path, '.'); + if (ext) { - ext++; - if ((strcasecmp(ext, "jpg") == 0) || - (strcasecmp(ext, "jpeg") == 0)) - format = ETHUMB_THUMB_JPEG; /* faster! */ - else if ((strcasecmp(ext, "edj") == 0)) - { - 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); - } - elm_image_file_set(obj, path, group); - evas_object_data_set(obj, "ephoto_format", NULL); - return; - } + ext++; + if ((strcasecmp(ext, "jpg") == 0) || (strcasecmp(ext, "jpeg") == 0)) + format = ETHUMB_THUMB_JPEG; + else if ((strcasecmp(ext, "edj") == 0)) + { + 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); + } + elm_image_file_set(obj, path, group); + evas_object_data_set(obj, "ephoto_format", NULL); + return; + } } elm_thumb_format_set(obj, format); - evas_object_data_set(obj, "ephoto_format", (void*)(long)format); + evas_object_data_set(obj, "ephoto_format", (void *) (long) format); elm_thumb_crop_align_set(obj, 0.5, 0.5); elm_thumb_aspect_set(obj, ETHUMB_THUMB_CROP); elm_thumb_orientation_set(obj, ETHUMB_THUMB_ORIENT_ORIGINAL); @@ -547,20 +596,20 @@ ephoto_thumb_path_set(Evas_Object *obj, const char *path) } Ephoto_Entry * -ephoto_entry_new(Ephoto *ephoto, const char *path, const char *label, Eina_File_Type type) +ephoto_entry_new(Ephoto *ephoto, const char *path, const char *label, + Eina_File_Type type) { Ephoto_Entry *entry; - EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL); + entry = calloc(1, sizeof(Ephoto_Entry)); - EINA_SAFETY_ON_NULL_RETURN_VAL(entry, NULL); entry->ephoto = ephoto; entry->path = eina_stringshare_add(path); entry->basename = ecore_file_file_get(entry->path); entry->label = eina_stringshare_add(label); if (type == EINA_FILE_DIR) - entry->is_dir = EINA_TRUE; + entry->is_dir = EINA_TRUE; else - entry->is_dir = EINA_FALSE; + entry->is_dir = EINA_FALSE; return entry; } @@ -571,42 +620,40 @@ ephoto_entry_free(Ephoto_Entry *entry) EINA_LIST_FREE(entry->free_listeners, fl) { - fl->cb((void *)fl->data, entry); + fl->cb((void *) fl->data, entry); free(fl); } - EINA_SAFETY_ON_NULL_RETURN(entry); eina_stringshare_del(entry->path); eina_stringshare_del(entry->label); free(entry); } void -ephoto_entry_free_listener_add(Ephoto_Entry *entry, void (*cb)(void *data, const Ephoto_Entry *entry), const void *data) +ephoto_entry_free_listener_add(Ephoto_Entry *entry, void (*cb) (void *data, + const Ephoto_Entry *entry), const void *data) { Ephoto_Entry_Free_Listener *fl; - EINA_SAFETY_ON_NULL_RETURN(entry); - EINA_SAFETY_ON_NULL_RETURN(cb); + fl = malloc(sizeof(Ephoto_Entry_Free_Listener)); - EINA_SAFETY_ON_NULL_RETURN(fl); fl->cb = cb; fl->data = data; entry->free_listeners = eina_list_append(entry->free_listeners, fl); } void -ephoto_entry_free_listener_del(Ephoto_Entry *entry, void (*cb)(void *data, const Ephoto_Entry *entry), const void *data) +ephoto_entry_free_listener_del(Ephoto_Entry *entry, void (*cb) (void *data, + const Ephoto_Entry *entry), const void *data) { Eina_List *l; Ephoto_Entry_Free_Listener *fl; - EINA_SAFETY_ON_NULL_RETURN(entry); - EINA_SAFETY_ON_NULL_RETURN(cb); + EINA_LIST_FOREACH(entry->free_listeners, l, fl) { if ((fl->cb == cb) && (fl->data == data)) - { - entry->free_listeners = eina_list_remove_list - (entry->free_listeners, l); - break; + { + entry->free_listeners = + eina_list_remove_list(entry->free_listeners, l); + break; } } } @@ -615,6 +662,7 @@ void ephoto_entries_free(Ephoto *ephoto) { Ephoto_Entry *entry; + EINA_LIST_FREE(ephoto->entries, entry) ephoto_entry_free(entry); EINA_LIST_FREE(ephoto->direntries, entry) ephoto_entry_free(entry); } diff --git a/src/bin/ephoto_single_browser.c b/src/bin/ephoto_single_browser.c index b6506ea..7c5f9f0 100644 --- a/src/bin/ephoto_single_browser.c +++ b/src/bin/ephoto_single_browser.c @@ -11,6 +11,7 @@ struct _Ephoto_Single_Browser { Ephoto *ephoto; Evas_Object *main; + Evas_Object *tbox; Evas_Object *bar; Evas_Object *mhbox; Evas_Object *table; @@ -18,6 +19,7 @@ struct _Ephoto_Single_Browser Evas_Object *infolabel; Evas_Object *nolabel; Evas_Object *botbox; + Evas_Object *event; const char *pending_path; Ephoto_Entry *entry; Ephoto_Orient orient; @@ -46,16 +48,21 @@ struct _Ephoto_Viewer 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 void _key_down(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info); static void -_viewer_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_viewer_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Viewer *v = data; + free(v); } static Evas_Object * -_image_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, Evas_Coord *yoff) +_image_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, + Evas_Coord *yoff) { Evas_Object *ic; Evas_Object *io = data; @@ -71,8 +78,10 @@ _image_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, Evas_Coord evas_object_show(ic); evas_pointer_canvas_xy_get(evas_object_evas_get(io), &xm, &ym); - if (xoff) *xoff = xm-30; - if (yoff) *yoff = ym-30; + if (xoff) + *xoff = xm - 30; + if (yoff) + *yoff = ym - 30; return ic; } @@ -89,15 +98,15 @@ _1s_hold_time(void *data) snprintf(dd, sizeof(dd), "file://%s", f); elm_drag_start(io, ELM_SEL_FORMAT_IMAGE, dd, ELM_XDND_ACTION_COPY, - _image_create_icon, io, - NULL, NULL, NULL, NULL, NULL, NULL); + _image_create_icon, io, NULL, NULL, NULL, NULL, NULL, NULL); _1s_hold = NULL; return ECORE_CALLBACK_CANCEL; } static void -_image_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_image_mouse_down_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *io = data; @@ -105,7 +114,8 @@ _image_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUS } static void -_image_mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_image_mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { ecore_timer_del(_1s_hold); } @@ -113,42 +123,43 @@ _image_mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj static Evas_Object * _viewer_add(Evas_Object *parent, const char *path) { - Ephoto_Single_Browser *sb = evas_object_data_get(parent, "single_browser"); Ephoto_Viewer *v = calloc(1, sizeof(Ephoto_Viewer)); - Evas_Object *obj; int err; - EINA_SAFETY_ON_NULL_RETURN_VAL(v, NULL); v->zoom_first = EINA_TRUE; Evas_Coord w, h; const char *group = NULL; const char *ext = strrchr(path, '.'); + if (ext) { - ext++; - if ((strcasecmp(ext, "edj") == 0)) - { - 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); - } - } - } - 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); + ext++; + if ((strcasecmp(ext, "edj") == 0)) + { + 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); + } + } + } + v->scroller = elm_scroller_add(parent); + evas_object_size_hint_weight_set(v->scroller, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(v->scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_data_set(v->scroller, "viewer", v); + evas_object_event_callback_add(v->scroller, EVAS_CALLBACK_DEL, _viewer_del, + v); + evas_object_show(v->scroller); 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_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); @@ -157,23 +168,25 @@ _viewer_add(Evas_Object *parent, const char *path) elm_image_preload_disabled_set(v->image, EINA_TRUE); 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; + if (err != EVAS_LOAD_ERROR_NONE) + goto error; evas_object_image_size_get(elm_image_object_get(v->image), &w, &h); - elm_drop_target_add(v->image, ELM_SEL_FORMAT_IMAGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + elm_drop_target_add(v->image, ELM_SEL_FORMAT_IMAGE, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL); evas_object_size_hint_min_set(v->image, w, h); evas_object_size_hint_max_set(v->image, w, h); - evas_object_event_callback_add(v->image, EVAS_CALLBACK_MOUSE_DOWN, _image_mouse_down_cb, v->image); - evas_object_event_callback_add(v->image, EVAS_CALLBACK_MOUSE_UP, _image_mouse_up_cb, v->image); + evas_object_event_callback_add(v->image, EVAS_CALLBACK_MOUSE_DOWN, + _image_mouse_down_cb, v->image); + evas_object_event_callback_add(v->image, EVAS_CALLBACK_MOUSE_UP, + _image_mouse_up_cb, v->image); elm_table_pack(v->table, v->image, 0, 0, 1, 1); evas_object_show(v->image); - return obj; + return v->scroller; - load_error: - ERR("could not load image '%s': %s", path, evas_load_error_str(err)); - error: - evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _viewer_del); - evas_object_data_del(obj, "viewer"); + error: + evas_object_event_callback_del(v->scroller, EVAS_CALLBACK_DEL, _viewer_del); + evas_object_data_del(v->scroller, "viewer"); free(v); return NULL; } @@ -185,7 +198,7 @@ _viewer_zoom_apply(Ephoto_Viewer *v, double zoom) Evas_Coord w, h; Evas_Object *image; - + image = v->image; evas_object_image_size_get(elm_image_object_get(image), &w, &h); w *= zoom; @@ -205,54 +218,58 @@ _viewer_zoom_fit_apply(Ephoto_Viewer *v) evas_object_geometry_get(v->scroller, NULL, NULL, &cw, &ch); evas_object_image_size_get(elm_image_object_get(image), &iw, &ih); - if ((cw <= 0) || (ch <= 0)) return; /* object still not resized */ + if ((cw <= 0) || (ch <= 0)) + return; EINA_SAFETY_ON_TRUE_RETURN(iw <= 0); EINA_SAFETY_ON_TRUE_RETURN(ih <= 0); - zx = (double)cw/(double)iw; - zy = (double)ch/(double)ih; + zx = (double) cw / (double) iw; + zy = (double) ch / (double) ih; zoom = (zx < zy) ? zx : zy; _viewer_zoom_apply(v, zoom); } static void -_viewer_resized(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_viewer_resized(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Viewer *v = data; + if (v->zoom_first) { - Evas_Coord cw, ch, iw, ih; - Evas_Object *image; - - image = v->image; - evas_object_geometry_get(v->scroller, NULL, NULL, &cw, &ch); - evas_object_image_size_get(elm_image_object_get(image), &iw, &ih); + Evas_Coord cw, ch, iw, ih; + Evas_Object *image; - if ((cw <= 0) || (ch <= 0)) return; /* object still not resized */ - EINA_SAFETY_ON_TRUE_RETURN(iw <= 0); - EINA_SAFETY_ON_TRUE_RETURN(ih <= 0); - if (iw < cw && ih < ch) - _viewer_zoom_apply(v, 1); - else - _viewer_zoom_fit_apply(v); + image = v->image; + evas_object_geometry_get(v->scroller, NULL, NULL, &cw, &ch); + evas_object_image_size_get(elm_image_object_get(image), &iw, &ih); + + if ((cw <= 0) || (ch <= 0)) + return; + EINA_SAFETY_ON_TRUE_RETURN(iw <= 0); + EINA_SAFETY_ON_TRUE_RETURN(ih <= 0); + if (iw < cw && ih < ch) + _viewer_zoom_apply(v, 1); + else + _viewer_zoom_fit_apply(v); } else - _viewer_zoom_fit_apply(v); + _viewer_zoom_fit_apply(v); } static void _viewer_zoom_set(Evas_Object *obj, double zoom) { Ephoto_Viewer *v = evas_object_data_get(obj, "viewer"); - EINA_SAFETY_ON_NULL_RETURN(v); + _viewer_zoom_apply(v, zoom); if (v->fit) { - evas_object_event_callback_del_full - (v->scroller, EVAS_CALLBACK_RESIZE, _viewer_resized, v); - v->fit = EINA_FALSE; + evas_object_event_callback_del_full(v->scroller, EVAS_CALLBACK_RESIZE, + _viewer_resized, v); + v->fit = EINA_FALSE; } } @@ -260,7 +277,7 @@ static double _viewer_zoom_get(Evas_Object *obj) { Ephoto_Viewer *v = evas_object_data_get(obj, "viewer"); - EINA_SAFETY_ON_NULL_RETURN_VAL(v, 0.0); + return v->zoom; } @@ -268,13 +285,13 @@ static void _viewer_zoom_fit(Evas_Object *obj) { Ephoto_Viewer *v = evas_object_data_get(obj, "viewer"); - EINA_SAFETY_ON_NULL_RETURN(v); - if (v->fit) return; + if (v->fit) + return; v->fit = EINA_TRUE; - 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); } @@ -285,41 +302,49 @@ _orient_apply(Ephoto_Single_Browser *sb) Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); char image_info[PATH_MAX]; int w, h; - EINA_SAFETY_ON_NULL_RETURN(v); switch (sb->orient) { - case EPHOTO_ORIENT_0: - elm_image_orient_set(v->image, ELM_IMAGE_ORIENT_NONE); - break; - case EPHOTO_ORIENT_90: - elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_90); - break; - case EPHOTO_ORIENT_180: - elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_180); - break; - case EPHOTO_ORIENT_270: - elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_270); - break; - case EPHOTO_ORIENT_FLIP_HORIZ: - elm_image_orient_set(v->image, ELM_IMAGE_FLIP_HORIZONTAL); - break; - case EPHOTO_ORIENT_FLIP_VERT: - elm_image_orient_set(v->image, ELM_IMAGE_FLIP_VERTICAL); - break; - case EPHOTO_ORIENT_FLIP_HORIZ_90: - elm_image_orient_set(v->image, ELM_IMAGE_FLIP_TRANSPOSE); - break; - case EPHOTO_ORIENT_FLIP_VERT_90: - elm_image_orient_set(v->image, ELM_IMAGE_FLIP_TRANSVERSE); - break; - default: - return; + case EPHOTO_ORIENT_0: + elm_image_orient_set(v->image, ELM_IMAGE_ORIENT_NONE); + break; + + case EPHOTO_ORIENT_90: + elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_90); + break; + + case EPHOTO_ORIENT_180: + elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_180); + break; + + case EPHOTO_ORIENT_270: + elm_image_orient_set(v->image, ELM_IMAGE_ROTATE_270); + break; + + case EPHOTO_ORIENT_FLIP_HORIZ: + elm_image_orient_set(v->image, ELM_IMAGE_FLIP_HORIZONTAL); + break; + + case EPHOTO_ORIENT_FLIP_VERT: + elm_image_orient_set(v->image, ELM_IMAGE_FLIP_VERTICAL); + break; + + case EPHOTO_ORIENT_FLIP_HORIZ_90: + elm_image_orient_set(v->image, ELM_IMAGE_FLIP_TRANSPOSE); + break; + + case EPHOTO_ORIENT_FLIP_VERT_90: + elm_image_orient_set(v->image, ELM_IMAGE_FLIP_TRANSVERSE); + break; + + default: + return; } elm_table_unpack(v->table, v->image); elm_object_content_unset(v->scroller); elm_image_object_size_get(v->image, &w, &h); - sb->edited_image_data = evas_object_image_data_get(elm_image_object_get(v->image), EINA_FALSE); + sb->edited_image_data = + evas_object_image_data_get(elm_image_object_get(v->image), EINA_FALSE); sb->ew = w; sb->eh = h; evas_object_size_hint_min_set(v->image, w, h); @@ -329,10 +354,10 @@ _orient_apply(Ephoto_Single_Browser *sb) evas_object_del(sb->botbox); evas_object_del(sb->infolabel); snprintf(image_info, PATH_MAX, - "%s: %s %s: %dx%d %s: %s", - _("Type"), efreet_mime_type_get(sb->entry->path), _("Resolution"), w, h, - _("File Size"), _("N/A")); - sb->botbox = evas_object_rectangle_add(evas_object_evas_get(sb->table)); + "%s: %s %s: %dx%d %s: %s", _("Type"), + efreet_mime_type_get(sb->entry->path), _("Resolution"), w, h, + _("File Size"), _("N/A")); + sb->botbox = elm_box_add(sb->table); evas_object_color_set(sb->botbox, 0, 0, 0, 0); evas_object_size_hint_min_set(sb->botbox, 0, sb->ephoto->bottom_bar_size); evas_object_size_hint_weight_set(sb->botbox, EVAS_HINT_EXPAND, 0.0); @@ -343,16 +368,17 @@ _orient_apply(Ephoto_Single_Browser *sb) sb->infolabel = elm_label_add(sb->table); elm_label_line_wrap_set(sb->infolabel, ELM_WRAP_NONE); elm_object_text_set(sb->infolabel, image_info); - evas_object_size_hint_weight_set(sb->infolabel, EVAS_HINT_EXPAND, EVAS_HINT_FILL); - evas_object_size_hint_align_set(sb->infolabel, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sb->infolabel, EVAS_HINT_EXPAND, + EVAS_HINT_FILL); + evas_object_size_hint_align_set(sb->infolabel, EVAS_HINT_FILL, + EVAS_HINT_FILL); elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); evas_object_show(sb->infolabel); if (v->fit) - _viewer_zoom_fit_apply(v); + _viewer_zoom_fit_apply(v); else - _viewer_zoom_set(sb->viewer, _viewer_zoom_get(sb->viewer)); - DBG("orient: %d", sb->orient); + _viewer_zoom_set(sb->viewer, _viewer_zoom_get(sb->viewer)); } static void @@ -360,33 +386,41 @@ _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_VERT_90; - break; - case EPHOTO_ORIENT_FLIP_VERT_90: - sb->orient = EPHOTO_ORIENT_FLIP_VERT; - 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; - default: - sb->orient = EPHOTO_ORIENT_0; - break; + 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_VERT_90; + break; + + case EPHOTO_ORIENT_FLIP_VERT_90: + sb->orient = EPHOTO_ORIENT_FLIP_VERT; + 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; + + default: + sb->orient = EPHOTO_ORIENT_0; + break; } _orient_apply(sb); } @@ -396,33 +430,41 @@ _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_HORIZ_90; - break; - case EPHOTO_ORIENT_FLIP_VERT_90: - sb->orient = EPHOTO_ORIENT_FLIP_HORIZ; - 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; - default: - sb->orient = EPHOTO_ORIENT_0; - break; + 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_HORIZ_90; + break; + + case EPHOTO_ORIENT_FLIP_VERT_90: + sb->orient = EPHOTO_ORIENT_FLIP_HORIZ; + 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; + + default: + sb->orient = EPHOTO_ORIENT_0; + break; } _orient_apply(sb); } @@ -432,33 +474,41 @@ _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_VERT_90; - break; - case EPHOTO_ORIENT_180: - sb->orient = EPHOTO_ORIENT_FLIP_VERT; - break; - case EPHOTO_ORIENT_270: - sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90; - break; - case EPHOTO_ORIENT_FLIP_HORIZ: - sb->orient = EPHOTO_ORIENT_0; - break; - case EPHOTO_ORIENT_FLIP_VERT_90: - sb->orient = EPHOTO_ORIENT_90; - break; - case EPHOTO_ORIENT_FLIP_VERT: - sb->orient = EPHOTO_ORIENT_180; - break; - case EPHOTO_ORIENT_FLIP_HORIZ_90: - sb->orient = EPHOTO_ORIENT_270; - break; - default: - sb->orient = EPHOTO_ORIENT_0; - break; + case EPHOTO_ORIENT_0: + sb->orient = EPHOTO_ORIENT_FLIP_HORIZ; + break; + + case EPHOTO_ORIENT_90: + sb->orient = EPHOTO_ORIENT_FLIP_VERT_90; + break; + + case EPHOTO_ORIENT_180: + sb->orient = EPHOTO_ORIENT_FLIP_VERT; + break; + + case EPHOTO_ORIENT_270: + sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90; + break; + + case EPHOTO_ORIENT_FLIP_HORIZ: + sb->orient = EPHOTO_ORIENT_0; + break; + + case EPHOTO_ORIENT_FLIP_VERT_90: + sb->orient = EPHOTO_ORIENT_90; + break; + + case EPHOTO_ORIENT_FLIP_VERT: + sb->orient = EPHOTO_ORIENT_180; + break; + + case EPHOTO_ORIENT_FLIP_HORIZ_90: + sb->orient = EPHOTO_ORIENT_270; + break; + + default: + sb->orient = EPHOTO_ORIENT_0; + break; } _orient_apply(sb); } @@ -468,60 +518,70 @@ _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_HORIZ_90; - break; - case EPHOTO_ORIENT_180: - sb->orient = EPHOTO_ORIENT_FLIP_HORIZ; - break; - case EPHOTO_ORIENT_270: - sb->orient = EPHOTO_ORIENT_FLIP_VERT_90; - break; - case EPHOTO_ORIENT_FLIP_HORIZ: - sb->orient = EPHOTO_ORIENT_180; - break; - case EPHOTO_ORIENT_FLIP_VERT_90: - sb->orient = EPHOTO_ORIENT_270; - break; - case EPHOTO_ORIENT_FLIP_VERT: - sb->orient = EPHOTO_ORIENT_0; - break; - case EPHOTO_ORIENT_FLIP_HORIZ_90: - sb->orient = EPHOTO_ORIENT_90; - break; - default: - sb->orient = EPHOTO_ORIENT_0; - break; + case EPHOTO_ORIENT_0: + sb->orient = EPHOTO_ORIENT_FLIP_VERT; + break; + + case EPHOTO_ORIENT_90: + sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90; + break; + + case EPHOTO_ORIENT_180: + sb->orient = EPHOTO_ORIENT_FLIP_HORIZ; + break; + + case EPHOTO_ORIENT_270: + sb->orient = EPHOTO_ORIENT_FLIP_VERT_90; + break; + + case EPHOTO_ORIENT_FLIP_HORIZ: + sb->orient = EPHOTO_ORIENT_180; + break; + + case EPHOTO_ORIENT_FLIP_VERT_90: + sb->orient = EPHOTO_ORIENT_270; + break; + + case EPHOTO_ORIENT_FLIP_VERT: + sb->orient = EPHOTO_ORIENT_0; + break; + + case EPHOTO_ORIENT_FLIP_HORIZ_90: + sb->orient = EPHOTO_ORIENT_90; + break; + + default: + sb->orient = EPHOTO_ORIENT_0; + break; } _orient_apply(sb); } static void -_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) { Ephoto_Single_Browser *sb = data; Evas_Event_Mouse_Wheel *ev = event_info; - if (!evas_key_modifier_is_set(ev->modifiers, "Control")) return; - if (ev->z > 0) _zoom_out(sb); - else _zoom_in(sb); + if (!evas_key_modifier_is_set(ev->modifiers, "Control")) + return; + + if (ev->z > 0) + _zoom_out(sb); + else + _zoom_in(sb); } static Ephoto_Entry * _first_entry_find(Ephoto_Single_Browser *sb) { - EINA_SAFETY_ON_NULL_RETURN_VAL(sb->ephoto, NULL); - return eina_list_nth(sb->ephoto->entries, 0); } static Ephoto_Entry * _last_entry_find(Ephoto_Single_Browser *sb) { - EINA_SAFETY_ON_NULL_RETURN_VAL(sb->ephoto, NULL); return eina_list_last_data_get(sb->ephoto->entries); } @@ -531,176 +591,203 @@ _ephoto_get_file_size(const char *path) char isize[PATH_MAX]; Eina_File *f = eina_file_open(path, EINA_FALSE); size_t size = eina_file_size_get(f); + eina_file_close(f); - double dsize = (double)size; - if (dsize < 1024.0) snprintf(isize, sizeof(isize), "%'.0f%s", dsize, ngettext("B", "B", dsize)); + double dsize = (double) size; + + if (dsize < 1024.0) + snprintf(isize, sizeof(isize), "%'.0f%s", dsize, ngettext("B", "B", + dsize)); else { - dsize /= 1024.0; - if (dsize < 1024) snprintf(isize, sizeof(isize), "%'.0f%s", dsize, ngettext("KB", "KB", dsize)); - else - { - dsize /= 1024.0; - if (dsize < 1024) snprintf(isize, sizeof(isize), "%'.1f%s", dsize, ngettext("MB", "MB", dsize)); - else - { - dsize /= 1024.0; - if (dsize < 1024) snprintf(isize, sizeof(isize), "%'.1f%s", dsize, ngettext("GB", "GB", dsize)); - else - { - dsize /= 1024.0; - snprintf(isize, sizeof(isize), "%'.1f%s", dsize, ngettext("TB", "TB", dsize)); - } - } - } + dsize /= 1024.0; + if (dsize < 1024) + snprintf(isize, sizeof(isize), "%'.0f%s", dsize, ngettext("KB", "KB", + dsize)); + else + { + dsize /= 1024.0; + if (dsize < 1024) + snprintf(isize, sizeof(isize), "%'.1f%s", dsize, ngettext("MB", + "MB", dsize)); + else + { + dsize /= 1024.0; + if (dsize < 1024) + snprintf(isize, sizeof(isize), "%'.1f%s", dsize, + ngettext("GB", "GB", dsize)); + else + { + dsize /= 1024.0; + snprintf(isize, sizeof(isize), "%'.1f%s", dsize, + ngettext("TB", "TB", dsize)); + } + } + } } return strdup(isize); } - static void _ephoto_single_browser_recalc(Ephoto_Single_Browser *sb) { if (sb->viewer) - { - evas_object_del(sb->viewer); - sb->viewer = NULL; - evas_object_del(sb->botbox); - sb->botbox = NULL; - evas_object_del(sb->infolabel); - sb->infolabel = NULL; - } + { + evas_object_del(sb->viewer); + sb->viewer = NULL; + evas_object_del(sb->botbox); + sb->botbox = NULL; + evas_object_del(sb->infolabel); + sb->infolabel = NULL; + } if (sb->nolabel) { - evas_object_del(sb->nolabel); - sb->nolabel = NULL; + evas_object_del(sb->nolabel); + sb->nolabel = NULL; } if (sb->entry) { - const char *bname = ecore_file_file_get(sb->entry->path); + const char *bname = ecore_file_file_get(sb->entry->path); - elm_table_clear(sb->table, EINA_FALSE); + elm_table_clear(sb->table, EINA_FALSE); - sb->viewer = _viewer_add(sb->main, sb->entry->path); - if (sb->viewer) - { - char image_info[PATH_MAX], *tmp; - Evas_Coord w, h; - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + sb->viewer = _viewer_add(sb->main, sb->entry->path); + if (sb->viewer) + { + char image_info[PATH_MAX], *tmp; + Evas_Coord w, h; + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - elm_table_pack(sb->table, sb->viewer, 0, 1, 4, 1); - evas_object_show(sb->viewer); - evas_object_event_callback_add - (sb->viewer, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel, sb); + elm_table_pack(sb->table, sb->viewer, 0, 1, 4, 1); + evas_object_show(sb->viewer); + evas_object_event_callback_add(sb->viewer, + EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel, sb); - evas_object_image_size_get(elm_image_object_get(v->image), &w, &h); - tmp = _ephoto_get_file_size(sb->entry->path); - snprintf(image_info, PATH_MAX, - "%s: %s %s: %dx%d %s: %s", - _("Type"), efreet_mime_type_get(sb->entry->path), _("Resolution"), w, h, - _("File Size"), tmp); - free(tmp); - sb->botbox = evas_object_rectangle_add(evas_object_evas_get(sb->table)); - evas_object_color_set(sb->botbox, 0, 0, 0, 0); - evas_object_size_hint_min_set(sb->botbox, 0, sb->ephoto->bottom_bar_size); - evas_object_size_hint_weight_set(sb->botbox, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_fill_set(sb->botbox, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(sb->table, sb->botbox, 0, 2, 4, 1); - evas_object_show(sb->botbox); + evas_object_image_size_get(elm_image_object_get(v->image), &w, &h); + tmp = _ephoto_get_file_size(sb->entry->path); + snprintf(image_info, PATH_MAX, + "%s: %s %s: %dx%d %s: %s", + _("Type"), efreet_mime_type_get(sb->entry->path), + _("Resolution"), w, h, _("File Size"), tmp); + free(tmp); + sb->botbox = elm_box_add(sb->table); + evas_object_size_hint_min_set(sb->botbox, 0, + sb->ephoto->bottom_bar_size); + evas_object_size_hint_weight_set(sb->botbox, EVAS_HINT_EXPAND, + 0.0); + evas_object_size_hint_fill_set(sb->botbox, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_table_pack(sb->table, sb->botbox, 0, 2, 4, 1); + evas_object_show(sb->botbox); - sb->infolabel = elm_label_add(sb->table); - elm_label_line_wrap_set(sb->infolabel, ELM_WRAP_NONE); - elm_object_text_set(sb->infolabel, image_info); - evas_object_size_hint_weight_set(sb->infolabel, EVAS_HINT_EXPAND, EVAS_HINT_FILL); - evas_object_size_hint_align_set(sb->infolabel, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); - evas_object_show(sb->infolabel); + sb->infolabel = elm_label_add(sb->table); + elm_label_line_wrap_set(sb->infolabel, ELM_WRAP_NONE); + elm_object_text_set(sb->infolabel, image_info); + evas_object_size_hint_weight_set(sb->infolabel, EVAS_HINT_EXPAND, + EVAS_HINT_FILL); + evas_object_size_hint_align_set(sb->infolabel, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); + evas_object_show(sb->infolabel); - ephoto_title_set(sb->ephoto, bname); - } + ephoto_title_set(sb->ephoto, bname); + } else - { - sb->nolabel = elm_label_add(sb->table); - elm_label_line_wrap_set(sb->nolabel, ELM_WRAP_WORD); - elm_object_text_set(sb->nolabel, _("This image does not exist or is corrupted!")); - evas_object_size_hint_weight_set(sb->nolabel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(sb->nolabel, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(sb->table, sb->nolabel, 0, 1, 4, 1); - evas_object_show(sb->nolabel); - ephoto_title_set(sb->ephoto, _("Bad Image")); - } - } - elm_object_focus_set(sb->main, EINA_TRUE); + { + sb->nolabel = elm_label_add(sb->table); + elm_label_line_wrap_set(sb->nolabel, ELM_WRAP_WORD); + elm_object_text_set(sb->nolabel, + _("This image does not exist or is corrupted!")); + evas_object_size_hint_weight_set(sb->nolabel, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sb->nolabel, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_table_pack(sb->table, sb->nolabel, 0, 1, 4, 1); + evas_object_show(sb->nolabel); + ephoto_title_set(sb->ephoto, _("Bad Image")); + } + } } static void _zoom_set(Ephoto_Single_Browser *sb, double zoom) { - DBG("zoom %f", zoom); - if (zoom <= 0.0) return; + if (zoom <= 0.0) + return; _viewer_zoom_set(sb->viewer, zoom); } static void _zoom_fit(Ephoto_Single_Browser *sb) { - if (sb->viewer) _viewer_zoom_fit(sb->viewer); + if (sb->viewer) + _viewer_zoom_fit(sb->viewer); } static void _zoom_in(Ephoto_Single_Browser *sb) { - double change = (1.0+ZOOM_STEP); + double change = (1.0 + ZOOM_STEP); + _viewer_zoom_set(sb->viewer, _viewer_zoom_get(sb->viewer) * change); } static void _zoom_out(Ephoto_Single_Browser *sb) { - double change = (1.0-ZOOM_STEP); + double change = (1.0 - ZOOM_STEP); + _viewer_zoom_set(sb->viewer, _viewer_zoom_get(sb->viewer) * change); } static void -_zoom_in_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_zoom_in_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + v->zoom_first = EINA_FALSE; _zoom_in(sb); } static void -_zoom_out_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_zoom_out_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + v->zoom_first = EINA_FALSE; _zoom_out(sb); } static void -_zoom_1_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_zoom_1_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + v->zoom_first = EINA_FALSE; _zoom_set(sb, 1.0); } static void -_zoom_fit_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_zoom_fit_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); Eina_Bool first_click; + if (v->zoom_first) - first_click = EINA_TRUE; + first_click = EINA_TRUE; else - first_click = EINA_FALSE; + first_click = EINA_FALSE; v->zoom_first = EINA_FALSE; if (first_click) - v->fit = EINA_FALSE; + v->fit = EINA_FALSE; _zoom_fit(sb); } @@ -709,18 +796,17 @@ _next_entry(Ephoto_Single_Browser *sb) { Ephoto_Entry *entry = NULL; Eina_List *node; - EINA_SAFETY_ON_NULL_RETURN(sb->entry); node = eina_list_data_find_list(sb->ephoto->entries, sb->entry); - if (!node) return; + if (!node) + return; if ((node = node->next)) - entry = node->data; + entry = node->data; if (!entry) - entry = _first_entry_find(sb); + entry = _first_entry_find(sb); if (entry) { - DBG("next is '%s'", entry->path); - ephoto_single_browser_entry_set(sb->main, entry); + ephoto_single_browser_entry_set(sb->main, entry); } } @@ -729,18 +815,17 @@ _prev_entry(Ephoto_Single_Browser *sb) { Eina_List *node; Ephoto_Entry *entry = NULL; - EINA_SAFETY_ON_NULL_RETURN(sb->entry); node = eina_list_data_find_list(sb->ephoto->entries, sb->entry); - if (!node) return; + if (!node) + return; if ((node = node->prev)) - entry = node->data; + entry = node->data; if (!entry) - entry = _last_entry_find(sb); + entry = _last_entry_find(sb); if (entry) { - DBG("prev is '%s'", entry->path); - ephoto_single_browser_entry_set(sb->main, entry); + ephoto_single_browser_entry_set(sb->main, entry); } } @@ -748,8 +833,10 @@ static void _first_entry(Ephoto_Single_Browser *sb) { Ephoto_Entry *entry = _first_entry_find(sb); - if (!entry) return; - DBG("first is '%s'", entry->path); + + if (!entry) + return; + ephoto_single_browser_entry_set(sb->main, entry); } @@ -757,38 +844,58 @@ static void _last_entry(Ephoto_Single_Browser *sb) { Ephoto_Entry *entry = _last_entry_find(sb); - if (!entry) return; - DBG("last is '%s'", entry->path); + + if (!entry) + return; + ephoto_single_browser_entry_set(sb->main, entry); } static void -_reset_yes(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_reset_yes(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + sb->orient = EPHOTO_ORIENT_0; ephoto_single_browser_entry_set(sb->main, sb->entry); evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } } static void -_reset_no(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_reset_no(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; + Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); + evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } } static void -_reset_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_reset_image(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Evas_Object *popup, *box, *label, *ic, *button; + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); + popup = elm_popup_add(sb->ephoto->win); elm_object_part_text_set(popup, "title,text", _("Reset Image")); - elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); box = elm_box_add(popup); elm_box_horizontal_set(box, EINA_FALSE); @@ -797,7 +904,8 @@ _reset_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNU evas_object_show(box); label = elm_label_add(box); - elm_object_text_set(label, _("Are you sure you want to reset your changes?")); + elm_object_text_set(label, + _("Are you sure you want to reset your changes?")); evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(box, label); @@ -837,6 +945,9 @@ _failed_save(Ephoto_Single_Browser *sb) { Evas_Object *popup, *box, *label, *ic, *button; + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); + popup = elm_popup_add(sb->ephoto->win); elm_object_part_text_set(popup, "title,text", _("Save Failed")); elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); @@ -872,43 +983,69 @@ _failed_save(Ephoto_Single_Browser *sb) } static void -_save_yes(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_save_yes(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); Eina_Bool success; + if (ecore_file_exists(sb->entry->path)) { - success = ecore_file_unlink(sb->entry->path); - if (!success) - { - _failed_save(sb); - ephoto_single_browser_entry_set(sb->main, sb->entry); - evas_object_del(popup); - return; - } + success = ecore_file_unlink(sb->entry->path); + if (!success) + { + _failed_save(sb); + ephoto_single_browser_entry_set(sb->main, sb->entry); + evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } + return; + } } - success = evas_object_image_save(elm_image_object_get(v->image), sb->entry->path, NULL, NULL); + success = + evas_object_image_save(elm_image_object_get(v->image), sb->entry->path, + NULL, NULL); if (!success) - _failed_save(sb); + _failed_save(sb); ephoto_single_browser_entry_set(sb->main, sb->entry); evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } } static void -_save_no(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_save_no(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; + Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); + evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } } static void -_save_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_save_image(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Evas_Object *popup, *box, *label, *ic, *button; + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); + popup = elm_popup_add(sb->ephoto->win); elm_object_part_text_set(popup, "title,text", _("Save Image")); elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); @@ -920,7 +1057,8 @@ _save_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUS evas_object_show(box); label = elm_label_add(box); - elm_object_text_set(label, _("Are you sure you want to overwrite this image?")); + elm_object_text_set(label, + _("Are you sure you want to overwrite this image?")); evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(box, label); @@ -956,36 +1094,52 @@ _save_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUS } static void -_save_image_as_overwrite(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_save_image_as_overwrite(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; const char *file = evas_object_data_get(popup, "file"); Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); Eina_Bool success; + if (ecore_file_exists(file)) { - success = ecore_file_unlink(file); - if (!success) - { - _failed_save(sb); - ephoto_single_browser_entry_set(sb->main, sb->entry); - evas_object_del(popup); - return; - } + success = ecore_file_unlink(file); + if (!success) + { + _failed_save(sb); + ephoto_single_browser_entry_set(sb->main, sb->entry); + evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } + return; + } } - success = evas_object_image_save(elm_image_object_get(v->image), file, NULL, NULL); + success = + evas_object_image_save(elm_image_object_get(v->image), file, NULL, NULL); if (!success) - _failed_save(sb); + _failed_save(sb); else { - char *dir = ecore_file_dir_get(file); - ephoto_directory_set(sb->ephoto, dir); - free(dir); - ephoto_single_browser_path_pending_set(sb->ephoto->single_browser, file); + char *dir = ecore_file_dir_get(file); + + ephoto_thumb_browser_fsel_clear(sb->ephoto); + ephoto_directory_set(sb->ephoto, dir, NULL, EINA_FALSE); + free(dir); + ephoto_single_browser_path_pending_set(sb->ephoto->single_browser, + file); } ephoto_single_browser_entry_set(sb->main, sb->entry); evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } } static void @@ -993,94 +1147,120 @@ _save_image_as_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { const char *selected = event_info; Evas_Object *opopup = data; + Ephoto_Single_Browser *sb = evas_object_data_get(opopup, "single_browser"); if (selected) { - Ephoto_Single_Browser *sb = evas_object_data_get(opopup, "single_browser"); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - Eina_Bool success; + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + Eina_Bool success; - char buf[PATH_MAX]; - if (!evas_object_image_extension_can_load_get(selected)) - snprintf(buf, PATH_MAX, "%s.jpg", selected); + char buf[PATH_MAX]; + + if (!evas_object_image_extension_can_load_get(selected)) + snprintf(buf, PATH_MAX, "%s.jpg", selected); + else + snprintf(buf, PATH_MAX, "%s", selected); + if (ecore_file_exists(buf)) + { + Evas_Object *popup, *box, *label, *ic, *button; + + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); + + popup = elm_popup_add(sb->ephoto->win); + elm_object_part_text_set(popup, "title,text", _("Overwite Image")); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + + box = elm_box_add(popup); + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_show(box); + + label = elm_label_add(box); + elm_object_text_set(label, + _("Are you sure you want to overwrite this image?")); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_box_pack_end(box, label); + evas_object_show(label); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", + _save_image_as_overwrite, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _save_no, popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + + evas_object_data_set(popup, "single_browser", sb); + evas_object_data_set(popup, "file", strdup(buf)); + elm_object_part_content_set(popup, "default", box); + evas_object_show(popup); + } else - snprintf(buf, PATH_MAX, "%s", selected); - if (ecore_file_exists(buf)) - { - Evas_Object *popup, *box, *label, *ic, *button; + { + success = + evas_object_image_save(elm_image_object_get(v->image), buf, + NULL, NULL); + if (!success) + _failed_save(sb); + else + { + char *dir = ecore_file_dir_get(buf); - popup = elm_popup_add(sb->ephoto->win); - elm_object_part_text_set(popup, "title,text", _("Overwite Image")); - elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); - - box = elm_box_add(popup); - elm_box_horizontal_set(box, EINA_FALSE); - evas_object_size_hint_weight_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(box); - - label = elm_label_add(box); - elm_object_text_set(label, _("Are you sure you want to overwrite this image?")); - evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_box_pack_end(box, label); - evas_object_show(label); - - ic = elm_icon_add(popup); - elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); - evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); - elm_icon_standard_set(ic, "document-save"); - - button = elm_button_add(popup); - elm_object_text_set(button, _("Yes")); - elm_object_part_content_set(button, "icon", ic); - evas_object_smart_callback_add(button, "clicked", _save_image_as_overwrite, popup); - elm_object_part_content_set(popup, "button1", button); - evas_object_show(button); - - ic = elm_icon_add(popup); - elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); - evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); - elm_icon_standard_set(ic, "window-close"); - - button = elm_button_add(popup); - elm_object_text_set(button, _("No")); - elm_object_part_content_set(button, "icon", ic); - evas_object_smart_callback_add(button, "clicked", _save_no, popup); - elm_object_part_content_set(popup, "button2", button); - evas_object_show(button); - - evas_object_data_set(popup, "single_browser", sb); - evas_object_data_set(popup, "file", strdup(buf)); - elm_object_part_content_set(popup, "default", box); - evas_object_show(popup); - } - else - { - success = evas_object_image_save(elm_image_object_get(v->image), buf, NULL, NULL); - if (!success) - _failed_save(sb); - else - { - char *dir = ecore_file_dir_get(buf); - ephoto_directory_set(sb->ephoto, dir); - free(dir); - ephoto_single_browser_path_pending_set(sb->ephoto->single_browser, buf); - } - } + ephoto_thumb_browser_fsel_clear(sb->ephoto); + ephoto_directory_set(sb->ephoto, dir, NULL, EINA_FALSE); + free(dir); + ephoto_single_browser_path_pending_set(sb->ephoto-> + single_browser, buf); + } + } } evas_object_del(opopup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } } static void -_save_image_as(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_save_image_as(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; - Evas_Object *popup, *frame, *fsel, *rect, *table; + Evas_Object *popup, *fsel, *rect, *table; int h; evas_object_geometry_get(sb->ephoto->win, 0, 0, 0, &h); + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); + popup = elm_popup_add(sb->ephoto->win); elm_popup_scrollable_set(popup, EINA_TRUE); elm_object_part_text_set(popup, "title,text", _("Save Image As")); @@ -1090,9 +1270,8 @@ _save_image_as(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_U evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); - rect = evas_object_rectangle_add(evas_object_evas_get(popup)); - evas_object_color_set(rect, 0, 0, 0, 0); - evas_object_size_hint_min_set(rect, 0, h/1.5); + rect = elm_box_add(popup); + evas_object_size_hint_min_set(rect, 0, h / 1.5); evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_fill_set(rect, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_table_pack(table, rect, 0, 0, 1, 1); @@ -1117,21 +1296,30 @@ _save_image_as(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_U } static void -_upload_image_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_upload_image_cancel(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; + Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); + evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } } static void -_upload_entry_anchor_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_upload_entry_anchor_bt(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { char buf[PATH_MAX]; Evas_Object *av = data; + const char *link = evas_object_data_get(av, "link"); elm_entry_anchor_hover_end(av); - snprintf(buf, PATH_MAX, "xdg-open %s", evas_object_data_get(av, "link")); - printf("%s\n", buf); + snprintf(buf, PATH_MAX, "xdg-open %s", link); ecore_exe_run(buf, NULL); } @@ -1145,20 +1333,22 @@ _upload_entry_anchor(void *data, Evas_Object *obj, void *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", _upload_entry_anchor_bt, av); + evas_object_smart_callback_add(button, "clicked", _upload_entry_anchor_bt, + av); evas_object_show(button); } - static void -_upload_image_url_copy(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +_upload_image_url_copy(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *entry = data; + elm_entry_select_all(entry); elm_entry_selection_copy(entry); elm_entry_select_none(entry); } - + static Eina_Bool _upload_image_complete_cb(void *data, int ev_type EINA_UNUSED, void *event) { @@ -1168,9 +1358,18 @@ _upload_image_complete_cb(void *data, int ev_type EINA_UNUSED, void *event) Ecore_Event_Handler *handler; Evas_Object *popup, *box, *hbox, *label, *entry, *ic, *button; - if (ev->url_con != sb->url_up) return ECORE_CALLBACK_RENEW; + if (ev->url_con != sb->url_up) + return ECORE_CALLBACK_RENEW; evas_object_del(ppopup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } + + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); popup = elm_popup_add(sb->ephoto->win); elm_object_part_text_set(popup, "title,text", _("Image Uploaded")); @@ -1201,10 +1400,12 @@ _upload_image_complete_cb(void *data, int ev_type EINA_UNUSED, void *event) elm_entry_editable_set(entry, EINA_TRUE); elm_entry_scrollable_set(entry, EINA_TRUE); elm_entry_context_menu_disabled_set(entry, EINA_TRUE); - elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_smart_callback_add(entry, "anchor,hover,opened", _upload_entry_anchor, entry); + evas_object_smart_callback_add(entry, "anchor,hover,opened", + _upload_entry_anchor, entry); elm_box_pack_end(hbox, entry); evas_object_show(entry); @@ -1215,7 +1416,8 @@ _upload_image_complete_cb(void *data, int ev_type EINA_UNUSED, void *event) button = elm_button_add(hbox); elm_object_part_content_set(button, "icon", ic); - evas_object_smart_callback_add(button, "clicked", _upload_image_url_copy, entry); + evas_object_smart_callback_add(button, "clicked", _upload_image_url_copy, + entry); elm_box_pack_end(hbox, button); evas_object_show(button); @@ -1227,7 +1429,8 @@ _upload_image_complete_cb(void *data, int ev_type EINA_UNUSED, void *event) button = elm_button_add(popup); elm_object_text_set(button, _("Ok")); elm_object_part_content_set(button, "icon", ic); - evas_object_smart_callback_add(button, "clicked", _upload_image_cancel, popup); + evas_object_smart_callback_add(button, "clicked", _upload_image_cancel, + popup); elm_object_part_content_set(popup, "button1", button); evas_object_show(button); @@ -1235,53 +1438,59 @@ _upload_image_complete_cb(void *data, int ev_type EINA_UNUSED, void *event) elm_object_part_content_set(popup, "default", box); evas_object_show(popup); - EINA_LIST_FREE(sb->upload_handlers, handler) - ecore_event_handler_del(handler); + EINA_LIST_FREE(sb->upload_handlers, + handler) ecore_event_handler_del(handler); - if (!sb->url_ret || ev->status != 200) + if (!sb->url_ret || ev->status != 200) { - elm_object_text_set(label, _("There was an error uploading your image!")); - elm_entry_single_line_set(entry, EINA_TRUE); - elm_object_text_set(entry, sb->upload_error); - evas_object_show(popup); - ecore_con_url_free(sb->url_up); - sb->url_up = NULL; - free(sb->upload_error); - sb->upload_error = NULL; - return EINA_FALSE; + elm_object_text_set(label, + _("There was an error uploading your image!")); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_object_text_set(entry, sb->upload_error); + evas_object_show(popup); + ecore_con_url_free(sb->url_up); + sb->url_up = NULL; + free(sb->upload_error); + sb->upload_error = NULL; + return EINA_FALSE; } else { - char buf[PATH_MAX], link[PATH_MAX]; - snprintf(buf, PATH_MAX, "%s", sb->url_ret, sb->url_ret); - snprintf(link, PATH_MAX, "%s", sb->url_ret); - evas_object_data_set(entry, "link", strdup(link)); - elm_object_text_set(label, _("Your image was uploaded to the following link:")); - elm_entry_single_line_set(entry, EINA_TRUE); - elm_object_text_set(entry, buf); - evas_object_show(popup); - ecore_con_url_free(sb->url_up); - sb->url_up = NULL; - free(sb->url_ret); - sb->url_ret = NULL; - return ECORE_CALLBACK_RENEW; + char buf[PATH_MAX], link[PATH_MAX]; + + snprintf(buf, PATH_MAX, "%s", + sb->url_ret, sb->url_ret); + snprintf(link, PATH_MAX, "%s", sb->url_ret); + evas_object_data_set(entry, "link", strdup(link)); + elm_object_text_set(label, + _("Your image was uploaded to the following link:")); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_object_text_set(entry, buf); + evas_object_show(popup); + ecore_con_url_free(sb->url_up); + sb->url_up = NULL; + free(sb->url_ret); + sb->url_ret = NULL; + return ECORE_CALLBACK_RENEW; } } static Eina_Bool -_upload_image_xml_parse(void *data, Eina_Simple_XML_Type type, const char *content, unsigned offset EINA_UNUSED, unsigned length EINA_UNUSED) +_upload_image_xml_parse(void *data, Eina_Simple_XML_Type type, + const char *content, unsigned offset EINA_UNUSED, + unsigned length EINA_UNUSED) { Ephoto_Single_Browser *sb = data; char *linkf, *linkl; - + if (type == EINA_SIMPLE_XML_OPEN) { - if (!strncmp("link>", content, strlen("link>"))) - { - linkf = strchr(content, '>')+1; - linkl = strtok(linkf, "<"); - sb->url_ret = strdup(linkl); - } + if (!strncmp("link>", content, strlen("link>"))) + { + linkf = strchr(content, '>') + 1; + linkl = strtok(linkf, "<"); + sb->url_ret = strdup(linkl); + } } return EINA_TRUE; } @@ -1291,15 +1500,21 @@ _upload_image_cb(void *data, int ev_type EINA_UNUSED, void *event) { Ephoto_Single_Browser *sb = data; Ecore_Con_Event_Url_Data *ev = event; + const char *string = (const char *) ev->data; + + if (ev->url_con != sb->url_up) + return EINA_TRUE; + eina_simple_xml_parse(string, strlen(string) + 1, EINA_TRUE, + _upload_image_xml_parse, sb); + if (!sb->url_ret) + sb->upload_error = strdup(string); - if (ev->url_con != sb->url_up) return EINA_TRUE; - eina_simple_xml_parse(ev->data, strlen(ev->data)+1, EINA_TRUE, _upload_image_xml_parse, sb); - if (!sb->url_ret) sb->upload_error = strdup(ev->data); return EINA_FALSE; } static void -_upload_image_confirm(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_upload_image_confirm(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *ppopup = data; Evas_Object *popup, *box, *label, *pb; @@ -1310,9 +1525,17 @@ _upload_image_confirm(void *data, Evas_Object *obj EINA_UNUSED, void *event_info int fsize; evas_object_del(ppopup); - + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } + + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); + popup = elm_popup_add(sb->ephoto->win); - elm_object_part_text_set(popup, "title,text", _("Uploading...")); + elm_object_part_text_set(popup, "title,text", _("Upload Image")); elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); box = elm_box_add(popup); @@ -1322,11 +1545,11 @@ _upload_image_confirm(void *data, Evas_Object *obj EINA_UNUSED, void *event_info evas_object_show(box); label = elm_label_add(box); - elm_object_text_set(label, _("Please wait while your image is uploaded...")); + elm_object_text_set(label, _("Please wait while your image is uploaded.")); evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(box, label); - evas_object_show(label); + evas_object_show(label); pb = elm_progressbar_add(box); evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); @@ -1343,23 +1566,26 @@ _upload_image_confirm(void *data, Evas_Object *obj EINA_UNUSED, void *event_info if (sb->edited_image_data) { - const char *ext = strrchr(sb->entry->path, '.'); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - Eina_Bool success; + const char *ext = strrchr(sb->entry->path, '.'); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + Eina_Bool success; - ext++; - snprintf(tmp_path, PATH_MAX, "%s/.config/ephoto/tmp.%s", getenv("HOME"), ext); - success = evas_object_image_save(elm_image_object_get(v->image), tmp_path, NULL, NULL); - if (!success) - { - _failed_save(sb); - return; - } - f = fopen(tmp_path, "rb"); + ext++; + snprintf(tmp_path, PATH_MAX, "%s/.config/ephoto/tmp.%s", getenv("HOME"), + ext); + success = + evas_object_image_save(elm_image_object_get(v->image), tmp_path, + NULL, NULL); + if (!success) + { + _failed_save(sb); + return; + } + f = fopen(tmp_path, "rb"); } else { - f = fopen(sb->entry->path, "rb"); + f = fopen(sb->entry->path, "rb"); } fseek(f, 0, SEEK_END); fsize = ftell(f); @@ -1368,30 +1594,36 @@ _upload_image_confirm(void *data, Evas_Object *obj EINA_UNUSED, void *event_info fread(fdata, fsize, 1, f); fclose(f); - if (sb->edited_image_data && tmp_path) - ecore_file_unlink(tmp_path); + if (sb->edited_image_data) + ecore_file_unlink(tmp_path); - snprintf(buf, PATH_MAX, "image=%u", fdata); + snprintf(buf, PATH_MAX, "image=%s", fdata); + + sb->upload_handlers = + eina_list_append(sb->upload_handlers, + ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA, _upload_image_cb, sb)); + sb->upload_handlers = + eina_list_append(sb->upload_handlers, + ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, + _upload_image_complete_cb, popup)); - sb->upload_handlers = eina_list_append - (sb->upload_handlers, ecore_event_handler_add - (ECORE_CON_EVENT_URL_DATA, _upload_image_cb, sb)); - sb->upload_handlers = eina_list_append - (sb->upload_handlers, ecore_event_handler_add - (ECORE_CON_EVENT_URL_COMPLETE, _upload_image_complete_cb, popup)); - sb->url_up = ecore_con_url_new("https://api.imgur.com/3/image.xml"); - ecore_con_url_additional_header_add(sb->url_up, "Authorization", "Client-ID 67aecc7e6662370"); + ecore_con_url_additional_header_add(sb->url_up, "Authorization", + "Client-ID 67aecc7e6662370"); ecore_con_url_http_version_set(sb->url_up, ECORE_CON_URL_HTTP_VERSION_1_0); ecore_con_url_post(sb->url_up, fdata, fsize, NULL); } static void -_upload_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_upload_image(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Evas_Object *popup, *box, *label, *ic, *button; + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); + popup = elm_popup_add(sb->ephoto->win); elm_object_part_text_set(popup, "title,text", _("Upload Image")); elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); @@ -1403,7 +1635,9 @@ _upload_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UN evas_object_show(box); label = elm_label_add(box); - elm_object_text_set(label, _("Are you sure you want to upload this image publically to imgur.com?")); + elm_object_text_set(label, + _ + ("Are you sure you want to upload this image publically to imgur.com?")); evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(box, label); @@ -1417,7 +1651,8 @@ _upload_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UN button = elm_button_add(popup); elm_object_text_set(button, _("Yes")); elm_object_part_content_set(button, "icon", ic); - evas_object_smart_callback_add(button, "clicked", _upload_image_confirm, popup); + evas_object_smart_callback_add(button, "clicked", _upload_image_confirm, + popup); elm_object_part_content_set(popup, "button1", button); evas_object_show(button); @@ -1429,7 +1664,8 @@ _upload_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UN button = elm_button_add(popup); elm_object_text_set(button, _("No")); elm_object_part_content_set(button, "icon", ic); - evas_object_smart_callback_add(button, "clicked", _upload_image_cancel, popup); + evas_object_smart_callback_add(button, "clicked", _upload_image_cancel, + popup); elm_object_part_content_set(popup, "button2", button); evas_object_show(button); @@ -1439,74 +1675,93 @@ _upload_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UN } static void -_go_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_first(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + _first_entry(sb); } static void -_go_prev(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_prev(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + _prev_entry(sb); } static void -_go_next(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_next(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + _next_entry(sb); } static void -_go_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_last(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + _last_entry(sb); } static void -_go_rotate_counterclock(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_rotate_counterclock(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + _rotate_counterclock(sb); } static void -_go_rotate_clock(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_rotate_clock(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + _rotate_clock(sb); } static void -_go_flip_horiz(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_flip_horiz(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + _flip_horiz(sb); } static void -_go_flip_vert(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_flip_vert(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + _flip_vert(sb); } static void -_crop_image(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_crop_image(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - sb->cropping = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - elm_table_unpack(v->table, v->image); - ephoto_cropper_add(sb->main, sb->mhbox, v->table, v->image); + sb->editing = EINA_TRUE; + sb->cropping = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + elm_table_unpack(v->table, v->image); + ephoto_cropper_add(sb->main, sb->mhbox, v->table, v->image); } } @@ -1514,13 +1769,15 @@ static void _go_bcg(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - ephoto_bcg_add(sb->main, sb->mhbox, v->image); + sb->editing = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + ephoto_bcg_add(sb->main, sb->mhbox, v->image); } } @@ -1528,117 +1785,153 @@ static void _go_hsv(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - ephoto_hsv_add(sb->main, sb->mhbox, v->image); + sb->editing = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + ephoto_hsv_add(sb->main, sb->mhbox, v->image); } } static void -_go_color(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_color(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - ephoto_color_add(sb->main, sb->mhbox, v->image); + sb->editing = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + ephoto_color_add(sb->main, sb->mhbox, v->image); } } static void -_go_auto_eq(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_auto_eq(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - ephoto_filter_histogram_eq(sb->main, v->image); + sb->editing = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + ephoto_filter_histogram_eq(sb->main, v->image); } } static void -_go_blur(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_blur(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - ephoto_filter_blur(sb->main, v->image); + sb->editing = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + ephoto_filter_blur(sb->main, v->image); } } static void -_go_sharpen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_sharpen(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - ephoto_filter_sharpen(sb->main, v->image); + sb->editing = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + ephoto_filter_sharpen(sb->main, v->image); } } static void -_go_black_and_white(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_black_and_white(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - ephoto_filter_black_and_white(sb->main, v->image); + sb->editing = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + ephoto_filter_black_and_white(sb->main, v->image); } } static void -_go_old_photo(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_go_old_photo(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->viewer) { - sb->editing = EINA_TRUE; - elm_object_disabled_set(sb->bar, EINA_TRUE); - evas_object_freeze_events_set(sb->bar, EINA_TRUE); - Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - ephoto_filter_old_photo(sb->main, v->image); + sb->editing = EINA_TRUE; + elm_object_disabled_set(sb->bar, EINA_TRUE); + evas_object_freeze_events_set(sb->bar, EINA_TRUE); + Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); + + ephoto_filter_old_photo(sb->main, v->image); } } static void -_slideshow(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_slideshow(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + if (sb->entry) - evas_object_smart_callback_call(sb->main, "slideshow", sb->entry); + { + if (sb->event) + { + evas_object_del(sb->event); + sb->event = NULL; + } + evas_object_smart_callback_call(sb->main, "slideshow", sb->entry); + } } static void _back(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + + if (sb->event) + { + evas_object_del(sb->event); + sb->event = NULL; + } evas_object_smart_callback_call(sb->main, "back", sb->entry); } static void -_general_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_general_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); @@ -1647,7 +1940,8 @@ _general_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EIN } static void -_slideshow_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_slideshow_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); @@ -1656,7 +1950,8 @@ _slideshow_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info E } static void -_about_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_about_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); @@ -1665,19 +1960,30 @@ _about_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_ } static void -_close_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_close_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; + Ephoto_Single_Browser *sb = evas_object_data_get(popup, "single_browser"); evas_object_del(popup); + if (sb->event) + { + elm_object_focus_set(sb->event, EINA_TRUE); + evas_object_freeze_events_set(sb->event, EINA_FALSE); + } } static void -_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Evas_Object *popup, *list, *button, *ic; + if (sb->event) + evas_object_freeze_events_set(sb->event, EINA_TRUE); + popup = elm_popup_add(sb->ephoto->win); elm_popup_scrollable_set(popup, EINA_TRUE); elm_object_part_text_set(popup, "title,text", _("Settings Panel")); @@ -1694,7 +2000,7 @@ _settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED elm_icon_standard_set(ic, "preferences-system"); evas_object_show(ic); elm_list_item_append(list, _("General Settings"), ic, NULL, - _general_settings, popup); + _general_settings, popup); ic = elm_icon_add(list); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); @@ -1702,15 +2008,15 @@ _settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED elm_icon_standard_set(ic, "media-playback-start"); evas_object_show(ic); elm_list_item_append(list, _("Slideshow Settings"), ic, NULL, - _slideshow_settings, popup); + _slideshow_settings, popup); ic = elm_icon_add(list); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "help-about"); evas_object_show(ic); - elm_list_item_append(list, _("About Ephoto"), ic, NULL, - _about_settings, popup); + elm_list_item_append(list, _("About Ephoto"), ic, NULL, _about_settings, + popup); ic = elm_icon_add(popup); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); @@ -1733,7 +2039,8 @@ _settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED } static void -_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) { Ephoto_Single_Browser *sb = data; Evas_Event_Key_Down *ev = event_info; @@ -1741,77 +2048,102 @@ _key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e Eina_Bool shift = evas_key_modifier_is_set(ev->modifiers, "Shift"); const char *k = ev->keyname; - DBG("key pressed '%s'", k); if (ctrl) { - if ((!strcmp(k, "plus")) || (!strcmp(k, "equal"))) - _zoom_in(sb); - else if (!strcmp(k, "minus")) - _zoom_out(sb); - else if (!strcmp(k, "0")) - { - if (shift) _zoom_fit(sb); - else _zoom_set(sb, 1.0); - } - return; + if ((!strcmp(k, "plus")) || (!strcmp(k, "equal"))) + _zoom_in(sb); + else if (!strcmp(k, "minus")) + _zoom_out(sb); + else if (!strcmp(k, "0")) + { + if (shift) + _zoom_fit(sb); + else + _zoom_set(sb, 1.0); + } + return; } if (!strcmp(k, "Escape") && !sb->editing) - evas_object_smart_callback_call(sb->main, "back", sb->entry); -// else if (!strcmp(k, "Return")) + { + if (sb->event) + { + evas_object_del(sb->event); + sb->event = NULL; + } + evas_object_smart_callback_call(sb->main, "back", sb->entry); + } else if (!strcmp(k, "Left") && !sb->editing) - _prev_entry(sb); + _prev_entry(sb); else if (!strcmp(k, "Right") && !sb->editing) - _next_entry(sb); + _next_entry(sb); else if (!strcmp(k, "Home") && !sb->editing) - _first_entry(sb); + _first_entry(sb); else if (!strcmp(k, "End") && !sb->editing) - _last_entry(sb); + _last_entry(sb); else if (!strcmp(k, "bracketleft") && !sb->editing) { - if (!shift) _rotate_counterclock(sb); - else _flip_horiz(sb); + if (!shift) + _rotate_counterclock(sb); + else + _flip_horiz(sb); } else if (!strcmp(k, "bracketright") && !sb->editing) { - if (!shift) _rotate_clock(sb); - else _flip_vert(sb); + if (!shift) + _rotate_clock(sb); + else + _flip_vert(sb); + } + else if (!strcmp(k, "F2")) + { + _settings(sb, NULL, NULL); } else if (!strcmp(k, "F5") && !sb->editing) { - if (sb->entry) - evas_object_smart_callback_call(sb->main, "slideshow", sb->entry); + if (sb->entry) + { + if (sb->event) + { + evas_object_del(sb->event); + sb->event = NULL; + } + evas_object_smart_callback_call(sb->main, "slideshow", sb->entry); + } } else if (!strcmp(k, "F11")) { - Evas_Object *win = sb->ephoto->win; - - if (!elm_win_fullscreen_get(sb->ephoto->win)) - { - if (sb->ephoto->config->tool_hide) - { - evas_object_hide(sb->bar); - elm_box_unpack(sb->main, sb->bar); - evas_object_hide(sb->botbox); - elm_table_unpack(sb->table, sb->botbox); - evas_object_hide(sb->infolabel); - elm_table_unpack(sb->table, sb->infolabel); - } - } + Evas_Object *win = sb->ephoto->win; + + if (!elm_win_fullscreen_get(sb->ephoto->win)) + { + if (sb->ephoto->config->tool_hide) + { + evas_object_hide(sb->bar); + elm_box_unpack(sb->tbox, sb->bar); + evas_object_hide(sb->tbox); + elm_box_unpack(sb->main, sb->tbox); + evas_object_hide(sb->botbox); + elm_table_unpack(sb->table, sb->botbox); + evas_object_hide(sb->infolabel); + elm_table_unpack(sb->table, sb->infolabel); + } + } else - { - if (!evas_object_visible_get(sb->bar)) - { - elm_box_pack_start(sb->main, sb->bar); - evas_object_show(sb->bar); - elm_table_pack(sb->table, sb->botbox, 0, 2, 4, 1); - evas_object_show(sb->botbox); - elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); - evas_object_show(sb->infolabel); - } - } - elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); - elm_object_focus_set(sb->main, EINA_TRUE); + { + if (!evas_object_visible_get(sb->bar)) + { + elm_box_pack_start(sb->main, sb->tbox); + evas_object_show(sb->tbox); + elm_box_pack_start(sb->tbox, sb->bar); + evas_object_show(sb->bar); + elm_table_pack(sb->table, sb->botbox, 0, 2, 4, 1); + evas_object_show(sb->botbox); + elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); + evas_object_show(sb->infolabel); + } + } + elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); } } @@ -1819,11 +2151,13 @@ static void _entry_free(void *data, const Ephoto_Entry *entry EINA_UNUSED) { Ephoto_Single_Browser *sb = data; + sb->entry = NULL; } static void -_main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { char tmp_path[PATH_MAX]; Ephoto_Single_Browser *sb = data; @@ -1831,42 +2165,44 @@ _main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e Eina_Iterator *tmps; Eina_File_Direct_Info *info; - EINA_LIST_FREE(sb->handlers, handler) - ecore_event_handler_del(handler); + EINA_LIST_FREE(sb->handlers, handler) ecore_event_handler_del(handler); if (sb->upload_handlers) { - EINA_LIST_FREE(sb->upload_handlers, handler) - ecore_event_handler_del(handler); + EINA_LIST_FREE(sb->upload_handlers, + handler) ecore_event_handler_del(handler); } if (sb->entry) - ephoto_entry_free_listener_del(sb->entry, _entry_free, sb); + ephoto_entry_free_listener_del(sb->entry, _entry_free, sb); if (sb->pending_path) - eina_stringshare_del(sb->pending_path); + eina_stringshare_del(sb->pending_path); snprintf(tmp_path, PATH_MAX, "%s/.config/ephoto/", getenv("HOME")); tmps = eina_file_stat_ls(tmp_path); EINA_ITERATOR_FOREACH(tmps, info) - { - const char *bname = info->path + info->name_start; - if (!strncmp(bname, "tmp", 3)) - ecore_file_unlink(info->path); - } + { + const char *bname = info->path + info->name_start; + + if (!strncmp(bname, "tmp", 3)) + ecore_file_unlink(info->path); + } if (sb->url_up) - ecore_con_url_free(sb->url_up); + ecore_con_url_free(sb->url_up); if (sb->url_ret) - free(sb->url_ret); + free(sb->url_ret); if (sb->upload_error) - free(sb->upload_error); + free(sb->upload_error); free(sb); } static Eina_Bool -_ephoto_single_populate_end(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) +_ephoto_single_populate_end(void *data EINA_UNUSED, int type EINA_UNUSED, + void *event EINA_UNUSED) { return ECORE_CALLBACK_PASS_ON; } static Eina_Bool -_ephoto_single_entry_create(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) +_ephoto_single_entry_create(void *data, int type EINA_UNUSED, + void *event EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Ephoto_Event_Entry_Create *ev = event; @@ -1875,16 +2211,27 @@ _ephoto_single_entry_create(void *data, int type EINA_UNUSED, void *event EINA_U e = ev->entry; if (!sb->entry && sb->pending_path && e->path == sb->pending_path) { - DBG("Adding entry %p for path %s", e, sb->pending_path); - - eina_stringshare_del(sb->pending_path); - sb->pending_path = NULL; - ephoto_single_browser_entry_set(sb->ephoto->single_browser, e); + eina_stringshare_del(sb->pending_path); + sb->pending_path = NULL; + ephoto_single_browser_entry_set(sb->ephoto->single_browser, e); } return ECORE_CALLBACK_PASS_ON; } +static void +_main_focused(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Ephoto_Single_Browser *sb = data; + + if (sb->ephoto->state == EPHOTO_STATE_SINGLE) + { + if (sb->event) + elm_object_focus_set(sb->event, EINA_TRUE); + } +} + Evas_Object * ephoto_single_browser_add(Ephoto *ephoto, Evas_Object *parent) { @@ -1903,104 +2250,150 @@ ephoto_single_browser_add(Ephoto *ephoto, Evas_Object *parent) sb->cropping = EINA_FALSE; sb->main = box; - elm_box_horizontal_set(box, EINA_FALSE); - evas_object_size_hint_weight_set(sb->main, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(sb->main, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(sb->main, EINA_FALSE); + elm_object_tree_focus_allow_set(sb->main, EINA_FALSE); evas_object_event_callback_add(sb->main, EVAS_CALLBACK_DEL, _main_del, sb); - evas_object_event_callback_add - (sb->main, EVAS_CALLBACK_KEY_DOWN, _key_down, sb); + evas_object_event_callback_add(sb->ephoto->win, EVAS_CALLBACK_FOCUS_IN, + _main_focused, sb); + evas_object_size_hint_weight_set(sb->main, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sb->main, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_data_set(sb->main, "single_browser", sb); + sb->tbox = elm_box_add(sb->main); + evas_object_size_hint_weight_set(sb->tbox, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sb->tbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_tree_focus_allow_set(sb->tbox, EINA_FALSE); + elm_box_pack_end(sb->main, sb->tbox); + evas_object_show(sb->tbox); + sb->bar = elm_toolbar_add(sb->ephoto->win); - EINA_SAFETY_ON_NULL_GOTO(sb->bar, error); elm_toolbar_horizontal_set(sb->bar, EINA_TRUE); elm_toolbar_homogeneous_set(sb->bar, EINA_TRUE); elm_toolbar_shrink_mode_set(sb->bar, ELM_TOOLBAR_SHRINK_SCROLL); + elm_object_tree_focus_allow_set(sb->bar, EINA_FALSE); elm_toolbar_select_mode_set(sb->bar, ELM_OBJECT_SELECT_MODE_NONE); elm_toolbar_icon_order_lookup_set(sb->bar, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_weight_set(sb->bar, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(sb->bar, EVAS_HINT_FILL, EVAS_HINT_FILL); icon = elm_toolbar_item_append(sb->bar, "go-home", _("Back"), _back, sb); - icon = elm_toolbar_item_append(sb->bar, "image-x-generic", _("Edit"), NULL, NULL); + icon = + elm_toolbar_item_append(sb->bar, "image-x-generic", _("Edit"), NULL, + NULL); elm_toolbar_item_menu_set(icon, EINA_TRUE); elm_toolbar_menu_parent_set(sb->bar, sb->ephoto->win); menu = elm_toolbar_item_menu_get(icon); elm_menu_item_add(menu, NULL, "edit-undo", _("Reset"), _reset_image, sb); elm_menu_item_add(menu, NULL, "document-save", _("Save"), _save_image, sb); - elm_menu_item_add(menu, NULL, "document-save-as", _("Save As"), _save_image_as, sb); - elm_menu_item_add(menu, NULL, "document-send", _("Upload"), _upload_image, sb); + elm_menu_item_add(menu, NULL, "document-save-as", _("Save As"), + _save_image_as, sb); + elm_menu_item_add(menu, NULL, "document-send", _("Upload"), _upload_image, + sb); elm_menu_item_separator_add(menu, NULL); - menu_it = elm_menu_item_add(menu, NULL, "document-properties", _("Transform"), NULL, NULL); + + menu_it = + elm_menu_item_add(menu, NULL, "document-properties", _("Transform"), + NULL, NULL); elm_menu_item_add(menu, menu_it, "edit-cut", _("Crop"), _crop_image, sb); elm_menu_item_separator_add(menu, menu_it); - elm_menu_item_add(menu, menu_it, "object-rotate-left", _("Rotate Left"), _go_rotate_counterclock, sb); - elm_menu_item_add(menu, menu_it, "object-rotate-right", _("Rotate Right"), _go_rotate_clock, sb); - elm_menu_item_add(menu, menu_it, "object-flip-horizontal", _("Flip Horizontal"), _go_flip_horiz, sb); - elm_menu_item_add(menu, menu_it, "object-flip-vertical", _("Flip Vertical"), _go_flip_vert, sb); + elm_menu_item_add(menu, menu_it, "object-rotate-left", _("Rotate Left"), + _go_rotate_counterclock, sb); + elm_menu_item_add(menu, menu_it, "object-rotate-right", _("Rotate Right"), + _go_rotate_clock, sb); + elm_menu_item_add(menu, menu_it, "object-flip-horizontal", + _("Flip Horizontal"), _go_flip_horiz, sb); + elm_menu_item_add(menu, menu_it, "object-flip-vertical", _("Flip Vertical"), + _go_flip_vert, sb); elm_menu_item_separator_add(menu, NULL); - menu_it = elm_menu_item_add(menu, NULL, "document-properties", _("Color"), NULL, NULL); - elm_menu_item_add(menu, menu_it, "insert-image", _("Auto Equalize"), _go_auto_eq, sb); - elm_menu_item_separator_add(menu, menu_it); - elm_menu_item_add(menu, menu_it, "insert-image", _("Brightness/Contrast/Gamma"), _go_bcg, sb); - elm_menu_item_add(menu, menu_it, "insert-image", _("Hue/Saturation/Value"), _go_hsv, sb); - elm_menu_item_add(menu, menu_it, "insert-image", _("Color Levels"), _go_color, sb); - menu_it = elm_menu_item_add(menu, NULL, "document-properties", _("Filters"), NULL, NULL); - elm_menu_item_add(menu, menu_it, "insert-image", _("Blur"), _go_blur, sb); - elm_menu_item_add(menu, menu_it, "insert-image", _("Sharpen"), _go_sharpen, sb); - elm_menu_item_separator_add(menu, menu_it); - elm_menu_item_add(menu, menu_it, "insert-image", _("Black and White"), _go_black_and_white, sb); - elm_menu_item_add(menu, menu_it, "insert-image", _("Old Photo"), _go_old_photo, sb); - /*FIXME: Use separators once they don't mess up homogeneous toolbar*/ - //elm_toolbar_item_separator_set(elm_toolbar_item_append(sb->bar, NULL, NULL, NULL, NULL), EINA_TRUE); - icon = elm_toolbar_item_append(sb->bar, "go-first", _("First"), _go_first, sb); - icon = elm_toolbar_item_append(sb->bar, "go-previous", _("Previous"), _go_prev, sb); + menu_it = + elm_menu_item_add(menu, NULL, "document-properties", _("Color"), NULL, + NULL); + elm_menu_item_add(menu, menu_it, "insert-image", _("Auto Equalize"), + _go_auto_eq, sb); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_add(menu, menu_it, "insert-image", + _("Brightness/Contrast/Gamma"), _go_bcg, sb); + elm_menu_item_add(menu, menu_it, "insert-image", _("Hue/Saturation/Value"), + _go_hsv, sb); + elm_menu_item_add(menu, menu_it, "insert-image", _("Color Levels"), + _go_color, sb); + + menu_it = + elm_menu_item_add(menu, NULL, "document-properties", _("Filters"), NULL, + NULL); + elm_menu_item_add(menu, menu_it, "insert-image", _("Blur"), _go_blur, sb); + elm_menu_item_add(menu, menu_it, "insert-image", _("Sharpen"), _go_sharpen, + sb); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_add(menu, menu_it, "insert-image", _("Black and White"), + _go_black_and_white, sb); + elm_menu_item_add(menu, menu_it, "insert-image", _("Old Photo"), + _go_old_photo, sb); + + icon = + elm_toolbar_item_append(sb->bar, "go-first", _("First"), _go_first, sb); + icon = + elm_toolbar_item_append(sb->bar, "go-previous", _("Previous"), _go_prev, + sb); icon = elm_toolbar_item_append(sb->bar, "go-next", _("Next"), _go_next, sb); icon = elm_toolbar_item_append(sb->bar, "go-last", _("Last"), _go_last, sb); - //elm_toolbar_item_separator_set(elm_toolbar_item_append(sb->bar, NULL, NULL, NULL, NULL), EINA_TRUE); + icon = + elm_toolbar_item_append(sb->bar, "zoom-in", _("Zoom In"), _zoom_in_cb, + sb); + icon = + elm_toolbar_item_append(sb->bar, "zoom-out", _("Zoom Out"), _zoom_out_cb, + sb); + icon = + elm_toolbar_item_append(sb->bar, "zoom-fit-best", _("Zoom Fit"), + _zoom_fit_cb, sb); + icon = + elm_toolbar_item_append(sb->bar, "zoom-original", _("Zoom 1:1"), + _zoom_1_cb, sb); - icon = elm_toolbar_item_append(sb->bar, "zoom-in", _("Zoom In"), _zoom_in_cb, sb); - icon = elm_toolbar_item_append(sb->bar, "zoom-out", _("Zoom Out"), _zoom_out_cb, sb); - icon = elm_toolbar_item_append(sb->bar, "zoom-fit-best", _("Zoom Fit"), _zoom_fit_cb, sb); - icon = elm_toolbar_item_append(sb->bar, "zoom-original", _("Zoom 1:1"), _zoom_1_cb, sb); + icon = + elm_toolbar_item_append(sb->bar, "media-playback-start", _("Slideshow"), + _slideshow, sb); + icon = + elm_toolbar_item_append(sb->bar, "preferences-system", _("Settings"), + _settings, sb); - //elm_toolbar_item_separator_set(elm_toolbar_item_append(sb->bar, NULL, NULL, NULL, NULL), EINA_TRUE); - - icon = elm_toolbar_item_append(sb->bar, "media-playback-start", _("Slideshow"), _slideshow, sb); - icon = elm_toolbar_item_append(sb->bar, "preferences-system", _("Settings"), _settings, sb); - - elm_box_pack_end(sb->main, sb->bar); + elm_box_pack_end(sb->tbox, sb->bar); evas_object_show(sb->bar); sb->mhbox = elm_box_add(sb->main); elm_box_horizontal_set(sb->mhbox, EINA_TRUE); - evas_object_size_hint_weight_set(sb->mhbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(sb->mhbox, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(sb->mhbox, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(sb->main, sb->mhbox); evas_object_show(sb->mhbox); sb->table = elm_table_add(sb->mhbox); - evas_object_size_hint_weight_set(sb->table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(sb->table, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(sb->table, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(sb->mhbox, sb->table); evas_object_show(sb->table); - sb->handlers = eina_list_append - (sb->handlers, ecore_event_handler_add - (EPHOTO_EVENT_POPULATE_END, _ephoto_single_populate_end, sb)); + sb->handlers = + eina_list_append(sb->handlers, + ecore_event_handler_add(EPHOTO_EVENT_POPULATE_END, + _ephoto_single_populate_end, sb)); - sb->handlers = eina_list_append - (sb->handlers, ecore_event_handler_add - (EPHOTO_EVENT_ENTRY_CREATE, _ephoto_single_entry_create, sb)); + sb->handlers = + eina_list_append(sb->handlers, + ecore_event_handler_add(EPHOTO_EVENT_ENTRY_CREATE, + _ephoto_single_entry_create, sb)); sb->orient = EPHOTO_ORIENT_0; return sb->main; - error: + error: evas_object_del(sb->main); return NULL; } @@ -2009,114 +2402,132 @@ void ephoto_single_browser_entry_set(Evas_Object *obj, Ephoto_Entry *entry) { Ephoto_Single_Browser *sb = evas_object_data_get(obj, "single_browser"); - EINA_SAFETY_ON_NULL_RETURN(sb); - - DBG("entry %p, was %p", entry, sb->entry); if (sb->entry) - ephoto_entry_free_listener_del(sb->entry, _entry_free, sb); + ephoto_entry_free_listener_del(sb->entry, _entry_free, sb); sb->entry = entry; if (entry) - ephoto_entry_free_listener_add(entry, _entry_free, sb); + ephoto_entry_free_listener_add(entry, _entry_free, sb); _ephoto_single_browser_recalc(sb); if (sb->edited_image_data) { - - sb->edited_image_data = NULL; - sb->ew = 0; - sb->eh = 0; + sb->edited_image_data = NULL; + sb->ew = 0; + sb->eh = 0; } if (sb->viewer) - _zoom_fit(sb); + _zoom_fit(sb); if (elm_win_fullscreen_get(sb->ephoto->win)) { - if (sb->ephoto->config->tool_hide) - { - evas_object_hide(sb->bar); - elm_box_unpack(sb->main, sb->bar); - evas_object_hide(sb->botbox); - elm_table_unpack(sb->table, sb->botbox); - evas_object_hide(sb->infolabel); - elm_table_unpack(sb->table, sb->infolabel); - } + if (sb->ephoto->config->tool_hide) + { + evas_object_hide(sb->bar); + elm_box_unpack(sb->tbox, sb->bar); + evas_object_hide(sb->tbox); + elm_box_unpack(sb->main, sb->tbox); + evas_object_hide(sb->botbox); + elm_table_unpack(sb->table, sb->botbox); + evas_object_hide(sb->infolabel); + elm_table_unpack(sb->table, sb->infolabel); + } } else { - if (!evas_object_visible_get(sb->bar)) - { - elm_box_pack_start(sb->main, sb->bar); - evas_object_show(sb->bar); - elm_table_pack(sb->table, sb->botbox, 0, 2, 4, 1); - evas_object_show(sb->botbox); - elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); - evas_object_show(sb->infolabel); - } + if (!evas_object_visible_get(sb->bar)) + { + elm_box_pack_start(sb->main, sb->tbox); + evas_object_show(sb->tbox); + elm_box_pack_start(sb->tbox, sb->bar); + evas_object_show(sb->bar); + elm_table_pack(sb->table, sb->botbox, 0, 2, 4, 1); + evas_object_show(sb->botbox); + elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); + evas_object_show(sb->infolabel); + } } - elm_object_focus_set(sb->main, EINA_TRUE); + if (sb->event) + { + evas_object_del(sb->event); + sb->event = NULL; + } + sb->event = evas_object_rectangle_add(sb->ephoto->win); + evas_object_smart_member_add(sb->event, sb->ephoto->win); + evas_object_color_set(sb->event, 0, 0, 0, 0); + evas_object_repeat_events_set(sb->event, EINA_TRUE); + evas_object_show(sb->event); + evas_object_event_callback_add(sb->event, EVAS_CALLBACK_KEY_DOWN, _key_down, + sb); + evas_object_raise(sb->event); + elm_object_focus_set(sb->event, EINA_TRUE); } void ephoto_single_browser_path_pending_set(Evas_Object *obj, const char *path) { Ephoto_Single_Browser *sb = evas_object_data_get(obj, "single_browser"); - EINA_SAFETY_ON_NULL_RETURN(sb); - DBG("Setting pending path '%s'", path); sb->pending_path = eina_stringshare_add(path); } void -ephoto_single_browser_image_data_update(Evas_Object *main, Evas_Object *image, Eina_Bool finished, unsigned int *image_data, int w, int h) +ephoto_single_browser_image_data_update(Evas_Object *main, Evas_Object *image, + Eina_Bool finished, unsigned int *image_data, int w, int h) { Ephoto_Single_Browser *sb = evas_object_data_get(main, "single_browser"); + if (sb->editing) { - if (sb->cropping) - { - evas_object_image_size_set(elm_image_object_get(image), w, h); - sb->cropping = EINA_FALSE; - } - evas_object_image_data_set(elm_image_object_get(image), image_data); - evas_object_image_data_update_add(elm_image_object_get(image), 0, 0, w, h); + if (sb->cropping) + { + evas_object_image_size_set(elm_image_object_get(image), w, h); + sb->cropping = EINA_FALSE; + } + evas_object_image_data_set(elm_image_object_get(image), image_data); + evas_object_image_data_update_add(elm_image_object_get(image), 0, 0, w, + h); - if (finished) - { - char image_info[PATH_MAX]; + if (finished) + { + char image_info[PATH_MAX]; - evas_object_del(sb->botbox); - evas_object_del(sb->infolabel); - snprintf(image_info, PATH_MAX, - "%s: %s %s: %dx%d %s: %s", - _("Type"), efreet_mime_type_get(sb->entry->path), _("Resolution"), w, h, - _("File Size"), _("N/A")); - sb->botbox = evas_object_rectangle_add(evas_object_evas_get(sb->table)); - evas_object_color_set(sb->botbox, 0, 0, 0, 0); - evas_object_size_hint_min_set(sb->botbox, 0, sb->ephoto->bottom_bar_size); - evas_object_size_hint_weight_set(sb->botbox, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_fill_set(sb->botbox, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(sb->table, sb->botbox, 0, 2, 4, 1); - evas_object_show(sb->botbox); + evas_object_del(sb->botbox); + evas_object_del(sb->infolabel); + snprintf(image_info, PATH_MAX, + "%s: %s %s: %dx%d %s: %s", + _("Type"), efreet_mime_type_get(sb->entry->path), + _("Resolution"), w, h, _("File Size"), _("N/A")); + sb->botbox = elm_box_add(sb->table); + evas_object_size_hint_min_set(sb->botbox, 0, + sb->ephoto->bottom_bar_size); + evas_object_size_hint_weight_set(sb->botbox, EVAS_HINT_EXPAND, + 0.0); + evas_object_size_hint_fill_set(sb->botbox, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_table_pack(sb->table, sb->botbox, 0, 2, 4, 1); + evas_object_show(sb->botbox); - sb->infolabel = elm_label_add(sb->table); - elm_label_line_wrap_set(sb->infolabel, ELM_WRAP_NONE); - elm_object_text_set(sb->infolabel, image_info); - evas_object_size_hint_weight_set(sb->infolabel, EVAS_HINT_EXPAND, EVAS_HINT_FILL); - evas_object_size_hint_align_set(sb->infolabel, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); - evas_object_show(sb->infolabel); + sb->infolabel = elm_label_add(sb->table); + elm_label_line_wrap_set(sb->infolabel, ELM_WRAP_NONE); + elm_object_text_set(sb->infolabel, image_info); + evas_object_size_hint_weight_set(sb->infolabel, EVAS_HINT_EXPAND, + EVAS_HINT_FILL); + evas_object_size_hint_align_set(sb->infolabel, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_table_pack(sb->table, sb->infolabel, 0, 2, 4, 1); + evas_object_show(sb->infolabel); - sb->edited_image_data = image_data; - sb->ew = w; - sb->eh = h; + sb->edited_image_data = image_data; + sb->ew = w; + sb->eh = h; - evas_object_freeze_events_set(sb->bar, EINA_FALSE); - elm_object_disabled_set(sb->bar, EINA_FALSE); - sb->editing = EINA_FALSE; - _zoom_fit(sb); - } + evas_object_freeze_events_set(sb->bar, EINA_FALSE); + elm_object_disabled_set(sb->bar, EINA_FALSE); + sb->editing = EINA_FALSE; + _zoom_fit(sb); + } } } @@ -2124,43 +2535,47 @@ void ephoto_single_browser_cancel_editing(Evas_Object *main, Evas_Object *image) { Ephoto_Single_Browser *sb = evas_object_data_get(main, "single_browser"); + if (sb->editing) { - if (sb->cropping) - sb->cropping = EINA_FALSE; - if (sb->edited_image_data) - { - evas_object_image_size_set(elm_image_object_get(image), sb->ew, sb->eh); - evas_object_image_data_set(elm_image_object_get(image), sb->edited_image_data); - evas_object_image_data_update_add(elm_image_object_get(image), 0, 0, sb->ew, sb->eh); - } + if (sb->cropping) + sb->cropping = EINA_FALSE; + if (sb->edited_image_data) + { + evas_object_image_size_set(elm_image_object_get(image), sb->ew, + sb->eh); + evas_object_image_data_set(elm_image_object_get(image), + sb->edited_image_data); + evas_object_image_data_update_add(elm_image_object_get(image), 0, + 0, sb->ew, sb->eh); + } else - { - unsigned int *image_data; - int w, h; - const char *group = NULL; - const char *ext = strrchr(sb->entry->path, '.'); - if (ext) - { - ext++; - if ((strcasecmp(ext, "edj") == 0)) - { - if (edje_file_group_exists(sb->entry->path, "e/desktop/background")) - group = "e/desktop/background"; - else - { - Eina_List *g = edje_file_collection_list(sb->entry->path); - group = eina_list_data_get(g); - edje_file_collection_list_free(g); - } - elm_image_file_set(image, sb->entry->path, group); - } - } - } - evas_object_freeze_events_set(sb->bar, EINA_FALSE); - elm_object_disabled_set(sb->bar, EINA_FALSE); - sb->editing = EINA_FALSE; - _zoom_fit(sb); + { + const char *group = NULL; + const char *ext = strrchr(sb->entry->path, '.'); + + if (ext) + { + ext++; + if ((strcasecmp(ext, "edj") == 0)) + { + if (edje_file_group_exists(sb->entry->path, + "e/desktop/background")) + group = "e/desktop/background"; + else + { + Eina_List *g = + edje_file_collection_list(sb->entry->path); + group = eina_list_data_get(g); + edje_file_collection_list_free(g); + } + elm_image_file_set(image, sb->entry->path, group); + } + } + } + evas_object_freeze_events_set(sb->bar, EINA_FALSE); + elm_object_disabled_set(sb->bar, EINA_FALSE); + sb->editing = EINA_FALSE; + _zoom_fit(sb); } } - diff --git a/src/bin/ephoto_slideshow.c b/src/bin/ephoto_slideshow.c index 34e4bc4..d53149d 100644 --- a/src/bin/ephoto_slideshow.c +++ b/src/bin/ephoto_slideshow.c @@ -8,6 +8,7 @@ struct _Ephoto_Slideshow Evas_Object *slideshow; Evas_Object *notify; Evas_Object *bar; + Evas_Object *event; Elm_Widget_Item *pause; Elm_Widget_Item *pause_after; Elm_Widget_Item *fullscreen; @@ -17,44 +18,23 @@ struct _Ephoto_Slideshow }; static void -_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) -{ - Ephoto_Slideshow *ss = data; - Evas_Event_Key_Down *ev = event_info; - const char *k = ev->keyname; - - if (!strcmp(k, "Escape")) - { - Evas_Object *win = ss->ephoto->win; - Elm_Object_Item *slideshow_item; - Ephoto_Entry *entry; - - slideshow_item = elm_slideshow_item_current_get(ss->slideshow); - if (slideshow_item) entry = elm_object_item_data_get(slideshow_item); - else entry = ss->entry; - evas_object_smart_callback_call(ss->slideshow, "back", entry); - elm_slideshow_clear(ss->slideshow); - evas_object_hide(ss->notify); - ss->playing = 0; - evas_object_freeze_events_set(ss->slideshow, EINA_TRUE); - } - else if (!strcmp(k, "F11")) - { - Evas_Object *win = ss->ephoto->win; - elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); - } -} - -static void -_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; Elm_Object_Item *slideshow_item; Ephoto_Entry *entry; slideshow_item = elm_slideshow_item_current_get(ss->slideshow); - if (slideshow_item) entry = elm_object_item_data_get(slideshow_item); - else entry = ss->entry; + if (slideshow_item) + entry = elm_object_item_data_get(slideshow_item); + else + entry = ss->entry; + if (ss->event) + { + evas_object_del(ss->event); + ss->event = NULL; + } evas_object_smart_callback_call(ss->slideshow, "back", entry); elm_slideshow_clear(ss->slideshow); evas_object_hide(ss->notify); @@ -66,20 +46,24 @@ static void _entry_free(void *data, const Ephoto_Entry *entry EINA_UNUSED) { Ephoto_Slideshow *ss = data; + ss->entry = NULL; } static void -_slideshow_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_slideshow_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; + if (ss->entry) - ephoto_entry_free_listener_del(ss->entry, _entry_free, ss); + ephoto_entry_free_listener_del(ss->entry, _entry_free, ss); free(ss); } static void -_notify_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_notify_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { evas_object_show(data); } @@ -92,8 +76,15 @@ _back(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) Ephoto_Entry *entry; slideshow_item = elm_slideshow_item_current_get(ss->slideshow); - if (slideshow_item) entry = elm_object_item_data_get(slideshow_item); - else entry = ss->entry; + if (slideshow_item) + entry = elm_object_item_data_get(slideshow_item); + else + entry = ss->entry; + if (ss->event) + { + evas_object_del(ss->event); + ss->event = NULL; + } evas_object_smart_callback_call(ss->slideshow, "back", entry); elm_slideshow_clear(ss->slideshow); evas_object_hide(ss->notify); @@ -114,7 +105,7 @@ _next(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) } static void -_pause(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_pause(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; @@ -122,22 +113,26 @@ _pause(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EI if (ss->playing) { - elm_slideshow_timeout_set(ss->slideshow, 0.0); - ss->pause = elm_toolbar_item_insert_before(ss->bar, ss->pause_after, - "media-playback-start", _("Play"), _pause, ss); - ss->playing = 0; + elm_slideshow_timeout_set(ss->slideshow, 0.0); + ss->pause = + elm_toolbar_item_insert_before(ss->bar, ss->pause_after, + "media-playback-start", _("Play"), _pause, ss); + ss->playing = 0; } else { - elm_slideshow_timeout_set(ss->slideshow, ss->ephoto->config->slideshow_timeout); - ss->pause = elm_toolbar_item_insert_before(ss->bar, ss->pause_after, - "media-playback-pause", _("Pause"), _pause, ss); - ss->playing = 1; + elm_slideshow_timeout_set(ss->slideshow, + ss->ephoto->config->slideshow_timeout); + ss->pause = + elm_toolbar_item_insert_before(ss->bar, ss->pause_after, + "media-playback-pause", _("Pause"), _pause, ss); + ss->playing = 1; } } static void -_previous(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_previous(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { elm_slideshow_previous(data); } @@ -147,11 +142,12 @@ _last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { unsigned int count = elm_slideshow_count_get(data); - elm_slideshow_item_show(elm_slideshow_item_nth_get(data, count-1)); + elm_slideshow_item_show(elm_slideshow_item_nth_get(data, count - 1)); } static void -_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; @@ -159,39 +155,200 @@ _fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUS if (elm_win_fullscreen_get(ss->ephoto->win)) { - ss->fullscreen = elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, - "view-fullscreen", _("Fullscreen"), _fullscreen, ss); - elm_win_fullscreen_set(ss->ephoto->win, EINA_FALSE); + ss->fullscreen = + elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, + "view-fullscreen", _("Fullscreen"), _fullscreen, ss); + elm_win_fullscreen_set(ss->ephoto->win, EINA_FALSE); } else { - ss->fullscreen = elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, - "view-restore", _("Normal"), _fullscreen, ss); - elm_win_fullscreen_set(ss->ephoto->win, EINA_TRUE); + ss->fullscreen = + elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, + "view-restore", _("Normal"), _fullscreen, ss); + elm_win_fullscreen_set(ss->ephoto->win, EINA_TRUE); } } static void -_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_general_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { - Ephoto_Slideshow *ss = data; + Evas_Object *popup = data; + Ephoto_Slideshow *ss = evas_object_data_get(popup, "slideshow"); + + ephoto_config_general(ss->ephoto); +} + +static void +_slideshow_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Slideshow *ss = evas_object_data_get(popup, "slideshow"); ephoto_config_slideshow(ss->ephoto); } static void -_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_about_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Slideshow *ss = evas_object_data_get(popup, "slideshow"); + + ephoto_config_about(ss->ephoto); +} + +static void +_close_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Slideshow *ss = evas_object_data_get(popup, "slideshow"); + + evas_object_del(popup); + if (ss->event) + { + evas_object_freeze_events_set(ss->event, EINA_FALSE); + elm_object_focus_set(ss->event, EINA_TRUE); + } +} + +static void +_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Slideshow *ss = data; + Evas_Object *popup, *list, *button, *ic; + + if (ss->event) + evas_object_freeze_events_set(ss->event, EINA_TRUE); + + popup = elm_popup_add(ss->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); + + list = elm_list_add(popup); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_list_mode_set(list, ELM_LIST_EXPAND); + + ic = elm_icon_add(list); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_standard_set(ic, "preferences-system"); + evas_object_show(ic); + elm_list_item_append(list, _("General Settings"), ic, NULL, + _general_settings, popup); + + ic = elm_icon_add(list); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + 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); + elm_list_item_append(list, _("Slideshow Settings"), ic, NULL, + _slideshow_settings, popup); + ic = elm_icon_add(list); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_standard_set(ic, "help-about"); + evas_object_show(ic); + elm_list_item_append(list, _("About Ephoto"), ic, NULL, _about_settings, + popup); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Close")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _close_settings, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + elm_list_go(list); + evas_object_show(list); + + evas_object_data_set(popup, "slideshow", ss); + elm_object_content_set(popup, list); + evas_object_show(popup); +} + +static void +_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { elm_notify_timeout_set(data, 0.0); evas_object_show(data); } static void -_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { elm_notify_timeout_set(data, 3.0); } +static void +_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Ephoto_Slideshow *ss = data; + Evas_Event_Key_Down *ev = event_info; + const char *k = ev->keyname; + + if (!strcmp(k, "Escape") || !strcmp(k, "F5")) + { + _back(ss, NULL, NULL); + } + else if (!strcmp(k, "F1")) + { + _settings(ss, NULL, NULL); + } + else if (!strcmp(k, "F11")) + { + Evas_Object *win = ss->ephoto->win; + + elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); + } + else if (!strcmp(k, "space")) + { + _pause(ss, NULL, NULL); + } + else if (!strcmp(k, "Home")) + { + _first(ss->slideshow, NULL, NULL); + } + else if (!strcmp(k, "End")) + { + _last(ss->slideshow, NULL, NULL); + } + else if (!strcmp(k, "Left")) + { + _previous(ss->slideshow, NULL, NULL); + } + else if (!strcmp(k, "Right")) + { + _next(ss->slideshow, NULL, NULL); + } +} + +static void +_main_focused(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Ephoto_Slideshow *ss = data; + + if (ss->ephoto->state == EPHOTO_STATE_SLIDESHOW) + { + if (ss->event) + elm_object_focus_set(ss->event, EINA_TRUE); + } +} + Evas_Object * ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent) { @@ -205,26 +362,30 @@ ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent) ss->ephoto = ephoto; ss->slideshow = slideshow; ss->playing = 0; - evas_object_event_callback_add - (slideshow, EVAS_CALLBACK_DEL, _slideshow_del, ss); - evas_object_event_callback_add - (slideshow, EVAS_CALLBACK_KEY_DOWN, _key_down, ss); - evas_object_event_callback_add - (slideshow, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, ss); - evas_object_data_set(slideshow, "slideshow", ss); + ss->event = NULL; + evas_object_event_callback_add(slideshow, EVAS_CALLBACK_DEL, _slideshow_del, + ss); + evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_DOWN, + _mouse_down, ss); + evas_object_event_callback_add(ss->ephoto->win, EVAS_CALLBACK_FOCUS_IN, + _main_focused, ss); + evas_object_data_set(slideshow, "slideshow", ss); + elm_object_tree_focus_allow_set(slideshow, EINA_FALSE); elm_slideshow_loop_set(slideshow, EINA_TRUE); elm_slideshow_layout_set(slideshow, "fullscreen"); - evas_object_size_hint_weight_set - (slideshow, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(slideshow, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(slideshow, EVAS_HINT_FILL, EVAS_HINT_FILL); ss->notify = elm_notify_add(ephoto->win); elm_notify_align_set(ss->notify, 0.5, 1.0); - evas_object_size_hint_weight_set(ss->notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(ss->notify, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); elm_notify_timeout_set(ss->notify, 3.0); - elm_win_resize_object_add(ephoto->win, ss->notify); - evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_MOVE, _notify_show, ss->notify); + evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_MOVE, + _notify_show, ss->notify); + elm_object_tree_focus_allow_set(ss->notify, EINA_FALSE); ss->bar = elm_toolbar_add(ss->notify); elm_toolbar_horizontal_set(ss->bar, EINA_TRUE); @@ -235,17 +396,30 @@ ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent) evas_object_size_hint_weight_set(ss->bar, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(ss->bar, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_content_set(ss->notify, ss->bar); - evas_object_event_callback_add(ss->bar, EVAS_CALLBACK_MOUSE_IN, _mouse_in, ss->notify); - evas_object_event_callback_add(ss->bar, EVAS_CALLBACK_MOUSE_OUT, _mouse_out, ss->notify); + elm_object_tree_focus_allow_set(ss->bar, EINA_FALSE); + evas_object_event_callback_add(ss->bar, EVAS_CALLBACK_MOUSE_IN, _mouse_in, + ss->notify); + evas_object_event_callback_add(ss->bar, EVAS_CALLBACK_MOUSE_OUT, _mouse_out, + ss->notify); elm_toolbar_item_append(ss->bar, "window-close", _("Back"), _back, ss); - elm_toolbar_item_append(ss->bar, "go-first", _("First"), _first, ss->slideshow); - elm_toolbar_item_append(ss->bar, "go-previous", _("Previous"), _previous, ss->slideshow); - ss->pause = elm_toolbar_item_append(ss->bar, "media-playback-start", _("Play"), _pause, ss); - ss->pause_after = elm_toolbar_item_append(ss->bar, "go-next", _("Next"), _next, ss->slideshow); + elm_toolbar_item_append(ss->bar, "go-first", _("First"), _first, + ss->slideshow); + elm_toolbar_item_append(ss->bar, "go-previous", _("Previous"), _previous, + ss->slideshow); + ss->pause = + elm_toolbar_item_append(ss->bar, "media-playback-start", _("Play"), + _pause, ss); + ss->pause_after = + elm_toolbar_item_append(ss->bar, "go-next", _("Next"), _next, + ss->slideshow); elm_toolbar_item_append(ss->bar, "go-last", _("Last"), _last, ss->slideshow); - ss->fullscreen = elm_toolbar_item_append(ss->bar, "view-fullscreen", _("Fullscreen"), _fullscreen, ss); - ss->fullscreen_after = elm_toolbar_item_append(ss->bar, "preferences-system", _("Settings"), _settings, ss); + ss->fullscreen = + elm_toolbar_item_append(ss->bar, "view-fullscreen", _("Fullscreen"), + _fullscreen, ss); + ss->fullscreen_after = + elm_toolbar_item_append(ss->bar, "preferences-system", _("Settings"), + _settings, ss); evas_object_show(ss->bar); @@ -253,14 +427,17 @@ ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent) return ss->slideshow; - error: + error: evas_object_del(slideshow); return NULL; } -static void _image_shown(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED) +static void +_image_shown(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) { Ephoto_Entry *entry = data; + ephoto_title_set(entry->ephoto, entry->basename); } @@ -271,30 +448,35 @@ _slideshow_item_get(void *data, Evas_Object *obj) const char *group = NULL; const char *ext = strrchr(entry->path, '.'); + if (ext) { - ext++; - if ((strcasecmp(ext, "edj") == 0)) - { - if (edje_file_group_exists(entry->path, "e/desktop/background")) - group = "e/desktop/background"; - else - { - Eina_List *g = edje_file_collection_list(entry->path); - group = eina_list_data_get(g); - edje_file_collection_list_free(g); - } - } - } + ext++; + if ((strcasecmp(ext, "edj") == 0)) + { + if (edje_file_group_exists(entry->path, "e/desktop/background")) + group = "e/desktop/background"; + else + { + Eina_List *g = edje_file_collection_list(entry->path); + + group = eina_list_data_get(g); + edje_file_collection_list_free(g); + } + } + } Evas_Object *image = elm_image_add(obj); + elm_image_file_set(image, entry->path, group); elm_object_style_set(image, "shadow"); - evas_object_event_callback_add(image, EVAS_CALLBACK_SHOW, _image_shown, entry); + evas_object_event_callback_add(image, EVAS_CALLBACK_SHOW, _image_shown, + entry); return image; } -static const Elm_Slideshow_Item_Class _item_cls = {{_slideshow_item_get, NULL}}; +static const Elm_Slideshow_Item_Class _item_cls = + { {_slideshow_item_get, NULL} }; void ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry) @@ -302,50 +484,71 @@ ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry) Ephoto_Slideshow *ss = evas_object_data_get(obj, "slideshow"); Ephoto_Entry *itr; const Eina_List *l; - EINA_SAFETY_ON_NULL_RETURN(ss); if (ss->entry) - ephoto_entry_free_listener_del(ss->entry, _entry_free, ss); + ephoto_entry_free_listener_del(ss->entry, _entry_free, ss); ss->entry = entry; if (entry) - ephoto_entry_free_listener_add(entry, _entry_free, ss); + ephoto_entry_free_listener_add(entry, _entry_free, ss); elm_slideshow_loop_set(ss->slideshow, EINA_TRUE); - elm_slideshow_transition_set(ss->slideshow, ss->ephoto->config->slideshow_transition); - elm_slideshow_timeout_set(ss->slideshow, ss->ephoto->config->slideshow_timeout); + elm_slideshow_transition_set(ss->slideshow, + ss->ephoto->config->slideshow_transition); + elm_slideshow_timeout_set(ss->slideshow, + ss->ephoto->config->slideshow_timeout); elm_slideshow_clear(ss->slideshow); - if (!entry) return; + if (!entry) + return; evas_object_freeze_events_set(ss->slideshow, EINA_FALSE); if (ss->pause) { - elm_object_item_del(ss->pause); - ss->pause = elm_toolbar_item_insert_before(ss->bar, ss->pause_after, - "media-playback-pause", _("Pause"), _pause, ss); - ss->playing = 1; + elm_object_item_del(ss->pause); + ss->pause = + elm_toolbar_item_insert_before(ss->bar, ss->pause_after, + "media-playback-pause", _("Pause"), _pause, ss); + ss->playing = 1; } if (ss->fullscreen) { - elm_object_item_del(ss->fullscreen); - if (elm_win_fullscreen_get(ss->ephoto->win)) - { - ss->fullscreen = elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, - "view-restore", _("Normal"), _fullscreen, ss); - } + elm_object_item_del(ss->fullscreen); + if (elm_win_fullscreen_get(ss->ephoto->win)) + { + ss->fullscreen = + elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, + "view-restore", _("Normal"), _fullscreen, ss); + } else - { - ss->fullscreen = elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, - "view-fullscreen", _("Fullscreen"), _fullscreen, ss); - } + { + ss->fullscreen = + elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, + "view-fullscreen", _("Fullscreen"), _fullscreen, ss); + } } EINA_LIST_FOREACH(ss->ephoto->entries, l, itr) { Elm_Object_Item *slideshow_item; + slideshow_item = elm_slideshow_item_add(ss->slideshow, &_item_cls, itr); - if (itr == entry) elm_slideshow_item_show(slideshow_item); + if (itr == entry) + elm_slideshow_item_show(slideshow_item); } + if (ss->event) + { + evas_object_del(ss->event); + ss->event = NULL; + } + ss->event = evas_object_rectangle_add(ss->ephoto->win); + evas_object_smart_member_add(ss->event, ss->ephoto->win); + evas_object_color_set(ss->event, 0, 0, 0, 0); + evas_object_repeat_events_set(ss->event, EINA_TRUE); + evas_object_show(ss->event); + evas_object_event_callback_add(ss->event, EVAS_CALLBACK_KEY_DOWN, _key_down, + ss); + evas_object_raise(ss->event); + elm_object_focus_set(ss->event, EINA_TRUE); } diff --git a/src/bin/ephoto_thumb_browser.c b/src/bin/ephoto_thumb_browser.c index 55beb3f..7f9ab6b 100644 --- a/src/bin/ephoto_thumb_browser.c +++ b/src/bin/ephoto_thumb_browser.c @@ -1,18 +1,16 @@ #include "ephoto.h" -#define ZOOM_MAX 512 -#define ZOOM_MIN 128 -#define ZOOM_STEP 32 +#define ZOOM_MAX 512 +#define ZOOM_MIN 128 +#define ZOOM_STEP 32 #define TODO_ITEM_MIN_BATCH 16 -#define PARENT_DIR "Up" +#define FILESEP "file://" +#define FILESEP_LEN sizeof(FILESEP) - 1 -#define FILESEP "file://" -#define FILESEP_LEN sizeof(FILESEP) - 1 - -#define DRAG_TIMEOUT 0.3 -#define ANIM_TIME 0.2 +#define DRAG_TIMEOUT 0.3 +#define ANIM_TIME 0.2 static Eina_Bool _5s_cancel = EINA_FALSE; static Ecore_Timer *_5s_timeout = NULL; @@ -30,21 +28,35 @@ struct _Ephoto_Thumb_Browser Evas_Object *bar; Evas_Object *vbar; Evas_Object *fsel; - Elm_Widget_Item *fsel_parent; + Evas_Object *min; + Evas_Object *max; Evas_Object *leftbox; Evas_Object *bleftbox; Evas_Object *direntry; + Evas_Object *dir_loading; + Evas_Object *hoversel; + Elm_Object_Item *dir_current; + Ephoto_Sort sort; Eio_File *ls; - Eina_List *todo_items; - Eina_List *grid_items; + Eina_List *cut_items; + Eina_List *copy_items; Eina_List *handlers; - int contracted; + Eina_List *idler_pos; + Eina_List *todo_items; + Ecore_Idler *idler; + int thumbs_only; + int dirs_only; int totimages; + int file_errors; + int dragging; double totsize; - struct { + struct + { Ecore_Animator *todo_items; + int count; + int processed; } animator; - Eina_Bool main_deleted : 1; + Eina_Bool main_deleted:1; }; static Elm_Gengrid_Item_Class _ephoto_thumb_file_class; @@ -58,7 +70,8 @@ _todo_items_free(Ephoto_Thumb_Browser *tb) } static void -_on_list_expand_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +_on_list_expand_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) { Elm_Widget_Item *it = event_info; @@ -66,7 +79,8 @@ _on_list_expand_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void * } static void -_on_list_contract_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +_on_list_contract_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) { Elm_Widget_Item *it = event_info; @@ -80,8 +94,12 @@ _on_list_expanded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) Elm_Widget_Item *it = event_info; const char *path = elm_object_item_data_get(it); - tb->fsel_parent = it; - ephoto_directory_set(tb->ephoto, path); + if (strlen(path) == strlen(tb->ephoto->config->directory)) + { + if (!strcmp(path, tb->ephoto->config->directory)) + tb->dirs_only = 1; + } + ephoto_directory_set(tb->ephoto, path, it, tb->dirs_only); ephoto_title_set(tb->ephoto, path); } @@ -91,51 +109,67 @@ _on_list_contracted(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) Ephoto_Thumb_Browser *tb = data; Elm_Widget_Item *it = event_info; const char *path = elm_object_item_data_get(it); - char p[PATH_MAX]; - snprintf(p, PATH_MAX, "%s", tb->ephoto->config->directory); elm_genlist_item_subitems_clear(it); - tb->contracted = 1; - ephoto_directory_set(tb->ephoto, dirname(p)); + if (strlen(path) == strlen(tb->ephoto->config->directory)) + { + if (!strcmp(path, tb->ephoto->config->directory)) + tb->dirs_only = 1; + } + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, path, NULL, tb->dirs_only); ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); } static void -_grid_items_free(Ephoto_Thumb_Browser *tb) +_on_list_selected(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { - eina_list_free(tb->grid_items); - tb->grid_items = NULL; + Ephoto_Thumb_Browser *tb = data; + Elm_Widget_Item *it = event_info; + + if (!tb->dragging) + tb->dir_current = it; } static char * -_ephoto_dir_item_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +_ephoto_dir_item_text_get(void *data, Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) { return strdup(basename(data)); } static char * -_ephoto_thumb_item_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +_ephoto_thumb_item_text_get(void *data, Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) { Ephoto_Entry *e = data; + return strdup(e->label); } static Evas_Object * -_ephoto_dir_item_icon_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) +_ephoto_dir_item_icon_get(void *data EINA_UNUSED, Evas_Object *obj, + const char *part) { if (!strcmp(part, "elm.swallow.end")) - return NULL; + return NULL; Evas_Object *ic = elm_icon_add(obj); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); elm_icon_standard_set(ic, "folder"); return ic; } static Evas_Object * -_ephoto_thumb_file_icon_get(void *data, Evas_Object *obj, const char *part EINA_UNUSED) +_ephoto_thumb_file_icon_get(void *data, Evas_Object *obj, + const char *part EINA_UNUSED) { Ephoto_Entry *e = data; - return ephoto_thumb_add(e->ephoto, obj, e->path); + Evas_Object *thumb = NULL; + + if (e) + thumb = ephoto_thumb_add(e->ephoto, obj, e->path); + return thumb; } static void @@ -147,12 +181,7 @@ _ephoto_dir_item_del(void *data, Evas_Object *obj EINA_UNUSED) static void _ephoto_thumb_item_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) { - /* FIXME: the entry is already freed when changing directories - * One solution is to take care of this cleaning when manually removing - * some grid items - Ephoto_Entry *e = data; - e->item = NULL; - */ + /* The entry is already freed when changing directories. */ } static int @@ -169,125 +198,278 @@ _entry_cmp(const void *pa, const void *pb) } static int -_entry_cmp_grid(const void *pa, const void *pb) +_entry_cmp_grid_alpha_asc(const void *pa, const void *pb) { const Ephoto_Entry *a, *b; + a = elm_object_item_data_get(pa); b = elm_object_item_data_get(pb); - return strcoll(a->basename, b->basename); + return strcasecmp(a->basename, b->basename); } -static void -_entry_dir_item_add(Ephoto_Thumb_Browser *tb, Ephoto_Entry *e, Elm_Widget_Item *parent) +static int +_entry_cmp_grid_alpha_desc(const void *pa, const void *pb) { - const Elm_Genlist_Item_Class *ic; - const char *path; + const Ephoto_Entry *a, *b; + int i; - ic = &_ephoto_dir_class; + a = elm_object_item_data_get(pa); + b = elm_object_item_data_get(pb); + i = strcasecmp(a->basename, b->basename); + if (i < 0) + i = 1; + else if (i > 0) + i = -1; - path = eina_stringshare_add(e->path); - - e->item = elm_genlist_item_sorted_insert(tb->fsel, ic, path, parent, ELM_GENLIST_ITEM_TREE, _entry_cmp, NULL, NULL); - - if (!e->item) - { - ERR("could not add item to fsel: path '%s'", e->path); - ephoto_entry_free(e); - return; - } + return i; } -static void -_entry_thumb_item_add(Ephoto_Thumb_Browser *tb, Ephoto_Entry *e) +static int +_entry_cmp_grid_mod_asc(const void *pa, const void *pb) { - const Elm_Gengrid_Item_Class *ic; + const Ephoto_Entry *a, *b; + long long moda, modb; - ic = &_ephoto_thumb_file_class; + a = elm_object_item_data_get(pa); + b = elm_object_item_data_get(pb); - e->item = elm_gengrid_item_sorted_insert - (tb->grid, ic, e, _entry_cmp_grid, NULL, NULL); - if (e->item) - elm_object_item_data_set(e->item, e); + moda = ecore_file_mod_time(a->path); + modb = ecore_file_mod_time(b->path); + + if (moda < modb) + return -1; + else if (moda > modb) + return 1; + else + return strcasecmp(a->basename, b->basename); +} + +static int +_entry_cmp_grid_mod_desc(const void *pa, const void *pb) +{ + const Ephoto_Entry *a, *b; + long long moda, modb; + + a = elm_object_item_data_get(pa); + b = elm_object_item_data_get(pb); + + moda = ecore_file_mod_time(a->path); + modb = ecore_file_mod_time(b->path); + + if (moda < modb) + return 1; + else if (moda > modb) + return -1; else { - ERR("could not add item to grid: path '%s'", e->path); - ephoto_entry_free(e); - return; + int i; + + i = strcasecmp(a->basename, b->basename); + if (i < 0) + i = 1; + else if (i > 0) + i = -1; + return i; } } + +static void +_sort_alpha_asc(void *data, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + + tb->sort = EPHOTO_SORT_ALPHABETICAL_ASCENDING; + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, + NULL, EINA_FALSE); + elm_object_text_set(tb->hoversel, _("Alphabetical Ascending")); +} + +static void +_sort_alpha_desc(void *data, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + + tb->sort = EPHOTO_SORT_ALPHABETICAL_DESCENDING; + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, + NULL, EINA_FALSE); + elm_object_text_set(tb->hoversel, _("Alphabetical Descending")); +} + +static void +_sort_mod_asc(void *data, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + + tb->sort = EPHOTO_SORT_MODTIME_ASCENDING; + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, + NULL, EINA_FALSE); + elm_object_text_set(tb->hoversel, _("Modification Time Ascending")); +} + +static void +_sort_mod_desc(void *data, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + + tb->sort = EPHOTO_SORT_MODTIME_DESCENDING; + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, + NULL, EINA_FALSE); + elm_object_text_set(tb->hoversel, _("Modification Time Descending")); +} + static Eina_Bool _todo_items_process(void *data) { Ephoto_Thumb_Browser *tb = data; Ephoto_Entry *entry; + int i = 0; + if ((!tb->ls) && (tb->animator.processed == tb->animator.count)) + { + if (tb->animator.count == 0) + return EINA_TRUE; + if (tb->dir_loading) + { + evas_object_del(tb->dir_loading); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + } + tb->animator.todo_items = NULL; + return EINA_FALSE; + } if ((tb->ls) && (eina_list_count(tb->todo_items) < TODO_ITEM_MIN_BATCH)) - return EINA_TRUE; + return EINA_TRUE; tb->animator.todo_items = NULL; EINA_LIST_FREE(tb->todo_items, entry) - { - if (!tb->contracted && entry->is_dir) - { - if (tb->fsel_parent) - _entry_dir_item_add(tb, entry, tb->fsel_parent); - else - _entry_dir_item_add(tb, entry, NULL); - } - else if (!entry->is_dir) - _entry_thumb_item_add(tb, entry); - } + { + i++; + if (i > TODO_ITEM_MIN_BATCH) + return EINA_TRUE; + if (entry->is_dir) + { + const Elm_Genlist_Item_Class *ic; + const char *path; - if (!tb->animator.todo_items) - { - tb->fsel_parent = NULL; - tb->contracted = 0; - } - return EINA_FALSE; + ic = &_ephoto_dir_class; + path = eina_stringshare_add(entry->path); + entry->item = + elm_genlist_item_sorted_insert(tb->fsel, ic, path, + entry->parent, ELM_GENLIST_ITEM_TREE, _entry_cmp, NULL, NULL); + if (!entry->item) + { + ephoto_entry_free(entry); + } + } + else + { + const Elm_Gengrid_Item_Class *ic; + + ic = &_ephoto_thumb_file_class; + + if (tb->sort == EPHOTO_SORT_ALPHABETICAL_ASCENDING) + entry->item = + elm_gengrid_item_sorted_insert(tb->grid, ic, entry, + _entry_cmp_grid_alpha_asc, NULL, NULL); + else if (tb->sort == EPHOTO_SORT_ALPHABETICAL_DESCENDING) + entry->item = + elm_gengrid_item_sorted_insert(tb->grid, ic, entry, + _entry_cmp_grid_alpha_desc, NULL, NULL); + else if (tb->sort == EPHOTO_SORT_MODTIME_ASCENDING) + entry->item = + elm_gengrid_item_sorted_insert(tb->grid, ic, entry, + _entry_cmp_grid_mod_asc, NULL, NULL); + else if (tb->sort == EPHOTO_SORT_MODTIME_DESCENDING) + entry->item = + elm_gengrid_item_sorted_insert(tb->grid, ic, entry, + _entry_cmp_grid_mod_desc, NULL, NULL); + if (entry->item) + { + elm_object_item_data_set(entry->item, entry); + } + else + { + ephoto_entry_free(entry); + } + } + tb->animator.processed++; + } + + return EINA_TRUE; } static void -_ephoto_dir_selected(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +_ephoto_dir_double_clicked(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) { - Ephoto_Thumb_Browser *tb = data; Elm_Widget_Item *it = event_info; - const char *path = elm_object_item_data_get(it); elm_genlist_item_expanded_set(it, !elm_genlist_item_expanded_get(it)); -// ephoto_directory_set(tb->ephoto, path); -// ephoto_title_set(tb->ephoto, path); } static void -_ephoto_dir_go_home(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_ephoto_dir_go_home(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; elm_genlist_clear(tb->fsel); - ephoto_directory_set(tb->ephoto, getenv("HOME")); + tb->thumbs_only = 0; + + ephoto_directory_set(tb->ephoto, getenv("HOME"), NULL, tb->dirs_only); ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); } static void -_ephoto_dir_go_up(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_ephoto_dir_go_up(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; if (strcmp(tb->ephoto->config->directory, "/")) { - char path[PATH_MAX]; - snprintf(path, PATH_MAX, "%s", tb->ephoto->config->directory); - elm_genlist_clear(tb->fsel); - ephoto_directory_set(tb->ephoto, dirname(path)); - ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + char path[PATH_MAX]; + + snprintf(path, PATH_MAX, "%s", tb->ephoto->config->directory); + elm_genlist_clear(tb->fsel); + tb->thumbs_only = 0; + + ephoto_directory_set(tb->ephoto, dirname(path), NULL, tb->dirs_only); + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); } } static void -_ephoto_direntry_go(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_ephoto_dir_go_trash(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + char path[PATH_MAX]; + + snprintf(path, PATH_MAX, "%s/.config/ephoto/trash", getenv("HOME")); + if (!ecore_file_exists(path)) + ecore_file_mkpath(path); + elm_genlist_clear(tb->fsel); + tb->thumbs_only = 0; + + ephoto_directory_set(tb->ephoto, path, NULL, tb->dirs_only); + ephoto_title_set(tb->ephoto, _("Trash")); +} + +static void +_ephoto_direntry_go(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { const char *dir; Ephoto_Thumb_Browser *tb = data; @@ -295,21 +477,20 @@ _ephoto_direntry_go(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) dir = elm_object_text_get(tb->direntry); if (ecore_file_is_dir(dir)) { - elm_genlist_clear(tb->fsel); - ephoto_directory_set(tb->ephoto, dir); - ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + elm_genlist_clear(tb->fsel); + ephoto_directory_set(tb->ephoto, dir, NULL, tb->dirs_only); + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); } } static void -_ephoto_thumb_selected(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +_ephoto_thumb_activated(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) { Ephoto_Thumb_Browser *tb = data; Elm_Widget_Item *it = event_info; Ephoto_Entry *e = elm_object_item_data_get(it); - elm_gengrid_item_selected_set(it, EINA_FALSE); - evas_object_smart_callback_call(tb->main, "view", e); } @@ -318,51 +499,64 @@ _zoom_set(Ephoto_Thumb_Browser *tb, int zoom) { double scale = elm_config_scale_get(); - if (zoom > ZOOM_MAX) zoom = ZOOM_MAX; - else if (zoom < ZOOM_MIN) zoom = ZOOM_MIN; + if (zoom > ZOOM_MAX) + zoom = ZOOM_MAX; + else if (zoom < ZOOM_MIN) + zoom = ZOOM_MIN; ephoto_thumb_size_set(tb->ephoto, zoom); - elm_gengrid_item_size_set(tb->grid, zoom*scale, zoom*scale); + elm_gengrid_item_size_set(tb->grid, zoom * scale, zoom * scale); + if (zoom >= ZOOM_MAX) + elm_object_disabled_set(tb->max, EINA_TRUE); + if (zoom > ZOOM_MIN) + elm_object_disabled_set(tb->min, EINA_FALSE); + if (zoom <= ZOOM_MIN) + elm_object_disabled_set(tb->min, EINA_TRUE); + if (zoom < ZOOM_MAX) + elm_object_disabled_set(tb->max, EINA_FALSE); } static void -_zoom_in(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_zoom_in(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; - Evas_Object *min = evas_object_data_get(obj, "min"); - int zoom = tb->ephoto->config->thumb_size+ZOOM_STEP; + int zoom = tb->ephoto->config->thumb_size + ZOOM_STEP; + _zoom_set(tb, zoom); - if (zoom >= ZOOM_MAX) elm_object_disabled_set(obj, EINA_TRUE); - if (zoom > ZOOM_MIN) elm_object_disabled_set(min, EINA_FALSE); } static void -_zoom_out(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_zoom_out(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; - Evas_Object *max = evas_object_data_get(obj, "max"); - int zoom = tb->ephoto->config->thumb_size-ZOOM_STEP; + int zoom = tb->ephoto->config->thumb_size - ZOOM_STEP; + _zoom_set(tb, zoom); - if (zoom <= ZOOM_MIN) elm_object_disabled_set(obj, EINA_TRUE); - if (zoom < ZOOM_MAX) elm_object_disabled_set(max, EINA_FALSE); } static void -_slideshow(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_slideshow(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; Elm_Widget_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->ephoto->entries, 0); + if (it) + entry = elm_object_item_data_get(it); + else + entry = eina_list_nth(tb->ephoto->entries, 0); - if (!entry) return; + if (!entry) + return; evas_object_smart_callback_call(tb->main, "slideshow", entry); } static void -_general_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_general_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); @@ -371,7 +565,8 @@ _general_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EIN } static void -_slideshow_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_slideshow_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); @@ -380,7 +575,8 @@ _slideshow_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info E } static void -_about_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_about_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); @@ -389,24 +585,31 @@ _about_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_ } static void -_close_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_close_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); } static void -_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_settings(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; Evas_Object *popup, *list, *button, *ic; + evas_object_freeze_events_set(tb->main, EINA_TRUE); + popup = elm_popup_add(tb->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); - + list = elm_list_add(popup); evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); @@ -418,7 +621,7 @@ _settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED elm_icon_standard_set(ic, "preferences-system"); evas_object_show(ic); elm_list_item_append(list, _("General Settings"), ic, NULL, - _general_settings, popup); + _general_settings, popup); ic = elm_icon_add(list); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); @@ -426,15 +629,15 @@ _settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED elm_icon_standard_set(ic, "media-playback-start"); evas_object_show(ic); elm_list_item_append(list, _("Slideshow Settings"), ic, NULL, - _slideshow_settings, popup); + _slideshow_settings, popup); ic = elm_icon_add(list); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "help-about"); evas_object_show(ic); - elm_list_item_append(list, _("About Ephoto"), ic, NULL, - _about_settings, popup); + elm_list_item_append(list, _("About Ephoto"), ic, NULL, _about_settings, + popup); ic = elm_icon_add(popup); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); @@ -457,7 +660,8 @@ _settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED } static void -_ephoto_dir_show_folders(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_ephoto_dir_show_folders(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; @@ -473,7 +677,8 @@ _ephoto_dir_show_folders(void *data, Evas_Object *obj EINA_UNUSED, void *event_i } static void -_ephoto_dir_hide_folders(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_ephoto_dir_hide_folders(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; Elm_Widget_Item *icon; @@ -484,7 +689,8 @@ _ephoto_dir_hide_folders(void *data, Evas_Object *obj EINA_UNUSED, void *event_i tb->bleftbox = elm_box_add(tb->main); evas_object_size_hint_weight_set(tb->bleftbox, 0.0, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(tb->bleftbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_align_set(tb->bleftbox, EVAS_HINT_FILL, + EVAS_HINT_FILL); elm_box_pack_start(tb->main, tb->bleftbox); evas_object_show(tb->bleftbox); @@ -493,19 +699,25 @@ _ephoto_dir_hide_folders(void *data, Evas_Object *obj EINA_UNUSED, void *event_i elm_toolbar_homogeneous_set(tb->vbar, EINA_TRUE); elm_toolbar_shrink_mode_set(tb->vbar, ELM_TOOLBAR_SHRINK_NONE); elm_toolbar_select_mode_set(tb->vbar, ELM_OBJECT_SELECT_MODE_NONE); - elm_toolbar_icon_order_lookup_set(tb->vbar, ELM_ICON_LOOKUP_FDO_THEME); + elm_toolbar_icon_order_lookup_set(tb->vbar, ELM_ICON_LOOKUP_FDO_THEME); elm_toolbar_align_set(tb->vbar, 0.0); + elm_object_tree_focus_allow_set(tb->vbar, EINA_FALSE); evas_object_size_hint_weight_set(tb->vbar, 0.0, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(tb->vbar, EVAS_HINT_FILL, EVAS_HINT_FILL); - icon = elm_toolbar_item_append(tb->vbar, "zoom-in", _("Zoom In"), _zoom_in, tb); + icon = + elm_toolbar_item_append(tb->vbar, "zoom-in", _("Zoom In"), _zoom_in, tb); max = elm_object_item_widget_get(icon); - icon = elm_toolbar_item_append(tb->vbar, "zoom-out", _("Zoom Out"), _zoom_out, tb); + icon = + elm_toolbar_item_append(tb->vbar, "zoom-out", _("Zoom Out"), _zoom_out, + tb); min = elm_object_item_widget_get(icon); evas_object_data_set(max, "min", min); evas_object_data_set(min, "max", max); - elm_toolbar_item_append(tb->vbar, "media-playback-start", _("Slideshow"), _slideshow, tb); - elm_toolbar_item_append(tb->vbar, "preferences-system", _("Settings"), _settings, tb); + elm_toolbar_item_append(tb->vbar, "media-playback-start", _("Slideshow"), + _slideshow, tb); + elm_toolbar_item_append(tb->vbar, "preferences-system", _("Settings"), + _settings, tb); elm_box_pack_end(tb->bleftbox, tb->vbar); evas_object_show(tb->vbar); @@ -527,54 +739,1156 @@ _ephoto_dir_hide_folders(void *data, Evas_Object *obj EINA_UNUSED, void *event_i } static void -_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +_complete_ok(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); +} + +static void +_complete(Ephoto_Thumb_Browser *tb, const char *title, const char *text) +{ + Evas_Object *popup, *box, *label, *ic, *button; + + evas_object_freeze_events_set(tb->main, EINA_TRUE); + + popup = elm_popup_add(tb->ephoto->win); + elm_object_part_text_set(popup, "title,text", title); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + + box = elm_box_add(popup); + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + label = elm_label_add(box); + elm_object_text_set(label, text); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, label); + evas_object_show(label); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Ok")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _complete_ok, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + evas_object_data_set(popup, "thumb_browser", tb); + elm_object_part_content_set(popup, "default", box); + evas_object_show(popup); +} + +static Evas_Object * +_processing(Ephoto_Thumb_Browser *tb, const char *title, const char *text) +{ + Evas_Object *popup, *box, *label, *pb; + + evas_object_freeze_events_set(tb->main, EINA_TRUE); + + popup = elm_popup_add(tb->ephoto->win); + elm_object_part_text_set(popup, "title,text", title); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + + box = elm_box_add(popup); + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + label = elm_label_add(box); + elm_object_text_set(label, text); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, label); + evas_object_show(label); + + pb = elm_progressbar_add(box); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_object_style_set(pb, "wheel"); + elm_progressbar_pulse_set(pb, EINA_TRUE); + elm_box_pack_end(box, pb); + evas_object_show(pb); + elm_progressbar_pulse(pb, EINA_TRUE); + + evas_object_data_set(popup, "thumb_browser", tb); + elm_object_part_content_set(popup, "default", box); + + return popup; +} + +static Eina_Bool +_move_idler_cb(void *data) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + const char *destination = evas_object_data_get(popup, "destination"); + const char *file; + int i; + + if (!tb->idler_pos) + tb->idler_pos = eina_list_nth(tb->idler_pos, 0); + if (!tb->idler_pos) + { + ecore_idler_del(tb->idler); + tb->idler = NULL; + eina_list_free(tb->idler_pos); + tb->idler_pos = NULL; + if (tb->file_errors > 0) + { + char msg[PATH_MAX]; + + snprintf(msg, PATH_MAX, "%s %d %s.", + _("There was an error moving"), tb->file_errors, + ngettext("file", "files", tb->file_errors)); + _complete(tb, _("Error"), msg); + } + tb->file_errors = 0; + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, NULL, + tb->dirs_only); + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + + return EINA_FALSE; + } + + for (i = 0; i < 5; i++) + { + file = eina_list_data_get(tb->idler_pos); + if (!file) + break; + if (ecore_file_exists(file) && ecore_file_is_dir(destination) && + !strncmp("image/", efreet_mime_type_get(file), 6)) + { + char dest[PATH_MAX], fp[PATH_MAX], extra[PATH_MAX]; + int ret; + + snprintf(fp, PATH_MAX, "%s", file); + snprintf(dest, PATH_MAX, "%s/%s", destination, basename(fp)); + if (ecore_file_exists(dest)) + { + snprintf(extra, PATH_MAX, "%s/CopyOf%s", destination, + basename(fp)); + if (ecore_file_exists(extra)) + { + int count; + + for (count = 2; ecore_file_exists(extra); count++) + { + memset(extra, 0, sizeof(extra)); + snprintf(extra, PATH_MAX, "%s/Copy%dOf%s", + destination, count, basename(fp)); + } + } + ret = ecore_file_mv(file, extra); + } + else + ret = ecore_file_mv(file, dest); + if (!ret) + tb->file_errors++; + } + tb->idler_pos = eina_list_next(tb->idler_pos); + } + return EINA_TRUE; +} + +static void +_move_files(Ephoto_Thumb_Browser *tb, Eina_List *files, + const char *destination) +{ + Evas_Object *popup = _processing(tb, _("Moving Files"), + _("Please wait while your files are moved.")); + + evas_object_data_set(popup, "thumb_browser", tb); + evas_object_data_set(popup, "destination", destination); + evas_object_show(popup); + + tb->idler_pos = eina_list_clone(files); + eina_list_free(files); + if (!tb->idler) + tb->idler = ecore_idler_add(_move_idler_cb, popup); +} + +static Eina_Bool +_copy_idler_cb(void *data) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + const char *destination = evas_object_data_get(popup, "destination"); + const char *file; + int i; + + if (!tb->idler_pos) + tb->idler_pos = eina_list_nth(tb->idler_pos, 0); + if (!tb->idler_pos) + { + ecore_idler_del(tb->idler); + tb->idler = NULL; + eina_list_free(tb->idler_pos); + tb->idler_pos = NULL; + if (tb->file_errors > 0) + { + char msg[PATH_MAX]; + + snprintf(msg, PATH_MAX, "%s %d %s.", + _("There was an error copying"), tb->file_errors, + ngettext("file", "files", tb->file_errors)); + _complete(tb, _("Error"), msg); + } + tb->file_errors = 0; + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, NULL, + tb->dirs_only); + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + + return EINA_FALSE; + } + for (i = 0; i < 5; i++) + { + file = eina_list_data_get(tb->idler_pos); + if (!file) + break; + if (ecore_file_exists(file) && ecore_file_is_dir(destination) && + !strncmp("image/", efreet_mime_type_get(file), 6)) + { + char dest[PATH_MAX], fp[PATH_MAX], extra[PATH_MAX]; + int ret; + + snprintf(fp, PATH_MAX, "%s", file); + snprintf(dest, PATH_MAX, "%s/%s", destination, basename(fp)); + if (ecore_file_exists(dest)) + { + snprintf(extra, PATH_MAX, "%s/CopyOf%s", destination, + basename(fp)); + if (ecore_file_exists(extra)) + { + int count; + + for (count = 2; ecore_file_exists(extra); count++) + { + memset(extra, 0, PATH_MAX); + snprintf(extra, PATH_MAX, "%s/Copy%dOf%s", + destination, count, basename(fp)); + } + } + ret = ecore_file_cp(file, extra); + } + else + ret = ecore_file_cp(file, dest); + if (!ret) + tb->file_errors++; + } + tb->idler_pos = eina_list_next(tb->idler_pos); + } + return EINA_TRUE; +} + +static void +_copy_files(Ephoto_Thumb_Browser *tb, Eina_List *files, + const char *destination) +{ + Evas_Object *popup = _processing(tb, _("Copying Files"), + _("Please wait while your files are copied.")); + + evas_object_data_set(popup, "thumb_browser", tb); + evas_object_data_set(popup, "destination", destination); + evas_object_show(popup); + + tb->idler_pos = eina_list_clone(files); + eina_list_free(files); + if (!tb->idler) + tb->idler = ecore_idler_add(_copy_idler_cb, popup); +} + +static void +_new_dir_confirm(void *data, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Evas_Object *popup = data; + Evas_Object *entry = evas_object_data_get(popup, "entry"); + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + Elm_Object_Item *item = elm_genlist_selected_item_get(tb->fsel); + const char *file = evas_object_data_get(popup, "file"); + const char *text = elm_object_text_get(entry); + char new_file_name[PATH_MAX]; + int ret; + + snprintf(new_file_name, PATH_MAX, "%s/%s", file, text); + ret = ecore_file_mkdir(new_file_name); + if (!ret) + { + _complete(tb, _("Error"), _("There was an error creating this directory.")); + } + else + { + tb->dirs_only = 1; + if (item) + { + elm_genlist_item_subitems_clear(item); + ephoto_directory_set(tb->ephoto, file, item, + tb->dirs_only); + } + else + { + elm_genlist_clear(tb->fsel); + ephoto_directory_set(tb->ephoto, file, NULL, + tb->dirs_only); + } + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + } + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); +} + +static void +_new_dir_cancel(void *data, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); +} + +static void +_new_dir(Ephoto_Thumb_Browser *tb, const char *file) +{ + Evas_Object *popup, *box, *entry, *button, *ic; + + evas_object_freeze_events_set(tb->main, EINA_TRUE); + + popup = elm_popup_add(tb->ephoto->win); + elm_object_part_text_set(popup, "title,text", _("New Directory")); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + evas_object_data_set(popup, "thumb_browser", tb); + evas_object_data_set(popup, "file", file); + + box = elm_box_add(popup); + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + entry = elm_entry_add(box); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_editable_set(entry, EINA_TRUE); + elm_object_text_set(entry, _("New Directory")); + elm_entry_select_all(entry); + elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, entry); + evas_object_show(entry); + evas_object_data_set(popup, "entry", entry); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Save")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _new_dir_confirm, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Cancel")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _new_dir_cancel, popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + + elm_object_part_content_set(popup, "default", box); + evas_object_show(popup); +} + +static void +_rename_confirm(void *data, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Evas_Object *popup = data; + Evas_Object *entry = evas_object_data_get(popup, "entry"); + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + const char *file = evas_object_data_get(popup, "file"); + const char *text = elm_object_text_get(entry); + char *escaped = ecore_file_escape_name(text); + char new_file_name[PATH_MAX], dir[PATH_MAX]; + int ret; + + if (!escaped) + { + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + return; + } + snprintf(dir, PATH_MAX, "%s", file); + if (ecore_file_is_dir(file)) + snprintf(new_file_name, PATH_MAX, "%s/%s", dirname(dir), text); + else + snprintf(new_file_name, PATH_MAX, "%s/%s.%s", dirname(dir), escaped, + strrchr(dir, '.')); + ret = ecore_file_mv(file, new_file_name); + if (!ret) + { + if (ecore_file_is_dir(new_file_name)) + _complete(tb, _("Error"), _("There was an error renaming this directory.")); + else + _complete(tb, _("Error"), _("There was an error renaming this file.")); + } + else + { + if (ecore_file_is_dir(new_file_name)) + { + Elm_Object_Item *item = elm_genlist_selected_item_get(tb->fsel); + Elm_Object_Item *parent = elm_genlist_item_parent_get(item); + tb->dirs_only = 1; + if (parent) + { + elm_genlist_item_subitems_clear(parent); + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, + parent, tb->dirs_only); + } + else + { + elm_genlist_clear(tb->fsel); + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, + NULL, tb->dirs_only); + } + } + else + { + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, NULL, + tb->dirs_only); + } + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + } + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + free(escaped); +} + +static void +_rename_cancel(void *data, Evas_Object *obj EINA_UNUSED, + void *event_data EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); +} + +static void +_rename_file(Ephoto_Thumb_Browser *tb, const char *file) +{ + Evas_Object *popup, *box, *entry, *button, *ic; + char buf[PATH_MAX], *bn, *string; + + evas_object_freeze_events_set(tb->main, EINA_TRUE); + + popup = elm_popup_add(tb->ephoto->win); + if (ecore_file_is_dir(file)) + elm_object_part_text_set(popup, "title, text", _("Rename Directory")); + else + elm_object_part_text_set(popup, "title,text", _("Rename File")); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + evas_object_data_set(popup, "thumb_browser", tb); + evas_object_data_set(popup, "file", file); + + box = elm_box_add(popup); + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + snprintf(buf, PATH_MAX, "%s", file); + bn = basename(buf); + string = ecore_file_strip_ext(bn); + + entry = elm_entry_add(box); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_editable_set(entry, EINA_TRUE); + elm_object_text_set(entry, string); + elm_entry_select_all(entry); + elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, entry); + evas_object_show(entry); + evas_object_data_set(popup, "entry", entry); + + free(string); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Rename")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _rename_confirm, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Cancel")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _rename_cancel, popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + + elm_object_part_content_set(popup, "default", box); + evas_object_show(popup); +} + +static Eina_Bool +_delete_idler_cb(void *data) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + const char *file; + char destination[PATH_MAX]; + int i; + + snprintf(destination, PATH_MAX, "%s/.config/ephoto/trash", getenv("HOME")); + + if (!ecore_file_exists(destination)) + ecore_file_mkpath(destination); + + if (!tb->idler_pos) + tb->idler_pos = eina_list_nth(tb->idler_pos, 0); + if (!tb->idler_pos) + { + ecore_idler_del(tb->idler); + tb->idler = NULL; + eina_list_free(tb->idler_pos); + tb->idler_pos = NULL; + if (tb->file_errors > 0) + { + char msg[PATH_MAX]; + + snprintf(msg, PATH_MAX, "%s %d %s.", + _("There was an error deleting"), tb->file_errors, + ngettext("file", "files", tb->file_errors)); + _complete(tb, _("Error"), msg); + } + tb->file_errors = 0; + tb->thumbs_only = 1; + ephoto_directory_set(tb->ephoto, tb->ephoto->config->directory, NULL, + tb->dirs_only); + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + + return EINA_FALSE; + } + for (i = 0; i < 5; i++) + { + file = eina_list_data_get(tb->idler_pos); + if (!file) + break; + if (ecore_file_exists(file) && ecore_file_is_dir(destination)) + { + char dest[PATH_MAX], fp[PATH_MAX], extra[PATH_MAX]; + int ret; + + snprintf(fp, PATH_MAX, "%s", file); + snprintf(dest, PATH_MAX, "%s/%s", destination, basename(fp)); + if (ecore_file_exists(dest)) + { + snprintf(extra, PATH_MAX, "%s/CopyOf%s", destination, + basename(fp)); + if (ecore_file_exists(extra)) + { + int count; + + for (count = 2; ecore_file_exists(extra); count++) + { + memset(extra, 0, sizeof(extra)); + snprintf(extra, PATH_MAX, "%s/Copy%dOf%s", + destination, count, basename(fp)); + } + } + ret = ecore_file_mv(file, extra); + } + else + ret = ecore_file_mv(file, dest); + if (!ret) + tb->file_errors++; + } + tb->idler_pos = eina_list_next(tb->idler_pos); + } + return EINA_TRUE; +} + +static void +_delete_files(Ephoto_Thumb_Browser *tb, Eina_List *files) +{ + Evas_Object *popup = _processing(tb, _("Deleting Files"), + _("Please wait while your files are deleted.")); + + evas_object_data_set(popup, "thumb_browser", tb); + evas_object_data_set(popup, "files", files); + evas_object_show(popup); + + tb->idler_pos = eina_list_clone(files); + eina_list_free(files); + if (!tb->idler) + tb->idler = ecore_idler_add(_delete_idler_cb, popup); +} + +static Eina_Bool +_delete_dir_idler_cb(void *data) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + Elm_Object_Item *item = elm_genlist_selected_item_get(tb->fsel); + Elm_Object_Item *parent = elm_genlist_item_parent_get(item); + const char *dir = evas_object_data_get(popup, "path"); + char destination[PATH_MAX]; + + snprintf(destination, PATH_MAX, "%s/.config/ephoto/trash", getenv("HOME")); + + if (!ecore_file_exists(destination)) + ecore_file_mkpath(destination); + + if (dir) + { + char fp[PATH_MAX], dest[PATH_MAX], extra[PATH_MAX]; + int ret; + + snprintf(fp, PATH_MAX, "%s", dir); + snprintf(dest, PATH_MAX, "%s/%s", destination, basename(fp)); + if (ecore_file_exists(dir) && ecore_file_is_dir(destination)) + { + if (ecore_file_exists(dest)) + { + snprintf(extra, PATH_MAX, "%s/CopyOf%s", destination, + basename(fp)); + if (ecore_file_exists(extra)) + { + int count; + for (count = 2; ecore_file_exists(extra); count++) + { + memset(extra, 0, sizeof(extra)); + snprintf(extra, PATH_MAX, "%s/Copy%dOf%s", + destination, count, basename(fp)); + } + } + ret = ecore_file_mv(dir, extra); + } + else + ret = ecore_file_mv(dir, dest); + if (!ret) + tb->file_errors++; + } + } + if (!dir || tb->file_errors > 0) + { + char msg[PATH_MAX]; + + snprintf(msg, PATH_MAX, "%s.", + _("There was an error deleting this directory")); + _complete(tb, _("Error"), msg); + } + ecore_idler_del(tb->idler); + tb->idler = NULL; + eina_list_free(tb->idler_pos); + + tb->file_errors = 0; + if (parent) + { + elm_genlist_item_subitems_clear(parent); + ephoto_directory_set(tb->ephoto, elm_object_item_data_get(parent), + parent, tb->dirs_only); + } + else + { + char fp[PATH_MAX]; + + snprintf(fp, PATH_MAX, "%s", dir); + elm_genlist_clear(tb->fsel); + ephoto_directory_set(tb->ephoto, dirname(fp), NULL, + tb->dirs_only); + } + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + + return EINA_FALSE; +} + +static void +_delete_dir(Ephoto_Thumb_Browser *tb, const char *path) +{ + Evas_Object *popup = _processing(tb, _("Deleting Directory"), + _("Please wait while your directory is deleted.")); + + evas_object_data_set(popup, "thumb_browser", tb); + evas_object_data_set(popup, "path", path); + evas_object_show(popup); + + tb->idler_pos = NULL; + if (!tb->idler) + tb->idler = ecore_idler_add(_delete_dir_idler_cb, popup); +} + +static Eina_Bool +_empty_trash_idler_cb(void *data) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + const char *file; + char trash[PATH_MAX]; + int i = 0; + + snprintf(trash, PATH_MAX, "%s/.config/ephoto/trash", getenv("HOME")); + + if (!tb->idler_pos) + tb->idler_pos = eina_list_nth(tb->idler_pos, 0); + if (!tb->idler_pos) + { + ecore_idler_del(tb->idler); + tb->idler = NULL; + eina_list_free(tb->idler_pos); + tb->idler_pos = NULL; + if (tb->file_errors > 0) + { + char msg[PATH_MAX]; + + snprintf(msg, PATH_MAX, "%s %d %s.", + _("There was an error deleting"), tb->file_errors, + ngettext("file", "files", tb->file_errors)); + _complete(tb, _("Error"), msg); + } + tb->file_errors = 0; + tb->dirs_only = 0; + tb->thumbs_only = 0; + elm_genlist_clear(tb->fsel); + ephoto_directory_set(tb->ephoto, trash, NULL, tb->dirs_only); + ephoto_title_set(tb->ephoto, tb->ephoto->config->directory); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + + return EINA_FALSE; + } + for (i = 0; i < 5; i++) + { + file = eina_list_data_get(tb->idler_pos); + if (!file) + break; + if (ecore_file_exists(file)) + { + int ret; + + if (ecore_file_is_dir(file)) + ret = ecore_file_recursive_rm(file); + else + ret = ecore_file_unlink(file); + if (!ret) + tb->file_errors++; + } + tb->idler_pos = eina_list_next(tb->idler_pos); + } + return EINA_TRUE; +} + +static void +_empty_trash(Ephoto_Thumb_Browser *tb, Eina_List *files) +{ + Evas_Object *popup = _processing(tb, _("Emptying Trash"), + _("Please wait while your files are deleted.")); + + evas_object_data_set(popup, "thumb_browser", tb); + evas_object_show(popup); + + tb->idler_pos = eina_list_clone(files); + eina_list_free(files); + if (!tb->idler) + tb->idler = ecore_idler_add(_empty_trash_idler_cb, popup); +} + +static void +_prompt_empty_apply(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + Eina_List *files = evas_object_data_get(popup, "files"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + _empty_trash(tb, files); +} + +static void +_prompt_delete_apply(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + Eina_List *files = evas_object_data_get(popup, "files"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + _delete_files(tb, files); +} + +static void +_prompt_delete_dir_apply(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + const char *path = evas_object_data_get(popup, "path"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + _delete_dir(tb, path); +} + +static void +_prompt_move_apply(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + Eina_List *files = evas_object_data_get(popup, "files"); + const char *path = evas_object_data_get(popup, "path"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + _move_files(tb, files, path); +} + +static void +_prompt_copy_apply(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + Eina_List *files = evas_object_data_get(popup, "files"); + const char *path = evas_object_data_get(popup, "path"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + _copy_files(tb, files, path); +} + +static void +_prompt_cancel(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(popup, "thumb_browser"); + + evas_object_del(popup); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); +} + +static Evas_Object * +_prompt(Ephoto_Thumb_Browser *tb, const char *title, const char *text) +{ + Evas_Object *popup, *box, *label; + + evas_object_freeze_events_set(tb->main, EINA_TRUE); + + popup = elm_popup_add(tb->ephoto->win); + elm_object_part_text_set(popup, "title,text", title); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + + box = elm_box_add(popup); + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + label = elm_label_add(box); + elm_object_text_set(label, text); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, label); + evas_object_show(label); + + evas_object_data_set(popup, "thumb_browser", tb); + elm_object_part_content_set(popup, "default", box); + + return popup; +} + +static char * +_drag_data_extract(char **drag_data) +{ + char *uri = NULL; + + if (!drag_data) + return uri; + + char *p = *drag_data; + + if (!p) + return uri; + char *s = strstr(p, FILESEP); + + if (s) + p += FILESEP_LEN; + s = strchr(p, '\n'); + uri = p; + if (s) + { + if (s - p > 0) + { + char *s1 = s - 1; + + if (s1[0] == '\r') + s1[0] = '\0'; + else + { + char *s2 = s + 1; + + if (s2[0] == '\r') + { + s[0] = '\0'; + s++; + } + else + s[0] = '\0'; + } + } + else + s[0] = '\0'; + s++; + } + else + p = NULL; + *drag_data = s; + + return uri; +} + +static Eina_Bool +_drop_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, + Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret EINA_UNUSED) +{ + const char *path = elm_object_item_data_get(it); + printf("%s\n", path); + Eina_List *files = NULL; + Ephoto_Thumb_Browser *tb = evas_object_data_get(obj, "thumb_browser"); + + if (!ev->data) + return EINA_FALSE; + if (ev->len <= 0) + return EINA_FALSE; + if (!path) + return EINA_FALSE; + + char *dd = strdup(ev->data); + + if (!dd) + return EINA_FALSE; + + char *s = _drag_data_extract(&dd); + + while (s) + { + files = eina_list_append(files, s); + s = _drag_data_extract(&dd); + } + free(dd); + + if (tb->ephoto->config->prompts) + { + Evas_Object *ic, *button; + Evas_Object *popup; + char drop_dir[PATH_MAX]; + + snprintf(drop_dir, PATH_MAX, "%s:
%s?", + _("Are you sure you want to drop these files in"), path); + + popup = _prompt(tb, _("Drop Files"), drop_dir); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + if (tb->ephoto->config->move_drop) + evas_object_smart_callback_add(button, "clicked", _prompt_move_apply, + popup); + else + evas_object_smart_callback_add(button, "clicked", _prompt_copy_apply, + popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_cancel, + popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + + evas_object_data_set(popup, "files", files); + evas_object_data_set(popup, "path", path); + + evas_object_show(popup); + } + else + { + if (tb->ephoto->config->move_drop) + _move_files(tb, files, path); + else + _copy_files(tb, files, path); + } + if (tb->dir_current) + elm_genlist_item_selected_set(tb->dir_current, EINA_TRUE); + return EINA_TRUE; +} + +static Elm_Object_Item * +_drop_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, + int *xposret EINA_UNUSED, int *yposret) +{ + Elm_Object_Item *gli; + + gli = elm_genlist_at_xy_item_get(obj, x, y, yposret); + + return gli; +} + +static void +_drop_enter(void *data, Evas_Object *obj EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; - Evas_Event_Key_Down *ev = event_info; - const char *k = ev->keyname; - if (!strcmp(k, "F5")) - { - Elm_Widget_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->ephoto->entries, 0); + if (tb->dragging) + elm_object_cursor_set(tb->main, ELM_CURSOR_TARGET); +} - if (entry) - evas_object_smart_callback_call(tb->main, "slideshow", entry); - } - else if (!strcmp(k, "F11")) +static void +_drop_leave(void *data, Evas_Object *obj EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + + if (tb->dragging) { - Evas_Object *win = tb->ephoto->win; - elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); + elm_object_cursor_set(tb->main, ELM_CURSOR_HAND2); + if (tb->dir_current) + elm_genlist_item_selected_set(tb->dir_current, EINA_TRUE); } } +static void +_drop_pos(void *data EINA_UNUSED, Evas_Object *cont EINA_UNUSED, + Elm_Object_Item *it EINA_UNUSED, Evas_Coord x EINA_UNUSED, + Evas_Coord y EINA_UNUSED, int xposret EINA_UNUSED, + int yposret EINA_UNUSED, Elm_Xdnd_Action action EINA_UNUSED) +{ + elm_genlist_item_selected_set(it, EINA_TRUE); +} + static Eina_Bool _5s_timeout_gone(void *data) { elm_drag_cancel(data); _5s_timeout = NULL; + return ECORE_CALLBACK_CANCEL; } static void _dnd_drag_start(void *data EINA_UNUSED, Evas_Object *obj) { + Ephoto_Thumb_Browser *tb = evas_object_data_get(obj, "thumb_browser"); + if (_5s_cancel) - _5s_timeout = ecore_timer_add(5.0, _5s_timeout_gone, obj); + _5s_timeout = ecore_timer_add(5.0, _5s_timeout_gone, obj); + elm_object_cursor_set(tb->main, ELM_CURSOR_HAND2); + tb->dragging = 1; } static void -_dnd_drag_done(void *data, Evas_Object *obj EINA_UNUSED, Eina_Bool doaccept EINA_UNUSED) +_dnd_drag_done(void *data EINA_UNUSED, Evas_Object *obj, + Eina_Bool doaccept EINA_UNUSED) { + Ephoto_Thumb_Browser *tb = evas_object_data_get(obj, "thumb_browser"); + if (_5s_cancel) { - ecore_timer_del(_5s_timeout); - _5s_timeout = NULL; + ecore_timer_del(_5s_timeout); + _5s_timeout = NULL; } - eina_list_free(data); + elm_object_cursor_unset(tb->main); + tb->dragging = 0; return; } @@ -582,58 +1896,67 @@ static const char * _dnd_drag_data_build(Eina_List **items) { const char *drag_data = NULL; + if (*items) { - Eina_List *l; - Elm_Widget_Item *it; - Ephoto_Entry *e; - unsigned int len = 0; + Eina_List *l; + Elm_Widget_Item *it; + Ephoto_Entry *e; + unsigned int len = 0; - EINA_LIST_FOREACH(*items, l, it) - { - e = elm_object_item_data_get(it); - if (e->path) - len += strlen(e->path); - } + EINA_LIST_FOREACH(*items, l, it) + { + e = elm_object_item_data_get(it); + if (e->path) + len += strlen(e->path); + printf("%s\n", e->path); + } - drag_data = malloc(len + eina_list_count(*items) * (FILESEP_LEN + 1) + 1); - strcpy((char *) drag_data, ""); + drag_data = + malloc(len + eina_list_count(*items) * (FILESEP_LEN + 1) + 1); + strcpy((char *) drag_data, ""); - EINA_LIST_FOREACH(*items, l, it) - { - e = elm_object_item_data_get(it); - if (e->path) - { - strcat((char *)drag_data, FILESEP); - strcat((char *)drag_data, e->path); - strcat((char *)drag_data, "\n"); - } - } + EINA_LIST_FOREACH(*items, l, it) + { + e = elm_object_item_data_get(it); + if (e->path) + { + strcat((char *) drag_data, FILESEP); + strcat((char *) drag_data, e->path); + strcat((char *) drag_data, "\n"); + } + } } return drag_data; } static Evas_Object * -_dnd_create_icon(void *data, Evas_Object *win, Evas_Coord *xoff, Evas_Coord *yoff) +_dnd_create_icon(void *data, Evas_Object *win, Evas_Coord *xoff, + Evas_Coord *yoff) { Evas_Object *icon = NULL; Evas_Object *o = elm_object_item_part_content_get(data, "elm.swallow.icon"); if (o) { - int xm, ym, w = 30, h = 30; - const char *f; - const char *g; - elm_image_file_get(o, &f, &g); - evas_pointer_canvas_xy_get(evas_object_evas_get(o), &xm, &ym); - if (xoff) *xoff = xm-(w/2); - if (yoff) *yoff = ym-(h/2); - icon = elm_icon_add(win); - elm_image_file_set(icon, f, g); - evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - if (xoff && yoff) evas_object_move(icon, *xoff, *yoff); - evas_object_resize(icon, w, h); + int xm, ym, w = 30, h = 30; + const char *f; + const char *g; + + elm_image_file_get(o, &f, &g); + evas_pointer_canvas_xy_get(evas_object_evas_get(o), &xm, &ym); + if (xoff) + *xoff = xm - (w / 2); + if (yoff) + *yoff = ym - (h / 2); + icon = elm_icon_add(win); + elm_image_file_set(icon, f, g); + evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + if (xoff && yoff) + evas_object_move(icon, *xoff, *yoff); + evas_object_resize(icon, w, h); } return icon; @@ -648,33 +1971,40 @@ _dnd_icons_get(void *data) evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym); Eina_List *items = eina_list_clone(elm_gengrid_selected_items_get(data)); - Elm_Widget_Item *gli = elm_gengrid_at_xy_item_get(data, xm, ym, NULL, NULL); + Elm_Widget_Item *gli = elm_gengrid_at_xy_item_get(data, xm, ym, 0, 0); + if (gli) { - void *p = eina_list_search_sorted(items, _entry_cmp_grid, gli); - if (!p) - items = eina_list_append(items, gli); + void *p = eina_list_search_sorted(items, + _entry_cmp_grid_alpha_asc, gli); + + if (!p) + items = eina_list_append(items, gli); } EINA_LIST_FOREACH(items, l, gli) { - Evas_Object *o = elm_object_item_part_content_get(gli, "elm.swallow.icon"); + Evas_Object *o = + elm_object_item_part_content_get(gli, "elm.swallow.icon"); if (o) - { - int x, y, w, h; - const char *f, *g; - elm_image_file_get(o, &f, &g); - Evas_Object *ic = elm_icon_add(data); - elm_image_file_set(ic, f, g); - evas_object_geometry_get(o, &x, &y, &w, &h); - evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_move(ic, x, y); - evas_object_resize(ic, w, h); - evas_object_show(ic); - icons = eina_list_append(icons, ic); - } + { + int x, y, w, h; + const char *f, *g; + + elm_image_file_get(o, &f, &g); + Evas_Object *ic = elm_icon_add(data); + + elm_image_file_set(ic, f, g); + evas_object_geometry_get(o, &x, &y, &w, &h); + evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_move(ic, x, y); + evas_object_resize(ic, w, h); + evas_object_show(ic); + icons = eina_list_append(icons, ic); + } } eina_list_free(items); @@ -689,9 +2019,8 @@ _dnd_get_drag_data(Evas_Object *obj, Elm_Widget_Item *it, Eina_List **items) *items = eina_list_clone(elm_gengrid_selected_items_get(obj)); if (it) { - void *p = eina_list_search_sorted(*items, _entry_cmp_grid, it); - if (!p) - *items = eina_list_append(*items, it); + if (!elm_gengrid_item_selected_get(it)) + *items = eina_list_append(*items, it); } drag_data = _dnd_drag_data_build(items); @@ -699,15 +2028,18 @@ _dnd_get_drag_data(Evas_Object *obj, Elm_Widget_Item *it, Eina_List **items) } static Elm_Widget_Item * -_dnd_item_get(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret, int *yposret) +_dnd_item_get(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret, + int *yposret) { Elm_Widget_Item *item; + item = elm_gengrid_at_xy_item_get(obj, x, y, xposret, yposret); return item; } static Eina_Bool -_dnd_item_data_get(Evas_Object *obj, Elm_Widget_Item *it, Elm_Drag_User_Info *info) +_dnd_item_data_get(Evas_Object *obj, Elm_Widget_Item *it, + Elm_Drag_User_Info *info) { info->format = ELM_SEL_FORMAT_TARGETS; info->createicon = _dnd_create_icon; @@ -715,125 +2047,1059 @@ _dnd_item_data_get(Evas_Object *obj, Elm_Widget_Item *it, Elm_Drag_User_Info *in info->dragstart = _dnd_drag_start; info->icons = _dnd_icons_get(obj); info->dragdone = _dnd_drag_done; - info->data = _dnd_get_drag_data(obj, it, (Eina_List **) &info->donecbdata); + info->data = _dnd_get_drag_data(obj, it, (Eina_List **) & info->donecbdata); info->acceptdata = info->donecbdata; if (info->data) - return EINA_TRUE; + return EINA_TRUE; else - return EINA_FALSE; + return EINA_FALSE; } static void -_main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_fsel_menu_new_dir_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Elm_Object_Item *item = elm_genlist_selected_item_get(tb->fsel); + const char *path; + + if (item) + path = elm_object_item_data_get(item); + else + path = tb->ephoto->config->directory; + if (!path) + return; + _new_dir(tb, path); +} + +static void +_grid_menu_select_all_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Elm_Object_Item *item; + + item = elm_gengrid_first_item_get(tb->grid); + while (item) + { + elm_gengrid_item_selected_set(item, EINA_TRUE); + item = elm_gengrid_item_next_get(item); + } +} + +static void +_grid_menu_clear_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Elm_Object_Item *item; + + item = elm_gengrid_first_item_get(tb->grid); + while (item) + { + elm_gengrid_item_selected_set(item, EINA_FALSE); + item = elm_gengrid_item_next_get(item); + } +} + +static void +_grid_menu_cut_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Eina_List *selection = + eina_list_clone(elm_gengrid_selected_items_get(tb->grid)); + Eina_List *f; + Elm_Object_Item *item; + Ephoto_Entry *file; + + if (eina_list_count(selection) <= 0) + return; + + if (tb->cut_items) + { + eina_list_free(tb->cut_items); + tb->cut_items = NULL; + } + if (tb->copy_items) + { + eina_list_free(tb->copy_items); + tb->copy_items = NULL; + } + EINA_LIST_FOREACH(selection, f, item) + { + file = elm_object_item_data_get(item); + tb->cut_items = eina_list_append(tb->cut_items, strdup(file->path)); + } + eina_list_free(selection); +} + +static void +_grid_menu_copy_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Eina_List *selection = + eina_list_clone(elm_gengrid_selected_items_get(tb->grid)); + Eina_List *f; + Elm_Object_Item *item; + Ephoto_Entry *file; + + if (eina_list_count(selection) <= 0) + return; + + if (tb->cut_items) + { + eina_list_free(tb->cut_items); + tb->cut_items = NULL; + } + if (tb->copy_items) + { + eina_list_free(tb->copy_items); + tb->copy_items = NULL; + } + EINA_LIST_FOREACH(selection, f, item) + { + file = elm_object_item_data_get(item); + tb->copy_items = eina_list_append(tb->copy_items, strdup(file->path)); + } + eina_list_free(selection); +} + +static void +_fsel_menu_paste_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Elm_Object_Item *item = elm_genlist_selected_item_get(tb->fsel); + const char *path; + + if (item) + path = elm_object_item_data_get(item); + else + path = tb->ephoto->config->directory; + + if (eina_list_count(tb->cut_items) > 0) + { + if (tb->ephoto->config->prompts) + { + Evas_Object *ic, *button; + Evas_Object *popup; + + popup = + _prompt(tb, _("Move Files"), + _("Are you sure you want to move these files here?")); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", + _prompt_move_apply, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_cancel, + popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + + evas_object_data_set(popup, "files", + eina_list_clone(tb->cut_items)); + evas_object_data_set(popup, "path", path); + + evas_object_show(popup); + } + else + { + _move_files(tb, eina_list_clone(tb->cut_items), + path); + } + eina_list_free(tb->cut_items); + tb->cut_items = NULL; + } + else if (eina_list_count(tb->copy_items) > 0) + { + if (tb->ephoto->config->prompts) + { + Evas_Object *ic, *button; + Evas_Object *popup; + + popup = + _prompt(tb, _("Paste Files"), + _("Are you sure you want to paste these files here?")); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", + _prompt_copy_apply, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_cancel, + popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + + evas_object_data_set(popup, "files", + eina_list_clone(tb->copy_items)); + evas_object_data_set(popup, "path", path); + + evas_object_show(popup); + } + else + { + _copy_files(tb, eina_list_clone(tb->copy_items), + path); + } + eina_list_free(tb->copy_items); + tb->copy_items = NULL; + } +} + +static void +_grid_menu_paste_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + + if (eina_list_count(tb->cut_items) > 0) + { + if (tb->ephoto->config->prompts) + { + Evas_Object *ic, *button; + Evas_Object *popup; + + popup = + _prompt(tb, _("Move Files"), + _("Are you sure you want to move these files here?")); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", + _prompt_move_apply, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_cancel, + popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + + evas_object_data_set(popup, "files", + eina_list_clone(tb->cut_items)); + evas_object_data_set(popup, "path", tb->ephoto->config->directory); + + evas_object_show(popup); + } + else + { + _move_files(tb, eina_list_clone(tb->cut_items), + tb->ephoto->config->directory); + } + eina_list_free(tb->cut_items); + tb->cut_items = NULL; + } + else if (eina_list_count(tb->copy_items) > 0) + { + if (tb->ephoto->config->prompts) + { + Evas_Object *ic, *button; + Evas_Object *popup; + + popup = + _prompt(tb, _("Paste Files"), + _("Are you sure you want to paste these files here?")); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", + _prompt_copy_apply, popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_cancel, + popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + + evas_object_data_set(popup, "files", + eina_list_clone(tb->copy_items)); + evas_object_data_set(popup, "path", tb->ephoto->config->directory); + + evas_object_show(popup); + } + else + { + _copy_files(tb, eina_list_clone(tb->copy_items), + tb->ephoto->config->directory); + } + eina_list_free(tb->copy_items); + tb->copy_items = NULL; + } +} + +static void +_fsel_menu_rename_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Elm_Object_Item *item = elm_genlist_selected_item_get(tb->fsel); + const char *path; + + if (!item) + return; + + path = elm_object_item_data_get(item); + if (!path) + return; + _rename_file(tb, path); +} + +static void +_grid_menu_rename_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Object_Item *item = data; + Ephoto_Thumb_Browser *tb = evas_object_data_get(item, "thumb_browser"); + Ephoto_Entry *file; + + file = elm_object_item_data_get(item); + _rename_file(tb, file->path); + evas_object_data_del(item, "thumb_browser"); +} + +static void +_fsel_menu_delete_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Elm_Object_Item *item = elm_genlist_selected_item_get(tb->fsel); + const char *path; + + if (!item) + return; + + path = elm_object_item_data_get(item); + if (!path) + return; + + if (tb->ephoto->config->prompts) + { + Evas_Object *ic, *button; + Evas_Object *popup; + + popup = + _prompt(tb, _("Delete Directory"), + _("Are you sure you want to delete this directory?")); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_delete_dir_apply, + popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_cancel, + popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + evas_object_data_set(popup, "path", path); + + evas_object_show(popup); + } + else + { + _delete_dir(tb, path); + } +} + +static void +_grid_menu_delete_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Eina_List *paths = NULL, *f; + Eina_List *selection = + eina_list_clone(elm_gengrid_selected_items_get(tb->grid)); + Elm_Object_Item *item; + Ephoto_Entry *file; + + if (eina_list_count(selection) <= 0) + return; + + EINA_LIST_FOREACH(selection, f, item) + { + file = elm_object_item_data_get(item); + if (ecore_file_exists(file->path)) + paths = eina_list_append(paths, strdup(file->path)); + } + if (tb->ephoto->config->prompts) + { + Evas_Object *ic, *button; + Evas_Object *popup; + + popup = + _prompt(tb, _("Delete Files"), + _("Are you sure you want to delete these files?")); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_delete_apply, + popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_cancel, + popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + evas_object_data_set(popup, "files", paths); + + evas_object_show(popup); + } + else + { + _delete_files(tb, paths); + } + eina_list_free(selection); +} + +static void +_grid_menu_empty_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + Eina_List *paths = NULL; + Elm_Object_Item *item; + Ephoto_Entry *file; + const char *path; + + item = elm_gengrid_first_item_get(tb->grid); + while (item) + { + file = elm_object_item_data_get(item); + paths = eina_list_append(paths, strdup(file->path)); + item = elm_gengrid_item_next_get(item); + } + item = elm_genlist_first_item_get(tb->fsel); + while (item) + { + path = elm_object_item_data_get(item); + paths = eina_list_append(paths, strdup(path)); + item = elm_genlist_item_next_get(item); + } + if (eina_list_count(paths) <= 0) + return; + if (tb->ephoto->config->prompts) + { + Evas_Object *ic, *button; + Evas_Object *popup; + + popup = + _prompt(tb, _("Empty Trash"), + _("Are you sure you want to empty the trash?")); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_icon_standard_set(ic, "document-save"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("Yes")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_empty_apply, + popup); + elm_object_part_content_set(popup, "button1", button); + evas_object_show(button); + + ic = elm_icon_add(popup); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_icon_standard_set(ic, "window-close"); + + button = elm_button_add(popup); + elm_object_text_set(button, _("No")); + elm_object_part_content_set(button, "icon", ic); + evas_object_smart_callback_add(button, "clicked", _prompt_cancel, + popup); + elm_object_part_content_set(popup, "button2", button); + evas_object_show(button); + evas_object_data_set(popup, "files", paths); + + evas_object_show(popup); + } + else + { + _empty_trash(tb, paths); + } +} + +static void +_menu_dismissed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ephoto_Thumb_Browser *tb = data; + + evas_object_del(obj); + elm_object_focus_set(tb->main, EINA_TRUE); +} + +static void +_fsel_mouse_up_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Ephoto_Thumb_Browser *tb = data; + Evas_Object *menu; + Elm_Object_Item *item; + Evas_Event_Mouse_Up *info = event_info; + char trash[PATH_MAX]; + int x, y; + + if (info->button != 3) + return; + + snprintf(trash, PATH_MAX, "%s/.config/ephoto/trash", getenv("HOME")); + + evas_pointer_canvas_xy_get(evas_object_evas_get(tb->fsel), &x, &y); + item = elm_genlist_at_xy_item_get(tb->fsel, x, y, 0); + if (item) + { + elm_genlist_item_selected_set(item, EINA_TRUE); + menu = elm_menu_add(tb->main); + elm_menu_move(menu, x, y); + elm_menu_item_add(menu, NULL, "folder-new", _("New Folder"), + _fsel_menu_new_dir_cb, tb); + if (tb->cut_items || tb->copy_items) + elm_menu_item_add(menu, NULL, "edit-paste", _("Paste"), + _fsel_menu_paste_cb, tb); + elm_menu_item_add(menu, NULL, "edit", _("Rename"), + _fsel_menu_rename_cb, tb); + if (strncmp(tb->ephoto->config->directory, trash, strlen(trash))) + elm_menu_item_add(menu, NULL, "edit-delete", _("Delete"), + _fsel_menu_delete_cb, tb); + else + elm_menu_item_add(menu, NULL, "edit-delete", _("Empty Trash"), + _grid_menu_empty_cb, tb); + evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, + tb); + evas_object_show(menu); + } + else + { + menu = elm_menu_add(tb->main); + elm_menu_move(menu, x, y); + elm_menu_item_add(menu, NULL, "folder-new", _("New Folder"), + _fsel_menu_new_dir_cb, tb); + if (tb->cut_items || tb->copy_items) + elm_menu_item_add(menu, NULL, "edit-paste", _("Paste"), + _fsel_menu_paste_cb, tb); + if (!strncmp(tb->ephoto->config->directory, trash, strlen(trash))) + elm_menu_item_add(menu, NULL, "edit-delete", _("Empty Trash"), + _grid_menu_empty_cb, tb); + evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, + tb); + evas_object_show(menu); + } +} + +static void +_grid_mouse_up_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Ephoto_Thumb_Browser *tb = data; + Evas_Object *menu; + Elm_Object_Item *item; + Evas_Event_Mouse_Up *info = event_info; + char trash[PATH_MAX]; + const Eina_List *selected = elm_gengrid_selected_items_get(tb->grid); + int x, y; + + if (info->button != 3) + return; + + snprintf(trash, PATH_MAX, "%s/.config/ephoto/trash", getenv("HOME")); + + evas_pointer_canvas_xy_get(evas_object_evas_get(tb->grid), &x, &y); + item = elm_gengrid_at_xy_item_get(tb->grid, x, y, 0, 0); + if (item) + elm_gengrid_item_selected_set(item, EINA_TRUE); + if (eina_list_count(selected) > 0 || item) + { + menu = elm_menu_add(tb->main); + elm_menu_move(menu, x, y); + elm_menu_item_add(menu, NULL, "edit-select-all", _("Select All"), + _grid_menu_select_all_cb, tb); + elm_menu_item_add(menu, NULL, "edit-clear", _("Select None"), + _grid_menu_clear_cb, tb); + elm_menu_item_add(menu, NULL, "edit-cut", _("Cut"), _grid_menu_cut_cb, + tb); + elm_menu_item_add(menu, NULL, "edit-copy", _("Copy"), + _grid_menu_copy_cb, tb); + if (tb->cut_items || tb->copy_items) + elm_menu_item_add(menu, NULL, "edit-paste", _("Paste"), + _grid_menu_paste_cb, tb); + if (item) + { + evas_object_data_set(item, "thumb_browser", tb); + elm_menu_item_add(menu, NULL, "edit", _("Rename"), + _grid_menu_rename_cb, item); + } + if (strcmp(tb->ephoto->config->directory, trash)) + elm_menu_item_add(menu, NULL, "edit-delete", _("Delete"), + _grid_menu_delete_cb, tb); + else + elm_menu_item_add(menu, NULL, "edit-delete", _("Empty Trash"), + _grid_menu_empty_cb, tb); + evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, + tb); + evas_object_show(menu); + } + else if (tb->cut_items || tb->copy_items) + { + menu = elm_menu_add(tb->main); + elm_menu_move(menu, x, y); + elm_menu_item_add(menu, NULL, "edit-select-all", _("Select All"), + _grid_menu_select_all_cb, tb); + elm_menu_item_add(menu, NULL, "edit-paste", _("Paste"), + _grid_menu_paste_cb, tb); + if (!strcmp(tb->ephoto->config->directory, trash)) + elm_menu_item_add(menu, NULL, "edit-delete", _("Empty Trash"), + _grid_menu_empty_cb, tb); + evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, + tb); + evas_object_show(menu); + } + else if (!strcmp(tb->ephoto->config->directory, trash)) + { + menu = elm_menu_add(tb->main); + elm_menu_move(menu, x, y); + elm_menu_item_add(menu, NULL, "edit-select-all", _("Select All"), + _grid_menu_select_all_cb, tb); + elm_menu_item_add(menu, NULL, "edit-delete", _("Empty Trash"), + _grid_menu_empty_cb, tb); + evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, + tb); + evas_object_show(menu); + } + else if (elm_gengrid_first_item_get(tb->grid)) + { + menu = elm_menu_add(tb->main); + elm_menu_move(menu, x, y); + elm_menu_item_add(menu, NULL, "edit-select-all", _("Select All"), + _grid_menu_select_all_cb, tb); + evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, + tb); + evas_object_show(menu); + } +} + +static void +_sort_mouse_up_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *menu; + Ephoto_Thumb_Browser *tb = data; + int x, y; + + evas_pointer_canvas_xy_get(evas_object_evas_get(tb->main), &x, &y); + if (elm_gengrid_items_count(tb->grid) <= 0) + return; + + menu = elm_menu_add(tb->main); + elm_menu_move(menu, x, y); + elm_menu_item_add(menu, NULL, "view-sort-ascending", + _("Alphabetical Ascending"), _sort_alpha_asc, tb); + elm_menu_item_add(menu, NULL, "view-sort-descending", + _("Alphabetical Descending"), _sort_alpha_desc, tb); + elm_menu_item_add(menu, NULL, "view-sort-ascending", + _("Modification Time Ascending"), _sort_mod_asc, tb); + elm_menu_item_add(menu, NULL, "view-sort-descending", + _("Modification Time Descending"), _sort_mod_desc, tb); + evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, + tb); + evas_object_show(menu); +} + +static void +_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Ephoto_Thumb_Browser *tb = data; + Evas_Event_Key_Down *ev = event_info; + Eina_Bool ctrl = evas_key_modifier_is_set(ev->modifiers, "Control"); + const char *k = ev->keyname; + + if (ctrl) + { + if ((!strcmp(k, "plus")) || (!strcmp(k, "equal"))) + { + int zoom = tb->ephoto->config->thumb_size + ZOOM_STEP; + + _zoom_set(tb, zoom); + } + else if ((!strcmp(k, "minus")) || (!strcmp(k, "underscore"))) + { + int zoom = tb->ephoto->config->thumb_size - ZOOM_STEP; + + _zoom_set(tb, zoom); + } + else if (!strcmp(k, "Tab")) + { + Elm_Widget_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->ephoto->entries, 0); + + if (entry) + evas_object_smart_callback_call(tb->main, "view", entry); + } + else if (!strcmp(k, "c")) + { + _grid_menu_copy_cb(tb, NULL, NULL); + } + else if (!strcmp(k, "x")) + { + _grid_menu_cut_cb(tb, NULL, NULL); + } + else if (!strcmp(k, "v")) + { + _grid_menu_paste_cb(tb, NULL, NULL); + } + else if (!strcmp(k, "a")) + { + _grid_menu_select_all_cb(tb, NULL, NULL); + } + } + if (!strcmp(k, "F1")) + { + _settings(tb, NULL, NULL); + } + if (!strcmp(k, "F2")) + { + Elm_Object_Item *it = NULL; + + it = eina_list_data_get( + eina_list_last(elm_gengrid_selected_items_get(tb->grid))); + if (it) + { + evas_object_data_set(it, "thumb_browser", tb); + _grid_menu_rename_cb(it, NULL, NULL); + } + } + if (!strcmp(k, "F5")) + { + Elm_Widget_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->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)); + } + else if (!strcmp(k, "Delete")) + { + char path[PATH_MAX]; + char *trash; + + snprintf(path, PATH_MAX, "%s/.config/ephoto/trash", + getenv("HOME")); + trash = strdup(path); + if ((strlen(trash)) == (strlen(tb->ephoto->config->directory))) + { + if (!strcmp(trash, tb->ephoto->config->directory)) + { + _grid_menu_empty_cb(tb, NULL, NULL); + free(trash); + return; + } + } + else + _grid_menu_delete_cb(tb, NULL, NULL); + free(trash); + } +} + +static void +_main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; Ecore_Event_Handler *handler; _todo_items_free(tb); - _grid_items_free(tb); - EINA_LIST_FREE(tb->handlers, handler) - ecore_event_handler_del(handler); - + EINA_LIST_FREE(tb->handlers, handler) ecore_event_handler_del(handler); if (tb->animator.todo_items) { - ecore_animator_del(tb->animator.todo_items); - tb->animator.todo_items = NULL; + ecore_animator_del(tb->animator.todo_items); + tb->animator.todo_items = NULL; } if (tb->ls) { - tb->main_deleted = EINA_TRUE; - eio_file_cancel(tb->ls); - return; + tb->main_deleted = EINA_TRUE; + eio_file_cancel(tb->ls); + return; } + if (tb->idler) + { + ecore_idler_del(tb->idler); + tb->idler = NULL; + } + if (tb->idler_pos) + { + eina_list_free(tb->idler_pos); + tb->idler_pos = NULL; + } + if (tb->cut_items) + eina_list_free(tb->cut_items); + else if (tb->copy_items) + eina_list_free(tb->copy_items); free(tb); } static Eina_Bool -_ephoto_thumb_populate_start(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) +_ephoto_thumb_populate_start(void *data, int type EINA_UNUSED, + void *event EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; evas_object_smart_callback_call(tb->main, "changed,directory", NULL); + tb->dir_loading = + _processing(tb, _("Loading Directory"), + _("Please wait while the directory is loaded.")); + evas_object_show(tb->dir_loading); + tb->animator.processed = 0; + tb->animator.count = 0; + _todo_items_free(tb); - _grid_items_free(tb); - elm_gengrid_clear(tb->grid); - tb->totimages = 0; - tb->totsize = 0; + if (!tb->dirs_only) + { + elm_gengrid_clear(tb->grid); + tb->totimages = 0; + tb->totsize = 0; + } elm_object_text_set(tb->direntry, tb->ephoto->config->directory); return ECORE_CALLBACK_PASS_ON; } static Eina_Bool -_ephoto_thumb_populate_end(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) +_ephoto_thumb_populate_end(void *data, int type EINA_UNUSED, + void *event EINA_UNUSED) { Ephoto_Thumb_Browser *tb = data; tb->ls = NULL; if (tb->main_deleted) { - free(tb); - return ECORE_CALLBACK_PASS_ON; + free(tb); + return ECORE_CALLBACK_PASS_ON; } if (!tb->ephoto->entries) { - if (!tb->nolabel) - { - char buf[PATH_MAX]; - tb->nolabel = elm_label_add(tb->table); - elm_label_line_wrap_set(tb->nolabel, ELM_WRAP_WORD); - elm_object_text_set(tb->nolabel, _("There are no images in this directory")); - evas_object_size_hint_weight_set(tb->nolabel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(tb->nolabel, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(tb->table, tb->nolabel, 0, 0, 4, 1); - evas_object_show(tb->nolabel); - snprintf(buf, PATH_MAX, "%s: 0 %s %s: 0%s", _("Total"), ngettext("image", "images", 0), _("Size"), ngettext("B", "B", 0)); - elm_object_text_set(tb->infolabel, buf); - } - } - else - { - if (tb->nolabel) - { - elm_table_unpack(tb->table, tb->nolabel); - evas_object_del(tb->nolabel); - tb->nolabel = NULL; - } - char isize[PATH_MAX]; - char image_info[PATH_MAX]; + if (!tb->nolabel) + { + char buf[PATH_MAX]; - if (tb->totsize < 1024.0) snprintf(isize, sizeof(isize), "%'.0f%s", tb->totsize, ngettext("B", "B", tb->totsize)); - else - { - tb->totsize /= 1024.0; - if (tb->totsize < 1024) snprintf(isize, sizeof(isize), "%'.0f%s", tb->totsize, ngettext("KB", "KB", tb->totsize)); - else - { - tb->totsize /= 1024.0; - if (tb->totsize < 1024) snprintf(isize, sizeof(isize), "%'.1f%s", tb->totsize, ngettext("MB", "MB", tb->totsize)); - else - { - tb->totsize /= 1024.0; - if (tb->totsize < 1024) snprintf(isize, sizeof(isize), "%'.1f%s", tb->totsize, ngettext("GB", "GB", tb->totsize)); - else - { - tb->totsize /= 1024.0; - snprintf(isize, sizeof(isize), "%'.1f%s", tb->totsize, ngettext("TB", "TB", tb->totsize)); - } - } - } - } - snprintf(image_info, PATH_MAX, "%s: %d %s %s: %s", - _("Total"), tb->totimages, ngettext("image", "images", tb->totimages), _("Size"), isize); - elm_object_text_set(tb->infolabel, image_info); + elm_table_unpack(tb->table, tb->grid); + tb->nolabel = elm_label_add(tb->table); + elm_label_line_wrap_set(tb->nolabel, ELM_WRAP_WORD); + elm_object_text_set(tb->nolabel, + _("There are no images in this directory")); + evas_object_size_hint_weight_set(tb->nolabel, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb->nolabel, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_table_pack(tb->table, tb->nolabel, 0, 0, 4, 1); + evas_object_show(tb->nolabel); + elm_table_pack(tb->table, tb->grid, 0, 0, 4, 1); + snprintf(buf, PATH_MAX, "%s: 0 %s %s: 0%s", + _("Total"), ngettext("image", "images", 0), _("Size"), + ngettext("B", "B", 0)); + elm_object_text_set(tb->infolabel, buf); + } } + else if (!tb->dirs_only) + { + if (tb->nolabel) + { + elm_table_unpack(tb->table, tb->nolabel); + evas_object_del(tb->nolabel); + tb->nolabel = NULL; + } + char isize[PATH_MAX]; + char image_info[PATH_MAX]; + + if (tb->totsize < 1024.0) + snprintf(isize, sizeof(isize), "%'.0f%s", tb->totsize, ngettext("B", + "B", tb->totsize)); + else + { + tb->totsize /= 1024.0; + if (tb->totsize < 1024) + snprintf(isize, sizeof(isize), "%'.0f%s", tb->totsize, + ngettext("KB", "KB", tb->totsize)); + else + { + tb->totsize /= 1024.0; + if (tb->totsize < 1024) + snprintf(isize, sizeof(isize), "%'.1f%s", tb->totsize, + ngettext("MB", "MB", tb->totsize)); + else + { + tb->totsize /= 1024.0; + if (tb->totsize < 1024) + snprintf(isize, sizeof(isize), "%'.1f%s", tb->totsize, + ngettext("GB", "GB", tb->totsize)); + else + { + tb->totsize /= 1024.0; + snprintf(isize, sizeof(isize), "%'.1f%s", + tb->totsize, ngettext("TB", "TB", tb->totsize)); + } + } + } + } + snprintf(image_info, PATH_MAX, "%s: %d %s %s: %s", + _("Total"), tb->totimages, ngettext("image", "images", + tb->totimages), _("Size"), isize); + elm_object_text_set(tb->infolabel, image_info); + } + if (tb->dir_loading && (tb->animator.processed == tb->animator.count)) + { + evas_object_del(tb->dir_loading); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + } + tb->dirs_only = 0; + tb->thumbs_only = 0; + return ECORE_CALLBACK_PASS_ON; } static Eina_Bool -_ephoto_thumb_populate_error(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) +_ephoto_thumb_populate_error(void *data, int type EINA_UNUSED, + void *event EINA_UNUSED) { + Ephoto_Thumb_Browser *tb = data; + + if (tb->dir_loading) + { + evas_object_del(tb->dir_loading); + evas_object_freeze_events_set(tb->main, EINA_FALSE); + elm_object_focus_set(tb->main, EINA_TRUE); + } + tb->dirs_only = 0; + tb->thumbs_only = 0; + return ECORE_CALLBACK_PASS_ON; } @@ -845,28 +3111,43 @@ _ephoto_thumb_entry_create(void *data, int type EINA_UNUSED, void *event) Ephoto_Entry *e; e = ev->entry; - tb->todo_items = eina_list_append(tb->todo_items, e); - - if (!e->is_dir) + if (!e->is_dir && !tb->dirs_only) { - Eina_File *f; - tb->totimages += 1; - f = eina_file_open(e->path, EINA_FALSE); - tb->totsize += (double)eina_file_size_get(f); - eina_file_close(f); - } + Eina_File *f; + tb->totimages += 1; + f = eina_file_open(e->path, EINA_FALSE); + tb->totsize += (double) eina_file_size_get(f); + eina_file_close(f); + tb->todo_items = eina_list_append(tb->todo_items, e); + tb->animator.count++; + } + else if (e->is_dir && !tb->thumbs_only) + { + tb->todo_items = eina_list_append(tb->todo_items, e); + tb->animator.count++; + } if (!tb->animator.todo_items) - tb->animator.todo_items = ecore_animator_add(_todo_items_process, tb); + tb->animator.todo_items = ecore_animator_add(_todo_items_process, tb); return ECORE_CALLBACK_PASS_ON; } +void +ephoto_thumb_browser_fsel_clear(Ephoto *ephoto) +{ + Ephoto_Thumb_Browser *tb = + evas_object_data_get(ephoto->thumb_browser, "thumb_browser"); + + if (tb) + elm_genlist_clear(tb->fsel); +} + Evas_Object * ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent) { Evas_Object *box = elm_box_add(parent); - Evas_Object *icon, *min, *max, *hbox, *botbox, *but, *sep, *ic; + Evas_Object *icon, *hbox, *botbox, *but, *sep, *ic; Evas_Coord w, h; Ephoto_Thumb_Browser *tb; @@ -884,18 +3165,26 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent) _ephoto_dir_class.item_style = "default"; _ephoto_dir_class.func.text_get = _ephoto_dir_item_text_get; _ephoto_dir_class.func.content_get = _ephoto_dir_item_icon_get; - //_ephoto_dir_class.func.state_get = NULL; + _ephoto_dir_class.func.state_get = NULL; _ephoto_dir_class.func.del = _ephoto_dir_item_del; tb->ephoto = ephoto; - tb->contracted = 0; + tb->thumbs_only = 0; + tb->dirs_only = 0; + tb->dragging = 0; + tb->cut_items = NULL; + tb->copy_items = NULL; + tb->dir_current = NULL; + tb->sort = EPHOTO_SORT_ALPHABETICAL_ASCENDING; tb->main = box; + elm_box_horizontal_set(tb->main, EINA_TRUE); - evas_object_size_hint_weight_set(tb->main, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(tb->main, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(tb->main, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_event_callback_add(tb->main, EVAS_CALLBACK_DEL, _main_del, tb); - evas_object_event_callback_add - (tb->main, EVAS_CALLBACK_KEY_DOWN, _key_down, tb); + evas_object_event_callback_add(tb->main, EVAS_CALLBACK_KEY_DOWN, _key_down, + tb); evas_object_data_set(tb->main, "thumb_browser", tb); tb->leftbox = elm_box_add(tb->main); @@ -909,18 +3198,24 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent) elm_toolbar_homogeneous_set(tb->bar, EINA_TRUE); elm_toolbar_shrink_mode_set(tb->bar, ELM_TOOLBAR_SHRINK_NONE); elm_toolbar_select_mode_set(tb->bar, ELM_OBJECT_SELECT_MODE_NONE); + elm_object_tree_focus_allow_set(tb->bar, EINA_FALSE); elm_toolbar_icon_order_lookup_set(tb->bar, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_weight_set(tb->bar, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(tb->bar, EVAS_HINT_FILL, EVAS_HINT_FILL); - icon = elm_toolbar_item_append(tb->bar, "zoom-in", _("Zoom In"), _zoom_in, tb); - max = elm_object_item_widget_get(icon); - icon = elm_toolbar_item_append(tb->bar, "zoom-out", _("Zoom Out"), _zoom_out, tb); - min = elm_object_item_widget_get(icon); - evas_object_data_set(max, "min", min); - evas_object_data_set(min, "max", max); - elm_toolbar_item_append(tb->bar, "media-playback-start", _("Slideshow"), _slideshow, tb); - elm_toolbar_item_append(tb->bar, "preferences-system", _("Settings"), _settings, tb); + icon = + elm_toolbar_item_append(tb->bar, "zoom-in", _("Zoom In"), _zoom_in, tb); + tb->max = elm_object_item_widget_get(icon); + icon = + elm_toolbar_item_append(tb->bar, "zoom-out", _("Zoom Out"), _zoom_out, + tb); + tb->min = elm_object_item_widget_get(icon); + evas_object_data_set(tb->max, "min", tb->min); + evas_object_data_set(tb->min, "max", tb->max); + elm_toolbar_item_append(tb->bar, "media-playback-start", _("Slideshow"), + _slideshow, tb); + elm_toolbar_item_append(tb->bar, "preferences-system", _("Settings"), + _settings, tb); elm_box_pack_end(tb->leftbox, tb->bar); evas_object_show(tb->bar); @@ -937,11 +3232,15 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent) tb->direntry = elm_entry_add(tb->leftbox); elm_entry_single_line_set(tb->direntry, EINA_TRUE); elm_entry_scrollable_set(tb->direntry, EINA_TRUE); - elm_scroller_policy_set(tb->direntry, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - evas_object_size_hint_weight_set(tb->direntry, EVAS_HINT_EXPAND, EVAS_HINT_FILL); - evas_object_size_hint_align_set(tb->direntry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_policy_set(tb->direntry, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(tb->direntry, EVAS_HINT_EXPAND, + EVAS_HINT_FILL); + evas_object_size_hint_align_set(tb->direntry, EVAS_HINT_FILL, + EVAS_HINT_FILL); elm_box_pack_end(tb->leftbox, tb->direntry); - evas_object_smart_callback_add(tb->direntry, "activated", _ephoto_direntry_go, tb); + evas_object_smart_callback_add(tb->direntry, "activated", + _ephoto_direntry_go, tb); evas_object_show(tb->direntry); hbox = elm_box_add(tb->leftbox); @@ -977,19 +3276,43 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent) elm_box_pack_end(hbox, but); evas_object_show(but); + ic = elm_icon_add(hbox); + elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); + elm_icon_standard_set(ic, "user-trash"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + but = elm_button_add(hbox); + elm_object_part_content_set(but, "icon", ic); + elm_object_text_set(but, _("Trash")); + evas_object_size_hint_weight_set(but, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(but, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(but, "clicked", _ephoto_dir_go_trash, tb); + elm_box_pack_end(hbox, but); + evas_object_show(but); + tb->fsel = elm_genlist_add(tb->leftbox); elm_genlist_homogeneous_set(tb->fsel, EINA_TRUE); - elm_genlist_select_mode_set(tb->fsel, ELM_OBJECT_SELECT_MODE_ALWAYS); - evas_object_size_hint_weight_set(tb->fsel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_genlist_select_mode_set(tb->fsel, ELM_OBJECT_SELECT_MODE_DEFAULT); + evas_object_size_hint_weight_set(tb->fsel, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(tb->fsel, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(tb->leftbox, tb->fsel); - evas_object_smart_callback_add - (tb->fsel, "clicked,double", _ephoto_dir_selected, tb); - evas_object_smart_callback_add(tb->fsel, "expand,request", _on_list_expand_req, tb); - evas_object_smart_callback_add(tb->fsel, "contract,request", _on_list_contract_req, tb); + evas_object_smart_callback_add(tb->fsel, "clicked,double", + _ephoto_dir_double_clicked, tb); + evas_object_smart_callback_add(tb->fsel, "expand,request", + _on_list_expand_req, tb); + evas_object_smart_callback_add(tb->fsel, "contract,request", + _on_list_contract_req, tb); evas_object_smart_callback_add(tb->fsel, "expanded", _on_list_expanded, tb); - evas_object_smart_callback_add(tb->fsel, "contracted", _on_list_contracted, tb); + evas_object_smart_callback_add(tb->fsel, "contracted", _on_list_contracted, + tb); + evas_object_smart_callback_add(tb->fsel, "selected", _on_list_selected, tb); + evas_object_event_callback_add(tb->fsel, EVAS_CALLBACK_MOUSE_UP, + _fsel_mouse_up_cb, tb); + evas_object_data_set(tb->fsel, "thumb_browser", tb); evas_object_show(tb->fsel); + elm_drop_item_container_add(tb->fsel, ELM_SEL_FORMAT_TARGETS, + _drop_item_getcb, _drop_enter, tb, _drop_leave, tb, _drop_pos, tb, + _drop_dropcb, NULL); ic = elm_icon_add(hbox); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); @@ -1007,72 +3330,91 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent) tb->ephoto->bottom_bar_size = h; tb->table = elm_table_add(tb->main); - evas_object_size_hint_weight_set(tb->table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(tb->table, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(tb->table, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(tb->main, tb->table); evas_object_show(tb->table); tb->grid = elm_gengrid_add(tb->table); - evas_object_size_hint_weight_set - (tb->grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(tb->grid, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(tb->grid, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_gengrid_align_set(tb->grid, 0.5, 0.0); - elm_gengrid_highlight_mode_set(tb->grid, EINA_FALSE); + elm_gengrid_multi_select_set(tb->grid, EINA_TRUE); + elm_gengrid_multi_select_mode_set(tb->grid, + ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT); elm_scroller_bounce_set(tb->grid, EINA_FALSE, EINA_TRUE); - evas_object_size_hint_align_set - (tb->grid, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set - (tb->grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - - evas_object_smart_callback_add - (tb->grid, "selected", _ephoto_thumb_selected, tb); - elm_drag_item_container_add(tb->grid, ANIM_TIME, DRAG_TIMEOUT, _dnd_item_get, _dnd_item_data_get); + evas_object_size_hint_align_set(tb->grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(tb->grid, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_smart_callback_add(tb->grid, "activated", + _ephoto_thumb_activated, tb); + evas_object_event_callback_add(tb->grid, EVAS_CALLBACK_MOUSE_UP, + _grid_mouse_up_cb, tb); + elm_drag_item_container_add(tb->grid, ANIM_TIME, DRAG_TIMEOUT, _dnd_item_get, + _dnd_item_data_get); + evas_object_data_set(tb->grid, "thumb_browser", tb); _zoom_set(tb, tb->ephoto->config->thumb_size); evas_object_show(tb->grid); elm_table_pack(tb->table, tb->grid, 0, 0, 4, 1); - botbox = evas_object_rectangle_add(evas_object_evas_get(tb->table)); - evas_object_color_set(botbox, 0, 0, 0, 0); + tb->infolabel = elm_label_add(tb->table); + elm_label_line_wrap_set(tb->infolabel, ELM_WRAP_WORD); + elm_object_text_set(tb->infolabel, "Info Label"); + evas_object_size_hint_weight_set(tb->infolabel, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tb->infolabel, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_aspect_set(tb->infolabel, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + elm_table_pack(tb->table, tb->infolabel, 0, 1, 3, 1); + evas_object_show(tb->infolabel); + + but = elm_button_add(tb->table); + elm_object_text_set(but, _("Sort Images")); + evas_object_size_hint_weight_set(but, 0.0, 0.0); + evas_object_size_hint_align_set(but, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(but, "clicked", _sort_mouse_up_cb, tb); + elm_table_pack(tb->table, but, 3, 1, 1, 1); + evas_object_show(but); + tb->hoversel = but; + + botbox = elm_box_add(tb->table); evas_object_size_hint_min_set(botbox, 0, h); evas_object_size_hint_weight_set(botbox, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_fill_set(botbox, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_table_pack(tb->table, botbox, 0, 1, 4, 1); evas_object_show(botbox); - tb->infolabel = elm_label_add(tb->table); - elm_label_line_wrap_set(tb->infolabel, ELM_WRAP_WORD); - elm_object_text_set(tb->infolabel, "Info Label"); - evas_object_size_hint_weight_set(tb->infolabel, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_align_set(tb->infolabel, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_aspect_set(tb->infolabel, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); - elm_table_pack(tb->table, tb->infolabel, 0, 1, 4, 1); - evas_object_show(tb->infolabel); + tb->handlers = + eina_list_append(tb->handlers, + ecore_event_handler_add(EPHOTO_EVENT_POPULATE_START, + _ephoto_thumb_populate_start, tb)); - tb->handlers = eina_list_append - (tb->handlers, ecore_event_handler_add - (EPHOTO_EVENT_POPULATE_START, _ephoto_thumb_populate_start, tb)); + tb->handlers = + eina_list_append(tb->handlers, + ecore_event_handler_add(EPHOTO_EVENT_POPULATE_END, + _ephoto_thumb_populate_end, tb)); - tb->handlers = eina_list_append - (tb->handlers, ecore_event_handler_add - (EPHOTO_EVENT_POPULATE_END, _ephoto_thumb_populate_end, tb)); + tb->handlers = + eina_list_append(tb->handlers, + ecore_event_handler_add(EPHOTO_EVENT_POPULATE_ERROR, + _ephoto_thumb_populate_error, tb)); - tb->handlers = eina_list_append - (tb->handlers, ecore_event_handler_add - (EPHOTO_EVENT_POPULATE_ERROR, _ephoto_thumb_populate_error, tb)); - - tb->handlers = eina_list_append - (tb->handlers, ecore_event_handler_add - (EPHOTO_EVENT_ENTRY_CREATE, _ephoto_thumb_entry_create, tb)); + tb->handlers = + eina_list_append(tb->handlers, + ecore_event_handler_add(EPHOTO_EVENT_ENTRY_CREATE, + _ephoto_thumb_entry_create, tb)); if (tb->ephoto->config->fsel_hide) - evas_object_smart_callback_call(but, "clicked", tb); + evas_object_smart_callback_call(but, "clicked", tb); return tb->main; - error: + error: evas_object_del(tb->main); return NULL; }