/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set et sw=2 ts=2: */ /*************************************************************************** * luawidget.cc * * Tue Aug 3 10:17:02 CEST 2010 * Copyright 2010 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of Pracro. * * Pracro is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Pracro is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "luawidget.h" #define luaL_checkbool(L, i) \ (lua_isboolean(L,i) ? lua_toboolean(L,i) : luaL_checkint(L,i)) typedef struct wdg_userdata { Widget *widget; } wdg_userdata; static int wdg_name(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); lua_pushstring(L, wdgu->widget->name().toStdString().c_str()); return 1; } static int wdg_type(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); // return error code lua_pushstring(L, wdgu->widget->type().toStdString().c_str()); return 1; } static int wdg_value(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); lua_pushstring(L, wdgu->widget->getValue().toStdString().c_str()); return 1; } static int wdg_set_value(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); const char *val = luaL_checkstring(L, 2); wdgu->widget->setValue(val); return 0; } static int wdg_enabled(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); lua_pushboolean(L, wdgu->widget->isDisabled() == false); return 1; } static int wdg_set_enabled(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); bool val = luaL_checkbool(L, 2); if(val) wdgu->widget->enable(); else wdgu->widget->disable(); return 0; } static int wdg_visible(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); lua_pushboolean(L, wdgu->widget->getVisibility()); return 1; } static int wdg_set_visible(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); bool val = luaL_checkbool(L, 2); wdgu->widget->setVisibility(val); return 0; } static int wdg_valid(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); lua_pushboolean(L, wdgu->widget->isValid()); return 1; } static int wdg_set_valid(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); bool val = luaL_checkbool(L, 2); wdgu->widget->setValid(val); return 0; } static int wdg_close(lua_State *L) { wdg_userdata *wdgu; wdgu = (wdg_userdata *)luaL_checkudata(L, 1, "Widget"); luaL_argcheck(L, wdgu, 1, "widget expected"); return 0; } static const struct luaL_reg 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}, {"close", wdg_close}, {"__gc", wdg_close}, {NULL, NULL} }; 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"); lua_setmetatable(L, -2); wdgu->widget = widget; return 1; } void register_widget(lua_State *L) { luaL_newmetatable(L, "Widget"); // metatable.__index = metatable lua_pushliteral(L, "__index"); lua_pushvalue(L, -2); lua_rawset(L, -3); luaL_openlib(L, NULL, wdg_meths, 0); }