Node* NodeReader::loadWidget(const rapidjson::Value& json) { const char* str = DICTOOL->getStringValue_json(json, CLASSNAME); if(str == nullptr) return nullptr; std::string classname = str; if (classname == "Panel") { classname = "Layout"; } else if (classname == "TextArea") { classname = "Text"; } else if (classname == "TextButton") { classname = "Button"; } else if (classname == "Label") { classname = "Text"; } else if (classname == "LabelAtlas") { classname = "TextAtlas"; } else if (classname == "LabelBMFont") { classname = "TextBMFont"; } std::string readerName = classname; readerName.append("Reader"); Widget* widget = dynamic_cast<Widget*>(ObjectFactory::getInstance()->createObject(classname)); widget->retain(); WidgetReaderProtocol* reader = dynamic_cast<WidgetReaderProtocol*>(ObjectFactory::getInstance()->createObject(readerName)); WidgetPropertiesReader0300* guiReader = new WidgetPropertiesReader0300(); guiReader->setPropsForAllWidgetFromJsonDictionary(reader, widget, json); CC_SAFE_DELETE(guiReader); int actionTag = DICTOOL->getIntValue_json(json, ACTION_TAG); widget->setUserObject(ActionTimelineData::create(actionTag)); return widget; }
Node* CSLoader::loadWidget(const rapidjson::Value& json) { const char* str = DICTOOL->getStringValue_json(json, CLASSNAME); if(str == nullptr) return nullptr; std::string classname = str; WidgetPropertiesReader0300* widgetPropertiesReader = new (std::nothrow) WidgetPropertiesReader0300(); Widget* widget = nullptr; if (isWidget(classname)) { std::string readerName = getGUIClassName(classname); readerName.append("Reader"); std::string guiClassName = getGUIClassName(classname); widget = dynamic_cast<Widget*>(ObjectFactory::getInstance()->createObject(guiClassName)); // fix memory leak for v3.3 //widget->retain(); WidgetReaderProtocol* reader = dynamic_cast<WidgetReaderProtocol*>(ObjectFactory::getInstance()->createObject(readerName)); if (reader && widget) { widgetPropertiesReader->setPropsForAllWidgetFromJsonDictionary(reader, widget, json); } } else if (isCustomWidget(classname)) { widget = dynamic_cast<Widget*>(ObjectFactory::getInstance()->createObject(classname)); //fix memory leak for v3.3 //widget->retain(); // // 1st., custom widget parse properties of parent widget with parent widget reader std::string readerName = getWidgetReaderClassName(widget); WidgetReaderProtocol* reader = dynamic_cast<WidgetReaderProtocol*>(ObjectFactory::getInstance()->createObject(readerName)); if (reader && widget) { widgetPropertiesReader->setPropsForAllWidgetFromJsonDictionary(reader, widget, json); // 2nd., custom widget parse with custom reader const char* customProperty = DICTOOL->getStringValue_json(json, "customProperty"); rapidjson::Document customJsonDict; customJsonDict.Parse<0>(customProperty); if (customJsonDict.HasParseError()) { CCLOG("GetParseError %d\n", customJsonDict.GetParseError()); } widgetPropertiesReader->setPropsForAllCustomWidgetFromJsonDictionary(classname, widget, customJsonDict); } else { CCLOG("Widget or WidgetReader doesn't exists!!! Please check your protocol buffers file."); } } CC_SAFE_DELETE(widgetPropertiesReader); if (widget) { float rotationSkewX = DICTOOL->getFloatValue_json(json, ROTATION_SKEW_X); float rotationSkewY = DICTOOL->getFloatValue_json(json, ROTATION_SKEW_Y); float skewx = DICTOOL->getFloatValue_json(json, SKEW_X); float skewy = DICTOOL->getFloatValue_json(json, SKEW_Y); if(rotationSkewX != 0) widget->setRotationSkewX(rotationSkewX); if(rotationSkewY != 0) widget->setRotationSkewY(rotationSkewY); if(skewx != 0) widget->setSkewX(skewx); if(skewy != 0) widget->setSkewY(skewy); int actionTag = DICTOOL->getIntValue_json(json, ACTION_TAG); widget->setUserObject(ActionTimelineData::create(actionTag)); } return widget; }