Browse Source

Added proxy tables for the functions that returned dictionary-like collections.

Nate Starkey 13 years ago
parent
commit
31076acf57

+ 32 - 0
Build/RocketLua.vcproj

@@ -294,6 +294,14 @@
 					RelativePath="..\Source\Controls\Lua\ElementFormControlTextArea.h"
 					RelativePath="..\Source\Controls\Lua\ElementFormControlTextArea.h"
 					>
 					>
 				</File>
 				</File>
+				<File
+					RelativePath="..\Source\Controls\Lua\SelectOptionsProxy.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\Source\Controls\Lua\SelectOptionsProxy.h"
+					>
+				</File>
 			</Filter>
 			</Filter>
 		</Filter>
 		</Filter>
 		<Filter
 		<Filter
@@ -355,6 +363,14 @@
 				RelativePath="..\Source\Core\Lua\RocketLua.h"
 				RelativePath="..\Source\Core\Lua\RocketLua.h"
 				>
 				>
 			</File>
 			</File>
+			<File
+				RelativePath="..\Source\Core\Lua\Utilities.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\Source\Core\Lua\Utilities.h"
+				>
+			</File>
 			<Filter
 			<Filter
 				Name="Element"
 				Name="Element"
 				>
 				>
@@ -366,6 +382,14 @@
 					RelativePath="..\Source\Core\Lua\Element.h"
 					RelativePath="..\Source\Core\Lua\Element.h"
 					>
 					>
 				</File>
 				</File>
+				<File
+					RelativePath="..\Source\Core\Lua\ElementAttributesProxy.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\Source\Core\Lua\ElementAttributesProxy.h"
+					>
+				</File>
 				<File
 				<File
 					RelativePath="..\Source\Core\Lua\ElementStyle.cpp"
 					RelativePath="..\Source\Core\Lua\ElementStyle.cpp"
 					>
 					>
@@ -422,6 +446,14 @@
 					RelativePath="..\Source\Core\Lua\Event.h"
 					RelativePath="..\Source\Core\Lua\Event.h"
 					>
 					>
 				</File>
 				</File>
+				<File
+					RelativePath="..\Source\Core\Lua\EventParametersProxy.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\Source\Core\Lua\EventParametersProxy.h"
+					>
+				</File>
 				<File
 				<File
 					RelativePath="..\Source\Core\Lua\LuaEventListener.cpp"
 					RelativePath="..\Source\Core\Lua\LuaEventListener.cpp"
 					>
 					>

+ 4 - 24
Source/Controls/Lua/ElementFormControlSelect.cpp

@@ -1,5 +1,6 @@
 #include "precompiled.h"
 #include "precompiled.h"
 #include "ElementFormControlSelect.h"
 #include "ElementFormControlSelect.h"
+#include "SelectOptionsProxy.h"
 #include <Rocket/Controls/ElementFormControlSelect.h>
 #include <Rocket/Controls/ElementFormControlSelect.h>
 #include <Rocket/Controls/ElementFormControl.h>
 #include <Rocket/Controls/ElementFormControl.h>
 #include <Rocket/Core/Element.h>
 #include <Rocket/Core/Element.h>
@@ -51,30 +52,9 @@ int ElementFormControlSelectGetAttroptions(lua_State* L)
 {
 {
     ElementFormControlSelect* obj = LuaType<ElementFormControlSelect>::check(L,1);
     ElementFormControlSelect* obj = LuaType<ElementFormControlSelect>::check(L,1);
     LUACHECKOBJ(obj);
     LUACHECKOBJ(obj);
-    int numOptions = obj->GetNumOptions();
-
-    //local variables for the loop
-    Rocket::Controls::SelectOption* opt; 
-    Element* ele;
-    String value;
-    lua_newtable(L);
-    int retindex = lua_gettop(L);
-    for(int index = 0; index < numOptions; index++)
-    {
-        opt = obj->GetOption(index);
-        if(opt == NULL) continue;
-    
-        ele = opt->GetElement();
-        value = opt->GetValue();
-
-        lua_newtable(L);
-        LuaType<Element>::push(L,ele,false);
-        lua_setfield(L,-2,"element");
-        lua_pushstring(L,value.CString());
-        lua_setfield(L,-2,"value");
-        lua_rawseti(L,retindex,index); //sets the table that is being returned's 'index' to be the table with element and value
-        lua_pop(L,1); //pops the table with element,value from the stack
-    }
+    SelectOptionsProxy* proxy = new SelectOptionsProxy();
+    proxy->owner = obj;
+    LuaType<SelectOptionsProxy>::push(L,proxy,true);
     return 1;
     return 1;
 }
 }
 
 

