Eina_Bool reverse;
} repeat;
double progress;
- double revert_begin_progress, revert_duration, total_revert_time;
+ double inter_progress;
+ double revert_begin_progress;
+ double revert_duration;
+ double total_revert_time;
unsigned int effects_pending_del;
int walking;
double v[4];
elapsed_time = (transit->time.current - transit->time.begin - transit->time.delayed)
- (2 * transit->total_revert_time);
duration = transit->time.duration;
- if (elapsed_time > duration)
- elapsed_time = duration;
-
transit->progress = elapsed_time / duration;
if (transit->revert_mode && transit->revert_begin_progress == 0)
transit->progress = transit->revert_begin_progress - revert_progress;
}
+ /* Intervention Progress */
+ transit->progress += transit->inter_progress;
+
switch (transit->tween_mode)
{
case ELM_TRANSIT_TWEEN_MODE_LINEAR:
/* Reverse? */
if (transit->repeat.reverse) transit->progress = 1 - transit->progress;
- if (duration > 0)
- {
- if (!_transit_animate_op(transit, transit->progress))
- return ECORE_CALLBACK_CANCEL;
- }
+ if (!_transit_animate_op(transit, transit->progress))
+ return ECORE_CALLBACK_CANCEL;
if (transit->revert_mode && (transit->progress <= 0 || transit->progress >= 1))
{
transit->time.begin = ecore_loop_time_get();
transit->time.revert_delayed = 0;
transit->total_revert_time = 0;
+ transit->inter_progress = 0;
if ((transit->repeat.count >= 0) &&
(transit->repeat.current == transit->repeat.count) &&
((!transit->auto_reverse) || transit->repeat.reverse))
}
/* Not end. Keep going. */
- if (elapsed_time < duration || transit->revert_mode) return ECORE_CALLBACK_RENEW;
+ if ((!transit->repeat.reverse && transit->progress < 1) ||
+ (transit->repeat.reverse && transit->progress > 0) ||
+ transit->revert_mode) return ECORE_CALLBACK_RENEW;
/* Repeat and reverse and time done! */
if ((transit->repeat.count >= 0) &&
transit->time.begin = ecore_loop_time_get();
transit->time.delayed = 0;
transit->total_revert_time = 0;
+ transit->inter_progress = 0;
return ECORE_CALLBACK_RENEW;
}
return EINA_TRUE;
}
+EAPI void
+elm_transit_progress_value_set(Elm_Transit *transit, double progress)
+{
+ ELM_TRANSIT_CHECK_OR_RETURN(transit);
+
+ if (progress < 0) progress = 0;
+ else if (progress > 1) progress = 1;
+
+ transit->inter_progress = (progress - transit->progress);
+}
+
EAPI double
elm_transit_progress_value_get(const Elm_Transit *transit)
{
*/
EAPI double elm_transit_progress_value_get(const Elm_Transit *transit);
+
+/**
+ * Set current time progression of the animation.
+ *
+ * Intervene current progress instantly when it requires to jump onto a specific frame position.
+ *
+ * @note @p transit can not be NULL
+ *
+ * @param transit The transit object.
+ * @param progress The time progression value. The value must be in range of (0.0 ~ 1.0).
+ *
+ * @see elm_transit_progress_value_get()
+ *
+ * @since 1.22
+ *
+ * @ingroup Elm_Transit
+ */
+EAPI void elm_transit_progress_value_set(Elm_Transit *transit, double progress);
+
/**
* Makes the chain relationship between two transits.
*