};
static void
-_sizing_eval(void *data)
+_sizing_eval(Eo *obj, void *data)
{
Efl_Ui_Animation_View_Data *pd = data;
- if (!efl_file_loaded_get(pd->obj)) return;
+ if (!efl_file_loaded_get(obj)) return;
double hw,hh;
- efl_gfx_hint_weight_get(pd->obj, &hw, &hh);
+ efl_gfx_hint_weight_get(obj, &hw, &hh);
Eina_Size2D size = efl_canvas_vg_object_default_size_get(pd->vg);
if (hw == 0) min.w = size.w;
if (hh == 0) min.h = size.h;
- efl_gfx_hint_size_min_set(pd->obj, min);
+ efl_gfx_hint_size_min_set(obj, min);
}
static void
-_size_hint_event_cb(void *data, const Efl_Event *event EINA_UNUSED)
+_size_hint_event_cb(void *data, const Efl_Event *event)
{
- _sizing_eval(data);
+ _sizing_eval(event->object, data);
}
static void
-_transit_go_facade(Efl_Ui_Animation_View_Data *pd)
+_transit_go_facade(Eo* obj, Efl_Ui_Animation_View_Data *pd)
{
pd->repeat_times = 0;
if (pd->play_back)
pd->state = EFL_UI_ANIMATION_VIEW_STATE_PLAY_BACK;
else
pd->state = EFL_UI_ANIMATION_VIEW_STATE_PLAY;
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_START, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_START, NULL);
if (pd->transit) elm_transit_go(pd->transit);
}
}
static void
-_auto_play(Efl_Ui_Animation_View_Data *pd, Eina_Bool vis)
+_auto_play(Eo *obj, Efl_Ui_Animation_View_Data *pd, Eina_Bool vis)
{
if (!pd->auto_play || !pd->transit) return;
else
pd->state = EFL_UI_ANIMATION_VIEW_STATE_PLAY;
pd->auto_play_pause = EINA_FALSE;
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_RESUME, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_RESUME, NULL);
}
}
//Pause Animation
elm_transit_paused_set(pd->transit, EINA_TRUE);
pd->state = EFL_UI_ANIMATION_VIEW_STATE_PAUSE;
pd->auto_play_pause = EINA_TRUE;
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_PAUSE, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_PAUSE, NULL);
}
}
}
static void
_transit_del_cb(Elm_Transit_Effect *effect, Elm_Transit *transit)
{
- Efl_Ui_Animation_View_Data *pd = (Efl_Ui_Animation_View_Data *) effect;
+ Eo *obj = (Eo *) effect;
+ EFL_UI_ANIMATION_VIEW_DATA_GET(obj, pd);
+ if (!pd) return;
if ((pd->state == EFL_UI_ANIMATION_VIEW_STATE_PLAY && pd->progress == 1) ||
(pd->state == EFL_UI_ANIMATION_VIEW_STATE_PLAY_BACK && pd->progress == 0))
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_DONE, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_DONE, NULL);
if (pd->transit != transit) return;
if (prev_state != EFL_UI_ANIMATION_VIEW_STATE_STOP)
{
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_STOP, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_STOP, NULL);
pd->progress = 0;
}
}
static void
_transit_cb(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress)
{
- Efl_Ui_Animation_View_Data *pd = (Efl_Ui_Animation_View_Data *) effect;
+ Eo *obj = (Eo *) effect;
+ EFL_UI_ANIMATION_VIEW_DATA_GET(obj, pd);
- if (!pd->vg)
+ if (!pd || !pd->vg)
{
- ERR("Vector Object is removed in wrong way!, Efl_Ui_Animation_View = %p", pd->obj);
+ ERR("Vector Object is removed in wrong way!, Efl_Ui_Animation_View = %p", obj);
elm_transit_del(transit);
return;
}
int repeat_times = elm_transit_current_repeat_times_get(pd->transit);
if (pd->repeat_times != repeat_times)
{
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_REPEAT, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_REPEAT, NULL);
pd->repeat_times = repeat_times;
}
}
//transit_cb is always called with a progress value 0 ~ 1.
//SIG_PLAY_UPDATE callback is called only when there is a real change.
if (update_frame != current_frame)
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_UPDATE, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_UPDATE, NULL);
}
EOLIAN static void
EOLIAN static Eo *
_efl_ui_animation_view_efl_object_constructor(Eo *obj,
- Efl_Ui_Animation_View_Data *pd)
+ Efl_Ui_Animation_View_Data *pd EINA_UNUSED)
{
- pd->obj = obj = efl_constructor(efl_super(obj, MY_CLASS));
+ obj = efl_constructor(efl_super(obj, MY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
}
static Eina_Bool
-_ready_play(Efl_Ui_Animation_View_Data *pd)
+_ready_play(Eo *obj, Efl_Ui_Animation_View_Data *pd)
{
pd->auto_play_pause = EINA_FALSE;
pd->state = EFL_UI_ANIMATION_VIEW_STATE_STOP;
Elm_Transit *transit = elm_transit_add();
elm_transit_object_add(transit, pd->vg);
if (pd->auto_repeat) elm_transit_repeat_times_set(transit, -1);
- elm_transit_effect_add(transit, _transit_cb, pd, _transit_del_cb);
+ elm_transit_effect_add(transit, _transit_cb, obj, _transit_del_cb);
elm_transit_progress_value_set(transit, pd->progress);
elm_transit_objects_final_state_keep_set(transit, EINA_TRUE);
pd->transit = transit;
_efl_ui_animation_view_efl_file_load(Eo *obj, Efl_Ui_Animation_View_Data *pd)
{
Eina_Error err;
+ Eina_Bool ret;
const char *file;
const char *key;
file = efl_file_get(obj);
key = efl_file_key_get(obj);
- efl_file_simple_load(pd->vg, file, key);
+ ret = efl_file_simple_load(pd->vg, file, key);
+ if (!ret)
+ {
+ efl_file_unload(obj);
+ return eina_error_get();
+ }
pd->progress = 0;
- _sizing_eval(pd);
+ _sizing_eval(obj, pd);
- if (!_ready_play(pd)) return 1;
+ if (!_ready_play(obj, pd)) return 1;
if (pd->auto_play)
{
- _transit_go_facade(pd);
+ _transit_go_facade(obj, pd);
if (!_visible_check(obj))
{
elm_transit_paused_set(pd->transit, EINA_TRUE);
pd->state = EFL_UI_ANIMATION_VIEW_STATE_PAUSE;
pd->auto_play_pause = EINA_TRUE;
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_PAUSE, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_PAUSE, NULL);
}
}
return 0;
efl_gfx_entity_position_set(efl_super(obj, MY_CLASS), pos);
- _auto_play(pd, _visible_check(obj));
+ _auto_play(obj, pd, _visible_check(obj));
}
EOLIAN static void
efl_gfx_entity_size_set(efl_super(obj, MY_CLASS), size);
- _sizing_eval(pd);
+ _sizing_eval(obj, pd);
- _auto_play(pd, _visible_check(obj));
+ _auto_play(obj, pd, _visible_check(obj));
}
EOLIAN static void
_efl_ui_animation_view_efl_gfx_entity_visible_set(Eo *obj,
- Efl_Ui_Animation_View_Data *pd,
- Eina_Bool vis)
+ Efl_Ui_Animation_View_Data *pd,
+ Eina_Bool vis)
{
if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_VISIBLE, 0, vis))
return;
efl_gfx_entity_visible_set(efl_super(obj, MY_CLASS), vis);
- _auto_play(pd, _visible_check(obj));
+ _auto_play(obj, pd, _visible_check(obj));
+}
+
+EOLIAN static void
+_efl_ui_animation_view_efl_gfx_view_view_size_set(Eo *obj EINA_UNUSED,
+ Efl_Ui_Animation_View_Data *pd,
+ Eina_Size2D size)
+{
+ Eina_Rect viewbox;
+ viewbox.x = viewbox.y =0;
+ viewbox.w = size.w;
+ viewbox.h = size.h;
+
+ efl_canvas_vg_object_viewbox_set(pd->vg, viewbox);
+}
+
+EOLIAN Eina_Size2D
+_efl_ui_animation_view_efl_gfx_view_view_size_get(const Eo *obj EINA_UNUSED,
+ Efl_Ui_Animation_View_Data *pd)
+{
+ Eina_Rect viewbox = efl_canvas_vg_object_viewbox_get(pd->vg);
+
+ return EINA_SIZE2D(viewbox.w, viewbox.h);
}
EOLIAN static void
pd->auto_play_pause = EINA_FALSE;
if (!efl_file_loaded_get(obj)) return EINA_FALSE;
- if (!pd->transit && !_ready_play(pd)) return EINA_FALSE;
+ if (!pd->transit && !_ready_play(obj, pd)) return EINA_FALSE;
if (pd->state == EFL_UI_ANIMATION_VIEW_STATE_STOP)
- _transit_go_facade(pd);
+ _transit_go_facade(obj, pd);
else if (rewind)
elm_transit_progress_value_set(pd->transit, pd->progress);
}
EOLIAN static Eina_Bool
-_efl_ui_animation_view_stop(Eo *obj EINA_UNUSED, Efl_Ui_Animation_View_Data *pd)
+_efl_ui_animation_view_stop(Eo *obj, Efl_Ui_Animation_View_Data *pd)
{
if (!pd->transit) return EINA_FALSE;
evas_object_vg_animated_frame_set(pd->vg, 0);
pd->progress = 0;
pd->state = EFL_UI_ANIMATION_VIEW_STATE_STOP;
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_STOP, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_STOP, NULL);
elm_transit_del(pd->transit);
return EINA_TRUE;
}
EOLIAN static Eina_Bool
-_efl_ui_animation_view_pause(Eo *obj EINA_UNUSED, Efl_Ui_Animation_View_Data *pd)
+_efl_ui_animation_view_pause(Eo *obj, Efl_Ui_Animation_View_Data *pd)
{
if (!pd->transit) return EINA_FALSE;
elm_transit_paused_set(pd->transit, EINA_TRUE);
pd->state = EFL_UI_ANIMATION_VIEW_STATE_PAUSE;
pd->auto_play_pause = EINA_FALSE;
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_PAUSE, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_PAUSE, NULL);
return EINA_TRUE;
}
}
EOLIAN static Eina_Bool
-_efl_ui_animation_view_resume(Eo *obj EINA_UNUSED, Efl_Ui_Animation_View_Data *pd)
+_efl_ui_animation_view_resume(Eo *obj, Efl_Ui_Animation_View_Data *pd)
{
if (!pd->transit) return EINA_FALSE;
pd->state = EFL_UI_ANIMATION_VIEW_STATE_PLAY;
pd->auto_play_pause = EINA_FALSE;
- evas_object_smart_callback_call(pd->obj, SIG_PLAY_RESUME, NULL);
+ evas_object_smart_callback_call(obj, SIG_PLAY_RESUME, NULL);
return EINA_TRUE;
}
pd->auto_play_pause = EINA_FALSE;
if (!efl_file_loaded_get(obj)) return EINA_FALSE;
- if (!pd->transit && !_ready_play(pd)) return EINA_FALSE;
+ if (!pd->transit && !_ready_play(obj, pd)) return EINA_FALSE;
if (pd->state == EFL_UI_ANIMATION_VIEW_STATE_STOP)
{
if (pd->progress == 0) pd->progress = 1.0;
- _transit_go_facade(pd);
+ _transit_go_facade(obj, pd);
}
else if (rewind)
elm_transit_progress_value_set(pd->transit, 1 - pd->progress);
}
EOLIAN static Eina_Size2D
-_efl_ui_animation_view_default_size_get(const Eo *obj EINA_UNUSED,
- Efl_Ui_Animation_View_Data *pd EINA_UNUSED)
+_efl_ui_animation_view_default_view_size_get(const Eo *obj EINA_UNUSED,
+ Efl_Ui_Animation_View_Data *pd EINA_UNUSED)
{
return efl_canvas_vg_object_default_size_get(pd->vg);
}
EOLIAN static int
_efl_ui_animation_view_frame_count_get(const Eo *obj EINA_UNUSED, Efl_Ui_Animation_View_Data *pd)
{
- return evas_object_vg_animated_frame_count_get(pd->vg);
+ return efl_gfx_frame_controller_frame_count_get(pd->vg);
}
EOLIAN static void
return efl_ui_animation_view_progress_get(obj);
}
-
/* Internal EO APIs and hidden overrides */
#define EFL_UI_ANIMATION_VIEW_EXTRA_OPS \
enum Efl.Ui.Animation_View_State
{
- not_ready, [[Animation is not ready to play. (Probably, it didn't file set yet or failed to read file. @since 1.23]]
- play, [[Animation is on playing. see @Efl.Ui.Animation_View.play @since 1.23]]
- play_back, [[Animation is on playing back (rewinding). see @Efl.Ui.Animation_View.play_back @since 1.23]]
- pause, [[Animation has been paused. To continue animation, call @Efl.Ui.Animation_View.resume. see @Efl.Ui.Animation_View.pause @since 1.23]]
- stop [[Animation view successfully loaded a file then readied for playing. Otherwise after finished animation or stopped forcely by request. see @Efl.Ui.Animation_View.stop @since 1.23]]
+ not_ready, [[Animation is not ready to play. (Probably, it didn't file set yet or failed to read file.]]
+ play, [[Animation is on playing. see @Efl.Ui.Animation_View.play]]
+ play_back, [[Animation is on playing back (rewinding). see @Efl.Ui.Animation_View.play_back]]
+ pause, [[Animation has been paused. To continue animation, call @Efl.Ui.Animation_View.resume. see @Efl.Ui.Animation_View.pause]]
+ stop [[Animation view successfully loaded a file then readied for playing. Otherwise after finished animation or stopped forcely by request. see @Efl.Ui.Animation_View.stop]]
}
class @beta Efl.Ui.Animation_View extends Efl.Ui.Widget implements Efl.Gfx.View, Efl.File
animation infomation. Currently approved vector data file format is svg, json and eet.
Only json(known for Lottie file as well) and eet could contains animation infomation,
currently Animation_View is supporting.
-
- @since 1.23
]]
event_prefix: efl_ui_animation_view;
methods {
Warning: This auto play will be only affected to the next animation source.
So must be called before setting animation file.
-
- @since 1.23
]]
set {
}
end. This auto repeat mode is valid to both play and play_back cases.
$true Enable auto play mode, disable otherwise.
-
- @since 1.23
]]
set {
}
$true when it's successful. $false otherwise.
Warning: speed must be greater than zero.
-
- @since 1.23
]]
set {
return: bool;
This API returns total duration time of current animation in the seconds.
If current animation source isn't animatable, it returns zero.
-
- @since 1.23
]]
get {
}
you can change current position by using this API.
Warning: The range of progress is 0 ~ 1.
-
- @since 1.23
]]
set {
}
[[Number of current frame.
Ranges from 0 to @.frame_count - 1.
-
- @since 1.23
]]
set {
}
Warning: Play request will be ignored if animation source is not set yet or
animation is paused state or it's already on playing.
-
- @since 1.23
]]
+
return: bool; [[$true when it's successful. $false otherwise.]]
}
play_back {
Warning: Play back request will be ignored if animation source is not set yet or
animation is paused state or it's already on playing back.
-
- @since 1.23
]]
+
return: bool; [[$true when it's successful. $false otherwise.]]
}
pause {
Once animation is paused, animation view must get resume to play continue again.
Warning: Animation must be on playing or playing back status.
-
- @since 1.23
]]
+
return: bool; [[$true when it's successful. $false otherwise.]]
}
resume {
[[Resume paused animation to continue animation.
Warning: This resume must be called on animation paused status.
-
- @since 1.23
]]
+
return: bool; [[$true when it's successful. $false otherwise.]]
}
stop {
Stop animation instatly regardless of it's status and reset to
show first frame of animation. Even though current animation is paused,
the animation status will be stopped.
-
- @since 1.23
]]
+
return: bool; [[$true when it's successful. $false otherwise.]]
}
- @property default_size {
+ @property default_view_size {
[[The default view size that specified from vector resource.
-
- @since 1.23
]]
get {
}
@property state {
[[Current animation view state.
see @Efl.Ui.Animation_View_State
-
- @since 1.23
]]
get{
}
is_playing_back {
[[Returns the status whether current animation is on playing forward or backward.
warning: If animation view is not on playing, it will return $false.
-
- @since 1.23
]]
return: bool; [[$true, if animation on playing back, $false otherwise.]]
}
@property frame_count {
[[The index of end frame of the animation view, if it's animated.
note : frame number starts with 0.
-
- @since 1.23
]]
get {
}
values {
- frame_count: int; [[ The number of frames. 0, if it's not animated.]]
+ frame_count: int; [[The number of frames. 0, if it's not animated.]]
}
}
@property min_progress {
[[The start progress of the play.
Default value is 0.
-
- @since 1.23
]]
set {
}
get {
}
values {
- min_progress: double; [[ The minimum progress. Value must be 0 ~ 1. ]]
+ min_progress: double; [[The minimum progress. Value must be 0 ~ 1.]]
}
}
@property max_progress {
[[The last progress of the play.
Default value is 1.
-
- since 1.23
]]
set {
}
get {
}
values {
- max_progress: double; [[ The maximum progress. Value must be 0 ~ 1. ]]
+ max_progress: double; [[The maximum progress. Value must be 0 ~ 1.]]
}
}
@property min_frame {
[[The start frame of the play.
Default value is 0.
-
- @since 1.23
]]
set {
}
get {
}
values {
- min_frame: int; [[ The minimum frame for play. Value must be 0 ~ @.max_frame ]]
+ min_frame: int; [[The minimum frame for play. Value must be 0 ~ @.max_frame]]
}
}
@property max_frame {
[[The last frame of the play.
Default value is @.frame_count - 1
-
- @since 1.23
]]
set {
}
get {
}
values {
- max_frame: int; [[ The maximum frame for play. Value must be @.min_frame ~ (@.frame_count - 1) ]]
+ max_frame: int; [[The maximum frame for play. Value must be @.min_frame ~ (@.frame_count - 1)]]
}
}
Efl.Gfx.Entity.visible { set; }
Efl.Gfx.Entity.position { set; }
Efl.Gfx.Entity.size { set; }
+ Efl.Gfx.View.view_size { set; get; }
+ }
+ events {
+ play,start: void; [[Called when animation is just started]]
+ play,repeat: void; [[Called when animation is just repeated]]
+ play,done: void; [[Called when animation is just finished]]
+ play,pause: void; [[Called when animation is just paused]]
+ play,resume: void; [[Called when animation is just resumed]]
+ play,stop: void; [[Called when animation is just stopped]]
+ play,update: void; [[Called when animation is just updated]]
}
}