+ 77 - 0
Source/Controls/Lua/SelectOptionsProxy.cpp

@@ -0,0 +1,77 @@
+#include "precompiled.h"
+#include "SelectOptionsProxy.h"
+#include <Rocket/Core/Element.h>
+
+namespace Rocket {
+namespace Core {
+namespace Lua {
+int SelectOptionsProxy__index(lua_State* L)
+{
+    /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/
+    int keytype = lua_type(L,2);
+    if(keytype == LUA_TNUMBER) //only valid key types
+    {
+        SelectOptionsProxy* proxy = LuaType<SelectOptionsProxy>::check(L,1);
+        LUACHECKOBJ(proxy);
+        int index = luaL_checkint(L,2);
+        Rocket::Controls::SelectOption* opt = proxy->owner->GetOption(index);
+        LUACHECKOBJ(opt);
+        lua_newtable(L);
+        LuaType<Element>::push(L,opt->GetElement(),false);
+        lua_setfield(L,-2,"element");
+        lua_pushstring(L,opt->GetValue().CString());
+        lua_setfield(L,-2,"value");
+        return 1;
+    }
+    else
+        return LuaType<SelectOptionsProxy>::index(L);
+}
+
+//method
+int SelectOptionsProxyGetTable(lua_State* L, SelectOptionsProxy* obj)
+{
+    int numOptions = obj->owner->GetNumOptions();
+
+    //local variables for the loop
+    Rocket::Controls::SelectOption* opt; 
+    Element* ele;
+    String value;
+    lua_newtable(L); //table to return
+    int retindex = lua_gettop(L);
+    for(int index = 0; index < numOptions; index++)
+    {
+        opt = obj->owner->GetOption(index);
+        if(opt == NULL) continue;
+    
+        ele = opt->GetElement();
+        value = opt->GetValue();
+
+        lua_newtable(L);
+        LuaType<Element>::push(L,ele,false);
+        lua_setfield(L,-2,"element");
+        lua_pushstring(L,value.CString());
+        lua_setfield(L,-2,"value");
+        lua_rawseti(L,retindex,index); //sets the table that is being returned's 'index' to be the table with element and value
+    }
+    return 1;
+}
+
+RegType<SelectOptionsProxy> SelectOptionsProxyMethods[] =
+{
+    LUAMETHOD(SelectOptionsProxy,GetTable)
+    { NULL, NULL },
+};
+
+luaL_reg SelectOptionsProxyGetters[] =
+{
+    { NULL, NULL },
+};
+
+luaL_reg SelectOptionsProxySetters[] =
+{
+    { NULL, NULL },
+};
+
+}
+}
+}

+ 37 - 0
Source/Controls/Lua/SelectOptionsProxy.h

