From 4e6e38a200a28ac7910088adf3d75b3dd85b37a7 Mon Sep 17 00:00:00 2001 From: titan Date: Tue, 13 Oct 2009 23:46:47 +0000 Subject: [PATCH] Add slideshow functionality, still needs some work. SVN revision: 43064 --- data/themes/default/ephoto.edc | 159 ++++++++- data/themes/default/images/Makefile.am | 3 +- .../default/images/x-office-presentation.png | Bin 0 -> 2780 bytes src/bin/Makefile.am | 4 +- src/bin/ephoto.h | 13 + src/bin/ephoto_flow.c | 13 + src/bin/ephoto_main.c | 2 + src/bin/ephoto_slide.c | 310 ++++++++++++++++++ src/bin/ephoto_slideshow.c | 26 ++ 9 files changed, 527 insertions(+), 3 deletions(-) create mode 100644 data/themes/default/images/x-office-presentation.png create mode 100644 src/bin/ephoto_slide.c create mode 100644 src/bin/ephoto_slideshow.c diff --git a/data/themes/default/ephoto.edc b/data/themes/default/ephoto.edc index 912568b..5ce76b6 100644 --- a/data/themes/default/ephoto.edc +++ b/data/themes/default/ephoto.edc @@ -13,6 +13,7 @@ collections image: "thumb_shadow.png" COMP; image: "left_arrow.png" COMP; image: "window_fullscreen.png" COMP; + image: "x-office-presentation.png" COMP; } group { @@ -416,7 +417,26 @@ collections color: 255 255 255 255; image.normal: "left_arrow.png"; } - } + } + part + { + name: "ephoto.start.slideshow"; + type: IMAGE; + mouse_events: 1; + description + { + state: "default" 0.0; + visible: 1; + min: 32 32; + max: 32 32; + rel1.relative: 1.0 0.0; + rel1.offset: -65 45; + rel2.relative: 1.0 0.0; + rel2.offset: -1 -1; + color: 255 255 255 255; + image.normal: "x-office-presentation.png"; + } + } part { name: "ephoto.move.left"; @@ -453,5 +473,142 @@ collections } } } + group + { + name: "/ephoto/slide/view"; + parts + { + part + { + name: "image_area"; + type: RECT; + mouse_events: 1; + description + { + state: "default" 0.0; + visible: 1; + rel1.relative: 0.0 0.0; + rel1.offset: 27 0; + rel2.relative: 1.0 1.0; + rel2.offset: -27 -1; + color: 255 255 255 255; + } + } + part + { + name: "ephoto.swallow.content"; + type: SWALLOW; + mouse_events: 1; + clip_to: "image_area"; + description + { + state: "default" 0.0; + visible: 1; + rel1.to: "image_area"; + rel1.relative: 0.5 0.5; + rel1.offset: 0 0; + rel2.to: "image_area"; + rel2.relative: 0.5 0.5; + rel2.offset: 0 0; + color: 255 255 255 255; + } + } + part + { + name: "ephoto.move.back"; + type: IMAGE; + mouse_events: 1; + description + { + state: "default" 0.0; + visible: 1; + min: 32 32; + max: 32 32; + rel1.relative: 0.0 0.0; + rel1.offset: 50 50; + rel2.relative: 0.0 0.0; + rel2.offset: -1 -1; + color: 255 255 255 255; + image.normal: "left_arrow.png"; + } + } + } + } + group + { + name: "/ephoto/slide/images"; + parts + { + part + { + name: "ephoto.image.one"; + type: IMAGE; + mouse_events: 1; + description + { + state: "default" 0.0; + color: 255 255 255 255; + } + description + { + state: "fade" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + } + } + part + { + name: "ephoto.image.two"; + type: IMAGE; + mouse_events: 1; + description + { + state: "default" 0.0; + color: 255 255 255 0; + } + description + { + state: "fade" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + } + programs + { + program + { + name: "fade"; + signal: "ephoto.change.image"; + source: "ephoto"; + action: STATE_SET "default" 0.0; + target: "ephoto.image.one"; + target: "ephoto.image.two"; + after: "fade2"; + } + program + { + name: "fade2"; + action: STATE_SET "fade" 0.0; + target: "ephoto.image.one"; + target: "ephoto.image.two"; + transition: SINUSOIDAL 1.0; + after: "done"; + } + program + { + name: "done"; + action: STATE_SET "default" 0.0; + target: "ephoto.image.one"; + target: "ephoto.image.two"; + after: "signal_done"; + } + program + { + name: "signal_done"; + action: SIGNAL_EMIT "ephoto.transition.done" "ephoto"; + } + } + } } diff --git a/data/themes/default/images/Makefile.am b/data/themes/default/images/Makefile.am index 71211f2..548c586 100644 --- a/data/themes/default/images/Makefile.am +++ b/data/themes/default/images/Makefile.am @@ -19,4 +19,5 @@ move_right.png \ selected.png \ thumb_shadow.png \ left_arrow.png \ -window_fullscreen.png +window_fullscreen.png \ +x-office-presentation.png diff --git a/data/themes/default/images/x-office-presentation.png b/data/themes/default/images/x-office-presentation.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffc3834a752a46efe9573c85fb912696dd41290 GIT binary patch literal 2780 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, sd->list); +} + Evas_Object *ephoto_flow_add(Evas *e) { _flow_smart_init(); @@ -162,6 +173,8 @@ static void _flow_smart_add(Evas_Object *obj) edje_object_signal_callback_add(sd->obj, "mouse,up,1", "ephoto.move.back", go_back, sd); + edje_object_signal_callback_add(sd->obj, "mouse,up,1", "ephoto.start.slideshow", start_slideshow, sd); + sd->center_image = ephoto_image_add(); edje_object_part_swallow(sd->obj, "ephoto.swallow.content", sd->center_image); } diff --git a/src/bin/ephoto_main.c b/src/bin/ephoto_main.c index 4470a03..5718274 100644 --- a/src/bin/ephoto_main.c +++ b/src/bin/ephoto_main.c @@ -42,6 +42,7 @@ window_shown(void *data, Evas *e, Evas_Object *obj, void *event_info) { add_image_browser(); add_flow_view(); + add_slideshow(); show_image_browser(); evas_object_event_callback_del(em->bg, EVAS_CALLBACK_SHOW, window_shown); } @@ -51,6 +52,7 @@ static void window_close(Ecore_Evas *ee) { evas_object_del(em->image_browser); evas_object_del(em->flow); + evas_object_del(em->slideshow); if (em->images) eina_list_free(em->images); free(em); diff --git a/src/bin/ephoto_slide.c b/src/bin/ephoto_slide.c new file mode 100644 index 0000000..e8e8caa --- /dev/null +++ b/src/bin/ephoto_slide.c @@ -0,0 +1,310 @@ +#include "ephoto.h" + +typedef struct _Smart_Data Smart_Data; + +struct _Smart_Data +{ + Evas_Object *obj; + Evas_Object *images; + int x; + int y; + int w; + int h; + Evas_Object *center_image_one; + Evas_Object *center_image_two; + Eina_List *current_node; + Eina_List *list; + Ecore_Timer *timer; +}; + +static Evas_Smart *_smart = NULL; + +static void _slide_smart_reconfigure(Smart_Data *sd); +static void _slide_smart_init(void); +static void _slide_smart_add(Evas_Object *obj); +static void _slide_smart_del(Evas_Object *obj); +static void _slide_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static void _slide_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h); +static void _slide_smart_show(Evas_Object *obj); +static void _slide_smart_hide(Evas_Object *obj); +static void _slide_smart_color_set(Evas_Object *obj, int r, int g, int b, int a); +static void _slide_smart_clip_set(Evas_Object *obj, Evas_Object *clip); +static void _slide_smart_clip_unset(Evas_Object *obj); + +static int change_image(void *data); +static void go_back(void *data, Evas_Object *obj, const char *emission, const char *source); +static void done(void *data, Evas_Object *obj, const char *emission, const char *source); + +static int change_image(void *data) +{ + char *center; + Smart_Data *sd; + + sd = data; + + done(sd, sd->obj, NULL, NULL); + + if (sd->current_node->next) + sd->current_node = sd->current_node->next; + else + sd->current_node = sd->list; + + center = sd->current_node->data; + evas_object_image_file_set(sd->center_image_two, center, NULL); + + edje_object_signal_emit(sd->images, "ephoto.change.image", "ephoto"); + + return 1; +} + +static void go_back(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Smart_Data *sd; + + sd = data; + + ephoto_slide_stop(obj); + hide_slideshow(); + show_flow_view(sd->current_node, sd->list); +} + +static void done(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + char *center; + Smart_Data *sd; + + sd = data; + + center = sd->current_node->data; + + evas_object_image_file_set(sd->center_image_one, center, NULL); +} + +Evas_Object *ephoto_slide_add(Evas *e) +{ + _slide_smart_init(); + return evas_object_smart_add(e, _smart); +} + +void ephoto_slide_current_node_set(Evas_Object *obj, Eina_List *node) +{ + char *center; + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + + sd->current_node = node; + center = sd->current_node->data; + + evas_object_image_file_set(sd->center_image_one, center, NULL); + + return; +} + +void ephoto_slide_item_list_set(Evas_Object *obj, Eina_List *list) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + + sd->list = list; + return; +} + +void ephoto_slide_start(Evas_Object *obj) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + + sd->timer = ecore_timer_add(3, change_image, sd); +} + +void ephoto_slide_stop(Evas_Object *obj) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + + ecore_timer_del(sd->timer); +} + +static void _slide_smart_reconfigure(Smart_Data *sd) +{ + int w, h, nw, nh; + + evas_object_geometry_get(sd->obj, 0, 0, &w, &h); + + nw = w/1.2; + nh = h/1.2; + + edje_object_part_unswallow(sd->obj, sd->images); + evas_object_image_load_size_set(sd->center_image_one, nw, nh); + evas_object_image_load_size_set(sd->center_image_two, nw, nh); + evas_object_resize(sd->center_image_one, nw, nh); + evas_object_resize(sd->center_image_two, nw, nh); + evas_object_resize(sd->images, nw, nh); + evas_object_size_hint_min_set(sd->images, nw, nh); + evas_object_size_hint_max_set(sd->images, nw, nh); + edje_object_part_swallow(sd->obj, "ephoto.swallow.content", sd->images); + + return; +} + +static void _slide_smart_init(void) +{ + if (_smart) + return; + { + static const Evas_Smart_Class sc = + { + "ephoto_slide", + EVAS_SMART_CLASS_VERSION, + _slide_smart_add, + _slide_smart_del, + _slide_smart_move, + _slide_smart_resize, + _slide_smart_show, + _slide_smart_hide, + _slide_smart_color_set, + _slide_smart_clip_set, + _slide_smart_clip_unset, + NULL, + NULL + }; + _smart = evas_smart_class_new(&sc); + } +} + +static void _slide_smart_add(Evas_Object *obj) +{ + Smart_Data *sd; + + sd = calloc(1, sizeof(Smart_Data)); + if (!sd) + return; + + sd->w = 0; + sd->h = 0; + sd->x = 0; + sd->y = 0; + + sd->obj = edje_object_add(em->e); + edje_object_file_set(sd->obj, PACKAGE_DATA_DIR "/themes/default/ephoto.edj", "/ephoto/slide/view"); + evas_object_smart_data_set(obj, sd); + + sd->images = edje_object_add(em->e); + edje_object_file_set(sd->images, PACKAGE_DATA_DIR "/themes/default/ephoto.edj", "/ephoto/slide/images"); + edje_object_part_swallow(sd->obj, "ephoto.swallow.content", sd->images); + + sd->center_image_one = (Evas_Object *)edje_object_part_object_get(sd->images, "ephoto.image.one"); + evas_object_image_filled_set(sd->center_image_one, EINA_FALSE); + evas_object_image_smooth_scale_set(sd->center_image_one, EINA_TRUE); + sd->center_image_two = (Evas_Object *)edje_object_part_object_get(sd->images, "ephoto.image.two"); + evas_object_image_filled_set(sd->center_image_two, EINA_TRUE); + evas_object_image_smooth_scale_set(sd->center_image_two, EINA_FALSE); + + edje_object_signal_callback_add(sd->obj, "mouse,up,1", "ephoto.move.back", go_back, sd); + edje_object_signal_callback_add(sd->images, "ephoto.transition.done", "ephoto", done, sd); +} + +static void _slide_smart_del(Evas_Object *obj) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) + return; + evas_object_del(sd->images); + evas_object_del(sd->obj); + free(sd); +} + +static void _slide_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) + return; + if ((x == sd->x) && (y == sd->y)) + return; + sd->x = x; + sd->y = y; + evas_object_move(sd->obj, x, y); + _slide_smart_reconfigure(sd); +} + +static void _slide_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) + return; + + if ((w == sd->w) && (h == sd->h)) + return; + sd->w = w; + sd->h = h; + evas_object_resize(sd->obj, w, h); + _slide_smart_reconfigure(sd); +} + +static void _slide_smart_show(Evas_Object *obj) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) + return; + + evas_object_show(sd->obj); + evas_object_show(sd->images); +} + +static void _slide_smart_hide(Evas_Object *obj) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) + return; + + evas_object_hide(sd->obj); + evas_object_hide(sd->images); +} + +static void _slide_smart_color_set(Evas_Object *obj, int r, int g, int b, int a) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) + return; + evas_object_color_set(sd->obj, r, g, b, a); +} + +static void _slide_smart_clip_set(Evas_Object *obj, Evas_Object *clip) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) + return; + evas_object_clip_set(sd->obj, clip); + + return; +} + +static void _slide_smart_clip_unset(Evas_Object *obj) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) + return; + evas_object_clip_unset(sd->obj); + + return; +} diff --git a/src/bin/ephoto_slideshow.c b/src/bin/ephoto_slideshow.c new file mode 100644 index 0000000..026fa77 --- /dev/null +++ b/src/bin/ephoto_slideshow.c @@ -0,0 +1,26 @@ +#include "ephoto.h" + +void add_slideshow(void) +{ + Evas_Object *o; + + o = ephoto_slide_add(em->e); + em->slideshow = o; +} + +void show_slideshow(Eina_List *node, Eina_List *list) +{ + ephoto_slide_current_node_set(em->slideshow, node); + ephoto_slide_item_list_set(em->slideshow, list); + evas_object_show(em->slideshow); + edje_object_part_swallow(em->bg, "ephoto.swallow.content", em->slideshow); + ephoto_slide_start(em->slideshow); +} + +void hide_slideshow(void) +{ + ephoto_slide_stop(em->slideshow); + evas_object_hide(em->slideshow); + edje_object_part_unswallow(em->bg, em->slideshow); +} +