summaryrefslogtreecommitdiff
path: root/client/luawidget.cc
diff options
context:
space:
mode:
Diffstat (limited to 'client/luawidget.cc')
-rw-r--r--client/luawidget.cc143
1 files changed, 104 insertions, 39 deletions
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);
}
+