@@ -0,0 +1,37 @@
+#pragma once
+/*
+    Proxy table for ElementFormControlSelect.options
+    read-only, key must be a number
+    Each object in this proxy is a table with two items:
+    Element element and String value
+    Usage:
+    ElementFormControlSelect.options[2].element or ElementFormControlSelect.options[2].value
+    OR, as usual you can store the object in a variable like
+    local opt = ElementFormControlSelect.options
+    opt[2].element or opt[2].value
+    and you can store the returned table as a variable, of course
+    local item = opt[2]
+    item.element or item.value
+*/
+#include <Rocket/Core/Lua/lua.hpp>
+#include <Rocket/Core/Lua/LuaType.h>
+#include <Rocket/Controls/ElementFormControlSelect.h>
+
+namespace Rocket {
+namespace Core {
+namespace Lua {
+//where owner is the ElementFormControlSelect that we should look up information from
+struct SelectOptionsProxy { Rocket::Controls::ElementFormControlSelect* owner;  };
+
+template<> void LuaType<SelectOptionsProxy>::extra_init(lua_State* L, int metatable_index);
+int SelectOptionsProxy__index(lua_State* L);
+
+//method
+int SelectOptionsProxyGetTable(lua_State* L, SelectOptionsProxy* obj);
+
+RegType<SelectOptionsProxy> SelectOptionsProxyMethods[];
+luaL_reg SelectOptionsProxyGetters[];
+luaL_reg SelectOptionsProxySetters[];
+}
+}
+}

+ 6 - 75
Source/Core/Lua/Element.cpp

@@ -2,6 +2,8 @@
 #include "Element.h"
 #include "Element.h"
 #include <ElementStyle.h>
 #include <ElementStyle.h>
 #include "LuaEventListener.h"
 #include "LuaEventListener.h"
+#include "ElementAttributesProxy.h"
+#include "Utilities.h"
 
 
 
 
 namespace Rocket {
 namespace Rocket {
@@ -105,37 +107,7 @@ int ElementGetAttribute(lua_State* L, Element* obj)
 {
 {
     const char* name = luaL_checkstring(L,1);
     const char* name = luaL_checkstring(L,1);
     Variant* var = obj->GetAttribute(name);
     Variant* var = obj->GetAttribute(name);
-    Variant::Type type = var->GetType();
-    switch(type)
-    {
-    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,&var->Get<Colourb>(),false);
-        break;
-    case Variant::COLOURF:
-        LuaType<Colourf>::push(L,&var->Get<Colourf>(),false);
-        break;
-    case Variant::STRING:
-        lua_pushstring(L,var->Get<String>().CString());
-        break;
-    case Variant::VECTOR2:
-        //according to Variant.inl, it is going to be a Vector2f
-        LuaType<Vector2f>::push(L,&var->Get<Vector2f>(),false);
-        break;
-    case Variant::VOIDPTR:
-        lua_pushlightuserdata(L,var->Get<void*>());
-        break;
-    default:
-        lua_pushnil(L);
-        break;
-    }
+    PushVariant(L,var);
     return 1;
     return 1;
 }
 }
 
 
@@ -273,50 +245,9 @@ int ElementGetAttrattributes(lua_State* L)
 {
 {
     Element* ele = LuaType<Element>::check(L,1);
     Element* ele = LuaType<Element>::check(L,1);
     LUACHECKOBJ(ele);
     LUACHECKOBJ(ele);
-    
-    int index;
-    String key;
-    Variant* var;
-    Variant::Type type;
-
-    lua_newtable(L);
-    while(ele->IterateAttributes(index,key,var))
-    {
-        lua_pushstring(L,key.CString());
-        type = var->GetType();
-        switch(type)
-        {
-        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,&var->Get<Colourb>(),false);
-            break;
-        case Variant::COLOURF:
-            LuaType<Colourf>::push(L,&var->Get<Colourf>(),false);
-            break;
-        case Variant::STRING:
-            lua_pushstring(L,var->Get<String>().CString());
-            break;
-        case Variant::VECTOR2:
-            //according to Variant.inl, it is going to be a Vector2f
-            LuaType<Vector2f>::push(L,&var->Get<Vector2f>(),false);
-            break;
-        case Variant::VOIDPTR:
-            lua_pushlightuserdata(L,var->Get<void*>());
-            break;
-        default:
-            lua_pushnil(L);
-            break;
-        }   
-        lua_settable(L,-3);
-    }
-    
+    ElementAttributesProxy* proxy = new ElementAttributesProxy();
+    proxy->owner = ele;
+    LuaType<ElementAttributesProxy>::push(L,proxy,true);    
     return 1;
     return 1;
 }
 }
 
 

