New flip mode called ELM_FLIP_CROSS_FADE
authorMarkus Svilans <msvilans@aeonyx.ca>
Fri, 21 Oct 2016 05:12:58 +0000 (14:12 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Fri, 21 Oct 2016 05:13:00 +0000 (14:13 +0900)
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
src/lib/elementary/efl_ui_flip.c
src/lib/elementary/efl_ui_flip.eo
src/lib/elementary/efl_ui_flip_legacy.h

index d885a7b..3fd6fca 100644 (file)
@@ -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);
 }
index 08adc4f..07e1a26 100644 (file)
@@ -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
index 757eaff..ac55b91 100644 (file)
@@ -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
index 9ae8616..b491f0d 100644 (file)
@@ -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
 {