From e3a1481bb9c76453c27a514132cdb55c69cfc666 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Fri, 8 Oct 2010 22:48:12 +0000 Subject: [PATCH] what about generating thumbnails that match the expected view size? now generating thumbnails at 128, 256 and 512, the generation is delayed to avoid unnecessary work for ethumbd. SVN revision: 53217 --- src/bin/ephoto.c | 1 - src/bin/ephoto.h | 5 ++ src/bin/ephoto_config.c | 7 ++- src/bin/ephoto_directory_thumb.c | 3 +- src/bin/ephoto_main.c | 85 +++++++++++++++++++++++++++++++- src/bin/ephoto_thumb_browser.c | 18 +++---- 6 files changed, 102 insertions(+), 17 deletions(-) diff --git a/src/bin/ephoto.c b/src/bin/ephoto.c index 251c311..b7bf729 100644 --- a/src/bin/ephoto.c +++ b/src/bin/ephoto.c @@ -25,7 +25,6 @@ main(int argc, char **argv) r = 1; goto end_log_domain; } - ethumb_client_size_set(client, 100, 100); ethumb_client_crop_align_set(client, 0.5, 0.5); ethumb_client_aspect_set(client, ETHUMB_THUMB_KEEP_ASPECT); ethumb_client_orientation_set(client, ETHUMB_THUMB_ORIENT_ORIGINAL); diff --git a/src/bin/ephoto.h b/src/bin/ephoto.h index de7d26b..9323b96 100644 --- a/src/bin/ephoto.h +++ b/src/bin/ephoto.h @@ -30,6 +30,9 @@ typedef enum _Ephoto_Orient Ephoto_Orient; /*Main Functions*/ void ephoto_create_main_window(const char *directory, const char *image); +void ephoto_thumb_size_set(int size); +Evas_Object *ephoto_thumb_add(Evas_Object *parent, const char *path); + /* Configuration */ Eina_Bool ephoto_config_init(Ephoto *em); @@ -85,6 +88,7 @@ struct _Ephoto_Config int config_version; int thumb_size; + int thumb_gen_size; int remember_directory; const char *directory; @@ -122,6 +126,7 @@ extern Ephoto *em; 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__) static inline Eina_Bool diff --git a/src/bin/ephoto_config.c b/src/bin/ephoto_config.c index aaf8298..8143d12 100644 --- a/src/bin/ephoto_config.c +++ b/src/bin/ephoto_config.c @@ -1,6 +1,6 @@ #include "ephoto.h" -#define CONFIG_VERSION 4 +#define CONFIG_VERSION 5 static int _ephoto_config_load(Ephoto *em); static Eina_Bool _ephoto_on_config_save(void *data); @@ -24,6 +24,7 @@ ephoto_config_init(Ephoto *em) #define C_VAL(edd, type, member, dtype) EET_DATA_DESCRIPTOR_ADD_BASIC(edd, type, #member, member, dtype) C_VAL(D, T, config_version, EET_T_INT); C_VAL(D, T, thumb_size, EET_T_INT); + C_VAL(D, T, thumb_gen_size, EET_T_INT); C_VAL(D, T, remember_directory, EET_T_INT); C_VAL(D, T, directory, EET_T_STRING); C_VAL(D, T, slideshow_timeout, EET_T_DOUBLE); @@ -37,6 +38,7 @@ ephoto_config_init(Ephoto *em) /* Start a new config */ em->config->config_version = CONFIG_VERSION; em->config->thumb_size = 256; + em->config->thumb_gen_size = 256; em->config->remember_directory = 1; em->config->slideshow_timeout = 4.0; em->config->slideshow_transition = @@ -59,6 +61,9 @@ ephoto_config_init(Ephoto *em) if (em->config->config_version < 4) em->config->sort_images = 1; + if (em->config->config_version < 5) + em->config->thumb_gen_size = 256; + /* Incremental additions */ em->config->config_version = CONFIG_VERSION; break; diff --git a/src/bin/ephoto_directory_thumb.c b/src/bin/ephoto_directory_thumb.c index 73b2e65..66295cb 100644 --- a/src/bin/ephoto_directory_thumb.c +++ b/src/bin/ephoto_directory_thumb.c @@ -69,8 +69,7 @@ _populate_main(void *data, const Eina_File_Direct_Info *info) evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(frame); - image = elm_thumb_add(frame); - elm_thumb_file_set(image, info->path, NULL); + image = ephoto_thumb_add(frame, info->path); elm_object_style_set(image, "ephoto"); evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL); diff --git a/src/bin/ephoto_main.c b/src/bin/ephoto_main.c index 49904d2..ce7163f 100644 --- a/src/bin/ephoto_main.c +++ b/src/bin/ephoto_main.c @@ -3,6 +3,9 @@ /*Ephoto Main Global*/ Ephoto *em; +static Eina_List *_thumbs = NULL; +static Ecore_Timer *_thumb_gen_size_changed_timer = NULL; + /*Inline Callbacks*/ static void _ephoto_delete_main_window(void *data, Evas_Object *obj, void *event_info); static void _ephoto_flow_browser_delete_cb(void *data, Evas_Object *obj, void *event_info); @@ -42,10 +45,22 @@ void ephoto_create_main_window(const char *directory, const char *image) { char current_directory[PATH_MAX]; + Ethumb_Client *client = elm_thumb_ethumb_client_get(); em = calloc(1, sizeof(Ephoto)); if (!ephoto_config_init(em)) - _ephoto_delete_main_window(NULL, NULL, NULL); + { + _ephoto_delete_main_window(NULL, NULL, NULL); + return; + } + + if ((em->config->thumb_gen_size != 128) && + (em->config->thumb_gen_size != 256) && + (em->config->thumb_gen_size != 512)) + ephoto_thumb_size_set(em->config->thumb_size); + else + ethumb_client_size_set + (client, em->config->thumb_gen_size, em->config->thumb_gen_size); /*Setup the main window*/ em->win = elm_win_add(NULL, "ephoto", ELM_WIN_BASIC); @@ -150,3 +165,71 @@ _ephoto_delete_main_window(void *data, Evas_Object *obj, void *event_info) elm_exit(); } +static Eina_Bool +_thumb_gen_size_changed_timer_cb(void *data) +{ + const int gen_size = (long)data; + Ethumb_Client *client; + const Eina_List *l; + Evas_Object *o; + + if (em->config->thumb_gen_size == gen_size) goto end; + + INF("thumbnail generation size changed from %d to %d", + em->config->thumb_gen_size, gen_size); + + client = elm_thumb_ethumb_client_get(); + em->config->thumb_gen_size = gen_size; + ethumb_client_size_set(client, gen_size, gen_size); + + EINA_LIST_FOREACH(_thumbs, l, o) + elm_thumb_reload(o); + + end: + _thumb_gen_size_changed_timer = NULL; + return EINA_FALSE; +} + +void +ephoto_thumb_size_set(int size) +{ + int gen_size; + + if (em->config->thumb_size != size) + { + INF("thumbnail display size changed from %d to %d", + em->config->thumb_size, size); + em->config->thumb_size = size; + ephoto_config_save(em, EINA_FALSE); + } + + if (size <= 128) gen_size = 128; + else if (size <= 256) gen_size = 256; + else gen_size = 512; + + if (_thumb_gen_size_changed_timer) + { + ecore_timer_del(_thumb_gen_size_changed_timer); + _thumb_gen_size_changed_timer = NULL; + } + + _thumb_gen_size_changed_timer = ecore_timer_add + (0.1, _thumb_gen_size_changed_timer_cb, (void*)(long)gen_size); +} + +static void +_thumb_del(void *data, Evas *e, Evas_Object *o, void *event_info) +{ + _thumbs = eina_list_remove(_thumbs, o); +} + +Evas_Object * +ephoto_thumb_add(Evas_Object *parent, const char *path) +{ + Evas_Object *o = elm_thumb_add(parent); + if (!o) return NULL; + elm_thumb_file_set(o, path, NULL); + _thumbs = eina_list_append(_thumbs, o); + evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _thumb_del, NULL); + return o; +} diff --git a/src/bin/ephoto_thumb_browser.c b/src/bin/ephoto_thumb_browser.c index fc11d8c..cc7d453 100644 --- a/src/bin/ephoto_thumb_browser.c +++ b/src/bin/ephoto_thumb_browser.c @@ -394,14 +394,11 @@ _ephoto_zoom_regular_size(void *data, Evas_Object *obj, void *event) static void _ephoto_slider_changed(void *data, Evas_Object *obj, void *event) { - int val; - Ephoto_Thumb_Browser *tb = data; + Ephoto_Thumb_Browser *tb = data; + int val = elm_slider_value_get(tb->thumb_slider); + elm_gengrid_item_size_set(tb->thumb_browser, val, val / THUMB_RATIO); - val = elm_slider_value_get(tb->thumb_slider); - elm_gengrid_item_size_set(tb->thumb_browser, val, val / THUMB_RATIO); - - em->config->thumb_size = val; - ephoto_config_save(em, EINA_FALSE); + ephoto_thumb_size_set(val); } /* Called when adding a directory or a file to elm_gengrid */ @@ -460,11 +457,8 @@ _ephoto_get_icon(void *data, Evas_Object *obj, const char *part) o = ephoto_directory_thumb_add(thumb, etd->thumb_path); } else - { - o = elm_thumb_add(thumb); - elm_thumb_file_set(o, etd->thumb_path, NULL); - } - evas_object_show(o); + o = ephoto_thumb_add(thumb, etd->thumb_path); + elm_layout_content_set(thumb, "ephoto.swallow.content", o); return thumb;