static int qvariantmap_new(lua_State *L) { QVariantMap l; if (! lua_isnone(L, 1)) { luaL_checktype(L, 1, LUA_TTABLE); lua_pushnil(L); while (lua_next(L, -2)) { QVariant k = luaQ_toqvariant(L, -2, QMetaType::QString); if (k.userType() != QMetaType::QString) luaL_error(L, "table element cannot be converted to a QString"); l[k.toString()] = luaQ_toqvariant(L, -1); lua_pop(L, 1); } } luaQ_pushqt(L, QVariant(l)); return 1; }
static int qsvgrenderer_new(lua_State *L) { QVariant v = luaQ_toqvariant(L, 1, QMetaType::QString); if (v.type() == QVariant::String) { QObject *p = luaQ_optqobject<QObject>(L, 2); luaQ_pushqt(L, new QSvgRenderer(v.toString(), p), !p); } else { QObject *p = luaQ_optqobject<QObject>(L, 1); luaQ_pushqt(L, new QSvgRenderer(p), !p); } return 1; }
static int qtluasvggenerator_new(lua_State *L) { QVariant v = luaQ_toqvariant(L, 1, QMetaType::QString); if (v.type() == QVariant::String) { QObject *p = luaQ_optqobject<QObject>(L, 2); luaQ_pushqt(L, new QtLuaSvgGenerator(v.toString(), p), !p); } else { QObject *p = luaQ_optqobject<QObject>(L, 1); luaQ_pushqt(L, new QtLuaSvgGenerator(p), !p); } return 1; }
static int qsvgwidget_new(lua_State *L) { QVariant v = luaQ_toqvariant(L, 1, QMetaType::QString); if (v.type() == QVariant::String) { QWidget *p = luaQ_optqobject<QWidget>(L, 2); luaQ_pushqt(L, new QSvgWidget(v.toString(), p), !p); } else { QWidget *p = luaQ_optqobject<QWidget>(L, 1); luaQ_pushqt(L, new QSvgWidget(p), !p); } return 1; }
static int qvariantlist_new(lua_State *L) { QVariantList l; if (! lua_isnone(L, 1)) { luaL_checktype(L, 1, LUA_TTABLE); int n = lua_objlen(L, 1); for (int i=1; i<=n; i++) { lua_rawgeti(L, 1, i); l += luaQ_toqvariant(L, -1); lua_pop(L, 1); } } luaQ_pushqt(L, QVariant(l)); return 1; }
static int qt_type(lua_State *L) { QVariant v; if (lua_type(L, 1) == LUA_TUSERDATA) v = luaQ_toqvariant(L, 1); if (v.type() != QVariant::Invalid) { lua_pushvalue(L, 1); lua_getfield(L, -1, "type"); if (lua_isfunction(L, -1)) { lua_insert(L, -2); lua_call(L, 1, 1); return 1; } } lua_pushnil(L); return 1; }
static int qstringlist_new(lua_State *L) { QStringList l; if (! lua_isnone(L, 1)) { luaL_checktype(L, 1, LUA_TTABLE); int n = lua_objlen(L, 1); for (int i=1; i<=n; i++) { lua_rawgeti(L, 1, i); QVariant v = luaQ_toqvariant(L, -1, QMetaType::QString); if (v.userType() != QMetaType::QString) luaL_error(L, "table element cannot be converted to a QString"); l += v.toString(); lua_pop(L, 1); } } luaQ_pushqt(L, QVariant(l)); return 1; }
int luaQ_complete(struct lua_State *L) { int k = 0; int loop = 0; const char *stem = luaL_checkstring(L, 1); lua_pushvalue(L, LUA_GLOBALSINDEX); for(;;) { const char *s = stem; while (*s && *s != '.' && *s != ':') s++; if (*s == 0) break; // stack: table str lua_pushlstring(L, stem, s-stem); lua_gettable(L, -2); // stack: ntable table str lua_replace(L, -2); // stack: ntable str stem = s + 1; } lua_createtable(L, 0, 0); lua_insert(L, -2); // stack: maybetable anstable str if (lua_isuserdata(L, -1) && lua_getmetatable(L, -1)) { lua_replace(L, -2); lua_pushliteral(L, "__index"); lua_rawget(L, -2); if (lua_isfunction(L, -1)) { lua_pop(L, 1); lua_pushliteral(L, "__metatable"); lua_rawget(L, -2); } lua_replace(L, -2); } if (! lua_istable(L, -1)) { lua_pop(L, 1); return 1; } // stack: table anstable str size_t stemlen = strlen(stem); for(;;) { lua_pushnil(L); while (lua_next(L, -2)) { // stack: value key table anstable str bool ok = false; size_t keylen; const char *key = lua_tolstring(L, -2, &keylen); if (key && keylen > 0 && keylen >= stemlen) if (!strncmp(key, stem, stemlen)) ok = true; if (ok && !isalpha(key[0])) ok = false; if (ok) for (int i=0; ok && i<(int)keylen; i++) if (!isalpha(key[i]) && !isdigit(key[i]) && key[i]!='_') ok = false; if (ok) { const char *suffix = ""; switch (lua_type(L, -1)) { case LUA_TFUNCTION: suffix = "("; break; case LUA_TTABLE: suffix = "."; luaQ_getfield(L, -1, "_C"); if (lua_istable(L, -1)) suffix = ":"; lua_pop(L, 1); break; case LUA_TUSERDATA: { QVariant v = luaQ_toqvariant(L, -1); const char *s = QMetaType::typeName(v.userType()); if (s && !strcmp(s,"QtLuaMethodInfo")) suffix = "("; else if (s && !strcmp(s, "QtLuaPropertyInfo")) suffix = ""; else if (lua_getmetatable(L, -1)) { lua_pop(L, 1); suffix = ":"; } else suffix = ""; } break; default: break; } // stack: value key table anstable str lua_pushfstring(L, "%s%s", key+stemlen, suffix); lua_rawseti(L, -5, ++k); } lua_pop(L, 1); } // stack: table anstable str if (! lua_getmetatable(L, -1)) break; lua_replace(L, -2); lua_pushliteral(L, "__index"); lua_rawget(L, -2); lua_replace(L, -2); if (! lua_istable(L, -1)) break; if (++loop > 100) luaL_error(L, "complete: infinite loop in metatables"); } // stack: something anstable str lua_pop(L, 1); lua_replace(L, -2); return 1; }