+ 60 - 0
Source/Core/Lua/ElementAttributesProxy.cpp

@@ -0,0 +1,60 @@
+#include "precompiled.h"
+#include "ElementAttributesProxy.h"
+#include <Rocket/Core/Variant.h>
+#include "Utilities.h"
+
+namespace Rocket {
+namespace Core {
+namespace Lua {
+int ElementAttributesProxy__index(lua_State* L)
+{
+    /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/
+    int keytype = lua_type(L,2);
+    if(keytype == LUA_TSTRING) //only valid key types
+    {
+        ElementAttributesProxy* obj = LuaType<ElementAttributesProxy>::check(L,1);
+        LUACHECKOBJ(obj);
+        const char* key = lua_tostring(L,2);
+        Variant* attr = obj->owner->GetAttribute(key);
+        PushVariant(L,attr); //Utilities.h
+        return 1;
+    }
+    else
+        return LuaType<ElementAttributesProxy>::index(L);
+}
+
+//method
+int ElementAttributesProxyGetTable(lua_State* L, ElementAttributesProxy* obj)
+{    
+    int index;
+    String key;
+    Variant* var;
+
+    lua_newtable(L);
+    int tbl = lua_gettop(L);
+    while(obj->owner->IterateAttributes(index,key,var))
+    {
+        lua_pushstring(L,key.CString());
+        PushVariant(L,var);
+        lua_settable(L,tbl);
+    }
+    return 1;
+}
+
+RegType<ElementAttributesProxy> ElementAttributesProxyMethods[] =
+{
+    LUAMETHOD(ElementAttributesProxy,GetTable)
+    { NULL, NULL },
+};
+
+luaL_reg ElementAttributesProxyGetters[] =
+{
+    { NULL, NULL },
+};
+luaL_reg ElementAttributesProxySetters[] =
+{
+    { NULL, NULL },
+};
+}
+}
+}

+ 27 - 0
Source/Core/Lua/ElementAttributesProxy.h

@@ -0,0 +1,27 @@
+#pragma once
+/*
+    Proxy table for Element.attribues
+    read-only Dictionary
+*/
+#include <Rocket/Core/Lua/lua.hpp>
+#include <Rocket/Core/Lua/LuaType.h>
+#include <Rocket/Core/Element.h>
+
+namespace Rocket {
+namespace Core {
+namespace Lua {
+//where owner is the Element that we should look up information from
+struct ElementAttributesProxy { Element* owner;  };
+
+template<> void LuaType<ElementAttributesProxy>::extra_init(lua_State* L, int metatable_index);
+int ElementAttributesProxy__index(lua_State* L);
+
+//method
+int ElementAttributesProxyGetTable(lua_State* L, ElementAttributesProxy* obj);
+
+RegType<ElementAttributesProxy> ElementAttributesProxyMethods[];
+luaL_reg ElementAttributesProxyGetters[];
+luaL_reg ElementAttributesProxySetters[];
+}
+}
+}

+ 4 - 93
Source/Core/Lua/Event.cpp

@@ -4,6 +4,7 @@
 #include <Rocket/Core/Event.h>
 #include <Rocket/Core/Event.h>
 #include <Rocket/Core/Element.h>
 #include <Rocket/Core/Element.h>
 #include <Rocket/Core/Dictionary.h>
 #include <Rocket/Core/Dictionary.h>
