From d9338083192084613e5530b02710b796252d342b Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 12 Aug 2010 10:57:04 +0000 Subject: New scripting system part2. --- client/luawidget.cc | 143 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 104 insertions(+), 39 deletions(-) (limited to 'client/luawidget.cc') diff --git a/client/luawidget.cc b/client/luawidget.cc index c8e6017..529984c 100644 --- a/client/luawidget.cc +++ b/client/luawidget.cc @@ -27,6 +27,29 @@ */ #include "luawidget.h" +#include "widgets.h" + +#define LUA_SRC "lua" + +/** + ** Copied from lauxlib.c, but modified return NULL upon error instead of + ** casting a lua error. + **/ +LUALIB_API void *luaL_isudata (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); + if (p != NULL) { /* value is a userdata? */ + if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ + lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ + if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ + lua_pop(L, 2); /* remove both metatables */ + return p; + } + } + } + // luaL_typerror(L, ud, tname); /* else error */ + return NULL; /* to avoid warnings */ +} + #define luaL_checkbool(L, i) \ (lua_isboolean(L,i) ? lua_toboolean(L,i) : luaL_checkint(L,i)) @@ -38,7 +61,8 @@ static int wdg_name(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); lua_pushstring(L, wdgu->widget->name().toStdString().c_str()); @@ -50,7 +74,8 @@ static int wdg_type(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); // return error code @@ -63,10 +88,11 @@ static int wdg_value(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); - lua_pushstring(L, wdgu->widget->getValue().toStdString().c_str()); + lua_pushstring(L, wdgu->widget->value().toStdString().c_str()); return 1; } @@ -75,12 +101,13 @@ static int wdg_set_value(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); const char *val = luaL_checkstring(L, 2); - wdgu->widget->setValue(val); + wdgu->widget->setValue(val, LUA_SRC); return 0; } @@ -89,10 +116,11 @@ static int wdg_enabled(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); - lua_pushboolean(L, wdgu->widget->isDisabled() == false); + lua_pushboolean(L, wdgu->widget->enabled()); return 1; } @@ -101,13 +129,13 @@ static int wdg_set_enabled(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); bool val = luaL_checkbool(L, 2); - if(val) wdgu->widget->enable(); - else wdgu->widget->disable(); + wdgu->widget->setEnabled(val); return 0; } @@ -116,10 +144,11 @@ static int wdg_visible(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); - lua_pushboolean(L, wdgu->widget->getVisibility()); + lua_pushboolean(L, wdgu->widget->visible()); return 1; } @@ -128,12 +157,13 @@ static int wdg_set_visible(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); bool val = luaL_checkbool(L, 2); - wdgu->widget->setVisibility(val); + wdgu->widget->setVisible(val); return 0; } @@ -142,10 +172,11 @@ static int wdg_valid(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); - lua_pushboolean(L, wdgu->widget->isValid()); + lua_pushboolean(L, wdgu->widget->valid()); return 1; } @@ -154,7 +185,8 @@ static int wdg_set_valid(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "Widget"); + if(!wdgu) wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); luaL_argcheck(L, wdgu, 1, "widget expected"); bool val = luaL_checkbool(L, 2); @@ -164,35 +196,58 @@ static int wdg_set_valid(lua_State *L) return 0; } -static int wdg_close(lua_State *L) +static int wdg_checked(lua_State *L) { wdg_userdata *wdgu; - wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); - luaL_argcheck(L, wdgu, 1, "widget expected"); + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); + luaL_argcheck(L, wdgu, 1, "checkbox expected"); - return 0; + CheckBox *cmb = (CheckBox*)wdgu->widget; + lua_pushboolean(L, cmb->checked()); + + return 1; } -static const struct luaL_reg wdg_meths[] = +static int wdg_set_checked(lua_State *L) { - {"name", wdg_name}, - {"type", wdg_type}, - - {"value", wdg_value}, - {"setValue", wdg_set_value}, + wdg_userdata *wdgu; - {"enabled", wdg_enabled}, - {"setEnabled", wdg_set_enabled}, + wdgu = (wdg_userdata *)luaL_isudata(L, 1, "CheckBox"); + luaL_argcheck(L, wdgu, 1, "checkbox expected"); - {"visible", wdg_visible}, - {"setVisible", wdg_set_visible}, + bool val = luaL_checkbool(L, 2); - {"valid", wdg_valid}, - {"setValid", wdg_set_valid}, + CheckBox *cmb = (CheckBox*)wdgu->widget; + cmb->setChecked(val); + + return 0; +} - {"close", wdg_close}, - {"__gc", wdg_close}, +#define WDG_METHS \ + {"name", wdg_name},\ + {"type", wdg_type},\ + {"value", wdg_value},\ + {"setValue", wdg_set_value},\ + {"enabled", wdg_enabled},\ + {"setEnabled", wdg_set_enabled},\ + {"visible", wdg_visible},\ + {"setVisible", wdg_set_visible},\ + {"valid", wdg_valid},\ + {"setValid", wdg_set_valid} + +#define WDG_CHKBOX_METHS \ + {"checked", wdg_checked},\ + {"setChecked", wdg_set_checked} + +static const struct luaL_Reg wdg_meths[] = { + WDG_METHS, {NULL, NULL} }; + +static const struct luaL_Reg wdg_chkbox_meths[] = { + WDG_METHS, WDG_CHKBOX_METHS, {NULL, NULL} }; + +static const struct luaL_Reg wdg_chk_meths[] = +{ {NULL, NULL} }; @@ -201,7 +256,12 @@ int wdg_make_widget(lua_State *L, Widget *widget) wdg_userdata *wdgu; wdgu = (wdg_userdata *)lua_newuserdata(L, sizeof(wdg_userdata)); - luaL_getmetatable(L, "Widget"); + if(widget->type() == "checkbox") { + luaL_getmetatable(L, "CheckBox"); + } else { + luaL_getmetatable(L, "Widget"); + } + lua_setmetatable(L, -2); wdgu->widget = widget; @@ -212,11 +272,16 @@ int wdg_make_widget(lua_State *L, Widget *widget) void register_widget(lua_State *L) { luaL_newmetatable(L, "Widget"); + lua_pushliteral(L, "__index"); + lua_pushvalue(L, -2); + lua_rawset(L, -3); + luaL_register(L, NULL, wdg_meths); - // metatable.__index = metatable + luaL_newmetatable(L, "CheckBox"); lua_pushliteral(L, "__index"); lua_pushvalue(L, -2); lua_rawset(L, -3); + luaL_register(L, NULL, wdg_chkbox_meths); - luaL_openlib(L, NULL, wdg_meths, 0); } + -- cgit v1.2.3