2016-03-20 21:53:44 +08:00
|
|
|
#include "scripting/lua-bindings/manual/cocostudio/CustomGUIReader.h"
|
|
|
|
#include "scripting/lua-bindings/manual/CCLuaEngine.h"
|
2014-08-29 18:50:21 +08:00
|
|
|
#include "json/writer.h"
|
|
|
|
#include "json/stringbuffer.h"
|
|
|
|
|
|
|
|
USING_NS_CC;
|
|
|
|
|
|
|
|
namespace cocostudio
|
|
|
|
{
|
|
|
|
|
|
|
|
CustomGUIReader* CustomGUIReader::create(std::string &className, int createFunc, int setPropsFunc)
|
|
|
|
{
|
2015-12-16 17:06:56 +08:00
|
|
|
auto reader = new (std::nothrow) CustomGUIReader();
|
2014-08-29 18:50:21 +08:00
|
|
|
reader->init(className, createFunc, setPropsFunc);
|
|
|
|
return reader;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ref* CustomGUIReader::createInstance()
|
|
|
|
{
|
|
|
|
Ref* result = nullptr;
|
|
|
|
LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
|
|
|
|
stack->executeFunction(_createFunc, 0, 1, [&result](lua_State* L,int numReturn){
|
|
|
|
result = static_cast<Ref*>(tolua_tousertype(L, -1, nullptr));
|
|
|
|
lua_pop(L, 1);
|
|
|
|
});
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
CustomGUIReader::CustomGUIReader()
|
|
|
|
:_className()
|
|
|
|
,_createFunc(0)
|
|
|
|
,_setPropsFunc(0)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
CustomGUIReader::~CustomGUIReader()
|
|
|
|
{
|
|
|
|
if (_createFunc)
|
|
|
|
{
|
|
|
|
LuaEngine::getInstance()->removeScriptHandler(_createFunc);
|
|
|
|
_createFunc = 0;
|
|
|
|
}
|
|
|
|
if (_setPropsFunc)
|
|
|
|
{
|
|
|
|
LuaEngine::getInstance()->removeScriptHandler(_setPropsFunc);
|
|
|
|
_setPropsFunc = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomGUIReader::init(std::string &className, int createFunc, int setPropsFunc)
|
|
|
|
{
|
|
|
|
_className = className;
|
|
|
|
_createFunc = createFunc;
|
|
|
|
_setPropsFunc = setPropsFunc;
|
|
|
|
|
|
|
|
ObjectFactory* factoryCreate = ObjectFactory::getInstance();
|
|
|
|
ObjectFactory::TInfo t;
|
|
|
|
t._class = className;
|
|
|
|
t._func = CC_CALLBACK_0(CustomGUIReader::createInstance, this);
|
|
|
|
factoryCreate->registerType(t);
|
|
|
|
|
|
|
|
auto guiReader = GUIReader::getInstance();
|
|
|
|
auto objMap = guiReader->getParseObjectMap();
|
|
|
|
(*objMap)[className] = this;
|
|
|
|
auto callbackMap = guiReader->getParseCallBackMap();
|
|
|
|
(*callbackMap)[className] = parseselector(CustomGUIReader::setCustomProps);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomGUIReader::setCustomProps(const std::string &classType, cocos2d::Ref *widget, const rapidjson::Value &customOptions)
|
|
|
|
{
|
|
|
|
if (_setPropsFunc != 0)
|
|
|
|
{
|
|
|
|
rapidjson::StringBuffer buffer;
|
|
|
|
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
|
|
|
|
customOptions.Accept(writer);
|
|
|
|
|
|
|
|
auto stack = LuaEngine::getInstance()->getLuaStack();
|
2015-05-25 13:42:54 +08:00
|
|
|
stack->pushString(classType.c_str(), static_cast<int>(classType.size()));
|
2014-08-29 18:50:21 +08:00
|
|
|
stack->pushObject(widget, "cc.Ref");
|
2015-05-25 13:42:54 +08:00
|
|
|
stack->pushString(buffer.GetString(), static_cast<int>(buffer.GetSize()));
|
2014-08-29 18:50:21 +08:00
|
|
|
stack->executeFunctionByHandler(_setPropsFunc, 3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|