raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=8e2f33381d7e552087adac7446cf15e50320dd45
commit 8e2f33381d7e552087adac7446cf15e50320dd45 Author: Markus Svilans <[email protected]> Date: Fri Oct 21 14:12:58 2016 +0900 New flip mode called ELM_FLIP_CROSS_FADE Summary: Added new flip mode called ELM_FLIP_CROSS_FADE, which causes one content to fade in while the other fades out. Updated test_flip.c program to include a button for testing the new flip mode. Test Plan: Run the elementary_test program, and open the Flip test. There is a new button labelled "9" that will activate the new cross-fade flip mode. Reviewers: Hermet, bu5hm4n, raster Reviewed By: bu5hm4n Subscribers: bu5hm4n, cedric, jpeg Tags: #efl Differential Revision: https://phab.enlightenment.org/D4314 --- src/bin/elementary/test_flip.c | 23 ++++++++++ src/lib/elementary/efl_ui_flip.c | 79 ++++++++++++++++++++++++++++++++- src/lib/elementary/efl_ui_flip.eo | 9 ++-- src/lib/elementary/efl_ui_flip_legacy.h | 1 + 4 files changed, 108 insertions(+), 4 deletions(-) diff --git a/src/bin/elementary/test_flip.c b/src/bin/elementary/test_flip.c index d885a7b..3fd6fca 100644 --- a/src/bin/elementary/test_flip.c +++ b/src/bin/elementary/test_flip.c @@ -60,6 +60,13 @@ my_fl_8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) } void +my_fl_9(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CROSS_FADE); +} + +void my_fl_front(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *fl = data; @@ -203,6 +210,22 @@ test_flip(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info elm_box_pack_end(bx, bx2); evas_object_show(bx2); + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "9"); + evas_object_smart_callback_add(bt, "clicked", my_fl_9, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + evas_object_resize(win, 320, 480); evas_object_show(win); } diff --git a/src/lib/elementary/efl_ui_flip.c b/src/lib/elementary/efl_ui_flip.c index 08adc4f..07e1a26 100644 --- a/src/lib/elementary/efl_ui_flip.c +++ b/src/lib/elementary/efl_ui_flip.c @@ -873,6 +873,41 @@ _state_update(Evas_Object *obj) } static void +_cross_fade_update(Evas_Object *obj, double t) +{ + int ca, cb; + Evas_Object *aclip, *bclip; + Eina_Bool front; + double s; + EFL_UI_FLIP_DATA_GET(obj, sd); + front = sd->next_state; + + s = sin(t * M_PI_2); // fade in sinusoidally + t = s * s; + ca = 255 * t; + if (ca < 0) ca = 0; + if (ca > 255) ca = 255; + + cb = sqrt(255 * 255 - ca * ca); + if (cb < 0) cb = 0; + if (cb > 255) cb = 255; + + if (front) + { + aclip = sd->front.clip; + bclip = sd->back.clip; + } + else + { + aclip = sd->back.clip; + bclip = sd->front.clip; + } + + evas_object_color_set(aclip, ca, ca, ca, ca); + evas_object_color_set(bclip, cb, cb, cb, cb); +} + +static void _state_end(Efl_Ui_Flip_Data *sd) { _state_slices_clear(sd); @@ -1308,6 +1343,13 @@ _flip(Evas_Object *obj) _flip_show_hide(obj); _state_update(obj); } + else if (sd->mode == ELM_FLIP_CROSS_FADE) + { + sd->dir = 0; + sd->started = EINA_TRUE; + sd->pageflip = EINA_FALSE; + _cross_fade_update(obj, t); + } else _flip_do(obj, t, sd->mode, 0, 0); } @@ -1337,6 +1379,14 @@ _flip(Evas_Object *obj) sd->state = sd->next_state; _configure(obj); _flip_show_hide(obj); + + if (sd->mode == ELM_FLIP_CROSS_FADE) + { + // Make the content fully opaque again + evas_object_color_set(sd->front.clip, 255, 255, 255, 255); + evas_object_color_set(sd->back.clip, 255, 255, 255, 255); + } + efl_event_callback_legacy_call(obj, EFL_UI_FLIP_EVENT_ANIMATE_DONE, NULL); // update the new front and back object. @@ -1905,7 +1955,6 @@ _internal_elm_flip_go_to(Evas_Object *obj, Elm_Flip_Mode mode) { if (!sd->animator) sd->animator = ecore_animator_add(_animate, obj); - _flip_show_hide(obj); sd->mode = mode; sd->start = ecore_loop_time_get(); @@ -1919,6 +1968,33 @@ _internal_elm_flip_go_to(Evas_Object *obj, sd->pageflip = EINA_TRUE; // force calc to contents are the right size before transition evas_smart_objects_calculate(evas_object_evas_get(obj)); + + if (sd->mode == ELM_FLIP_CROSS_FADE) + { + // Convention: a is fading in, b is fading out + Evas_Object *a, *b; + if (front) + { + a = sd->front.content; + b = sd->back.content; + } + else + { + a = sd->back.content; + b = sd->front.content; + } + + // Stack fade-in content on top of fade-out content + if (a && b) evas_object_stack_above(a, b); + + evas_object_show(sd->front.clip); + evas_object_show(sd->back.clip); + } + else + { + _flip_show_hide(obj); + } + _flip(obj); // FIXME: hack around evas rendering bug (only fix makes evas bitch-slow) evas_object_map_enable_set(sd->front.content, EINA_FALSE); @@ -1928,6 +2004,7 @@ _internal_elm_flip_go_to(Evas_Object *obj, evas_smart_objects_calculate(evas_object_evas_get(obj)); _configure(obj); // FIXME: end hack + efl_event_callback_legacy_call(obj, EFL_UI_FLIP_EVENT_ANIMATE_BEGIN, NULL); // set focus to the content object when flip go to is called diff --git a/src/lib/elementary/efl_ui_flip.eo b/src/lib/elementary/efl_ui_flip.eo index 757eaff..ac55b91 100644 --- a/src/lib/elementary/efl_ui_flip.eo +++ b/src/lib/elementary/efl_ui_flip.eo @@ -13,7 +13,8 @@ enum Efl.Ui.Flip.Mode page_left, page_right, page_up, - page_down + page_down, + cross_fade, } enum Efl.Ui.Flip.Interaction @@ -159,9 +160,11 @@ class Efl.Ui.Flip (Elm.Widget, Efl.Pack.Linear, Efl.Part) right s if the flip was a book, the other content is shown as the page below that), #ELM_FLIP_PAGE_UP (move the currently visible content up as if the flip was a book, the other content is shown - as the page below that) and #ELM_FLIP_PAGE_DOWN (move the + as the page below that), #ELM_FLIP_PAGE_DOWN (move the currently visible content down as if the flip was a book, the - other content is shown as the page below that). + other content is shown as the page below that) and #ELM_FLIP_CROSS_FADE + (fade out the currently visible content, while fading in the + invisible content). ]] /* FIXME-doc * @image html elm_flip.png diff --git a/src/lib/elementary/efl_ui_flip_legacy.h b/src/lib/elementary/efl_ui_flip_legacy.h index 9ae8616..b491f0d 100644 --- a/src/lib/elementary/efl_ui_flip_legacy.h +++ b/src/lib/elementary/efl_ui_flip_legacy.h @@ -22,6 +22,7 @@ typedef Efl_Ui_Flip_Mode Elm_Flip_Mode; #define ELM_FLIP_PAGE_RIGHT EFL_UI_FLIP_PAGE_RIGHT #define ELM_FLIP_PAGE_UP EFL_UI_FLIP_PAGE_UP #define ELM_FLIP_PAGE_DOWN EFL_UI_FLIP_PAGE_DOWN +#define ELM_FLIP_CROSS_FADE EFL_UI_FLIP_CROSS_FADE typedef enum { --
