From 06dd419b4b3d009a5d04629013268625c56b420a Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Wed, 7 Jul 2010 00:58:34 +0000 Subject: [PATCH] transition++ SVN revision: 50089 --- legacy/edje/src/lib/edje_lua2.c | 86 +++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/legacy/edje/src/lib/edje_lua2.c b/legacy/edje/src/lib/edje_lua2.c index ccbc530369..9503f6dbe6 100644 --- a/legacy/edje/src/lib/edje_lua2.c +++ b/legacy/edje/src/lib/edje_lua2.c @@ -29,10 +29,11 @@ extern "C" //--------------------------------------------------------------------------// -typedef struct _Edje_Lua_Alloc Edje_Lua_Alloc; -typedef struct _Edje_Lua_Obj Edje_Lua_Obj; -typedef struct _Edje_Lua_Timer Edje_Lua_Timer; -typedef struct _Edje_Lua_Animator Edje_Lua_Animator; +typedef struct _Edje_Lua_Alloc Edje_Lua_Alloc; +typedef struct _Edje_Lua_Obj Edje_Lua_Obj; +typedef struct _Edje_Lua_Timer Edje_Lua_Timer; +typedef struct _Edje_Lua_Animator Edje_Lua_Animator; +typedef struct _Edje_Lua_Transition Edje_Lua_Transition; //--------------------------------------------------------------------------// struct _Edje_Lua_Alloc @@ -62,6 +63,14 @@ struct _Edje_Lua_Animator int fn_ref; }; +struct _Edje_Lua_Transition +{ + Edje_Lua_Obj obj; + Ecore_Animator *animator; + double transition, start; + int fn_ref; +}; + //--------------------------------------------------------------------------// static int _elua_obj_gc(lua_State *L); @@ -71,6 +80,7 @@ static int _elua_echo(lua_State *L); static int _elua_timer(lua_State *L); static int _elua_animator(lua_State *L); +static int _elua_transition(lua_State *L); //--------------------------------------------------------------------------// @@ -84,6 +94,7 @@ static const struct luaL_reg _elua_edje_api [] = {"timer", _elua_timer}, // add timer {"animator", _elua_animator}, // add animator + {"transition", _elua_transition}, // add transition {NULL, NULL} // end }; @@ -412,6 +423,73 @@ _elua_animator(lua_State *L) _elua_gc(L); return 1; } + +//------------- +static Eina_Bool +_elua_transition_cb(void *data) +{ + Edje_Lua_Transition *elt = data; + lua_State *L; + int ret = 0; + int err; + double t; + + if (!elt->obj.ed) return 0; + L = elt->obj.ed->L; + if (!L) return 0; + t = (ecore_loop_time_get() - elt->start) / elt->transition; + if (t > 1.0) t = 1.0; + lua_rawgeti(L, LUA_REGISTRYINDEX, elt->fn_ref); + lua_pushnumber(L, t); + if ((err = lua_pcall(L, 1, 1, 0))) + { + _edje_lua2_error(L, err); + _elua_obj_free(L, (Edje_Lua_Obj *)elt); + _elua_gc(L); + return 0; + } + ret = lua_toboolean(L, -1); + lua_pop(L, 1); + if (t >= 1.0) ret = 0; + if (ret == 0) _elua_obj_free(L, (Edje_Lua_Obj *)elt); + _elua_gc(L); + return ret; +} + +static void +_elua_transition_free(void *obj) +{ + Edje_Lua_Transition *elt = obj; + lua_State *L; + if (!elt->obj.ed) return; + L = elt->obj.ed->L; + luaL_unref(L, LUA_REGISTRYINDEX, elt->fn_ref); //0 + elt->fn_ref = 0; + ecore_animator_del(elt->animator); + elt->animator = NULL; +} + +static int +_elua_transition(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Transition *elt; + double val; + + val = luaL_checknumber(L, 1); + luaL_checkany(L, 2); + + elt = (Edje_Lua_Transition *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Transition)); + elt->obj.free_func = _elua_transition_free; + elt->animator = ecore_animator_add(_elua_transition_cb, elt); + if (val < 0.0000001) val = 0.0000001; + elt->transition = val; + elt->start = ecore_loop_time_get(); + lua_pushvalue(L, 2); + elt->fn_ref = luaL_ref(L, LUA_REGISTRYINDEX); + _elua_gc(L); + return 1; +} //------------- //--------------- //-------------------