+#include "EventParametersProxy.h"
 
 
 
 
 namespace Rocket {
 namespace Rocket {
@@ -49,101 +50,12 @@ int EventGetAttrparameters(lua_State* L)
 {
 {
     Event* evt = LuaType<Event>::check(L,1);
     Event* evt = LuaType<Event>::check(L,1);
     LUACHECKOBJ(evt);
     LUACHECKOBJ(evt);
-    const Dictionary* params = evt->GetParameters();
-    int index = 0;
-    String key;
-    Variant* value;
-
-    lua_newtable(L);
-    int tableindex = lua_gettop(L);
-    while(params->Iterate(index,key,value))
-    {
-        lua_pushstring(L,key.CString());
-        Variant::Type type = value->GetType();
-        switch(type)
-        {
-        case Variant::BYTE:
-        case Variant::CHAR:
-        case Variant::INT:
-            lua_pushinteger(L,value->Get<int>());
-            break;
-        case Variant::FLOAT:
-            lua_pushnumber(L,value->Get<float>());
-            break;
-        case Variant::COLOURB:
-            LuaType<Colourb>::push(L,&value->Get<Colourb>(),false);
-            break;
-        case Variant::COLOURF:
-            LuaType<Colourf>::push(L,&value->Get<Colourf>(),false);
-            break;
-        case Variant::STRING:
-            lua_pushstring(L,value->Get<String>().CString());
-            break;
-        case Variant::VECTOR2:
-            //according to Variant.inl, it is going to be a Vector2f
-            LuaType<Vector2f>::push(L,&value->Get<Vector2f>(),false);
-            break;
-        case Variant::VOIDPTR:
-            lua_pushlightuserdata(L,value->Get<void*>());
-            break;
-        default:
-            lua_pushnil(L);
-            break;
-        }
-        lua_settable(L,tableindex);
-    }
+    EventParametersProxy* proxy = new EventParametersProxy();
+    proxy->owner = evt;
+    LuaType<EventParametersProxy>::push(L,proxy,true);
     return 1;
     return 1;
 }
 }
 
 
-
-
-//setters
-/*
-//Apparently, the dictionary returned is constant, and shouldn't be modified.
-//I am keeping this function in case that isn't the case
-int EventSetAttrparameters(lua_State* L)
-{
-    Event* evt = LuaType<Event>::check(L,1);
-    LUACHECKOBJ(evt);
-    const Dictionary* params = evt->GetParameters();
-    int valtype = lua_type(L,2);
-    if(valtype == LUA_TTABLE) //if the user gives a table, then go through the table and set everything
-    {
-        lua_pushnil(L); //becauase lua_next pops a key from the stack first, we don't want to pop the table
-        while(lua_next(L,2) != 0)
-        {
-            //[-1] is value, [-2] is key
-            int type = lua_type(L,-1);
-            const char* key = luaL_checkstring(L,-2); //key HAS to be a string, or things will go bad
-            switch(type)
-            {
-		    case LUA_TNUMBER:
-                params->Set(key,(float)lua_tonumber(L,-1));
-                break;
-		    case LUA_TBOOLEAN: 
-                params->Set(key,CHECK_BOOL(L,-1));
-                break;
-		    case LUA_TSTRING:
-                params->Set(key,luaL_checkstring(L,-1));
-                break;
-            case LUA_TUSERDATA:
-            case LUA_TLIGHTUSERDATA:
-                params->Set(key,lua_touserdata(L,-1));
-                break;
-            default:
-                break;
-            }
-        }
-    }
-    else if(valtype == LUA_TNIL)
-    {
-        params->Clear();
-    }
-    return 0;
-}
-*/
-
-
 RegType<Event> EventMethods[] =
 RegType<Event> EventMethods[] =
 {
 {
     LUAMETHOD(Event,StopPropagation)
     LUAMETHOD(Event,StopPropagation)
@@ -161,7 +73,6 @@ luaL_reg EventGetters[] =
 
 
 luaL_reg EventSetters[] =
 luaL_reg EventSetters[] =
 {
 {
-    //LUASETTER(Event,parameters)
     { NULL, NULL },
     { NULL, NULL },
 };
 };
 
 

+ 0 - 3
Source/Core/Lua/Event.h

@@ -31,9 +31,6 @@ int EventGetAttrtype(lua_State* L);
 int EventGetAttrtarget_element(lua_State* L);
 int EventGetAttrtarget_element(lua_State* L);
 int EventGetAttrparameters(lua_State* L);
 int EventGetAttrparameters(lua_State* L);
 
 
-//setters
-//int EventSetAttrparameters(lua_State* L);
-
 RegType<Event> EventMethods[];
 RegType<Event> EventMethods[];
 luaL_reg EventGetters[];
 luaL_reg EventGetters[];
 luaL_reg EventSetters[];
 luaL_reg EventSetters[];

+ 62 - 0
Source/Core/Lua/EventParametersProxy.cpp

@@ -0,0 +1,62 @@
+#include "precompiled.h"
+#include "EventParametersProxy.h"
+#include "Utilities.h"
+#include <Rocket/Core/Variant.h>
+#include <Rocket/Core/Dictionary.h>
+
+
+namespace Rocket {
+namespace Core {
+namespace Lua {
+int EventParametersProxy__index(lua_State* L)
+{
+    /*the table obj and the missing key are currently on the stack(index 1 & 2) as defined by the Lua language*/
+    int keytype = lua_type(L,2);
+    if(keytype == LUA_TSTRING) //only valid key types
+    {
+        EventParametersProxy* obj = LuaType<EventParametersProxy>::check(L,1);
+        LUACHECKOBJ(obj);
+        const char* key = lua_tostring(L,2);
+        Variant* param = obj->owner->GetParameters()->Get(key);
+        PushVariant(L,param);
+        return 1;
+    }
+    else
+        return LuaType<EventParametersProxy>::index(L);
+}
+
+//method
+int EventParametersProxyGetTable(lua_State* L, EventParametersProxy* obj)
+{
+    const Dictionary* params = obj->owner->GetParameters();
+    int index = 0;
+    String key;
+    Variant* value;
+
+    lua_newtable(L);
+    int tableindex = lua_gettop(L);
+    while(params->Iterate(index,key,value))
+    {
+        lua_pushstring(L,key.CString());
+        PushVariant(L,value);
+        lua_settable(L,tableindex);
+    }
+    return 1;
+}
+
+RegType<EventParametersProxy> EventParametersProxyMethods[] =
+{
+    LUAMETHOD(EventParametersProxy,GetTable)
+    { NULL, NULL },
+};
+luaL_reg EventParametersProxyGetters[] =
+{
+    { NULL, NULL },
+};
+luaL_reg EventParametersProxySetters[] =
+{
+    { NULL, NULL },
+};
+}
+}
+}

+ 27 - 0
Source/Core/Lua/EventParametersProxy.h

@@ -0,0 +1,27 @@
+#pragma once
+/*
+    Proxy table for Event.parameters
+    read-only Dictionary
+*/
+#include <Rocket/Core/Lua/lua.hpp>
+#include <Rocket/Core/Lua/LuaType.h>
+#include <Rocket/Core/Event.h>
+
+namespace Rocket {
+namespace Core {
+namespace Lua {
+//where owner is the Element that we should look up information from
+struct EventParametersProxy { Event* owner;  };
+
+template<> void LuaType<EventParametersProxy>::extra_init(lua_State* L, int metatable_index);
+int EventParametersProxy__index(lua_State* L);
+
+//method
+int EventParametersProxyGetTable(lua_State* L, EventParametersProxy* obj);
+
+RegType<EventParametersProxy> EventParametersProxyMethods[];
+luaL_reg EventParametersProxyGetters[];
+luaL_reg EventParametersProxySetters[];
+}
+}
+}

+ 28 - 1
Source/Core/Lua/LuaTypeTemplateSpec.inl

@@ -1,6 +1,6 @@
 /*
 /*
     Because all of the template specializations have to be compiled in the same translation unit, they have to 
     Because all of the template specializations have to be compiled in the same translation unit, they have to 
-    exist in this file. It is included by LuaType.cpp
+    exist in this file. It is included by LuaType.cpp (or LuaType.inl right now)
 */
 */
 #include "precompiled.h"
 #include "precompiled.h"
 #include <Rocket/Core/Core.h>
 #include <Rocket/Core/Core.h>
@@ -30,6 +30,9 @@
 #include "DataSource.h"
 #include "DataSource.h"
 #include "DataFormatter.h"
 #include "DataFormatter.h"
 #include "ContextDocumentsProxy.h"
 #include "ContextDocumentsProxy.h"
+#include "ElementAttributesProxy.h"
+#include "EventParametersProxy.h"
+#include "SelectOptionsProxy.h"
 
 
 
 
 
 
@@ -62,6 +65,9 @@ LUATYPEDEFINE(ElementTabSet)
 LUATYPEDEFINE(DataSource)
 LUATYPEDEFINE(DataSource)
 LUATYPEDEFINE(DataFormatter)
 LUATYPEDEFINE(DataFormatter)
 LUATYPEDEFINE(ContextDocumentsProxy)
 LUATYPEDEFINE(ContextDocumentsProxy)
+LUATYPEDEFINE(ElementAttributesProxy)
+LUATYPEDEFINE(EventParametersProxy)
+LUATYPEDEFINE(SelectOptionsProxy)
 
 
 
 
 template class LuaType<Colourb>;
 template class LuaType<Colourb>;
@@ -88,6 +94,9 @@ template class LuaType<ElementTabSet>;
 template class LuaType<DataSource>;
 template class LuaType<DataSource>;
 template class LuaType<DataFormatter>;
 template class LuaType<DataFormatter>;
 template class LuaType<ContextDocumentsProxy>;
 template class LuaType<ContextDocumentsProxy>;
+template class LuaType<ElementAttributesProxy>;
+template class LuaType<EventParametersProxy>;
+template class LuaType<SelectOptionsProxy>;
 
 
 
 
 //reference counted types
 //reference counted types
@@ -381,6 +390,24 @@ template<> void LuaType<ContextDocumentsProxy>::extra_init(lua_State* L, int met
     lua_setfield(L,metatable_index,"__index");
     lua_setfield(L,metatable_index,"__index");
 }
 }
 
 
+template<> void LuaType<ElementAttributesProxy>::extra_init(lua_State* L, int metatable_index)
+{
+    lua_pushcfunction(L,ElementAttributesProxy__index);
+    lua_setfield(L,metatable_index,"__index");
+}
+
+template<> void LuaType<EventParametersProxy>::extra_init(lua_State* L, int metatable_index)
+{
+    lua_pushcfunction(L,EventParametersProxy__index);
+    lua_setfield(L,metatable_index,"__index");
+}
+
+template<> void LuaType<SelectOptionsProxy>::extra_init(lua_State* L, int metatable_index)
+{
+    lua_pushcfunction(L,SelectOptionsProxy__index);
+    lua_setfield(L,metatable_index,"__index");
+}
+
 }
 }
 }
 }
 }
 }

+ 50 - 0
Source/Core/Lua/Utilities.cpp

@@ -0,0 +1,50 @@
+#include "precompiled.h"
+#include "Utilities.h"
+
+namespace Rocket {
+namespace Core {
+namespace Lua {
+
+void PushVariant(lua_State* L, Variant* var)
+{
+    if(var == NULL)
+    {
+        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>().CString());
+        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;
+    }
+}
+
+}
+}
+}

+ 18 - 0
Source/Core/Lua/Utilities.h

@@ -0,0 +1,18 @@
+#pragma once
+/*
+    This file is for free-floating functions that are used across more than one file.
+*/
+#include <Rocket/Core/Lua/lua.hpp>
+#include <Rocket/Core/Lua/LuaType.h>
+#include <Rocket/Core/Variant.h>
+
+namespace Rocket {
+namespace Core {
+namespace Lua {
+
+//casts the variant to its specific type before pushing it to the stack
+void PushVariant(lua_State* L, Variant* var);
+
+}
+}
+}