};
static void
+_transit_revert(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Elm_Transit *trans = (Elm_Transit*)data;
+ elm_transit_revert_go(trans);
+}
+
+static void
+_transit_rev_cb_del(void *data, Elm_Transit *trans EINA_UNUSED)
+{
+ Evas_Object *rev_bt = (Evas_Object*)data;
+ evas_object_smart_callback_del(rev_bt, "clicked", _transit_revert);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+}
+
+static void
_custom_op(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress)
{
if (!effect) return;
}
static void
-_transit_resizing(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+_transit_resizing(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Elm_Transit *trans;
-
+ Evas_Object *rev_bt = (Evas_Object*)data;
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
trans = elm_transit_add();
elm_transit_object_add(trans, obj);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
elm_transit_effect_resizing_add(trans, 100, 50, 300, 150);
elm_transit_duration_set(trans, 5.0);
{
Elm_Transit *trans;
Evas_Object *obj2 = data;
+ Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert");
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
trans = elm_transit_add();
elm_transit_object_add(trans, obj);
elm_transit_object_add(trans, obj2);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
elm_transit_effect_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, EINA_TRUE);
elm_transit_duration_set(trans, 5.0);
Elm_Transit *trans;
trans = elm_transit_add();
+ Evas_Object *rev_bt = (Evas_Object*)data;
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
elm_transit_object_add(trans, obj);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
elm_transit_effect_zoom_add(trans, 1.0, 3.0);
elm_transit_duration_set(trans, 5.0);
{
Elm_Transit *trans;
Evas_Object *obj2 = data;
+ Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert");
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
trans = elm_transit_add();
elm_transit_object_add(trans, obj);
elm_transit_object_add(trans, obj2);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
elm_transit_effect_blend_add(trans);
{
Elm_Transit *trans;
Evas_Object *obj2 = data;
+ Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert");
+ elm_object_disabled_set(rev_bt, EINA_FALSE);
trans = elm_transit_add();
elm_transit_object_add(trans, obj);
elm_transit_object_add(trans, obj2);
+ elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt);
+
+ evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans);
elm_transit_effect_fade_add(trans);
void
test_transit_resizing(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Evas_Object *win, *bt;
+ Evas_Object *win, *bt, *rev_bt;
win = elm_win_util_standard_add("transit2", "Transit Resizing");
elm_win_autodel_set(win, EINA_TRUE);
evas_object_show(bt);
evas_object_move(bt, 50, 100);
evas_object_resize(bt, 100, 50);
- evas_object_smart_callback_add(bt, "clicked", _transit_resizing, NULL);
+
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 50, 300);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+
+ evas_object_smart_callback_add(bt, "clicked", _transit_resizing, rev_bt);
evas_object_resize(win, 400, 400);
evas_object_show(win);
void
test_transit_flip(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Evas_Object *win, *bt, *bt2;
+ Evas_Object *win, *bt, *bt2, *rev_bt;
win = elm_win_util_standard_add("transit3", "Transit Flip");
elm_win_autodel_set(win, EINA_TRUE);
evas_object_move(bt2, 50, 50);
evas_object_resize(bt2, 200, 200);
- evas_object_resize(win, 300, 300);
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 50, 300);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+ evas_object_data_set(bt, "revert", rev_bt);
+ evas_object_data_set(bt2, "revert", rev_bt);
+
+ evas_object_resize(win, 400, 400);
evas_object_show(win);
evas_object_smart_callback_add(bt, "clicked", _transit_flip, bt2);
void
test_transit_zoom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Evas_Object *win, *bt;
+ Evas_Object *win, *bt, *rev_bt;
win = elm_win_util_standard_add("transit4", "Transit Zoom");
elm_win_autodel_set(win, EINA_TRUE);
evas_object_move(bt, 100, 125);
evas_object_show(bt);
- evas_object_smart_callback_add(bt, "clicked", _transit_zoom, NULL);
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 100, 250);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+
+ evas_object_smart_callback_add(bt, "clicked", _transit_zoom, rev_bt);
evas_object_resize(win, 300, 300);
evas_object_show(win);
void
test_transit_blend(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Evas_Object *win, *bt, *bt2, *ic;
+ Evas_Object *win, *bt, *bt2, *ic, *rev_bt;
char buf[PATH_MAX];
win = elm_win_util_standard_add("transit5", "Transit Blend");
evas_object_move(bt2, 25, 125);
evas_object_resize(bt2, 250, 50);
- evas_object_resize(win, 300, 300);
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 50, 300);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+ evas_object_data_set(bt, "revert", rev_bt);
+ evas_object_data_set(bt2, "revert", rev_bt);
+
+ evas_object_resize(win, 300, 400);
evas_object_show(win);
evas_object_smart_callback_add(bt, "clicked", _transit_blend, bt2);
void
test_transit_fade(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Evas_Object *win, *bt, *bt2, *ic;
+ Evas_Object *win, *bt, *bt2, *ic, *rev_bt;
char buf[PATH_MAX];
win = elm_win_util_standard_add("transit6","Transit Fade");
evas_object_move(bt2, 25, 125);
evas_object_resize(bt2, 250, 50);
- evas_object_resize(win, 300, 300);
+ rev_bt = elm_button_add(win);
+ elm_object_text_set(rev_bt, "Revert");
+ evas_object_resize(rev_bt, 100, 50);
+ evas_object_move(rev_bt, 50, 300);
+ evas_object_show(rev_bt);
+ elm_object_disabled_set(rev_bt, EINA_TRUE);
+ evas_object_data_set(bt, "revert", rev_bt);
+ evas_object_data_set(bt2, "revert", rev_bt);
+
+ evas_object_resize(win, 300, 400);
evas_object_show(win);
evas_object_smart_callback_add(bt, "clicked", _transit_fade, bt2);
elm_transit_repeat_times_set(trans, -1);
elm_transit_go(trans);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Revert");
+ evas_object_resize(bt, 150, 50);
+ evas_object_move(bt, 50, 250);
+ evas_object_show(bt);
+ evas_object_smart_callback_add(bt, "clicked", _transit_revert, trans);
+
evas_object_resize(win, 400, 400);
evas_object_show(win);
}
double duration;
double begin;
double current;
+ double revert_start;
+ double revert_elapsed;
} time;
struct
{
Eina_Bool reverse;
} repeat;
double progress;
+ double revert_begin_progress, revert_duration, total_revert_time;
unsigned int effects_pending_del;
int walking;
double v[4];
Eina_Bool state_keep : 1;
Eina_Bool finished : 1;
Eina_Bool smooth : 1;
+ Eina_Bool revert_mode : 1;
};
struct _Elm_Transit_Effect_Module
_transit_animate_cb(void *data)
{
Elm_Transit *transit = data;
- double elapsed_time, duration;
+ double elapsed_time, duration, revert_progress;
transit->time.current = ecore_loop_time_get();
- elapsed_time = transit->time.current - transit->time.begin;
+ elapsed_time = transit->time.current - transit->time.begin - 2 * transit->total_revert_time;
duration = transit->time.duration + transit->time.delayed;
-
if (elapsed_time > duration)
elapsed_time = duration;
transit->progress = elapsed_time / duration;
+ if (transit->revert_mode && transit->revert_begin_progress == 0)
+ {
+ transit->revert_begin_progress = transit->progress;
+ transit->time.revert_start = transit->time.current;
+ }
+
+ if (transit->revert_mode)
+ {
+ transit->time.revert_elapsed = transit->time.current - transit->time.revert_start;
+ revert_progress = transit->time.revert_elapsed / duration;
+ transit->progress = transit->revert_begin_progress - revert_progress;
+ }
+
switch (transit->tween_mode)
{
case ELM_TRANSIT_TWEEN_MODE_LINEAR:
return ECORE_CALLBACK_CANCEL;
}
+ if (transit->revert_mode && (transit->progress <= 0 || transit->progress >= 1))
+ {
+ transit->revert_mode = EINA_FALSE;
+ transit->time.begin = ecore_loop_time_get();
+ transit->total_revert_time = 0;
+ if ((transit->repeat.count >= 0) &&
+ (transit->repeat.current == transit->repeat.count) &&
+ ((!transit->auto_reverse) || transit->repeat.reverse))
+ {
+ transit->finished = EINA_TRUE;
+ elm_transit_del(transit);
+ return ECORE_CALLBACK_CANCEL;
+ }
+ else
+ return ECORE_CALLBACK_RENEW;
+ }
+
/* Not end. Keep going. */
- if (elapsed_time < duration) return ECORE_CALLBACK_RENEW;
+ if (elapsed_time < duration || transit->revert_mode) return ECORE_CALLBACK_RENEW;
/* Repeat and reverse and time done! */
if ((transit->repeat.count >= 0) &&
else transit->repeat.reverse = EINA_TRUE;
transit->time.begin = ecore_loop_time_get();
+ transit->total_revert_time = 0;
return ECORE_CALLBACK_RENEW;
}
transit->v[0] = 1.0;
transit->v[1] = 0.0;
+ transit->revert_mode = EINA_FALSE;
transit->smooth = EINA_TRUE;
return transit;
}
EAPI void
+elm_transit_revert_go(Elm_Transit *transit)
+{
+ ELM_TRANSIT_CHECK_OR_RETURN(transit);
+ if (transit->revert_mode)
+ {
+ transit->total_revert_time += transit->time.revert_elapsed;
+ transit->revert_mode = EINA_FALSE;
+ }
+ else
+ {
+ transit->revert_mode = EINA_TRUE;
+ transit->time.revert_elapsed = 0;
+ transit->revert_begin_progress = 0;
+ }
+}
+
+EAPI void
elm_transit_go(Elm_Transit *transit)
{
ELM_TRANSIT_CHECK_OR_RETURN(transit);
transit->time.paused = 0;
transit->time.delayed = 0;
+ transit->total_revert_time = 0;
+ transit->revert_mode = EINA_FALSE;
transit->time.begin = ecore_loop_time_get();
transit->animator = ecore_animator_add(_transit_animate_cb, transit);