2014-03-04 16:51:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
#include "TextReader.h"
|
2014-11-21 15:15:38 +08:00
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
#include "ui/UIText.h"
|
2014-06-05 10:25:08 +08:00
|
|
|
#include "cocostudio/CocoLoader.h"
|
2014-10-12 17:46:09 +08:00
|
|
|
#include "cocostudio/CSParseBinary.pb.h"
|
2014-11-21 15:15:38 +08:00
|
|
|
#include "cocostudio/CSParseBinary_generated.h"
|
|
|
|
|
|
|
|
#include "tinyxml2/tinyxml2.h"
|
|
|
|
#include "flatbuffers/flatbuffers.h"
|
2014-03-04 16:51:35 +08:00
|
|
|
|
2014-03-06 16:15:03 +08:00
|
|
|
USING_NS_CC;
|
|
|
|
using namespace ui;
|
2014-11-21 15:15:38 +08:00
|
|
|
using namespace flatbuffers;
|
2014-03-06 16:15:03 +08:00
|
|
|
|
2014-03-04 16:51:35 +08:00
|
|
|
namespace cocostudio
|
|
|
|
{
|
2014-06-19 17:04:14 +08:00
|
|
|
static const char* P_TouchScaleEnable = "touchScaleEnable";
|
|
|
|
static const char* P_Text = "text";
|
|
|
|
static const char* P_FontSize = "fontSize";
|
|
|
|
static const char* P_FontName = "fontName";
|
|
|
|
static const char* P_AreaWidth = "areaWidth";
|
|
|
|
static const char* P_AreaHeight = "areaHeight";
|
|
|
|
static const char* P_HAlignment = "hAlignment";
|
|
|
|
static const char* P_VAlignment = "vAlignment";
|
|
|
|
|
2014-07-10 00:45:27 +08:00
|
|
|
static TextReader* instanceTextReader = nullptr;
|
2014-03-04 16:51:35 +08:00
|
|
|
|
2014-11-21 15:15:38 +08:00
|
|
|
IMPLEMENT_CLASS_NODE_READER_INFO(TextReader)
|
2014-03-04 16:51:35 +08:00
|
|
|
|
|
|
|
TextReader::TextReader()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
TextReader::~TextReader()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
TextReader* TextReader::getInstance()
|
|
|
|
{
|
|
|
|
if (!instanceTextReader)
|
|
|
|
{
|
2014-08-28 07:31:57 +08:00
|
|
|
instanceTextReader = new (std::nothrow) TextReader();
|
2014-03-04 16:51:35 +08:00
|
|
|
}
|
|
|
|
return instanceTextReader;
|
|
|
|
}
|
|
|
|
|
2014-06-23 10:02:09 +08:00
|
|
|
void TextReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode)
|
2014-06-05 10:25:08 +08:00
|
|
|
{
|
2014-06-11 09:35:24 +08:00
|
|
|
this->beginSetBasicProperties(widget);
|
2014-06-05 10:25:08 +08:00
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
stExpCocoNode *stChildArray = cocoNode->GetChildArray(cocoLoader);
|
2014-06-05 10:25:08 +08:00
|
|
|
|
|
|
|
Text* label = static_cast<Text*>(widget);
|
2014-07-02 10:08:04 +08:00
|
|
|
|
2014-07-07 15:22:14 +08:00
|
|
|
std::string binaryFilePath = GUIReader::getInstance()->getFilePath();
|
2014-07-02 10:08:04 +08:00
|
|
|
|
2014-06-05 10:25:08 +08:00
|
|
|
|
2014-06-23 10:02:09 +08:00
|
|
|
for (int i = 0; i < cocoNode->GetChildNum(); ++i) {
|
|
|
|
std::string key = stChildArray[i].GetName(cocoLoader);
|
2014-07-01 16:31:17 +08:00
|
|
|
std::string value = stChildArray[i].GetValue(cocoLoader);
|
2014-06-19 15:16:56 +08:00
|
|
|
//read all basic properties of widget
|
|
|
|
CC_BASIC_PROPERTY_BINARY_READER
|
|
|
|
//read all color related properties of widget
|
|
|
|
CC_COLOR_PROPERTY_BINARY_READER
|
2014-06-19 17:04:14 +08:00
|
|
|
|
|
|
|
else if (key == P_TouchScaleEnable) {
|
2014-06-05 10:25:08 +08:00
|
|
|
label->setTouchScaleChangeEnabled(valueToBool(value));
|
|
|
|
}
|
|
|
|
|
2014-06-19 17:04:14 +08:00
|
|
|
else if(key == P_Text){
|
2014-06-05 10:25:08 +08:00
|
|
|
label->setString(value);
|
2014-06-19 17:04:14 +08:00
|
|
|
}else if(key == P_FontSize){
|
2014-06-05 10:25:08 +08:00
|
|
|
label->setFontSize(valueToInt(value));
|
2014-06-19 17:04:14 +08:00
|
|
|
}else if(key == P_FontName){
|
2014-07-04 11:53:06 +08:00
|
|
|
std::string fontFilePath;
|
2014-07-07 15:22:14 +08:00
|
|
|
fontFilePath = binaryFilePath.append(value);
|
2014-07-11 13:58:08 +08:00
|
|
|
if (FileUtils::getInstance()->isFileExist(fontFilePath)) {
|
|
|
|
label->setFontName(fontFilePath);
|
|
|
|
}else{
|
|
|
|
label->setFontName(value);
|
|
|
|
}
|
2014-06-19 17:04:14 +08:00
|
|
|
}else if(key == P_AreaWidth){
|
2014-06-05 10:25:08 +08:00
|
|
|
label->setTextAreaSize(Size(valueToFloat(value), label->getTextAreaSize().height));
|
2014-06-19 17:04:14 +08:00
|
|
|
}else if(key == P_AreaHeight){
|
2014-06-05 10:25:08 +08:00
|
|
|
label->setTextAreaSize(Size(label->getTextAreaSize().width, valueToFloat(value)));
|
2014-06-19 17:04:14 +08:00
|
|
|
}else if(key == P_HAlignment){
|
2014-06-05 10:25:08 +08:00
|
|
|
label->setTextHorizontalAlignment((TextHAlignment)valueToInt(value));
|
2014-06-19 17:04:14 +08:00
|
|
|
}else if(key == P_VAlignment){
|
2014-06-05 10:25:08 +08:00
|
|
|
label->setTextVerticalAlignment((TextVAlignment)valueToInt(value));
|
|
|
|
}
|
|
|
|
|
|
|
|
} //end of for loop
|
2014-06-11 09:35:24 +08:00
|
|
|
this->endSetBasicProperties(widget);
|
2014-06-05 10:25:08 +08:00
|
|
|
}
|
|
|
|
|
2014-03-04 16:51:35 +08:00
|
|
|
void TextReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options)
|
|
|
|
{
|
|
|
|
WidgetReader::setPropsFromJsonDictionary(widget, options);
|
|
|
|
|
|
|
|
|
|
|
|
std::string jsonPath = GUIReader::getInstance()->getFilePath();
|
|
|
|
|
|
|
|
Text* label = static_cast<Text*>(widget);
|
2014-06-19 17:04:14 +08:00
|
|
|
bool touchScaleChangeAble = DICTOOL->getBooleanValue_json(options, P_TouchScaleEnable);
|
2014-03-04 16:51:35 +08:00
|
|
|
label->setTouchScaleChangeEnabled(touchScaleChangeAble);
|
2014-07-01 10:57:12 +08:00
|
|
|
const char* text = DICTOOL->getStringValue_json(options, P_Text,"Text Label");
|
2014-05-14 15:26:14 +08:00
|
|
|
label->setString(text);
|
2014-07-01 10:57:12 +08:00
|
|
|
|
|
|
|
label->setFontSize(DICTOOL->getIntValue_json(options, P_FontSize,20));
|
|
|
|
|
|
|
|
std::string fontName = DICTOOL->getStringValue_json(options, P_FontName, "微软雅黑");
|
2014-07-10 19:29:39 +08:00
|
|
|
|
2014-07-01 10:57:12 +08:00
|
|
|
std::string fontFilePath = jsonPath.append(fontName);
|
2014-07-09 16:38:26 +08:00
|
|
|
if (FileUtils::getInstance()->isFileExist(fontFilePath))
|
|
|
|
{
|
|
|
|
label->setFontName(fontFilePath);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
label->setFontName(fontName);
|
|
|
|
}
|
2014-07-01 10:57:12 +08:00
|
|
|
|
2014-06-19 17:04:14 +08:00
|
|
|
bool aw = DICTOOL->checkObjectExist_json(options, P_AreaWidth);
|
|
|
|
bool ah = DICTOOL->checkObjectExist_json(options, P_AreaHeight);
|
2014-03-04 16:51:35 +08:00
|
|
|
if (aw && ah)
|
|
|
|
{
|
2014-06-19 17:04:14 +08:00
|
|
|
Size size = Size(DICTOOL->getFloatValue_json(options, P_AreaWidth),DICTOOL->getFloatValue_json(options,P_AreaHeight));
|
2014-03-04 16:51:35 +08:00
|
|
|
label->setTextAreaSize(size);
|
|
|
|
}
|
2014-06-19 17:04:14 +08:00
|
|
|
bool ha = DICTOOL->checkObjectExist_json(options, P_HAlignment);
|
2014-03-04 16:51:35 +08:00
|
|
|
if (ha)
|
|
|
|
{
|
2014-06-19 17:04:14 +08:00
|
|
|
label->setTextHorizontalAlignment((TextHAlignment)DICTOOL->getIntValue_json(options, P_HAlignment));
|
2014-03-04 16:51:35 +08:00
|
|
|
}
|
2014-06-19 17:04:14 +08:00
|
|
|
bool va = DICTOOL->checkObjectExist_json(options, P_VAlignment);
|
2014-03-04 16:51:35 +08:00
|
|
|
if (va)
|
|
|
|
{
|
2014-06-19 17:04:14 +08:00
|
|
|
label->setTextVerticalAlignment((TextVAlignment)DICTOOL->getIntValue_json(options, P_VAlignment));
|
2014-03-04 16:51:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WidgetReader::setColorPropsFromJsonDictionary(widget, options);
|
|
|
|
}
|
2014-10-09 18:28:09 +08:00
|
|
|
|
|
|
|
void TextReader::setPropsFromProtocolBuffers(ui::Widget *widget, const protocolbuffers::NodeTree &nodeTree)
|
|
|
|
{
|
|
|
|
Text* label = static_cast<Text*>(widget);
|
|
|
|
const protocolbuffers::TextOptions& options = nodeTree.textoptions();
|
|
|
|
|
|
|
|
bool IsCustomSize = options.iscustomsize();
|
|
|
|
label->ignoreContentAdaptWithSize(!IsCustomSize);
|
|
|
|
|
|
|
|
WidgetReader::setPropsFromProtocolBuffers(widget, nodeTree);
|
|
|
|
|
|
|
|
label->setUnifySizeEnabled(false);
|
|
|
|
|
|
|
|
std::string protocolBuffersPath = GUIReader::getInstance()->getFilePath();
|
|
|
|
|
|
|
|
bool touchScaleChangeAble = options.touchscaleenable();
|
|
|
|
label->setTouchScaleChangeEnabled(touchScaleChangeAble);
|
|
|
|
const char* text = options.has_text() ? options.text().c_str() : "Text Label";
|
|
|
|
label->setString(text);
|
|
|
|
|
|
|
|
int fontSize = options.has_fontsize() ? options.fontsize() : 20;
|
|
|
|
label->setFontSize(fontSize);
|
|
|
|
|
|
|
|
std::string fontName = options.has_fontname() ? options.fontname() : "微软雅黑";
|
2014-10-30 18:00:03 +08:00
|
|
|
label->setFontName(fontName);
|
2014-10-09 18:28:09 +08:00
|
|
|
|
|
|
|
bool aw = options.has_areawidth();
|
|
|
|
bool ah = options.has_areaheight();
|
|
|
|
if (aw && ah)
|
|
|
|
{
|
|
|
|
Size size = Size(options.areawidth(), options.areaheight());
|
|
|
|
label->setTextAreaSize(size);
|
|
|
|
}
|
|
|
|
bool ha = options.has_halignment();
|
|
|
|
if (ha)
|
|
|
|
{
|
|
|
|
label->setTextHorizontalAlignment((TextHAlignment)options.halignment());
|
|
|
|
}
|
|
|
|
bool va = options.has_valignment();
|
|
|
|
if (va)
|
|
|
|
{
|
|
|
|
label->setTextVerticalAlignment((TextVAlignment)options.valignment());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (options.has_fontresource())
|
|
|
|
{
|
|
|
|
const protocolbuffers::ResourceData& resourceData = options.fontresource();
|
|
|
|
label->setFontName(protocolBuffersPath + resourceData.path());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// other commonly protperties
|
|
|
|
WidgetReader::setColorPropsFromProtocolBuffers(widget, nodeTree);
|
|
|
|
}
|
|
|
|
|
2014-11-21 15:15:38 +08:00
|
|
|
Offset<Table> TextReader::createOptionsWithFlatBuffers(const tinyxml2::XMLElement *objectData,
|
|
|
|
flatbuffers::FlatBufferBuilder *builder)
|
2014-10-09 18:28:09 +08:00
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
auto temp = WidgetReader::getInstance()->createOptionsWithFlatBuffers(objectData, builder);
|
|
|
|
auto widgetOptions = *(Offset<WidgetOptions>*)(&temp);
|
|
|
|
|
|
|
|
bool touchScaleEnabled = false;
|
|
|
|
bool isCustomSize = false;
|
|
|
|
std::string fontName = "微软雅黑";
|
|
|
|
int fontSize = 20;
|
|
|
|
std::string text = "Text Label";
|
|
|
|
int areaWidth = 0;
|
|
|
|
int areaHeight = 0;
|
|
|
|
int h_alignment = 0;
|
|
|
|
int v_alignment = 0;
|
|
|
|
|
|
|
|
std::string path = "";
|
|
|
|
std::string plistFile = "";
|
|
|
|
int resourceType = 0;
|
2014-10-09 18:28:09 +08:00
|
|
|
|
|
|
|
// attributes
|
|
|
|
const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute();
|
|
|
|
while (attribute)
|
|
|
|
{
|
|
|
|
std::string name = attribute->Name();
|
|
|
|
std::string value = attribute->Value();
|
|
|
|
|
|
|
|
if (name == "TouchScaleChangeAble")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
touchScaleEnabled = (value == "True") ? true : false;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (name == "LabelText")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
text = value;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (name == "FontSize")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
fontSize = atoi(value.c_str());
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (name == "FontName")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
fontName = value;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (name == "AreaWidth")
|
|
|
|
{
|
|
|
|
areaWidth = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "AreaHeight")
|
|
|
|
{
|
|
|
|
areaHeight = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "HorizontalAlignmentType")
|
|
|
|
{
|
|
|
|
if (value == "HT_Left")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
h_alignment = 0;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (value == "HT_Center")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
h_alignment = 1;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (value == "HT_Right")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
h_alignment = 2;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (name == "VerticalAlignmentType")
|
|
|
|
{
|
|
|
|
if (value == "VT_Top")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
v_alignment = 0;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (value == "VT_Center")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
v_alignment = 1;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (value == "VT_Bottom")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
v_alignment = 2;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
}
|
2014-11-21 15:15:38 +08:00
|
|
|
else if (name == "IsCustomSize")
|
2014-10-09 18:28:09 +08:00
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
isCustomSize = (value == "True") ? true : false;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
attribute = attribute->Next();
|
|
|
|
}
|
|
|
|
|
|
|
|
// child elements
|
|
|
|
const tinyxml2::XMLElement* child = objectData->FirstChildElement();
|
|
|
|
while (child)
|
|
|
|
{
|
|
|
|
std::string name = child->Name();
|
|
|
|
|
2014-11-21 15:15:38 +08:00
|
|
|
if (name == "FontResource")
|
2014-10-09 18:28:09 +08:00
|
|
|
{
|
2014-10-15 17:20:54 +08:00
|
|
|
attribute = child->FirstAttribute();
|
2014-10-09 18:28:09 +08:00
|
|
|
|
|
|
|
while (attribute)
|
|
|
|
{
|
2014-10-15 17:20:54 +08:00
|
|
|
name = attribute->Name();
|
2014-10-09 18:28:09 +08:00
|
|
|
std::string value = attribute->Value();
|
|
|
|
|
|
|
|
if (name == "Path")
|
|
|
|
{
|
|
|
|
path = value;
|
|
|
|
}
|
|
|
|
else if (name == "Type")
|
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
resourceType = 0;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
else if (name == "Plist")
|
|
|
|
{
|
|
|
|
plistFile = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
attribute = attribute->Next();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
child = child->NextSiblingElement();
|
|
|
|
}
|
|
|
|
|
2014-11-21 15:15:38 +08:00
|
|
|
auto options = CreateTextOptions(*builder,
|
|
|
|
widgetOptions,
|
|
|
|
CreateResourceData(*builder,
|
|
|
|
builder->CreateString(path),
|
|
|
|
builder->CreateString(plistFile),
|
|
|
|
resourceType),
|
|
|
|
builder->CreateString(fontName),
|
|
|
|
fontSize,
|
|
|
|
builder->CreateString(text),
|
|
|
|
areaWidth,
|
|
|
|
areaHeight,
|
|
|
|
h_alignment,
|
|
|
|
v_alignment,
|
|
|
|
touchScaleEnabled,
|
|
|
|
isCustomSize);
|
|
|
|
|
|
|
|
return *(Offset<Table>*)(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
void TextReader::setPropsWithFlatBuffers(cocos2d::Node *node, const flatbuffers::Table *textOptions)
|
|
|
|
{
|
|
|
|
Text* label = static_cast<Text*>(node);
|
|
|
|
auto options = (TextOptions*)textOptions;
|
|
|
|
|
|
|
|
bool IsCustomSize = options->isCustomSize();
|
|
|
|
label->ignoreContentAdaptWithSize(!IsCustomSize);
|
|
|
|
|
|
|
|
label->setUnifySizeEnabled(false);
|
|
|
|
|
|
|
|
bool touchScaleEnabled = options->touchScaleEnable();
|
|
|
|
label->setTouchScaleChangeEnabled(touchScaleEnabled);
|
|
|
|
std::string text = options->text()->c_str();
|
|
|
|
label->setString(text);
|
|
|
|
|
|
|
|
int fontSize = options->fontSize();
|
|
|
|
label->setFontSize(fontSize);
|
|
|
|
|
|
|
|
std::string fontName = options->fontName()->c_str();
|
|
|
|
label->setFontName(fontName);
|
|
|
|
|
|
|
|
Size areaSize = Size(options->areaWidth(), options->areaHeight());
|
|
|
|
if (!areaSize.equals(Size::ZERO))
|
2014-10-09 18:28:09 +08:00
|
|
|
{
|
2014-11-21 15:15:38 +08:00
|
|
|
label->setTextAreaSize(areaSize);
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
|
2014-11-21 15:15:38 +08:00
|
|
|
TextHAlignment h_alignment = (TextHAlignment)options->hAlignment();
|
|
|
|
label->setTextHorizontalAlignment(h_alignment);
|
|
|
|
|
|
|
|
TextVAlignment v_alignment = (TextVAlignment)options->vAlignment();
|
|
|
|
label->setTextVerticalAlignment((TextVAlignment)v_alignment);
|
|
|
|
|
|
|
|
auto resourceData = options->fontResource();
|
|
|
|
std::string path = resourceData->path()->c_str();
|
|
|
|
if (path != "")
|
|
|
|
{
|
|
|
|
label->setFontName(path);
|
|
|
|
}
|
|
|
|
|
|
|
|
auto widgetReader = WidgetReader::getInstance();
|
|
|
|
widgetReader->setPropsWithFlatBuffers(node, (Table*)options->widgetOptions());
|
|
|
|
}
|
|
|
|
|
2014-11-26 11:50:42 +08:00
|
|
|
Node* TextReader::createNodeWithFlatBuffers(const flatbuffers::Table *textOptions)
|
2014-11-21 15:15:38 +08:00
|
|
|
{
|
|
|
|
Text* text = Text::create();
|
|
|
|
|
|
|
|
setPropsWithFlatBuffers(text, (Table*)textOptions);
|
2014-10-09 18:28:09 +08:00
|
|
|
|
2014-11-21 15:15:38 +08:00
|
|
|
return text;
|
2014-10-09 18:28:09 +08:00
|
|
|
}
|
|
|
|
|
2014-03-04 16:51:35 +08:00
|
|
|
}
|