Browse Source

Lua data bindings, some cleanup.

Michael Ragazzon 5 years ago
parent
commit
aa1d627e5a
4 changed files with 86 additions and 116 deletions
  1. 2 1
      CMake/FileList.cmake
  2. 3 0
      Include/RmlUi/Lua/Utilities.h
  3. 10 79
      Source/Lua/LuaDataModel.cpp
  4. 71 36
      Source/Lua/Utilities.cpp

+ 2 - 1
CMake/FileList.cmake

@@ -496,6 +496,7 @@ set(Lua_HDR_FILES
     ${PROJECT_SOURCE_DIR}/Source/Lua/EventParametersProxy.h
     ${PROJECT_SOURCE_DIR}/Source/Lua/GlobalLuaFunctions.h
     ${PROJECT_SOURCE_DIR}/Source/Lua/Log.h
+    ${PROJECT_SOURCE_DIR}/Source/Lua/LuaDataModel.h
     ${PROJECT_SOURCE_DIR}/Source/Lua/LuaDocument.h
     ${PROJECT_SOURCE_DIR}/Source/Lua/LuaDocumentElementInstancer.h
     ${PROJECT_SOURCE_DIR}/Source/Lua/LuaElementInstancer.h
@@ -550,6 +551,7 @@ set(Lua_SRC_FILES
     ${PROJECT_SOURCE_DIR}/Source/Lua/Interpreter.cpp
     ${PROJECT_SOURCE_DIR}/Source/Lua/Log.cpp
     ${PROJECT_SOURCE_DIR}/Source/Lua/Lua.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Lua/LuaDataModel.cpp
     ${PROJECT_SOURCE_DIR}/Source/Lua/LuaDocument.cpp
     ${PROJECT_SOURCE_DIR}/Source/Lua/LuaDocumentElementInstancer.cpp
     ${PROJECT_SOURCE_DIR}/Source/Lua/LuaElementInstancer.cpp
@@ -562,6 +564,5 @@ set(Lua_SRC_FILES
     ${PROJECT_SOURCE_DIR}/Source/Lua/Utilities.cpp
     ${PROJECT_SOURCE_DIR}/Source/Lua/Vector2f.cpp
     ${PROJECT_SOURCE_DIR}/Source/Lua/Vector2i.cpp
-    ${PROJECT_SOURCE_DIR}/Source/Lua/LuaDataModel.cpp
 )
 

+ 3 - 0
Include/RmlUi/Lua/Utilities.h

@@ -43,6 +43,9 @@ namespace Lua {
 @relates LuaType */
 void RMLUILUA_API PushVariant(lua_State* L, const Variant* var);
 
+/** Populate the variant based on the Lua value at the given index */
+void RMLUILUA_API GetVariant(lua_State* L, int index, Variant* variant);
+
 //Helper function, so that the types don't have to define individual functions themselves
 // to fill the Elements.As table
 template<typename ToType>

+ 10 - 79
Source/Lua/LuaDataModel.cpp

@@ -27,6 +27,7 @@
  */
  
 #include "LuaDataModel.h"
+#include <RmlUi/Lua/Utilities.h>
 #include <RmlUi/Core/DataVariable.h>
 #include <RmlUi/Core/Context.h>
 #include <RmlUi/Core/DataModelHandle.h>
@@ -44,97 +45,26 @@ struct LuaDataModel {
 	LuaScalarDef *scalarDef;
 };
 
-static void
-PushVariant(lua_State *L, const Rml::Variant &v) {
-	switch (v.GetType()) {
-	case Rml::Variant::Type::BOOL:
-		lua_pushboolean(L, v.GetReference<bool>());
-		break;
-	case Rml::Variant::Type::BYTE:
-		lua_pushinteger(L, v.GetReference<unsigned char>());
-		break;
-	case Rml::Variant::Type::CHAR: {
-		char s[1] = {v.GetReference<char>() };
-		lua_pushlstring(L, s, 1);
-		break; }
-	case Rml::Variant::Type::FLOAT:
-		lua_pushnumber(L, v.GetReference<float>());
-		break;
-	case Rml::Variant::Type::DOUBLE:
-		lua_pushnumber(L, v.GetReference<double>());
-		break;
-	case Rml::Variant::Type::INT:
-		lua_pushinteger(L, v.GetReference<int>());
-		break;
-	case Rml::Variant::Type::INT64:
-		lua_pushinteger(L, v.GetReference<int64_t>());
-		break;
-	case Rml::Variant::Type::STRING: {
-		const Rml::String &s = v.GetReference<Rml::String>();
-		lua_pushlstring(L, s.c_str(), s.length());
-		break; }
-	case Rml::Variant::Type::NONE:
-	case Rml::Variant::Type::VECTOR2:
-	case Rml::Variant::Type::VECTOR3:
-	case Rml::Variant::Type::VECTOR4:
-	case Rml::Variant::Type::COLOURF:
-	case Rml::Variant::Type::COLOURB:
-	case Rml::Variant::Type::SCRIPTINTERFACE:
-	case Rml::Variant::Type::TRANSFORMPTR:
-	case Rml::Variant::Type::TRANSITIONLIST:
-	case Rml::Variant::Type::ANIMATIONLIST:
-	case Rml::Variant::Type::DECORATORSPTR:
-	case Rml::Variant::Type::FONTEFFECTSPTR:
-	case Rml::Variant::Type::VOIDPTR:
-	default:
-		// todo : support other types
-		lua_pushnil(L);
-		break;
-	}
-}
-
-static void
-GetVariant(lua_State *L, int index, Variant &variant) {
-	switch(lua_type(L, index)) {
-	case LUA_TBOOLEAN:
-		variant = (bool)lua_toboolean(L, index);
-		break;
-	case LUA_TNUMBER:
-		if (lua_isinteger(L, index)) {
-			variant = (int64_t)lua_tointeger(L, index);
-		} else {
-			variant = (double)lua_tonumber(L, index);
-		}
-		break;
-	case LUA_TSTRING:
-		variant = Rml::String(lua_tostring(L, index));
-		break;
-	case LUA_TNIL:
-	default:	// todo: support other types
-		variant = Variant();
-		break;
-	}
-}
 
 class LuaScalarDef final : public VariableDefinition {
 public:
 	LuaScalarDef (const struct LuaDataModel *model) :
 		VariableDefinition(DataVariableType::Scalar), model(model) {}
 private:
-	virtual bool Get(void* ptr, Variant& variant) {
+	bool Get(void* ptr, Variant& variant) override {
 		lua_State *L = model->dataL;
 		if (!L)
 			return false;
-		int id = (intptr_t)ptr;
-		GetVariant(L, id, variant);
+		int id = int((intptr_t)ptr);
+		GetVariant(L, id, &variant);
 		return true;
 	}
-	virtual bool Set(void* ptr, const Rml::Variant& variant) {
-		int id = (intptr_t)ptr;
+	bool Set(void* ptr, const Rml::Variant& variant) override {
+		int id = int((intptr_t)ptr);
 		lua_State *L = model->dataL;
 		if (!L)
 			return false;
-		PushVariant(L, variant);
+		PushVariant(L, &variant);
 		lua_replace(L, id);
 		return true;
 	}
@@ -147,10 +77,11 @@ getId(lua_State *L, lua_State *dataL) {
 	lua_pushvalue(dataL, 1);
 	lua_xmove(dataL, L, 1);
 	lua_pushvalue(L, 2);
-	if (lua_rawget(L, -2) != LUA_TNUMBER) {
+	lua_rawget(L, -2);
+	if (lua_type(L, -1) != LUA_TNUMBER) {
 		luaL_error(L, "DataModel has no key : %s", lua_tostring(L, 2));
 	}
-	int id = lua_tointeger(L, -1);
+	int id = (int)lua_tointeger(L, -1);
 	lua_pop(L, 2);
 	return id;
 }

+ 71 - 36
Source/Lua/Utilities.cpp

@@ -34,43 +34,78 @@ namespace Lua {
 
 void PushVariant(lua_State* L, const Variant* var)
 {
-    if(var == nullptr)
-    {
-        lua_pushnil(L);
-        return;
-    }
-    Variant::Type vartype = var->GetType();
-    switch(vartype)
-    {
-    case Variant::BYTE:
-    case Variant::CHAR:
-    case Variant::INT:
-        lua_pushinteger(L,var->Get<int>());
-        break;
-    case Variant::FLOAT:
-        lua_pushnumber(L,var->Get<float>());
-        break;
-    case Variant::COLOURB:
-        LuaType<Colourb>::push(L,new Colourb(var->Get<Colourb>()),true);
-        break;
-    case Variant::COLOURF:
-        LuaType<Colourf>::push(L,new Colourf(var->Get<Colourf>()),true);
-        break;
-    case Variant::STRING:
-        lua_pushstring(L,var->Get<String>().c_str());
-        break;
-    case Variant::VECTOR2:
-        //according to Variant.inl, it is going to be a Vector2f
-        LuaType<Vector2f>::push(L,new Vector2f(var->Get<Vector2f>()),true);
-        break;
-    case Variant::VOIDPTR:
-        lua_pushlightuserdata(L,var->Get<void*>());
-        break;
-    default:
-        lua_pushnil(L);
-        break;
-    }
+	if (!var)
+	{
+		lua_pushnil(L);
+		return;
+	}
+
+	switch (var->GetType())
+	{
+	case Variant::BOOL:
+		lua_pushboolean(L, var->Get<bool>());
+		break;
+	case Variant::BYTE:
+	case Variant::CHAR:
+	case Variant::INT:
+		lua_pushinteger(L, var->Get<int>());
+		break;
+	case Variant::INT64:
+		lua_pushinteger(L, var->Get<int64_t>());
+		break;
+	case Variant::FLOAT:
+	case Variant::DOUBLE:
+		lua_pushnumber(L, var->Get<double>());
+		break;
+	case Variant::COLOURB:
+		LuaType<Colourb>::push(L, new Colourb(var->Get<Colourb>()), true);
+		break;
+	case Variant::COLOURF:
+		LuaType<Colourf>::push(L, new Colourf(var->Get<Colourf>()), true);
+		break;
+	case Variant::STRING:
+	{
+		const String& s = var->GetReference<Rml::String>();
+		lua_pushlstring(L, s.c_str(), s.length());
+	}
+	break;
+	case Variant::VECTOR2:
+		//according to Variant.inl, it is going to be a Vector2f
+		LuaType<Vector2f>::push(L, new Vector2f(var->Get<Vector2f>()), true);
+		break;
+	case Variant::VOIDPTR:
+		lua_pushlightuserdata(L, var->Get<void*>());
+		break;
+	default:
+		lua_pushnil(L);
+		break;
+	}
 }
 
+void GetVariant(lua_State* L, int index, Variant* variant)
+{
+	if (!variant)
+		return;
+
+	switch (lua_type(L, index))
+	{
+	case LUA_TBOOLEAN:
+		*variant = (bool)lua_toboolean(L, index);
+		break;
+	case LUA_TNUMBER:
+		*variant = lua_tonumber(L, index);
+		break;
+	case LUA_TSTRING:
+		*variant = Rml::String(lua_tostring(L, index));
+		break;
+	case LUA_TLIGHTUSERDATA:
+		*variant = lua_touserdata(L, index);
+		break;
+	case LUA_TNIL:
+	default:	// todo: support other types
+		*variant = Variant();
+		break;
+	}
+}
 } // namespace Lua
 } // namespace Rml