From b570487bf3b9f7729b9998250f58a0408b328275 Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 5 Jun 2014 10:24:12 +0800 Subject: [PATCH 01/72] add cocostudio binary file parser --- .../editor-support/cocostudio/CocoLoader.cpp | 204 ++++++++++++++++++ cocos/editor-support/cocostudio/CocoLoader.h | 144 +++++++++++++ 2 files changed, 348 insertions(+) create mode 100644 cocos/editor-support/cocostudio/CocoLoader.cpp create mode 100644 cocos/editor-support/cocostudio/CocoLoader.h diff --git a/cocos/editor-support/cocostudio/CocoLoader.cpp b/cocos/editor-support/cocostudio/CocoLoader.cpp new file mode 100644 index 0000000000..8f4b06e95a --- /dev/null +++ b/cocos/editor-support/cocostudio/CocoLoader.cpp @@ -0,0 +1,204 @@ +/**************************************************************************** + Copyright (c) 2013-2014 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#include "CocoLoader.h" + +namespace cocostudio { + const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; + const char* kObjKeyName[] = { "__type" , "classname" }; + char g_Buff[2048]; + + rapidjson::Type stExpCocoNode::GetType(CocoLoader* pCoco) + { + rapidjson::Type tType = rapidjson::kObjectType; + if(m_ObjIndex >= 0) + { + stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDesc(); + if( m_AttribIndex >= 0 ) + { + tType = tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray[m_AttribIndex].m_Type; + if(rapidjson::kFalseType == tType || rapidjson::kTrueType == tType) + { + if(m_szValue[0] == '0') + { + return rapidjson::kFalseType; + } + else + { + return rapidjson::kTrueType; + } + } + + } + else + { + tType = rapidjson::kObjectType; + } + } + else + { + if(m_AttribIndex >= 0) + { +// char* pStringAddr = (char*)pCoco->GetCocoObjectDesc() + pCoco->GetFileHeader()->m_lStringMemAddr ; + tType = (rapidjson::Type)m_ChildNum; + + if(rapidjson::kFalseType == tType || rapidjson::kTrueType == tType) + { + if(m_szValue[0] == '0') + { + return rapidjson::kFalseType; + } + else + { + return rapidjson::kTrueType; + } + } + } + else + { + tType = rapidjson::kArrayType; + } + } + return tType; + } + + char* stExpCocoNode::GetName(CocoLoader* pCoco) + { + char* szName = NULL ; + if(m_ObjIndex >= 0) + { + stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDesc(); + if( m_AttribIndex >= 0 ) + { + szName = tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray[m_AttribIndex].m_szName; + } + else + { + + if(m_szValue[0]) + { + szName = m_szValue; + } + else + { + szName = tpCocoObjectDesc[m_ObjIndex].m_szName; + } + } + } + else + { + if(m_AttribIndex >= 0) + { + char* pStringAddr = (char*)pCoco->GetCocoObjectDesc() + pCoco->GetFileHeader()->m_lStringMemAddr ; + szName = (char*)((unsigned long)m_ChildArray + pStringAddr); + } + else + { + szName = m_szValue; + } + } + return szName ; + } + + char* stExpCocoNode::GetValue() + { + return m_szValue; + } + + int stExpCocoNode::GetChildNum() + { + return m_ChildNum; + } + + stExpCocoNode* stExpCocoNode::GetChildArray() + { + return m_ChildArray; + } + + void stExpCocoNode::ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr) + { + m_szValue = (char*)((unsigned long)m_szValue + pStringMemoryAddr); + + + if( -1 == m_AttribIndex ) + { + if(m_ChildNum > 0) + { + m_ChildArray = (stExpCocoNode*)((unsigned long)(m_ChildArray) + pCocoNodeAddr ); + } + + for(int i = 0 ; i < m_ChildNum ; i++) + { + m_ChildArray[i].ReBuild(pCocoNodeAddr,pStringMemoryAddr); + } + } + + } + + CocoLoader::CocoLoader() + { + m_pRootNode = NULL; + m_pObjectDescArray = NULL; + } + + CocoLoader::~CocoLoader() + { + + } + + bool CocoLoader::ReadCocoBinBuff(char* pBinBuff) + { + //Type + char* pTempBuff = pBinBuff; + + + m_pFileHeader = (stCocoFileHeader*)pTempBuff; + pTempBuff += sizeof(stCocoFileHeader); + + + char* pStartAddr = pTempBuff; + m_pObjectDescArray = (stExpCocoObjectDesc*)pStartAddr; + + char* pAttrAddr = pStartAddr + m_pFileHeader->m_lAttribMemAddr ; + char* pCocoMemAddr = pStartAddr + m_pFileHeader->m_CocoNodeMemAddr; + char* pStringAddr = pStartAddr + m_pFileHeader->m_lStringMemAddr ; + + m_pRootNode = (stExpCocoNode*)pCocoMemAddr; + + if(1 == m_pFileHeader->m_nFirstUsed) + { + for(int i = 0 ; i < m_pFileHeader->m_ObjectCount ; i++) + { + m_pObjectDescArray[i].ReBuild(pAttrAddr,pStringAddr) ; + } + m_pRootNode->ReBuild(pCocoMemAddr,pStringAddr); + + m_pFileHeader->m_nFirstUsed = 0; + } + + return true; + } + +} + diff --git a/cocos/editor-support/cocostudio/CocoLoader.h b/cocos/editor-support/cocostudio/CocoLoader.h new file mode 100644 index 0000000000..d50b94e384 --- /dev/null +++ b/cocos/editor-support/cocostudio/CocoLoader.h @@ -0,0 +1,144 @@ +/**************************************************************************** + Copyright (c) 2013-2014 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef _COCOLOADER_H +#define _COCOLOADER_H + +#include +#include +#include +#include "rapidjson.h" +#include "document.h" + +namespace cocostudio { + + struct stExpCocoAttribDesc + { + rapidjson::Type m_Type; + char* m_szName; + char* m_szDefaultValue; + public: + + void ReBuild(char* pStringMemoryAddr) + { + m_szName = (char*)((unsigned long)m_szName + pStringMemoryAddr); + m_szDefaultValue = (char*)((unsigned long)m_szDefaultValue + pStringMemoryAddr); + } + } + ; + + struct stExpCocoObjectDesc + { + char* m_szName; + int m_nAttribNum; + stExpCocoAttribDesc* m_pAttribDescArray; + public: + + void ReBuild(char* pAttribMemoryAddr,char* pStringMemoryAddr) + { + m_szName = (char*)((unsigned long)m_szName + pStringMemoryAddr); + m_pAttribDescArray = (stExpCocoAttribDesc*)((unsigned long)m_pAttribDescArray + pAttribMemoryAddr); + for(int i = 0 ; i < m_nAttribNum ; i++) + { + m_pAttribDescArray[i].ReBuild(pStringMemoryAddr); + } + } + + }; + + class CocoLoader; + + struct stExpCocoNode + { + protected: + int m_ObjIndex; + int m_AttribIndex; + char* m_szValue; + int m_ChildNum; + stExpCocoNode* m_ChildArray; + public: + + + rapidjson::Type GetType(CocoLoader* pCoco); + + char* GetName(CocoLoader* pCoco); + + char* GetValue(); + + int GetChildNum(); + + stExpCocoNode* GetChildArray(); + public: + + inline void ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr); + + } + ; + + + struct stCocoFileHeader + { + int m_nFirstUsed; + char m_FileDesc[32]; + char m_Version[32]; + int m_ObjectCount; + unsigned long m_lAttribMemAddr; + unsigned long m_CocoNodeMemAddr; + unsigned long m_lStringMemAddr; + + }; + + + class CocoLoader + { + + stCocoFileHeader* m_pFileHeader; + + stExpCocoNode* m_pRootNode; + + stExpCocoObjectDesc* m_pObjectDescArray; + + public: + + CocoLoader(); + + ~CocoLoader(); + + public: + + + bool ReadCocoBinBuff(char* pBinBuff); + + stCocoFileHeader* GetFileHeader(){return m_pFileHeader;} + + stExpCocoNode* GetRootCocoNode(){return m_pRootNode;} + + stExpCocoObjectDesc* GetCocoObjectDesc(){return m_pObjectDescArray;} + + }; +} + + + +#endif \ No newline at end of file From 8690122c960252f740d696a391ceb3c85e109b42 Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 5 Jun 2014 10:25:08 +0800 Subject: [PATCH 02/72] add version 300 parsing code in widget reader --- .../cocostudio/CCSGUIReader.cpp | 304 ++++++++++++++++-- .../editor-support/cocostudio/CCSGUIReader.h | 41 ++- .../ButtonReader/ButtonReader.cpp | 92 ++++++ .../WidgetReader/ButtonReader/ButtonReader.h | 1 + .../CheckBoxReader/CheckBoxReader.cpp | 65 ++++ .../CheckBoxReader/CheckBoxReader.h | 1 + .../ImageViewReader/ImageViewReader.cpp | 53 +++ .../ImageViewReader/ImageViewReader.h | 1 + .../LayoutReader/LayoutReader.cpp | 106 ++++++ .../WidgetReader/LayoutReader/LayoutReader.h | 1 + .../ListViewReader/ListViewReader.cpp | 25 ++ .../ListViewReader/ListViewReader.h | 1 + .../LoadingBarReader/LoadingBarReader.cpp | 52 +++ .../LoadingBarReader/LoadingBarReader.h | 1 + .../PageViewReader/PageViewReader.cpp | 5 + .../PageViewReader/PageViewReader.h | 2 + .../ScrollViewReader/ScrollViewReader.cpp | 29 ++ .../ScrollViewReader/ScrollViewReader.h | 2 + .../SliderReader/SliderReader.cpp | 80 +++++ .../WidgetReader/SliderReader/SliderReader.h | 2 + .../TextAtlasReader/TextAtlasReader.cpp | 47 +++ .../TextAtlasReader/TextAtlasReader.h | 2 + .../TextBMFontReader/TextBMFontReader.cpp | 32 ++ .../TextBMFontReader/TextBMFontReader.h | 2 + .../TextFieldReader/TextFieldReader.cpp | 37 +++ .../TextFieldReader/TextFieldReader.h | 2 + .../WidgetReader/TextReader/TextReader.cpp | 37 +++ .../WidgetReader/TextReader/TextReader.h | 2 + .../cocostudio/WidgetReader/WidgetReader.cpp | 173 ++++++++++ .../cocostudio/WidgetReader/WidgetReader.h | 18 ++ .../WidgetReader/WidgetReaderProtocol.h | 6 + 31 files changed, 1189 insertions(+), 33 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index b0f9ec53ee..8413ced518 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -39,10 +39,11 @@ THE SOFTWARE. #include "WidgetReader/PageViewReader/PageViewReader.h" #include "WidgetReader/ScrollViewReader/ScrollViewReader.h" #include "WidgetReader/ListViewReader/ListViewReader.h" +#include "cocostudio/CocoLoader.h" +#include "ui/CocosGUI.h" -using namespace cocos2d::ui; using namespace cocos2d; - +using namespace cocos2d::ui; namespace cocostudio { @@ -129,7 +130,7 @@ int GUIReader::getVersionInteger(const char *str) int is = atoi(s.c_str()); int iVersion = it*1000+ih*100+ite*10+is; - CCLOG("iversion %d",iVersion); +// CCLOG("iversion %d",iVersion); return iVersion; /************************/ } @@ -140,8 +141,8 @@ void GUIReader::storeFileDesignSize(const char *fileName, const cocos2d::Size &s keyWidth.append("width"); std::string keyHeight = fileName; keyHeight.append("height"); - _fileDesignSizes[keyWidth] = Value(size.width); - _fileDesignSizes[keyHeight] = Value(size.height); + _fileDesignSizes[keyWidth] = cocos2d::Value(size.width); + _fileDesignSizes[keyHeight] = cocos2d::Value(size.height); } const cocos2d::Size GUIReader::getFileDesignSize(const char* fileName) const @@ -269,6 +270,104 @@ WidgetReaderProtocol* WidgetPropertiesReader::createWidgetReaderProtocol(const s + +Widget* GUIReader::widgetFromBinaryFile(const char *fileName) +{ + std::string jsonpath; + rapidjson::Document jsonDict; + jsonpath = CCFileUtils::getInstance()->fullPathForFilename(fileName); + size_t pos = jsonpath.find_last_of('/'); + m_strFilePath = jsonpath.substr(0,pos+1); + ssize_t nSize = 0; + std::string fullPath = FileUtils::getInstance()->fullPathForFilename(fileName); + unsigned char* pBuffer = FileUtils::getInstance()->getFileData(fullPath, "rb", &nSize); + + const char* fileVersion = ""; + ui::Widget* widget = nullptr; + + if (pBuffer != NULL && nSize > 0) + { + CocoLoader tCocoLoader; + if(true == tCocoLoader.ReadCocoBinBuff((char*)pBuffer)) + { + stExpCocoNode* tpRootCocoNode = tCocoLoader.GetRootCocoNode(); + + rapidjson::Type tType = tpRootCocoNode->GetType(&tCocoLoader); + if (rapidjson::kObjectType == tType) + { + stExpCocoNode *tpChildArray = tpRootCocoNode->GetChildArray(); + + //rapidjson::Type tType = tpChildArray[i].GetType(pCocoLoader); + + std::string strValue = tpChildArray[7].GetValue(); + + fileVersion = strValue.c_str(); + + + WidgetPropertiesReader * pReader = nullptr; + if (fileVersion) + { + int versionInteger = getVersionInteger(fileVersion); + if (versionInteger < 250) + { + pReader = new WidgetPropertiesReader0250(); + widget = pReader->createWidgetFromBinary(&tCocoLoader, tpRootCocoNode, fileName); + } + else + { + pReader = new WidgetPropertiesReader0300(); + widget = pReader->createWidgetFromBinary(&tCocoLoader, tpRootCocoNode, fileName); + } + } + else + { + pReader = new WidgetPropertiesReader0250(); + widget = pReader->createWidgetFromBinary(&tCocoLoader, tpRootCocoNode, fileName); + } + + CC_SAFE_DELETE(pReader); + + } + } + } + + CC_SAFE_DELETE_ARRAY(pBuffer); + + return widget; + +} + +std::string WidgetPropertiesReader::getWidgetReaderClassName(const std::string& classname) +{ + // create widget reader to parse properties of widget + std::string readerName = classname; + if (readerName == "Panel") + { + readerName = "Layout"; + } + else if (readerName == "TextArea") + { + readerName = "Text"; + } + else if (readerName == "TextButton") + { + readerName = "Button"; + } + else if (readerName == "Label") + { + readerName = "Text"; + } + else if (readerName == "LabelAtlas") + { + readerName = "TextAtlas"; + } + else if (readerName == "LabelBMFont") + { + readerName = "TextBMFont"; + } + readerName.append("Reader"); + return readerName; +} void WidgetPropertiesReader::setAnchorPointForWidget(cocos2d::ui::Widget *widget, const rapidjson::Value &options) { @@ -334,7 +433,7 @@ Widget* WidgetPropertiesReader0250::createWidget(const rapidjson::Value& data, c /* *********temp********* */ // ActionManager::getInstance()->releaseActions(); /* ********************** */ - CCLOG("file name == [%s]",fileName); +// CCLOG("file name == [%s]",fileName); Ref* rootWidget = (Ref*) widget; ActionManagerEx::getInstance()->initWithDictionary(fileName,actions,rootWidget); return widget; @@ -1043,55 +1142,178 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c /* *********temp********* */ // ActionManager::getInstance()->releaseActions(); /* ********************** */ - CCLOG("file name == [%s]",fileName); +// CCLOG("file name == [%s]",fileName); Ref* rootWidget = (Ref*) widget; ActionManagerEx::getInstance()->initWithDictionary(fileName,actions,rootWidget); return widget; } -Widget* WidgetPropertiesReader0300::widgetFromJsonDictionary(const rapidjson::Value& data) + cocos2d::ui::Widget* WidgetPropertiesReader0300::createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName) { - const char* classname = DICTOOL->getStringValue_json(data, "classname"); - const rapidjson::Value& uiOptions = DICTOOL->getSubDictionary_json(data, "options"); - Widget* widget = this->createGUI(classname); - // create widget reader to parse properties of widget - std::string readerName = classname; - if (readerName == "Panel") + stExpCocoNode *tpChildArray = pCocoNode->GetChildArray(); + + int texturesCount = tpChildArray[6].GetChildNum(); + for (int i=0; iaddSpriteFramesWithFile(file); } - else if (readerName == "TextArea") + + + float fileDesignWidth = atof(tpChildArray[5].GetValue()); + + float fileDesignHeight = atof(tpChildArray[4].GetValue()); + + if (fileDesignWidth <= 0 || fileDesignHeight <= 0) { + CCLOGERROR("Read design size error!\n"); + Size winSize = Director::getInstance()->getWinSize(); + GUIReader::getInstance()->storeFileDesignSize(fileName, winSize); + } + else { - readerName = "Text"; + GUIReader::getInstance()->storeFileDesignSize(fileName, Size(fileDesignWidth, fileDesignHeight)); } - else if (readerName == "TextButton") + + stExpCocoNode *widgetTreeNode = &tpChildArray[8]; + rapidjson::Type tType = tpChildArray[8].GetType(pCocoLoader); + + Widget* widget = nullptr; + + if (rapidjson::kObjectType == tType) { - readerName = "Button"; + //convert this function!!! + //widgetFromJsonDictionary(widgetTree); + widget = widgetFromBinary(pCocoLoader, widgetTreeNode); } - else if (readerName == "Label") + + + + /* *********temp********* */ + if (widget->getContentSize().equals(Size::ZERO)) { - readerName = "Text"; + Layout* rootWidget = dynamic_cast(widget); + rootWidget->setSize(Size(fileDesignWidth, fileDesignHeight)); } - else if (readerName == "LabelAtlas") - { - readerName = "TextAtlas"; + /* ********************** */ + +// // widget->setFileDesignSize(Size(fileDesignWidth, fileDesignHeight)); +// const rapidjson::Value& actions = DICTOOL->getSubDictionary_json(data, "animation"); +// /* *********temp********* */ +// // ActionManager::getInstance()->releaseActions(); +// /* ********************** */ +// CCLOG("file name == [%s]",fileName); +// Ref* rootWidget = (Ref*) widget; +// ActionManagerEx::getInstance()->initWithDictionary(fileName,actions,rootWidget); + return widget; +} + +Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) +{ + Widget* widget = nullptr; + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + std::string classname; + + + std::string key = stChildArray[0].GetName(pCocoLoader); + classname = stChildArray[0].GetValue(); + + if (key == "classname" && !classname.empty()) { + widget = this->createGUI(classname); } - else if (readerName == "LabelBMFont") - { - readerName = "TextBMFont"; - } - readerName.append("Reader"); + + CCLOG("classname = %s", classname.c_str()); + std::string readerName = this->getWidgetReaderClassName(classname); WidgetReaderProtocol* reader = this->createWidgetReaderProtocol(readerName); if (reader) { // widget parse with widget reader - setPropsForAllWidgetFromJsonDictionary(reader, widget, uiOptions); + setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader, &stChildArray[3]); } else { + // 1st., custom widget parse properties of parent widget with parent widget reader + readerName = this->getWidgetReaderClassName(widget); + reader = this->createWidgetReaderProtocol(readerName); + + setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader, &stChildArray[3]); + //TODO: +// // 2nd., custom widget parse with custom reader +// const char* customProperty = DICTOOL->getStringValue_json(uiOptions, "customProperty"); +// rapidjson::Document customJsonDict; +// customJsonDict.Parse<0>(customProperty); +// if (customJsonDict.HasParseError()) +// { +// CCLOG("GetParseError %s\n", customJsonDict.GetParseError()); +// } +// setPropsForAllCustomWidgetFromJsonDictionary(classname, widget, customJsonDict); + } + + //parse children + auto childrenArray = stChildArray[2].GetChildArray(); + if (nullptr != childrenArray) { + int childrenCount = childrenArray->GetChildNum(); + for (int i=0; i < childrenCount; ++i) { + rapidjson::Type tType = childrenArray[i].GetType(pCocoLoader); + + if (tType == rapidjson::kObjectType) { + + Widget *child = widgetFromBinary(pCocoLoader, &childrenArray[i]); + + if (child) + { + PageView* pageView = dynamic_cast(widget); + if (pageView) + { + pageView->addPage(static_cast(child)); + } + else + { + ListView* listView = dynamic_cast(widget); + if (listView) + { + listView->pushBackCustomItem(child); + } + else + { + if (!dynamic_cast(widget)) + { + if (child->getPositionType() == ui::Widget::PositionType::PERCENT) + { + child->setPositionPercent(Vec2(child->getPositionPercent().x + widget->getAnchorPoint().x, + child->getPositionPercent().y + widget->getAnchorPoint().y)); + } + child->setPosition(Vec2(child->getPositionX() + widget->getAnchorPointInPoints().x, + child->getPositionY() + widget->getAnchorPointInPoints().y)); + } + widget->addChild(child); + } + } + } + + } + } + } + + return widget; +} + +void WidgetPropertiesReader0300::setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, + cocos2d::ui::Widget* widget, + CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode) +{ + reader->setPropsFromBinary(widget, pCocoLoader, pCocoNode); +} + + std::string WidgetPropertiesReader::getWidgetReaderClassName(Widget* widget) + { + std::string readerName; + // 1st., custom widget parse properties of parent widget with parent widget reader if (dynamic_cast(widget)) { @@ -1150,6 +1372,28 @@ Widget* WidgetPropertiesReader0300::widgetFromJsonDictionary(const rapidjson::Va readerName = "WidgetReader"; } + return readerName; + } + +Widget* WidgetPropertiesReader0300::widgetFromJsonDictionary(const rapidjson::Value& data) +{ + const char* classname = DICTOOL->getStringValue_json(data, "classname"); + const rapidjson::Value& uiOptions = DICTOOL->getSubDictionary_json(data, "options"); + Widget* widget = this->createGUI(classname); + + std::string readerName = this->getWidgetReaderClassName(classname); + + WidgetReaderProtocol* reader = this->createWidgetReaderProtocol(readerName); + + if (reader) + { + // widget parse with widget reader + setPropsForAllWidgetFromJsonDictionary(reader, widget, uiOptions); + } + else + { + readerName = this->getWidgetReaderClassName(widget); + reader = dynamic_cast(ObjectFactory::getInstance()->createObject(readerName)); setPropsForAllWidgetFromJsonDictionary(reader, widget, uiOptions); diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index 999e9435fa..c66420bdfc 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -30,6 +30,9 @@ THE SOFTWARE. #include "WidgetReader/WidgetReaderProtocol.h" #include "base/ObjectFactory.h" +class CocoLoader; +class stExpCocoNode; + namespace cocostudio { @@ -49,6 +52,9 @@ public: static void destroyInstance(); cocos2d::ui::Widget* widgetFromJsonFile(const char* fileName); + + cocos2d::ui::Widget* widgetFromBinaryFile(const char* fileName); + int getVersionInteger(const char* str); /** * @js NA @@ -64,8 +70,6 @@ public: cocos2d::ObjectFactory::Instance ins, Ref* object, SEL_ParseEvent callBack); - - protected: GUIReader(); ~GUIReader(); @@ -88,13 +92,24 @@ class WidgetPropertiesReader : public cocos2d::Ref { public: virtual cocos2d::ui::Widget* createWidget(const rapidjson::Value& dic, const char* fullPath, const char* fileName)=0; + virtual cocos2d::ui::Widget* widgetFromJsonDictionary(const rapidjson::Value& data) = 0; virtual void setPropsForAllWidgetFromJsonDictionary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, const rapidjson::Value& options) = 0; + + virtual void setPropsForAllCustomWidgetFromJsonDictionary(const std::string& classType, cocos2d::ui::Widget* widget, const rapidjson::Value& customOptions) = 0; + + //add binary parsing + virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)=0; + virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) = 0; + virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) = 0; + protected: void setAnchorPointForWidget(cocos2d::ui::Widget* widget, const rapidjson::Value&options); + std::string getWidgetReaderClassName(const std::string& classname); + std::string getWidgetReaderClassName(cocos2d::ui::Widget *widget); std::string getGUIClassName(const std::string& name); cocos2d::ui::Widget *createGUI(const std::string& classname); @@ -114,7 +129,14 @@ public: virtual ~WidgetPropertiesReader0250(){}; virtual cocos2d::ui::Widget* createWidget(const rapidjson::Value& dic, const char* fullPath, const char* fileName); + virtual cocos2d::ui::Widget* widgetFromJsonDictionary(const rapidjson::Value& dic); + + //added for binary parsing + virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)override{return nullptr;} + virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode){return nullptr;} + virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) {} + virtual void setPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); virtual void setColorPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); @@ -136,7 +158,7 @@ public: cocos2d::ui::Widget* widget, const rapidjson::Value& customOptions); }; - + class WidgetPropertiesReader0300 : public WidgetPropertiesReader { @@ -146,7 +168,17 @@ public: virtual ~WidgetPropertiesReader0300(){}; virtual cocos2d::ui::Widget* createWidget(const rapidjson::Value& dic, const char* fullPath, const char* fileName); + + + //add bin parse support + virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)override; + virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual cocos2d::ui::Widget* widgetFromJsonDictionary(const rapidjson::Value& dic); + + + virtual void setPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget*,const rapidjson::Value& options); virtual void setColorPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); @@ -170,6 +202,9 @@ public: cocos2d::ui::Widget* widget, const rapidjson::Value& customOptions); + + + }; diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index b26507dbe5..a1d9e574ad 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -2,6 +2,7 @@ #include "ButtonReader.h" #include "ui/UIButton.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -36,6 +37,97 @@ namespace cocostudio CC_SAFE_DELETE(instanceButtonReader); } + void ButtonReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + Button *button = static_cast(widget); + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; + int cri = 255, cgi = 255, cbi = 255; + float scale9Width = 0.0f, scale9Height = 0.0f; + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "scale9Enable") { + button->setScale9Enabled(valueToBool(value)); + } + else if (key == "normalData"){ + + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + button->loadTextureNormal(backgroundValue, imageFileNameType); + + } + else if (key == "pressedData"){ + + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + button->loadTexturePressed(backgroundValue, imageFileNameType); + + } + else if (key == "disabledData"){ + + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + button->loadTextureDisabled(backgroundValue, imageFileNameType); + + }else if (key == "text"){ + button->setTitleText(value); + } + else if(key == "capInsetsX"){ + capsx = valueToFloat(value); + }else if(key == "capInsetsY"){ + capsy = valueToFloat(value); + }else if(key == "capInsetsWidth"){ + capsWidth = valueToFloat(value); + }else if(key == "capInsetsHeight"){ + capsHeight = valueToFloat(value); + }else if(key == "scale9Width"){ + scale9Width = valueToFloat(value); + }else if(key == "scale9Height"){ + scale9Height = valueToFloat(value); + }else if(key == "textColorR"){ + cri = valueToInt(value); + }else if(key == "textColorG"){ + cgi = valueToInt(value); + }else if(key == "textColorB"){ + cbi = valueToInt(value); + }else if(key == "fontSize"){ + button->setTitleFontSize(valueToFloat(value)); + }else if(key == "fontName"){ + button->setTitleFontName(value); + } + + } //end of for loop + + if (button->isScale9Enabled()) { + button->setCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); + button->setSize(Size(scale9Width, scale9Height)); + } + + button->setTitleColor(Color3B(cri, cgi, cbi)); + + } + void ButtonReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h index 379897676a..4f3be3170c 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h @@ -42,6 +42,7 @@ namespace cocostudio virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index 0d24ac68b2..abe510d68f 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -2,6 +2,7 @@ #include "CheckBoxReader.h" #include "ui/UICheckBox.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,70 @@ namespace cocostudio return instanceCheckBoxReader; } + void CheckBoxReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + CheckBox *checkBox = static_cast(widget); + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "backGroundBoxData"){ + + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + checkBox->loadTextureBackGround(backgroundValue, imageFileNameType); + }else if(key == "backGroundBoxSelectedData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + checkBox->loadTextureBackGroundSelected(backgroundValue, imageFileNameType); + }else if(key == "frontCrossData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + checkBox->loadTextureFrontCross(backgroundValue, imageFileNameType); + }else if(key == "backGroundBoxDisabledData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + checkBox->loadTextureBackGroundDisabled(backgroundValue, imageFileNameType); + }else if (key == "frontCrossDisabledData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + checkBox->loadTextureFrontCrossDisabled(backgroundValue, imageFileNameType); + } + } + + + } + void CheckBoxReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h index 1f9aa3b89e..01c10e1298 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h @@ -41,6 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 7518098731..3aa73eb8b5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -2,6 +2,7 @@ #include "ImageViewReader.h" #include "ui/UIImageView.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,58 @@ namespace cocostudio return instanceImageViewReader; } + void ImageViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + ImageView* imageView = static_cast(widget); + + float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "scale9Enable") { + imageView->setScale9Enabled(valueToBool(value)); + } + else if (key == "fileNameData"){ + + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + imageView->loadTexture(backgroundValue, imageFileNameType); + + } + else if(key == "scale9Width"){ + imageView->setSize(Size(valueToFloat(value), imageView->getSize().height)); + }else if(key == "scale9Height"){ + imageView->setSize(Size(imageView->getSize().width, valueToFloat(value))); + } + else if(key == "capInsetsX"){ + capsx = valueToFloat(value); + }else if(key == "capInsetsY"){ + capsy = valueToFloat(value); + }else if(key == "capInsetsWidth"){ + capsWidth = valueToFloat(value); + }else if(key == "capInsetsHeight"){ + capsHeight = valueToFloat(value); + } + + } //end of for loop + + if (imageView->isScale9Enabled()) { + imageView->setCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); + } + + } + void ImageViewReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h index 4b633e6e8f..e0672de4f6 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h @@ -41,6 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index 926083f0b5..b69bc209ba 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -2,6 +2,7 @@ #include "LayoutReader.h" #include "ui/UILayout.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,111 @@ namespace cocostudio return instanceLayoutReader; } + void LayoutReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + Layout* panel = static_cast(widget); + + float w = 0, h= 0; + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + int cr=0, cg = 0, cb = 0; + int scr=0, scg=0, scb=0; + int ecr=0, ecg=0, ecb= 0; + float bgcv1 = 0.0f, bgcv2= 0.0f; + float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; + Layout::Type layoutType; + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "adaptScreen") { + bool adptScreen = valueToBool(value); + if (adptScreen) { + Size screenSize = CCDirector::getInstance()->getWinSize(); + w = screenSize.width; + h = screenSize.height; + }else{ + w = widget->getSize().width; + h = widget->getSize().height; + } + panel->setSize(Size(w,h)); + }else if( key == "clipAble"){ + panel->setClippingEnabled(valueToBool(value)); + }else if(key == "backGroundScale9Enable"){ + panel->setBackGroundImageScale9Enabled(valueToBool(value)); + }else if(key == "bgColorR"){ + cr = valueToInt(value); + }else if(key == "bgColorG"){ + cg = valueToInt(value); + }else if(key == "bgColorB") + { + cb = valueToInt(value); + }else if(key == "bgStartColorR"){ + scr = valueToInt(value); + }else if(key == "bgStartColorG"){ + scg = valueToInt(value); + }else if(key == "bgStartColorB") + { + scb = valueToInt(value); + } + else if(key == "bgEndColorR"){ + ecr = valueToInt(value); + }else if(key == "bgEndColorG"){ + ecg = valueToInt(value); + }else if(key == "bgEndColorB") + { + ecb = valueToInt(value); + }else if (key == "vectorX"){ + bgcv1 = valueToFloat(value); + }else if(key == "vectorY"){ + bgcv2 = valueToFloat(value); + }else if(key == "bgColorOpacity"){ + panel->setBackGroundColorOpacity(valueToInt(value)); + }else if( key == "colorType"){ + panel->setBackGroundColorType(Layout::BackGroundColorType(valueToInt(value))); + }else if (key == "backGroundImageData"){ + + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + if (backGroundChildren) { + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + panel->setBackGroundImage(backgroundValue,imageFileNameType); + } + + }else if(key == "capInsetsX"){ + capsx = valueToFloat(value); + }else if(key == "capInsetsY"){ + capsy = valueToFloat(value); + }else if(key == "capInsetsWidth"){ + capsWidth = valueToFloat(value); + }else if(key == "capInsetsHeight"){ + capsHeight = valueToFloat(value); + }else if (key == "layoutType"){ + layoutType = (Layout::Type)valueToInt(value); + } + + } + + panel->setBackGroundColor(Color3B(scr, scg, scb),Color3B(ecr, ecg, ecb)); + panel->setBackGroundColor(Color3B(cr, cg, cb)); + panel->setBackGroundColorVector(Vec2(bgcv1, bgcv2)); + + if (panel->isBackGroundImageScale9Enabled()) { + panel->setBackGroundImageCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); + } + + panel->setLayoutType(layoutType); + + } + void LayoutReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h index 8d7387d395..db69aadfa3 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h @@ -41,6 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp index b9a936b2dc..c4294adef5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp @@ -2,6 +2,7 @@ #include "ListViewReader.h" #include "ui/UIListView.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,30 @@ namespace cocostudio return instanceListViewReader; } + void ListViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + ScrollViewReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + ListView* listView = static_cast(widget); + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "direction") { + listView->setDirection((ScrollView::Direction)valueToInt(value)); + } + else if(key == "gravity"){ + listView->setGravity((ListView::Gravity)valueToInt(value)); + }else if(key == "itemMargin"){ + listView->setItemsMargin(valueToFloat(value)); + } + + } //end of for loop + } + void ListViewReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { ScrollViewReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h index 83bb88d79c..d327559ff7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h @@ -41,6 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp index c5452a908b..e74299727d 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp @@ -2,9 +2,11 @@ #include "LoadingBarReader.h" #include "ui/UILoadingBar.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; +using namespace cocostudio; namespace cocostudio { @@ -31,6 +33,56 @@ namespace cocostudio return instanceLoadingBar; } + void LoadingBarReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + LoadingBar* loadingBar = static_cast(widget); + + float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "scale9Enable") { + loadingBar->setScale9Enabled(valueToBool(value)); + } + else if (key == "textureData"){ + + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + loadingBar->loadTexture(backgroundValue, imageFileNameType); + + } + else if(key == "capInsetsX"){ + capsx = valueToFloat(value); + }else if(key == "capInsetsY"){ + capsy = valueToFloat(value); + }else if(key == "capInsetsWidth"){ + capsWidth = valueToFloat(value); + }else if(key == "capInsetsHeight"){ + capsHeight = valueToFloat(value); + }else if(key == "direction"){ + loadingBar->setDirection((LoadingBar::Direction)valueToInt(value)); + }else if(key == "percent"){ + loadingBar->setPercent(valueToInt(value)); + } + + } //end of for loop + + if (loadingBar->isScale9Enabled()) { + loadingBar->setCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); + } + } + void LoadingBarReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h index 0138cad6cd..d1d3ca2ef0 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h @@ -41,6 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp index a5111906be..8ab085b10e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp @@ -31,6 +31,11 @@ namespace cocostudio return instancePageViewReader; } + void PageViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + LayoutReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + } + void PageViewReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { LayoutReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h index 1fa59db3e5..cfd1dd529e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h @@ -41,6 +41,8 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp index 956b0e113a..548318a3b7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp @@ -2,6 +2,7 @@ #include "ScrollViewReader.h" #include "ui/UIScrollView.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,34 @@ namespace cocostudio return instanceScrollViewReader; } + void ScrollViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + LayoutReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + ScrollView* scrollView = static_cast(widget); + + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "innerWidth") { + scrollView->setInnerContainerSize(Size(valueToFloat(value), scrollView->getInnerContainerSize().height)); + } + else if(key == "innerHeight"){ + scrollView->setInnerContainerSize(Size(scrollView->getInnerContainerSize().height, valueToFloat(value) )); + }else if(key == "direction"){ + scrollView->setDirection((ScrollView::Direction)valueToInt(value)); + }else if(key == "bounceEnable"){ + scrollView->setBounceEnabled(valueToBool(value)); + } + + } //end of for loop + + } + void ScrollViewReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { LayoutReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h index 0e3d6e7124..1ceb268dd7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h @@ -41,6 +41,8 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index ca92886ef6..8007a09402 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -2,6 +2,7 @@ #include "SliderReader.h" #include "ui/UISlider.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,85 @@ namespace cocostudio return instanceSliderReader; } + void SliderReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + Slider* slider = static_cast(widget); + + float barLength = 0.0f; + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "scale9Enable") { + slider->setScale9Enabled(valueToBool(value)); + } + else if(key == "percent"){ + slider->setPercent(valueToInt(value)); + }else if(key == "barFileNameData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + slider->loadBarTexture(backgroundValue, imageFileNameType); + + }else if(key == "length"){ + barLength = valueToFloat(value); + }else if(key == "ballNormalData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + slider->loadSlidBallTextureNormal(backgroundValue, imageFileNameType); + + }else if(key == "ballPressedData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + slider->loadSlidBallTexturePressed(backgroundValue, imageFileNameType); + + }else if(key == "ballDisabledData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + slider->loadSlidBallTextureDisabled(backgroundValue, imageFileNameType); + + }else if(key == "progressBarData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + slider->loadProgressBarTexture(backgroundValue, imageFileNameType); + + } + + } //end of for loop + + if (slider->isScale9Enabled()) { + slider->setSize(Size(barLength, slider->getContentSize().height)); + } + } + void SliderReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h index 6f972b7c63..c32a818c02 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h @@ -41,6 +41,8 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp index c7ef7ebcd2..3156e6ab53 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp @@ -2,6 +2,7 @@ #include "TextAtlasReader.h" #include "ui/UITextAtlas.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,52 @@ namespace cocostudio return instanceTextAtalsReader; } + void TextAtlasReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + TextAtlas* labelAtlas = static_cast(widget); + + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + Widget::TextureResType type; + std::string charMapFileName; + std::string stringValue; + std::string startCharMap; + float itemWidth; + float itemHeight; + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "stringValue") { + stringValue = value; + } + else if(key == "charMapFileData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + + charMapFileName = backgroundValue; + type = imageFileNameType; + + }else if(key == "itemWidth"){ + itemWidth = valueToFloat(value); + }else if(key == "itemHeight"){ + itemHeight = valueToFloat(value); + }else if(key == "startCharMap"){ + startCharMap = value; + } + } //end of for loop + + if (type == (Widget::TextureResType)0) { + labelAtlas->setProperty(stringValue, charMapFileName, itemWidth, itemHeight, startCharMap); + } + } + void TextAtlasReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h index ec1af59132..bae1cf7a94 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h @@ -40,6 +40,8 @@ namespace cocostudio static TextAtlasReader* getInstance(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp index 0558c1b072..91e4c47368 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp @@ -2,6 +2,7 @@ #include "TextBMFontReader.h" #include "ui/UITextBMFont.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,37 @@ namespace cocostudio return instanceTextBMFontReader; } + void TextBMFontReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + TextBMFont* labelBMFont = static_cast(widget); + + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if(key == "fileNameData"){ + stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); + std::string resType = backGroundChildren[2].GetValue();; + + Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); + + std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + if (imageFileNameType == (Widget::TextureResType)0) { + labelBMFont->setFntFile(backgroundValue); + } + + }else if(key == "text"){ + labelBMFont->setString(value); + } + } //end of for loop + + } + void TextBMFontReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h index 491feb52f1..211b5af9d6 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h @@ -41,6 +41,8 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp index 634c34c1c8..22e27de32b 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp @@ -2,6 +2,7 @@ #include "TextFieldReader.h" #include "ui/UITextField.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,42 @@ namespace cocostudio return instanceTextFieldReader; } + void TextFieldReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + TextField* textField = static_cast(widget); + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if(key == "placeHolder"){ + textField->setPlaceHolder(value); + }else if(key == "text"){ + textField->setText(value); + }else if(key == "fontSize"){ + textField->setFontSize(valueToInt(value)); + }else if(key == "fontName"){ + textField->setFontName(value); + }else if(key == "touchSizeWidth"){ + textField->setTouchSize(Size(valueToFloat(value), textField->getTouchSize().height)); + }else if(key == "touchSizeHeight"){ + textField->setTouchSize(Size(textField->getTouchSize().width, valueToFloat(value))); + }else if (key == "maxLengthEnable"){ + textField->setMaxLengthEnabled(valueToBool(value)); + }else if(key == "maxLength"){ + textField->setMaxLength(valueToInt(value)); + }else if(key == "passwordEnable"){ + textField->setPasswordEnabled(valueToBool(value)); + }else if(key == "passwordStyleText"){ + textField->setPasswordStyleText(value.c_str()); + } + } //end of for loop + } + void TextFieldReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h index 2daede6243..fe6c9d60d5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h @@ -41,6 +41,8 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp index 08144322b4..2c24d630d4 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp @@ -2,6 +2,7 @@ #include "TextReader.h" #include "ui/UIText.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -31,6 +32,42 @@ namespace cocostudio return instanceTextReader; } + void TextReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + Text* label = static_cast(widget); + + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "touchScaleEnable") { + label->setTouchScaleChangeEnabled(valueToBool(value)); + } + + else if(key == "text"){ + label->setString(value); + }else if(key == "fontSize"){ + label->setFontSize(valueToInt(value)); + }else if(key == "fontName"){ + label->setFontName(value); + }else if(key == "areaWidth"){ + label->setTextAreaSize(Size(valueToFloat(value), label->getTextAreaSize().height)); + }else if(key == "areaHeight"){ + label->setTextAreaSize(Size(label->getTextAreaSize().width, valueToFloat(value))); + }else if(key == "hAlignment"){ + label->setTextHorizontalAlignment((TextHAlignment)valueToInt(value)); + }else if(key == "vAlignment"){ + label->setTextVerticalAlignment((TextVAlignment)valueToInt(value)); + } + + } //end of for loop + } + void TextReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { WidgetReader::setPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.h b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.h index 84bf04cb8e..09feb66b16 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.h @@ -41,6 +41,8 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index fb45ed7017..ce1383e04c 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -1,6 +1,7 @@ #include "WidgetReader.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -13,7 +14,22 @@ namespace cocostudio WidgetReader::WidgetReader() { + valueToInt = [=](std::string str) -> int{ + return atoi(str.c_str()); + }; + valueToBool = [=](std::string str) -> bool{ + int intValue = valueToInt(str); + if (1 == intValue) { + return true; + }else{ + return false; + } + }; + + valueToFloat = [=](std::string str) -> float{ + return atof(str.c_str()); + }; } WidgetReader::~WidgetReader() @@ -148,6 +164,139 @@ namespace cocostudio } } + void WidgetReader::setBasicPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + widget->setSizePercent(Vec2(valueToFloat(value), widget->getSizePercent().y)); + }else if(key == "sizePercentY"){ + widget->setSizePercent(Vec2(widget->getSizePercent().x, valueToFloat(value))); + }else if(key == "positionPercentX"){ + widget->setPositionPercent(Vec2(valueToFloat(value), widget->getPositionPercent().y)); + }else if(key == "positionPercentY"){ + widget->setPositionPercent(Vec2(widget->getPositionPercent().x, valueToFloat(value))); + }else if (key == "width"){ + widget->setSize(Size(valueToFloat(value), widget->getSize().height)); + }else if(key == "height"){ + widget->setSize(Size(widget->getSize().width, valueToFloat(value))); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + CCLOG("%s", widgetName.c_str()); + widget->setName(widgetName); + }else if(key == "x"){ + widget->setPosition(Vec2(valueToFloat(value), widget->getPosition().y)); + }else if(key == "y"){ + widget->setPosition(Vec2(widget->getPosition().x, valueToFloat(value))); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } + + } + } + + void WidgetReader::setColorPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + //set default color + widget->setColor(Color3B(255,255,255)); + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + } + } + } + void WidgetReader::setColorPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { bool op = DICTOOL->checkObjectExist_json(options, "opacity"); @@ -193,6 +342,30 @@ namespace cocostudio return imageFileName_tp; } + std::string WidgetReader::getResourcePath(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, cocos2d::ui::Widget::TextureResType texType) + { + stExpCocoNode *backGroundChildren = pCocoNode->GetChildArray(); + std::string backgroundValue = backGroundChildren[0].GetValue(); + + + std::string binaryPath = GUIReader::getInstance()->getFilePath(); + + std::string imageFileName_tp; + if (!backgroundValue.empty()) + { + if (texType == ui::Widget::TextureResType::LOCAL) { + imageFileName_tp = binaryPath + backgroundValue; + } + else if(texType == ui::Widget::TextureResType::PLIST){ + imageFileName_tp = backgroundValue; + } + else{ + CCASSERT(0, "invalid TextureResType!!!"); + } + } + return imageFileName_tp; + } + void WidgetReader::setAnchorPointForWidget(cocos2d::ui::Widget *widget, const rapidjson::Value &options) { bool isAnchorPointXExists = DICTOOL->checkObjectExist_json(options, "anchorPointX"); diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index 9fff4d903b..26845efe97 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -30,8 +30,13 @@ #include "ui/GUIDefine.h" #include "ui/UIWidget.h" + + namespace cocostudio { + class CocoLoader; + class stExpCocoNode; + class WidgetReader : public cocos2d::Ref, public WidgetReaderProtocol { public: @@ -49,11 +54,24 @@ namespace cocostudio virtual void setColorPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); + virtual void setBasicPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual void setColorPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) + { + this->setBasicPropsFromBinary(widget, pCocoLoader, pCocoNode); + this->setColorPropsFromBinary(widget, pCocoLoader, pCocoNode); + }; protected: std::string getResourcePath(const rapidjson::Value& dict, const std::string& key, cocos2d::ui::Widget::TextureResType texType); + std::string getResourcePath(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode, cocos2d::ui::Widget::TextureResType texType); void setAnchorPointForWidget(cocos2d::ui::Widget* widget, const rapidjson::Value&options); + + std::function valueToInt; + std::function valueToBool; + std::function valueToFloat; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h index 3c69a78a00..605a97acab 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h @@ -28,6 +28,8 @@ #include "cocos2d.h" #include "cocostudio/DictionaryHelper.h" + + namespace cocos2d { namespace ui @@ -38,11 +40,15 @@ namespace cocos2d namespace cocostudio { + class CocoLoader; + class stExpCocoNode; + class WidgetReaderProtocol { public: virtual ~WidgetReaderProtocol() {}; virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options) = 0; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) = 0; }; } From 3dc6e86c2550e9c088502a17edd84db84f921722 Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 5 Jun 2014 10:25:45 +0800 Subject: [PATCH 03/72] add binary file parsing into ui tests --- .../UIButtonTest/UIButtonTest_Editor.cpp | 2 ++ .../UICheckBoxTest/UICheckBoxTest_Editor.cpp | 3 ++- .../UIImageViewTest_Editor.cpp | 4 ++- .../UILayoutTest/UILayoutTest_Editor.cpp | 27 ++++++++++++------- .../UIListViewTest/UIListViewTest_Editor.cpp | 6 +++-- .../UILoadingBarTest_Editor.cpp | 3 ++- .../UIPageViewTest/UIPageViewTest_Editor.cpp | 3 ++- .../UIScrollViewTest_Editor.cpp | 15 +++++++---- .../UISliderTest/UISliderTest_Editor.cpp | 3 ++- .../UITextAtlasTest_Editor.cpp | 3 ++- .../UITextBMFontTest_Editor.cpp | 3 ++- .../UITextFieldTest_Editor.cpp | 3 ++- .../UITextTest/UITextTest_Editor.cpp | 3 ++- .../UIWidgetAddNodeTest_Editor.cpp | 3 ++- 14 files changed, 55 insertions(+), 26 deletions(-) diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp index 92f99b224d..a5eb5d92e3 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp @@ -21,6 +21,8 @@ bool UIButtonTest_Editor::init() if (UIScene_Editor::init()) { _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_1.ubi")); + _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp index 5ea65d689a..e155ae8eff 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp @@ -20,7 +20,8 @@ bool UICheckBoxTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.ubi")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp index c0e9f0ba16..eb756cf610 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp @@ -9,7 +9,9 @@ bool UIImageViewTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIImageView_Editor/ui_ImageView_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIImageView_Editor/ui_ImageView_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIImageView_Editor/ui_imageview_editor_1.ubi")); + _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp index 792ed2b36a..883ba9187e 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp @@ -19,7 +19,8 @@ bool UILayoutTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Editor/ui_layout_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Editor/ui_layout_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Editor/ui_layout_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -74,7 +75,8 @@ bool UILayoutTest_Color_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Color_Editor/ui_layout_color_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Color_Editor/ui_layout_color_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Color_Editor/ui_layout_color_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -129,7 +131,8 @@ bool UILayoutTest_Gradient_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Gradient_Color_Editor/ui_layout_gradient_color_editor_1_0.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Gradient_Color_Editor/ui_layout_gradient_color_editor_1_0.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Gradient_Color_Editor/ui_layout_gradient_color_editor_1_0.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -184,7 +187,8 @@ bool UILayoutTest_BackGroundImage_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_BackgroundImage_Editor/ui_layout_backgroundimage_editor_1_0_0.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_BackgroundImage_Editor/ui_layout_backgroundimage_editor_1_0_0.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_BackgroundImage_Editor/ui_layout_backgroundimage_editor_1_0_0.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -239,7 +243,8 @@ bool UILayoutTest_BackGroundImage_Scale9_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Scale9_BackgroundImage_Editor/ui_layout_scale9_backgroundimage_editor.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Scale9_BackgroundImage_Editor/ui_layout_scale9_backgroundimage_editor.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Scale9_BackgroundImage_Editor/ui_layout_scale9_backgroundimage_editor.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -294,7 +299,8 @@ bool UILayoutTest_Layout_Linear_Vertical_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Vertical_Layout_Editor/ui_layout_linear_vertical_layout_editor.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Vertical_Layout_Editor/ui_layout_linear_vertical_layout_editor.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Vertical_Layout_Editor/ui_layout_linear_vertical_layout_editor.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -349,7 +355,8 @@ bool UILayoutTest_Layout_Linear_Horizontal_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Horizontal_Layout_Editor/ui_layout_linear_horizontal_layout_editor.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Horizontal_Layout_Editor/ui_layout_linear_horizontal_layout_editor.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Horizontal_Layout_Editor/ui_layout_linear_horizontal_layout_editor.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -405,7 +412,8 @@ bool UILayoutTest_Layout_Relative_Align_Parent_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Parent_Editor/ui_layout_relative_align_parent_editor.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Parent_Editor/ui_layout_relative_align_parent_editor.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Parent_Editor/ui_layout_relative_align_parent_editor.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -460,7 +468,8 @@ bool UILayoutTest_Layout_Relative_Location_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Location_Editor/ui_layout_relative_align_location_editor.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Location_Editor/ui_layout_relative_align_location_editor.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Location_Editor/ui_layout_relative_align_location_editor.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp index 15f5f5567a..8134f07e76 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp @@ -19,7 +19,8 @@ bool UIListViewTest_Vertical_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Vertical_Editor/ui_listview_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Vertical_Editor/ui_listview_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Vertical_Editor/ui_listview_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -80,7 +81,8 @@ bool UIListViewTest_Horizontal_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Horizontal_Editor/ui_listview_horizontal_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Horizontal_Editor/ui_listview_horizontal_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Horizontal_Editor/ui_listview_horizontal_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp index 63c0c15386..5984081c6e 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp @@ -21,7 +21,8 @@ bool UILoadingBarTest_Editor::init() { scheduleUpdate(); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILoadingBar_Editor/ui_loadingbar_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILoadingBar_Editor/ui_loadingbar_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILoadingBar_Editor/ui_loadingbar_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp index cec0c535f9..a017a73183 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp @@ -20,7 +20,8 @@ bool UIPageViewTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIPageView_Editor/ui_pageview_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIPageView_Editor/ui_pageview_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIPageView_Editor/ui_pageview_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp index dc7584afe9..ed4370af9c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp @@ -19,7 +19,8 @@ bool UIScrollViewTest_Vertical_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Vertical_Editor/ui_scrollview_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Vertical_Editor/ui_scrollview_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Vertical_Editor/ui_scrollview_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -74,7 +75,8 @@ bool UIScrollViewTest_Horizontal_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Horizontal_Editor/ui_scrollview_horizontal_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Horizontal_Editor/ui_scrollview_horizontal_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Horizontal_Editor/ui_scrollview_horizontal_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -129,7 +131,8 @@ bool UIScrollViewTest_Both_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Both_Editor/ui_scrollview_both_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Both_Editor/ui_scrollview_both_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Both_Editor/ui_scrollview_both_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -184,7 +187,8 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UITest/UITest.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -230,7 +234,8 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Bounce_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UITest/UITest.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp index c6d0e0ea45..9962471812 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp @@ -20,7 +20,8 @@ bool UISliderTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UISlider_Editor/ui_slider_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UISlider_Editor/ui_slider_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UISlider_Editor/ui_slider_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp index 396337a5eb..fe7ed4c79f 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp @@ -8,7 +8,8 @@ bool UITextAtlasTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabelAtlas_Editor/ui_labelatlas_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabelAtlas_Editor/ui_labelatlas_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabelAtlas_Editor/ui_labelatlas_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp index 5b2bdcee10..d366e70bde 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp @@ -9,7 +9,8 @@ bool UITextBMFontTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabelBMFont_Editor/ui_labelbmfont_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabelBMFont_Editor/ui_labelbmfont_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabelBMFont_Editor/ui_labelbmfont_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp index fe9bc0f924..da90cc4c88 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp @@ -20,7 +20,8 @@ bool UITextFieldTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UITextField_Editor/ui_textfield_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UITextField_Editor/ui_textfield_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UITextField_Editor/ui_textfield_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp index e8ef5acf1b..04c70ae511 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp @@ -11,7 +11,8 @@ bool UITextTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabel_Editor/ui_label_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabel_Editor/ui_label_editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabel_Editor/ui_label_editor_1.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp index 31d176084d..1bf58c4cb1 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp @@ -19,7 +19,8 @@ bool UIWidgetAddNodeTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIWidgetAddNode_Editor/ui_widget_add_node_editor.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIWidgetAddNode_Editor/ui_widget_add_node_editor.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIWidgetAddNode_Editor/ui_widget_add_node_editor.ubi")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); From c96a6086c36b7f2ebe1b9ab1a3195595e7ab55ad Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 5 Jun 2014 11:43:43 +0800 Subject: [PATCH 04/72] improve parsing code --- build/cocos2d_libs.xcodeproj/project.pbxproj | 10 ++ .../cocostudio/CCSGUIReader.cpp | 145 +++++++++--------- .../editor-support/cocostudio/CCSGUIReader.h | 20 ++- .../CheckBoxReader/CheckBoxReader.cpp | 7 +- .../LayoutReader/LayoutReader.cpp | 28 ++-- .../cocostudio/WidgetReader/WidgetReader.cpp | 54 +++++-- .../UICheckBoxTest/UICheckBoxTest_Editor.cpp | 4 +- 7 files changed, 165 insertions(+), 103 deletions(-) diff --git a/build/cocos2d_libs.xcodeproj/project.pbxproj b/build/cocos2d_libs.xcodeproj/project.pbxproj index 2f28263747..da51af4c2a 100644 --- a/build/cocos2d_libs.xcodeproj/project.pbxproj +++ b/build/cocos2d_libs.xcodeproj/project.pbxproj @@ -968,6 +968,8 @@ 2905FA8D18CF08D100240AA3 /* UIWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2905FA1318CF08D100240AA3 /* UIWidget.cpp */; }; 2905FA8E18CF08D100240AA3 /* UIWidget.h in Headers */ = {isa = PBXBuildFile; fileRef = 2905FA1418CF08D100240AA3 /* UIWidget.h */; }; 2905FA8F18CF08D100240AA3 /* UIWidget.h in Headers */ = {isa = PBXBuildFile; fileRef = 2905FA1418CF08D100240AA3 /* UIWidget.h */; }; + 297E4E3519332C2A00B455EF /* CocoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 297E4E3019332C2A00B455EF /* CocoLoader.cpp */; }; + 297E4E3619332C2A00B455EF /* CocoLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 297E4E3119332C2A00B455EF /* CocoLoader.h */; }; 2986667F18B1B246000E39CA /* CCTweenFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2986667818B1B079000E39CA /* CCTweenFunction.cpp */; }; 299754F4193EC95400A54AC3 /* ObjectFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */; }; 299754F5193EC95400A54AC3 /* ObjectFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */; }; @@ -979,6 +981,7 @@ 29CB8F4F1929D1BB00C841D6 /* UILayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 29CB8F4B1929D1BB00C841D6 /* UILayoutManager.h */; }; 29CB8F551929D7A900C841D6 /* UIScrollInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 29CB8F541929D7A900C841D6 /* UIScrollInterface.h */; }; 29CB8F561929D7A900C841D6 /* UIScrollInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 29CB8F541929D7A900C841D6 /* UIScrollInterface.h */; }; + 29F1658D1934670900E5AC75 /* CocoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 297E4E3019332C2A00B455EF /* CocoLoader.cpp */; }; 2AC795DB1862870F005EC8E1 /* SkeletonBounds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2AC795D918628689005EC8E1 /* SkeletonBounds.cpp */; }; 2AC795DC1862870F005EC8E1 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2AC795D51862867D005EC8E1 /* Event.cpp */; }; 2AC795DD1862870F005EC8E1 /* EventData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2AC795D71862867D005EC8E1 /* EventData.cpp */; }; @@ -2252,6 +2255,8 @@ 2905FA1318CF08D100240AA3 /* UIWidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UIWidget.cpp; sourceTree = ""; }; 2905FA1418CF08D100240AA3 /* UIWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIWidget.h; sourceTree = ""; }; 29080DEB191B82CE0066F8DF /* UIDeprecated.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIDeprecated.h; sourceTree = ""; }; + 297E4E3019332C2A00B455EF /* CocoLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CocoLoader.cpp; sourceTree = ""; }; + 297E4E3119332C2A00B455EF /* CocoLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoLoader.h; sourceTree = ""; }; 2986667818B1B079000E39CA /* CCTweenFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCTweenFunction.cpp; sourceTree = ""; }; 2986667918B1B079000E39CA /* CCTweenFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTweenFunction.h; sourceTree = ""; }; 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ObjectFactory.cpp; path = ../base/ObjectFactory.cpp; sourceTree = ""; }; @@ -3562,6 +3567,8 @@ 1A8C5946180E930E00EF57C3 /* cocostudio */ = { isa = PBXGroup; children = ( + 297E4E3019332C2A00B455EF /* CocoLoader.cpp */, + 297E4E3119332C2A00B455EF /* CocoLoader.h */, 50FCEB6818C72017004AD434 /* WidgetReader */, 06CAAAC1186AD63B0012A414 /* TriggerObj.h */, 06CAAABC186AD63B0012A414 /* TriggerBase.cpp */, @@ -4862,6 +4869,7 @@ 46A170E71807CECA005B8026 /* CCPhysicsBody.h in Headers */, 2905FA4818CF08D100240AA3 /* UIButton.h in Headers */, 46A170EB1807CECA005B8026 /* CCPhysicsJoint.h in Headers */, + 297E4E3619332C2A00B455EF /* CocoLoader.h in Headers */, 50ABBD3E1925AB0000A911A9 /* CCGeometry.h in Headers */, 50ABBE631925AB6F00A911A9 /* CCEventListenerAcceleration.h in Headers */, 2905FA4418CF08D100240AA3 /* GUIDefine.h in Headers */, @@ -6188,6 +6196,7 @@ 1AD71DA9180E26E600808F54 /* CCBAnimationManager.cpp in Sources */, 1AD71DAD180E26E600808F54 /* CCBFileLoader.cpp in Sources */, 50E6D33418E174130051CA34 /* UIHBox.cpp in Sources */, + 297E4E3519332C2A00B455EF /* CocoLoader.cpp in Sources */, 50ABBEB31925AB6F00A911A9 /* CCUserDefault.mm in Sources */, 2905FA8418CF08D100240AA3 /* UITextBMFont.cpp in Sources */, 1AD71DB1180E26E600808F54 /* CCBKeyframe.cpp in Sources */, @@ -6475,6 +6484,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 29F1658D1934670900E5AC75 /* CocoLoader.cpp in Sources */, 1A01C69918F57BE800EFE3A6 /* CCSet.cpp in Sources */, 1A01C69D18F57BE800EFE3A6 /* CCString.cpp in Sources */, 2986667F18B1B246000E39CA /* CCTweenFunction.cpp in Sources */, diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index 8413ced518..ae22293c98 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -1185,11 +1185,8 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c if (rapidjson::kObjectType == tType) { //convert this function!!! - //widgetFromJsonDictionary(widgetTree); widget = widgetFromBinary(pCocoLoader, widgetTreeNode); } - - /* *********temp********* */ if (widget->getContentSize().equals(Size::ZERO)) @@ -1241,16 +1238,14 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s reader = this->createWidgetReaderProtocol(readerName); setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader, &stChildArray[3]); - //TODO: -// // 2nd., custom widget parse with custom reader -// const char* customProperty = DICTOOL->getStringValue_json(uiOptions, "customProperty"); -// rapidjson::Document customJsonDict; -// customJsonDict.Parse<0>(customProperty); -// if (customJsonDict.HasParseError()) -// { -// CCLOG("GetParseError %s\n", customJsonDict.GetParseError()); -// } -// setPropsForAllCustomWidgetFromJsonDictionary(classname, widget, customJsonDict); + + // 2nd., custom widget parse with custom reader +// const char* customProperty = DICTOOL->getStringValue_json(uiOptions, "customProperty"); +// +// rapidjson::Document customJsonDict; +// customJsonDict.Parse<0>(customProperty); +// +// setPropsForAllCustomWidgetFromBinary(classname, widget, pCocoLoader, &stChildArray[3]); } //parse children @@ -1310,70 +1305,70 @@ void WidgetPropertiesReader0300::setPropsForAllWidgetFromBinary(WidgetReaderProt reader->setPropsFromBinary(widget, pCocoLoader, pCocoNode); } - std::string WidgetPropertiesReader::getWidgetReaderClassName(Widget* widget) +std::string WidgetPropertiesReader::getWidgetReaderClassName(Widget* widget) +{ + std::string readerName; + + // 1st., custom widget parse properties of parent widget with parent widget reader + if (dynamic_cast(widget)) { - std::string readerName; - - // 1st., custom widget parse properties of parent widget with parent widget reader - if (dynamic_cast(widget)) - { - readerName = "ButtonReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "CheckBoxReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "ImageViewReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "TextAtlasReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "TextBMFontReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "TextReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "LoadingBarReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "SliderReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "TextFieldReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "LayoutReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "ScrollViewReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "ListViewReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "PageViewReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "WidgetReader"; - } - - return readerName; + readerName = "ButtonReader"; } + else if (dynamic_cast(widget)) + { + readerName = "CheckBoxReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "ImageViewReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "TextAtlasReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "TextBMFontReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "TextReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "LoadingBarReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "SliderReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "TextFieldReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "LayoutReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "ScrollViewReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "ListViewReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "PageViewReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "WidgetReader"; + } + + return readerName; +} Widget* WidgetPropertiesReader0300::widgetFromJsonDictionary(const rapidjson::Value& data) { diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index c66420bdfc..0eb2723b8b 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -104,7 +104,15 @@ public: //add binary parsing virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)=0; virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) = 0; - virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) = 0; + virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, + cocos2d::ui::Widget* widget, + CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode) = 0; + + virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, + cocos2d::ui::Widget* widget, + CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode) = 0; protected: void setAnchorPointForWidget(cocos2d::ui::Widget* widget, const rapidjson::Value&options); @@ -136,6 +144,10 @@ public: virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)override{return nullptr;} virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode){return nullptr;} virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) {} + virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, + cocos2d::ui::Widget* widget, + CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode) {} virtual void setPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); @@ -174,7 +186,11 @@ public: virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)override; virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); - + virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, + cocos2d::ui::Widget* widget, + CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode) {} + virtual cocos2d::ui::Widget* widgetFromJsonDictionary(const rapidjson::Value& dic); diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index abe510d68f..6e7e251825 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -34,7 +34,7 @@ namespace cocostudio void CheckBoxReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + WidgetReader::setBasicPropsFromBinary(widget, pCocoLoader, pCocoNode); CheckBox *checkBox = static_cast(widget); @@ -91,8 +91,13 @@ namespace cocostudio checkBox->loadTextureFrontCrossDisabled(backgroundValue, imageFileNameType); } +// else if (key == "selectedState"){ +// checkBox->setSelectedState(valueToBool(value)); +// } } + WidgetReader::setColorPropsFromBinary(widget, pCocoLoader, pCocoNode); + } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index b69bc209ba..a6440e0f81 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -47,6 +47,7 @@ namespace cocostudio int ecr=0, ecg=0, ecb= 0; float bgcv1 = 0.0f, bgcv2= 0.0f; float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; + bool isAdaptScreen = false; Layout::Type layoutType; for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { @@ -54,17 +55,15 @@ namespace cocostudio std::string value = stChildArray[i].GetValue(); if (key == "adaptScreen") { - bool adptScreen = valueToBool(value); - if (adptScreen) { - Size screenSize = CCDirector::getInstance()->getWinSize(); - w = screenSize.width; - h = screenSize.height; - }else{ - w = widget->getSize().width; - h = widget->getSize().height; - } - panel->setSize(Size(w,h)); - }else if( key == "clipAble"){ + isAdaptScreen = valueToBool(value); + } + else if(key == "width"){ + w = valueToFloat(value); + } + else if(key == "height"){ + h = valueToFloat(value); + } + else if( key == "clipAble"){ panel->setClippingEnabled(valueToBool(value)); }else if(key == "backGroundScale9Enable"){ panel->setBackGroundImageScale9Enabled(valueToBool(value)); @@ -125,6 +124,13 @@ namespace cocostudio } + Size screenSize = Director::getInstance()->getWinSize(); + if (isAdaptScreen) { + w = screenSize.width; + h = screenSize.height; + } + panel->setSize(Size(w,h)); + panel->setBackGroundColor(Color3B(scr, scg, scb),Color3B(ecr, ecg, ecb)); panel->setBackGroundColor(Color3B(cr, cg, cb)); panel->setBackGroundColorVector(Vec2(bgcv1, bgcv2)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index ce1383e04c..1c6b9b227c 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -168,11 +168,21 @@ namespace cocostudio { stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); - + + float sizePercentX; + float sizePercentY; + float positionPercentX; + float positionPercentY; + Size screenSize = Director::getInstance()->getWinSize(); + float width ; + float height; + Vec2 position = widget->getPosition(); + bool isAdaptScreen = false; for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); + CCLOG("%s", value.c_str()); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); @@ -181,17 +191,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - widget->setSizePercent(Vec2(valueToFloat(value), widget->getSizePercent().y)); + sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - widget->setSizePercent(Vec2(widget->getSizePercent().x, valueToFloat(value))); + sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - widget->setPositionPercent(Vec2(valueToFloat(value), widget->getPositionPercent().y)); + positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - widget->setPositionPercent(Vec2(widget->getPositionPercent().x, valueToFloat(value))); - }else if (key == "width"){ - widget->setSize(Size(valueToFloat(value), widget->getSize().height)); + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); }else if(key == "height"){ - widget->setSize(Size(widget->getSize().width, valueToFloat(value))); + height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -200,12 +214,12 @@ namespace cocostudio widget->setTouchEnabled(valueToBool(value)); }else if(key == "name"){ std::string widgetName = value.empty() ? "default" : value; - CCLOG("%s", widgetName.c_str()); +// CCLOG("%s", widgetName.c_str()); widget->setName(widgetName); }else if(key == "x"){ - widget->setPosition(Vec2(valueToFloat(value), widget->getPosition().y)); + position.x = valueToFloat(value); }else if(key == "y"){ - widget->setPosition(Vec2(widget->getPosition().x, valueToFloat(value))); + position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -262,8 +276,15 @@ namespace cocostudio break; } } - } + + widget->setPositionPercent(Vec2(positionPercentX, positionPercentY)); + widget->setSizePercent(Vec2(sizePercentX, sizePercentY)); + if (isAdaptScreen) { + width = screenSize.width; + height = screenSize.height; + } + widget->setSize(Size(width, height)); } void WidgetReader::setColorPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) @@ -273,6 +294,8 @@ namespace cocostudio //set default color widget->setColor(Color3B(255,255,255)); + Vec2 originalAnchorPoint = widget->getAnchorPoint(); + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); @@ -293,8 +316,15 @@ namespace cocostudio widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); } } + + widget->setAnchorPoint(originalAnchorPoint); + } void WidgetReader::setColorPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp index e155ae8eff..5e8d9abff0 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp @@ -20,8 +20,8 @@ bool UICheckBoxTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.ubi")); -// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_2.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); From 6bbf5a1459a24d1094d3a7da5be40a5c7c1b8b6e Mon Sep 17 00:00:00 2001 From: andyque Date: Fri, 6 Jun 2014 10:12:23 +0800 Subject: [PATCH 05/72] tests --- build/cocos2d_tests.xcodeproj/project.pbxproj | 2 ++ cocos/editor-support/cocostudio/CocoLoader.cpp | 4 +++- cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp | 1 - cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/build/cocos2d_tests.xcodeproj/project.pbxproj b/build/cocos2d_tests.xcodeproj/project.pbxproj index 5169d3949d..2665cc7c38 100644 --- a/build/cocos2d_tests.xcodeproj/project.pbxproj +++ b/build/cocos2d_tests.xcodeproj/project.pbxproj @@ -5464,6 +5464,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = dwarf; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", CC_TARGET_OS_IPHONE, @@ -5480,6 +5481,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = dwarf; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", CC_TARGET_OS_IPHONE, diff --git a/cocos/editor-support/cocostudio/CocoLoader.cpp b/cocos/editor-support/cocostudio/CocoLoader.cpp index 8f4b06e95a..34f0ca4a54 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.cpp +++ b/cocos/editor-support/cocostudio/CocoLoader.cpp @@ -23,6 +23,7 @@ ****************************************************************************/ #include "CocoLoader.h" +#include namespace cocostudio { const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; @@ -185,7 +186,8 @@ namespace cocostudio { char* pStringAddr = pStartAddr + m_pFileHeader->m_lStringMemAddr ; m_pRootNode = (stExpCocoNode*)pCocoMemAddr; - + std::cout<<"header size = "<ignoreContentAdaptWithSize(valueToBool(value)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index 26845efe97..818a35b0a7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -73,6 +73,7 @@ namespace cocostudio std::function valueToBool; std::function valueToFloat; + }; } From b8950187650530611995f10457caf1a5456d3c39 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 11 Jun 2014 09:35:24 +0800 Subject: [PATCH 06/72] update parser --- build/cocos2d_libs.xcodeproj/project.pbxproj | 12 ++ .../cocostudio/CCSGUIReader.cpp | 65 +++--- .../editor-support/cocostudio/CocoLoader.cpp | 93 ++++---- cocos/editor-support/cocostudio/CocoLoader.h | 55 ++--- .../cocostudio/ObjectFactory.cpp | 202 ------------------ .../editor-support/cocostudio/ObjectFactory.h | 81 ------- .../ButtonReader/ButtonReader.cpp | 123 ++++++++++- .../CheckBoxReader/CheckBoxReader.cpp | 121 ++++++++++- .../ImageViewReader/ImageViewReader.cpp | 123 ++++++++++- .../LayoutReader/LayoutReader.cpp | 122 ++++++++++- .../ListViewReader/ListViewReader.cpp | 2 +- .../LoadingBarReader/LoadingBarReader.cpp | 119 ++++++++++- .../ScrollViewReader/ScrollViewReader.cpp | 126 ++++++++++- .../SliderReader/SliderReader.cpp | 120 ++++++++++- .../TextAtlasReader/TextAtlasReader.cpp | 119 ++++++++++- .../TextBMFontReader/TextBMFontReader.cpp | 119 ++++++++++- .../TextFieldReader/TextFieldReader.cpp | 118 +++++++++- .../WidgetReader/TextReader/TextReader.cpp | 119 ++++++++++- .../cocostudio/WidgetReader/WidgetReader.cpp | 189 +++------------- .../cocostudio/WidgetReader/WidgetReader.h | 21 +- .../UIButtonTest/UIButtonTest_Editor.cpp | 4 +- .../UICheckBoxTest/UICheckBoxTest_Editor.cpp | 4 +- .../UISliderTest/UISliderTest_Editor.cpp | 2 +- 23 files changed, 1471 insertions(+), 588 deletions(-) delete mode 100644 cocos/editor-support/cocostudio/ObjectFactory.cpp delete mode 100644 cocos/editor-support/cocostudio/ObjectFactory.h diff --git a/build/cocos2d_libs.xcodeproj/project.pbxproj b/build/cocos2d_libs.xcodeproj/project.pbxproj index 8f3879fe78..4d824876b4 100644 --- a/build/cocos2d_libs.xcodeproj/project.pbxproj +++ b/build/cocos2d_libs.xcodeproj/project.pbxproj @@ -968,6 +968,10 @@ 2905FA8D18CF08D100240AA3 /* UIWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2905FA1318CF08D100240AA3 /* UIWidget.cpp */; }; 2905FA8E18CF08D100240AA3 /* UIWidget.h in Headers */ = {isa = PBXBuildFile; fileRef = 2905FA1418CF08D100240AA3 /* UIWidget.h */; }; 2905FA8F18CF08D100240AA3 /* UIWidget.h in Headers */ = {isa = PBXBuildFile; fileRef = 2905FA1418CF08D100240AA3 /* UIWidget.h */; }; + 2939A2911946ED770064B6A1 /* CocoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2939A28F1946ED770064B6A1 /* CocoLoader.cpp */; }; + 2939A2921946ED770064B6A1 /* CocoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2939A28F1946ED770064B6A1 /* CocoLoader.cpp */; }; + 2939A2931946ED770064B6A1 /* CocoLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2939A2901946ED770064B6A1 /* CocoLoader.h */; }; + 2939A2941946ED770064B6A1 /* CocoLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2939A2901946ED770064B6A1 /* CocoLoader.h */; }; 2986667F18B1B246000E39CA /* CCTweenFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2986667818B1B079000E39CA /* CCTweenFunction.cpp */; }; 299754F4193EC95400A54AC3 /* ObjectFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */; }; 299754F5193EC95400A54AC3 /* ObjectFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */; }; @@ -2250,6 +2254,8 @@ 2905FA1318CF08D100240AA3 /* UIWidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UIWidget.cpp; sourceTree = ""; }; 2905FA1418CF08D100240AA3 /* UIWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIWidget.h; sourceTree = ""; }; 29080DEB191B82CE0066F8DF /* UIDeprecated.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIDeprecated.h; sourceTree = ""; }; + 2939A28F1946ED770064B6A1 /* CocoLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CocoLoader.cpp; sourceTree = ""; }; + 2939A2901946ED770064B6A1 /* CocoLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoLoader.h; sourceTree = ""; }; 2986667818B1B079000E39CA /* CCTweenFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCTweenFunction.cpp; sourceTree = ""; }; 2986667918B1B079000E39CA /* CCTweenFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTweenFunction.h; sourceTree = ""; }; 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ObjectFactory.cpp; path = ../base/ObjectFactory.cpp; sourceTree = ""; }; @@ -3559,6 +3565,8 @@ 1A8C5946180E930E00EF57C3 /* cocostudio */ = { isa = PBXGroup; children = ( + 2939A28F1946ED770064B6A1 /* CocoLoader.cpp */, + 2939A2901946ED770064B6A1 /* CocoLoader.h */, 50FCEB6818C72017004AD434 /* WidgetReader */, 06CAAAC1186AD63B0012A414 /* TriggerObj.h */, 06CAAABC186AD63B0012A414 /* TriggerBase.cpp */, @@ -4995,6 +5003,7 @@ 50FCEBAD18C72017004AD434 /* PageViewReader.h in Headers */, 1A5702F4180BCE750088DEC7 /* CCTMXObjectGroup.h in Headers */, 50ABBDAF1925AB4100A911A9 /* CCRenderer.h in Headers */, + 2939A2931946ED770064B6A1 /* CocoLoader.h in Headers */, 1A5702F8180BCE750088DEC7 /* CCTMXTiledMap.h in Headers */, 5034CA21191D591100CE6051 /* ccShader_PositionTextureColorAlphaTest.frag in Headers */, 50ABBDA11925AB4100A911A9 /* CCGroupCommand.h in Headers */, @@ -5486,6 +5495,7 @@ 1A5702ED180BCE750088DEC7 /* CCTileMapAtlas.h in Headers */, 1A5702F1180BCE750088DEC7 /* CCTMXLayer.h in Headers */, 5034CA44191D591100CE6051 /* ccShader_Label.vert in Headers */, + 2939A2941946ED770064B6A1 /* CocoLoader.h in Headers */, 1A5702F5180BCE750088DEC7 /* CCTMXObjectGroup.h in Headers */, 1A5702F9180BCE750088DEC7 /* CCTMXTiledMap.h in Headers */, 1AC0269D1914068200FA920D /* ConvertUTF.h in Headers */, @@ -6064,6 +6074,7 @@ 1A570061180BC5A10088DEC7 /* CCAction.cpp in Sources */, 50ABBEC51925AB6F00A911A9 /* etc1.cpp in Sources */, 50FCEB9718C72017004AD434 /* CheckBoxReader.cpp in Sources */, + 2939A2911946ED770064B6A1 /* CocoLoader.cpp in Sources */, 1A570065180BC5A10088DEC7 /* CCActionCamera.cpp in Sources */, 50ABBEAB1925AB6F00A911A9 /* ccTypes.cpp in Sources */, 1A570069180BC5A10088DEC7 /* CCActionCatmullRom.cpp in Sources */, @@ -6715,6 +6726,7 @@ 50FCEBAC18C72017004AD434 /* PageViewReader.cpp in Sources */, 1A8C598C180E930E00EF57C3 /* CCActionFrame.cpp in Sources */, 1A8C5990180E930E00EF57C3 /* CCActionFrameEasing.cpp in Sources */, + 2939A2921946ED770064B6A1 /* CocoLoader.cpp in Sources */, 29CB8F4D1929D1BB00C841D6 /* UILayoutManager.cpp in Sources */, 50FCEBA418C72017004AD434 /* ListViewReader.cpp in Sources */, 1A8C5994180E930E00EF57C3 /* CCActionManagerEx.cpp in Sources */, diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index ae22293c98..e2bcc381b1 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -293,7 +293,7 @@ Widget* GUIReader::widgetFromBinaryFile(const char *fileName) stExpCocoNode* tpRootCocoNode = tCocoLoader.GetRootCocoNode(); rapidjson::Type tType = tpRootCocoNode->GetType(&tCocoLoader); - if (rapidjson::kObjectType == tType) + if (rapidjson::kObjectType == tType || rapidjson::kArrayType == tType) { stExpCocoNode *tpChildArray = tpRootCocoNode->GetChildArray(); @@ -1249,47 +1249,52 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s } //parse children - auto childrenArray = stChildArray[2].GetChildArray(); + stExpCocoNode* childrenArray = &stChildArray[2]; if (nullptr != childrenArray) { - int childrenCount = childrenArray->GetChildNum(); - for (int i=0; i < childrenCount; ++i) { - rapidjson::Type tType = childrenArray[i].GetType(pCocoLoader); + rapidjson::Type tType22 = stChildArray[2].GetType(pCocoLoader); + if (tType22 == rapidjson::kArrayType) { - if (tType == rapidjson::kObjectType) { + int childrenCount = childrenArray->GetChildNum(); + stExpCocoNode* innerChildArray = childrenArray->GetChildArray(); + for (int i=0; i < childrenCount; ++i) { + rapidjson::Type tType = innerChildArray[i].GetType(pCocoLoader); - Widget *child = widgetFromBinary(pCocoLoader, &childrenArray[i]); - - if (child) - { - PageView* pageView = dynamic_cast(widget); - if (pageView) + if (tType == rapidjson::kObjectType) { + + Widget *child = widgetFromBinary(pCocoLoader, &innerChildArray[i]); + + if (child) { - pageView->addPage(static_cast(child)); - } - else - { - ListView* listView = dynamic_cast(widget); - if (listView) + PageView* pageView = dynamic_cast(widget); + if (pageView) { - listView->pushBackCustomItem(child); + pageView->addPage(static_cast(child)); } else { - if (!dynamic_cast(widget)) + ListView* listView = dynamic_cast(widget); + if (listView) { - if (child->getPositionType() == ui::Widget::PositionType::PERCENT) - { - child->setPositionPercent(Vec2(child->getPositionPercent().x + widget->getAnchorPoint().x, - child->getPositionPercent().y + widget->getAnchorPoint().y)); - } - child->setPosition(Vec2(child->getPositionX() + widget->getAnchorPointInPoints().x, - child->getPositionY() + widget->getAnchorPointInPoints().y)); + listView->pushBackCustomItem(child); + } + else + { + if (!dynamic_cast(widget)) + { + if (child->getPositionType() == ui::Widget::PositionType::PERCENT) + { + child->setPositionPercent(Vec2(child->getPositionPercent().x + widget->getAnchorPoint().x, + child->getPositionPercent().y + widget->getAnchorPoint().y)); + } + child->setPosition(Vec2(child->getPositionX() + widget->getAnchorPointInPoints().x, + child->getPositionY() + widget->getAnchorPointInPoints().y)); + } + widget->addChild(child); } - widget->addChild(child); } } + } - } } } @@ -1375,7 +1380,7 @@ Widget* WidgetPropertiesReader0300::widgetFromJsonDictionary(const rapidjson::Va const char* classname = DICTOOL->getStringValue_json(data, "classname"); const rapidjson::Value& uiOptions = DICTOOL->getSubDictionary_json(data, "options"); Widget* widget = this->createGUI(classname); - + CCLOG("classname = %s", classname); std::string readerName = this->getWidgetReaderClassName(classname); WidgetReaderProtocol* reader = this->createWidgetReaderProtocol(readerName); diff --git a/cocos/editor-support/cocostudio/CocoLoader.cpp b/cocos/editor-support/cocostudio/CocoLoader.cpp index 34f0ca4a54..c2d088d58c 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.cpp +++ b/cocos/editor-support/cocostudio/CocoLoader.cpp @@ -23,7 +23,6 @@ ****************************************************************************/ #include "CocoLoader.h" -#include namespace cocostudio { const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; @@ -38,10 +37,12 @@ namespace cocostudio { stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDesc(); if( m_AttribIndex >= 0 ) { - tType = tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray[m_AttribIndex].m_Type; - if(rapidjson::kFalseType == tType || rapidjson::kTrueType == tType) + stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray; + tType = tpAttribDescArray[m_AttribIndex].m_Type; + if(rapidjson::kFalseType == tType || rapidjson::kTrueType == tType) { - if(m_szValue[0] == '0') + char* szValue = (char*)m_szValue; + if(szValue[0] == '0') { return rapidjson::kFalseType; } @@ -66,7 +67,8 @@ namespace cocostudio { if(rapidjson::kFalseType == tType || rapidjson::kTrueType == tType) { - if(m_szValue[0] == '0') + char* szValue = (char*)m_szValue; + if(szValue[0] == '0') { return rapidjson::kFalseType; } @@ -92,68 +94,73 @@ namespace cocostudio { stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDesc(); if( m_AttribIndex >= 0 ) { - szName = tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray[m_AttribIndex].m_szName; + stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray; + szName = (char*)tpAttribDescArray[m_AttribIndex].m_szName; } else { - if(m_szValue[0]) - { - szName = m_szValue; - } - else - { - szName = tpCocoObjectDesc[m_ObjIndex].m_szName; - } + //Èç¹ûÃû×ÖÓëÀàÃû³Æ²»Í¬£¬Ôò°´ÕæʵֵÉèÖà + char* szValue = (char*)m_szValue; + if(szValue[0]) + { + //Êý×é + szName = (char*)m_szValue; + } + else + { + //½á¹¹ + szName = (char*)tpCocoObjectDesc[m_ObjIndex].m_szName; + } } } else { - if(m_AttribIndex >= 0) - { - char* pStringAddr = (char*)pCoco->GetCocoObjectDesc() + pCoco->GetFileHeader()->m_lStringMemAddr ; - szName = (char*)((unsigned long)m_ChildArray + pStringAddr); - } - else - { - szName = m_szValue; - } + if(m_AttribIndex >= 0) + { + char* pStringAddr = (char*)pCoco->GetCocoObjectDesc() + pCoco->GetFileHeader()->m_lStringMemAddr ; + szName = m_ChildArray + pStringAddr; + } + else + { + szName = (char*)m_szValue; + } } return szName ; } char* stExpCocoNode::GetValue() { - return m_szValue; + return (char*)m_szValue; } int stExpCocoNode::GetChildNum() { - return m_ChildNum; + return m_ChildNum; } stExpCocoNode* stExpCocoNode::GetChildArray() { - return m_ChildArray; + return (stExpCocoNode*)m_ChildArray; } void stExpCocoNode::ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr) { - m_szValue = (char*)((unsigned long)m_szValue + pStringMemoryAddr); - - - if( -1 == m_AttribIndex ) - { - if(m_ChildNum > 0) - { - m_ChildArray = (stExpCocoNode*)((unsigned long)(m_ChildArray) + pCocoNodeAddr ); - } - - for(int i = 0 ; i < m_ChildNum ; i++) - { - m_ChildArray[i].ReBuild(pCocoNodeAddr,pStringMemoryAddr); - } - } + m_szValue = m_szValue + (uint64_t)pStringMemoryAddr; + //Èç¹ûÊÇÎïÌå»òÊý×飬·Ö×é×Ó½áµã + if( -1 == m_AttribIndex ) + { + if(m_ChildNum > 0) + { + m_ChildArray = m_ChildArray + (uint64_t)pCocoNodeAddr; + + stExpCocoNode* tpChildArray = (stExpCocoNode*)m_ChildArray; + for(int i = 0 ; i < m_ChildNum ; i++) + { + tpChildArray[i].ReBuild(pCocoNodeAddr,pStringMemoryAddr); + } + } + } } @@ -172,7 +179,6 @@ namespace cocostudio { { //Type char* pTempBuff = pBinBuff; - m_pFileHeader = (stCocoFileHeader*)pTempBuff; pTempBuff += sizeof(stCocoFileHeader); @@ -186,8 +192,7 @@ namespace cocostudio { char* pStringAddr = pStartAddr + m_pFileHeader->m_lStringMemAddr ; m_pRootNode = (stExpCocoNode*)pCocoMemAddr; - std::cout<<"header size = "<registerType(*this); -} - -ObjectFactory::TInfo::TInfo(const TInfo &t) -{ - _class = t._class; - _fun = t._fun; -} - -ObjectFactory::TInfo::~TInfo(void) -{ - _class = ""; - _fun = nullptr; -} - -ObjectFactory::TInfo& ObjectFactory::TInfo::operator= (const TInfo &t) -{ - _class = t._class; - _fun = t._fun; - return *this; -} - - -ObjectFactory* ObjectFactory::_sharedFactory = nullptr; - -ObjectFactory::ObjectFactory(void) -{ - -} - -ObjectFactory::~ObjectFactory(void) -{ - _typeMap.clear(); -} - -ObjectFactory* ObjectFactory::getInstance() -{ - if ( nullptr == _sharedFactory) - { - _sharedFactory = new ObjectFactory(); - } - return _sharedFactory; -} - -void ObjectFactory::destroyInstance() -{ - CC_SAFE_DELETE(_sharedFactory); -} - -Ref* ObjectFactory::createObject(const std::string &name) -{ - Ref *o = nullptr; - do - { - const TInfo t = _typeMap[name]; - CC_BREAK_IF(t._fun == nullptr); - o = t._fun(); - } while (0); - - return o; -} - -Component* ObjectFactory::createComponent(const std::string &name) -{ - std::string comName; - if (name == "CCSprite" || name == "CCTMXTiledMap" || name == "CCParticleSystemQuad" || name == "CCArmature" || name == "GUIComponent") - { - comName = "ComRender"; - } - else if (name == "CCComAudio" || name == "CCBackgroundAudio") - { - comName = "ComAudio"; - } - else if (name == "CCComController") - { - comName = "ComController"; - } - else if (name == "CCComAttribute") - { - comName = "ComAttribute"; - } - else if (name == "CCScene") - { - comName = "Scene"; - } - else - { - CCASSERT(false, "Unregistered Component!"); - } - Ref *o = NULL; - do - { - const TInfo t = _typeMap[comName]; - CC_BREAK_IF(t._fun == NULL); - o = t._fun(); - } while (0); - - return (Component*)o; - -} - -ui::Widget* ObjectFactory::createGUI(std::string name) -{ - Ref* object = nullptr; - - if (name == "Panel") - { - name = "Layout"; - } - else if (name == "TextArea") - { - name = "Text"; - } - else if (name == "TextButton") - { - name = "Button"; - } - else if (name == "Label") - { - name = "Text"; - } - else if (name == "LabelAtlas") - { - name = "TextAtlas"; - } - else if (name == "LabelBMFont") - { - name = "TextBMFont"; - } - - do - { - const TInfo t = _typeMap[name]; - CC_BREAK_IF(t._fun == NULL); - object = t._fun(); - } while (0); - - return static_cast(object); -} - -WidgetReaderProtocol* ObjectFactory::createWidgetReaderProtocol(std::string name) -{ - Ref* object = NULL; - - do - { - const TInfo t = _typeMap[name]; - CC_BREAK_IF(t._fun == NULL); - object = t._fun(); - } while (0); - - return dynamic_cast(object); -} - -void ObjectFactory::registerType(const TInfo &t) -{ - _typeMap.insert(std::make_pair(t._class, t)); -} - -} diff --git a/cocos/editor-support/cocostudio/ObjectFactory.h b/cocos/editor-support/cocostudio/ObjectFactory.h deleted file mode 100644 index 3d6c675ec7..0000000000 --- a/cocos/editor-support/cocostudio/ObjectFactory.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -Copyright (c) 2013-2014 Chukong Technologies Inc. - -http://www.cocos2d-x.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -****************************************************************************/ - -#ifndef __TRIGGERFACTORY_H__ -#define __TRIGGERFACTORY_H__ - -#include "cocos2d.h" -#include -#include - -namespace cocos2d -{ - namespace ui - { - class Widget; - } -} -namespace cocostudio -{ - class WidgetReaderProtocol; -} - -namespace cocostudio { - -class ObjectFactory -{ -public: - typedef cocos2d::Ref* (*Instance)(void); - struct TInfo - { - TInfo(void); - TInfo(const std::string& type, Instance ins = NULL); - TInfo(const TInfo &t); - ~TInfo(void); - TInfo& operator= (const TInfo &t); - std::string _class; - Instance _fun; - }; - typedef std::unordered_map FactoryMap; - - static ObjectFactory* getInstance(); - static void destroyInstance(); - cocos2d::Ref* createObject(const std::string &name); - cocos2d::Component* createComponent(const std::string &name); - cocos2d::ui::Widget* createGUI(std::string name); - WidgetReaderProtocol* createWidgetReaderProtocol(std::string name); - void registerType(const TInfo &t); - void removeAll(); - -protected: - ObjectFactory(void); - virtual ~ObjectFactory(void); -private: - static ObjectFactory *_sharedFactory; - FactoryMap _typeMap; -}; - -} - -#endif diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index a1d9e574ad..ea4e07c0ec 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -45,14 +45,132 @@ namespace cocostudio stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + this->beginSetBasicProperties(widget); + float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; int cri = 255, cgi = 255, cbi = 255; float scale9Width = 0.0f, scale9Height = 0.0f; for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); + CCLOG("Button: key = %s, value = %s", key.c_str(), value.c_str()); + + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } - if (key == "scale9Enable") { + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + + + else if (key == "scale9Enable") { button->setScale9Enabled(valueToBool(value)); } else if (key == "normalData"){ @@ -119,6 +237,8 @@ namespace cocostudio } //end of for loop + this->endSetBasicProperties(widget); + if (button->isScale9Enabled()) { button->setCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); button->setSize(Size(scale9Width, scale9Height)); @@ -126,6 +246,7 @@ namespace cocostudio button->setTitleColor(Color3B(cri, cgi, cbi)); + } void ButtonReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index 6e7e251825..c92dc6cefd 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -34,17 +34,129 @@ namespace cocostudio void CheckBoxReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) { - WidgetReader::setBasicPropsFromBinary(widget, pCocoLoader, pCocoNode); CheckBox *checkBox = static_cast(widget); - + this->beginSetBasicProperties(widget); stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "backGroundBoxData"){ + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } + + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if (key == "backGroundBoxData"){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -96,7 +208,7 @@ namespace cocostudio // } } - WidgetReader::setColorPropsFromBinary(widget, pCocoLoader, pCocoNode); + this->endSetBasicProperties(widget); } @@ -106,7 +218,6 @@ namespace cocostudio WidgetReader::setPropsFromJsonDictionary(widget, options); CheckBox* checkBox = static_cast(widget); - //load background image const rapidjson::Value& backGroundDic = DICTOOL->getSubDictionary_json(options, "backGroundBoxData"); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 3aa73eb8b5..c40b892c05 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -37,7 +37,7 @@ namespace cocostudio WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); ImageView* imageView = static_cast(widget); - + this->beginSetBasicProperties(widget); float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); @@ -45,19 +45,132 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); +// CCLOG("ImageView: key = %s, value = %s", key.c_str(), value.c_str()); + + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } - if (key == "scale9Enable") { + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if (key == "scale9Enable") { imageView->setScale9Enabled(valueToBool(value)); } else if (key == "fileNameData"){ - stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); - + imageView->loadTexture(backgroundValue, imageFileNameType); } @@ -81,6 +194,8 @@ namespace cocostudio if (imageView->isScale9Enabled()) { imageView->setCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); } + + this->endSetBasicProperties(widget); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index a6440e0f81..723bf1323e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -41,6 +41,7 @@ namespace cocostudio float w = 0, h= 0; stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + this->beginSetBasicProperties(widget); int cr=0, cg = 0, cb = 0; int scr=0, scg=0, scb=0; @@ -53,8 +54,121 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); + CCLOG("Layout: key = %s, value = %s", key.c_str(), value.c_str()); + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } - if (key == "adaptScreen") { + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if (key == "adaptScreen") { isAdaptScreen = valueToBool(value); } else if(key == "width"){ @@ -106,8 +220,9 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + CCLOG("Layout : image =%s", backgroundValue.c_str()); - panel->setBackGroundImage(backgroundValue,imageFileNameType); + panel->setBackGroundImage(backgroundValue, imageFileNameType); } }else if(key == "capInsetsX"){ @@ -123,7 +238,7 @@ namespace cocostudio } } - + Size screenSize = Director::getInstance()->getWinSize(); if (isAdaptScreen) { w = screenSize.width; @@ -140,6 +255,7 @@ namespace cocostudio } panel->setLayoutType(layoutType); + this->endSetBasicProperties(widget); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp index c4294adef5..7bcec3f422 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp @@ -45,7 +45,7 @@ namespace cocostudio std::string value = stChildArray[i].GetValue(); if (key == "direction") { - listView->setDirection((ScrollView::Direction)valueToInt(value)); + listView->setDirection((ScrollView::Direction)valueToFloat(value)); } else if(key == "gravity"){ listView->setGravity((ListView::Gravity)valueToInt(value)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp index e74299727d..dd15962041 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp @@ -38,7 +38,7 @@ namespace cocostudio WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); LoadingBar* loadingBar = static_cast(widget); - + this->beginSetBasicProperties(widget); float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); @@ -47,7 +47,120 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "scale9Enable") { + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } + + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if (key == "scale9Enable") { loadingBar->setScale9Enabled(valueToBool(value)); } else if (key == "textureData"){ @@ -81,6 +194,8 @@ namespace cocostudio if (loadingBar->isScale9Enabled()) { loadingBar->setCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); } + + this->endSetBasicProperties(widget); } void LoadingBarReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp index 548318a3b7..e1c67f9673 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp @@ -34,29 +34,143 @@ namespace cocostudio void ScrollViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) { + //TODO::need to refactor... LayoutReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); ScrollView* scrollView = static_cast(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); - + float innerWidth; + float innerHeight; for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } - if (key == "innerWidth") { - scrollView->setInnerContainerSize(Size(valueToFloat(value), scrollView->getInnerContainerSize().height)); + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if (key == "innerWidth") { + innerWidth = valueToFloat(value); } else if(key == "innerHeight"){ - scrollView->setInnerContainerSize(Size(scrollView->getInnerContainerSize().height, valueToFloat(value) )); + innerHeight = valueToFloat(value); }else if(key == "direction"){ - scrollView->setDirection((ScrollView::Direction)valueToInt(value)); + scrollView->setDirection((ScrollView::Direction)valueToFloat(value)); }else if(key == "bounceEnable"){ scrollView->setBounceEnabled(valueToBool(value)); } } //end of for loop + scrollView->setInnerContainerSize(Size(innerWidth, innerHeight)); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index 8007a09402..e6e2f0cffc 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -34,7 +34,7 @@ namespace cocostudio void SliderReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + this->beginSetBasicProperties(widget); Slider* slider = static_cast(widget); @@ -45,7 +45,121 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "scale9Enable") { + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } + + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + //control custom properties + else if (key == "scale9Enable") { slider->setScale9Enabled(valueToBool(value)); } else if(key == "percent"){ @@ -109,6 +223,8 @@ namespace cocostudio if (slider->isScale9Enabled()) { slider->setSize(Size(barLength, slider->getContentSize().height)); } + + this->endSetBasicProperties(widget); } void SliderReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp index 3156e6ab53..ead7db5f26 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp @@ -34,7 +34,7 @@ namespace cocostudio void TextAtlasReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + this->beginSetBasicProperties(widget); TextAtlas* labelAtlas = static_cast(widget); @@ -49,8 +49,122 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); +// CCLOG("LabelAtlas: key = %s, value = %s", key.c_str(), value.c_str()); + + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } - if (key == "stringValue") { + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if (key == "stringValue") { stringValue = value; } else if(key == "charMapFileData"){ @@ -76,6 +190,7 @@ namespace cocostudio if (type == (Widget::TextureResType)0) { labelAtlas->setProperty(stringValue, charMapFileName, itemWidth, itemHeight, startCharMap); } + this->endSetBasicProperties(widget); } void TextAtlasReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp index 91e4c47368..eeefd20ec1 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp @@ -34,7 +34,7 @@ namespace cocostudio void TextBMFontReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + this->beginSetBasicProperties(widget); TextBMFont* labelBMFont = static_cast(widget); @@ -45,7 +45,120 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if(key == "fileNameData"){ + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } + + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if(key == "fileNameData"){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -60,7 +173,7 @@ namespace cocostudio labelBMFont->setString(value); } } //end of for loop - + this->endSetBasicProperties(widget); } void TextBMFontReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp index 22e27de32b..3271646939 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp @@ -34,7 +34,7 @@ namespace cocostudio void TextFieldReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + this->beginSetBasicProperties(widget); TextField* textField = static_cast(widget); @@ -44,7 +44,120 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if(key == "placeHolder"){ + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } + + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if(key == "placeHolder"){ textField->setPlaceHolder(value); }else if(key == "text"){ textField->setText(value); @@ -66,6 +179,7 @@ namespace cocostudio textField->setPasswordStyleText(value.c_str()); } } //end of for loop + this->endSetBasicProperties(widget); } void TextFieldReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp index 2c24d630d4..678abc87cf 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp @@ -34,7 +34,7 @@ namespace cocostudio void TextReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + this->beginSetBasicProperties(widget); stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); @@ -44,8 +44,122 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); + CCLOG("Text: key = %s, value = %s", key.c_str(), value.c_str()); + + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + sizePercentX = valueToFloat(value); + }else if(key == "sizePercentY"){ + sizePercentY = valueToFloat(value); + }else if(key == "positionPercentX"){ + positionPercentX = valueToFloat(value); + }else if(key == "positionPercentY"){ + positionPercentY = valueToFloat(value); + } + else if(key == "adaptScreen"){ + isAdaptScreen = valueToBool(value); + } + else if (key == "width"){ + width = valueToFloat(value); + }else if(key == "height"){ + height = valueToFloat(value); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + position.x = valueToFloat(value); + }else if(key == "y"){ + position.y = valueToFloat(value); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); + RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); + Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } - if (key == "touchScaleEnable") { + else if (key == "opacity") { + widget->setOpacity(valueToInt(value)); + }else if(key == "colorR"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + }else if(key == "colorG"){ + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + }else if(key == "colorB") + { + Color3B color = widget->getColor(); + widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + }else if(key == "flipX"){ + widget->setFlippedX(valueToBool(value)); + }else if(key == "flipY"){ + widget->setFlippedY(valueToBool(value)); + }else if(key == "anchorPointX"){ + originalAnchorPoint.x = valueToFloat(value); + }else if(key == "anchorPointY"){ + originalAnchorPoint.y = valueToFloat(value); + } + else if (key == "touchScaleEnable") { label->setTouchScaleChangeEnabled(valueToBool(value)); } @@ -66,6 +180,7 @@ namespace cocostudio } } //end of for loop + this->endSetBasicProperties(widget); } void TextReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index d3606b4449..f8bb8928b7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -164,168 +164,6 @@ namespace cocostudio } } - void WidgetReader::setBasicPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) - { - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); - - - float sizePercentX; - float sizePercentY; - float positionPercentX; - float positionPercentY; - Size screenSize = Director::getInstance()->getWinSize(); - float width ; - float height; - Vec2 position = widget->getPosition(); - bool isAdaptScreen = false; - - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); - std::string value = stChildArray[i].GetValue(); - - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - width = valueToFloat(value); - }else if(key == "height"){ - height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; -// CCLOG("%s", widgetName.c_str()); - widget->setName(widgetName); - }else if(key == "x"){ - position.x = valueToFloat(value); - }else if(key == "y"){ - position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } - } - - widget->setPositionPercent(Vec2(positionPercentX, positionPercentY)); - widget->setSizePercent(Vec2(sizePercentX, sizePercentY)); - if (isAdaptScreen) { - width = screenSize.width; - height = screenSize.height; - } - widget->setSize(Size(width, height)); - } - - void WidgetReader::setColorPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) - { - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); - - //set default color - widget->setColor(Color3B(255,255,255)); - - Vec2 originalAnchorPoint = widget->getAnchorPoint(); - - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); - std::string value = stChildArray[i].GetValue(); - - if (key == "opacity") { - widget->setOpacity(valueToInt(value)); - }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); - }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); - }else if(key == "colorB") - { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); - } - } - - widget->setAnchorPoint(originalAnchorPoint); - - } - void WidgetReader::setColorPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { bool op = DICTOOL->checkObjectExist_json(options, "opacity"); @@ -349,6 +187,29 @@ namespace cocostudio widget->setFlippedY(flipY); } + void WidgetReader::beginSetBasicProperties(cocos2d::ui::Widget *widget) + { + position = widget->getPosition(); + //set default color + widget->setColor(Color3B(255,255,255)); + originalAnchorPoint = widget->getAnchorPoint(); + } + + void WidgetReader::endSetBasicProperties(Widget *widget) + { + Size screenSize = Director::getInstance()->getWinSize(); + + widget->setPositionPercent(Vec2(positionPercentX, positionPercentY)); + widget->setSizePercent(Vec2(sizePercentX, sizePercentY)); + if (isAdaptScreen) { + width = screenSize.width; + height = screenSize.height; + } + widget->setSize(Size(width, height)); + widget->setPosition(position); + widget->setAnchorPoint(originalAnchorPoint); + } + std::string WidgetReader::getResourcePath(const rapidjson::Value &dict, const std::string &key, cocos2d::ui::Widget::TextureResType texType) @@ -376,6 +237,9 @@ namespace cocostudio stExpCocoNode *backGroundChildren = pCocoNode->GetChildArray(); std::string backgroundValue = backGroundChildren[0].GetValue(); + if (backgroundValue.size() < 3) { + return ""; + } std::string binaryPath = GUIReader::getInstance()->getFilePath(); @@ -418,6 +282,7 @@ namespace cocostudio widget->setAnchorPoint(Vec2(anchorPointXInFile, anchorPointYInFile)); } } + } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index 818a35b0a7..aa0d5d7105 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -54,13 +54,9 @@ namespace cocostudio virtual void setColorPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setBasicPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); - virtual void setColorPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) { - this->setBasicPropsFromBinary(widget, pCocoLoader, pCocoNode); - this->setColorPropsFromBinary(widget, pCocoLoader, pCocoNode); + }; protected: std::string getResourcePath(const rapidjson::Value& dict, @@ -69,10 +65,23 @@ namespace cocostudio std::string getResourcePath(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode, cocos2d::ui::Widget::TextureResType texType); void setAnchorPointForWidget(cocos2d::ui::Widget* widget, const rapidjson::Value&options); + void beginSetBasicProperties(cocos2d::ui::Widget *widget); + void endSetBasicProperties(cocos2d::ui::Widget *widget); + + std::function valueToInt; std::function valueToBool; std::function valueToFloat; - + + float sizePercentX; + float sizePercentY; + float positionPercentX; + float positionPercentY; + float width ; + float height; + cocos2d::Vec2 position; + bool isAdaptScreen; + cocos2d::Vec2 originalAnchorPoint; }; } diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp index a5eb5d92e3..c80344ce3c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp @@ -20,8 +20,8 @@ bool UIButtonTest_Editor::init() { if (UIScene_Editor::init()) { - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); -// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_2(1).json")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp index 5e8d9abff0..8190d8eb8c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp @@ -20,8 +20,8 @@ bool UICheckBoxTest_Editor::init() { if (UIScene_Editor::init()) { -// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.ubi")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_2.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.csb")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_2.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp index 9962471812..89170babb8 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp @@ -21,7 +21,7 @@ bool UISliderTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UISlider_Editor/ui_slider_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UISlider_Editor/ui_slider_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UISlider_Editor/ui_slider_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); From 7a8f27ee0bb44359c86eb303b45f3364abbd42a5 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 11 Jun 2014 14:15:34 +0800 Subject: [PATCH 07/72] remove unused parser code --- .../cocostudio/CCSGUIReader.cpp | 909 +----------------- .../editor-support/cocostudio/CCSGUIReader.h | 66 +- cocos/ui/UILayout.cpp | 66 ++ cocos/ui/UILayout.h | 2 + .../UIButtonTest/UIButtonTest_Editor.cpp | 17 + 5 files changed, 125 insertions(+), 935 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index e2bcc381b1..a9ea05e010 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -393,6 +393,7 @@ void WidgetPropertiesReader::setAnchorPointForWidget(cocos2d::ui::Widget *widget } } + Widget* WidgetPropertiesReader0250::createWidget(const rapidjson::Value& data, const char* fullPath, const char* fileName) { @@ -438,6 +439,12 @@ Widget* WidgetPropertiesReader0250::createWidget(const rapidjson::Value& data, c ActionManagerEx::getInstance()->initWithDictionary(fileName,actions,rootWidget); return widget; } + +cocos2d::ui::Widget* WidgetPropertiesReader0250::createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName) +{ + return nullptr; +} + Widget* WidgetPropertiesReader0250::widgetFromJsonDictionary(const rapidjson::Value&data) { @@ -1445,908 +1452,6 @@ Widget* WidgetPropertiesReader0300::widgetFromJsonDictionary(const rapidjson::Va } return widget; } - -void WidgetPropertiesReader0300::setPropsForWidgetFromJsonDictionary(Widget*widget,const rapidjson::Value&options) -{ - bool ignoreSizeExsit = DICTOOL->checkObjectExist_json(options, "ignoreSize"); - if (ignoreSizeExsit) - { - widget->ignoreContentAdaptWithSize(DICTOOL->getBooleanValue_json(options, "ignoreSize")); - } - - widget->setSizeType((Widget::SizeType)DICTOOL->getIntValue_json(options, "sizeType")); - widget->setPositionType((Widget::PositionType)DICTOOL->getIntValue_json(options, "positionType")); - - widget->setSizePercent(Vec2(DICTOOL->getFloatValue_json(options, "sizePercentX"), DICTOOL->getFloatValue_json(options, "sizePercentY"))); - widget->setPositionPercent(Vec2(DICTOOL->getFloatValue_json(options, "positionPercentX"), DICTOOL->getFloatValue_json(options, "positionPercentY"))); - - float w = DICTOOL->getFloatValue_json(options, "width"); - float h = DICTOOL->getFloatValue_json(options, "height"); - widget->setSize(Size(w, h)); - - widget->setTag(DICTOOL->getIntValue_json(options, "tag")); - widget->setActionTag(DICTOOL->getIntValue_json(options, "actiontag")); - widget->setTouchEnabled(DICTOOL->getBooleanValue_json(options, "touchAble")); - const char* name = DICTOOL->getStringValue_json(options, "name"); - const char* widgetName = name?name:"default"; - widget->setName(widgetName); - float x = DICTOOL->getFloatValue_json(options, "x"); - float y = DICTOOL->getFloatValue_json(options, "y"); - widget->setPosition(Vec2(x,y)); - bool sx = DICTOOL->checkObjectExist_json(options, "scaleX"); - if (sx) - { - widget->setScaleX(DICTOOL->getFloatValue_json(options, "scaleX")); - } - bool sy = DICTOOL->checkObjectExist_json(options, "scaleY"); - if (sy) - { - widget->setScaleY(DICTOOL->getFloatValue_json(options, "scaleY")); - } - bool rt = DICTOOL->checkObjectExist_json(options, "rotation"); - if (rt) - { - widget->setRotation(DICTOOL->getFloatValue_json(options, "rotation")); - } - bool vb = DICTOOL->checkObjectExist_json(options, "visible"); - if (vb) - { - widget->setVisible(DICTOOL->getBooleanValue_json(options, "visible")); - } - int z = DICTOOL->getIntValue_json(options, "ZOrder"); - widget->setLocalZOrder(z); - - bool layout = DICTOOL->checkObjectExist_json(options, "layoutParameter"); - if (layout) - { - const rapidjson::Value& layoutParameterDic = DICTOOL->getSubDictionary_json(options, "layoutParameter"); - int paramType = DICTOOL->getIntValue_json(layoutParameterDic, "type"); - LayoutParameter* parameter = nullptr; - switch (paramType) - { - case 0: - break; - case 1: - { - parameter = LinearLayoutParameter::create(); - int gravity = DICTOOL->getIntValue_json(layoutParameterDic, "gravity"); - ((LinearLayoutParameter*)parameter)->setGravity((LinearLayoutParameter::LinearGravity)gravity); - break; - } - case 2: - { - parameter = RelativeLayoutParameter::create(); - RelativeLayoutParameter* rParameter = (RelativeLayoutParameter*)parameter; - const char* relativeName = DICTOOL->getStringValue_json(layoutParameterDic, "relativeName"); - rParameter->setRelativeName(relativeName); - const char* relativeToName = DICTOOL->getStringValue_json(layoutParameterDic, "relativeToName"); - rParameter->setRelativeToWidgetName(relativeToName); - int align = DICTOOL->getIntValue_json(layoutParameterDic, "align"); - rParameter->setAlign((RelativeLayoutParameter::RelativeAlign)align); - break; - } - default: - break; - } - if (parameter) - { - float mgl = DICTOOL->getFloatValue_json(layoutParameterDic, "marginLeft"); - float mgt = DICTOOL->getFloatValue_json(layoutParameterDic, "marginTop"); - float mgr = DICTOOL->getFloatValue_json(layoutParameterDic, "marginRight"); - float mgb = DICTOOL->getFloatValue_json(layoutParameterDic, "marginDown"); - parameter->setMargin(Margin(mgl, mgt, mgr, mgb)); - widget->setLayoutParameter(parameter); - } - } -} - -void WidgetPropertiesReader0300::setColorPropsForWidgetFromJsonDictionary(Widget *widget, const rapidjson::Value&options) -{ - bool op = DICTOOL->checkObjectExist_json(options, "opacity"); - if (op) - { - widget->setOpacity(DICTOOL->getIntValue_json(options, "opacity")); - } - bool cr = DICTOOL->checkObjectExist_json(options, "colorR"); - bool cg = DICTOOL->checkObjectExist_json(options, "colorG"); - bool cb = DICTOOL->checkObjectExist_json(options, "colorB"); - int colorR = cr ? DICTOOL->getIntValue_json(options, "colorR") : 255; - int colorG = cg ? DICTOOL->getIntValue_json(options, "colorG") : 255; - int colorB = cb ? DICTOOL->getIntValue_json(options, "colorB") : 255; - widget->setColor(Color3B(colorR, colorG, colorB)); - - this->setAnchorPointForWidget(widget, options); - - bool flipX = DICTOOL->getBooleanValue_json(options, "flipX"); - bool flipY = DICTOOL->getBooleanValue_json(options, "flipY"); - widget->setFlippedX(flipX); - widget->setFlippedY(flipY); -} - - - -void WidgetPropertiesReader0300::setPropsForButtonFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - cocos2d::ui::Button* button = static_cast(widget); - bool scale9Enable = DICTOOL->getBooleanValue_json(options, "scale9Enable"); - button->setScale9Enabled(scale9Enable); - - const rapidjson::Value& normalDic = DICTOOL->getSubDictionary_json(options, "normalData"); - int normalType = DICTOOL->getIntValue_json(normalDic, "resourceType"); - switch (normalType) - { - case 0: - { - std::string tp_n = m_strFilePath; - const char* normalFileName = DICTOOL->getStringValue_json(normalDic, "path"); - const char* normalFileName_tp = (normalFileName && (strcmp(normalFileName, "") != 0))?tp_n.append(normalFileName).c_str():nullptr; - button->loadTextureNormal(normalFileName_tp); - break; - } - case 1: - { - const char* normalFileName = DICTOOL->getStringValue_json(normalDic, "path"); - button->loadTextureNormal(normalFileName,TextureResType::PLIST); - break; - } - default: - break; - } - const rapidjson::Value& pressedDic = DICTOOL->getSubDictionary_json(options, "pressedData"); - int pressedType = DICTOOL->getIntValue_json(pressedDic, "resourceType"); - switch (pressedType) - { - case 0: - { - std::string tp_p = m_strFilePath; - const char* pressedFileName = DICTOOL->getStringValue_json(pressedDic, "path"); - const char* pressedFileName_tp = (pressedFileName && (strcmp(pressedFileName, "") != 0))?tp_p.append(pressedFileName).c_str():nullptr; - button->loadTexturePressed(pressedFileName_tp); - break; - } - case 1: - { - const char* pressedFileName = DICTOOL->getStringValue_json(pressedDic, "path"); - button->loadTexturePressed(pressedFileName,TextureResType::PLIST); - break; - } - default: - break; - } - const rapidjson::Value& disabledDic = DICTOOL->getSubDictionary_json(options, "disabledData"); - int disabledType = DICTOOL->getIntValue_json(disabledDic, "resourceType"); - switch (disabledType) - { - case 0: - { - std::string tp_d = m_strFilePath; - const char* disabledFileName = DICTOOL->getStringValue_json(disabledDic, "path"); - const char* disabledFileName_tp = (disabledFileName && (strcmp(disabledFileName, "") != 0))?tp_d.append(disabledFileName).c_str():nullptr; - button->loadTextureDisabled(disabledFileName_tp); - break; - } - case 1: - { - const char* disabledFileName = DICTOOL->getStringValue_json(disabledDic, "path"); - button->loadTextureDisabled(disabledFileName,TextureResType::PLIST); - break; - } - default: - break; - } - if (scale9Enable) - { - float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); - float cy = DICTOOL->getFloatValue_json(options, "capInsetsY"); - float cw = DICTOOL->getFloatValue_json(options, "capInsetsWidth"); - float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); - - button->setCapInsets(Rect(cx, cy, cw, ch)); - bool sw = DICTOOL->checkObjectExist_json(options, "scale9Width"); - bool sh = DICTOOL->checkObjectExist_json(options, "scale9Height"); - if (sw && sh) - { - float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); - float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); - button->setSize(Size(swf, shf)); - } - } - bool tt = DICTOOL->checkObjectExist_json(options, "text"); - if (tt) - { - const char* text = DICTOOL->getStringValue_json(options, "text"); - if (text) - { - button->setTitleText(text); - } - } - - bool cr = DICTOOL->checkObjectExist_json(options, "textColorR"); - bool cg = DICTOOL->checkObjectExist_json(options, "textColorG"); - bool cb = DICTOOL->checkObjectExist_json(options, "textColorB"); - int cri = cr?DICTOOL->getIntValue_json(options, "textColorR"):255; - int cgi = cg?DICTOOL->getIntValue_json(options, "textColorG"):255; - int cbi = cb?DICTOOL->getIntValue_json(options, "textColorB"):255; - button->setTitleColor(Color3B(cri,cgi,cbi)); - bool fs = DICTOOL->checkObjectExist_json(options, "fontSize"); - if (fs) - { - button->setTitleFontSize(DICTOOL->getIntValue_json(options, "fontSize")); - } - bool fn = DICTOOL->checkObjectExist_json(options, "fontName"); - if (fn) - { - button->setTitleFontName(DICTOOL->getStringValue_json(options, "fontName")); - } - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForCheckBoxFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - CheckBox* checkBox = static_cast(widget); - - const rapidjson::Value& backGroundDic = DICTOOL->getSubDictionary_json(options, "backGroundBoxData"); - int backGroundType = DICTOOL->getIntValue_json(backGroundDic, "resourceType"); - switch (backGroundType) - { - case 0: - { - std::string tp_b = m_strFilePath; - const char* backGroundFileName = DICTOOL->getStringValue_json(backGroundDic, "path"); - const char* backGroundFileName_tp = (backGroundFileName && (strcmp(backGroundFileName, "") != 0))?tp_b.append(backGroundFileName).c_str():nullptr; - checkBox->loadTextureBackGround(backGroundFileName_tp); - break; - } - case 1: - { - const char* backGroundFileName = DICTOOL->getStringValue_json(backGroundDic, "path"); - checkBox->loadTextureBackGround(backGroundFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - const rapidjson::Value& backGroundSelectedDic = DICTOOL->getSubDictionary_json(options, "backGroundBoxSelectedData"); - int backGroundSelectedType = DICTOOL->getIntValue_json(backGroundSelectedDic, "resourceType"); - switch (backGroundSelectedType) - { - case 0: - { - std::string tp_bs = m_strFilePath; - const char* backGroundSelectedFileName = DICTOOL->getStringValue_json(backGroundSelectedDic, "path"); - const char* backGroundSelectedFileName_tp = (backGroundSelectedFileName && (strcmp(backGroundSelectedFileName, "") != 0))?tp_bs.append(backGroundSelectedFileName).c_str():nullptr; - checkBox->loadTextureBackGroundSelected(backGroundSelectedFileName_tp); - break; - } - case 1: - { - const char* backGroundSelectedFileName = DICTOOL->getStringValue_json(backGroundSelectedDic, "path"); - checkBox->loadTextureBackGroundSelected(backGroundSelectedFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - const rapidjson::Value& frontCrossDic = DICTOOL->getSubDictionary_json(options, "frontCrossData"); - int frontCrossType = DICTOOL->getIntValue_json(frontCrossDic, "resourceType"); - switch (frontCrossType) - { - case 0: - { - std::string tp_c = m_strFilePath; - const char* frontCrossFileName = DICTOOL->getStringValue_json(frontCrossDic, "path"); - const char* frontCrossFileName_tp = (frontCrossFileName && (strcmp(frontCrossFileName, "") != 0))?tp_c.append(frontCrossFileName).c_str():nullptr; - checkBox->loadTextureFrontCross(frontCrossFileName_tp); - break; - } - case 1: - { - const char* frontCrossFileName = DICTOOL->getStringValue_json(frontCrossDic, "path"); - checkBox->loadTextureFrontCross(frontCrossFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - const rapidjson::Value& backGroundDisabledDic = DICTOOL->getSubDictionary_json(options, "backGroundBoxDisabledData"); - int backGroundDisabledType = DICTOOL->getIntValue_json(backGroundDisabledDic, "resourceType"); - switch (backGroundDisabledType) - { - case 0: - { - std::string tp_bd = m_strFilePath; - const char* backGroundDisabledFileName = DICTOOL->getStringValue_json(backGroundDisabledDic, "path"); - const char* backGroundDisabledFileName_tp = (backGroundDisabledFileName && (strcmp(backGroundDisabledFileName, "") != 0))?tp_bd.append(backGroundDisabledFileName).c_str():nullptr; - checkBox->loadTextureBackGroundDisabled(backGroundDisabledFileName_tp); - break; - } - case 1: - { - const char* backGroundDisabledFileName = DICTOOL->getStringValue_json(backGroundDisabledDic, "path"); - checkBox->loadTextureBackGroundDisabled(backGroundDisabledFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - const rapidjson::Value& frontCrossDisabledDic = DICTOOL->getSubDictionary_json(options, "frontCrossDisabledData"); - int frontCrossDisabledType = DICTOOL->getIntValue_json(frontCrossDisabledDic, "resourceType"); - switch (frontCrossDisabledType) - { - case 0: - { - std::string tp_cd = m_strFilePath; - const char* frontCrossDisabledFileName = DICTOOL->getStringValue_json(options, "path"); - const char* frontCrossDisabledFileName_tp = (frontCrossDisabledFileName && (strcmp(frontCrossDisabledFileName, "") != 0))?tp_cd.append(frontCrossDisabledFileName).c_str():nullptr; - checkBox->loadTextureFrontCrossDisabled(frontCrossDisabledFileName_tp); - break; - } - case 1: - { - const char* frontCrossDisabledFileName = DICTOOL->getStringValue_json(options, "path"); - checkBox->loadTextureFrontCrossDisabled(frontCrossDisabledFileName,TextureResType::PLIST); - break; - } - default: - break; - } - checkBox->setSelectedState(DICTOOL->getBooleanValue_json(options, "selectedState")); - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForImageViewFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - - cocos2d::ui::ImageView* imageView = static_cast(widget); - - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "fileNameData"); - int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - switch (imageFileNameType) - { - case 0: - { - std::string tp_i = m_strFilePath; - const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - const char* imageFileName_tp = nullptr; - if (imageFileName && (strcmp(imageFileName, "") != 0)) - { - imageFileName_tp = tp_i.append(imageFileName).c_str(); - imageView->loadTexture(imageFileName_tp); - } - break; - } - case 1: - { - const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - imageView->loadTexture(imageFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - bool scale9EnableExist = DICTOOL->checkObjectExist_json(options, "scale9Enable"); - bool scale9Enable = false; - if (scale9EnableExist) - { - scale9Enable = DICTOOL->getBooleanValue_json(options, "scale9Enable"); - } - imageView->setScale9Enabled(scale9Enable); - - - if (scale9Enable) - { - bool sw = DICTOOL->checkObjectExist_json(options, "scale9Width"); - bool sh = DICTOOL->checkObjectExist_json(options, "scale9Height"); - if (sw && sh) - { - float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); - float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); - imageView->setSize(Size(swf, shf)); - } - - float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); - float cy = DICTOOL->getFloatValue_json(options, "capInsetsY"); - float cw = DICTOOL->getFloatValue_json(options, "capInsetsWidth"); - float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); - - imageView->setCapInsets(Rect(cx, cy, cw, ch)); - - } - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForLabelFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - cocos2d::ui::Text* label = static_cast(widget); - bool touchScaleChangeAble = DICTOOL->getBooleanValue_json(options, "touchScaleEnable"); - label->setTouchScaleChangeEnabled(touchScaleChangeAble); - const char* text = DICTOOL->getStringValue_json(options, "text"); - label->setString(text); - bool fs = DICTOOL->checkObjectExist_json(options, "fontSize"); - if (fs) - { - label->setFontSize(DICTOOL->getIntValue_json(options, "fontSize")); - } - bool fn = DICTOOL->checkObjectExist_json(options, "fontName"); - if (fn) - { - label->setFontName(DICTOOL->getStringValue_json(options, "fontName")); - } - bool aw = DICTOOL->checkObjectExist_json(options, "areaWidth"); - bool ah = DICTOOL->checkObjectExist_json(options, "areaHeight"); - if (aw && ah) - { - Size size = Size(DICTOOL->getFloatValue_json(options, "areaWidth"),DICTOOL->getFloatValue_json(options,"areaHeight")); - label->setTextAreaSize(size); - } - bool ha = DICTOOL->checkObjectExist_json(options, "hAlignment"); - if (ha) - { - label->setTextHorizontalAlignment((TextHAlignment)DICTOOL->getIntValue_json(options, "hAlignment")); - } - bool va = DICTOOL->checkObjectExist_json(options, "vAlignment"); - if (va) - { - label->setTextVerticalAlignment((TextVAlignment)DICTOOL->getIntValue_json(options, "vAlignment")); - } - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForLabelAtlasFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - cocos2d::ui::TextAtlas* labelAtlas = static_cast(widget); - bool sv = DICTOOL->checkObjectExist_json(options, "stringValue"); - bool cmf = DICTOOL->checkObjectExist_json(options, "charMapFile"); - bool iw = DICTOOL->checkObjectExist_json(options, "itemWidth"); - bool ih = DICTOOL->checkObjectExist_json(options, "itemHeight"); - bool scm = DICTOOL->checkObjectExist_json(options, "startCharMap"); - if (sv && cmf && iw && ih && scm) - { - const rapidjson::Value& cmftDic = DICTOOL->getSubDictionary_json(options, "charMapFileData"); - int cmfType = DICTOOL->getIntValue_json(cmftDic, "resourceType"); - switch (cmfType) - { - case 0: - { - std::string tp_c = m_strFilePath; - const char* cmfPath = DICTOOL->getStringValue_json(cmftDic, "path"); - const char* cmf_tp = tp_c.append(cmfPath).c_str(); - labelAtlas->setProperty(DICTOOL->getStringValue_json(options, "stringValue"),cmf_tp,DICTOOL->getIntValue_json(options, "itemWidth"),DICTOOL->getIntValue_json(options,"itemHeight"), DICTOOL->getStringValue_json(options, "startCharMap")); - break; - } - case 1: - CCLOG("Wrong res type of LabelAtlas!"); - break; - default: - break; - } - } - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForLayoutFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - - float w = 0, h = 0; - bool adaptScrenn = DICTOOL->getBooleanValue_json(options, "adaptScreen"); - if (adaptScrenn) - { - Size screenSize = CCDirector::getInstance()->getWinSize(); - w = screenSize.width; - h = screenSize.height; - } - else - { - w = DICTOOL->getFloatValue_json(options, "width"); - h = DICTOOL->getFloatValue_json(options, "height"); - } - - Layout* panel = static_cast(widget); - if (!dynamic_cast(widget) - && !dynamic_cast(widget)) - { - panel->setClippingEnabled(DICTOOL->getBooleanValue_json(options, "clipAble")); - } - bool backGroundScale9Enable = DICTOOL->getBooleanValue_json(options, "backGroundScale9Enable"); - panel->setBackGroundImageScale9Enabled(backGroundScale9Enable); - int cr = DICTOOL->getIntValue_json(options, "bgColorR"); - int cg = DICTOOL->getIntValue_json(options, "bgColorG"); - int cb = DICTOOL->getIntValue_json(options, "bgColorB"); - - int scr = DICTOOL->getIntValue_json(options, "bgStartColorR"); - int scg = DICTOOL->getIntValue_json(options, "bgStartColorG"); - int scb = DICTOOL->getIntValue_json(options, "bgStartColorB"); - - int ecr = DICTOOL->getIntValue_json(options, "bgEndColorR"); - int ecg = DICTOOL->getIntValue_json(options, "bgEndColorG"); - int ecb = DICTOOL->getIntValue_json(options, "bgEndColorB"); - - float bgcv1 = DICTOOL->getFloatValue_json(options, "vectorX"); - float bgcv2 = DICTOOL->getFloatValue_json(options, "vectorY"); - panel->setBackGroundColorVector(Vec2(bgcv1, bgcv2)); - - int co = DICTOOL->getIntValue_json(options, "bgColorOpacity"); - - int colorType = DICTOOL->getIntValue_json(options, "colorType"); - panel->setBackGroundColorType(Layout::BackGroundColorType(colorType)); - panel->setBackGroundColor(Color3B(scr, scg, scb),Color3B(ecr, ecg, ecb)); - panel->setBackGroundColor(Color3B(cr, cg, cb)); - panel->setBackGroundColorOpacity(co); - - - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "backGroundImageData"); - int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - switch (imageFileNameType) - { - case 0: - { - std::string tp_b = m_strFilePath; - const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - const char* imageFileName_tp = (imageFileName && (strcmp(imageFileName, "") != 0))?tp_b.append(imageFileName).c_str():nullptr; - panel->setBackGroundImage(imageFileName_tp); - break; - } - case 1: - { - const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - panel->setBackGroundImage(imageFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - if (backGroundScale9Enable) - { - float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); - float cy = DICTOOL->getFloatValue_json(options, "capInsetsY"); - float cw = DICTOOL->getFloatValue_json(options, "capInsetsWidth"); - float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); - panel->setBackGroundImageCapInsets(Rect(cx, cy, cw, ch)); - } - panel->setLayoutType((Layout::Type)DICTOOL->getIntValue_json(options, "layoutType")); - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForScrollViewFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForLayoutFromJsonDictionary(widget, options); - cocos2d::ui::ScrollView* scrollView = static_cast(widget); - float innerWidth = DICTOOL->getFloatValue_json(options, "innerWidth"); - float innerHeight = DICTOOL->getFloatValue_json(options, "innerHeight"); - scrollView->setInnerContainerSize(Size(innerWidth, innerHeight)); - int direction = DICTOOL->getFloatValue_json(options, "direction"); - scrollView->setDirection((ScrollView::Direction)direction); - scrollView->setBounceEnabled(DICTOOL->getBooleanValue_json(options, "bounceEnable")); - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForSliderFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - cocos2d::ui::Slider* slider = static_cast(widget); - - bool barTextureScale9Enable = DICTOOL->getBooleanValue_json(options, "barTextureScale9Enable"); - slider->setScale9Enabled(barTextureScale9Enable); - bool bt = DICTOOL->checkObjectExist_json(options, "barFileName"); - float barLength = DICTOOL->getFloatValue_json(options, "length"); - if (bt) - { - if (barTextureScale9Enable) - { - - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "barFileNameData"); - int imageFileType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - switch (imageFileType) - { - case 0: - { - std::string tp_b = m_strFilePath; - const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - const char* imageFileName_tp = (imageFileName && (strcmp(imageFileName, "") != 0))?tp_b.append(imageFileName).c_str():nullptr; - slider->loadBarTexture(imageFileName_tp); - break; - } - case 1: - { - const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - slider->loadBarTexture(imageFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - slider->setSize(Size(barLength, slider->getContentSize().height)); - } - else - { - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "barFileNameData"); - int imageFileType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - switch (imageFileType) - { - case 0: - { - std::string tp_b = m_strFilePath; - const char*imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - const char* imageFileName_tp = (imageFileName && (strcmp(imageFileName, "") != 0))?tp_b.append(imageFileName).c_str():nullptr; - slider->loadBarTexture(imageFileName_tp); - break; - } - case 1: - { - const char*imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - slider->loadBarTexture(imageFileName,TextureResType::PLIST); - break; - } - default: - break; - } - } - } - - const rapidjson::Value& normalDic = DICTOOL->getSubDictionary_json(options, "ballNormalData"); - int normalType = DICTOOL->getIntValue_json(normalDic, "resourceType"); - switch (normalType) - { - case 0: - { - std::string tp_n = m_strFilePath; - const char* normalFileName = DICTOOL->getStringValue_json(normalDic, "path"); - const char* normalFileName_tp = (normalFileName && (strcmp(normalFileName, "") != 0))?tp_n.append(normalFileName).c_str():nullptr; - slider->loadSlidBallTextureNormal(normalFileName_tp); - break; - } - case 1: - { - const char* normalFileName = DICTOOL->getStringValue_json(normalDic, "path"); - slider->loadSlidBallTextureNormal(normalFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - const rapidjson::Value& pressedDic = DICTOOL->getSubDictionary_json(options, "ballPressedData"); - int pressedType = DICTOOL->getIntValue_json(pressedDic, "resourceType"); - switch (pressedType) - { - case 0: - { - std::string tp_p = m_strFilePath; - const char* pressedFileName = DICTOOL->getStringValue_json(pressedDic, "path"); - const char* pressedFileName_tp = (pressedFileName && (strcmp(pressedFileName, "") != 0))?tp_p.append(pressedFileName).c_str():nullptr; - slider->loadSlidBallTexturePressed(pressedFileName_tp); - break; - } - case 1: - { - const char* pressedFileName = DICTOOL->getStringValue_json(pressedDic, "path"); - slider->loadSlidBallTexturePressed(pressedFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - const rapidjson::Value& disabledDic = DICTOOL->getSubDictionary_json(options, "ballDisabledData"); - int disabledType = DICTOOL->getIntValue_json(disabledDic, "resourceType"); - switch (disabledType) - { - case 0: - { - std::string tp_d = m_strFilePath; - const char* disabledFileName = DICTOOL->getStringValue_json(disabledDic, "path"); - const char* disabledFileName_tp = (disabledFileName && (strcmp(disabledFileName, "") != 0))?tp_d.append(disabledFileName).c_str():nullptr; - slider->loadSlidBallTextureDisabled(disabledFileName_tp); - break; - } - case 1: - { - const char* disabledFileName = DICTOOL->getStringValue_json(disabledDic, "path"); - slider->loadSlidBallTextureDisabled(disabledFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - slider->setPercent(DICTOOL->getIntValue_json(options, "percent")); - - const rapidjson::Value& progressBarDic = DICTOOL->getSubDictionary_json(options, "progressBarData"); - int progressBarType = DICTOOL->getIntValue_json(progressBarDic, "resourceType"); - switch (progressBarType) - { - case 0: - { - std::string tp_b = m_strFilePath; - const char* imageFileName = DICTOOL->getStringValue_json(progressBarDic, "path"); - const char* imageFileName_tp = (imageFileName && (strcmp(imageFileName, "") != 0))?tp_b.append(imageFileName).c_str():nullptr; - slider->loadProgressBarTexture(imageFileName_tp); - break; - } - case 1: - { - const char* imageFileName = DICTOOL->getStringValue_json(progressBarDic, "path"); - slider->loadProgressBarTexture(imageFileName,TextureResType::PLIST); - break; - } - default: - break; - } - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForTextFieldFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - cocos2d::ui::TextField* textField = static_cast(widget); - bool ph = DICTOOL->checkObjectExist_json(options, "placeHolder"); - if (ph) - { - textField->setPlaceHolder(DICTOOL->getStringValue_json(options, "placeHolder")); - } - textField->setText(DICTOOL->getStringValue_json(options, "text")); - bool fs = DICTOOL->checkObjectExist_json(options, "fontSize"); - if (fs) - { - textField->setFontSize(DICTOOL->getIntValue_json(options, "fontSize")); - } - bool fn = DICTOOL->checkObjectExist_json(options, "fontName"); - if (fn) - { - textField->setFontName(DICTOOL->getStringValue_json(options, "fontName")); - } - bool tsw = DICTOOL->checkObjectExist_json(options, "touchSizeWidth"); - bool tsh = DICTOOL->checkObjectExist_json(options, "touchSizeHeight"); - if (tsw && tsh) - { - textField->setTouchSize(Size(DICTOOL->getFloatValue_json(options, "touchSizeWidth"), DICTOOL->getFloatValue_json(options,"touchSizeHeight"))); - } - - float dw = DICTOOL->getFloatValue_json(options, "width"); - float dh = DICTOOL->getFloatValue_json(options, "height"); - if (dw > 0.0f || dh > 0.0f) - { - //textField->setSize(Size(dw, dh)); - } - bool maxLengthEnable = DICTOOL->getBooleanValue_json(options, "maxLengthEnable"); - textField->setMaxLengthEnabled(maxLengthEnable); - - if (maxLengthEnable) - { - int maxLength = DICTOOL->getIntValue_json(options, "maxLength"); - textField->setMaxLength(maxLength); - } - bool passwordEnable = DICTOOL->getBooleanValue_json(options, "passwordEnable"); - textField->setPasswordEnabled(passwordEnable); - if (passwordEnable) - { - textField->setPasswordStyleText(DICTOOL->getStringValue_json(options, "passwordStyleText")); - } - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForLoadingBarFromJsonDictionary(Widget *widget, const rapidjson::Value&options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - cocos2d::ui::LoadingBar* loadingBar = static_cast(widget); - - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "textureData"); - int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - switch (imageFileNameType) - { - case 0: - { - std::string tp_i = m_strFilePath; - const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - const char* imageFileName_tp = nullptr; - if (imageFileName && (strcmp(imageFileName, "") != 0)) - { - imageFileName_tp = tp_i.append(imageFileName).c_str(); - loadingBar->loadTexture(imageFileName_tp); - } - break; - } - case 1: - { - const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path"); - loadingBar->loadTexture(imageFileName,TextureResType::PLIST); - break; - } - default: - break; - } - - /* ui mark add load bar scale9 parse */ - bool scale9Enable = DICTOOL->getBooleanValue_json(options, "scale9Enable"); - loadingBar->setScale9Enabled(scale9Enable); - - if (scale9Enable) - { - float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); - float cy = DICTOOL->getFloatValue_json(options, "capInsetsY"); - float cw = DICTOOL->getFloatValue_json(options, "capInsetsWidth"); - float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); - - loadingBar->setCapInsets(Rect(cx, cy, cw, ch)); - - float width = DICTOOL->getFloatValue_json(options, "width"); - float height = DICTOOL->getFloatValue_json(options, "height"); - loadingBar->setSize(Size(width, height)); - } - /**/ - - loadingBar->setDirection(LoadingBar::Direction(DICTOOL->getIntValue_json(options, "direction"))); - loadingBar->setPercent(DICTOOL->getIntValue_json(options, "percent")); - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForLabelBMFontFromJsonDictionary(Widget *widget, const rapidjson::Value&options) -{ - setPropsForWidgetFromJsonDictionary(widget, options); - - cocos2d::ui::TextBMFont* labelBMFont = static_cast(widget); - - const rapidjson::Value& cmftDic = DICTOOL->getSubDictionary_json(options, "fileNameData"); - int cmfType = DICTOOL->getIntValue_json(cmftDic, "resourceType"); - switch (cmfType) - { - case 0: - { - std::string tp_c = m_strFilePath; - const char* cmfPath = DICTOOL->getStringValue_json(cmftDic, "path"); - const char* cmf_tp = tp_c.append(cmfPath).c_str(); - labelBMFont->setFntFile(cmf_tp); - break; - } - case 1: - CCLOG("Wrong res type of LabelAtlas!"); - break; - default: - break; - } - - const char* text = DICTOOL->getStringValue_json(options, "text"); - labelBMFont->setString(text); - - setColorPropsForWidgetFromJsonDictionary(widget,options); -} - -void WidgetPropertiesReader0300::setPropsForPageViewFromJsonDictionary(Widget*widget,const rapidjson::Value& options) -{ - setPropsForLayoutFromJsonDictionary(widget, options); -} - -void WidgetPropertiesReader0300::setPropsForListViewFromJsonDictionary(Widget* widget, const rapidjson::Value& options) -{ - setPropsForLayoutFromJsonDictionary(widget, options); - - ListView* listView = static_cast(widget); - - float innerWidth = DICTOOL->getFloatValue_json(options, "innerWidth"); - float innerHeight = DICTOOL->getFloatValue_json(options, "innerHeight"); - listView->setInnerContainerSize(Size(innerWidth, innerHeight)); - int direction = DICTOOL->getFloatValue_json(options, "direction"); - listView->setDirection((ScrollView::Direction)direction); - - ListView::Gravity gravity = (ListView::Gravity)DICTOOL->getIntValue_json(options, "gravity"); - listView->setGravity(gravity); - - float itemMargin = DICTOOL->getFloatValue_json(options, "itemMargin"); - listView->setItemsMargin(itemMargin); -} void WidgetPropertiesReader0300::setPropsForAllWidgetFromJsonDictionary(WidgetReaderProtocol *reader, Widget *widget, const rapidjson::Value &options) { diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index 0eb2723b8b..967593cd7c 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -141,9 +141,18 @@ public: virtual cocos2d::ui::Widget* widgetFromJsonDictionary(const rapidjson::Value& dic); //added for binary parsing - virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)override{return nullptr;} - virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode){return nullptr;} - virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) {} + virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode, + const char* fileName)override; + + virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode){return nullptr;} + + virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, + cocos2d::ui::Widget* widget, + CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode) {} + virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, @@ -179,49 +188,40 @@ public: WidgetPropertiesReader0300(){}; virtual ~WidgetPropertiesReader0300(){}; - virtual cocos2d::ui::Widget* createWidget(const rapidjson::Value& dic, const char* fullPath, const char* fileName); + virtual cocos2d::ui::Widget* createWidget(const rapidjson::Value& dic, + const char* fullPath, + const char* fileName); //add bin parse support - virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)override; - virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); - virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode, + const char* fileName)override; + + virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode); + + virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, + cocos2d::ui::Widget* widget, + CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode); + virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, - stExpCocoNode* pCocoNode) {} + stExpCocoNode* pCocoNode) { + //TODO: custom property + } virtual cocos2d::ui::Widget* widgetFromJsonDictionary(const rapidjson::Value& dic); - - - - virtual void setPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget*,const rapidjson::Value& options); - virtual void setColorPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForButtonFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForCheckBoxFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForImageViewFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForLabelFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForLabelAtlasFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForLabelBMFontFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForLoadingBarFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForSliderFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForTextFieldFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); + virtual void setPropsForAllWidgetFromJsonDictionary(WidgetReaderProtocol* reader, + cocos2d::ui::Widget* widget, + const rapidjson::Value& options); - virtual void setPropsForLayoutFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForPageViewFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForScrollViewFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); - virtual void setPropsForListViewFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - - virtual void setPropsForAllWidgetFromJsonDictionary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, const rapidjson::Value& options); virtual void setPropsForAllCustomWidgetFromJsonDictionary(const std::string& classType, cocos2d::ui::Widget* widget, const rapidjson::Value& customOptions); - - - - - }; diff --git a/cocos/ui/UILayout.cpp b/cocos/ui/UILayout.cpp index 74495a8e1b..8a60393037 100644 --- a/cocos/ui/UILayout.cpp +++ b/cocos/ui/UILayout.cpp @@ -1921,6 +1921,72 @@ Widget* Layout::findNextFocusedWidget(FocusDirection direction, Widget* current) return current; } } + void Layout::compareLayout(cocos2d::ui::Layout *layout) + { + CCLOG("positionX: %f, %f",_position.x, layout->getPosition().x ); + CCLOG("positionY: %f, %f", _position.y, layout->getPosition().y); + CCLOG("ignoreSize: %d, %d ", this->isIgnoreContentAdaptWithSize(), layout->isIgnoreContentAdaptWithSize()); + CCLOG("sizeType: %d, %d", this->getSizeType(), layout->getSizeType()); + CCLOG("positionType: %d, %d", this->getPositionType(), layout->getPositionType()); + CCLOG("sizePercentX: %f, %f", this->getSizePercent().x, layout->getSizePercent().x); + CCLOG("sizePercentY: %f, %f", this->getSizePercent().y, layout->getSizePercent().y); + CCLOG("positionPercentX: %f, %f", this->getPositionPercent().x, layout->getPositionPercent().x); + CCLOG("positionPercentY: %f, %f", this->getPositionPercent().y, layout->getPositionPercent().y); + CCLOG("width: %f, %f", this->getSize().width, layout->getSize().width); + CCLOG("height: %f, %f", this->getSize().height, layout->getSize().height); + CCLOG("tag: %d, %d,", this->getTag(), layout->getTag()); + CCLOG("actionTag: %d, %d" , this->getActionTag(), layout->getActionTag()); + CCLOG("touchAble: %d, %d", this->isTouchEnabled(), layout->isTouchEnabled()); + CCLOG("name: %s, %s", this->getName().c_str(), layout->getName().c_str()); + CCLOG("scaleX: %f, %f", this->getScaleX(), layout->getScaleX()); + CCLOG("scaleY: %f, %f", this->getScaleY(), layout->getScaleY()); + CCLOG("rotation: %f, %f", this->getRotation(), layout->getRotation()); + CCLOG("visible: %d, %d", this->isVisible(), layout->isVisible()); + CCLOG("ZOrder: %d, %d", this->getZOrder(), layout->getZOrder()); + if (this->getLayoutParameter()) { + if (dynamic_cast(this->getLayoutParameter())) { + CCLOG("Gravity: %d, %d", ((LinearLayoutParameter*)this->getLayoutParameter())->getGravity(), + ((LinearLayoutParameter*)layout->getLayoutParameter())->getGravity()); + } + if (dynamic_cast(this->getLayoutParameter())) { + CCLOG("relativeName: %s, %s", ((RelativeLayoutParameter*)this->getLayoutParameter())->getRelativeName().c_str(), + ((RelativeLayoutParameter*)layout->getLayoutParameter())->getRelativeName().c_str()); + CCLOG("relativeToWidgetName: %s, %s", ((RelativeLayoutParameter*)this->getLayoutParameter())->getRelativeToWidgetName().c_str(), + ((RelativeLayoutParameter*)layout->getLayoutParameter())->getRelativeToWidgetName().c_str()); + CCLOG("Align: %d, %d", ((RelativeLayoutParameter*)this->getLayoutParameter())->getAlign(), + ((RelativeLayoutParameter*)layout->getLayoutParameter())->getAlign()); + } + CCLOG("LayoutParameter type:%d, %d", this->getLayoutParameter()->getLayoutType(), layout->getLayoutParameter()->getLayoutType()); + CCLOG("Margin left: %f, %f", this->getLayoutParameter()->getMargin().left, layout->getLayoutParameter()->getMargin().left); + CCLOG("Margin right: %f, %f", this->getLayoutParameter()->getMargin().right, layout->getLayoutParameter()->getMargin().right); + CCLOG("Margin up : %f, %f", this->getLayoutParameter()->getMargin().top, layout->getLayoutParameter()->getMargin().top); + CCLOG("Margin bottom: %f, %f", this->getLayoutParameter()->getMargin().bottom, layout->getLayoutParameter()->getMargin().bottom); + } + CCLOG("opacity: %d, %d", this->getOpacity(), layout->getOpacity()); + CCLOG("colorR: %d, %d", this->getColor().r, layout->getColor().r); + CCLOG("colorG: %d, %d", this->getColor().g, layout->getColor().g); + CCLOG("colorB: %d, %d", this->getColor().b, layout->getColor().b); + CCLOG("flipX: %d, %d", this->isFlippedX(), layout->isFlippedX()); + CCLOG("flipY: %d, %d", this->isFlippedY(), layout->isFlippedY()); + CCLOG("anchorpointX: %f, %f", this->getAnchorPoint().x, layout->getAnchorPoint().x); + CCLOG("anchorpointY: %f, %f", this->getAnchorPoint().y, layout->getAnchorPoint().y); + CCLOG("background scale9: %d, %d", this->isBackGroundImageScale9Enabled(), layout->isBackGroundImageScale9Enabled()); + + CCLOG("=================="); + } + + Vector Layout::getAllLayouts(cocos2d::Node *node) + { + Vector result; + for(auto& child : node->getChildren()){ + Layout* l = dynamic_cast(child); + if (l) { + result.pushBack(l); + result.pushBack(l->getAllLayouts(l)); + } + } + return result; + } } NS_CC_END diff --git a/cocos/ui/UILayout.h b/cocos/ui/UILayout.h index 6c77939185..3922f5e1fe 100644 --- a/cocos/ui/UILayout.h +++ b/cocos/ui/UILayout.h @@ -315,6 +315,8 @@ public: * @return return the index of widget in the layout */ std::function onPassFocusToChild; + void compareLayout(Layout* layout); + Vector getAllLayouts(Node* node); CC_CONSTRUCTOR_ACCESS: //override "init" method of widget. diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp index c80344ce3c..dfa7066e6a 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp @@ -20,8 +20,25 @@ bool UIButtonTest_Editor::init() { if (UIScene_Editor::init()) { + auto _layout2 = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_2(1).json")); // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.csb")); + + + Vector firstLayouts = _layout2->getAllLayouts(_layout2); + Vector secondLayouts = _layout->getAllLayouts(_layout); + + + CCASSERT(firstLayouts.size() == secondLayouts.size(), "can't compare"); + + for (int i=0 ; i < firstLayouts.size(); ++i) { + Layout *l1 = firstLayouts.at(i); + Layout *l2 = secondLayouts.at(i); + l1->compareLayout(l2); + } + + _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); From 2f6f1b715115a4eb54387008fd7d599fb9f6ff7d Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 11 Jun 2014 14:45:35 +0800 Subject: [PATCH 08/72] improve binary format --- .../cocostudio/CCSGUIReader.cpp | 151 +++++++++--------- .../editor-support/cocostudio/CCSGUIReader.h | 2 +- .../UIButtonTest/UIButtonTest_Editor.cpp | 28 ++-- 3 files changed, 91 insertions(+), 90 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index a9ea05e010..46dc01ca1b 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -218,6 +218,70 @@ Widget* GUIReader::widgetFromJsonFile(const char *fileName) return widget; } +std::string WidgetPropertiesReader::getWidgetReaderClassName(Widget* widget) +{ + std::string readerName; + + // 1st., custom widget parse properties of parent widget with parent widget reader + if (dynamic_cast(widget)) + { + readerName = "ButtonReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "CheckBoxReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "ImageViewReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "TextAtlasReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "TextBMFontReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "TextReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "LoadingBarReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "SliderReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "TextFieldReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "LayoutReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "ScrollViewReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "ListViewReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "PageViewReader"; + } + else if (dynamic_cast(widget)) + { + readerName = "WidgetReader"; + } + + return readerName; +} std::string WidgetPropertiesReader::getGUIClassName(const std::string &name) @@ -297,12 +361,14 @@ Widget* GUIReader::widgetFromBinaryFile(const char *fileName) { stExpCocoNode *tpChildArray = tpRootCocoNode->GetChildArray(); - //rapidjson::Type tType = tpChildArray[i].GetType(pCocoLoader); - - std::string strValue = tpChildArray[7].GetValue(); - - fileVersion = strValue.c_str(); + for (int i = 0; i < tpRootCocoNode->GetChildNum(); ++i) { + std::string key = tpChildArray[i].GetName(&tCocoLoader); + if (key == "version") { + fileVersion = tpChildArray[i].GetValue(); + break; + } + } WidgetPropertiesReader * pReader = nullptr; if (fileVersion) @@ -310,6 +376,7 @@ Widget* GUIReader::widgetFromBinaryFile(const char *fileName) int versionInteger = getVersionInteger(fileVersion); if (versionInteger < 250) { + CCASSERT(0, "You current studio doesn't support binary format, please upgrade to the latest version!"); pReader = new WidgetPropertiesReader0250(); widget = pReader->createWidgetFromBinary(&tCocoLoader, tpRootCocoNode, fileName); } @@ -439,11 +506,6 @@ Widget* WidgetPropertiesReader0250::createWidget(const rapidjson::Value& data, c ActionManagerEx::getInstance()->initWithDictionary(fileName,actions,rootWidget); return widget; } - -cocos2d::ui::Widget* WidgetPropertiesReader0250::createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName) -{ - return nullptr; -} Widget* WidgetPropertiesReader0250::widgetFromJsonDictionary(const rapidjson::Value&data) @@ -1159,7 +1221,10 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c { stExpCocoNode *tpChildArray = pCocoNode->GetChildArray(); - + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + const char* value = tpChildArray[i].GetName(pCocoLoader); + CCLOG("%s", value); + } int texturesCount = tpChildArray[6].GetChildNum(); for (int i=0; isetPropsFromBinary(widget, pCocoLoader, pCocoNode); } -std::string WidgetPropertiesReader::getWidgetReaderClassName(Widget* widget) -{ - std::string readerName; - - // 1st., custom widget parse properties of parent widget with parent widget reader - if (dynamic_cast(widget)) - { - readerName = "ButtonReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "CheckBoxReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "ImageViewReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "TextAtlasReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "TextBMFontReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "TextReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "LoadingBarReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "SliderReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "TextFieldReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "LayoutReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "ScrollViewReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "ListViewReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "PageViewReader"; - } - else if (dynamic_cast(widget)) - { - readerName = "WidgetReader"; - } - - return readerName; -} Widget* WidgetPropertiesReader0300::widgetFromJsonDictionary(const rapidjson::Value& data) { diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index 967593cd7c..ae14590fcc 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -143,7 +143,7 @@ public: //added for binary parsing virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode, - const char* fileName)override; + const char* fileName)override{return nullptr;} virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode){return nullptr;} diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp index dfa7066e6a..6cc6e7316f 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp @@ -20,23 +20,23 @@ bool UIButtonTest_Editor::init() { if (UIScene_Editor::init()) { - auto _layout2 = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); +// auto _layout2 = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_2(1).json")); -// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.csb")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_2(1).json")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.csb")); - Vector firstLayouts = _layout2->getAllLayouts(_layout2); - Vector secondLayouts = _layout->getAllLayouts(_layout); - - - CCASSERT(firstLayouts.size() == secondLayouts.size(), "can't compare"); - - for (int i=0 ; i < firstLayouts.size(); ++i) { - Layout *l1 = firstLayouts.at(i); - Layout *l2 = secondLayouts.at(i); - l1->compareLayout(l2); - } +// Vector firstLayouts = _layout2->getAllLayouts(_layout2); +// Vector secondLayouts = _layout->getAllLayouts(_layout); +// +// +// CCASSERT(firstLayouts.size() == secondLayouts.size(), "can't compare"); +// +// for (int i=0 ; i < firstLayouts.size(); ++i) { +// Layout *l1 = firstLayouts.at(i); +// Layout *l2 = secondLayouts.at(i); +// l1->compareLayout(l2); +// } From f50263402af193b0edc8795eab051888cef51f07 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 11 Jun 2014 14:56:12 +0800 Subject: [PATCH 09/72] improve parser --- .../cocostudio/CCSGUIReader.cpp | 87 ++++++++++--------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index 46dc01ca1b..181c502986 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -1221,53 +1221,58 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c { stExpCocoNode *tpChildArray = pCocoNode->GetChildArray(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - const char* value = tpChildArray[i].GetName(pCocoLoader); - CCLOG("%s", value); - } - int texturesCount = tpChildArray[6].GetChildNum(); - for (int i=0; iaddSpriteFramesWithFile(file); - } + float fileDesignWidth; + float fileDesignHeight; - - float fileDesignWidth = atof(tpChildArray[5].GetValue()); - - float fileDesignHeight = atof(tpChildArray[4].GetValue()); - - if (fileDesignWidth <= 0 || fileDesignHeight <= 0) { - CCLOGERROR("Read design size error!\n"); - Size winSize = Director::getInstance()->getWinSize(); - GUIReader::getInstance()->storeFileDesignSize(fileName, winSize); - } - else - { - GUIReader::getInstance()->storeFileDesignSize(fileName, Size(fileDesignWidth, fileDesignHeight)); - } - - stExpCocoNode *widgetTreeNode = &tpChildArray[8]; - rapidjson::Type tType = tpChildArray[8].GetType(pCocoLoader); - Widget* widget = nullptr; - if (rapidjson::kObjectType == tType) - { - //convert this function!!! - widget = widgetFromBinary(pCocoLoader, widgetTreeNode); + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = tpChildArray[i].GetName(pCocoLoader); + + if (key == "textures") { + int texturesCount = tpChildArray[i].GetChildNum(); + for (int j=0; jaddSpriteFramesWithFile(file); + } + }else if (key == "designWidth"){ + fileDesignWidth = atof(tpChildArray[i].GetValue()); + }else if (key == "designHeight"){ + fileDesignHeight = atof(tpChildArray[i].GetValue()); + }else if (key == "widgetTree"){ + + if (fileDesignWidth <= 0 || fileDesignHeight <= 0) { + CCLOGERROR("Read design size error!\n"); + Size winSize = Director::getInstance()->getWinSize(); + GUIReader::getInstance()->storeFileDesignSize(fileName, winSize); + } + else + { + GUIReader::getInstance()->storeFileDesignSize(fileName, Size(fileDesignWidth, fileDesignHeight)); + } + + + stExpCocoNode *widgetTreeNode = &tpChildArray[i]; + rapidjson::Type tType = tpChildArray[i].GetType(pCocoLoader); + + if (rapidjson::kObjectType == tType) + { + widget = widgetFromBinary(pCocoLoader, widgetTreeNode); + } + + if (widget->getContentSize().equals(Size::ZERO)) + { + Layout* rootWidget = dynamic_cast(widget); + rootWidget->setSize(Size(fileDesignWidth, fileDesignHeight)); + } + } } - /* *********temp********* */ - if (widget->getContentSize().equals(Size::ZERO)) - { - Layout* rootWidget = dynamic_cast(widget); - rootWidget->setSize(Size(fileDesignWidth, fileDesignHeight)); - } /* ********************** */ - + //TODO: // // widget->setFileDesignSize(Size(fileDesignWidth, fileDesignHeight)); // const rapidjson::Value& actions = DICTOOL->getSubDictionary_json(data, "animation"); // /* *********temp********* */ From 5515c43bb213a8dfec35bc63dc65add8a4968656 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 11 Jun 2014 15:16:08 +0800 Subject: [PATCH 10/72] improve lasers --- cocos/editor-support/cocostudio/CCSGUIReader.cpp | 2 +- .../cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp | 2 +- .../cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp | 4 ++-- .../cocostudio/WidgetReader/TextReader/TextReader.cpp | 2 +- .../UIImageViewTest/UIImageViewTest_Editor.cpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index 181c502986..25ad95594b 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -1298,7 +1298,7 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s widget = this->createGUI(classname); } - CCLOG("classname = %s", classname.c_str()); +// CCLOG("classname = %s", classname.c_str()); std::string readerName = this->getWidgetReaderClassName(classname); WidgetReaderProtocol* reader = this->createWidgetReaderProtocol(readerName); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index ea4e07c0ec..c82a9c2ce0 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -53,7 +53,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - CCLOG("Button: key = %s, value = %s", key.c_str(), value.c_str()); +// CCLOG("Button: key = %s, value = %s", key.c_str(), value.c_str()); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index 723bf1323e..17b6006bea 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -54,7 +54,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - CCLOG("Layout: key = %s, value = %s", key.c_str(), value.c_str()); +// CCLOG("Layout: key = %s, value = %s", key.c_str(), value.c_str()); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); }else if(key == "sizeType"){ @@ -220,7 +220,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); - CCLOG("Layout : image =%s", backgroundValue.c_str()); +// CCLOG("Layout : image =%s", backgroundValue.c_str()); panel->setBackGroundImage(backgroundValue, imageFileNameType); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp index 678abc87cf..9979e70053 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp @@ -44,7 +44,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - CCLOG("Text: key = %s, value = %s", key.c_str(), value.c_str()); +// CCLOG("Text: key = %s, value = %s", key.c_str(), value.c_str()); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp index eb756cf610..a8dab62bd7 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp @@ -10,7 +10,7 @@ bool UIImageViewTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIImageView_Editor/ui_ImageView_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIImageView_Editor/ui_imageview_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIImageView_Editor/ui_ImageView_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); From 1d01fe8bbc67c13ec270360ed7026ebfab90c301 Mon Sep 17 00:00:00 2001 From: andyque Date: Sun, 15 Jun 2014 16:12:24 +0800 Subject: [PATCH 11/72] refactor --- .../ButtonReader/ButtonReader.cpp | 2 +- .../CheckBoxReader/CheckBoxReader.cpp | 2 +- .../ImageViewReader/ImageViewReader.cpp | 2 +- .../LayoutReader/LayoutReader.cpp | 5 +- .../cocostudio/WidgetReader/WidgetReader.cpp | 1 + .../cocostudio/WidgetReader/WidgetReader.h | 6 +- cocos/ui/UIButton.cpp | 16 ++++ cocos/ui/UIButton.h | 1 + cocos/ui/UILayout.cpp | 78 ++++++------------- cocos/ui/UILayout.h | 4 +- cocos/ui/UIText.cpp | 18 +++++ cocos/ui/UIText.h | 2 + cocos/ui/UIWidget.cpp | 51 ++++++++++++ cocos/ui/UIWidget.h | 2 +- .../UIButtonTest/UIButtonTest_Editor.cpp | 23 ++++-- 15 files changed, 140 insertions(+), 73 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index c82a9c2ce0..22f7c70cc5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -53,7 +53,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); -// CCLOG("Button: key = %s, value = %s", key.c_str(), value.c_str()); +// CCLOG("Button: key = %s, value = %d", key.c_str(), i); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index c92dc6cefd..089539fcb8 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -42,7 +42,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - + CCLOG("key = %s, index : %d", key.c_str(), i); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); }else if(key == "sizeType"){ diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index c40b892c05..9e8e350733 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -45,7 +45,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); -// CCLOG("ImageView: key = %s, value = %s", key.c_str(), value.c_str()); + CCLOG("ImageView: key = %s, value = %d", key.c_str(), i); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index 17b6006bea..25281c43e0 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -54,7 +54,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); -// CCLOG("Layout: key = %s, value = %s", key.c_str(), value.c_str()); +// CCLOG("Layout: key = %s, value = %d", key.c_str(), i); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); }else if(key == "sizeType"){ @@ -316,7 +316,7 @@ namespace cocostudio std::string imageFileName = this->getResourcePath(imageFileNameDic, "path", (Widget::TextureResType)imageFileNameType); panel->setBackGroundImage(imageFileName, (Widget::TextureResType)imageFileNameType); - + if (backGroundScale9Enable) { float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); @@ -325,6 +325,7 @@ namespace cocostudio float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); panel->setBackGroundImageCapInsets(Rect(cx, cy, cw, ch)); } + panel->setLayoutType((Layout::Type)DICTOOL->getIntValue_json(options, "layoutType")); int bgimgcr = DICTOOL->getIntValue_json(options, "colorR"); diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index f8bb8928b7..04b00aa56a 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -2,6 +2,7 @@ #include "WidgetReader.h" #include "cocostudio/CocoLoader.h" +#include "ui/UIButton.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index aa0d5d7105..08c779f383 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -62,9 +62,13 @@ namespace cocostudio std::string getResourcePath(const rapidjson::Value& dict, const std::string& key, cocos2d::ui::Widget::TextureResType texType); - std::string getResourcePath(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode, cocos2d::ui::Widget::TextureResType texType); void setAnchorPointForWidget(cocos2d::ui::Widget* widget, const rapidjson::Value&options); + + std::string getResourcePath(CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode, + cocos2d::ui::Widget::TextureResType texType); + void beginSetBasicProperties(cocos2d::ui::Widget *widget); void endSetBasicProperties(cocos2d::ui::Widget *widget); diff --git a/cocos/ui/UIButton.cpp b/cocos/ui/UIButton.cpp index 9b54a2b440..16a55d03d3 100644 --- a/cocos/ui/UIButton.cpp +++ b/cocos/ui/UIButton.cpp @@ -73,6 +73,22 @@ _disabledTextureAdaptDirty(true) { } + +void Button::compareWidget(cocos2d::ui::Widget *widget) + { + CCLOG("Button property comparison: "); + + Widget::compareWidget(widget); + + Button *btn = dynamic_cast(widget); + + CCLOG("button: _normalFileName: %s, %s", _normalFileName.c_str(), btn->_normalFileName.c_str()); + CCLOG("button: _clickedFileName: %s, %s", _clickedFileName.c_str(), btn->_clickedFileName.c_str()); + CCLOG("button: _disabledFileName: %s, %s", _disabledFileName.c_str(), btn->_disabledFileName.c_str()); + CCLOG("button: _scale9Enabled: %d, %d", _scale9Enabled, btn->_scale9Enabled); + CCLOG("==================================="); + + } Button::~Button() { diff --git a/cocos/ui/UIButton.h b/cocos/ui/UIButton.h index ff12c127df..385b62c3f1 100644 --- a/cocos/ui/UIButton.h +++ b/cocos/ui/UIButton.h @@ -70,6 +70,7 @@ public: const std::string& disableImage = "", TextureResType texType = TextureResType::LOCAL); + virtual void compareWidget(Widget* widget); /** * Load textures for button. diff --git a/cocos/ui/UILayout.cpp b/cocos/ui/UILayout.cpp index 8a60393037..3082509bb7 100644 --- a/cocos/ui/UILayout.cpp +++ b/cocos/ui/UILayout.cpp @@ -94,6 +94,24 @@ _isFocusPassing(false) { //no-op } + + void Layout::compareWidget(Widget* widget) + { + CCLOG("Layout property comparison"); + Widget::compareWidget(widget); + + Layout *layout = (Layout*)widget; + + + CCLOG("Layout background scale9: %d, %d", this->isBackGroundImageScale9Enabled(), layout->isBackGroundImageScale9Enabled()); + CCLOG("Layout background image: %s, %s", _backGroundImageFileName.c_str(), layout->_backGroundImageFileName.c_str()); + CCLOG("Layout _clippingEnabled image: %d, %d", _clippingEnabled, layout->_clippingEnabled); + CCLOG("Layout _alongVector : (%f,%f), (%f,%f)", _alongVector.x, _alongVector.y, layout->_alongVector.x, layout->_alongVector.y); + + + + CCLOG("=================="); + } Layout::~Layout() { @@ -1921,67 +1939,15 @@ Widget* Layout::findNextFocusedWidget(FocusDirection direction, Widget* current) return current; } } - void Layout::compareLayout(cocos2d::ui::Layout *layout) - { - CCLOG("positionX: %f, %f",_position.x, layout->getPosition().x ); - CCLOG("positionY: %f, %f", _position.y, layout->getPosition().y); - CCLOG("ignoreSize: %d, %d ", this->isIgnoreContentAdaptWithSize(), layout->isIgnoreContentAdaptWithSize()); - CCLOG("sizeType: %d, %d", this->getSizeType(), layout->getSizeType()); - CCLOG("positionType: %d, %d", this->getPositionType(), layout->getPositionType()); - CCLOG("sizePercentX: %f, %f", this->getSizePercent().x, layout->getSizePercent().x); - CCLOG("sizePercentY: %f, %f", this->getSizePercent().y, layout->getSizePercent().y); - CCLOG("positionPercentX: %f, %f", this->getPositionPercent().x, layout->getPositionPercent().x); - CCLOG("positionPercentY: %f, %f", this->getPositionPercent().y, layout->getPositionPercent().y); - CCLOG("width: %f, %f", this->getSize().width, layout->getSize().width); - CCLOG("height: %f, %f", this->getSize().height, layout->getSize().height); - CCLOG("tag: %d, %d,", this->getTag(), layout->getTag()); - CCLOG("actionTag: %d, %d" , this->getActionTag(), layout->getActionTag()); - CCLOG("touchAble: %d, %d", this->isTouchEnabled(), layout->isTouchEnabled()); - CCLOG("name: %s, %s", this->getName().c_str(), layout->getName().c_str()); - CCLOG("scaleX: %f, %f", this->getScaleX(), layout->getScaleX()); - CCLOG("scaleY: %f, %f", this->getScaleY(), layout->getScaleY()); - CCLOG("rotation: %f, %f", this->getRotation(), layout->getRotation()); - CCLOG("visible: %d, %d", this->isVisible(), layout->isVisible()); - CCLOG("ZOrder: %d, %d", this->getZOrder(), layout->getZOrder()); - if (this->getLayoutParameter()) { - if (dynamic_cast(this->getLayoutParameter())) { - CCLOG("Gravity: %d, %d", ((LinearLayoutParameter*)this->getLayoutParameter())->getGravity(), - ((LinearLayoutParameter*)layout->getLayoutParameter())->getGravity()); - } - if (dynamic_cast(this->getLayoutParameter())) { - CCLOG("relativeName: %s, %s", ((RelativeLayoutParameter*)this->getLayoutParameter())->getRelativeName().c_str(), - ((RelativeLayoutParameter*)layout->getLayoutParameter())->getRelativeName().c_str()); - CCLOG("relativeToWidgetName: %s, %s", ((RelativeLayoutParameter*)this->getLayoutParameter())->getRelativeToWidgetName().c_str(), - ((RelativeLayoutParameter*)layout->getLayoutParameter())->getRelativeToWidgetName().c_str()); - CCLOG("Align: %d, %d", ((RelativeLayoutParameter*)this->getLayoutParameter())->getAlign(), - ((RelativeLayoutParameter*)layout->getLayoutParameter())->getAlign()); - } - CCLOG("LayoutParameter type:%d, %d", this->getLayoutParameter()->getLayoutType(), layout->getLayoutParameter()->getLayoutType()); - CCLOG("Margin left: %f, %f", this->getLayoutParameter()->getMargin().left, layout->getLayoutParameter()->getMargin().left); - CCLOG("Margin right: %f, %f", this->getLayoutParameter()->getMargin().right, layout->getLayoutParameter()->getMargin().right); - CCLOG("Margin up : %f, %f", this->getLayoutParameter()->getMargin().top, layout->getLayoutParameter()->getMargin().top); - CCLOG("Margin bottom: %f, %f", this->getLayoutParameter()->getMargin().bottom, layout->getLayoutParameter()->getMargin().bottom); - } - CCLOG("opacity: %d, %d", this->getOpacity(), layout->getOpacity()); - CCLOG("colorR: %d, %d", this->getColor().r, layout->getColor().r); - CCLOG("colorG: %d, %d", this->getColor().g, layout->getColor().g); - CCLOG("colorB: %d, %d", this->getColor().b, layout->getColor().b); - CCLOG("flipX: %d, %d", this->isFlippedX(), layout->isFlippedX()); - CCLOG("flipY: %d, %d", this->isFlippedY(), layout->isFlippedY()); - CCLOG("anchorpointX: %f, %f", this->getAnchorPoint().x, layout->getAnchorPoint().x); - CCLOG("anchorpointY: %f, %f", this->getAnchorPoint().y, layout->getAnchorPoint().y); - CCLOG("background scale9: %d, %d", this->isBackGroundImageScale9Enabled(), layout->isBackGroundImageScale9Enabled()); - - CCLOG("=================="); - } + - Vector Layout::getAllLayouts(cocos2d::Node *node) + Vector Layout::getAllLayouts(cocos2d::Node *node) { - Vector result; + Vector result; for(auto& child : node->getChildren()){ + result.pushBack(dynamic_cast(child)); Layout* l = dynamic_cast(child); if (l) { - result.pushBack(l); result.pushBack(l->getAllLayouts(l)); } } diff --git a/cocos/ui/UILayout.h b/cocos/ui/UILayout.h index 3922f5e1fe..7a37466c57 100644 --- a/cocos/ui/UILayout.h +++ b/cocos/ui/UILayout.h @@ -315,8 +315,8 @@ public: * @return return the index of widget in the layout */ std::function onPassFocusToChild; - void compareLayout(Layout* layout); - Vector getAllLayouts(Node* node); + virtual void compareWidget(Widget* widget); + Vector getAllLayouts(Node* node); CC_CONSTRUCTOR_ACCESS: //override "init" method of widget. diff --git a/cocos/ui/UIText.cpp b/cocos/ui/UIText.cpp index 0ce8d0f57a..7719bbb84a 100644 --- a/cocos/ui/UIText.cpp +++ b/cocos/ui/UIText.cpp @@ -46,6 +46,24 @@ _labelRendererAdaptDirty(true), _type(Type::SYSTEM) { } + + void Text::compareWidget(cocos2d::ui::Widget *widget) + { + CCLOG("Text property comparison: "); + Widget::compareWidget(widget); + + Text *text = dynamic_cast(widget); + + CCLOG("Label _touchScaleChangeEnable: %d, %d", _touchScaleChangeEnabled, text->_touchScaleChangeEnabled); + CCLOG("Label _normalScaleValueY: %f, %f", _normalScaleValueY, text->_normalScaleValueY); + CCLOG("Label _normalScaleValueX: %f, %f", _normalScaleValueX, text->_normalScaleValueX); + CCLOG("Label _fontName: %s, %s", _fontName.c_str(), text->_fontName.c_str()); + CCLOG("Label _fontSize: %d, %d", _fontSize, text->_fontSize); + CCLOG("Label _type: %d, %d", _type, text->_type); + + CCLOG("==================================="); + + } Text::~Text() { diff --git a/cocos/ui/UIText.h b/cocos/ui/UIText.h index 3c38101abd..47bb88dab1 100644 --- a/cocos/ui/UIText.h +++ b/cocos/ui/UIText.h @@ -64,6 +64,8 @@ public: */ static Text* create(); + virtual void compareWidget(Widget* widget); + /** * create a Text object with textContent, fontName and fontSize * the fontName could be a system font name or a TTF file path. diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index 01139a0836..13f7b13376 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -165,6 +165,57 @@ _layoutParameterType(LayoutParameter::Type::NONE) { } + + void Widget::compareWidget(cocos2d::ui::Widget *widget) + { + CCLOG("positionX: %f, %f",_position.x, widget->getPosition().x ); + CCLOG("positionY: %f, %f", _position.y, widget->getPosition().y); + CCLOG("ignoreSize: %d, %d ", this->isIgnoreContentAdaptWithSize(), widget->isIgnoreContentAdaptWithSize()); + CCLOG("sizeType: %d, %d", this->getSizeType(), widget->getSizeType()); + CCLOG("positionType: %d, %d", this->getPositionType(), widget->getPositionType()); + CCLOG("sizePercentX: %f, %f", this->getSizePercent().x, widget->getSizePercent().x); + CCLOG("sizePercentY: %f, %f", this->getSizePercent().y, widget->getSizePercent().y); + CCLOG("positionPercentX: %f, %f", this->getPositionPercent().x, widget->getPositionPercent().x); + CCLOG("positionPercentY: %f, %f", this->getPositionPercent().y, widget->getPositionPercent().y); + CCLOG("width: %f, %f", this->getSize().width, widget->getSize().width); + CCLOG("height: %f, %f", this->getSize().height, widget->getSize().height); + CCLOG("tag: %d, %d,", this->getTag(), widget->getTag()); + CCLOG("actionTag: %d, %d" , this->getActionTag(), widget->getActionTag()); + CCLOG("touchAble: %d, %d", this->isTouchEnabled(), widget->isTouchEnabled()); + CCLOG("name: %s, %s", this->getName().c_str(), widget->getName().c_str()); + CCLOG("scaleX: %f, %f", this->getScaleX(), widget->getScaleX()); + CCLOG("scaleY: %f, %f", this->getScaleY(), widget->getScaleY()); + CCLOG("rotation: %f, %f", this->getRotation(), widget->getRotation()); + CCLOG("visible: %d, %d", this->isVisible(), widget->isVisible()); + CCLOG("ZOrder: %d, %d", this->getZOrder(), widget->getZOrder()); + if (this->getLayoutParameter()) { + if (dynamic_cast(this->getLayoutParameter())) { + CCLOG("Gravity: %d, %d", ((LinearLayoutParameter*)this->getLayoutParameter())->getGravity(), + ((LinearLayoutParameter*)widget->getLayoutParameter())->getGravity()); + } + if (dynamic_cast(this->getLayoutParameter())) { + CCLOG("relativeName: %s, %s", ((RelativeLayoutParameter*)this->getLayoutParameter())->getRelativeName().c_str(), + ((RelativeLayoutParameter*)widget->getLayoutParameter())->getRelativeName().c_str()); + CCLOG("relativeToWidgetName: %s, %s", ((RelativeLayoutParameter*)this->getLayoutParameter())->getRelativeToWidgetName().c_str(), + ((RelativeLayoutParameter*)widget->getLayoutParameter())->getRelativeToWidgetName().c_str()); + CCLOG("Align: %d, %d", ((RelativeLayoutParameter*)this->getLayoutParameter())->getAlign(), + ((RelativeLayoutParameter*)widget->getLayoutParameter())->getAlign()); + } + CCLOG("LayoutParameter type:%d, %d", this->getLayoutParameter()->getLayoutType(), widget->getLayoutParameter()->getLayoutType()); + CCLOG("Margin left: %f, %f", this->getLayoutParameter()->getMargin().left, widget->getLayoutParameter()->getMargin().left); + CCLOG("Margin right: %f, %f", this->getLayoutParameter()->getMargin().right, widget->getLayoutParameter()->getMargin().right); + CCLOG("Margin up : %f, %f", this->getLayoutParameter()->getMargin().top, widget->getLayoutParameter()->getMargin().top); + CCLOG("Margin bottom: %f, %f", this->getLayoutParameter()->getMargin().bottom, widget->getLayoutParameter()->getMargin().bottom); + } + CCLOG("opacity: %d, %d", this->getOpacity(), widget->getOpacity()); + CCLOG("colorR: %d, %d", this->getColor().r, widget->getColor().r); + CCLOG("colorG: %d, %d", this->getColor().g, widget->getColor().g); + CCLOG("colorB: %d, %d", this->getColor().b, widget->getColor().b); + CCLOG("flipX: %d, %d", this->isFlippedX(), widget->isFlippedX()); + CCLOG("flipY: %d, %d", this->isFlippedY(), widget->isFlippedY()); + CCLOG("anchorpointX: %f, %f", this->getAnchorPoint().x, widget->getAnchorPoint().x); + CCLOG("anchorpointY: %f, %f", this->getAnchorPoint().y, widget->getAnchorPoint().y); + } Widget::~Widget() { diff --git a/cocos/ui/UIWidget.h b/cocos/ui/UIWidget.h index 437068d613..6465763828 100644 --- a/cocos/ui/UIWidget.h +++ b/cocos/ui/UIWidget.h @@ -599,6 +599,7 @@ public: * use this function to manually specify the next focused widget regards to each direction */ std::function onNextFocusedWidget; + virtual void compareWidget(Widget* widget); CC_CONSTRUCTOR_ACCESS: @@ -628,7 +629,6 @@ CC_CONSTRUCTOR_ACCESS: *@return void */ void dispatchFocusEvent(Widget* widgetLoseFocus, Widget* widgetGetFocus); - protected: //call back function called when size changed. diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp index 6cc6e7316f..ceb829f98e 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp @@ -20,22 +20,29 @@ bool UIButtonTest_Editor::init() { if (UIScene_Editor::init()) { -// auto _layout2 = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); + auto _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); + + Sprite *sp = Sprite::create("cocosui/UIEditorTest/UIButton_Editor/button_n.png"); + CCLOG("contentSize = %f, %f", sp->getContentSize().width, sp->getContentSize().height); + + Sprite *sp2 = Sprite::create("cocosui/UIEditorTest/UIButton_Editor/button_n.png"); + CCLOG("contentSize = %f, %f", sp2->getContentSize().width, sp2->getContentSize().height); + +// auto _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_2(1).json")); // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_2(1).json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.csb")); +// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.csb")); - -// Vector firstLayouts = _layout2->getAllLayouts(_layout2); -// Vector secondLayouts = _layout->getAllLayouts(_layout); +// Vector firstLayouts = _layout2->getAllLayouts(_layout2); +// Vector secondLayouts = _layout->getAllLayouts(_layout); // // // CCASSERT(firstLayouts.size() == secondLayouts.size(), "can't compare"); // // for (int i=0 ; i < firstLayouts.size(); ++i) { -// Layout *l1 = firstLayouts.at(i); -// Layout *l2 = secondLayouts.at(i); -// l1->compareLayout(l2); +// Widget *l1 = firstLayouts.at(i); +// Widget *l2 = secondLayouts.at(i); +// l1->compareWidget(l2); // } From 2cef0cb437b6dac02417ab49349a769716c38e12 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 11:26:26 +0800 Subject: [PATCH 12/72] update ccs-res --- cocos/ui/UIButton.cpp | 16 ------ cocos/ui/UIButton.h | 2 - cocos/ui/UILayout.cpp | 32 ------------ cocos/ui/UILayout.h | 2 - cocos/ui/UIText.cpp | 18 ------- cocos/ui/UIText.h | 2 - cocos/ui/UIWidget.cpp | 51 ------------------- cocos/ui/UIWidget.h | 1 - .../UIButtonTest/UIButtonTest_Editor.cpp | 24 +-------- tests/cpp-tests/Resources/ccs-res | 2 +- 10 files changed, 3 insertions(+), 147 deletions(-) diff --git a/cocos/ui/UIButton.cpp b/cocos/ui/UIButton.cpp index 16a55d03d3..9b54a2b440 100644 --- a/cocos/ui/UIButton.cpp +++ b/cocos/ui/UIButton.cpp @@ -73,22 +73,6 @@ _disabledTextureAdaptDirty(true) { } - -void Button::compareWidget(cocos2d::ui::Widget *widget) - { - CCLOG("Button property comparison: "); - - Widget::compareWidget(widget); - - Button *btn = dynamic_cast(widget); - - CCLOG("button: _normalFileName: %s, %s", _normalFileName.c_str(), btn->_normalFileName.c_str()); - CCLOG("button: _clickedFileName: %s, %s", _clickedFileName.c_str(), btn->_clickedFileName.c_str()); - CCLOG("button: _disabledFileName: %s, %s", _disabledFileName.c_str(), btn->_disabledFileName.c_str()); - CCLOG("button: _scale9Enabled: %d, %d", _scale9Enabled, btn->_scale9Enabled); - CCLOG("==================================="); - - } Button::~Button() { diff --git a/cocos/ui/UIButton.h b/cocos/ui/UIButton.h index 385b62c3f1..9c8f6a235f 100644 --- a/cocos/ui/UIButton.h +++ b/cocos/ui/UIButton.h @@ -70,8 +70,6 @@ public: const std::string& disableImage = "", TextureResType texType = TextureResType::LOCAL); - virtual void compareWidget(Widget* widget); - /** * Load textures for button. * diff --git a/cocos/ui/UILayout.cpp b/cocos/ui/UILayout.cpp index 3082509bb7..74495a8e1b 100644 --- a/cocos/ui/UILayout.cpp +++ b/cocos/ui/UILayout.cpp @@ -94,24 +94,6 @@ _isFocusPassing(false) { //no-op } - - void Layout::compareWidget(Widget* widget) - { - CCLOG("Layout property comparison"); - Widget::compareWidget(widget); - - Layout *layout = (Layout*)widget; - - - CCLOG("Layout background scale9: %d, %d", this->isBackGroundImageScale9Enabled(), layout->isBackGroundImageScale9Enabled()); - CCLOG("Layout background image: %s, %s", _backGroundImageFileName.c_str(), layout->_backGroundImageFileName.c_str()); - CCLOG("Layout _clippingEnabled image: %d, %d", _clippingEnabled, layout->_clippingEnabled); - CCLOG("Layout _alongVector : (%f,%f), (%f,%f)", _alongVector.x, _alongVector.y, layout->_alongVector.x, layout->_alongVector.y); - - - - CCLOG("=================="); - } Layout::~Layout() { @@ -1939,20 +1921,6 @@ Widget* Layout::findNextFocusedWidget(FocusDirection direction, Widget* current) return current; } } - - - Vector Layout::getAllLayouts(cocos2d::Node *node) - { - Vector result; - for(auto& child : node->getChildren()){ - result.pushBack(dynamic_cast(child)); - Layout* l = dynamic_cast(child); - if (l) { - result.pushBack(l->getAllLayouts(l)); - } - } - return result; - } } NS_CC_END diff --git a/cocos/ui/UILayout.h b/cocos/ui/UILayout.h index 7a37466c57..6c77939185 100644 --- a/cocos/ui/UILayout.h +++ b/cocos/ui/UILayout.h @@ -315,8 +315,6 @@ public: * @return return the index of widget in the layout */ std::function onPassFocusToChild; - virtual void compareWidget(Widget* widget); - Vector getAllLayouts(Node* node); CC_CONSTRUCTOR_ACCESS: //override "init" method of widget. diff --git a/cocos/ui/UIText.cpp b/cocos/ui/UIText.cpp index 7719bbb84a..0ce8d0f57a 100644 --- a/cocos/ui/UIText.cpp +++ b/cocos/ui/UIText.cpp @@ -46,24 +46,6 @@ _labelRendererAdaptDirty(true), _type(Type::SYSTEM) { } - - void Text::compareWidget(cocos2d::ui::Widget *widget) - { - CCLOG("Text property comparison: "); - Widget::compareWidget(widget); - - Text *text = dynamic_cast(widget); - - CCLOG("Label _touchScaleChangeEnable: %d, %d", _touchScaleChangeEnabled, text->_touchScaleChangeEnabled); - CCLOG("Label _normalScaleValueY: %f, %f", _normalScaleValueY, text->_normalScaleValueY); - CCLOG("Label _normalScaleValueX: %f, %f", _normalScaleValueX, text->_normalScaleValueX); - CCLOG("Label _fontName: %s, %s", _fontName.c_str(), text->_fontName.c_str()); - CCLOG("Label _fontSize: %d, %d", _fontSize, text->_fontSize); - CCLOG("Label _type: %d, %d", _type, text->_type); - - CCLOG("==================================="); - - } Text::~Text() { diff --git a/cocos/ui/UIText.h b/cocos/ui/UIText.h index 47bb88dab1..3c38101abd 100644 --- a/cocos/ui/UIText.h +++ b/cocos/ui/UIText.h @@ -64,8 +64,6 @@ public: */ static Text* create(); - virtual void compareWidget(Widget* widget); - /** * create a Text object with textContent, fontName and fontSize * the fontName could be a system font name or a TTF file path. diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index 13f7b13376..01139a0836 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -165,57 +165,6 @@ _layoutParameterType(LayoutParameter::Type::NONE) { } - - void Widget::compareWidget(cocos2d::ui::Widget *widget) - { - CCLOG("positionX: %f, %f",_position.x, widget->getPosition().x ); - CCLOG("positionY: %f, %f", _position.y, widget->getPosition().y); - CCLOG("ignoreSize: %d, %d ", this->isIgnoreContentAdaptWithSize(), widget->isIgnoreContentAdaptWithSize()); - CCLOG("sizeType: %d, %d", this->getSizeType(), widget->getSizeType()); - CCLOG("positionType: %d, %d", this->getPositionType(), widget->getPositionType()); - CCLOG("sizePercentX: %f, %f", this->getSizePercent().x, widget->getSizePercent().x); - CCLOG("sizePercentY: %f, %f", this->getSizePercent().y, widget->getSizePercent().y); - CCLOG("positionPercentX: %f, %f", this->getPositionPercent().x, widget->getPositionPercent().x); - CCLOG("positionPercentY: %f, %f", this->getPositionPercent().y, widget->getPositionPercent().y); - CCLOG("width: %f, %f", this->getSize().width, widget->getSize().width); - CCLOG("height: %f, %f", this->getSize().height, widget->getSize().height); - CCLOG("tag: %d, %d,", this->getTag(), widget->getTag()); - CCLOG("actionTag: %d, %d" , this->getActionTag(), widget->getActionTag()); - CCLOG("touchAble: %d, %d", this->isTouchEnabled(), widget->isTouchEnabled()); - CCLOG("name: %s, %s", this->getName().c_str(), widget->getName().c_str()); - CCLOG("scaleX: %f, %f", this->getScaleX(), widget->getScaleX()); - CCLOG("scaleY: %f, %f", this->getScaleY(), widget->getScaleY()); - CCLOG("rotation: %f, %f", this->getRotation(), widget->getRotation()); - CCLOG("visible: %d, %d", this->isVisible(), widget->isVisible()); - CCLOG("ZOrder: %d, %d", this->getZOrder(), widget->getZOrder()); - if (this->getLayoutParameter()) { - if (dynamic_cast(this->getLayoutParameter())) { - CCLOG("Gravity: %d, %d", ((LinearLayoutParameter*)this->getLayoutParameter())->getGravity(), - ((LinearLayoutParameter*)widget->getLayoutParameter())->getGravity()); - } - if (dynamic_cast(this->getLayoutParameter())) { - CCLOG("relativeName: %s, %s", ((RelativeLayoutParameter*)this->getLayoutParameter())->getRelativeName().c_str(), - ((RelativeLayoutParameter*)widget->getLayoutParameter())->getRelativeName().c_str()); - CCLOG("relativeToWidgetName: %s, %s", ((RelativeLayoutParameter*)this->getLayoutParameter())->getRelativeToWidgetName().c_str(), - ((RelativeLayoutParameter*)widget->getLayoutParameter())->getRelativeToWidgetName().c_str()); - CCLOG("Align: %d, %d", ((RelativeLayoutParameter*)this->getLayoutParameter())->getAlign(), - ((RelativeLayoutParameter*)widget->getLayoutParameter())->getAlign()); - } - CCLOG("LayoutParameter type:%d, %d", this->getLayoutParameter()->getLayoutType(), widget->getLayoutParameter()->getLayoutType()); - CCLOG("Margin left: %f, %f", this->getLayoutParameter()->getMargin().left, widget->getLayoutParameter()->getMargin().left); - CCLOG("Margin right: %f, %f", this->getLayoutParameter()->getMargin().right, widget->getLayoutParameter()->getMargin().right); - CCLOG("Margin up : %f, %f", this->getLayoutParameter()->getMargin().top, widget->getLayoutParameter()->getMargin().top); - CCLOG("Margin bottom: %f, %f", this->getLayoutParameter()->getMargin().bottom, widget->getLayoutParameter()->getMargin().bottom); - } - CCLOG("opacity: %d, %d", this->getOpacity(), widget->getOpacity()); - CCLOG("colorR: %d, %d", this->getColor().r, widget->getColor().r); - CCLOG("colorG: %d, %d", this->getColor().g, widget->getColor().g); - CCLOG("colorB: %d, %d", this->getColor().b, widget->getColor().b); - CCLOG("flipX: %d, %d", this->isFlippedX(), widget->isFlippedX()); - CCLOG("flipY: %d, %d", this->isFlippedY(), widget->isFlippedY()); - CCLOG("anchorpointX: %f, %f", this->getAnchorPoint().x, widget->getAnchorPoint().x); - CCLOG("anchorpointY: %f, %f", this->getAnchorPoint().y, widget->getAnchorPoint().y); - } Widget::~Widget() { diff --git a/cocos/ui/UIWidget.h b/cocos/ui/UIWidget.h index 6465763828..ddcb5c456c 100644 --- a/cocos/ui/UIWidget.h +++ b/cocos/ui/UIWidget.h @@ -599,7 +599,6 @@ public: * use this function to manually specify the next focused widget regards to each direction */ std::function onNextFocusedWidget; - virtual void compareWidget(Widget* widget); CC_CONSTRUCTOR_ACCESS: diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp index ceb829f98e..4f6ce48331 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp @@ -20,30 +20,10 @@ bool UIButtonTest_Editor::init() { if (UIScene_Editor::init()) { - auto _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); +// auto _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); - Sprite *sp = Sprite::create("cocosui/UIEditorTest/UIButton_Editor/button_n.png"); - CCLOG("contentSize = %f, %f", sp->getContentSize().width, sp->getContentSize().height); - - Sprite *sp2 = Sprite::create("cocosui/UIEditorTest/UIButton_Editor/button_n.png"); - CCLOG("contentSize = %f, %f", sp2->getContentSize().width, sp2->getContentSize().height); - -// auto _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_2(1).json")); -// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/uibutton_editor_2(1).json")); -// _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.csb")); - -// Vector firstLayouts = _layout2->getAllLayouts(_layout2); -// Vector secondLayouts = _layout->getAllLayouts(_layout); -// -// -// CCASSERT(firstLayouts.size() == secondLayouts.size(), "can't compare"); -// -// for (int i=0 ; i < firstLayouts.size(); ++i) { -// Widget *l1 = firstLayouts.at(i); -// Widget *l2 = secondLayouts.at(i); -// l1->compareWidget(l2); -// } + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.csb")); diff --git a/tests/cpp-tests/Resources/ccs-res b/tests/cpp-tests/Resources/ccs-res index b77212bf6f..2173b0b479 160000 --- a/tests/cpp-tests/Resources/ccs-res +++ b/tests/cpp-tests/Resources/ccs-res @@ -1 +1 @@ -Subproject commit b77212bf6fbdc33b9e08a68ed224121ad93864e5 +Subproject commit 2173b0b479e0e7be62df9ded754b20e75e74b0f2 From 95f1bd7e72b3bdaab04b65bdf0b9063515c1da36 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 11:54:25 +0800 Subject: [PATCH 13/72] update loader --- .../editor-support/cocostudio/CocoLoader.cpp | 371 +++++++++--------- cocos/editor-support/cocostudio/CocoLoader.h | 209 +++++----- .../cocostudio/WidgetReader/WidgetReader.cpp | 8 + .../UIButtonTest/UIButtonTest_Editor.cpp | 4 - 4 files changed, 286 insertions(+), 306 deletions(-) diff --git a/cocos/editor-support/cocostudio/CocoLoader.cpp b/cocos/editor-support/cocostudio/CocoLoader.cpp index c2d088d58c..36ff4a4ed4 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.cpp +++ b/cocos/editor-support/cocostudio/CocoLoader.cpp @@ -1,211 +1,196 @@ -/**************************************************************************** - Copyright (c) 2013-2014 Chukong Technologies Inc. - - http://www.cocos2d-x.org - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - ****************************************************************************/ - #include "CocoLoader.h" -namespace cocostudio { - const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; - const char* kObjKeyName[] = { "__type" , "classname" }; - char g_Buff[2048]; + +using namespace std; +using namespace rapidjson; + +namespace cocostudio{ - rapidjson::Type stExpCocoNode::GetType(CocoLoader* pCoco) - { - rapidjson::Type tType = rapidjson::kObjectType; - if(m_ObjIndex >= 0) - { - stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDesc(); - if( m_AttribIndex >= 0 ) - { - stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray; - tType = tpAttribDescArray[m_AttribIndex].m_Type; - if(rapidjson::kFalseType == tType || rapidjson::kTrueType == tType) - { - char* szValue = (char*)m_szValue; - if(szValue[0] == '0') - { - return rapidjson::kFalseType; - } - else - { - return rapidjson::kTrueType; - } - } - - } - else - { - tType = rapidjson::kObjectType; - } - } - else - { - if(m_AttribIndex >= 0) - { -// char* pStringAddr = (char*)pCoco->GetCocoObjectDesc() + pCoco->GetFileHeader()->m_lStringMemAddr ; - tType = (rapidjson::Type)m_ChildNum; - - if(rapidjson::kFalseType == tType || rapidjson::kTrueType == tType) - { - char* szValue = (char*)m_szValue; - if(szValue[0] == '0') - { - return rapidjson::kFalseType; - } - else - { - return rapidjson::kTrueType; - } - } - } - else - { - tType = rapidjson::kArrayType; - } - } - return tType; - } - - char* stExpCocoNode::GetName(CocoLoader* pCoco) - { - char* szName = NULL ; - if(m_ObjIndex >= 0) - { - stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDesc(); - if( m_AttribIndex >= 0 ) - { - stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray; - szName = (char*)tpAttribDescArray[m_AttribIndex].m_szName; - } - else - { - - //Èç¹ûÃû×ÖÓëÀàÃû³Æ²»Í¬£¬Ôò°´ÕæʵֵÉèÖà + +const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; +const char* kObjKeyName[] = { "__type" , "classname" }; +char g_Buff[2048]; + +Type stExpCocoNode::GetType(CocoLoader* pCoco) +{ + Type tType = kObjectType; + if(m_ObjIndex >= 0) + { + stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDescArray(); + if( m_AttribIndex >= 0 ) + { + stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray; + tType = tpAttribDescArray[m_AttribIndex].m_Type; + + if(kFalseType == tType || kTrueType == tType) + { char* szValue = (char*)m_szValue; - if(szValue[0]) + if(szValue[0] == '0') { - //Êý×é - szName = (char*)m_szValue; + return kFalseType; } else { - //½á¹¹ - szName = (char*)tpCocoObjectDesc[m_ObjIndex].m_szName; + return kTrueType; } - } - } - else - { - if(m_AttribIndex >= 0) - { - char* pStringAddr = (char*)pCoco->GetCocoObjectDesc() + pCoco->GetFileHeader()->m_lStringMemAddr ; - szName = m_ChildArray + pStringAddr; } - else - { - szName = (char*)m_szValue; - } - } - return szName ; - } - - char* stExpCocoNode::GetValue() - { - return (char*)m_szValue; - } - - int stExpCocoNode::GetChildNum() - { - return m_ChildNum; - } - - stExpCocoNode* stExpCocoNode::GetChildArray() - { - return (stExpCocoNode*)m_ChildArray; - } - - void stExpCocoNode::ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr) - { - m_szValue = m_szValue + (uint64_t)pStringMemoryAddr; - //Èç¹ûÊÇÎïÌå»òÊý×飬·Ö×é×Ó½áµã - if( -1 == m_AttribIndex ) - { - if(m_ChildNum > 0) - { - m_ChildArray = m_ChildArray + (uint64_t)pCocoNodeAddr; - stExpCocoNode* tpChildArray = (stExpCocoNode*)m_ChildArray; - for(int i = 0 ; i < m_ChildNum ; i++) + } + else + { + tType = kObjectType; + } + } + else + { + if(m_AttribIndex >= 0) + { + tType = (Type)m_ChildNum; + + if(kFalseType == tType || kTrueType == tType) + { + char* szValue = (char*)m_szValue; + if(szValue[0] == '0') { - tpChildArray[i].ReBuild(pCocoNodeAddr,pStringMemoryAddr); + return kFalseType; + } + else + { + return kTrueType; } } } - - } - - CocoLoader::CocoLoader() - { - m_pRootNode = NULL; - m_pObjectDescArray = NULL; - } - - CocoLoader::~CocoLoader() - { - - } - - bool CocoLoader::ReadCocoBinBuff(char* pBinBuff) - { - //Type - char* pTempBuff = pBinBuff; - - m_pFileHeader = (stCocoFileHeader*)pTempBuff; - pTempBuff += sizeof(stCocoFileHeader); - - - char* pStartAddr = pTempBuff; - m_pObjectDescArray = (stExpCocoObjectDesc*)pStartAddr; - - char* pAttrAddr = pStartAddr + m_pFileHeader->m_lAttribMemAddr ; - char* pCocoMemAddr = pStartAddr + m_pFileHeader->m_CocoNodeMemAddr; - char* pStringAddr = pStartAddr + m_pFileHeader->m_lStringMemAddr ; - - m_pRootNode = (stExpCocoNode*)pCocoMemAddr; - - if(1 == m_pFileHeader->m_nFirstUsed) - { - for(int i = 0 ; i < m_pFileHeader->m_ObjectCount ; i++) - { - m_pObjectDescArray[i].ReBuild(pAttrAddr,pStringAddr) ; - } - m_pRootNode->ReBuild(pCocoMemAddr,pStringAddr); - - m_pFileHeader->m_nFirstUsed = 0; - } - - return true; - } + else + { + tType = kArrayType; + } + } + return tType; +} + +char* stExpCocoNode::GetName(CocoLoader* pCoco) +{ + char* szName = NULL ; + if(m_ObjIndex >= 0) + { + stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDescArray(); + if( m_AttribIndex >= 0 ) + { + stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].m_pAttribDescArray; + szName = (char*)tpAttribDescArray[m_AttribIndex].m_szName; + } + else + { + char* szValue = (char*)m_szValue; + if(szValue[0]) + { + szName = (char*)m_szValue; + } + else + { + szName = (char*)tpCocoObjectDesc[m_ObjIndex].m_szName; + } + } + } + else + { + if(m_AttribIndex >= 0) + { + char* pStringAddr = (char*)pCoco->GetCocoObjectDescArray() + pCoco->GetFileHeader()->m_lStringMemAddr ; + szName = m_ChildArray + pStringAddr; + } + else + { + szName = (char*)m_szValue; + } + } + return szName ; +} + +char* stExpCocoNode::GetValue() +{ + return (char*)m_szValue; +} + +int stExpCocoNode::GetChildNum() +{ + return m_ChildNum; +} + +stExpCocoNode* stExpCocoNode::GetChildArray() +{ + return (stExpCocoNode*)m_ChildArray; +} + +void stExpCocoNode::ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr) +{ + m_szValue = m_szValue + (uint64_t)pStringMemoryAddr; + if( -1 == m_AttribIndex ) + { + if(m_ChildNum > 0) + { + m_ChildArray = m_ChildArray + (uint64_t)pCocoNodeAddr; + + stExpCocoNode* tpChildArray = (stExpCocoNode*)m_ChildArray; + for(int i = 0 ; i < m_ChildNum ; i++) + { + tpChildArray[i].ReBuild(pCocoNodeAddr,pStringMemoryAddr); + } + } + } } +CocoLoader::CocoLoader() +{ + m_pRootNode = NULL; + m_pObjectDescArray = NULL; +} + +CocoLoader::~CocoLoader() +{ + +} + +bool CocoLoader::ReadCocoBinBuff(char* pBinBuff) +{ + char* pTempBuff = pBinBuff; + + m_pFileHeader = (stCocoFileHeader*)pTempBuff; + pTempBuff += sizeof(stCocoFileHeader); + + char* pStartAddr = pTempBuff; + m_pObjectDescArray = (stExpCocoObjectDesc*)pStartAddr; + + char* pAttrAddr = pStartAddr + m_pFileHeader->m_lAttribMemAddr ; + char* pCocoMemAddr = pStartAddr + m_pFileHeader->m_CocoNodeMemAddr; + char* pStringAddr = pStartAddr + m_pFileHeader->m_lStringMemAddr ; + + m_pRootNode = (stExpCocoNode*)pCocoMemAddr; + + if(1 == m_pFileHeader->m_nFirstUsed) + { + for(int i = 0 ; i < m_pFileHeader->m_ObjectCount ; i++) + { + m_pObjectDescArray[i].ReBuild(pAttrAddr,pStringAddr) ; + } + m_pRootNode->ReBuild(pCocoMemAddr,pStringAddr); + + m_pFileHeader->m_nFirstUsed = 0; + } + + return true; +} + +stExpCocoObjectDesc* CocoLoader::GetCocoObjectDesc(const char* szObjDesc) +{ + for(int i = 0 ; i < m_pFileHeader->m_ObjectCount ; i++) + { + if(0 == strcmp((char*)m_pObjectDescArray[i].m_szName,szObjDesc)) + { + return &m_pObjectDescArray[i]; + } + } + return NULL; +} +} diff --git a/cocos/editor-support/cocostudio/CocoLoader.h b/cocos/editor-support/cocostudio/CocoLoader.h index 90c43ebb58..ab71e25b66 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.h +++ b/cocos/editor-support/cocostudio/CocoLoader.h @@ -1,5 +1,5 @@ /**************************************************************************** - Copyright (c) 2013-2014 Chukong Technologies Inc. + Copyright (c) 2013 cocos2d-x.org http://www.cocos2d-x.org @@ -29,121 +29,112 @@ #include #include #include +#include "ExtensionMacros.h" #include "rapidjson.h" #include "document.h" -namespace cocostudio { - #pragma pack (4) - struct stExpCocoAttribDesc - { - rapidjson::Type m_Type; - uint64_t m_szName; //¶ÔÓ¦µÄÃû³Æ - uint64_t m_szDefaultValue; //¶ÔÓ¦µÄĬÈÏÖµ - public: + +namespace cocostudio{ - void ReBuild(char* pStringMemoryAddr) - { - m_szName = m_szName + (uint64_t)pStringMemoryAddr; - m_szDefaultValue = m_szDefaultValue + (uint64_t)pStringMemoryAddr; - } - } - ; + +struct stExpCocoAttribDesc +{ + rapidjson::Type m_Type; + uint64_t m_szName; + uint64_t m_szDefaultValue; +public: + + void ReBuild(char* pStringMemoryAddr) + { + m_szName = m_szName + (uint64_t)pStringMemoryAddr; + m_szDefaultValue = m_szDefaultValue + (uint64_t)pStringMemoryAddr; + } +}; + +struct stExpCocoObjectDesc +{ + uint32_t m_nAttribNum; + uint64_t m_szName; + uint64_t m_pAttribDescArray; + +public: + stExpCocoObjectDesc() + { + m_nAttribNum = 0; + m_szName = 0; + m_pAttribDescArray = 0; + } + void ReBuild(char* pAttribMemoryAddr,char* pStringMemoryAddr) + { + m_szName = m_szName + (uint64_t)pStringMemoryAddr; + m_pAttribDescArray = m_pAttribDescArray + (uint64_t)pAttribMemoryAddr; + stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*)m_pAttribDescArray; + for(int i = 0 ; i < m_nAttribNum ; i++) + { + tpAttribDescArray[i].ReBuild(pStringMemoryAddr); + } + } + +}; + +class CocoLoader; + +struct stExpCocoNode +{ +protected: + int32_t m_ObjIndex; + int32_t m_AttribIndex; + uint32_t m_ChildNum; + uint64_t m_szValue; + uint64_t m_ChildArray; - struct stExpCocoObjectDesc - { - uint32_t m_nAttribNum; //ÊôÐÔÊýÁ¿ - uint64_t m_szName; //¶ÔÓ¦µÄÃû³Æ×Ö·û´®µÄλÖÃ,ĬÈÏΪ0 - uint64_t m_pAttribDescArray; //ÊôÐÔÊý×é - public: - - void ReBuild(char* pAttribMemoryAddr,char* pStringMemoryAddr) - { - m_szName = m_szName + (uint64_t)pStringMemoryAddr; - m_pAttribDescArray = m_pAttribDescArray + (uint64_t)pAttribMemoryAddr; - stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*)m_pAttribDescArray; - for(int i = 0 ; i < m_nAttribNum ; i++) - { - tpAttribDescArray[i].ReBuild(pStringMemoryAddr); - } - } - - }; +public: + rapidjson::Type GetType(CocoLoader* pCoco); + char* GetName(CocoLoader* pCoco); + char* GetValue(); + int GetChildNum(); + stExpCocoNode* GetChildArray(); - class CocoLoader; - - struct stExpCocoNode - { - protected: - int32_t m_ObjIndex; //¶ÔÓ¦µÄÎïÌåË÷Òý - int32_t m_AttribIndex; //ÊôÐÔµÄÎïÌåË÷Òý - uint32_t m_ChildNum; //×Ó½ÚµãÊýÁ¿ - uint64_t m_szValue; //¶ÔÓ¦µÄĬÈÏÖµ - uint64_t m_ChildArray; //¶ÔÓ¦µÄ×Ó½ÚµãÊý×é - public: - - - rapidjson::Type GetType(CocoLoader* pCoco); - - char* GetName(CocoLoader* pCoco); - - char* GetValue(); - - int GetChildNum(); - - stExpCocoNode* GetChildArray(); - public: - - inline void ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr); - - } - ; - - - struct stCocoFileHeader - { - char m_FileDesc[32]; - char m_Version[32]; - uint32_t m_nFirstUsed; - uint32_t m_ObjectCount; - uint64_t m_lAttribMemAddr; - uint64_t m_CocoNodeMemAddr; - uint64_t m_lStringMemAddr; - - }; - - - class CocoLoader - { - - stCocoFileHeader* m_pFileHeader; - - stExpCocoNode* m_pRootNode; - - stExpCocoObjectDesc* m_pObjectDescArray; - - public: - - CocoLoader(); - - ~CocoLoader(); - - public: - - - bool ReadCocoBinBuff(char* pBinBuff); - - stCocoFileHeader* GetFileHeader(){return m_pFileHeader;} - - stExpCocoNode* GetRootCocoNode(){return m_pRootNode;} - - stExpCocoObjectDesc* GetCocoObjectDesc(){return m_pObjectDescArray;} - - }; - -#pragma pack () +public: + inline void ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr); + void WriteJson(CocoLoader* pCoco, void* pFileName = NULL, int vLayer = 0, bool bEndNode = false, bool bParentNodeIsArray = false); +}; + + +struct stCocoFileHeader +{ + char m_FileDesc[32]; + char m_Version[32]; + uint32_t m_nFirstUsed; + uint32_t m_ObjectCount; + uint64_t m_lAttribMemAddr; + uint64_t m_CocoNodeMemAddr; + uint64_t m_lStringMemAddr; + +}; + + +class CocoLoader +{ +private: + stCocoFileHeader* m_pFileHeader; + stExpCocoNode* m_pRootNode; + stExpCocoObjectDesc* m_pObjectDescArray; + +public: + CocoLoader(); + ~CocoLoader(); + +public: + bool ReadCocoBinBuff(char* pBinBuff); + stCocoFileHeader* GetFileHeader(){return m_pFileHeader;} + stExpCocoNode* GetRootCocoNode(){return m_pRootNode;} + stExpCocoObjectDesc* GetCocoObjectDescArray(){return m_pObjectDescArray;} + stExpCocoObjectDesc* GetCocoObjectDesc(const char* szObjDesc); +}; + } - - +#pragma pack () #endif \ No newline at end of file diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index 04b00aa56a..04c6c8eae2 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -14,6 +14,13 @@ namespace cocostudio IMPLEMENT_CLASS_WIDGET_READER_INFO(WidgetReader) WidgetReader::WidgetReader() + :sizePercentX(0.0f), + sizePercentY(0.0f), + isAdaptScreen(false), + width(0.0f), + height(0.0f), + positionPercentX(0.0f), + positionPercentY(0.0f) { valueToInt = [=](std::string str) -> int{ return atoi(str.c_str()); @@ -34,6 +41,7 @@ namespace cocostudio } WidgetReader::~WidgetReader() + { } diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp index 4f6ce48331..917e2b5093 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp @@ -36,21 +36,17 @@ bool UIButtonTest_Editor::init() Layout* root = static_cast(_layout->getChildByName("root_Panel")); Text* back_label = static_cast(Helper::seekWidgetByName(root, "back")); -// back_label->addTouchEventListener(this, toucheventselector(UIScene_Editor::toGUIEditorTestScene)); back_label->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::toGUIEditorTestScene, this)); _sceneTitle = static_cast(Helper::seekWidgetByName(root, "UItest")); Button* button = static_cast(Helper::seekWidgetByName(root, "Button_123")); -// button->addTouchEventListener(this, toucheventselector(UIButtonTest_Editor::touchEvent)); button->addTouchEventListener(CC_CALLBACK_2(UIButtonTest_Editor::touchEvent, this)); Button* title_button = static_cast(Helper::seekWidgetByName(root, "Button_126")); -// title_button->addTouchEventListener(this, toucheventselector(UIButtonTest_Editor::touchEvent)); title_button->addTouchEventListener(CC_CALLBACK_2(UIButtonTest_Editor::touchEvent, this)); Button* scale9_button = static_cast(Helper::seekWidgetByName(root, "Button_129")); -// scale9_button->addTouchEventListener(this, toucheventselector(UIButtonTest_Editor::touchEvent)); scale9_button->addTouchEventListener(CC_CALLBACK_2(UIButtonTest_Editor::touchEvent, this)); _displayValueLabel = Text::create(); From 615995af542e744b2985e0c5cb90be9be46276cc Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 14:15:11 +0800 Subject: [PATCH 14/72] add base property parser for WidgetReader --- .../cocostudio/WidgetReader/WidgetReader.cpp | 100 ++++++++++++++++++ .../cocostudio/WidgetReader/WidgetReader.h | 5 +- 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index 04c6c8eae2..24a325671b 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -292,6 +292,106 @@ namespace cocostudio } } + void WidgetReader::setPropsFromBinary(cocos2d::ui::Widget *widget, cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode) + { + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + + + for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "ignoreSize") { + widget->ignoreContentAdaptWithSize(valueToBool(value)); + }else if(key == "sizeType"){ + widget->setSizeType((Widget::SizeType)valueToInt(value)); + }else if(key == "positionType"){ + widget->setPositionType((Widget::PositionType)valueToInt(value)); + }else if(key == "sizePercentX"){ + widget->setSizePercent(Vec2(valueToFloat(value), widget->getSizePercent().y)); + }else if(key == "sizePercentY"){ + widget->setSizePercent(Vec2(widget->getSizePercent().x, valueToFloat(value))); + }else if(key == "positionPercentX"){ + widget->setPositionPercent(Vec2(valueToFloat(value), widget->getPositionPercent().y)); + }else if(key == "positionPercentY"){ + widget->setPositionPercent(Vec2(widget->getPositionPercent().x, valueToFloat(value))); + }else if (key == "width"){ + widget->setSize(Size(valueToFloat(value), widget->getSize().height)); + }else if(key == "height"){ + widget->setSize(Size(widget->getSize().width, valueToFloat(value))); + }else if(key == "tag"){ + widget->setTag(valueToInt(value)); + }else if(key == "actiontag"){ + widget->setActionTag(valueToInt(value)); + }else if(key == "touchAble"){ + widget->setTouchEnabled(valueToBool(value)); + }else if(key == "name"){ + std::string widgetName = value.empty() ? "default" : value; + widget->setName(widgetName); + }else if(key == "x"){ + widget->setPosition(Vec2(valueToFloat(value), widget->getPosition().y)); + }else if(key == "y"){ + widget->setPosition(Vec2(widget->getPosition().x, valueToFloat(value))); + }else if(key == "scaleX"){ + widget->setScaleX(valueToFloat(value)); + }else if(key == "scaleY"){ + widget->setScaleY(valueToFloat(value)); + }else if(key == "rotation"){ + widget->setRotation(valueToFloat(value)); + }else if(key == "visible"){ + widget->setVisible(valueToBool(value)); + }else if(key == "ZOrder"){ + widget->setZOrder(valueToInt(value)); + }else if(key == "layoutParameter"){ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); + + ui::LinearLayoutParameter *linearParameter = ui::LinearLayoutParameter::create(); + ui::RelativeLayoutParameter *relativeParameter = ui::RelativeLayoutParameter::create(); + ui::Margin mg; + + int paramType = -1; + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); + std::string innerValue = layoutCocosNode[j].GetValue(); + + if (innerKey == "type") { + paramType = valueToInt(innerValue); + }else if(innerKey == "gravity"){ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); + }else if(innerKey == "relativeName"){ + relativeParameter->setRelativeName(innerValue); + }else if(innerKey == "relativeToName"){ + relativeParameter->setRelativeToWidgetName(innerValue); + }else if(innerKey == "align"){ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); + }else if(innerKey == "marginLeft"){ + mg.left = valueToFloat(innerValue); + }else if(innerKey == "marginTop"){ + mg.top = valueToFloat(innerValue); + }else if(innerKey == "marginRight"){ + mg.right = valueToFloat(innerValue); + }else if(innerKey == "marginDown"){ + mg.bottom = valueToFloat(innerValue); + } + } + + linearParameter->setMargin(mg); + relativeParameter->setMargin(mg); + + switch (paramType) { + case 1: + widget->setLayoutParameter(linearParameter); + break; + case 2: + widget->setLayoutParameter(relativeParameter); + default: + break; + } + } + + } + } + } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index 08c779f383..0dee7d533e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -54,10 +54,7 @@ namespace cocostudio virtual void setColorPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) - { - - }; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); protected: std::string getResourcePath(const rapidjson::Value& dict, const std::string& key, From 12bb7564cdaf38421ade87ca029fceebc62eea0e Mon Sep 17 00:00:00 2001 From: geron-cn Date: Wed, 18 Jun 2014 14:35:43 +0800 Subject: [PATCH 15/72] fix cannot compile in windows --- cocos/3d/CCAnimationCurve.h | 2 +- cocos/3d/CCAnimationCurve.inl | 2 +- cocos/editor-support/cocostudio/CCSSceneReader.cpp | 2 +- cocos/editor-support/cocostudio/CocoLoader.h | 6 +++--- .../WidgetReader/ListViewReader/ListViewReader.cpp | 2 +- .../WidgetReader/PageViewReader/PageViewReader.cpp | 6 ++++-- .../WidgetReader/PageViewReader/PageViewReader.h | 2 +- .../ScrollViewReader/ScrollViewReader.cpp | 2 +- .../cocostudio/proj.win32/libCocosStudio.vcxproj | 3 +++ .../proj.win32/libCocosStudio.vcxproj.filters | 11 ++++++++++- cocos/renderer/CCMeshCommand.h | 2 +- 11 files changed, 27 insertions(+), 13 deletions(-) diff --git a/cocos/3d/CCAnimationCurve.h b/cocos/3d/CCAnimationCurve.h index 6bcc3aadc2..83d0e00994 100644 --- a/cocos/3d/CCAnimationCurve.h +++ b/cocos/3d/CCAnimationCurve.h @@ -38,7 +38,7 @@ NS_CC_BEGIN enum class EvaluateType { LINEAR, - NEAR, + NEARE, QUAT_SLERP, USER_FUNCTION, }; diff --git a/cocos/3d/CCAnimationCurve.inl b/cocos/3d/CCAnimationCurve.inl index 247aa7b218..415a042f7a 100644 --- a/cocos/3d/CCAnimationCurve.inl +++ b/cocos/3d/CCAnimationCurve.inl @@ -32,7 +32,7 @@ void AnimationCurve::evaluate(float time, float* dst, EvaluateTyp } } break; - case EvaluateType::NEAR: + case EvaluateType::NEARE: { float* src = t > 0.5f ? toValue : fromValue; memcpy(dst, src, _componentSizeByte); diff --git a/cocos/editor-support/cocostudio/CCSSceneReader.cpp b/cocos/editor-support/cocostudio/CCSSceneReader.cpp index 02c2b21020..894d4aa39b 100644 --- a/cocos/editor-support/cocostudio/CCSSceneReader.cpp +++ b/cocos/editor-support/cocostudio/CCSSceneReader.cpp @@ -25,7 +25,7 @@ THE SOFTWARE. #include "cocostudio/CocoStudio.h" #include "ui/CocosGUI.h" #include "audio/include/SimpleAudioEngine.h" -#include "ObjectFactory.h" +#include "base/ObjectFactory.h" using namespace cocos2d; using namespace ui; diff --git a/cocos/editor-support/cocostudio/CocoLoader.h b/cocos/editor-support/cocostudio/CocoLoader.h index ab71e25b66..319faee4e4 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.h +++ b/cocos/editor-support/cocostudio/CocoLoader.h @@ -30,8 +30,8 @@ #include #include #include "ExtensionMacros.h" -#include "rapidjson.h" -#include "document.h" +#include "json/rapidjson.h" +#include "json/document.h" #pragma pack (4) @@ -70,7 +70,7 @@ public: m_szName = m_szName + (uint64_t)pStringMemoryAddr; m_pAttribDescArray = m_pAttribDescArray + (uint64_t)pAttribMemoryAddr; stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*)m_pAttribDescArray; - for(int i = 0 ; i < m_nAttribNum ; i++) + for(uint32_t i = 0 ; i < m_nAttribNum ; i++) { tpAttribDescArray[i].ReBuild(pStringMemoryAddr); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp index 7bcec3f422..c4294adef5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp @@ -45,7 +45,7 @@ namespace cocostudio std::string value = stChildArray[i].GetValue(); if (key == "direction") { - listView->setDirection((ScrollView::Direction)valueToFloat(value)); + listView->setDirection((ScrollView::Direction)valueToInt(value)); } else if(key == "gravity"){ listView->setGravity((ListView::Gravity)valueToInt(value)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp index 8ab085b10e..ea4c08a796 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp @@ -2,6 +2,8 @@ #include "PageViewReader.h" #include "ui/UIPageView.h" +#include "ui/UILayout.h" +#include "cocostudio/CocoLoader.h" USING_NS_CC; using namespace ui; @@ -32,8 +34,8 @@ namespace cocostudio } void PageViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) - { - LayoutReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + { + LayoutReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); } void PageViewReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h index cfd1dd529e..59a1b17c3c 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp index e1c67f9673..d27ab53491 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp @@ -164,7 +164,7 @@ namespace cocostudio else if(key == "innerHeight"){ innerHeight = valueToFloat(value); }else if(key == "direction"){ - scrollView->setDirection((ScrollView::Direction)valueToFloat(value)); + scrollView->setDirection((ScrollView::Direction)valueToInt(value)); }else if(key == "bounceEnable"){ scrollView->setBounceEnabled(valueToBool(value)); } diff --git a/cocos/editor-support/cocostudio/proj.win32/libCocosStudio.vcxproj b/cocos/editor-support/cocostudio/proj.win32/libCocosStudio.vcxproj index 8a5ffbb33e..cdb92f2484 100644 --- a/cocos/editor-support/cocostudio/proj.win32/libCocosStudio.vcxproj +++ b/cocos/editor-support/cocostudio/proj.win32/libCocosStudio.vcxproj @@ -41,6 +41,7 @@ + @@ -102,6 +103,8 @@ + + diff --git a/cocos/editor-support/cocostudio/proj.win32/libCocosStudio.vcxproj.filters b/cocos/editor-support/cocostudio/proj.win32/libCocosStudio.vcxproj.filters index 655cb64627..649cab8dd4 100644 --- a/cocos/editor-support/cocostudio/proj.win32/libCocosStudio.vcxproj.filters +++ b/cocos/editor-support/cocostudio/proj.win32/libCocosStudio.vcxproj.filters @@ -228,6 +228,9 @@ reader\WidgetReader\PageViewReader + + json + @@ -413,5 +416,11 @@ reader\WidgetReader\PageViewReader + + json + + + json + - + \ No newline at end of file diff --git a/cocos/renderer/CCMeshCommand.h b/cocos/renderer/CCMeshCommand.h index 031d8b9a51..fb88674b90 100644 --- a/cocos/renderer/CCMeshCommand.h +++ b/cocos/renderer/CCMeshCommand.h @@ -34,7 +34,7 @@ NS_CC_BEGIN class GLProgramState; class GLProgram; -class Uniform; +struct Uniform; //it is a common mesh class MeshCommand : public RenderCommand From 63475a6f813cbce6bb0564bab21147d1b15db80a Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 14:44:00 +0800 Subject: [PATCH 16/72] refactor Loader --- .../ButtonReader/ButtonReader.cpp | 35 +++--- .../CheckBoxReader/CheckBoxReader.cpp | 35 +++--- .../ImageViewReader/ImageViewReader.cpp | 35 +++--- .../LayoutReader/LayoutReader.cpp | 54 ++++---- .../LoadingBarReader/LoadingBarReader.cpp | 38 +++--- .../ScrollViewReader/ScrollViewReader.cpp | 115 +----------------- .../SliderReader/SliderReader.cpp | 37 +++--- .../TextAtlasReader/TextAtlasReader.cpp | 33 +++-- .../TextBMFontReader/TextBMFontReader.cpp | 33 +++-- .../TextFieldReader/TextFieldReader.cpp | 33 +++-- .../WidgetReader/TextReader/TextReader.cpp | 33 +++-- .../cocostudio/WidgetReader/WidgetReader.cpp | 41 ++++--- .../cocostudio/WidgetReader/WidgetReader.h | 20 +-- 13 files changed, 203 insertions(+), 339 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index 22f7c70cc5..5981973d60 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -62,21 +62,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -87,9 +87,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -148,28 +148,23 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } - - else if (key == "scale9Enable") { button->setScale9Enabled(valueToBool(value)); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index 089539fcb8..8f0307b233 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -42,7 +42,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - CCLOG("key = %s, index : %d", key.c_str(), i); +// CCLOG("key = %s, index : %d", key.c_str(), i); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); }else if(key == "sizeType"){ @@ -50,21 +50,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -75,9 +75,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -136,25 +136,22 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } else if (key == "backGroundBoxData"){ diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 9e8e350733..04bcc66b6c 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -45,7 +45,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - CCLOG("ImageView: key = %s, value = %d", key.c_str(), i); +// CCLOG("ImageView: key = %s, value = %d", key.c_str(), i); if (key == "ignoreSize") { widget->ignoreContentAdaptWithSize(valueToBool(value)); @@ -54,21 +54,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -79,9 +79,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -140,25 +140,22 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } else if (key == "scale9Enable") { imageView->setScale9Enabled(valueToBool(value)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index 25281c43e0..6fa76a2af2 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -48,8 +48,8 @@ namespace cocostudio int ecr=0, ecg=0, ecb= 0; float bgcv1 = 0.0f, bgcv2= 0.0f; float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; - bool isAdaptScreen = false; Layout::Type layoutType; + int bgColorOpacity = panel->getBackGroundColorOpacity(); for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); @@ -62,21 +62,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -87,9 +87,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -148,28 +148,22 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); - } - else if (key == "adaptScreen") { - isAdaptScreen = valueToBool(value); + _originalAnchorPoint.y = valueToFloat(value); } else if(key == "width"){ w = valueToFloat(value); @@ -208,7 +202,7 @@ namespace cocostudio }else if(key == "vectorY"){ bgcv2 = valueToFloat(value); }else if(key == "bgColorOpacity"){ - panel->setBackGroundColorOpacity(valueToInt(value)); + bgColorOpacity = valueToInt(value); }else if( key == "colorType"){ panel->setBackGroundColorType(Layout::BackGroundColorType(valueToInt(value))); }else if (key == "backGroundImageData"){ @@ -239,17 +233,19 @@ namespace cocostudio } - Size screenSize = Director::getInstance()->getWinSize(); - if (isAdaptScreen) { - w = screenSize.width; - h = screenSize.height; - } - panel->setSize(Size(w,h)); panel->setBackGroundColor(Color3B(scr, scg, scb),Color3B(ecr, ecg, ecb)); panel->setBackGroundColor(Color3B(cr, cg, cb)); panel->setBackGroundColorVector(Vec2(bgcv1, bgcv2)); + + panel->setBackGroundColorOpacity(bgColorOpacity); + + + panel->setBackGroundImageColor(Color3B(_color.r, _color.g, _color.b)); + + panel->setBackGroundImageOpacity(_opacity); + if (panel->isBackGroundImageScale9Enabled()) { panel->setBackGroundImageCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp index dd15962041..ffd8d2cae5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp @@ -40,6 +40,7 @@ namespace cocostudio LoadingBar* loadingBar = static_cast(widget); this->beginSetBasicProperties(widget); float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; + int percent = loadingBar->getPercent(); stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); @@ -54,21 +55,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -79,9 +80,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -140,25 +141,22 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } else if (key == "scale9Enable") { loadingBar->setScale9Enabled(valueToBool(value)); @@ -186,7 +184,7 @@ namespace cocostudio }else if(key == "direction"){ loadingBar->setDirection((LoadingBar::Direction)valueToInt(value)); }else if(key == "percent"){ - loadingBar->setPercent(valueToInt(value)); + percent = valueToInt(value); } } //end of for loop @@ -194,7 +192,7 @@ namespace cocostudio if (loadingBar->isScale9Enabled()) { loadingBar->setCapInsets(Rect(capsx, capsy, capsWidth, capsHeight)); } - + loadingBar->setPercent(percent); this->endSetBasicProperties(widget); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp index e1c67f9673..fba261d993 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp @@ -45,120 +45,7 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - width = valueToFloat(value); - }else if(key == "height"){ - height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - position.x = valueToFloat(value); - }else if(key == "y"){ - position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } - - else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); - }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); - }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); - }else if(key == "colorB") - { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); - } - else if (key == "innerWidth") { + if (key == "innerWidth") { innerWidth = valueToFloat(value); } else if(key == "innerHeight"){ diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index e6e2f0cffc..a47c1b4bbd 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -39,6 +39,7 @@ namespace cocostudio Slider* slider = static_cast(widget); float barLength = 0.0f; + int percent = slider->getPercent(); stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { @@ -52,21 +53,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -77,9 +78,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -138,32 +139,29 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } //control custom properties else if (key == "scale9Enable") { slider->setScale9Enabled(valueToBool(value)); } else if(key == "percent"){ - slider->setPercent(valueToInt(value)); + percent = valueToInt(value); }else if(key == "barFileNameData"){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -223,6 +221,7 @@ namespace cocostudio if (slider->isScale9Enabled()) { slider->setSize(Size(barLength, slider->getContentSize().height)); } + slider->setPercent(percent); this->endSetBasicProperties(widget); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp index ead7db5f26..d2ac6f1553 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp @@ -58,21 +58,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -83,9 +83,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -144,25 +144,22 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } else if (key == "stringValue") { stringValue = value; diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp index eeefd20ec1..ad3268f195 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp @@ -52,21 +52,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -77,9 +77,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -138,25 +138,22 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } else if(key == "fileNameData"){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp index 3271646939..fde3284b59 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp @@ -51,21 +51,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -76,9 +76,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -137,25 +137,22 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } else if(key == "placeHolder"){ textField->setPlaceHolder(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp index 9979e70053..d594217963 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp @@ -53,21 +53,21 @@ namespace cocostudio }else if(key == "positionType"){ widget->setPositionType((Widget::PositionType)valueToInt(value)); }else if(key == "sizePercentX"){ - sizePercentX = valueToFloat(value); + _sizePercentX = valueToFloat(value); }else if(key == "sizePercentY"){ - sizePercentY = valueToFloat(value); + _sizePercentY = valueToFloat(value); }else if(key == "positionPercentX"){ - positionPercentX = valueToFloat(value); + _positionPercentX = valueToFloat(value); }else if(key == "positionPercentY"){ - positionPercentY = valueToFloat(value); + _positionPercentY = valueToFloat(value); } else if(key == "adaptScreen"){ - isAdaptScreen = valueToBool(value); + _isAdaptScreen = valueToBool(value); } else if (key == "width"){ - width = valueToFloat(value); + _width = valueToFloat(value); }else if(key == "height"){ - height = valueToFloat(value); + _height = valueToFloat(value); }else if(key == "tag"){ widget->setTag(valueToInt(value)); }else if(key == "actiontag"){ @@ -78,9 +78,9 @@ namespace cocostudio std::string widgetName = value.empty() ? "default" : value; widget->setName(widgetName); }else if(key == "x"){ - position.x = valueToFloat(value); + _position.x = valueToFloat(value); }else if(key == "y"){ - position.y = valueToFloat(value); + _position.y = valueToFloat(value); }else if(key == "scaleX"){ widget->setScaleX(valueToFloat(value)); }else if(key == "scaleY"){ @@ -139,25 +139,22 @@ namespace cocostudio } else if (key == "opacity") { - widget->setOpacity(valueToInt(value)); + _opacity = valueToInt(value); }else if(key == "colorR"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B(valueToInt(value), color.g, color.b)); + _color.r = valueToInt(value); }else if(key == "colorG"){ - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, valueToInt(value), color.b)); + _color.g = valueToInt(value); }else if(key == "colorB") { - Color3B color = widget->getColor(); - widget->setColor(Color3B( color.r, color.g , valueToInt(value))); + _color.b = valueToInt(value); }else if(key == "flipX"){ widget->setFlippedX(valueToBool(value)); }else if(key == "flipY"){ widget->setFlippedY(valueToBool(value)); }else if(key == "anchorPointX"){ - originalAnchorPoint.x = valueToFloat(value); + _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ - originalAnchorPoint.y = valueToFloat(value); + _originalAnchorPoint.y = valueToFloat(value); } else if (key == "touchScaleEnable") { label->setTouchScaleChangeEnabled(valueToBool(value)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index 24a325671b..db369da192 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -14,13 +14,14 @@ namespace cocostudio IMPLEMENT_CLASS_WIDGET_READER_INFO(WidgetReader) WidgetReader::WidgetReader() - :sizePercentX(0.0f), - sizePercentY(0.0f), - isAdaptScreen(false), - width(0.0f), - height(0.0f), - positionPercentX(0.0f), - positionPercentY(0.0f) + :_sizePercentX(0.0f), + _sizePercentY(0.0f), + _isAdaptScreen(false), + _width(0.0f), + _height(0.0f), + _positionPercentX(0.0f), + _positionPercentY(0.0f), + _opacity(255) { valueToInt = [=](std::string str) -> int{ return atoi(str.c_str()); @@ -198,25 +199,29 @@ namespace cocostudio void WidgetReader::beginSetBasicProperties(cocos2d::ui::Widget *widget) { - position = widget->getPosition(); + _position = widget->getPosition(); //set default color - widget->setColor(Color3B(255,255,255)); - originalAnchorPoint = widget->getAnchorPoint(); + _color = Color3B(255,255,255); + widget->setColor(_color); + _opacity = widget->getOpacity(); + _originalAnchorPoint = widget->getAnchorPoint(); } void WidgetReader::endSetBasicProperties(Widget *widget) { Size screenSize = Director::getInstance()->getWinSize(); - widget->setPositionPercent(Vec2(positionPercentX, positionPercentY)); - widget->setSizePercent(Vec2(sizePercentX, sizePercentY)); - if (isAdaptScreen) { - width = screenSize.width; - height = screenSize.height; + widget->setPositionPercent(Vec2(_positionPercentX, _positionPercentY)); + widget->setSizePercent(Vec2(_sizePercentX, _sizePercentY)); + if (_isAdaptScreen) { + _width = screenSize.width; + _height = screenSize.height; } - widget->setSize(Size(width, height)); - widget->setPosition(position); - widget->setAnchorPoint(originalAnchorPoint); + widget->setColor(_color); + widget->setOpacity(_opacity); + widget->setSize(Size(_width, _height)); + widget->setPosition(_position); + widget->setAnchorPoint(_originalAnchorPoint); } std::string WidgetReader::getResourcePath(const rapidjson::Value &dict, diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index 0dee7d533e..0d46881b36 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -74,15 +74,17 @@ namespace cocostudio std::function valueToBool; std::function valueToFloat; - float sizePercentX; - float sizePercentY; - float positionPercentX; - float positionPercentY; - float width ; - float height; - cocos2d::Vec2 position; - bool isAdaptScreen; - cocos2d::Vec2 originalAnchorPoint; + float _sizePercentX; + float _sizePercentY; + float _positionPercentX; + float _positionPercentY; + float _width ; + float _height; + cocos2d::Color3B _color; + int _opacity; + cocos2d::Vec2 _position; + bool _isAdaptScreen; + cocos2d::Vec2 _originalAnchorPoint; }; } From f614e9a89b8fb29188d8a99024f0b7a5104902b8 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 14:56:26 +0800 Subject: [PATCH 17/72] fix tests --- .../UILayoutTest/UILayoutTest_Editor.cpp | 18 +++++++++--------- .../UIListViewTest/UIListViewTest_Editor.cpp | 4 ++-- .../UILoadingBarTest_Editor.cpp | 2 +- .../UIPageViewTest/UIPageViewTest_Editor.cpp | 2 +- .../UIScrollViewTest_Editor.cpp | 10 +++++----- .../UITextAtlasTest/UITextAtlasTest_Editor.cpp | 2 +- .../UITextBMFontTest_Editor.cpp | 2 +- .../UITextFieldTest/UITextFieldTest_Editor.cpp | 2 +- .../UITextTest/UITextTest_Editor.cpp | 2 +- .../UIWidgetAddNodeTest_Editor.cpp | 2 +- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp index 883ba9187e..17a7d92bd2 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp @@ -20,7 +20,7 @@ bool UILayoutTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Editor/ui_layout_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Editor/ui_layout_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Editor/ui_layout_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -76,7 +76,7 @@ bool UILayoutTest_Color_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Color_Editor/ui_layout_color_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Color_Editor/ui_layout_color_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Color_Editor/ui_layout_color_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -132,7 +132,7 @@ bool UILayoutTest_Gradient_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Gradient_Color_Editor/ui_layout_gradient_color_editor_1_0.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Gradient_Color_Editor/ui_layout_gradient_color_editor_1_0.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Gradient_Color_Editor/ui_layout_gradient_color_editor_1_0.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -188,7 +188,7 @@ bool UILayoutTest_BackGroundImage_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_BackgroundImage_Editor/ui_layout_backgroundimage_editor_1_0_0.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_BackgroundImage_Editor/ui_layout_backgroundimage_editor_1_0_0.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_BackgroundImage_Editor/ui_layout_backgroundimage_editor_1_0_0.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -244,7 +244,7 @@ bool UILayoutTest_BackGroundImage_Scale9_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Scale9_BackgroundImage_Editor/ui_layout_scale9_backgroundimage_editor.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Scale9_BackgroundImage_Editor/ui_layout_scale9_backgroundimage_editor.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Scale9_BackgroundImage_Editor/ui_layout_scale9_backgroundimage_editor.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -300,7 +300,7 @@ bool UILayoutTest_Layout_Linear_Vertical_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Vertical_Layout_Editor/ui_layout_linear_vertical_layout_editor.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Vertical_Layout_Editor/ui_layout_linear_vertical_layout_editor.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Vertical_Layout_Editor/ui_layout_linear_vertical_layout_editor.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -356,7 +356,7 @@ bool UILayoutTest_Layout_Linear_Horizontal_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Horizontal_Layout_Editor/ui_layout_linear_horizontal_layout_editor.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Horizontal_Layout_Editor/ui_layout_linear_horizontal_layout_editor.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Horizontal_Layout_Editor/ui_layout_linear_horizontal_layout_editor.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -413,7 +413,7 @@ bool UILayoutTest_Layout_Relative_Align_Parent_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Parent_Editor/ui_layout_relative_align_parent_editor.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Parent_Editor/ui_layout_relative_align_parent_editor.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Parent_Editor/ui_layout_relative_align_parent_editor.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -469,7 +469,7 @@ bool UILayoutTest_Layout_Relative_Location_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Location_Editor/ui_layout_relative_align_location_editor.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Location_Editor/ui_layout_relative_align_location_editor.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Location_Editor/ui_layout_relative_align_location_editor.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp index 8134f07e76..b45278649b 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp @@ -20,7 +20,7 @@ bool UIListViewTest_Vertical_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Vertical_Editor/ui_listview_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Vertical_Editor/ui_listview_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Vertical_Editor/ui_listview_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -82,7 +82,7 @@ bool UIListViewTest_Horizontal_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Horizontal_Editor/ui_listview_horizontal_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Horizontal_Editor/ui_listview_horizontal_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Horizontal_Editor/ui_listview_horizontal_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp index 5984081c6e..0d8017f330 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp @@ -22,7 +22,7 @@ bool UILoadingBarTest_Editor::init() scheduleUpdate(); // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILoadingBar_Editor/ui_loadingbar_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILoadingBar_Editor/ui_loadingbar_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILoadingBar_Editor/ui_loadingbar_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp index a017a73183..93770b3662 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp @@ -21,7 +21,7 @@ bool UIPageViewTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIPageView_Editor/ui_pageview_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIPageView_Editor/ui_pageview_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIPageView_Editor/ui_pageview_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp index ed4370af9c..3a792a9a1c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp @@ -20,7 +20,7 @@ bool UIScrollViewTest_Vertical_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Vertical_Editor/ui_scrollview_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Vertical_Editor/ui_scrollview_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Vertical_Editor/ui_scrollview_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -76,7 +76,7 @@ bool UIScrollViewTest_Horizontal_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Horizontal_Editor/ui_scrollview_horizontal_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Horizontal_Editor/ui_scrollview_horizontal_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Horizontal_Editor/ui_scrollview_horizontal_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -132,7 +132,7 @@ bool UIScrollViewTest_Both_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Both_Editor/ui_scrollview_both_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Both_Editor/ui_scrollview_both_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Both_Editor/ui_scrollview_both_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -188,7 +188,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UITest/UITest.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UITest/UITest.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); @@ -235,7 +235,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Bounce_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UITest/UITest.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UITest/UITest.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp index fe7ed4c79f..8f05b1ab32 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp @@ -9,7 +9,7 @@ bool UITextAtlasTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabelAtlas_Editor/ui_labelatlas_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabelAtlas_Editor/ui_labelatlas_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabelAtlas_Editor/ui_labelatlas_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp index d366e70bde..b6733613dd 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp @@ -10,7 +10,7 @@ bool UITextBMFontTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabelBMFont_Editor/ui_labelbmfont_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabelBMFont_Editor/ui_labelbmfont_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabelBMFont_Editor/ui_labelbmfont_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp index da90cc4c88..7e4f4ba96c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp @@ -21,7 +21,7 @@ bool UITextFieldTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UITextField_Editor/ui_textfield_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UITextField_Editor/ui_textfield_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UITextField_Editor/ui_textfield_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp index 04c70ae511..e2645ef406 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp @@ -12,7 +12,7 @@ bool UITextTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabel_Editor/ui_label_editor_1.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabel_Editor/ui_label_editor_1.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UILabel_Editor/ui_label_editor_1.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp index 1bf58c4cb1..e7561767e4 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp @@ -20,7 +20,7 @@ bool UIWidgetAddNodeTest_Editor::init() if (UIScene_Editor::init()) { // _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIWidgetAddNode_Editor/ui_widget_add_node_editor.json")); - _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIWidgetAddNode_Editor/ui_widget_add_node_editor.ubi")); + _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UIEditorTest/UIWidgetAddNode_Editor/ui_widget_add_node_editor.csb")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); Size rootSize = _layout->getSize(); From 1533374bd17b94447231aeab75ec7309808a2377 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 15:55:01 +0800 Subject: [PATCH 18/72] add ui animation for binary parsing --- .../cocostudio/CCActionManagerEx.cpp | 37 ++++ .../cocostudio/CCActionManagerEx.h | 5 + .../cocostudio/CCActionNode.cpp | 144 ++++++++++++++ .../editor-support/cocostudio/CCActionNode.h | 9 +- .../cocostudio/CCActionObject.cpp | 183 ++++++++++++------ .../cocostudio/CCActionObject.h | 10 + .../cocostudio/CCSGUIReader.cpp | 20 +- 7 files changed, 339 insertions(+), 69 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCActionManagerEx.cpp b/cocos/editor-support/cocostudio/CCActionManagerEx.cpp index a439f843cb..655ace9e3b 100644 --- a/cocos/editor-support/cocostudio/CCActionManagerEx.cpp +++ b/cocos/editor-support/cocostudio/CCActionManagerEx.cpp @@ -24,6 +24,7 @@ THE SOFTWARE. #include "cocostudio/CCActionManagerEx.h" #include "cocostudio/DictionaryHelper.h" +#include "cocostudio/CocoLoader.h" using namespace cocos2d; @@ -70,6 +71,42 @@ void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::V } _actionDic.insert(std::pair>(fileName, actionList)); } + + void ActionManagerEx::initWithBinary(const char* file, + cocos2d::Ref *root, + CocoLoader* pCocoLoader, + stExpCocoNode* pCocoNode) + { + std::string path = file; + ssize_t pos = path.find_last_of("/"); + std::string fileName = path.substr(pos+1,path.length()); + CCLOG("filename == %s",fileName.c_str()); + cocos2d::Vector actionList; + + stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *actionNode = NULL; + for (int i=0; i < pCocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + if (key == "actionlist") { + actionNode = &stChildArray[i]; + break; + } + } + if (NULL != actionNode) + { + int actionCount = actionNode->GetChildNum(); + for (int i = 0; i < actionCount; ++i) { + ActionObject* action = new ActionObject(); + action->autorelease(); + + action->initWithBinary(pCocoLoader, actionNode->GetChildArray(), root); + + actionList.pushBack(action); + } + } + _actionDic.insert(std::pair>(fileName, actionList)); + + } ActionObject* ActionManagerEx::getActionByName(const char* jsonName,const char* actionName) diff --git a/cocos/editor-support/cocostudio/CCActionManagerEx.h b/cocos/editor-support/cocostudio/CCActionManagerEx.h index b33b099342..b198f0fa23 100644 --- a/cocos/editor-support/cocostudio/CCActionManagerEx.h +++ b/cocos/editor-support/cocostudio/CCActionManagerEx.h @@ -29,6 +29,9 @@ THE SOFTWARE. #include "cocostudio/DictionaryHelper.h" namespace cocostudio { + +class CocoLoader; +struct stExpCocoNode; class ActionManagerEx:public cocos2d::Ref { @@ -96,6 +99,8 @@ public: /*init properties with json dictionay*/ void initWithDictionary(const char* jsonName,const rapidjson::Value &dic, Ref* root); + void initWithBinary(const char* file, Ref* root, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + /** * Release all actions. * diff --git a/cocos/editor-support/cocostudio/CCActionNode.cpp b/cocos/editor-support/cocostudio/CCActionNode.cpp index f610c0e15f..33a553be2b 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.cpp +++ b/cocos/editor-support/cocostudio/CCActionNode.cpp @@ -27,6 +27,7 @@ THE SOFTWARE. #include "cocostudio/DictionaryHelper.h" #include "ui/UIWidget.h" #include "ui/UIHelper.h" +#include "cocostudio/CocoLoader.h" using namespace cocos2d; using namespace ui; @@ -167,6 +168,149 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) } initActionNodeFromRoot(root); } + + int ActionNode::valueToInt(std::string& value) + { + return atoi(value.c_str()); + } + bool ActionNode::valueToBool(std::string& value) + { + int intValue = valueToInt(value); + if (1 == intValue) { + return true; + }else{ + return false; + } + } + float ActionNode::valueToFloat(std::string& value) + { + return atof(value.c_str()); + } + + void ActionNode::initWithBinary(CocoLoader *pCocoLoader, + stExpCocoNode *pCocoNode, + cocos2d::Ref *root) + { + + stExpCocoNode *stChildNode = pCocoNode; + + int actionNodeCount = stChildNode->GetChildNum(); + stChildNode = stChildNode[0].GetChildArray(); + stExpCocoNode *frameListNode = NULL; + for (int i = 0; i < actionNodeCount; ++i) { + std::string key = stChildNode[i].GetName(pCocoLoader); + std::string value = stChildNode[i].GetValue(); + if (key == "ActionTag") { + setActionTag(valueToInt(value)); + }else if (key == "actionframelist"){ + frameListNode = &stChildNode[i]; + } + } + + int actionFrameCount = frameListNode->GetChildNum(); + stExpCocoNode *stFrameChildNode = frameListNode->GetChildArray(); + for (int i=0; i frameTweenParameter; + + int framesCount = stFrameChildNode[i].GetChildNum(); + stExpCocoNode *innerFrameNode = stFrameChildNode[i].GetChildArray(); + for (int j = 0; j < framesCount; j++) { + std::string key = innerFrameNode[j].GetName(pCocoLoader); + std::string value = innerFrameNode[j].GetValue(); + + if (key == "frameid") { + frameIndex = valueToInt(value); + }else if(key == "tweenType"){ + frameTweenType = valueToInt(value); + }else if (key == "tweenParameter"){ + // There are no tweenParameter args in the json file + int tweenParameterCount = innerFrameNode[j].GetChildNum(); + stExpCocoNode *tweenParameterArray = innerFrameNode[j].GetChildArray(); + for (int k = 0; k < tweenParameterCount; ++k) { + std::string t_key = tweenParameterArray[j].GetName(pCocoLoader); + std::string t_value = tweenParameterArray[j].GetValue(); + frameTweenParameter.push_back(valueToFloat(t_value)); + } + }else if (key == "positionx"){ + positionX = valueToFloat(value); + }else if (key == "positiony"){ + positionY = valueToFloat(value); + ActionMoveFrame* actionFrame = new ActionMoveFrame(); + actionFrame->autorelease(); + actionFrame->setEasingType(frameTweenType); + actionFrame->setEasingParameter(frameTweenParameter); + actionFrame->setFrameIndex(frameIndex); + actionFrame->setPosition(Vec2(positionX, positionY)); + auto cActionArray = _frameArray.at((int)kKeyframeMove); + cActionArray->pushBack(actionFrame); + }else if(key == "scalex"){ + scaleX = valueToFloat(value); + }else if(key == "scaley"){ + scaleY = valueToFloat(value); + ActionScaleFrame* actionFrame = new ActionScaleFrame(); + actionFrame->autorelease(); + actionFrame->setEasingType(frameTweenType); + actionFrame->setEasingParameter(frameTweenParameter); + actionFrame->setFrameIndex(frameIndex); + actionFrame->setScaleX(scaleX); + actionFrame->setScaleY(scaleY); + auto cActionArray = _frameArray.at((int)kKeyframeScale); + cActionArray->pushBack(actionFrame); + }else if (key == "rotation"){ + rotation = valueToFloat(value); + ActionRotationFrame* actionFrame = new ActionRotationFrame(); + actionFrame->autorelease(); + actionFrame->setEasingType(frameTweenType); + actionFrame->setEasingParameter(frameTweenParameter); + actionFrame->setFrameIndex(frameIndex); + actionFrame->setRotation(rotation); + auto cActionArray = _frameArray.at((int)kKeyframeRotate); + cActionArray->pushBack(actionFrame); + }else if (key == "opacity"){ + opacity = valueToInt(value); + ActionFadeFrame* actionFrame = new ActionFadeFrame(); + actionFrame->autorelease(); + actionFrame->setEasingType(frameTweenType); + actionFrame->setEasingParameter(frameTweenParameter); + actionFrame->setFrameIndex(frameIndex); + actionFrame->setOpacity(opacity); + auto cActionArray = _frameArray.at((int)kKeyframeFade); + cActionArray->pushBack(actionFrame); + }else if (key == "colorb"){ + colorB = valueToInt(value); + }else if(key == "colorg"){ + colorG = valueToInt(value); + }else if(key == "colorr"){ + colorR = valueToInt(value); + + ActionTintFrame* actionFrame = new ActionTintFrame(); + actionFrame->autorelease(); + actionFrame->setEasingType(frameTweenType); + actionFrame->setEasingParameter(frameTweenParameter); + actionFrame->setFrameIndex(frameIndex); + actionFrame->setColor(Color3B(colorR,colorG,colorB)); + auto cActionArray = _frameArray.at((int)kKeyframeTint); + cActionArray->pushBack(actionFrame); + } + + + } + + } + initActionNodeFromRoot(root); + } void ActionNode::initActionNodeFromRoot(Ref* root) { diff --git a/cocos/editor-support/cocostudio/CCActionNode.h b/cocos/editor-support/cocostudio/CCActionNode.h index f0043cb264..cbccdd0a21 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.h +++ b/cocos/editor-support/cocostudio/CCActionNode.h @@ -29,7 +29,9 @@ THE SOFTWARE. #include "cocostudio/DictionaryHelper.h" namespace cocostudio { - + +class CocoLoader; +struct stExpCocoNode; /** * @js NA * @lua NA @@ -149,6 +151,7 @@ public: /*init properties with a json dictionary*/ virtual void initWithDictionary(const rapidjson::Value& dic, cocos2d::Ref* root); + virtual void initWithBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode, Ref* root); /** * Gets if the action is done once time. @@ -157,6 +160,10 @@ public: */ virtual bool isActionDoneOnce(); protected: + int valueToInt(std::string& value); + bool valueToBool(std::string& value); + float valueToFloat(std::string& value); + int _currentFrameIndex; int _destFrameIndex; diff --git a/cocos/editor-support/cocostudio/CCActionObject.cpp b/cocos/editor-support/cocostudio/CCActionObject.cpp index c421b40402..160881dda3 100644 --- a/cocos/editor-support/cocostudio/CCActionObject.cpp +++ b/cocos/editor-support/cocostudio/CCActionObject.cpp @@ -24,6 +24,7 @@ THE SOFTWARE. #include "cocostudio/CCActionObject.h" #include "cocostudio/DictionaryHelper.h" +#include "cocostudio/CocoLoader.h" #include "base/CCDirector.h" #include "base/CCScheduler.h" @@ -44,128 +45,192 @@ ActionObject::ActionObject() , _CallBack(nullptr) , _fTotalTime(0.0f) { - _pScheduler = Director::getInstance()->getScheduler(); - CC_SAFE_RETAIN(_pScheduler); + _pScheduler = Director::getInstance()->getScheduler(); + CC_SAFE_RETAIN(_pScheduler); } ActionObject::~ActionObject() { - _actionNodeList.clear(); - CC_SAFE_RELEASE(_pScheduler); - CC_SAFE_RELEASE(_CallBack); + _actionNodeList.clear(); + CC_SAFE_RELEASE(_pScheduler); + CC_SAFE_RELEASE(_CallBack); } void ActionObject::setName(const char* name) { - _name.assign(name); + _name.assign(name); } const char* ActionObject::getName() { - return _name.c_str(); + return _name.c_str(); } void ActionObject::setLoop(bool bLoop) { - _loop = bLoop; + _loop = bLoop; } bool ActionObject::getLoop() { - return _loop; + return _loop; } void ActionObject::setUnitTime(float fTime) { - _fUnitTime = fTime; + _fUnitTime = fTime; for(const auto &e : _actionNodeList) - { + { e->setUnitTime(_fUnitTime); - } + } } float ActionObject::getUnitTime() { - return _fUnitTime; + return _fUnitTime; } float ActionObject::getCurrentTime() { - return _currentTime; + return _currentTime; } void ActionObject::setCurrentTime(float fTime) { - _currentTime = fTime; + _currentTime = fTime; } float ActionObject::getTotalTime() { - return _fTotalTime; + return _fTotalTime; } bool ActionObject::isPlaying() { - return _bPlaying; + return _bPlaying; } void ActionObject::initWithDictionary(const rapidjson::Value& dic, Ref* root) { - setName(DICTOOL->getStringValue_json(dic, "name")); - setLoop(DICTOOL->getBooleanValue_json(dic, "loop")); - setUnitTime(DICTOOL->getFloatValue_json(dic, "unittime")); - int actionNodeCount = DICTOOL->getArrayCount_json(dic, "actionnodelist"); - int maxLength = 0; - for (int i=0; iautorelease(); - const rapidjson::Value& actionNodeDic = DICTOOL->getDictionaryFromArray_json(dic, "actionnodelist", i); - actionNode->initWithDictionary(actionNodeDic,root); - actionNode->setUnitTime(getUnitTime()); - _actionNodeList.pushBack(actionNode); + setName(DICTOOL->getStringValue_json(dic, "name")); + setLoop(DICTOOL->getBooleanValue_json(dic, "loop")); + setUnitTime(DICTOOL->getFloatValue_json(dic, "unittime")); + int actionNodeCount = DICTOOL->getArrayCount_json(dic, "actionnodelist"); + int maxLength = 0; + for (int i=0; iautorelease(); + const rapidjson::Value& actionNodeDic = DICTOOL->getDictionaryFromArray_json(dic, "actionnodelist", i); + actionNode->initWithDictionary(actionNodeDic,root); + actionNode->setUnitTime(getUnitTime()); + _actionNodeList.pushBack(actionNode); + + int length = actionNode->getLastFrameIndex() - actionNode->getFirstFrameIndex(); + if(length > maxLength) + maxLength = length; + } + _fTotalTime = maxLength*_fUnitTime; +} - int length = actionNode->getLastFrameIndex() - actionNode->getFirstFrameIndex(); - if(length > maxLength) - maxLength = length; - } - _fTotalTime = maxLength*_fUnitTime; +void ActionObject::initWithBinary(CocoLoader *pCocoLoader, + stExpCocoNode *pCocoNode, + cocos2d::Ref *root) +{ + stExpCocoNode *stChildNode = pCocoNode->GetChildArray(); + stExpCocoNode *actionNodeList = NULL; + int count = pCocoNode->GetChildNum(); + for (int i = 0; i < count; ++i) { + std::string key = stChildNode[i].GetName(pCocoLoader); + std::string value = stChildNode[i].GetValue(); + if (key == "name") { + setName(value.c_str()); + }else if (key == "loop"){ + setLoop(valueToBool(value)); + }else if(key == "unittime"){ + setUnitTime(valueToFloat(value)); + }else if (key == "actionnodelist"){ + actionNodeList = &stChildNode[i]; + } + } + + if(NULL != actionNodeList) + { + int actionNodeCount = actionNodeList->GetChildNum(); + stExpCocoNode *actionNodeArray = actionNodeList->GetChildArray(); + int maxLength = 0; + for (int i=0; iautorelease(); + + actionNode->initWithBinary(pCocoLoader, &actionNodeArray[i] , root); + + actionNode->setUnitTime(getUnitTime()); + + _actionNodeList.pushBack(actionNode); + + int length = actionNode->getLastFrameIndex() - actionNode->getFirstFrameIndex(); + if(length > maxLength) + maxLength = length; + } + + + _fTotalTime = maxLength* _fUnitTime; + } +} + +int ActionObject::valueToInt(std::string& value) +{ + return atoi(value.c_str()); +} +bool ActionObject::valueToBool(std::string& value) +{ + int intValue = valueToInt(value); + if (1 == intValue) { + return true; + }else{ + return false; + } +} +float ActionObject::valueToFloat(std::string& value) +{ + return atof(value.c_str()); } void ActionObject::addActionNode(ActionNode* node) { - if (node == nullptr) - { - return; - } - _actionNodeList.pushBack(node); - node->setUnitTime(_fUnitTime); + if (node == nullptr) + { + return; + } + _actionNodeList.pushBack(node); + node->setUnitTime(_fUnitTime); } void ActionObject::removeActionNode(ActionNode* node) { - if (node == nullptr) - { - return; - } - _actionNodeList.eraseObject(node); + if (node == nullptr) + { + return; + } + _actionNodeList.eraseObject(node); } void ActionObject::play() { - stop(); - this->updateToFrameByTime(0.0f); + stop(); + this->updateToFrameByTime(0.0f); for(const auto &e : _actionNodeList) - { - e->playAction(); - } - if (_loop) - { - _pScheduler->schedule(schedule_selector(ActionObject::simulationActionUpdate), this, 0.0f , kRepeatForever, 0.0f, false); - } - else - { - _pScheduler->schedule(schedule_selector(ActionObject::simulationActionUpdate), this, 0.0f, false); - } + { + e->playAction(); + } + if (_loop) + { + _pScheduler->schedule(schedule_selector(ActionObject::simulationActionUpdate), this, 0.0f , kRepeatForever, 0.0f, false); + } + else + { + _pScheduler->schedule(schedule_selector(ActionObject::simulationActionUpdate), this, 0.0f, false); + } } void ActionObject::play(CallFunc* func) { - this->play(); + this->play(); this->_CallBack = func; CC_SAFE_RETAIN(_CallBack); } diff --git a/cocos/editor-support/cocostudio/CCActionObject.h b/cocos/editor-support/cocostudio/CCActionObject.h index dcc8008dda..2c3f7684d6 100644 --- a/cocos/editor-support/cocostudio/CCActionObject.h +++ b/cocos/editor-support/cocostudio/CCActionObject.h @@ -31,6 +31,9 @@ THE SOFTWARE. namespace cocostudio { +class CocoLoader; +struct stExpCocoNode; + /** * @js NA * @lua NA @@ -160,10 +163,17 @@ public: /*init properties with a json dictionary*/ void initWithDictionary(const rapidjson::Value& dic, cocos2d::Ref* root); + + void initWithBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode, cocos2d::Ref* root); + /*scheduler update function*/ void simulationActionUpdate(float dt); protected: + int valueToInt(std::string& value); + bool valueToBool(std::string& value); + float valueToFloat(std::string& value); + cocos2d::Vector _actionNodeList; std::string _name; bool _loop; diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index b01774bb3d..da72f03089 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -1272,15 +1272,17 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c } /* ********************** */ - //TODO: -// // widget->setFileDesignSize(Size(fileDesignWidth, fileDesignHeight)); -// const rapidjson::Value& actions = DICTOOL->getSubDictionary_json(data, "animation"); -// /* *********temp********* */ -// // ActionManager::getInstance()->releaseActions(); -// /* ********************** */ -// CCLOG("file name == [%s]",fileName); -// Ref* rootWidget = (Ref*) widget; -// ActionManagerEx::getInstance()->initWithDictionary(fileName,actions,rootWidget); + /* ********************** */ + stExpCocoNode *optionChildNode = pCocoNode->GetChildArray(); + for (int k = 0; k < pCocoNode->GetChildNum(); ++k) { + std::string key = optionChildNode[k].GetName(pCocoLoader); + if (key == "animation") { + Ref* rootWidget = (Ref*) widget; + ActionManagerEx::getInstance()->initWithBinary(fileName,rootWidget,pCocoLoader, &optionChildNode[k]); + break; + } + } + return widget; } From 9398395de86b652182e9a64f30ee3cf007ad243e Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 16:19:24 +0800 Subject: [PATCH 19/72] fix custom property --- .../cocostudio/CCSGUIReader.cpp | 100 ++++++++++++------ 1 file changed, 69 insertions(+), 31 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index da72f03089..088f9b4fe1 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -1290,17 +1290,34 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s { Widget* widget = nullptr; stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *optionsNode = nullptr; + stExpCocoNode *childrenNode = nullptr; + int elementCount = pCocoNode->GetChildNum(); std::string classname; - - std::string key = stChildArray[0].GetName(pCocoLoader); - classname = stChildArray[0].GetValue(); - - if (key == "classname" && !classname.empty()) { - widget = this->createGUI(classname); + for (int i = 0; i < elementCount; ++i) { + std::string key = stChildArray[i].GetName(pCocoLoader); + std::string value = stChildArray[i].GetValue(); + + if (key == "classname" ) + { + if (!value.empty()) + { + classname = value; + widget = this->createGUI(classname); + } + else + { + CCLOG("Warning!!! classname not found!"); + } + }else if(key == "children"){ + childrenNode = &stChildArray[i]; + }else if(key == "options"){ + optionsNode = &stChildArray[i]; + } + } -// CCLOG("classname = %s", classname.c_str()); std::string readerName = this->getWidgetReaderClassName(classname); WidgetReaderProtocol* reader = this->createWidgetReaderProtocol(readerName); @@ -1308,7 +1325,7 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s if (reader) { // widget parse with widget reader - setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader, &stChildArray[3]); + setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader,optionsNode); } else { @@ -1316,25 +1333,41 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s readerName = this->getWidgetReaderClassName(widget); reader = this->createWidgetReaderProtocol(readerName); - setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader, &stChildArray[3]); - // 2nd., custom widget parse with custom reader -// const char* customProperty = DICTOOL->getStringValue_json(uiOptions, "customProperty"); -// -// rapidjson::Document customJsonDict; -// customJsonDict.Parse<0>(customProperty); -// -// setPropsForAllCustomWidgetFromBinary(classname, widget, pCocoLoader, &stChildArray[3]); + if (reader && widget) { + setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader, optionsNode); + // 2nd., custom widget parse with custom reader + //2nd. parse custom property + const char* customProperty = NULL; + stExpCocoNode *optionChildNode = optionsNode->GetChildArray(); + for (int k = 0; k < optionsNode->GetChildNum(); ++k) { + std::string key = optionChildNode[k].GetName(pCocoLoader); + if (key == "customProperty") { + customProperty = optionChildNode[k].GetValue(); + break; + } + } + + rapidjson::Document customJsonDict; + customJsonDict.Parse<0>(customProperty); + if (customJsonDict.HasParseError()) + { + CCLOG("GetParseError %s\n", customJsonDict.GetParseError()); + } + setPropsForAllCustomWidgetFromJsonDictionary(classname, widget, customJsonDict); + }else{ + CCLOG("Widget or WidgetReader doesn't exists!!! Please check your csb file."); + } + } //parse children - stExpCocoNode* childrenArray = &stChildArray[2]; - if (nullptr != childrenArray) { - rapidjson::Type tType22 = stChildArray[2].GetType(pCocoLoader); + if (nullptr != childrenNode) { + rapidjson::Type tType22 = childrenNode->GetType(pCocoLoader); if (tType22 == rapidjson::kArrayType) { - int childrenCount = childrenArray->GetChildNum(); - stExpCocoNode* innerChildArray = childrenArray->GetChildArray(); + int childrenCount = childrenNode->GetChildNum(); + stExpCocoNode* innerChildArray = childrenNode->GetChildArray(); for (int i=0; i < childrenCount; ++i) { rapidjson::Type tType = innerChildArray[i].GetType(pCocoLoader); @@ -1411,17 +1444,22 @@ Widget* WidgetPropertiesReader0300::widgetFromJsonDictionary(const rapidjson::Va reader = dynamic_cast(ObjectFactory::getInstance()->createObject(readerName)); - setPropsForAllWidgetFromJsonDictionary(reader, widget, uiOptions); - - // 2nd., custom widget parse with custom reader - const char* customProperty = DICTOOL->getStringValue_json(uiOptions, "customProperty"); - rapidjson::Document customJsonDict; - customJsonDict.Parse<0>(customProperty); - if (customJsonDict.HasParseError()) - { - CCLOG("GetParseError %s\n", customJsonDict.GetParseError()); + if (reader && widget) { + setPropsForAllWidgetFromJsonDictionary(reader, widget, uiOptions); + + // 2nd., custom widget parse with custom reader + const char* customProperty = DICTOOL->getStringValue_json(uiOptions, "customProperty"); + rapidjson::Document customJsonDict; + customJsonDict.Parse<0>(customProperty); + if (customJsonDict.HasParseError()) + { + CCLOG("GetParseError %s\n", customJsonDict.GetParseError()); + } + setPropsForAllCustomWidgetFromJsonDictionary(classname, widget, customJsonDict); + }else{ + CCLOG("Widget or WidgetReader doesn't exists!!! Please check your csb file."); } - setPropsForAllCustomWidgetFromJsonDictionary(classname, widget, customJsonDict); + } int childrenCount = DICTOOL->getArrayCount_json(data, "children"); From 5cfbd3a2bde36e324f0c62b3df1ec6dc2a6eaee6 Mon Sep 17 00:00:00 2001 From: geron-cn Date: Wed, 18 Jun 2014 17:43:13 +0800 Subject: [PATCH 20/72] add binary decode to armature --- .../cocostudio/CCDataReaderHelper.cpp | 839 ++++++++++++++++++ .../cocostudio/CCDataReaderHelper.h | 23 +- 2 files changed, 861 insertions(+), 1 deletion(-) diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp index cea37b4e63..124a129262 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp @@ -1686,5 +1686,844 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, } } + + void DataReaderHelper::addDataFromBinaryCache(const char *fileContent, DataInfo *dataInfo) + { + CocoLoader tCocoLoader; + if (tCocoLoader.ReadCocoBinBuff((char*)fileContent)) + { + stExpCocoNode *tpRootCocoNode = tCocoLoader.GetRootCocoNode(); + rapidjson::Type tType = tpRootCocoNode->GetType(&tCocoLoader); + if (rapidjson::kObjectType == tType) + { + stExpCocoNode *tpChildArray = tpRootCocoNode->GetChildArray(); + int nCount = tpRootCocoNode->GetChildNum(); + + dataInfo->contentScale = 1.0f; + int length = 0; + std::string key; + stExpCocoNode* pDataArray; + for (int i = 0; i < nCount; ++i) + { + key = tpChildArray[i].GetName(&tCocoLoader); + if (key.compare(CONTENT_SCALE) == 0) + { + std::string value = tpChildArray[i].GetValue(); + dataInfo->contentScale = atof(value.c_str()); + } + else if ( 0 == key.compare(ARMATURE_DATA)) + { + pDataArray = tpChildArray[i].GetChildArray(); + length = tpChildArray[i].GetChildNum(); + ArmatureData * armatureData; + for (int ii = 0; ii < length; ++ii) + { + armatureData = decodeArmature(&tCocoLoader, &pDataArray[ii], dataInfo); + if (dataInfo->asyncStruct) + { + _dataReaderHelper->_addDataMutex.lock(); + } + ArmatureDataManager::getInstance()->addArmatureData(armatureData->name.c_str(), armatureData, dataInfo->filename.c_str()); + armatureData->release(); + if (dataInfo->asyncStruct) + { + _dataReaderHelper->_addDataMutex.unlock(); + } + } + } + else if ( 0 == key.compare(ANIMATION_DATA)) + { + pDataArray = tpChildArray[i].GetChildArray(); + length = tpChildArray[i].GetChildNum(); + AnimationData *animationData; + for (int ii = 0; ii < length; ++i) + { + animationData = decodeAnimation(&tCocoLoader, &pDataArray[ii], dataInfo); + if (dataInfo->asyncStruct) + { + _dataReaderHelper->_addDataMutex.lock(); + } + ArmatureDataManager::getInstance()->addAnimationData(animationData->name.c_str(), animationData, dataInfo->filename.c_str()); + animationData->release(); + if (dataInfo->asyncStruct) + { + _dataReaderHelper->_addDataMutex.unlock(); + } + } + } + else if (key.compare(TEXTURE_DATA) == 0) + { + pDataArray = tpChildArray[i].GetChildArray(); + length = tpChildArray[i].GetChildNum(); + for (int ii = 0; ii < length; ++ii) + { + TextureData *textureData = decodeTexture(&tCocoLoader, &pDataArray[ii]); + if (dataInfo->asyncStruct) + { + _dataReaderHelper->_addDataMutex.lock(); + } + ArmatureDataManager::getInstance()->addTextureData(textureData->name.c_str(), textureData, dataInfo->filename.c_str()); + textureData->release(); + if (dataInfo->asyncStruct) + { + _dataReaderHelper->_addDataMutex.unlock(); + } + } + } + } + // Auto losprite file + bool autoLoad = dataInfo->asyncStruct == NULL ? ArmatureDataManager::getInstance()->isAutoLoadSpriteFile() : dataInfo->asyncStruct->autoLoadSpriteFile; + if (autoLoad) + { + for (int i = 0; i < nCount; ++i) + { + key = tpChildArray[i].GetName(&tCocoLoader); + if( 0 != key.compare(CONFIG_FILE_PATH)) + { + continue; + } + length = tpChildArray[i].GetChildNum(); + stExpCocoNode *pConfigFilePath = tpChildArray[i].GetChildArray(); + for (int ii = 0; ii < length; ii++) + { + const char *path = pConfigFilePath[ii].GetValue(); + if (path == NULL) + { + CCLOG("load CONFIG_FILE_PATH error."); + return; + } + + std::string filePath = path; + filePath = filePath.erase(filePath.find_last_of(".")); + + if (dataInfo->asyncStruct) + { + dataInfo->configFileQueue.push(filePath); + } + else + { + std::string plistPath = filePath + ".plist"; + std::string pngPath = filePath + ".png"; + + ArmatureDataManager::getInstance()->addSpriteFrameFromFile((dataInfo->baseFilePath + plistPath).c_str(), (dataInfo->baseFilePath + pngPath).c_str(), dataInfo->filename.c_str()); + } + } + } + } + } + } + } + + ArmatureData* DataReaderHelper::decodeArmature(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + { + ArmatureData *armatureData = new ArmatureData(); + armatureData->init(); + stExpCocoNode *pAramtureDataArray = pCocoNode->GetChildArray(); + const char *name = pAramtureDataArray[2].GetValue(); //DICTOOL->getStringValue_json(json, A_NAME); + if(name != NULL) + { + armatureData->name = name; + } + + float version = atof(pAramtureDataArray[1].GetValue()); + dataInfo->cocoStudioVersion = armatureData->dataVersion = version; //DICTOOL->getFloatValue_json(json, VERSION, 0.1f); + + int length = pAramtureDataArray[3].GetChildNum(); //DICTOOL->getArrayCount_json(json, BONE_DATA, 0); + stExpCocoNode *pBoneChildren = pAramtureDataArray[3].GetChildArray(); + stExpCocoNode* child; + for (int i = 0; i < length; i++) + { + //const rapidjson::Value &dic = DICTOOL->getSubDictionary_json(json, BONE_DATA, i); //json[BONE_DATA][i]; + child = &pBoneChildren[i]; + BoneData *boneData = decodeBone(pCocoLoader, child, dataInfo); + armatureData->addBoneData(boneData); + boneData->release(); + } + + return armatureData; + } + + BoneData* DataReaderHelper::decodeBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + { + BoneData *boneData = new BoneData(); + boneData->init(); + + decodeNode(boneData, pCocoLoader, pCocoNode, dataInfo); + + int length = pCocoNode->GetChildNum(); + stExpCocoNode *pBoneChildren = pCocoNode->GetChildArray(); + stExpCocoNode* child; + const char *str = NULL; + std::string key; + for (int i = 0; i < length; ++i) + { + child = &pBoneChildren[i]; + key = child->GetName(pCocoLoader); + str = child->GetValue(); + if (key.compare(A_NAME) == 0) + { + //DICTOOL->getStringValue_json(json, A_NAME); + if(str != NULL) + { + boneData->name = str; + } + } + else if (key.compare(A_PARENT) == 0) + { + //DICTOOL->getStringValue_json(json, A_PARENT); + if(str != NULL) + { + boneData->parentName = str; + } + } + else if (key.compare(DISPLAY_DATA) == 0) + { + int count = child->GetChildNum(); + stExpCocoNode *pDisplayData = child->GetChildArray(); + for (int ii = 0; ii < count; ++ii) + { + DisplayData *displayData = decodeBoneDisplay(pCocoLoader, &pDisplayData[ii], dataInfo); + if(displayData == NULL) + continue; + boneData->addDisplayData(displayData); + displayData->release(); + } + } + } + + return boneData; + } + + DisplayData* DataReaderHelper::decodeBoneDisplay(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + { + stExpCocoNode* children = pCocoNode->GetChildArray(); + stExpCocoNode* child = &children[1]; + const char *str = NULL; + + std::string key = child->GetName(pCocoLoader); + str = child->GetValue(); + DisplayData *displayData = NULL; + if (key.compare(A_DISPLAY_TYPE) == 0) + { + str = child->GetValue(); + DisplayType displayType = (DisplayType)(atoi(str)); + + int length = 0; + switch (displayType) + { + case CS_DISPLAY_SPRITE: + { + displayData = new SpriteDisplayData(); + + const char *name = children[0].GetValue(); + if(name != NULL) + { + ((SpriteDisplayData *)displayData)->displayName = name; + } + stExpCocoNode *pSkinDataArray = children[2].GetChildArray(); + if (pSkinDataArray != NULL) + { + stExpCocoNode *pSkinData = &pSkinDataArray[0]; + if (pSkinData != NULL) + { + SpriteDisplayData *sdd = (SpriteDisplayData *)displayData; + length = pSkinData->GetChildNum(); + stExpCocoNode *SkinDataValue = pSkinData->GetChildArray(); + for (int i = 0; i < length; ++i) + { + key = SkinDataValue[i].GetName(pCocoLoader); + str = SkinDataValue[i].GetValue(); + if (key.compare(A_X) == 0) + { + sdd->skinData.x = atof(str) * s_PositionReadScale; + } + else if (key.compare(A_Y) == 0) + { + sdd->skinData.y = atof(str) * s_PositionReadScale; + } + else if (key.compare(A_SCALE_X) == 0) + { + sdd->skinData.scaleX = atof(str); + } + else if (key.compare(A_SCALE_Y) == 0) + { + sdd->skinData.scaleY = atof(str); + } + else if (key.compare(A_SKEW_X) == 0) + { + sdd->skinData.skewX = atof(str); + } + else if (key.compare(A_SKEW_Y) == 0) + { + sdd->skinData.skewY = atof(str); + } + } + + sdd->skinData.x *= dataInfo->contentScale; + sdd->skinData.y *= dataInfo->contentScale; + } + } + } + + break; + case CS_DISPLAY_ARMATURE: + { + displayData = new ArmatureDisplayData(); + + const char *name = pCocoNode[0].GetValue(); + if(name != NULL) + { + ((ArmatureDisplayData *)displayData)->displayName = name; + } + } + break; + case CS_DISPLAY_PARTICLE: + { + displayData = new ParticleDisplayData(); + length = pCocoNode->GetChildNum(); + stExpCocoNode *pDisplayData = pCocoNode->GetChildArray(); + for (int i = 0; i < length; ++i) + { + key = pDisplayData[i].GetName(pCocoLoader); + str = pDisplayData[i].GetValue(); + if (key.compare(A_PLIST) == 0) + { + const char *plist = str; + if(plist != NULL) + { + if (dataInfo->asyncStruct) + { + ((ParticleDisplayData *)displayData)->displayName = dataInfo->asyncStruct->baseFilePath + plist; + } + else + { + ((ParticleDisplayData *)displayData)->displayName = dataInfo->baseFilePath + plist; + } + } + } + } + } + break; + default: + displayData = new SpriteDisplayData(); + + break; + } + displayData->displayType = displayType; + } + return displayData; + } + + AnimationData* DataReaderHelper::decodeAnimation(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + { + AnimationData *aniData = new AnimationData(); + + int length = pCocoNode->GetChildNum(); + stExpCocoNode *pAnimationData = pCocoNode->GetChildArray(); + const char *str = NULL; + std::string key; + stExpCocoNode* child; + MovementData *movementData; + for (int i = 0; i < length; ++i) + { + child = &pAnimationData[i]; + key = child->GetName(pCocoLoader); + str = child->GetValue(); + if (key.compare(A_NAME) == 0) + { + if(str != NULL) + { + aniData->name = str; + } + } + else if (key.compare(MOVEMENT_DATA) == 0) + { + int movcount = child->GetChildNum(); + stExpCocoNode* movArray = child->GetChildArray(); + for( int movnum =0; movnum addMovement(movementData); + movementData->release(); + } + } + } + return aniData; + } + + MovementData* DataReaderHelper::decodeMovement(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + { + MovementData *movementData = new MovementData(); + movementData->scale = 1.0f; + + int length = pCocoNode->GetChildNum(); + stExpCocoNode *pMoveDataArray = pCocoNode->GetChildArray(); + + const char *str = NULL; + std::string key; + stExpCocoNode* child; + for (int i = 0; i < length; ++i) + { + child = &pMoveDataArray[i]; + key = child->GetName(pCocoLoader); + str = child->GetValue(); + if (key.compare(A_NAME) == 0) + { + if(str != NULL) + { + movementData->name = str; + } + } + else if (key.compare(A_LOOP) == 0) + { + movementData->loop = true; + if(str != NULL) + { + if (strcmp("1", str) != 0) + { + movementData->loop = false; + } + } + } + else if (key.compare(A_DURATION_TWEEN) == 0) + { + movementData->durationTween = 0; + if(str != NULL) + { + movementData->durationTween = atoi(str); + } + } + else if (key.compare(A_DURATION_TO) == 0) + { + movementData->durationTo = 0; + if(str != NULL) + { + movementData->durationTo = atoi(str); + } + } + else if (key.compare(A_DURATION) == 0) + { + movementData->duration = 0; + if(str != NULL) + { + movementData->duration = atoi(str); + } + } + else if (key.compare(A_MOVEMENT_SCALE) == 0) + { + movementData->scale = 1.0; + if(str != NULL) + { + movementData->scale = atof(str); + } + } + else if (key.compare(A_TWEEN_EASING) == 0) + { + movementData->tweenEasing = cocos2d::tweenfunc::Linear; + if(str != NULL) + { + movementData->tweenEasing = (TweenType)(atoi(str)); + } + } + else if (key.compare(MOVEMENT_BONE_DATA) == 0) + { + int count = child->GetChildNum(); + stExpCocoNode *pMoveBoneData = child->GetChildArray(); + MovementBoneData *movementBoneData; + for (int ii = 0; ii < count; ++ii) + { + movementBoneData = decodeMovementBone(pCocoLoader, &pMoveBoneData[ii],dataInfo); + movementData->addMovementBoneData(movementBoneData); + movementBoneData->release(); + } + } + } + return movementData; + } + + MovementBoneData* DataReaderHelper::decodeMovementBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + { + MovementBoneData *movementBoneData = new MovementBoneData(); + movementBoneData->init(); + + int length = pCocoNode->GetChildNum(); + stExpCocoNode *pMovementBoneDataArray = pCocoNode->GetChildArray(); + stExpCocoNode* movebonechild; + const char *str = NULL; + for (int i = 0; i < length; ++i) + { + movebonechild = &pMovementBoneDataArray[i]; + std::string key = movebonechild->GetName(pCocoLoader); + str = movebonechild->GetValue(); + if (key.compare(A_NAME) == 0) + { + if(str != NULL) + { + movementBoneData->name = str; + } + } + else if (key.compare(A_MOVEMENT_DELAY) == 0) + { + if(str != NULL) + { + movementBoneData->delay = atof(str); + } + } + else if (key.compare(FRAME_DATA) == 0) + { + int count =movebonechild->GetChildNum(); + stExpCocoNode *pFrameDataArray = movebonechild->GetChildArray(); + for (int ii = 0; ii < count; ++ii) + { + FrameData *frameData = decodeFrame(pCocoLoader, &pFrameDataArray[ii], dataInfo); + movementBoneData->addFrameData(frameData); + frameData->release(); + + if (dataInfo->cocoStudioVersion < VERSION_COMBINED) + { + frameData->frameID = movementBoneData->duration; + movementBoneData->duration += frameData->duration; + } + } + } + } + + + + const ssize_t framesizemusone = movementBoneData->frameList.size()-1; + if (dataInfo->cocoStudioVersion < VERSION_CHANGE_ROTATION_RANGE) + { + //! Change rotation range from (-180 -- 180) to (-infinity -- infinity) + cocos2d::Vector frames =movementBoneData->frameList; + + ssize_t imusone =0; + ssize_t i =0; + for (i = framesizemusone; i >= 0; i--) + { + if (i > 0) + { + imusone = i-1; + float difSkewX = frames.at(i)->skewX - frames.at(imusone)->skewX; + float difSkewY = frames.at(i)->skewY - frames.at(imusone)->skewY; + + if (difSkewX < -M_PI || difSkewX > M_PI) + { + frames.at(imusone)->skewX = difSkewX < 0 ? frames.at(imusone)->skewX - 2 * M_PI : frames.at(imusone)->skewX + 2 * M_PI; + } + + if (difSkewY < -M_PI || difSkewY > M_PI) + { + frames.at(imusone)->skewY = difSkewY < 0 ? frames.at(imusone)->skewY - 2 * M_PI : frames.at(imusone)->skewY + 2 * M_PI; + } + } + } + } + + + if (dataInfo->cocoStudioVersion < VERSION_COMBINED) + { + if (movementBoneData->frameList.size() > 0) + { + FrameData *frameData = new FrameData(); + frameData = movementBoneData->frameList.at(framesizemusone); + movementBoneData->addFrameData(frameData); + frameData->release(); + frameData->frameID = movementBoneData->duration; + } + } + + return movementBoneData; + } + + FrameData* DataReaderHelper::decodeFrame(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + { + FrameData *frameData = new FrameData(); + + decodeNode(frameData, pCocoLoader, pCocoNode, dataInfo); + + int length = pCocoNode->GetChildNum(); + stExpCocoNode *pFrameDataArray = pCocoNode->GetChildArray(); + const char *str = NULL; + for (int i = 0; i < length; ++i) + { + std::string key = pFrameDataArray[i].GetName(pCocoLoader); + str = pFrameDataArray[i].GetValue(); + if (key.compare(A_TWEEN_EASING) == 0) + { + frameData->tweenEasing = cocos2d::tweenfunc::Linear; + if(str != NULL) + { + frameData->tweenEasing = (TweenType)(atoi(str)); + } + } + else if (key.compare(A_DISPLAY_INDEX) == 0) + { + if(str != NULL) + { + frameData->displayIndex = atoi(str); + } + } + else if (key.compare(A_BLEND_SRC) == 0) + { + if(str != NULL) + { + frameData->blendFunc.src = (GLenum)(atoi(str)); + } + } + else if (key.compare(A_BLEND_DST) == 0) + { + if(str != NULL) + { + frameData->blendFunc.dst = (GLenum)(atoi(str)); + } + } + else if (key.compare(A_TWEEN_FRAME) == 0) + { + frameData->isTween = true; + if(str != NULL) + { + if (strcmp("1", str) != 0) + { + frameData->isTween = false; + } + } + } + else if (key.compare(A_EVENT) == 0) + { + if(str != NULL) + { + frameData->strEvent = str; + } + } + else if (key.compare(A_DURATION) == 0) + { + if (dataInfo->cocoStudioVersion < VERSION_COMBINED) + { + frameData->duration = 1; + if(str != NULL) + { + frameData->duration = atoi(str); + } + } + } + else if (key.compare(A_FRAME_INDEX) == 0) + { + if (dataInfo->cocoStudioVersion >= VERSION_COMBINED) + { + if(str != NULL) + { + frameData->frameID = atoi(str); + } + } + } + else if (key.compare(A_EASING_PARAM) == 0) + { + int count = pFrameDataArray[i].GetChildNum(); + if (count != 0 ) + { + frameData->easingParams = new float[count]; + stExpCocoNode *pFrameData = pFrameDataArray[i].GetChildArray(); + for (int ii = 0; ii < count; ++ii) + { + str = pFrameData[ii].GetValue(); + if (str != NULL) + { + frameData->easingParams[ii] = atof(str); + } + } + } + + } + } + + return frameData; + } + + TextureData* DataReaderHelper::decodeTexture(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + TextureData *textureData = new TextureData(); + textureData->init(); + + if(pCocoNode == NULL) + { + return textureData; + } + + int length = pCocoNode->GetChildNum(); + stExpCocoNode *pTextureDataArray = pCocoNode->GetChildArray(); + const char *str = NULL; + for (int i = 0; i < length; ++i) + { + std::string key = pTextureDataArray[i].GetName(pCocoLoader); + str = pTextureDataArray[i].GetValue(); + if (key.compare(A_NAME) == 0) + { + if(str != NULL) + { + textureData->name = str; + } + } + else if (key.compare(A_WIDTH) == 0) + { + if(str != NULL) + { + textureData->width = atof(str); + } + } + else if (key.compare(A_HEIGHT) == 0) + { + if(str != NULL) + { + textureData->height = atof(str); + } + } + else if (key.compare(A_PIVOT_X) == 0) + { + if(str != NULL) + { + textureData->pivotX = atof(str); + } + } + else if (key.compare(A_PIVOT_Y) == 0) + { + if(str != NULL) + { + textureData->pivotY = atof(str); + } + } + else if (key.compare(CONTOUR_DATA) == 0) + { + int count = pTextureDataArray[i].GetChildNum(); + stExpCocoNode *pContourArray = pTextureDataArray[i].GetChildArray(); + for (int ii = 0; ii < count; ++ii) + { + ContourData *contourData = decodeContour(pCocoLoader, &pContourArray[ii]); + textureData->contourDataList.pushBack(contourData); + contourData->release(); + } + } + } + return textureData; + } + + ContourData* DataReaderHelper::decodeContour(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + { + ContourData *contourData = new ContourData(); + contourData->init(); + + int length = pCocoNode->GetChildNum(); + stExpCocoNode *verTexPointArray = pCocoNode->GetChildArray(); + const char *str = NULL; + for (int i = 0; i < length; ++i) + { + std::string key = verTexPointArray[i].GetName(pCocoLoader); + str = verTexPointArray[i].GetValue(); + if (key.compare(VERTEX_POINT) == 0) + { + int count = verTexPointArray[i].GetChildNum(); + stExpCocoNode *pVerTexPointArray = verTexPointArray[i].GetChildArray(); + stExpCocoNode *pVerTexPoint; + for (int ii = count - 1; ii >= 0; --ii) + { + pVerTexPoint = pVerTexPointArray[ii].GetChildArray(); + Vec2 vertex; + vertex.x = atof(pVerTexPoint[0].GetValue()); + vertex.y = atof(pVerTexPoint[1].GetValue()); + contourData->vertexList.push_back(vertex); } + break; + } + } + return contourData; + } + + void DataReaderHelper::decodeNode(BaseData *node, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + { + int length = pCocoNode->GetChildNum(); + stExpCocoNode *NodeArray = pCocoNode->GetChildArray(); + const char *str = NULL; + + bool isVersionL = dataInfo->cocoStudioVersion < VERSION_COLOR_READING; + stExpCocoNode* child; + for (int i = 0; i < length; ++i) + { + child = &NodeArray[i]; + std::string key = child->GetName(pCocoLoader); + str = child->GetValue(); + if (key.compare(A_X) == 0) + { + node->x = atof(str) * dataInfo->contentScale; + } + else if (key.compare(A_Y) == 0) + { + node->y = atof(str) * dataInfo->contentScale; + } + else if (key.compare(A_Z) == 0) + { + node->zOrder = atoi(str); + } + else if (key.compare(A_SKEW_X) == 0) + { + node->skewX = atof(str); + } + else if (key.compare(A_SKEW_Y) == 0) + { + node->skewY = atof(str); + } + else if (key.compare(A_SCALE_X) == 0) + { + node->scaleX = atof(str); + } + else if (key.compare(A_SCALE_Y) == 0) + { + node->scaleY = atof(str); + } + else if (key.compare(COLOR_INFO) == 0) + { + if (!isVersionL) + { + if (child->GetType(pCocoLoader) == rapidjson::kObjectType) + { + if(child->GetChildNum() == 4) + { + stExpCocoNode *ChildArray = child->GetChildArray(); + + node->a = atoi(ChildArray[0].GetValue()); + node->r = atoi(ChildArray[1].GetValue()); + node->g = atoi(ChildArray[2].GetValue()); + node->b = atoi(ChildArray[3].GetValue()); + } + + } + + + + node->isUseColorInfo = true; + } + } + } + + if (isVersionL) + { + int colorcoount = NodeArray[0].GetChildNum(); + if(colorcoount>0) + { + + if (NodeArray[0].GetType(pCocoLoader) == rapidjson::kObjectType) + { + if(NodeArray[0].GetChildNum() == 4) + { + stExpCocoNode *ChildArray = NodeArray[0].GetChildArray(); + + node->a = atoi(ChildArray[0].GetValue()); + node->r = atoi(ChildArray[1].GetValue()); + node->g = atoi(ChildArray[2].GetValue()); + node->b = atoi(ChildArray[3].GetValue()); + } + } + + node->isUseColorInfo = true; + } + } + } } diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.h b/cocos/editor-support/cocostudio/CCDataReaderHelper.h index 26d3c25d35..7cbce644ca 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.h +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.h @@ -30,6 +30,10 @@ THE SOFTWARE. #include "cocostudio/CCArmature.h" #include "cocostudio/DictionaryHelper.h" +#include "json/document.h" +#include "Cocoloader.h" +#include "DictionaryHelper.h" + #include #include #include @@ -171,7 +175,24 @@ public: static ContourData *decodeContour(const rapidjson::Value& json); static void decodeNode(BaseData *node, const rapidjson::Value& json, DataInfo *dataInfo); - + +// for binary decode +public: + static void addDataFromBinaryCache(const char *fileContent, DataInfo *dataInfo = NULL); + static ArmatureData *decodeArmature(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static BoneData *decodeBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static DisplayData *decodeBoneDisplay(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static AnimationData *decodeAnimation(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static MovementData *decodeMovement(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + + static MovementBoneData *decodeMovementBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static FrameData *decodeFrame(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + + static TextureData *decodeTexture(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode); + static ContourData *decodeContour(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode); + + static void decodeNode(BaseData *node, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + protected: void loadData(); From d2746f64a680ee674e026951dda5f4db3819d920 Mon Sep 17 00:00:00 2001 From: geron-cn Date: Wed, 18 Jun 2014 18:11:21 +0800 Subject: [PATCH 21/72] cpp-tests --- .../CocoStudioArmatureTest/ArmatureScene.cpp | 96 +++++++++++++++++++ .../CocoStudioArmatureTest/ArmatureScene.h | 23 ++++- 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp index 89ee6992ad..9c84380725 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp @@ -1487,3 +1487,99 @@ void TestChangeAnimationInternal::onTouchesEnded(const std::vector& touc Director::getInstance()->setAnimationInterval(1/30.0f); } } + + + +//TestDirectFromBinay + +const char* TestLoadFromBinary::m_binaryFilesNames[BINARYFILECOUNT] ={"armature/bear.csb","armature/horse.csb", + "armature/Cowboy.csb","armature/hero.csb", + "armature/HeroAnimation.csb","armature/testEasing.csb"}; +const char* TestLoadFromBinary::m_armatureNames[BINARYFILECOUNT] ={"bear","horse", + "Cowboy","hero", + "HeroAnimation","testEasing"}; + + +void TestLoadFromBinary::onEnter() +{ + ArmatureTestLayer::onEnter(); + //setTouchEnabled(true); + + m_armatureIndex = -1; // none + + // remove json created + // remove sync resource + ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/bear.ExportJson"); + ArmatureDataManager::getInstance()->removeArmatureFileInfo(m_binaryFilesNames[0]); + // load from binary + ArmatureDataManager::getInstance()->addArmatureFileInfo(m_binaryFilesNames[0]); + + m_armature = Armature::create(m_armatureNames[0]); + m_armature->getAnimation()->playWithIndex(0); + m_armature->setScale(1.0f); + + m_armature->setPosition(Vec2(VisibleRect::center().x, VisibleRect::center().y)); + addChild(m_armature); + +} + + +std::string TestLoadFromBinary::title() const +{ + return "Test load from binary file"; +} +std::string TestLoadFromBinary::subtitle() const +{ + return "direct load. \nTouch to change to Asynchronous load."; +} + +void TestLoadFromBinary::onTouchesEnded(const std::vector& touches, Event* event) +{ + // remove json created + // remove sync resource + if(-1 == m_armatureIndex ) + { + ArmatureDataManager::getInstance()->removeArmatureFileInfo(m_binaryFilesNames[0]); + ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/Cowboy.ExportJson"); + ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/hero.ExportJson"); + ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/horse.ExportJson"); + ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/HeroAnimation.ExportJson"); + ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/testEasing.ExportJson"); + + for( int i = 0; i < BINARYFILECOUNT; i++) + { + ArmatureDataManager::getInstance()->addArmatureFileInfoAsync(m_binaryFilesNames[i], this, schedule_selector(TestLoadFromBinary::dataLoaded)); + } + + m_armatureIndex = -2; // is loading + } + else if(m_armatureIndex>=0 && m_armature != NULL) + { + this->removeChild(m_armature); + m_armatureIndex = m_armatureIndex==BINARYFILECOUNT-1 ? 0 : m_armatureIndex+1; + m_armature = Armature::create(m_armatureNames[m_armatureIndex]); + m_armature->setPosition(Vec2(VisibleRect::center().x, VisibleRect::center().y)); + if(m_armatureIndex == 2 ) // cowboy is 0.2 + m_armature->setScale(0.2f); + m_armature->getAnimation()->playWithIndex(0); + addChild(m_armature); + } +} + + +void TestLoadFromBinary::dataLoaded( float percent ) +{ + LabelTTF *label = (LabelTTF *)getChildByTag(10001); + if (label) + { + char pszPercent[255]; + sprintf(pszPercent, "%s %f", subtitle().c_str(), percent * 100); + label->setString(pszPercent); + } + + if (percent >= 1) + { + label->setString("Touch to change armature"); + m_armatureIndex = 0; + } +} diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h index 227c77cd5c..3a1586cdaf 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h @@ -45,7 +45,8 @@ enum { TEST_PLAY_SEVERAL_MOVEMENT, TEST_EASING, TEST_CHANGE_ANIMATION_INTERNAL, - + TEST_DIRECT_FROM_BINARY, + TEST_LAYER_COUNT }; @@ -393,4 +394,24 @@ public: void onTouchesEnded(const std::vector& touches, Event* event); }; + +#define BINARYFILECOUNT 6 +class TestLoadFromBinary : public ArmatureTestLayer +{ +public: + virtual void onEnter(); + virtual std::string title() const override; + virtual std::string subtitle() const override; + + void onTouchesEnded(const std::vector& touches, Event* event); + + void dataLoaded(float percent); + +private: + cocostudio::Armature *m_armature; // current armature + static const char* m_binaryFilesNames[BINARYFILECOUNT]; + static const char* m_armatureNames[BINARYFILECOUNT]; + int m_armatureIndex; // index of sync loaded armature, default -1 is none +}; + #endif // __HELLOWORLD_SCENE_H__ From 20b41d288631e17ff5005021eaaa69a4a97705cc Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 18:25:31 +0800 Subject: [PATCH 22/72] fix android compile error --- cocos/editor-support/cocostudio/Android.mk | 1 + cocos/editor-support/cocostudio/CocoLoader.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cocos/editor-support/cocostudio/Android.mk b/cocos/editor-support/cocostudio/Android.mk index cfddcb1d99..07c35493a1 100644 --- a/cocos/editor-support/cocostudio/Android.mk +++ b/cocos/editor-support/cocostudio/Android.mk @@ -39,6 +39,7 @@ CCSSceneReader.cpp \ TriggerBase.cpp \ TriggerMng.cpp \ TriggerObj.cpp \ +CocoLoader.cpp \ WidgetReader/WidgetReader.cpp \ WidgetReader/ButtonReader/ButtonReader.cpp \ WidgetReader/CheckBoxReader/CheckBoxReader.cpp \ diff --git a/cocos/editor-support/cocostudio/CocoLoader.h b/cocos/editor-support/cocostudio/CocoLoader.h index 319faee4e4..7ccb736dc8 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.h +++ b/cocos/editor-support/cocostudio/CocoLoader.h @@ -29,7 +29,7 @@ #include #include #include -#include "ExtensionMacros.h" +#include "extensions/ExtensionMacros.h" #include "json/rapidjson.h" #include "json/document.h" @@ -137,4 +137,4 @@ public: } #pragma pack () -#endif \ No newline at end of file +#endif From b55b95adc3c4ffa8cbfac15df5bbb2726f250771 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 18 Jun 2014 18:28:31 +0800 Subject: [PATCH 23/72] fix linux compile error --- cocos/editor-support/cocostudio/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cocos/editor-support/cocostudio/CMakeLists.txt b/cocos/editor-support/cocostudio/CMakeLists.txt index aeb1b0a265..8105bb67c4 100644 --- a/cocos/editor-support/cocostudio/CMakeLists.txt +++ b/cocos/editor-support/cocostudio/CMakeLists.txt @@ -33,6 +33,7 @@ set(CS_SRC TriggerBase.cpp TriggerMng.cpp TriggerObj.cpp + CocoLoader.cpp WidgetReader/WidgetReader.cpp WidgetReader/ButtonReader/ButtonReader.cpp WidgetReader/CheckBoxReader/CheckBoxReader.cpp From 6abc9aba0e8918425e3fc0cdf78297a4eca6d382 Mon Sep 17 00:00:00 2001 From: geron-cn Date: Wed, 18 Jun 2014 20:09:12 +0800 Subject: [PATCH 24/72] add binary read to test-cpp --- .../cocostudio/CCDataReaderHelper.cpp | 47 +++++++++++++++++-- .../cocostudio/CCDataReaderHelper.h | 3 +- .../CocoStudioArmatureTest/ArmatureScene.cpp | 11 +++-- .../CocoStudioArmatureTest/ArmatureScene.h | 1 + 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp index 124a129262..40eea820b4 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp @@ -192,6 +192,10 @@ void DataReaderHelper::loadData() { DataReaderHelper::addDataFromJsonCache(pAsyncStruct->fileContent.c_str(), pDataInfo); } + else if(pAsyncStruct->configType == CocoStudio_Binary) + { + DataReaderHelper::addDataFromBinaryCache(pAsyncStruct->fileContent.c_str(),pDataInfo); + } // put the image info into the queue _dataInfoMutex.lock(); @@ -294,8 +298,17 @@ void DataReaderHelper::addDataFromFile(const std::string& filePath) // Read content from file std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); - std::string contentStr = FileUtils::getInstance()->getStringFromFile(fullPath); - + bool isbinarysrc = str==".csb"; + std::string filemode("r"); + if(isbinarysrc) + filemode += "b"; + ssize_t filesize; + + _dataReaderHelper->_getFileMutex.lock(); + unsigned char *pBytes = FileUtils::getInstance()->getFileData(filePath, filemode.c_str(), &filesize); + std::string contentStr((const char*)pBytes,filesize); + _dataReaderHelper->_getFileMutex.unlock(); + DataInfo dataInfo; dataInfo.filename = filePathStr; dataInfo.asyncStruct = nullptr; @@ -308,6 +321,12 @@ void DataReaderHelper::addDataFromFile(const std::string& filePath) { DataReaderHelper::addDataFromJsonCache(contentStr, &dataInfo); } + else if(str == ".csb") + { + DataReaderHelper::addDataFromBinaryCache(contentStr.c_str(),&dataInfo); + } + + CC_SAFE_DELETE_ARRAY(pBytes); } void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const std::string& plistPath, const std::string& filePath, Ref *target, SEL_SCHEDULE selector) @@ -391,9 +410,23 @@ void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); + bool isbinaryfilesrc = str==".csb"; + std::string filereadmode("r"); + if (isbinaryfilesrc) { + filereadmode += "b"; + } + ssize_t size; // XXX fileContent is being leaked - data->fileContent = FileUtils::getInstance()->getStringFromFile(fullPath); - + + _dataReaderHelper->_getFileMutex.lock(); + unsigned char *pBytes = FileUtils::getInstance()->getFileData(fullPath.c_str() , filereadmode.c_str(), &size); + _dataReaderHelper->_getFileMutex.unlock(); + + Data bytecpy; + bytecpy.copy(pBytes, size); + data->fileContent = std::string((const char*)bytecpy.getBytes(), size); + CC_SAFE_DELETE_ARRAY(pBytes); + if (str == ".xml") { data->configType = DragonBone_XML; @@ -402,6 +435,10 @@ void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const { data->configType = CocoStudio_JSON; } + else if(str == ".csb") + { + data->configType = CocoStudio_Binary; + } // add async struct into queue @@ -1736,7 +1773,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, pDataArray = tpChildArray[i].GetChildArray(); length = tpChildArray[i].GetChildNum(); AnimationData *animationData; - for (int ii = 0; ii < length; ++i) + for (int ii = 0; ii < length; ++ii) { animationData = decodeAnimation(&tCocoLoader, &pDataArray[ii], dataInfo); if (dataInfo->asyncStruct) diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.h b/cocos/editor-support/cocostudio/CCDataReaderHelper.h index 7cbce644ca..f7a042b542 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.h +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.h @@ -59,7 +59,8 @@ protected: enum ConfigType { DragonBone_XML, - CocoStudio_JSON + CocoStudio_JSON, + CocoStudio_Binary }; typedef struct _AsyncStruct diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp index 9c84380725..c1d5e33886 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp @@ -75,6 +75,9 @@ Layer *CreateLayer(int index) case TEST_CHANGE_ANIMATION_INTERNAL: pLayer = new TestChangeAnimationInternal(); break; + case TEST_DIRECT_FROM_BINARY: + pLayer = new TestLoadFromBinary(); + break; default: break; } @@ -1503,8 +1506,10 @@ const char* TestLoadFromBinary::m_armatureNames[BINARYFILECOUNT] ={"bear","hors void TestLoadFromBinary::onEnter() { ArmatureTestLayer::onEnter(); - //setTouchEnabled(true); - + + auto listener = EventListenerTouchAllAtOnce::create(); + listener->onTouchesEnded = CC_CALLBACK_2(TestLoadFromBinary::onTouchesEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); + m_armatureIndex = -1; // none // remove json created @@ -1530,7 +1535,7 @@ std::string TestLoadFromBinary::title() const } std::string TestLoadFromBinary::subtitle() const { - return "direct load. \nTouch to change to Asynchronous load."; + return "direct load.Touch to change to Asynchronous load."; } void TestLoadFromBinary::onTouchesEnded(const std::vector& touches, Event* event) diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h index 3a1586cdaf..4b353e6fcd 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h @@ -405,6 +405,7 @@ public: void onTouchesEnded(const std::vector& touches, Event* event); + void dataLoaded(float percent); private: From 797085574cda6e5a1107d2a4c5e17e68195ba87f Mon Sep 17 00:00:00 2001 From: geron-cn Date: Wed, 18 Jun 2014 20:13:06 +0800 Subject: [PATCH 25/72] add binary read to test-cpp --- .../ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp index c1d5e33886..9c2cb307b3 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp @@ -1574,11 +1574,11 @@ void TestLoadFromBinary::onTouchesEnded(const std::vector& touches, Even void TestLoadFromBinary::dataLoaded( float percent ) { - LabelTTF *label = (LabelTTF *)getChildByTag(10001); + Label *label = (Label *)getChildByTag(10001); if (label) { char pszPercent[255]; - sprintf(pszPercent, "%s %f", subtitle().c_str(), percent * 100); + sprintf(pszPercent, "%s %f", "Asynchronous loading: ", percent * 100); label->setString(pszPercent); } From 3a350e11aebf7614e858ef83f64e6bc0444c5536 Mon Sep 17 00:00:00 2001 From: samuele3hu Date: Thu, 19 Jun 2014 14:05:38 +0800 Subject: [PATCH 26/72] Add Lua binding for Animation3D and Animate3D ,and add related test case --- .../project.pbxproj | 4 +- .../src/Sprite3DTest/Sprite3DTest.lua | 56 ++++++++++++++++++- tools/tolua/cocos2dx.ini | 6 +- 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj b/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj index 00c00b34d2..3aa43b7a1c 100644 --- a/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj +++ b/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj @@ -889,7 +889,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; - USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../.. $(SRCROOT)/../../.. $(SRCROOT)/../../../base $(SRCROOT)/../../../2d $(SRCROOT)/../../../deprecated $(SRCROOT)/../../../physics $(SRCROOT)/../../../math/kazmath $(SRCROOT)/../../../2d/platform $(SRCROOT)/../../../audio/include $(SRCROOT)/../../../editor-support $(SRCROOT)/../../../editor-support/spine $(SRCROOT)/../../../editor-support/cocostudio $(SRCROOT)/../../../editor-support/cocosbuilder $(SRCROOT)/../../../ui $(SRCROOT)/../../../storage $(SRCROOT)/../../../../extensions $(SRCROOT)/../../../../external $(SRCROOT)/../../../../external/chipmunk/include/chipmunk $(SRCROOT)/../../../../external/lua $(SRCROOT)/../../../../external/lua/luajit/include $(SRCROOT)/../../../../external/lua/tolua"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../.. $(SRCROOT)/../../.. $(SRCROOT)/../../../base $(SRCROOT)/../../../3d $(SRCROOT)/../../../2d $(SRCROOT)/../../../deprecated $(SRCROOT)/../../../physics $(SRCROOT)/../../../math/kazmath $(SRCROOT)/../../../2d/platform $(SRCROOT)/../../../audio/include $(SRCROOT)/../../../editor-support $(SRCROOT)/../../../editor-support/spine $(SRCROOT)/../../../editor-support/cocostudio $(SRCROOT)/../../../editor-support/cocosbuilder $(SRCROOT)/../../../ui $(SRCROOT)/../../../storage $(SRCROOT)/../../../../extensions $(SRCROOT)/../../../../external $(SRCROOT)/../../../../external/chipmunk/include/chipmunk $(SRCROOT)/../../../../external/lua $(SRCROOT)/../../../../external/lua/luajit/include $(SRCROOT)/../../../../external/lua/tolua"; }; name = Debug; }; @@ -922,7 +922,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; - USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../.. $(SRCROOT)/../../.. $(SRCROOT)/../../../base $(SRCROOT)/../../../2d $(SRCROOT)/../../../deprecated $(SRCROOT)/../../../physics $(SRCROOT)/../../../math/kazmath $(SRCROOT)/../../../2d/platform $(SRCROOT)/../../../audio/include $(SRCROOT)/../../../editor-support $(SRCROOT)/../../../editor-support/spine $(SRCROOT)/../../../editor-support/cocostudio $(SRCROOT)/../../../editor-support/cocosbuilder $(SRCROOT)/../../../ui $(SRCROOT)/../../../storage $(SRCROOT)/../../../../extensions $(SRCROOT)/../../../../external $(SRCROOT)/../../../../external/chipmunk/include/chipmunk $(SRCROOT)/../../../../external/lua $(SRCROOT)/../../../../external/lua/luajit/include $(SRCROOT)/../../../../external/lua/tolua"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../.. $(SRCROOT)/../../.. $(SRCROOT)/../../../base $(SRCROOT)/../../../3d $(SRCROOT)/../../../2d $(SRCROOT)/../../../deprecated $(SRCROOT)/../../../physics $(SRCROOT)/../../../math/kazmath $(SRCROOT)/../../../2d/platform $(SRCROOT)/../../../audio/include $(SRCROOT)/../../../editor-support $(SRCROOT)/../../../editor-support/spine $(SRCROOT)/../../../editor-support/cocostudio $(SRCROOT)/../../../editor-support/cocosbuilder $(SRCROOT)/../../../ui $(SRCROOT)/../../../storage $(SRCROOT)/../../../../extensions $(SRCROOT)/../../../../external $(SRCROOT)/../../../../external/chipmunk/include/chipmunk $(SRCROOT)/../../../../external/lua $(SRCROOT)/../../../../external/lua/luajit/include $(SRCROOT)/../../../../external/lua/tolua"; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua b/tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua index 78effa2d15..c1952acf71 100644 --- a/tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua +++ b/tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua @@ -22,7 +22,7 @@ function Sprite3DBasicTest.addNewSpriteWithCoords(parent,x,y) parent:addChild(sprite) sprite:setPosition(cc.p(x,y)) - local random = math.random(0, 1) + local random = math.random() local action = nil if random < 0.2 then action = cc.ScaleBy:create(3,2) @@ -58,6 +58,59 @@ function Sprite3DBasicTest.create() return layer end +---------------------------------------- +----Sprite3DWithSkinTest +---------------------------------------- +local Sprite3DWithSkinTest = {} +Sprite3DWithSkinTest.__index = Sprite3DWithSkinTest + +function Sprite3DWithSkinTest.onTouchesEnd(touches, event) + for i = 1,table.getn(touches) do + local location = touches[i]:getLocation() + Sprite3DWithSkinTest.addNewSpriteWithCoords(Helper.currentLayer, location.x, location.y ) + end +end + +function Sprite3DWithSkinTest.addNewSpriteWithCoords(parent,x,y) + local sprite = cc.Sprite3D:create("Sprite3DTest/girl.c3t") + sprite:setRotation3D({x = -90.0, y = 0.0, z = 0.0}) + sprite:setPosition(cc.p(x, y)) + parent:addChild(sprite) + + local animation = cc.Animation3D:getOrCreate("Sprite3DTest/girl.c3t") + if nil ~= animation then + local animate = cc.Animate3D:create(animation) + if math.random() < (1/3) then + animate:setPlayBack(true) + end + + local rand2 = math.random() + if rand2 < 1/3 then + animate:setSpeed(animate:getSpeed() + math.random()) + elseif rand2 < 2/3 then + animate:setSpeed(animate:getSpeed() - 0.5 * math.random()) + end + + sprite:runAction(cc.RepeatForever:create(animate)) + end +end + +function Sprite3DWithSkinTest.create() + local layer = cc.Layer:create() + Helper.initWithLayer(layer) + Helper.titleLabel:setString("Testing Sprite3D for animation from c3t") + Helper.subtitleLabel:setString("Tap screen to add more sprite3D") + + local listener = cc.EventListenerTouchAllAtOnce:create() + listener:registerScriptHandler(Sprite3DWithSkinTest.onTouchesEnd,cc.Handler.EVENT_TOUCHES_ENDED ) + + local eventDispatcher = layer:getEventDispatcher() + eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer) + + Sprite3DWithSkinTest.addNewSpriteWithCoords(layer, size.width / 2, size.height / 2) + return layer +end + function Sprite3DTest() local scene = cc.Scene:create() @@ -65,6 +118,7 @@ function Sprite3DTest() Helper.createFunctionTable = { Sprite3DBasicTest.create, + Sprite3DWithSkinTest.create, } scene:addChild(Sprite3DBasicTest.create()) diff --git a/tools/tolua/cocos2dx.ini b/tools/tolua/cocos2dx.ini index 0f4d733d71..6a2a9cd6e6 100644 --- a/tools/tolua/cocos2dx.ini +++ b/tools/tolua/cocos2dx.ini @@ -22,7 +22,7 @@ cxxgenerator_headers = extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s # what headers to parse -headers = %(cocosdir)s/cocos/cocos2d.h %(cocosdir)s/cocos/audio/include/SimpleAudioEngine.h %(cocosdir)s/cocos/ui/CCProtectedNode.h +headers = %(cocosdir)s/cocos/cocos2d.h %(cocosdir)s/cocos/audio/include/SimpleAudioEngine.h %(cocosdir)s/cocos/ui/CCProtectedNode.h %(cocosdir)s/cocos/3d/CCAnimation3D.h %(cocosdir)s/cocos/3d/CCAnimate3D.h # what classes to produce code for. You can use regular expressions here. When testing the regular # expression, it will be enclosed in "^$", like this: "^Menu*$". @@ -127,7 +127,9 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS LabelTTF::[*], LabelBMFont::[*], Mesh::[create], - Sprite3D::[getSkin] + Sprite3D::[getSkin], + Animation3D::[getBoneCurveByName], + Animation3DCache::[*] rename_functions = SpriteFrameCache::[addSpriteFramesWithFile=addSpriteFrames getSpriteFrameByName=getSpriteFrame], ProgressTimer::[setReverseProgress=setReverseDirection], From 515de9eda515ef1a4f9a70c2da44d6fd9c268c16 Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 19 Jun 2014 14:40:24 +0800 Subject: [PATCH 27/72] remove magic string of widget json reader --- .../cocostudio/WidgetReader/WidgetReader.cpp | 144 +++++++++++------- .../cocostudio/WidgetReader/WidgetReader.h | 41 ++++- 2 files changed, 132 insertions(+), 53 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index db369da192..e333a4fcdf 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -7,8 +7,54 @@ USING_NS_CC; using namespace ui; + + namespace cocostudio { + + + const char* P_IgnoreSize = "ignoreSize"; + const char* P_SizeType = "sizeType"; + const char* P_PositionType = "positionType"; + const char* P_SizePercentX = "sizePercentX"; + const char* P_SizePercentY = "sizePercentY"; + const char* P_PositionPercentX = "positionPercentX"; + const char* P_PositionPercentY = "positionPercentY"; + const char* P_AdaptScreen = "adaptScreen"; + const char* P_Width = "width"; + const char* P_Height = "height"; + const char* P_Tag = "tag"; + const char* P_ActionTag = "actiontag"; + const char* P_TouchAble = "touchAble"; + const char* P_Name = "name"; + const char* P_X = "x"; + const char* P_Y = "y"; + const char* P_ScaleX = "scaleX"; + const char* P_ScaleY = "scaleY"; + const char* P_Rotation = "rotation"; + const char* P_Visbile = "visible"; + const char* P_ZOrder = "ZOrder"; + const char* P_LayoutParameter = "layoutParameter"; + const char* P_Type = "type"; + const char* P_Gravity = "gravity"; + const char* P_RelativeName = "relativeName"; + const char* P_RelativeToName = "relativeToName"; + const char* P_Align = "align"; + const char* P_MarginLeft = "marginLeft"; + const char* P_MarginRight = "marginRight"; + const char* P_MarginTop = "marginTop"; + const char* P_MarginDown = "marginDown"; + + const char* P_Opacity = "opacity"; + const char* P_ColorR = "colorR"; + const char* P_ColorG = "colorG"; + const char* P_ColorB = "colorB"; + const char* P_FlipX = "flipX"; + const char* P_FlipY = "flipY"; + + + + static WidgetReader* instanceWidgetReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(WidgetReader) @@ -63,21 +109,21 @@ namespace cocostudio void WidgetReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { - bool ignoreSizeExsit = DICTOOL->checkObjectExist_json(options, "ignoreSize"); + bool ignoreSizeExsit = DICTOOL->checkObjectExist_json(options, P_IgnoreSize); if (ignoreSizeExsit) { - widget->ignoreContentAdaptWithSize(DICTOOL->getBooleanValue_json(options, "ignoreSize")); + widget->ignoreContentAdaptWithSize(DICTOOL->getBooleanValue_json(options, P_IgnoreSize)); } - widget->setSizeType((Widget::SizeType)DICTOOL->getIntValue_json(options, "sizeType")); - widget->setPositionType((Widget::PositionType)DICTOOL->getIntValue_json(options, "positionType")); + widget->setSizeType((Widget::SizeType)DICTOOL->getIntValue_json(options, P_SizeType)); + widget->setPositionType((Widget::PositionType)DICTOOL->getIntValue_json(options, P_PositionType)); - widget->setSizePercent(Vec2(DICTOOL->getFloatValue_json(options, "sizePercentX"), DICTOOL->getFloatValue_json(options, "sizePercentY"))); - widget->setPositionPercent(Vec2(DICTOOL->getFloatValue_json(options, "positionPercentX"), DICTOOL->getFloatValue_json(options, "positionPercentY"))); + widget->setSizePercent(Vec2(DICTOOL->getFloatValue_json(options, P_SizePercentX), DICTOOL->getFloatValue_json(options, P_SizePercentY))); + widget->setPositionPercent(Vec2(DICTOOL->getFloatValue_json(options, P_PositionPercentX), DICTOOL->getFloatValue_json(options, P_PositionPercentY))); /* adapt screen */ float w = 0, h = 0; - bool adaptScrenn = DICTOOL->getBooleanValue_json(options, "adaptScreen"); + bool adaptScrenn = DICTOOL->getBooleanValue_json(options, P_AdaptScreen); if (adaptScrenn) { Size screenSize = CCDirector::getInstance()->getWinSize(); @@ -86,55 +132,49 @@ namespace cocostudio } else { - w = DICTOOL->getFloatValue_json(options, "width"); - h = DICTOOL->getFloatValue_json(options, "height"); + w = DICTOOL->getFloatValue_json(options, P_Width); + h = DICTOOL->getFloatValue_json(options, P_Height); } widget->setSize(Size(w, h)); - // before - /* - float w = DICTOOL->getFloatValue_json(options, "width"); - float h = DICTOOL->getFloatValue_json(options, "height"); - widget->setSize(CCSizeMake(w, h)); - */ - /**/ - widget->setTag(DICTOOL->getIntValue_json(options, "tag")); - widget->setActionTag(DICTOOL->getIntValue_json(options, "actiontag")); - widget->setTouchEnabled(DICTOOL->getBooleanValue_json(options, "touchAble")); - const char* name = DICTOOL->getStringValue_json(options, "name"); + widget->setTag(DICTOOL->getIntValue_json(options, P_Tag)); + widget->setActionTag(DICTOOL->getIntValue_json(options, P_ActionTag)); + widget->setTouchEnabled(DICTOOL->getBooleanValue_json(options, P_TouchAble)); + const char* name = DICTOOL->getStringValue_json(options, P_Name); const char* widgetName = name?name:"default"; widget->setName(widgetName); - float x = DICTOOL->getFloatValue_json(options, "x"); - float y = DICTOOL->getFloatValue_json(options, "y"); + + float x = DICTOOL->getFloatValue_json(options, P_X); + float y = DICTOOL->getFloatValue_json(options, P_Y); widget->setPosition(Vec2(x,y)); - bool sx = DICTOOL->checkObjectExist_json(options, "scaleX"); + bool sx = DICTOOL->checkObjectExist_json(options, P_ScaleX); if (sx) { - widget->setScaleX(DICTOOL->getFloatValue_json(options, "scaleX")); + widget->setScaleX(DICTOOL->getFloatValue_json(options, P_ScaleX)); } - bool sy = DICTOOL->checkObjectExist_json(options, "scaleY"); + bool sy = DICTOOL->checkObjectExist_json(options, P_ScaleY); if (sy) { - widget->setScaleY(DICTOOL->getFloatValue_json(options, "scaleY")); + widget->setScaleY(DICTOOL->getFloatValue_json(options, P_ScaleY)); } - bool rt = DICTOOL->checkObjectExist_json(options, "rotation"); + bool rt = DICTOOL->checkObjectExist_json(options, P_Rotation); if (rt) { - widget->setRotation(DICTOOL->getFloatValue_json(options, "rotation")); + widget->setRotation(DICTOOL->getFloatValue_json(options, P_Rotation)); } - bool vb = DICTOOL->checkObjectExist_json(options, "visible"); + bool vb = DICTOOL->checkObjectExist_json(options, P_Visbile); if (vb) { - widget->setVisible(DICTOOL->getBooleanValue_json(options, "visible")); + widget->setVisible(DICTOOL->getBooleanValue_json(options, P_Visbile)); } - int z = DICTOOL->getIntValue_json(options, "ZOrder"); + int z = DICTOOL->getIntValue_json(options, P_ZOrder); widget->setLocalZOrder(z); - bool layout = DICTOOL->checkObjectExist_json(options, "layoutParameter"); + bool layout = DICTOOL->checkObjectExist_json(options, P_LayoutParameter); if (layout) { - const rapidjson::Value& layoutParameterDic = DICTOOL->getSubDictionary_json(options, "layoutParameter"); - int paramType = DICTOOL->getIntValue_json(layoutParameterDic, "type"); + const rapidjson::Value& layoutParameterDic = DICTOOL->getSubDictionary_json(options, P_LayoutParameter); + int paramType = DICTOOL->getIntValue_json(layoutParameterDic, P_Type); LayoutParameter* parameter = nullptr; switch (paramType) { @@ -143,7 +183,7 @@ namespace cocostudio case 1: { parameter = LinearLayoutParameter::create(); - int gravity = DICTOOL->getIntValue_json(layoutParameterDic, "gravity"); + int gravity = DICTOOL->getIntValue_json(layoutParameterDic, P_Gravity); ((LinearLayoutParameter*)parameter)->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)gravity); break; } @@ -151,11 +191,11 @@ namespace cocostudio { parameter = RelativeLayoutParameter::create(); RelativeLayoutParameter* rParameter = (RelativeLayoutParameter*)parameter; - const char* relativeName = DICTOOL->getStringValue_json(layoutParameterDic, "relativeName"); + const char* relativeName = DICTOOL->getStringValue_json(layoutParameterDic, P_RelativeName); rParameter->setRelativeName(relativeName); - const char* relativeToName = DICTOOL->getStringValue_json(layoutParameterDic, "relativeToName"); + const char* relativeToName = DICTOOL->getStringValue_json(layoutParameterDic, P_RelativeToName); rParameter->setRelativeToWidgetName(relativeToName); - int align = DICTOOL->getIntValue_json(layoutParameterDic, "align"); + int align = DICTOOL->getIntValue_json(layoutParameterDic, P_Align); rParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)align); break; } @@ -164,10 +204,10 @@ namespace cocostudio } if (parameter) { - float mgl = DICTOOL->getFloatValue_json(layoutParameterDic, "marginLeft"); - float mgt = DICTOOL->getFloatValue_json(layoutParameterDic, "marginTop"); - float mgr = DICTOOL->getFloatValue_json(layoutParameterDic, "marginRight"); - float mgb = DICTOOL->getFloatValue_json(layoutParameterDic, "marginDown"); + float mgl = DICTOOL->getFloatValue_json(layoutParameterDic, P_MarginLeft); + float mgt = DICTOOL->getFloatValue_json(layoutParameterDic, P_MarginTop); + float mgr = DICTOOL->getFloatValue_json(layoutParameterDic, P_MarginRight); + float mgb = DICTOOL->getFloatValue_json(layoutParameterDic, P_MarginDown); parameter->setMargin(Margin(mgl, mgt, mgr, mgb)); widget->setLayoutParameter(parameter); } @@ -176,23 +216,23 @@ namespace cocostudio void WidgetReader::setColorPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) { - bool op = DICTOOL->checkObjectExist_json(options, "opacity"); + bool op = DICTOOL->checkObjectExist_json(options, P_Opacity); if (op) { - widget->setOpacity(DICTOOL->getIntValue_json(options, "opacity")); + widget->setOpacity(DICTOOL->getIntValue_json(options, P_Opacity)); } - bool cr = DICTOOL->checkObjectExist_json(options, "colorR"); - bool cg = DICTOOL->checkObjectExist_json(options, "colorG"); - bool cb = DICTOOL->checkObjectExist_json(options, "colorB"); - int colorR = cr ? DICTOOL->getIntValue_json(options, "colorR") : 255; - int colorG = cg ? DICTOOL->getIntValue_json(options, "colorG") : 255; - int colorB = cb ? DICTOOL->getIntValue_json(options, "colorB") : 255; + bool cr = DICTOOL->checkObjectExist_json(options, P_ColorR); + bool cg = DICTOOL->checkObjectExist_json(options, P_ColorG); + bool cb = DICTOOL->checkObjectExist_json(options, P_ColorB); + int colorR = cr ? DICTOOL->getIntValue_json(options, P_ColorR) : 255; + int colorG = cg ? DICTOOL->getIntValue_json(options, P_ColorG) : 255; + int colorB = cb ? DICTOOL->getIntValue_json(options, P_ColorB) : 255; widget->setColor(Color3B(colorR, colorG, colorB)); this->setAnchorPointForWidget(widget, options); - bool flipX = DICTOOL->getBooleanValue_json(options, "flipX"); - bool flipY = DICTOOL->getBooleanValue_json(options, "flipY"); + bool flipX = DICTOOL->getBooleanValue_json(options, P_FlipX); + bool flipY = DICTOOL->getBooleanValue_json(options, P_FlipY); widget->setFlippedX(flipX); widget->setFlippedY(flipY); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index 0d46881b36..cc5d6095f1 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -31,7 +31,6 @@ #include "ui/UIWidget.h" - namespace cocostudio { class CocoLoader; @@ -87,6 +86,46 @@ namespace cocostudio cocos2d::Vec2 _originalAnchorPoint; }; + + //property const define + extern const char* P_IgnoreSize; + extern const char* P_SizeType; + extern const char* P_PositionType; + extern const char* P_SizePercentX; + extern const char* P_SizePercentY; + extern const char* P_PositionPercentX; + extern const char* P_PositionPercentY; + extern const char* P_AdaptScreen; + extern const char* P_Width; + extern const char* P_Height; + extern const char* P_Tag; + extern const char* P_ActionTag; + extern const char* P_TouchAble; + extern const char* P_Name; + extern const char* P_X; + extern const char* P_Y; + extern const char* P_ScaleX; + extern const char* P_ScaleY; + extern const char* P_Rotation; + extern const char* P_Visbile; + extern const char* P_ZOrder; + extern const char* P_LayoutParameter; + extern const char* P_Type; + extern const char* P_Gravity; + extern const char* P_RelativeName; + extern const char* P_RelativeToName; + extern const char* P_Align; + extern const char* P_MarginLeft; + extern const char* P_MarginRight; + extern const char* P_MarginTop; + extern const char* P_MarginDown; + + extern const char* P_Opacity; + extern const char* P_ColorR; + extern const char* P_ColorG; + extern const char* P_ColorB; + extern const char* P_FlipX; + extern const char* P_FlipY; } #endif /* defined(__TestCpp__WidgetReader__) */ From a26ef87783ac1b3833343d8c36b7ad71d9eb39f0 Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 19 Jun 2014 15:16:56 +0800 Subject: [PATCH 28/72] cleanup reader code --- .../ButtonReader/ButtonReader.cpp | 110 +---------------- .../CheckBoxReader/CheckBoxReader.cpp | 110 +---------------- .../ImageViewReader/ImageViewReader.cpp | 111 +---------------- .../LayoutReader/LayoutReader.cpp | 112 +---------------- .../LoadingBarReader/LoadingBarReader.cpp | 110 +---------------- .../SliderReader/SliderReader.cpp | 110 +---------------- .../TextAtlasReader/TextAtlasReader.cpp | 113 +----------------- .../TextBMFontReader/TextBMFontReader.cpp | 111 +---------------- .../TextFieldReader/TextFieldReader.cpp | 110 +---------------- .../WidgetReader/TextReader/TextReader.cpp | 112 +---------------- .../cocostudio/WidgetReader/WidgetReader.cpp | 92 +------------- .../cocostudio/WidgetReader/WidgetReader.h | 106 ++++++++++++++++ 12 files changed, 162 insertions(+), 1145 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index 5981973d60..a12b14e805 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -55,112 +55,12 @@ namespace cocostudio std::string value = stChildArray[i].GetValue(); // CCLOG("Button: key = %s, value = %d", key.c_str(), i); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index 8f0307b233..f5368891b9 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -43,112 +43,12 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); // CCLOG("key = %s, index : %d", key.c_str(), i); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 04bcc66b6c..5593a5b5f4 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -45,114 +45,13 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); -// CCLOG("ImageView: key = %s, value = %d", key.c_str(), i); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index 6fa76a2af2..88b90b67a1 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -54,113 +54,13 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); -// CCLOG("Layout: key = %s, value = %d", key.c_str(), i); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER + + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp index ffd8d2cae5..85ba0eb276 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp @@ -48,112 +48,12 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index a47c1b4bbd..0da3549b4b 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -46,112 +46,12 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp index d2ac6f1553..7579e621b8 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp @@ -49,114 +49,13 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); -// CCLOG("LabelAtlas: key = %s, value = %s", key.c_str(), value.c_str()); - - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER + + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp index ad3268f195..44b967ca1f 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp @@ -44,113 +44,12 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } - - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp index fde3284b59..89a939555d 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp @@ -44,112 +44,12 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp index cea60c3624..449306ecb5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp @@ -44,114 +44,12 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); -// CCLOG("Text: key = %s, value = %s", key.c_str(), value.c_str()); - - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - _sizePercentX = valueToFloat(value); - }else if(key == "sizePercentY"){ - _sizePercentY = valueToFloat(value); - }else if(key == "positionPercentX"){ - _positionPercentX = valueToFloat(value); - }else if(key == "positionPercentY"){ - _positionPercentY = valueToFloat(value); - } - else if(key == "adaptScreen"){ - _isAdaptScreen = valueToBool(value); - } - else if (key == "width"){ - _width = valueToFloat(value); - }else if(key == "height"){ - _height = valueToFloat(value); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - _position.x = valueToFloat(value); - }else if(key == "y"){ - _position.y = valueToFloat(value); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - LinearLayoutParameter *linearParameter = LinearLayoutParameter::create(); - RelativeLayoutParameter *relativeParameter = RelativeLayoutParameter::create(); - Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } + //read all basic properties of widget + CC_BASIC_PROPERTY_BINARY_READER + //read all color related properties of widget + CC_COLOR_PROPERTY_BINARY_READER - else if (key == "opacity") { - _opacity = valueToInt(value); - }else if(key == "colorR"){ - _color.r = valueToInt(value); - }else if(key == "colorG"){ - _color.g = valueToInt(value); - }else if(key == "colorB") - { - _color.b = valueToInt(value); - }else if(key == "flipX"){ - widget->setFlippedX(valueToBool(value)); - }else if(key == "flipY"){ - widget->setFlippedY(valueToBool(value)); - }else if(key == "anchorPointX"){ + else if(key == "anchorPointX"){ _originalAnchorPoint.x = valueToFloat(value); }else if(key == "anchorPointY"){ _originalAnchorPoint.y = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index e333a4fcdf..1241e04065 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -341,100 +341,16 @@ namespace cocostudio { stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + this->beginSetBasicProperties(widget); for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "ignoreSize") { - widget->ignoreContentAdaptWithSize(valueToBool(value)); - }else if(key == "sizeType"){ - widget->setSizeType((Widget::SizeType)valueToInt(value)); - }else if(key == "positionType"){ - widget->setPositionType((Widget::PositionType)valueToInt(value)); - }else if(key == "sizePercentX"){ - widget->setSizePercent(Vec2(valueToFloat(value), widget->getSizePercent().y)); - }else if(key == "sizePercentY"){ - widget->setSizePercent(Vec2(widget->getSizePercent().x, valueToFloat(value))); - }else if(key == "positionPercentX"){ - widget->setPositionPercent(Vec2(valueToFloat(value), widget->getPositionPercent().y)); - }else if(key == "positionPercentY"){ - widget->setPositionPercent(Vec2(widget->getPositionPercent().x, valueToFloat(value))); - }else if (key == "width"){ - widget->setSize(Size(valueToFloat(value), widget->getSize().height)); - }else if(key == "height"){ - widget->setSize(Size(widget->getSize().width, valueToFloat(value))); - }else if(key == "tag"){ - widget->setTag(valueToInt(value)); - }else if(key == "actiontag"){ - widget->setActionTag(valueToInt(value)); - }else if(key == "touchAble"){ - widget->setTouchEnabled(valueToBool(value)); - }else if(key == "name"){ - std::string widgetName = value.empty() ? "default" : value; - widget->setName(widgetName); - }else if(key == "x"){ - widget->setPosition(Vec2(valueToFloat(value), widget->getPosition().y)); - }else if(key == "y"){ - widget->setPosition(Vec2(widget->getPosition().x, valueToFloat(value))); - }else if(key == "scaleX"){ - widget->setScaleX(valueToFloat(value)); - }else if(key == "scaleY"){ - widget->setScaleY(valueToFloat(value)); - }else if(key == "rotation"){ - widget->setRotation(valueToFloat(value)); - }else if(key == "visible"){ - widget->setVisible(valueToBool(value)); - }else if(key == "ZOrder"){ - widget->setZOrder(valueToInt(value)); - }else if(key == "layoutParameter"){ - stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); - - ui::LinearLayoutParameter *linearParameter = ui::LinearLayoutParameter::create(); - ui::RelativeLayoutParameter *relativeParameter = ui::RelativeLayoutParameter::create(); - ui::Margin mg; - - int paramType = -1; - for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); - std::string innerValue = layoutCocosNode[j].GetValue(); - - if (innerKey == "type") { - paramType = valueToInt(innerValue); - }else if(innerKey == "gravity"){ - linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); - }else if(innerKey == "relativeName"){ - relativeParameter->setRelativeName(innerValue); - }else if(innerKey == "relativeToName"){ - relativeParameter->setRelativeToWidgetName(innerValue); - }else if(innerKey == "align"){ - relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); - }else if(innerKey == "marginLeft"){ - mg.left = valueToFloat(innerValue); - }else if(innerKey == "marginTop"){ - mg.top = valueToFloat(innerValue); - }else if(innerKey == "marginRight"){ - mg.right = valueToFloat(innerValue); - }else if(innerKey == "marginDown"){ - mg.bottom = valueToFloat(innerValue); - } - } - - linearParameter->setMargin(mg); - relativeParameter->setMargin(mg); - - switch (paramType) { - case 1: - widget->setLayoutParameter(linearParameter); - break; - case 2: - widget->setLayoutParameter(relativeParameter); - default: - break; - } - } - + CC_BASIC_PROPERTY_BINARY_READER } + + this->endSetBasicProperties(widget); } } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index cc5d6095f1..dfc3908010 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -126,6 +126,112 @@ namespace cocostudio extern const char* P_ColorB; extern const char* P_FlipX; extern const char* P_FlipY; + +#define CC_BASIC_PROPERTY_BINARY_READER \ + if (key == P_IgnoreSize) { \ + widget->ignoreContentAdaptWithSize(valueToBool(value)); \ + }else if(key == P_SizeType){ \ + widget->setSizeType((Widget::SizeType)valueToInt(value)); \ + }else if(key == P_PositionType){ \ + widget->setPositionType((Widget::PositionType)valueToInt(value)); \ + }else if(key == P_SizePercentX){ \ + _sizePercentX = valueToFloat(value); \ + }else if(key == P_SizePercentY){ \ + _sizePercentY = valueToFloat(value); \ + }else if(key == P_PositionPercentX){ \ + _positionPercentX = valueToFloat(value); \ + }else if(key == P_PositionPercentY){ \ + _positionPercentY = valueToFloat(value); \ + } \ + else if(key == P_AdaptScreen){ \ + _isAdaptScreen = valueToBool(value); \ + }else if (key == P_Width){ \ + _width = valueToFloat(value); \ + }else if(key == P_Height){ \ + _height = valueToFloat(value); \ + }else if(key == P_Tag){ \ + widget->setTag(valueToInt(value)); \ + }else if(key == P_ActionTag){ \ + widget->setActionTag(valueToInt(value)); \ + }else if(key == P_TouchAble){ \ + widget->setTouchEnabled(valueToBool(value)); \ + }else if(key == P_Name){ \ + std::string widgetName = value.empty() ? "default" : value; \ + widget->setName(widgetName); \ + }else if(key == P_X){ \ + _position.x = valueToFloat(value); \ + }else if(key == P_Y){ \ + _position.y = valueToFloat(value); \ + }else if(key == P_ScaleX){ \ + widget->setScaleX(valueToFloat(value)); \ + }else if(key == P_ScaleY){ \ + widget->setScaleY(valueToFloat(value)); \ + }else if(key == P_Rotation){ \ + widget->setRotation(valueToFloat(value)); \ + }else if(key == P_Visbile){ \ + widget->setVisible(valueToBool(value)); \ + }else if(key == P_ZOrder){ \ + widget->setZOrder(valueToInt(value)); \ + }else if(key == P_LayoutParameter){ \ + stExpCocoNode *layoutCocosNode = stChildArray[i].GetChildArray(); \ + ui::LinearLayoutParameter *linearParameter = ui::LinearLayoutParameter::create(); \ + ui::RelativeLayoutParameter *relativeParameter = ui::RelativeLayoutParameter::create(); \ + ui::Margin mg; \ + int paramType = -1; \ + for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { \ + std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); \ + std::string innerValue = layoutCocosNode[j].GetValue(); \ + if (innerKey == P_Type) { \ + paramType = valueToInt(innerValue); \ + }else if(innerKey == P_Gravity){ \ + linearParameter->setGravity((cocos2d::ui::LinearLayoutParameter::LinearGravity)valueToInt(innerValue)); \ + }else if(innerKey == P_RelativeName){ \ + relativeParameter->setRelativeName(innerValue); \ + }else if(innerKey == P_RelativeToName){ \ + relativeParameter->setRelativeToWidgetName(innerValue); \ + }else if(innerKey == P_Align){ \ + relativeParameter->setAlign((cocos2d::ui::RelativeLayoutParameter::RelativeAlign)valueToInt(innerValue)); \ + }else if(innerKey == P_MarginLeft){ \ + mg.left = valueToFloat(innerValue); \ + }else if(innerKey == P_MarginTop){ \ + mg.top = valueToFloat(innerValue); \ + }else if(innerKey == P_MarginRight){ \ + mg.right = valueToFloat(innerValue); \ + }else if(innerKey == P_MarginDown){ \ + mg.bottom = valueToFloat(innerValue); \ + } \ + } \ + linearParameter->setMargin(mg); \ + relativeParameter->setMargin(mg); \ + switch (paramType) { \ + case 1: \ + widget->setLayoutParameter(linearParameter); \ + break; \ + case 2: \ + widget->setLayoutParameter(relativeParameter); \ + default: \ + break;\ + }\ + } + + +#define CC_COLOR_PROPERTY_BINARY_READER \ + else if (key == P_Opacity) { \ + _opacity = valueToInt(value); \ + }else if(key == P_ColorR){ \ + _color.r = valueToInt(value); \ + }else if(key == P_ColorG){ \ + _color.g = valueToInt(value); \ + }else if(key == P_ColorB) \ + {\ + _color.b = valueToInt(value);\ + }else if(key == P_FlipX){\ + widget->setFlippedX(valueToBool(value));\ + }else if(key == P_FlipY){\ + widget->setFlippedY(valueToBool(value));\ + } + + } #endif /* defined(__TestCpp__WidgetReader__) */ From 4d64b166ccb950aa72cb3c33ba48bb471c673efd Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 19 Jun 2014 17:04:14 +0800 Subject: [PATCH 29/72] refactor - replace magic string with const string --- .../ButtonReader/ButtonReader.cpp | 118 ++++++++------- .../CheckBoxReader/CheckBoxReader.cpp | 51 +++---- .../ImageViewReader/ImageViewReader.cpp | 57 ++++---- .../LayoutReader/LayoutReader.cpp | 136 ++++++++++-------- .../ListViewReader/ListViewReader.cpp | 15 +- .../LoadingBarReader/LoadingBarReader.cpp | 54 +++---- .../ScrollViewReader/ScrollViewReader.cpp | 21 +-- .../SliderReader/SliderReader.cpp | 70 ++++----- .../TextAtlasReader/TextAtlasReader.cpp | 42 +++--- .../TextBMFontReader/TextBMFontReader.cpp | 20 ++- .../TextFieldReader/TextFieldReader.cpp | 76 +++++----- .../WidgetReader/TextReader/TextReader.cpp | 58 ++++---- .../cocostudio/WidgetReader/WidgetReader.cpp | 17 ++- .../cocostudio/WidgetReader/WidgetReader.h | 14 +- 14 files changed, 413 insertions(+), 336 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index a12b14e805..e7ddf5d638 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -9,6 +9,26 @@ using namespace ui; namespace cocostudio { + + static const char* P_Scale9Enable = "scale9Enable"; + static const char* P_NormalData = "normalData"; + static const char* P_PressedData = "pressedData"; + static const char* P_DisabledData = "disabledData"; + static const char* P_Text = "text"; + static const char* P_CapInsetsX = "capInsetsX"; + static const char* P_CapInsetsY = "capInsetsY"; + static const char* P_CapInsetsWidth = "capInsetsWidth"; + static const char* P_CapInsetsHeight = "capInsetsHeight"; + static const char* P_Scale9Width = "scale9Width"; + static const char* P_Scale9Height = "scale9Height"; + static const char* P_TextColorR = "textColorR"; + static const char* P_TextColorG = "textColorG"; + static const char* P_TextColorB = "textColorB"; + static const char* P_FontSize = "fontSize"; + static const char* P_FontName = "fontName"; + + + static ButtonReader* instanceButtonReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(ButtonReader) @@ -60,15 +80,11 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } - else if (key == "scale9Enable") { + + else if (key == P_Scale9Enable) { button->setScale9Enabled(valueToBool(value)); } - else if (key == "normalData"){ + else if (key == P_NormalData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -80,7 +96,7 @@ namespace cocostudio button->loadTextureNormal(backgroundValue, imageFileNameType); } - else if (key == "pressedData"){ + else if (key == P_PressedData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -92,7 +108,7 @@ namespace cocostudio button->loadTexturePressed(backgroundValue, imageFileNameType); } - else if (key == "disabledData"){ + else if (key == P_DisabledData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -103,30 +119,30 @@ namespace cocostudio button->loadTextureDisabled(backgroundValue, imageFileNameType); - }else if (key == "text"){ + }else if (key == P_Text){ button->setTitleText(value); } - else if(key == "capInsetsX"){ + else if(key == P_CapInsetsX){ capsx = valueToFloat(value); - }else if(key == "capInsetsY"){ + }else if(key == P_CapInsetsY){ capsy = valueToFloat(value); - }else if(key == "capInsetsWidth"){ + }else if(key == P_CapInsetsWidth){ capsWidth = valueToFloat(value); - }else if(key == "capInsetsHeight"){ + }else if(key == P_CapInsetsHeight){ capsHeight = valueToFloat(value); - }else if(key == "scale9Width"){ + }else if(key == P_Scale9Width){ scale9Width = valueToFloat(value); - }else if(key == "scale9Height"){ + }else if(key == P_Scale9Height){ scale9Height = valueToFloat(value); - }else if(key == "textColorR"){ + }else if(key == P_TextColorR){ cri = valueToInt(value); - }else if(key == "textColorG"){ + }else if(key == P_TextColorG){ cgi = valueToInt(value); - }else if(key == "textColorB"){ + }else if(key == P_TextColorB){ cbi = valueToInt(value); - }else if(key == "fontSize"){ + }else if(key == P_FontSize){ button->setTitleFontSize(valueToFloat(value)); - }else if(key == "fontName"){ + }else if(key == P_FontName){ button->setTitleFontName(value); } @@ -150,72 +166,72 @@ namespace cocostudio Button* button = static_cast(widget); - bool scale9Enable = DICTOOL->getBooleanValue_json(options, "scale9Enable"); + bool scale9Enable = DICTOOL->getBooleanValue_json(options, P_Scale9Enable); button->setScale9Enabled(scale9Enable); - const rapidjson::Value& normalDic = DICTOOL->getSubDictionary_json(options, "normalData"); - int normalType = DICTOOL->getIntValue_json(normalDic, "resourceType"); - std::string normalTexturePath = this->getResourcePath(normalDic, "path", (Widget::TextureResType)normalType); + const rapidjson::Value& normalDic = DICTOOL->getSubDictionary_json(options, P_NormalData); + int normalType = DICTOOL->getIntValue_json(normalDic, P_ResourceType); + std::string normalTexturePath = this->getResourcePath(normalDic, P_Path, (Widget::TextureResType)normalType); button->loadTextureNormal(normalTexturePath, (Widget::TextureResType)normalType); - const rapidjson::Value& pressedDic = DICTOOL->getSubDictionary_json(options, "pressedData"); - int pressedType = DICTOOL->getIntValue_json(pressedDic, "resourceType"); + const rapidjson::Value& pressedDic = DICTOOL->getSubDictionary_json(options, P_PressedData); + int pressedType = DICTOOL->getIntValue_json(pressedDic, P_ResourceType); - std::string pressedTexturePath = this->getResourcePath(pressedDic, "path", (Widget::TextureResType)pressedType); + std::string pressedTexturePath = this->getResourcePath(pressedDic, P_Path, (Widget::TextureResType)pressedType); button->loadTexturePressed(pressedTexturePath, (Widget::TextureResType)pressedType); - const rapidjson::Value& disabledDic = DICTOOL->getSubDictionary_json(options, "disabledData"); - int disabledType = DICTOOL->getIntValue_json(disabledDic, "resourceType"); + const rapidjson::Value& disabledDic = DICTOOL->getSubDictionary_json(options, P_DisabledData); + int disabledType = DICTOOL->getIntValue_json(disabledDic, P_ResourceType); - std::string disabledTexturePath = this->getResourcePath(disabledDic, "path", (Widget::TextureResType)disabledType); + std::string disabledTexturePath = this->getResourcePath(disabledDic, P_Path, (Widget::TextureResType)disabledType); button->loadTextureDisabled(disabledTexturePath, (Widget::TextureResType)disabledType); if (scale9Enable) { - float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); - float cy = DICTOOL->getFloatValue_json(options, "capInsetsY"); - float cw = DICTOOL->getFloatValue_json(options, "capInsetsWidth"); - float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); + float cx = DICTOOL->getFloatValue_json(options, P_CapInsetsX); + float cy = DICTOOL->getFloatValue_json(options, P_CapInsetsY); + float cw = DICTOOL->getFloatValue_json(options, P_CapInsetsWidth); + float ch = DICTOOL->getFloatValue_json(options, P_CapInsetsHeight); button->setCapInsets(Rect(cx, cy, cw, ch)); - bool sw = DICTOOL->checkObjectExist_json(options, "scale9Width"); - bool sh = DICTOOL->checkObjectExist_json(options, "scale9Height"); + bool sw = DICTOOL->checkObjectExist_json(options, P_Scale9Width); + bool sh = DICTOOL->checkObjectExist_json(options, P_Scale9Height); if (sw && sh) { - float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); - float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); + float swf = DICTOOL->getFloatValue_json(options, P_Scale9Width); + float shf = DICTOOL->getFloatValue_json(options, P_Scale9Height); button->setSize(Size(swf, shf)); } } - bool tt = DICTOOL->checkObjectExist_json(options, "text"); + bool tt = DICTOOL->checkObjectExist_json(options, P_Text); if (tt) { - const char* text = DICTOOL->getStringValue_json(options, "text"); + const char* text = DICTOOL->getStringValue_json(options, P_Text); if (text) { button->setTitleText(text); } } - bool cr = DICTOOL->checkObjectExist_json(options, "textColorR"); - bool cg = DICTOOL->checkObjectExist_json(options, "textColorG"); - bool cb = DICTOOL->checkObjectExist_json(options, "textColorB"); - int cri = cr?DICTOOL->getIntValue_json(options, "textColorR"):255; - int cgi = cg?DICTOOL->getIntValue_json(options, "textColorG"):255; - int cbi = cb?DICTOOL->getIntValue_json(options, "textColorB"):255; + bool cr = DICTOOL->checkObjectExist_json(options, P_TextColorR); + bool cg = DICTOOL->checkObjectExist_json(options, P_TextColorG); + bool cb = DICTOOL->checkObjectExist_json(options, P_TextColorB); + int cri = cr?DICTOOL->getIntValue_json(options, P_TextColorR):255; + int cgi = cg?DICTOOL->getIntValue_json(options, P_TextColorG):255; + int cbi = cb?DICTOOL->getIntValue_json(options, P_TextColorB):255; button->setTitleColor(Color3B(cri,cgi,cbi)); - bool fs = DICTOOL->checkObjectExist_json(options, "fontSize"); + bool fs = DICTOOL->checkObjectExist_json(options, P_FontSize); if (fs) { - button->setTitleFontSize(DICTOOL->getIntValue_json(options, "fontSize")); + button->setTitleFontSize(DICTOOL->getIntValue_json(options, P_FontSize)); } - bool fn = DICTOOL->checkObjectExist_json(options, "fontName"); + bool fn = DICTOOL->checkObjectExist_json(options, P_FontName); if (fn) { - button->setTitleFontName(DICTOOL->getStringValue_json(options, "fontName")); + button->setTitleFontName(DICTOOL->getStringValue_json(options, P_FontName)); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index f5368891b9..baceef63fa 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -9,6 +9,12 @@ using namespace ui; namespace cocostudio { + static const char* P_BackGroundBoxData = "backGroundBoxData"; + static const char* P_BackGroundBoxSelectedData = "backGroundBoxSelectedData"; + static const char* P_FrontCrossData = "frontCrossData"; + static const char* P_BackGroundBoxDisabledData = "backGroundBoxDisabledData"; + static const char* P_FrontCrossDisabledData = "frontCrossDisabledData"; + static CheckBoxReader* instanceCheckBoxReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(CheckBoxReader) @@ -48,12 +54,7 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } - else if (key == "backGroundBoxData"){ + else if (key == P_BackGroundBoxData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -63,7 +64,7 @@ namespace cocostudio std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureBackGround(backgroundValue, imageFileNameType); - }else if(key == "backGroundBoxSelectedData"){ + }else if(key == P_BackGroundBoxSelectedData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -72,7 +73,7 @@ namespace cocostudio std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureBackGroundSelected(backgroundValue, imageFileNameType); - }else if(key == "frontCrossData"){ + }else if(key == P_FrontCrossData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -81,7 +82,7 @@ namespace cocostudio std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureFrontCross(backgroundValue, imageFileNameType); - }else if(key == "backGroundBoxDisabledData"){ + }else if(key == P_BackGroundBoxDisabledData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -90,7 +91,7 @@ namespace cocostudio std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureBackGroundDisabled(backgroundValue, imageFileNameType); - }else if (key == "frontCrossDisabledData"){ + }else if (key == P_FrontCrossDisabledData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -117,33 +118,33 @@ namespace cocostudio CheckBox* checkBox = static_cast(widget); //load background image - const rapidjson::Value& backGroundDic = DICTOOL->getSubDictionary_json(options, "backGroundBoxData"); - int backGroundType = DICTOOL->getIntValue_json(backGroundDic, "resourceType"); - std::string backGroundTexturePath = this->getResourcePath(backGroundDic, "path", (Widget::TextureResType)backGroundType); + const rapidjson::Value& backGroundDic = DICTOOL->getSubDictionary_json(options, P_BackGroundBoxData); + int backGroundType = DICTOOL->getIntValue_json(backGroundDic,P_ResourceType); + std::string backGroundTexturePath = this->getResourcePath(backGroundDic, P_Path, (Widget::TextureResType)backGroundType); checkBox->loadTextureBackGround(backGroundTexturePath, (Widget::TextureResType)backGroundType); //load background selected image - const rapidjson::Value& backGroundSelectedDic = DICTOOL->getSubDictionary_json(options, "backGroundBoxSelectedData"); - int backGroundSelectedType = DICTOOL->getIntValue_json(backGroundSelectedDic, "resourceType"); - std::string backGroundSelectedTexturePath = this->getResourcePath(backGroundSelectedDic, "path", (Widget::TextureResType)backGroundSelectedType); + const rapidjson::Value& backGroundSelectedDic = DICTOOL->getSubDictionary_json(options, P_BackGroundBoxSelectedData); + int backGroundSelectedType = DICTOOL->getIntValue_json(backGroundSelectedDic, P_ResourceType); + std::string backGroundSelectedTexturePath = this->getResourcePath(backGroundSelectedDic, P_Path, (Widget::TextureResType)backGroundSelectedType); checkBox->loadTextureBackGroundSelected(backGroundSelectedTexturePath, (Widget::TextureResType)backGroundSelectedType); //load frontCross image - const rapidjson::Value& frontCrossDic = DICTOOL->getSubDictionary_json(options, "frontCrossData"); - int frontCrossType = DICTOOL->getIntValue_json(frontCrossDic, "resourceType"); - std::string frontCrossFileName = this->getResourcePath(frontCrossDic, "path", (Widget::TextureResType)frontCrossType); + const rapidjson::Value& frontCrossDic = DICTOOL->getSubDictionary_json(options, P_FrontCrossData); + int frontCrossType = DICTOOL->getIntValue_json(frontCrossDic, P_ResourceType); + std::string frontCrossFileName = this->getResourcePath(frontCrossDic, P_Path, (Widget::TextureResType)frontCrossType); checkBox->loadTextureFrontCross(frontCrossFileName, (Widget::TextureResType)frontCrossType); //load backGroundBoxDisabledData - const rapidjson::Value& backGroundDisabledDic = DICTOOL->getSubDictionary_json(options, "backGroundBoxDisabledData"); - int backGroundDisabledType = DICTOOL->getIntValue_json(backGroundDisabledDic, "resourceType"); - std::string backGroundDisabledFileName = this->getResourcePath(backGroundDisabledDic, "path", (Widget::TextureResType)backGroundDisabledType); + const rapidjson::Value& backGroundDisabledDic = DICTOOL->getSubDictionary_json(options, P_BackGroundBoxDisabledData); + int backGroundDisabledType = DICTOOL->getIntValue_json(backGroundDisabledDic, P_ResourceType); + std::string backGroundDisabledFileName = this->getResourcePath(backGroundDisabledDic, P_Path, (Widget::TextureResType)backGroundDisabledType); checkBox->loadTextureBackGroundDisabled(backGroundDisabledFileName, (Widget::TextureResType)backGroundDisabledType); ///load frontCrossDisabledData - const rapidjson::Value& frontCrossDisabledDic = DICTOOL->getSubDictionary_json(options, "frontCrossDisabledData"); - int frontCrossDisabledType = DICTOOL->getIntValue_json(frontCrossDisabledDic, "resourceType"); - std::string frontCrossDisabledFileName = this->getResourcePath(frontCrossDisabledDic, "path", (Widget::TextureResType)frontCrossDisabledType); + const rapidjson::Value& frontCrossDisabledDic = DICTOOL->getSubDictionary_json(options, P_FrontCrossDisabledData); + int frontCrossDisabledType = DICTOOL->getIntValue_json(frontCrossDisabledDic, P_ResourceType); + std::string frontCrossDisabledFileName = this->getResourcePath(frontCrossDisabledDic, P_Path, (Widget::TextureResType)frontCrossDisabledType); checkBox->loadTextureFrontCrossDisabled(frontCrossDisabledFileName, (Widget::TextureResType)frontCrossDisabledType); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 5593a5b5f4..5b8e58b9f4 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -9,6 +9,16 @@ using namespace ui; namespace cocostudio { + static const char* P_Scale9Enable = "scale9Enable"; + static const char* P_FileNameData = "fileNameData"; + static const char* P_CapInsetsX = "capInsetsX"; + static const char* P_CapInsetsY = "capInsetsY"; + static const char* P_CapInsetsWidth = "capInsetsWidth"; + static const char* P_CapInsetsHeight = "capInsetsHeight"; + static const char* P_Scale9Width = "scale9Width"; + static const char* P_Scale9Height = "scale9Height"; + + static ImageViewReader* instanceImageViewReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(ImageViewReader) @@ -51,15 +61,10 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } - else if (key == "scale9Enable") { + else if (key == P_Scale9Enable) { imageView->setScale9Enabled(valueToBool(value)); } - else if (key == "fileNameData"){ + else if (key == P_FileNameData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -70,18 +75,18 @@ namespace cocostudio imageView->loadTexture(backgroundValue, imageFileNameType); } - else if(key == "scale9Width"){ + else if(key == P_Scale9Width){ imageView->setSize(Size(valueToFloat(value), imageView->getSize().height)); - }else if(key == "scale9Height"){ + }else if(key == P_Scale9Height){ imageView->setSize(Size(imageView->getSize().width, valueToFloat(value))); } - else if(key == "capInsetsX"){ + else if(key == P_CapInsetsX){ capsx = valueToFloat(value); - }else if(key == "capInsetsY"){ + }else if(key == P_CapInsetsY){ capsy = valueToFloat(value); - }else if(key == "capInsetsWidth"){ + }else if(key == P_CapInsetsWidth){ capsWidth = valueToFloat(value); - }else if(key == "capInsetsHeight"){ + }else if(key == P_CapInsetsHeight){ capsHeight = valueToFloat(value); } @@ -103,36 +108,36 @@ namespace cocostudio ImageView* imageView = static_cast(widget); - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "fileNameData"); - int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - std::string imageFileName = this->getResourcePath(imageFileNameDic, "path", (Widget::TextureResType)imageFileNameType); + const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, P_FileNameData); + int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, P_ResourceType); + std::string imageFileName = this->getResourcePath(imageFileNameDic, P_Path, (Widget::TextureResType)imageFileNameType); imageView->loadTexture(imageFileName, (Widget::TextureResType)imageFileNameType); - bool scale9EnableExist = DICTOOL->checkObjectExist_json(options, "scale9Enable"); + bool scale9EnableExist = DICTOOL->checkObjectExist_json(options, P_Scale9Enable); bool scale9Enable = false; if (scale9EnableExist) { - scale9Enable = DICTOOL->getBooleanValue_json(options, "scale9Enable"); + scale9Enable = DICTOOL->getBooleanValue_json(options, P_Scale9Enable); } imageView->setScale9Enabled(scale9Enable); if (scale9Enable) { - bool sw = DICTOOL->checkObjectExist_json(options, "scale9Width"); - bool sh = DICTOOL->checkObjectExist_json(options, "scale9Height"); + bool sw = DICTOOL->checkObjectExist_json(options, P_Scale9Width); + bool sh = DICTOOL->checkObjectExist_json(options, P_Scale9Height); if (sw && sh) { - float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); - float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); + float swf = DICTOOL->getFloatValue_json(options, P_Scale9Width); + float shf = DICTOOL->getFloatValue_json(options, P_Scale9Height); imageView->setSize(Size(swf, shf)); } - float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); - float cy = DICTOOL->getFloatValue_json(options, "capInsetsY"); - float cw = DICTOOL->getFloatValue_json(options, "capInsetsWidth"); - float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); + float cx = DICTOOL->getFloatValue_json(options, P_CapInsetsX); + float cy = DICTOOL->getFloatValue_json(options, P_CapInsetsY); + float cw = DICTOOL->getFloatValue_json(options, P_CapInsetsWidth); + float ch = DICTOOL->getFloatValue_json(options, P_CapInsetsHeight); imageView->setCapInsets(Rect(cx, cy, cw, ch)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index 88b90b67a1..e39570d322 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -9,6 +9,28 @@ using namespace ui; namespace cocostudio { + static const char* P_CapInsetsX = "capInsetsX"; + static const char* P_CapInsetsY = "capInsetsY"; + static const char* P_CapInsetsWidth = "capInsetsWidth"; + static const char* P_CapInsetsHeight = "capInsetsHeight"; + static const char* P_ClipAble = "clipAble"; + static const char* P_BackGroundScale9Enable = "backGroundScale9Enable"; + static const char* P_BgColorR = "bgColorR"; + static const char* P_BgColorG = "bgColorG"; + static const char* P_BgColorB = "bgColorB"; + static const char* P_BgStartColorR = "bgStartColorR"; + static const char* P_BgStartColorG = "bgStartColorG"; + static const char* P_BgStartColorB = "bgStartColorB"; + static const char* P_BgEndColorR = "bgEndColorR"; + static const char* P_BgEndColorG = "bgEndColorG"; + static const char* P_BgEndColorB = "bgEndColorB"; + static const char* P_VectorX = "vectorX"; + static const char* P_VectorY = "vectorY"; + static const char* P_BgColorOpacity = "bgColorOpacity"; + static const char* P_ColorType = "colorType"; + static const char* P_BackGroundImageData = "backGroundImageData"; + static const char* P_LayoutType = "layoutType"; + static LayoutReader* instanceLayoutReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(LayoutReader) @@ -38,7 +60,6 @@ namespace cocostudio Layout* panel = static_cast(widget); - float w = 0, h= 0; stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); this->beginSetBasicProperties(widget); @@ -60,52 +81,44 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); + else if(key == P_AdaptScreen){ + _isAdaptScreen = valueToBool(value); } - else if(key == "width"){ - w = valueToFloat(value); - } - else if(key == "height"){ - h = valueToFloat(value); - } - else if( key == "clipAble"){ + else if( key == P_ClipAble){ panel->setClippingEnabled(valueToBool(value)); - }else if(key == "backGroundScale9Enable"){ + }else if(key == P_BackGroundScale9Enable){ panel->setBackGroundImageScale9Enabled(valueToBool(value)); - }else if(key == "bgColorR"){ + }else if(key == P_BgColorR){ cr = valueToInt(value); - }else if(key == "bgColorG"){ + }else if(key == P_BgColorG){ cg = valueToInt(value); - }else if(key == "bgColorB") + }else if(key == P_BgColorB) { cb = valueToInt(value); - }else if(key == "bgStartColorR"){ + }else if(key == P_BgStartColorR){ scr = valueToInt(value); - }else if(key == "bgStartColorG"){ + }else if(key == P_BgStartColorG){ scg = valueToInt(value); - }else if(key == "bgStartColorB") + }else if(key == P_BgStartColorB) { scb = valueToInt(value); } - else if(key == "bgEndColorR"){ + else if(key == P_BgEndColorR){ ecr = valueToInt(value); - }else if(key == "bgEndColorG"){ + }else if(key == P_BgEndColorG){ ecg = valueToInt(value); - }else if(key == "bgEndColorB") + }else if(key == P_BgEndColorB) { ecb = valueToInt(value); - }else if (key == "vectorX"){ + }else if (key == P_VectorX){ bgcv1 = valueToFloat(value); - }else if(key == "vectorY"){ + }else if(key == P_VectorY){ bgcv2 = valueToFloat(value); - }else if(key == "bgColorOpacity"){ + }else if(key == P_BgColorOpacity){ bgColorOpacity = valueToInt(value); - }else if( key == "colorType"){ + }else if( key == P_ColorType){ panel->setBackGroundColorType(Layout::BackGroundColorType(valueToInt(value))); - }else if (key == "backGroundImageData"){ + }else if (key == P_BackGroundImageData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); if (backGroundChildren) { @@ -114,20 +127,19 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); -// CCLOG("Layout : image =%s", backgroundValue.c_str()); panel->setBackGroundImage(backgroundValue, imageFileNameType); } - }else if(key == "capInsetsX"){ + }else if(key == P_CapInsetsX){ capsx = valueToFloat(value); - }else if(key == "capInsetsY"){ + }else if(key == P_CapInsetsY){ capsy = valueToFloat(value); - }else if(key == "capInsetsWidth"){ + }else if(key == P_CapInsetsWidth){ capsWidth = valueToFloat(value); - }else if(key == "capInsetsHeight"){ + }else if(key == P_CapInsetsHeight){ capsHeight = valueToFloat(value); - }else if (key == "layoutType"){ + }else if (key == P_LayoutType){ layoutType = (Layout::Type)valueToInt(value); } @@ -163,7 +175,7 @@ namespace cocostudio /* adapt screen gui */ float w = 0, h = 0; - bool adaptScrenn = DICTOOL->getBooleanValue_json(options, "adaptScreen"); + bool adaptScrenn = DICTOOL->getBooleanValue_json(options, P_AdaptScreen); if (adaptScrenn) { Size screenSize = CCDirector::getInstance()->getWinSize(); @@ -172,61 +184,61 @@ namespace cocostudio } else { - w = DICTOOL->getFloatValue_json(options, "width"); - h = DICTOOL->getFloatValue_json(options, "height"); + w = DICTOOL->getFloatValue_json(options, P_Width); + h = DICTOOL->getFloatValue_json(options, P_Height); } panel->setSize(Size(w, h)); /**/ - panel->setClippingEnabled(DICTOOL->getBooleanValue_json(options, "clipAble")); + panel->setClippingEnabled(DICTOOL->getBooleanValue_json(options, P_ClipAble)); - bool backGroundScale9Enable = DICTOOL->getBooleanValue_json(options, "backGroundScale9Enable"); + bool backGroundScale9Enable = DICTOOL->getBooleanValue_json(options, P_BackGroundScale9Enable); panel->setBackGroundImageScale9Enabled(backGroundScale9Enable); - int cr = DICTOOL->getIntValue_json(options, "bgColorR"); - int cg = DICTOOL->getIntValue_json(options, "bgColorG"); - int cb = DICTOOL->getIntValue_json(options, "bgColorB"); + int cr = DICTOOL->getIntValue_json(options, P_BgColorR); + int cg = DICTOOL->getIntValue_json(options, P_BgColorG); + int cb = DICTOOL->getIntValue_json(options, P_BgColorB); - int scr = DICTOOL->getIntValue_json(options, "bgStartColorR"); - int scg = DICTOOL->getIntValue_json(options, "bgStartColorG"); - int scb = DICTOOL->getIntValue_json(options, "bgStartColorB"); + int scr = DICTOOL->getIntValue_json(options, P_BgStartColorR); + int scg = DICTOOL->getIntValue_json(options, P_BgStartColorG); + int scb = DICTOOL->getIntValue_json(options, P_BgStartColorB); - int ecr = DICTOOL->getIntValue_json(options, "bgEndColorR"); - int ecg = DICTOOL->getIntValue_json(options, "bgEndColorG"); - int ecb = DICTOOL->getIntValue_json(options, "bgEndColorB"); + int ecr = DICTOOL->getIntValue_json(options, P_BgEndColorR); + int ecg = DICTOOL->getIntValue_json(options, P_BgEndColorG); + int ecb = DICTOOL->getIntValue_json(options, P_BgEndColorB); - float bgcv1 = DICTOOL->getFloatValue_json(options, "vectorX"); - float bgcv2 = DICTOOL->getFloatValue_json(options, "vectorY"); + float bgcv1 = DICTOOL->getFloatValue_json(options, P_VectorX); + float bgcv2 = DICTOOL->getFloatValue_json(options, P_VectorY); panel->setBackGroundColorVector(Vec2(bgcv1, bgcv2)); - int co = DICTOOL->getIntValue_json(options, "bgColorOpacity"); + int co = DICTOOL->getIntValue_json(options, P_BgColorOpacity); - int colorType = DICTOOL->getIntValue_json(options, "colorType"); + int colorType = DICTOOL->getIntValue_json(options, P_ColorType); panel->setBackGroundColorType(Layout::BackGroundColorType(colorType)); panel->setBackGroundColor(Color3B(scr, scg, scb),Color3B(ecr, ecg, ecb)); panel->setBackGroundColor(Color3B(cr, cg, cb)); panel->setBackGroundColorOpacity(co); - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "backGroundImageData"); - int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - std::string imageFileName = this->getResourcePath(imageFileNameDic, "path", (Widget::TextureResType)imageFileNameType); + const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, P_BackGroundImageData); + int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, P_ResourceType); + std::string imageFileName = this->getResourcePath(imageFileNameDic, P_Path, (Widget::TextureResType)imageFileNameType); panel->setBackGroundImage(imageFileName, (Widget::TextureResType)imageFileNameType); if (backGroundScale9Enable) { - float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); - float cy = DICTOOL->getFloatValue_json(options, "capInsetsY"); - float cw = DICTOOL->getFloatValue_json(options, "capInsetsWidth"); - float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); + float cx = DICTOOL->getFloatValue_json(options, P_CapInsetsX); + float cy = DICTOOL->getFloatValue_json(options, P_CapInsetsY); + float cw = DICTOOL->getFloatValue_json(options, P_CapInsetsWidth); + float ch = DICTOOL->getFloatValue_json(options, P_CapInsetsHeight); panel->setBackGroundImageCapInsets(Rect(cx, cy, cw, ch)); } - panel->setLayoutType((Layout::Type)DICTOOL->getIntValue_json(options, "layoutType")); + panel->setLayoutType((Layout::Type)DICTOOL->getIntValue_json(options, P_LayoutType)); - int bgimgcr = DICTOOL->getIntValue_json(options, "colorR"); - int bgimgcg = DICTOOL->getIntValue_json(options, "colorG"); - int bgimgcb = DICTOOL->getIntValue_json(options, "colorB"); + int bgimgcr = DICTOOL->getIntValue_json(options, P_ColorR); + int bgimgcg = DICTOOL->getIntValue_json(options, P_ColorG); + int bgimgcb = DICTOOL->getIntValue_json(options, P_ColorB); panel->setBackGroundImageColor(Color3B(bgimgcr, bgimgcg, bgimgcb)); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp index c4294adef5..1cc5301062 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp @@ -9,6 +9,9 @@ using namespace ui; namespace cocostudio { + static const char* P_Direction = "direction"; + static const char* P_ItemMargin = "itemMargin"; + static ListViewReader* instanceListViewReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(ListViewReader) @@ -44,12 +47,12 @@ namespace cocostudio std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "direction") { + if (key == P_Direction) { listView->setDirection((ScrollView::Direction)valueToInt(value)); } - else if(key == "gravity"){ + else if(key == P_Gravity){ listView->setGravity((ListView::Gravity)valueToInt(value)); - }else if(key == "itemMargin"){ + }else if(key == P_ItemMargin){ listView->setItemsMargin(valueToFloat(value)); } @@ -63,13 +66,13 @@ namespace cocostudio ListView* listView = static_cast(widget); - int direction = DICTOOL->getFloatValue_json(options, "direction"); + int direction = DICTOOL->getFloatValue_json(options, P_Direction); listView->setDirection((ScrollView::Direction)direction); - ListView::Gravity gravity = (ListView::Gravity)DICTOOL->getIntValue_json(options, "gravity"); + ListView::Gravity gravity = (ListView::Gravity)DICTOOL->getIntValue_json(options, P_Gravity); listView->setGravity(gravity); - float itemMargin = DICTOOL->getFloatValue_json(options, "itemMargin"); + float itemMargin = DICTOOL->getFloatValue_json(options, P_ItemMargin); listView->setItemsMargin(itemMargin); } } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp index 85ba0eb276..9aaef346c8 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp @@ -10,6 +10,15 @@ using namespace cocostudio; namespace cocostudio { + static const char* P_Scale9Enable = "scale9Enable"; + static const char* P_CapInsetsX = "capInsetsX"; + static const char* P_CapInsetsY = "capInsetsY"; + static const char* P_CapInsetsWidth = "capInsetsWidth"; + static const char* P_CapInsetsHeight = "capInsetsHeight"; + static const char* P_TextureData = "textureData"; + static const char* P_Direction = "direction"; + static const char* P_Percent = "percent"; + static LoadingBarReader* instanceLoadingBar = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(LoadingBarReader) @@ -53,15 +62,10 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } - else if (key == "scale9Enable") { + else if (key == P_Scale9Enable) { loadingBar->setScale9Enabled(valueToBool(value)); } - else if (key == "textureData"){ + else if (key == P_TextureData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -73,17 +77,17 @@ namespace cocostudio loadingBar->loadTexture(backgroundValue, imageFileNameType); } - else if(key == "capInsetsX"){ + else if(key == P_CapInsetsX){ capsx = valueToFloat(value); - }else if(key == "capInsetsY"){ + }else if(key == P_CapInsetsY){ capsy = valueToFloat(value); - }else if(key == "capInsetsWidth"){ + }else if(key == P_CapInsetsWidth){ capsWidth = valueToFloat(value); - }else if(key == "capInsetsHeight"){ + }else if(key == P_CapInsetsHeight){ capsHeight = valueToFloat(value); - }else if(key == "direction"){ + }else if(key == P_Direction){ loadingBar->setDirection((LoadingBar::Direction)valueToInt(value)); - }else if(key == "percent"){ + }else if(key == P_Percent){ percent = valueToInt(value); } @@ -103,33 +107,33 @@ namespace cocostudio LoadingBar* loadingBar = static_cast(widget); - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "textureData"); - int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - std::string imageFileName = this->getResourcePath(imageFileNameDic, "path", (Widget::TextureResType)imageFileNameType); + const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, P_TextureData); + int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, P_ResourceType); + std::string imageFileName = this->getResourcePath(imageFileNameDic, P_Path, (Widget::TextureResType)imageFileNameType); loadingBar->loadTexture(imageFileName, (Widget::TextureResType)imageFileNameType); /* gui mark add load bar scale9 parse */ - bool scale9Enable = DICTOOL->getBooleanValue_json(options, "scale9Enable"); + bool scale9Enable = DICTOOL->getBooleanValue_json(options, P_Scale9Enable); loadingBar->setScale9Enabled(scale9Enable); if (scale9Enable) { - float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); - float cy = DICTOOL->getFloatValue_json(options, "capInsetsY"); - float cw = DICTOOL->getFloatValue_json(options, "capInsetsWidth"); - float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); + float cx = DICTOOL->getFloatValue_json(options, P_CapInsetsX); + float cy = DICTOOL->getFloatValue_json(options, P_CapInsetsY); + float cw = DICTOOL->getFloatValue_json(options, P_CapInsetsWidth); + float ch = DICTOOL->getFloatValue_json(options, P_CapInsetsHeight); loadingBar->setCapInsets(Rect(cx, cy, cw, ch)); - float width = DICTOOL->getFloatValue_json(options, "width"); - float height = DICTOOL->getFloatValue_json(options, "height"); + float width = DICTOOL->getFloatValue_json(options, P_Width); + float height = DICTOOL->getFloatValue_json(options, P_Height); loadingBar->setSize(Size(width, height)); } /**/ - loadingBar->setDirection(LoadingBar::Direction(DICTOOL->getIntValue_json(options, "direction"))); - loadingBar->setPercent(DICTOOL->getIntValue_json(options, "percent")); + loadingBar->setDirection(LoadingBar::Direction(DICTOOL->getIntValue_json(options, P_Direction))); + loadingBar->setPercent(DICTOOL->getIntValue_json(options, P_Percent)); WidgetReader::setColorPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp index c80d9e9178..a7318281c4 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp @@ -9,6 +9,11 @@ using namespace ui; namespace cocostudio { + static const char* P_InnerWidth = "innerWidth"; + static const char* P_InnerHeight = "innerHeight"; + static const char* P_Direction = "direction"; + static const char* P_BounceEnable = "bounceEnable"; + static ScrollViewReader* instanceScrollViewReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(ScrollViewReader) @@ -45,14 +50,14 @@ namespace cocostudio for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(pCocoLoader); std::string value = stChildArray[i].GetValue(); - if (key == "innerWidth") { + if (key == P_InnerWidth) { innerWidth = valueToFloat(value); } - else if(key == "innerHeight"){ + else if(key == P_InnerHeight){ innerHeight = valueToFloat(value); - }else if(key == "direction"){ + }else if(key == P_Direction){ scrollView->setDirection((ScrollView::Direction)valueToInt(value)); - }else if(key == "bounceEnable"){ + }else if(key == P_BounceEnable){ scrollView->setBounceEnabled(valueToBool(value)); } @@ -67,12 +72,12 @@ namespace cocostudio ScrollView* scrollView = static_cast(widget); - float innerWidth = DICTOOL->getFloatValue_json(options, "innerWidth"); - float innerHeight = DICTOOL->getFloatValue_json(options, "innerHeight"); + float innerWidth = DICTOOL->getFloatValue_json(options, P_InnerWidth); + float innerHeight = DICTOOL->getFloatValue_json(options, P_InnerHeight); scrollView->setInnerContainerSize(Size(innerWidth, innerHeight)); - int direction = DICTOOL->getFloatValue_json(options, "direction"); + int direction = DICTOOL->getFloatValue_json(options, P_Direction); scrollView->setDirection((ScrollView::Direction)direction); - scrollView->setBounceEnabled(DICTOOL->getBooleanValue_json(options, "bounceEnable")); + scrollView->setBounceEnabled(DICTOOL->getBooleanValue_json(options, P_BounceEnable)); LayoutReader::setColorPropsFromJsonDictionary(widget, options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index 0da3549b4b..8a185ac288 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -9,6 +9,17 @@ using namespace ui; namespace cocostudio { + static const char* P_Scale9Enable = "scale9Enable"; + static const char* P_Percent = "percent"; + static const char* P_BarFileNameData = "barFileNameData"; + static const char* P_Length = "length"; + static const char* P_BallNormalData = "ballNormalData"; + static const char* P_BallPressedData = "ballPressedData"; + static const char* P_BallDisabledData = "ballDisabledData"; + static const char* P_ProgressBarData = "progressBarData"; + + static const char* P_BarFileName = "barFileName"; + static SliderReader* instanceSliderReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(SliderReader) @@ -51,18 +62,13 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } //control custom properties - else if (key == "scale9Enable") { + else if (key == P_Scale9Enable) { slider->setScale9Enabled(valueToBool(value)); } - else if(key == "percent"){ + else if(key == P_Percent){ percent = valueToInt(value); - }else if(key == "barFileNameData"){ + }else if(key == P_BarFileNameData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -72,9 +78,9 @@ namespace cocostudio slider->loadBarTexture(backgroundValue, imageFileNameType); - }else if(key == "length"){ + }else if(key == P_Length){ barLength = valueToFloat(value); - }else if(key == "ballNormalData"){ + }else if(key == P_BallNormalData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -84,7 +90,7 @@ namespace cocostudio slider->loadSlidBallTextureNormal(backgroundValue, imageFileNameType); - }else if(key == "ballPressedData"){ + }else if(key == P_BallPressedData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -94,7 +100,7 @@ namespace cocostudio slider->loadSlidBallTexturePressed(backgroundValue, imageFileNameType); - }else if(key == "ballDisabledData"){ + }else if(key == P_BallDisabledData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -104,7 +110,7 @@ namespace cocostudio slider->loadSlidBallTextureDisabled(backgroundValue, imageFileNameType); - }else if(key == "progressBarData"){ + }else if(key == P_ProgressBarData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -133,19 +139,19 @@ namespace cocostudio Slider* slider = static_cast(widget); - bool barTextureScale9Enable = DICTOOL->getBooleanValue_json(options, "scale9Enable"); + bool barTextureScale9Enable = DICTOOL->getBooleanValue_json(options, P_Scale9Enable); slider->setScale9Enabled(barTextureScale9Enable); - slider->setPercent(DICTOOL->getIntValue_json(options, "percent")); + slider->setPercent(DICTOOL->getIntValue_json(options, P_Percent)); - bool bt = DICTOOL->checkObjectExist_json(options, "barFileName"); - float barLength = DICTOOL->getFloatValue_json(options, "length"); + bool bt = DICTOOL->checkObjectExist_json(options, P_BarFileName); + float barLength = DICTOOL->getFloatValue_json(options, P_Length); if (bt) { - const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "barFileNameData"); - int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType"); - std::string imageFileName = this->getResourcePath(imageFileNameDic, "path", (Widget::TextureResType)imageFileNameType); + const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, P_BarFileNameData); + int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, P_ResourceType); + std::string imageFileName = this->getResourcePath(imageFileNameDic, P_Path, (Widget::TextureResType)imageFileNameType); slider->loadBarTexture(imageFileName, (Widget::TextureResType)imageFileNameType); if (barTextureScale9Enable) @@ -155,28 +161,28 @@ namespace cocostudio } //loading normal slider ball texture - const rapidjson::Value& normalDic = DICTOOL->getSubDictionary_json(options, "ballNormalData"); - int normalType = DICTOOL->getIntValue_json(normalDic, "resourceType"); - std::string imageFileName = this->getResourcePath(normalDic, "path", (Widget::TextureResType)normalType); + const rapidjson::Value& normalDic = DICTOOL->getSubDictionary_json(options, P_BallNormalData); + int normalType = DICTOOL->getIntValue_json(normalDic, P_ResourceType); + std::string imageFileName = this->getResourcePath(normalDic, P_Path, (Widget::TextureResType)normalType); slider->loadSlidBallTextureNormal(imageFileName, (Widget::TextureResType)normalType); //loading slider ball press texture - const rapidjson::Value& pressedDic = DICTOOL->getSubDictionary_json(options, "ballPressedData"); - int pressedType = DICTOOL->getIntValue_json(pressedDic, "resourceType"); - std::string pressedFileName = this->getResourcePath(pressedDic, "path", (Widget::TextureResType)pressedType); + const rapidjson::Value& pressedDic = DICTOOL->getSubDictionary_json(options, P_BallPressedData); + int pressedType = DICTOOL->getIntValue_json(pressedDic, P_ResourceType); + std::string pressedFileName = this->getResourcePath(pressedDic, P_Path, (Widget::TextureResType)pressedType); slider->loadSlidBallTexturePressed(pressedFileName, (Widget::TextureResType)pressedType); //loading silder ball disable texture - const rapidjson::Value& disabledDic = DICTOOL->getSubDictionary_json(options, "ballDisabledData"); - int disabledType = DICTOOL->getIntValue_json(disabledDic, "resourceType"); - std::string disabledFileName = this->getResourcePath(disabledDic, "path", (Widget::TextureResType)disabledType); + const rapidjson::Value& disabledDic = DICTOOL->getSubDictionary_json(options, P_BallDisabledData); + int disabledType = DICTOOL->getIntValue_json(disabledDic, P_ResourceType); + std::string disabledFileName = this->getResourcePath(disabledDic, P_Path, (Widget::TextureResType)disabledType); slider->loadSlidBallTextureDisabled(disabledFileName, (Widget::TextureResType)disabledType); //load slider progress texture - const rapidjson::Value& progressBarDic = DICTOOL->getSubDictionary_json(options, "progressBarData"); - int progressBarType = DICTOOL->getIntValue_json(progressBarDic, "resourceType"); - std::string progressBarFileName = this->getResourcePath(progressBarDic, "path", (Widget::TextureResType)progressBarType); + const rapidjson::Value& progressBarDic = DICTOOL->getSubDictionary_json(options, P_ProgressBarData); + int progressBarType = DICTOOL->getIntValue_json(progressBarDic, P_ResourceType); + std::string progressBarFileName = this->getResourcePath(progressBarDic, P_Path, (Widget::TextureResType)progressBarType); slider->loadProgressBarTexture(progressBarFileName, (Widget::TextureResType)progressBarType); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp index 7579e621b8..0934240e10 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp @@ -9,6 +9,15 @@ using namespace ui; namespace cocostudio { + static const char* P_StringValue = "stringValue"; + static const char* P_CharMapFileData = "charMapFileData"; + static const char* P_ItemWidth = "itemWidth"; + static const char* P_ItemHeight = "itemHeight"; + static const char* P_StartCharMap = "startCharMap"; + + + static const char* P_CharMapFile = "charMapFile"; + static TextAtlasReader* instanceTextAtalsReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(TextAtlasReader) @@ -55,15 +64,10 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } - else if (key == "stringValue") { + else if (key == P_StringValue) { stringValue = value; } - else if(key == "charMapFileData"){ + else if(key == P_CharMapFileData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -74,11 +78,11 @@ namespace cocostudio charMapFileName = backgroundValue; type = imageFileNameType; - }else if(key == "itemWidth"){ + }else if(key == P_ItemWidth){ itemWidth = valueToFloat(value); - }else if(key == "itemHeight"){ + }else if(key == P_ItemHeight){ itemHeight = valueToFloat(value); - }else if(key == "startCharMap"){ + }else if(key == P_StartCharMap){ startCharMap = value; } } //end of for loop @@ -97,23 +101,23 @@ namespace cocostudio std::string jsonPath = GUIReader::getInstance()->getFilePath(); TextAtlas* labelAtlas = static_cast(widget); - bool sv = DICTOOL->checkObjectExist_json(options, "stringValue"); - bool cmf = DICTOOL->checkObjectExist_json(options, "charMapFile"); - bool iw = DICTOOL->checkObjectExist_json(options, "itemWidth"); - bool ih = DICTOOL->checkObjectExist_json(options, "itemHeight"); - bool scm = DICTOOL->checkObjectExist_json(options, "startCharMap"); + bool sv = DICTOOL->checkObjectExist_json(options, P_StringValue); + bool cmf = DICTOOL->checkObjectExist_json(options, P_CharMapFile); + bool iw = DICTOOL->checkObjectExist_json(options, P_ItemWidth); + bool ih = DICTOOL->checkObjectExist_json(options, P_ItemHeight); + bool scm = DICTOOL->checkObjectExist_json(options, P_StartCharMap); if (sv && cmf && iw && ih && scm) { - const rapidjson::Value& cmftDic = DICTOOL->getSubDictionary_json(options, "charMapFileData"); - int cmfType = DICTOOL->getIntValue_json(cmftDic, "resourceType"); + const rapidjson::Value& cmftDic = DICTOOL->getSubDictionary_json(options, P_CharMapFileData); + int cmfType = DICTOOL->getIntValue_json(cmftDic, P_ResourceType); switch (cmfType) { case 0: { std::string tp_c = jsonPath; - const char* cmfPath = DICTOOL->getStringValue_json(cmftDic, "path"); + const char* cmfPath = DICTOOL->getStringValue_json(cmftDic, P_Path); const char* cmf_tp = tp_c.append(cmfPath).c_str(); - labelAtlas->setProperty(DICTOOL->getStringValue_json(options, "stringValue"),cmf_tp,DICTOOL->getIntValue_json(options, "itemWidth"),DICTOOL->getIntValue_json(options,"itemHeight"), DICTOOL->getStringValue_json(options, "startCharMap")); + labelAtlas->setProperty(DICTOOL->getStringValue_json(options, P_StringValue),cmf_tp,DICTOOL->getIntValue_json(options, P_ItemWidth),DICTOOL->getIntValue_json(options,P_ItemHeight), DICTOOL->getStringValue_json(options, P_StartCharMap)); break; } case 1: diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp index 44b967ca1f..cfcb5503d3 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp @@ -9,6 +9,9 @@ using namespace ui; namespace cocostudio { + static const char* P_FileNameData = "fileNameData"; + static const char* P_Text = "text"; + static TextBMFontReader* instanceTextBMFontReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(TextBMFontReader) @@ -49,12 +52,7 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } - else if(key == "fileNameData"){ + else if(key == P_FileNameData){ stExpCocoNode *backGroundChildren = stChildArray[i].GetChildArray(); std::string resType = backGroundChildren[2].GetValue();; @@ -65,7 +63,7 @@ namespace cocostudio labelBMFont->setFntFile(backgroundValue); } - }else if(key == "text"){ + }else if(key == P_Text){ labelBMFont->setString(value); } } //end of for loop @@ -81,14 +79,14 @@ namespace cocostudio TextBMFont* labelBMFont = static_cast(widget); - const rapidjson::Value& cmftDic = DICTOOL->getSubDictionary_json(options, "fileNameData"); - int cmfType = DICTOOL->getIntValue_json(cmftDic, "resourceType"); + const rapidjson::Value& cmftDic = DICTOOL->getSubDictionary_json(options, P_FileNameData); + int cmfType = DICTOOL->getIntValue_json(cmftDic, P_ResourceType); switch (cmfType) { case 0: { std::string tp_c = jsonPath; - const char* cmfPath = DICTOOL->getStringValue_json(cmftDic, "path"); + const char* cmfPath = DICTOOL->getStringValue_json(cmftDic, P_Path); const char* cmf_tp = tp_c.append(cmfPath).c_str(); labelBMFont->setFntFile(cmf_tp); break; @@ -100,7 +98,7 @@ namespace cocostudio break; } - const char* text = DICTOOL->getStringValue_json(options, "text"); + const char* text = DICTOOL->getStringValue_json(options, P_Text); labelBMFont->setString(text); diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp index 89a939555d..a7073ae485 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp @@ -11,6 +11,17 @@ namespace cocostudio { static TextFieldReader* instanceTextFieldReader = NULL; + static const char* P_PlaceHolder = "placeHolder"; + static const char* P_Text = "text"; + static const char* P_FontSize = "fontSize"; + static const char* P_FontName = "fontName"; + static const char* P_TouchSizeWidth = "touchSizeWidth"; + static const char* P_TouchSizeHeight = "touchSizeHeight"; + static const char* P_MaxLengthEnable = "maxLengthEnable"; + static const char* P_MaxLength = "maxLength"; + static const char* P_PasswordEnable = "passwordEnable"; + static const char* P_PasswordStyleText = "passwordStyleText"; + IMPLEMENT_CLASS_WIDGET_READER_INFO(TextFieldReader) TextFieldReader::TextFieldReader() @@ -49,30 +60,25 @@ namespace cocostudio //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } - else if(key == "placeHolder"){ + else if(key == P_PlaceHolder){ textField->setPlaceHolder(value); - }else if(key == "text"){ + }else if(key == P_Text){ textField->setText(value); - }else if(key == "fontSize"){ + }else if(key == P_FontSize){ textField->setFontSize(valueToInt(value)); - }else if(key == "fontName"){ + }else if(key == P_FontName){ textField->setFontName(value); - }else if(key == "touchSizeWidth"){ + }else if(key == P_TouchSizeWidth){ textField->setTouchSize(Size(valueToFloat(value), textField->getTouchSize().height)); - }else if(key == "touchSizeHeight"){ + }else if(key == P_TouchSizeHeight){ textField->setTouchSize(Size(textField->getTouchSize().width, valueToFloat(value))); - }else if (key == "maxLengthEnable"){ + }else if (key == P_MaxLengthEnable){ textField->setMaxLengthEnabled(valueToBool(value)); - }else if(key == "maxLength"){ + }else if(key == P_MaxLength){ textField->setMaxLength(valueToInt(value)); - }else if(key == "passwordEnable"){ + }else if(key == P_PasswordEnable){ textField->setPasswordEnabled(valueToBool(value)); - }else if(key == "passwordStyleText"){ + }else if(key == P_PasswordStyleText){ textField->setPasswordStyleText(value.c_str()); } } //end of for loop @@ -85,48 +91,48 @@ namespace cocostudio TextField* textField = static_cast(widget); - bool ph = DICTOOL->checkObjectExist_json(options, "placeHolder"); + bool ph = DICTOOL->checkObjectExist_json(options, P_PlaceHolder); if (ph) { - textField->setPlaceHolder(DICTOOL->getStringValue_json(options, "placeHolder")); + textField->setPlaceHolder(DICTOOL->getStringValue_json(options, P_PlaceHolder)); } - textField->setText(DICTOOL->getStringValue_json(options, "text")); - bool fs = DICTOOL->checkObjectExist_json(options, "fontSize"); + textField->setText(DICTOOL->getStringValue_json(options, P_Text)); + bool fs = DICTOOL->checkObjectExist_json(options, P_FontSize); if (fs) { - textField->setFontSize(DICTOOL->getIntValue_json(options, "fontSize")); + textField->setFontSize(DICTOOL->getIntValue_json(options, P_FontSize)); } - bool fn = DICTOOL->checkObjectExist_json(options, "fontName"); + bool fn = DICTOOL->checkObjectExist_json(options, P_FontName); if (fn) { - textField->setFontName(DICTOOL->getStringValue_json(options, "fontName")); + textField->setFontName(DICTOOL->getStringValue_json(options, P_FontName)); } - bool tsw = DICTOOL->checkObjectExist_json(options, "touchSizeWidth"); - bool tsh = DICTOOL->checkObjectExist_json(options, "touchSizeHeight"); + bool tsw = DICTOOL->checkObjectExist_json(options, P_TouchSizeWidth); + bool tsh = DICTOOL->checkObjectExist_json(options, P_TouchSizeHeight); if (tsw && tsh) { - textField->setTouchSize(Size(DICTOOL->getFloatValue_json(options, "touchSizeWidth"), DICTOOL->getFloatValue_json(options,"touchSizeHeight"))); + textField->setTouchSize(Size(DICTOOL->getFloatValue_json(options, P_TouchSizeWidth), DICTOOL->getFloatValue_json(options,P_TouchSizeHeight))); } - float dw = DICTOOL->getFloatValue_json(options, "width"); - float dh = DICTOOL->getFloatValue_json(options, "height"); - if (dw > 0.0f || dh > 0.0f) - { - //textField->setSize(Size(dw, dh)); - } - bool maxLengthEnable = DICTOOL->getBooleanValue_json(options, "maxLengthEnable"); +// float dw = DICTOOL->getFloatValue_json(options, "width"); +// float dh = DICTOOL->getFloatValue_json(options, "height"); +// if (dw > 0.0f || dh > 0.0f) +// { +// //textField->setSize(Size(dw, dh)); +// } + bool maxLengthEnable = DICTOOL->getBooleanValue_json(options, P_MaxLengthEnable); textField->setMaxLengthEnabled(maxLengthEnable); if (maxLengthEnable) { - int maxLength = DICTOOL->getIntValue_json(options, "maxLength"); + int maxLength = DICTOOL->getIntValue_json(options, P_MaxLength); textField->setMaxLength(maxLength); } - bool passwordEnable = DICTOOL->getBooleanValue_json(options, "passwordEnable"); + bool passwordEnable = DICTOOL->getBooleanValue_json(options, P_PasswordEnable); textField->setPasswordEnabled(passwordEnable); if (passwordEnable) { - textField->setPasswordStyleText(DICTOOL->getStringValue_json(options, "passwordStyleText")); + textField->setPasswordStyleText(DICTOOL->getStringValue_json(options, P_PasswordStyleText)); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp index 449306ecb5..d66bc19352 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp @@ -9,6 +9,15 @@ using namespace ui; namespace cocostudio { + 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"; + static TextReader* instanceTextReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(TextReader) @@ -48,29 +57,24 @@ namespace cocostudio CC_BASIC_PROPERTY_BINARY_READER //read all color related properties of widget CC_COLOR_PROPERTY_BINARY_READER - - else if(key == "anchorPointX"){ - _originalAnchorPoint.x = valueToFloat(value); - }else if(key == "anchorPointY"){ - _originalAnchorPoint.y = valueToFloat(value); - } - else if (key == "touchScaleEnable") { + + else if (key == P_TouchScaleEnable) { label->setTouchScaleChangeEnabled(valueToBool(value)); } - else if(key == "text"){ + else if(key == P_Text){ label->setString(value); - }else if(key == "fontSize"){ + }else if(key == P_FontSize){ label->setFontSize(valueToInt(value)); - }else if(key == "fontName"){ + }else if(key == P_FontName){ label->setFontName(value); - }else if(key == "areaWidth"){ + }else if(key == P_AreaWidth){ label->setTextAreaSize(Size(valueToFloat(value), label->getTextAreaSize().height)); - }else if(key == "areaHeight"){ + }else if(key == P_AreaHeight){ label->setTextAreaSize(Size(label->getTextAreaSize().width, valueToFloat(value))); - }else if(key == "hAlignment"){ + }else if(key == P_HAlignment){ label->setTextHorizontalAlignment((TextHAlignment)valueToInt(value)); - }else if(key == "vAlignment"){ + }else if(key == P_VAlignment){ label->setTextVerticalAlignment((TextVAlignment)valueToInt(value)); } @@ -86,38 +90,38 @@ namespace cocostudio std::string jsonPath = GUIReader::getInstance()->getFilePath(); Text* label = static_cast(widget); - bool touchScaleChangeAble = DICTOOL->getBooleanValue_json(options, "touchScaleEnable"); + bool touchScaleChangeAble = DICTOOL->getBooleanValue_json(options, P_TouchScaleEnable); label->setTouchScaleChangeEnabled(touchScaleChangeAble); - const char* text = DICTOOL->getStringValue_json(options, "text"); + const char* text = DICTOOL->getStringValue_json(options, P_Text); label->setString(text); - bool fs = DICTOOL->checkObjectExist_json(options, "fontSize"); + bool fs = DICTOOL->checkObjectExist_json(options, P_FontSize); if (fs) { - label->setFontSize(DICTOOL->getIntValue_json(options, "fontSize")); + label->setFontSize(DICTOOL->getIntValue_json(options, P_FontSize)); } - bool fn = DICTOOL->checkObjectExist_json(options, "fontName"); + bool fn = DICTOOL->checkObjectExist_json(options, P_FontName); if (fn) { - std::string fontName = DICTOOL->getStringValue_json(options, "fontName"); + std::string fontName = DICTOOL->getStringValue_json(options, P_FontName); std::string fontFilePath = jsonPath.append(fontName); label->setFontName(fontFilePath); } - bool aw = DICTOOL->checkObjectExist_json(options, "areaWidth"); - bool ah = DICTOOL->checkObjectExist_json(options, "areaHeight"); + bool aw = DICTOOL->checkObjectExist_json(options, P_AreaWidth); + bool ah = DICTOOL->checkObjectExist_json(options, P_AreaHeight); if (aw && ah) { - Size size = Size(DICTOOL->getFloatValue_json(options, "areaWidth"),DICTOOL->getFloatValue_json(options,"areaHeight")); + Size size = Size(DICTOOL->getFloatValue_json(options, P_AreaWidth),DICTOOL->getFloatValue_json(options,P_AreaHeight)); label->setTextAreaSize(size); } - bool ha = DICTOOL->checkObjectExist_json(options, "hAlignment"); + bool ha = DICTOOL->checkObjectExist_json(options, P_HAlignment); if (ha) { - label->setTextHorizontalAlignment((TextHAlignment)DICTOOL->getIntValue_json(options, "hAlignment")); + label->setTextHorizontalAlignment((TextHAlignment)DICTOOL->getIntValue_json(options, P_HAlignment)); } - bool va = DICTOOL->checkObjectExist_json(options, "vAlignment"); + bool va = DICTOOL->checkObjectExist_json(options, P_VAlignment); if (va) { - label->setTextVerticalAlignment((TextVAlignment)DICTOOL->getIntValue_json(options, "vAlignment")); + label->setTextVerticalAlignment((TextVAlignment)DICTOOL->getIntValue_json(options, P_VAlignment)); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index 1241e04065..a735e854f7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -51,10 +51,14 @@ namespace cocostudio const char* P_ColorB = "colorB"; const char* P_FlipX = "flipX"; const char* P_FlipY = "flipY"; + const char* P_AnchorPointX = "anchorPointX"; + const char* P_AnchorPointY = "anchorPointY"; + + + const char* P_ResourceType = "resourceType"; + const char* P_Path = "path"; - - static WidgetReader* instanceWidgetReader = NULL; IMPLEMENT_CLASS_WIDGET_READER_INFO(WidgetReader) @@ -259,6 +263,7 @@ namespace cocostudio } widget->setColor(_color); widget->setOpacity(_opacity); + //the setSize method will be conflict with scale9Width & scale9Height widget->setSize(Size(_width, _height)); widget->setPosition(_position); widget->setAnchorPoint(_originalAnchorPoint); @@ -315,18 +320,18 @@ namespace cocostudio void WidgetReader::setAnchorPointForWidget(cocos2d::ui::Widget *widget, const rapidjson::Value &options) { - bool isAnchorPointXExists = DICTOOL->checkObjectExist_json(options, "anchorPointX"); + bool isAnchorPointXExists = DICTOOL->checkObjectExist_json(options, P_AnchorPointX); float anchorPointXInFile; if (isAnchorPointXExists) { - anchorPointXInFile = DICTOOL->getFloatValue_json(options, "anchorPointX"); + anchorPointXInFile = DICTOOL->getFloatValue_json(options, P_AnchorPointX); }else{ anchorPointXInFile = widget->getAnchorPoint().x; } - bool isAnchorPointYExists = DICTOOL->checkObjectExist_json(options, "anchorPointY"); + bool isAnchorPointYExists = DICTOOL->checkObjectExist_json(options, P_AnchorPointY); float anchorPointYInFile; if (isAnchorPointYExists) { - anchorPointYInFile = DICTOOL->getFloatValue_json(options, "anchorPointY"); + anchorPointYInFile = DICTOOL->getFloatValue_json(options, P_AnchorPointY); } else{ anchorPointYInFile = widget->getAnchorPoint().y; diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index dfc3908010..e30d50fc98 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -126,6 +126,11 @@ namespace cocostudio extern const char* P_ColorB; extern const char* P_FlipX; extern const char* P_FlipY; + extern const char* P_AnchorPointX; + extern const char* P_AnchorPointY; + + extern const char* P_ResourceType; + extern const char* P_Path; #define CC_BASIC_PROPERTY_BINARY_READER \ if (key == P_IgnoreSize) { \ @@ -143,9 +148,7 @@ namespace cocostudio }else if(key == P_PositionPercentY){ \ _positionPercentY = valueToFloat(value); \ } \ - else if(key == P_AdaptScreen){ \ - _isAdaptScreen = valueToBool(value); \ - }else if (key == P_Width){ \ + else if (key == P_Width){ \ _width = valueToFloat(value); \ }else if(key == P_Height){ \ _height = valueToFloat(value); \ @@ -229,6 +232,11 @@ namespace cocostudio widget->setFlippedX(valueToBool(value));\ }else if(key == P_FlipY){\ widget->setFlippedY(valueToBool(value));\ + } \ + else if(key == P_AnchorPointX){ \ + _originalAnchorPoint.x = valueToFloat(value); \ + }else if(key == P_AnchorPointY){ \ + _originalAnchorPoint.y = valueToFloat(value); \ } From 585ccf2c71ea635ef407bb58cad5b3360f94019e Mon Sep 17 00:00:00 2001 From: andyque Date: Fri, 20 Jun 2014 10:40:16 +0800 Subject: [PATCH 30/72] issue #5161, replace all _size to _contentSize --- cocos/ui/UIButton.cpp | 24 ++++----- cocos/ui/UICheckBox.cpp | 20 ++++---- cocos/ui/UIImageView.cpp | 8 +-- cocos/ui/UILayout.cpp | 34 ++++++------ cocos/ui/UIListView.cpp | 4 +- cocos/ui/UILoadingBar.cpp | 8 +-- cocos/ui/UIRichText.cpp | 8 +-- cocos/ui/UIScrollView.cpp | 105 +++++++++++++++++++++----------------- cocos/ui/UISlider.cpp | 20 ++++---- cocos/ui/UIText.cpp | 6 +-- cocos/ui/UITextAtlas.cpp | 4 +- cocos/ui/UITextBMFont.cpp | 4 +- cocos/ui/UITextField.cpp | 6 +-- cocos/ui/UIWidget.cpp | 39 +++++++------- cocos/ui/UIWidget.h | 3 +- 15 files changed, 150 insertions(+), 143 deletions(-) diff --git a/cocos/ui/UIButton.cpp b/cocos/ui/UIButton.cpp index f8366ccad2..4f1d36bd2e 100644 --- a/cocos/ui/UIButton.cpp +++ b/cocos/ui/UIButton.cpp @@ -56,9 +56,9 @@ _capInsetsDisabled(Rect::ZERO), _normalTexType(TextureResType::LOCAL), _pressedTexType(TextureResType::LOCAL), _disabledTexType(TextureResType::LOCAL), -_normalTextureSize(_size), -_pressedTextureSize(_size), -_disabledTextureSize(_size), +_normalTextureSize(_contentSize), +_pressedTextureSize(_contentSize), +_disabledTextureSize(_contentSize), _pressedActionEnabled(false), _titleColor(Color3B::WHITE), _normalTextureScaleXInSize(1.0f), @@ -615,7 +615,7 @@ void Button::normalTextureScaleChangedWithSize() { if (_scale9Enabled) { - static_cast(_buttonNormalRenderer)->setPreferredSize(_size); + static_cast(_buttonNormalRenderer)->setPreferredSize(_contentSize); _normalTextureScaleXInSize = _normalTextureScaleYInSize = 1.0f; } else @@ -626,8 +626,8 @@ void Button::normalTextureScaleChangedWithSize() _buttonNormalRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _buttonNormalRenderer->setScaleX(scaleX); _buttonNormalRenderer->setScaleY(scaleY); _normalTextureScaleXInSize = scaleX; @@ -651,7 +651,7 @@ void Button::pressedTextureScaleChangedWithSize() { if (_scale9Enabled) { - static_cast(_buttonClickedRenderer)->setPreferredSize(_size); + static_cast(_buttonClickedRenderer)->setPreferredSize(_contentSize); _pressedTextureScaleXInSize = _pressedTextureScaleYInSize = 1.0f; } else @@ -662,8 +662,8 @@ void Button::pressedTextureScaleChangedWithSize() _buttonClickedRenderer->setScale(1.0f); return; } - float scaleX = _size.width / _pressedTextureSize.width; - float scaleY = _size.height / _pressedTextureSize.height; + float scaleX = _contentSize.width / _pressedTextureSize.width; + float scaleY = _contentSize.height / _pressedTextureSize.height; _buttonClickedRenderer->setScaleX(scaleX); _buttonClickedRenderer->setScaleY(scaleY); _pressedTextureScaleXInSize = scaleX; @@ -686,7 +686,7 @@ void Button::disabledTextureScaleChangedWithSize() { if (_scale9Enabled) { - static_cast(_buttonDisableRenderer)->setPreferredSize(_size); + static_cast(_buttonDisableRenderer)->setPreferredSize(_contentSize); } else { @@ -696,8 +696,8 @@ void Button::disabledTextureScaleChangedWithSize() _buttonDisableRenderer->setScale(1.0f); return; } - float scaleX = _size.width / _disabledTextureSize.width; - float scaleY = _size.height / _disabledTextureSize.height; + float scaleX = _contentSize.width / _disabledTextureSize.width; + float scaleY = _contentSize.height / _disabledTextureSize.height; _buttonDisableRenderer->setScaleX(scaleX); _buttonDisableRenderer->setScaleY(scaleY); } diff --git a/cocos/ui/UICheckBox.cpp b/cocos/ui/UICheckBox.cpp index 5440da5a3a..d5a3b762d0 100644 --- a/cocos/ui/UICheckBox.cpp +++ b/cocos/ui/UICheckBox.cpp @@ -473,8 +473,8 @@ void CheckBox::backGroundTextureScaleChangedWithSize() _backGroundBoxRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _backGroundBoxRenderer->setScaleX(scaleX); _backGroundBoxRenderer->setScaleY(scaleY); } @@ -495,8 +495,8 @@ void CheckBox::backGroundSelectedTextureScaleChangedWithSize() _backGroundSelectedBoxRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _backGroundSelectedBoxRenderer->setScaleX(scaleX); _backGroundSelectedBoxRenderer->setScaleY(scaleY); } @@ -517,8 +517,8 @@ void CheckBox::frontCrossTextureScaleChangedWithSize() _frontCrossRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _frontCrossRenderer->setScaleX(scaleX); _frontCrossRenderer->setScaleY(scaleY); } @@ -539,8 +539,8 @@ void CheckBox::backGroundDisabledTextureScaleChangedWithSize() _backGroundBoxDisabledRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _backGroundBoxDisabledRenderer->setScaleX(scaleX); _backGroundBoxDisabledRenderer->setScaleY(scaleY); } @@ -561,8 +561,8 @@ void CheckBox::frontCrossDisabledTextureScaleChangedWithSize() _frontCrossDisabledRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _frontCrossDisabledRenderer->setScaleX(scaleX); _frontCrossDisabledRenderer->setScaleY(scaleY); } diff --git a/cocos/ui/UIImageView.cpp b/cocos/ui/UIImageView.cpp index 95034eeef5..cfc5d76d62 100644 --- a/cocos/ui/UIImageView.cpp +++ b/cocos/ui/UIImageView.cpp @@ -45,7 +45,7 @@ _capInsets(Rect::ZERO), _imageRenderer(nullptr), _textureFile(""), _imageTexType(TextureResType::LOCAL), -_imageTextureSize(_size), +_imageTextureSize(_contentSize), _imageRendererAdaptDirty(true) { @@ -300,7 +300,7 @@ void ImageView::imageTextureScaleChangedWithSize() { if (_scale9Enabled) { - static_cast(_imageRenderer)->setPreferredSize(_size); + static_cast(_imageRenderer)->setPreferredSize(_contentSize); } else { @@ -310,8 +310,8 @@ void ImageView::imageTextureScaleChangedWithSize() _imageRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _imageRenderer->setScaleX(scaleX); _imageRenderer->setScaleY(scaleY); } diff --git a/cocos/ui/UILayout.cpp b/cocos/ui/UILayout.cpp index a42599b915..092ef3a61c 100644 --- a/cocos/ui/UILayout.cpp +++ b/cocos/ui/UILayout.cpp @@ -429,7 +429,7 @@ void Layout::setClippingEnabled(bool able) _clippingStencil->onEnter(); } _clippingStencil->retain(); - setStencilClippingSize(_size); + setStencilClippingSize(_contentSize); } else { @@ -469,9 +469,9 @@ void Layout::setStencilClippingSize(const Size &size) { Vec2 rect[4]; rect[0] = Vec2::ZERO; - rect[1] = Vec2(_size.width, 0); - rect[2] = Vec2(_size.width, _size.height); - rect[3] = Vec2(0, _size.height); + rect[1] = Vec2(_contentSize.width, 0); + rect[2] = Vec2(_contentSize.width, _contentSize.height); + rect[3] = Vec2(0, _contentSize.height); Color4F green(0, 1, 0, 1); _clippingStencil->clear(); _clippingStencil->drawPolygon(rect, 4, green, 0, green); @@ -484,8 +484,8 @@ const Rect& Layout::getClippingRect() { Vec2 worldPos = convertToWorldSpace(Vec2::ZERO); AffineTransform t = getNodeToWorldAffineTransform(); - float scissorWidth = _size.width*t.a; - float scissorHeight = _size.height*t.d; + float scissorWidth = _contentSize.width*t.a; + float scissorHeight = _contentSize.height*t.d; Rect parentClippingRect; Layout* parent = this; @@ -560,24 +560,24 @@ const Rect& Layout::getClippingRect() void Layout::onSizeChanged() { Widget::onSizeChanged(); - setStencilClippingSize(_size); + setStencilClippingSize(_contentSize); _doLayoutDirty = true; _clippingRectDirty = true; if (_backGroundImage) { - _backGroundImage->setPosition(Vec2(_size.width/2.0f, _size.height/2.0f)); + _backGroundImage->setPosition(Vec2(_contentSize.width/2.0f, _contentSize.height/2.0f)); if (_backGroundScale9Enabled && _backGroundImage) { - static_cast(_backGroundImage)->setPreferredSize(_size); + static_cast(_backGroundImage)->setPreferredSize(_contentSize); } } if (_colorRender) { - _colorRender->setContentSize(_size); + _colorRender->setContentSize(_contentSize); } if (_gradientRender) { - _gradientRender->setContentSize(_size); + _gradientRender->setContentSize(_contentSize); } } @@ -626,7 +626,7 @@ void Layout::setBackGroundImage(const std::string& fileName,TextureResType texTy default: break; } - bgiScale9->setPreferredSize(_size); + bgiScale9->setPreferredSize(_contentSize); } else { @@ -643,7 +643,7 @@ void Layout::setBackGroundImage(const std::string& fileName,TextureResType texTy } } _backGroundImageTextureSize = _backGroundImage->getContentSize(); - _backGroundImage->setPosition(Vec2(_size.width/2.0f, _size.height/2.0f)); + _backGroundImage->setPosition(Vec2(_contentSize.width/2.0f, _contentSize.height/2.0f)); updateBackGroundImageRGBA(); } @@ -701,14 +701,14 @@ void Layout::addBackGroundImage() { _backGroundImage = extension::Scale9Sprite::create(); addProtectedChild(_backGroundImage, BACKGROUNDIMAGE_Z, -1); - static_cast(_backGroundImage)->setPreferredSize(_size); + static_cast(_backGroundImage)->setPreferredSize(_contentSize); } else { _backGroundImage = Sprite::create(); addProtectedChild(_backGroundImage, BACKGROUNDIMAGE_Z, -1); } - _backGroundImage->setPosition(Vec2(_size.width/2.0f, _size.height/2.0f)); + _backGroundImage->setPosition(Vec2(_contentSize.width/2.0f, _contentSize.height/2.0f)); } void Layout::removeBackGroundImage() @@ -767,14 +767,14 @@ void Layout::setBackGroundColorType(BackGroundColorType type) break; case BackGroundColorType::SOLID: _colorRender = LayerColor::create(); - _colorRender->setContentSize(_size); + _colorRender->setContentSize(_contentSize); _colorRender->setOpacity(_cOpacity); _colorRender->setColor(_cColor); addProtectedChild(_colorRender, BCAKGROUNDCOLORRENDERER_Z, -1); break; case BackGroundColorType::GRADIENT: _gradientRender = LayerGradient::create(); - _gradientRender->setContentSize(_size); + _gradientRender->setContentSize(_contentSize); _gradientRender->setOpacity(_cOpacity); _gradientRender->setStartColor(_gStartColor); _gradientRender->setEndColor(_gEndColor); diff --git a/cocos/ui/UIListView.cpp b/cocos/ui/UIListView.cpp index 16d9e29280..0d6a5b4cb2 100644 --- a/cocos/ui/UIListView.cpp +++ b/cocos/ui/UIListView.cpp @@ -98,7 +98,7 @@ void ListView::updateInnerContainerSize() { totalHeight += item->getSize().height; } - float finalWidth = _size.width; + float finalWidth = _contentSize.width; float finalHeight = totalHeight; setInnerContainerSize(Size(finalWidth, finalHeight)); break; @@ -112,7 +112,7 @@ void ListView::updateInnerContainerSize() totalWidth += item->getSize().width; } float finalWidth = totalWidth; - float finalHeight = _size.height; + float finalHeight = _contentSize.height; setInnerContainerSize(Size(finalWidth, finalHeight)); break; } diff --git a/cocos/ui/UILoadingBar.cpp b/cocos/ui/UILoadingBar.cpp index 5dccc11c5b..6cc2f658f0 100644 --- a/cocos/ui/UILoadingBar.cpp +++ b/cocos/ui/UILoadingBar.cpp @@ -317,7 +317,7 @@ void LoadingBar::barRendererScaleChangedWithSize() } else { - _totalLength = _size.width; + _totalLength = _contentSize.width; if (_scale9Enabled) { setScale9Scale(); @@ -331,8 +331,8 @@ void LoadingBar::barRendererScaleChangedWithSize() _barRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _barRenderer->setScaleX(scaleX); _barRenderer->setScaleY(scaleY); } @@ -353,7 +353,7 @@ void LoadingBar::barRendererScaleChangedWithSize() void LoadingBar::setScale9Scale() { float width = (float)(_percent) / 100.0f * _totalLength; - static_cast(_barRenderer)->setPreferredSize(Size(width, _size.height)); + static_cast(_barRenderer)->setPreferredSize(Size(width, _contentSize.height)); } std::string LoadingBar::getDescription() const diff --git a/cocos/ui/UIRichText.cpp b/cocos/ui/UIRichText.cpp index 49546be2e8..03e59cb301 100644 --- a/cocos/ui/UIRichText.cpp +++ b/cocos/ui/UIRichText.cpp @@ -414,7 +414,7 @@ void RichText::formarRenderers() nextPosX += l->getContentSize().width; } } - _elementRenderersContainer->setContentSize(_size); + _elementRenderersContainer->setContentSize(_contentSize); delete [] maxHeights; } @@ -430,13 +430,13 @@ void RichText::formarRenderers() if (_ignoreSize) { Size s = getVirtualRendererSize(); - _size = s; + _contentSize = s; } else { - _size = _customSize; + _contentSize = _customSize; } - updateContentSizeWithTextureSize(_size); + updateContentSizeWithTextureSize(_contentSize); _elementRenderersContainer->setPosition(_contentSize.width / 2.0f, _contentSize.height / 2.0f); } diff --git a/cocos/ui/UIScrollView.cpp b/cocos/ui/UIScrollView.cpp index 8ed6d8231f..5977deb432 100644 --- a/cocos/ui/UIScrollView.cpp +++ b/cocos/ui/UIScrollView.cpp @@ -128,29 +128,29 @@ void ScrollView::initRenderer() void ScrollView::onSizeChanged() { Layout::onSizeChanged(); - _topBoundary = _size.height; - _rightBoundary = _size.width; - float bounceBoundaryParameterX = _size.width / 3.0f; - float bounceBoundaryParameterY = _size.height / 3.0f; - _bounceTopBoundary = _size.height - bounceBoundaryParameterY; + _topBoundary = _contentSize.height; + _rightBoundary = _contentSize.width; + float bounceBoundaryParameterX = _contentSize.width / 3.0f; + float bounceBoundaryParameterY = _contentSize.height / 3.0f; + _bounceTopBoundary = _contentSize.height - bounceBoundaryParameterY; _bounceBottomBoundary = bounceBoundaryParameterY; _bounceLeftBoundary = bounceBoundaryParameterX; - _bounceRightBoundary = _size.width - bounceBoundaryParameterX; + _bounceRightBoundary = _contentSize.width - bounceBoundaryParameterX; Size innerSize = _innerContainer->getSize(); float orginInnerSizeWidth = innerSize.width; float orginInnerSizeHeight = innerSize.height; - float innerSizeWidth = MAX(orginInnerSizeWidth, _size.width); - float innerSizeHeight = MAX(orginInnerSizeHeight, _size.height); + float innerSizeWidth = MAX(orginInnerSizeWidth, _contentSize.width); + float innerSizeHeight = MAX(orginInnerSizeHeight, _contentSize.height); _innerContainer->setSize(Size(innerSizeWidth, innerSizeHeight)); - _innerContainer->setPosition(Vec2(0, _size.height - _innerContainer->getSize().height)); + _innerContainer->setPosition(Vec2(0, _contentSize.height - _innerContainer->getSize().height)); } void ScrollView::setInnerContainerSize(const Size &size) { - float innerSizeWidth = _size.width; - float innerSizeHeight = _size.height; + float innerSizeWidth = _contentSize.width; + float innerSizeHeight = _contentSize.height; Size originalInnerSize = _innerContainer->getSize(); - if (size.width < _size.width) + if (size.width < _contentSize.width) { CCLOG("Inner width <= scrollview width, it will be force sized!"); } @@ -158,7 +158,7 @@ void ScrollView::setInnerContainerSize(const Size &size) { innerSizeWidth = size.width; } - if (size.height < _size.height) + if (size.height < _contentSize.height) { CCLOG("Inner height <= scrollview height, it will be force sized!"); } @@ -179,7 +179,7 @@ void ScrollView::setInnerContainerSize(const Size &size) } case Direction::HORIZONTAL: { - if (_innerContainer->getRightBoundary() <= _size.width) + if (_innerContainer->getRightBoundary() <= _contentSize.width) { Size newInnerSize = _innerContainer->getSize(); float offset = originalInnerSize.width - newInnerSize.width; @@ -192,7 +192,7 @@ void ScrollView::setInnerContainerSize(const Size &size) Size newInnerSize = _innerContainer->getSize(); float offsetY = originalInnerSize.height - newInnerSize.height; float offsetX = 0.0f; - if (_innerContainer->getRightBoundary() <= _size.width) + if (_innerContainer->getRightBoundary() <= _contentSize.width) { offsetX = originalInnerSize.width - newInnerSize.width; } @@ -204,19 +204,23 @@ void ScrollView::setInnerContainerSize(const Size &size) } if (_innerContainer->getLeftBoundary() > 0.0f) { - _innerContainer->setPosition(Vec2(_innerContainer->getAnchorPoint().x * _innerContainer->getSize().width, _innerContainer->getPosition().y)); + _innerContainer->setPosition(Vec2(_innerContainer->getAnchorPoint().x * _innerContainer->getSize().width, + _innerContainer->getPosition().y)); } - if (_innerContainer->getRightBoundary() < _size.width) + if (_innerContainer->getRightBoundary() < _contentSize.width) { - _innerContainer->setPosition(Vec2(_size.width - ((1.0f - _innerContainer->getAnchorPoint().x) * _innerContainer->getSize().width), _innerContainer->getPosition().y)); + _innerContainer->setPosition(Vec2(_contentSize.width - ((1.0f - _innerContainer->getAnchorPoint().x) * _innerContainer->getSize().width), + _innerContainer->getPosition().y)); } if (_innerContainer->getPosition().y > 0.0f) { - _innerContainer->setPosition(Vec2(_innerContainer->getPosition().x, _innerContainer->getAnchorPoint().y * _innerContainer->getSize().height)); + _innerContainer->setPosition(Vec2(_innerContainer->getPosition().x, + _innerContainer->getAnchorPoint().y * _innerContainer->getSize().height)); } - if (_innerContainer->getTopBoundary() < _size.height) + if (_innerContainer->getTopBoundary() < _contentSize.height) { - _innerContainer->setPosition(Vec2(_innerContainer->getPosition().x, _size.height - (1.0f - _innerContainer->getAnchorPoint().y) * _innerContainer->getSize().height)); + _innerContainer->setPosition(Vec2(_innerContainer->getPosition().x, + _contentSize.height - (1.0f - _innerContainer->getAnchorPoint().y) * _innerContainer->getSize().height)); } } @@ -359,14 +363,14 @@ bool ScrollView::checkNeedBounce() { if (_topBounceNeeded && _leftBounceNeeded) { - Vec2 scrollVector = Vec2(0.0f, _size.height) - Vec2(_innerContainer->getLeftBoundary(), _innerContainer->getTopBoundary()); + Vec2 scrollVector = Vec2(0.0f, _contentSize.height) - Vec2(_innerContainer->getLeftBoundary(), _innerContainer->getTopBoundary()); float orSpeed = scrollVector.getLength()/(0.2f); _bounceDir = scrollVector.getNormalized(); startBounceChildren(orSpeed); } else if (_topBounceNeeded && _rightBounceNeeded) { - Vec2 scrollVector = Vec2(_size.width, _size.height) - Vec2(_innerContainer->getRightBoundary(), _innerContainer->getTopBoundary()); + Vec2 scrollVector = Vec2(_contentSize.width, _contentSize.height) - Vec2(_innerContainer->getRightBoundary(), _innerContainer->getTopBoundary()); float orSpeed = scrollVector.getLength()/(0.2f); _bounceDir = scrollVector.getNormalized(); startBounceChildren(orSpeed); @@ -380,14 +384,14 @@ bool ScrollView::checkNeedBounce() } else if (_bottomBounceNeeded && _rightBounceNeeded) { - Vec2 scrollVector = Vec2(_size.width, 0.0f) - Vec2(_innerContainer->getRightBoundary(), _innerContainer->getBottomBoundary()); + Vec2 scrollVector = Vec2(_contentSize.width, 0.0f) - Vec2(_innerContainer->getRightBoundary(), _innerContainer->getBottomBoundary()); float orSpeed = scrollVector.getLength()/(0.2f); _bounceDir = scrollVector.getNormalized(); startBounceChildren(orSpeed); } else if (_topBounceNeeded) { - Vec2 scrollVector = Vec2(0.0f, _size.height) - Vec2(0.0f, _innerContainer->getTopBoundary()); + Vec2 scrollVector = Vec2(0.0f, _contentSize.height) - Vec2(0.0f, _innerContainer->getTopBoundary()); float orSpeed = scrollVector.getLength()/(0.2f); _bounceDir = scrollVector.getNormalized(); startBounceChildren(orSpeed); @@ -408,7 +412,7 @@ bool ScrollView::checkNeedBounce() } else if (_rightBounceNeeded) { - Vec2 scrollVector = Vec2(_size.width, 0.0f) - Vec2(_innerContainer->getRightBoundary(), 0.0f); + Vec2 scrollVector = Vec2(_contentSize.width, 0.0f) - Vec2(_innerContainer->getRightBoundary(), 0.0f); float orSpeed = scrollVector.getLength()/(0.2f); _bounceDir = scrollVector.getNormalized(); startBounceChildren(orSpeed); @@ -518,23 +522,23 @@ void ScrollView::jumpToDestination(const Vec2 &des) case Direction::VERTICAL: if (des.y <= 0) { - finalOffsetY = MAX(des.y, _size.height - _innerContainer->getSize().height); + finalOffsetY = MAX(des.y, _contentSize.height - _innerContainer->getSize().height); } break; case Direction::HORIZONTAL: if (des.x <= 0) { - finalOffsetX = MAX(des.x, _size.width - _innerContainer->getSize().width); + finalOffsetX = MAX(des.x, _contentSize.width - _innerContainer->getSize().width); } break; case Direction::BOTH: if (des.y <= 0) { - finalOffsetY = MAX(des.y, _size.height - _innerContainer->getSize().height); + finalOffsetY = MAX(des.y, _contentSize.height - _innerContainer->getSize().height); } if (des.x <= 0) { - finalOffsetX = MAX(des.x, _size.width - _innerContainer->getSize().width); + finalOffsetX = MAX(des.x, _contentSize.width - _innerContainer->getSize().width); } break; default: @@ -1217,7 +1221,8 @@ void ScrollView::scrollToBottom(float time, bool attenuated) void ScrollView::scrollToTop(float time, bool attenuated) { - startAutoScrollChildrenWithDestination(Vec2(_innerContainer->getPosition().x, _size.height - _innerContainer->getSize().height), time, attenuated); + startAutoScrollChildrenWithDestination(Vec2(_innerContainer->getPosition().x, + _contentSize.height - _innerContainer->getSize().height), time, attenuated); } void ScrollView::scrollToLeft(float time, bool attenuated) @@ -1227,7 +1232,8 @@ void ScrollView::scrollToLeft(float time, bool attenuated) void ScrollView::scrollToRight(float time, bool attenuated) { - startAutoScrollChildrenWithDestination(Vec2(_size.width - _innerContainer->getSize().width, _innerContainer->getPosition().y), time, attenuated); + startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, + _innerContainer->getPosition().y), time, attenuated); } void ScrollView::scrollToTopLeft(float time, bool attenuated) @@ -1237,7 +1243,7 @@ void ScrollView::scrollToTopLeft(float time, bool attenuated) CCLOG("Scroll diretion is not both!"); return; } - startAutoScrollChildrenWithDestination(Vec2(0.0f, _size.height - _innerContainer->getSize().height), time, attenuated); + startAutoScrollChildrenWithDestination(Vec2(0.0f, _contentSize.height - _innerContainer->getSize().height), time, attenuated); } void ScrollView::scrollToTopRight(float time, bool attenuated) @@ -1247,7 +1253,8 @@ void ScrollView::scrollToTopRight(float time, bool attenuated) CCLOG("Scroll diretion is not both!"); return; } - startAutoScrollChildrenWithDestination(Vec2(_size.width - _innerContainer->getSize().width, _size.height - _innerContainer->getSize().height), time, attenuated); + startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, + _contentSize.height - _innerContainer->getSize().height), time, attenuated); } void ScrollView::scrollToBottomLeft(float time, bool attenuated) @@ -1267,19 +1274,19 @@ void ScrollView::scrollToBottomRight(float time, bool attenuated) CCLOG("Scroll diretion is not both!"); return; } - startAutoScrollChildrenWithDestination(Vec2(_size.width - _innerContainer->getSize().width, 0.0f), time, attenuated); + startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, 0.0f), time, attenuated); } void ScrollView::scrollToPercentVertical(float percent, float time, bool attenuated) { - float minY = _size.height - _innerContainer->getSize().height; + float minY = _contentSize.height - _innerContainer->getSize().height; float h = - minY; startAutoScrollChildrenWithDestination(Vec2(_innerContainer->getPosition().x, minY + percent * h / 100.0f), time, attenuated); } void ScrollView::scrollToPercentHorizontal(float percent, float time, bool attenuated) { - float w = _innerContainer->getSize().width - _size.width; + float w = _innerContainer->getSize().width - _contentSize.width; startAutoScrollChildrenWithDestination(Vec2(-(percent * w / 100.0f), _innerContainer->getPosition().y), time, attenuated); } @@ -1289,9 +1296,9 @@ void ScrollView::scrollToPercentBothDirection(const Vec2& percent, float time, b { return; } - float minY = _size.height - _innerContainer->getSize().height; + float minY = _contentSize.height - _innerContainer->getSize().height; float h = - minY; - float w = _innerContainer->getSize().width - _size.width; + float w = _innerContainer->getSize().width - _contentSize.width; startAutoScrollChildrenWithDestination(Vec2(-(percent.x * w / 100.0f), minY + percent.y * h / 100.0f), time, attenuated); } @@ -1302,7 +1309,8 @@ void ScrollView::jumpToBottom() void ScrollView::jumpToTop() { - jumpToDestination(Vec2(_innerContainer->getPosition().x, _size.height - _innerContainer->getSize().height)); + jumpToDestination(Vec2(_innerContainer->getPosition().x, + _contentSize.height - _innerContainer->getSize().height)); } void ScrollView::jumpToLeft() @@ -1312,7 +1320,7 @@ void ScrollView::jumpToLeft() void ScrollView::jumpToRight() { - jumpToDestination(Vec2(_size.width - _innerContainer->getSize().width, _innerContainer->getPosition().y)); + jumpToDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, _innerContainer->getPosition().y)); } void ScrollView::jumpToTopLeft() @@ -1322,7 +1330,7 @@ void ScrollView::jumpToTopLeft() CCLOG("Scroll diretion is not both!"); return; } - jumpToDestination(Vec2(0.0f, _size.height - _innerContainer->getSize().height)); + jumpToDestination(Vec2(0.0f, _contentSize.height - _innerContainer->getSize().height)); } void ScrollView::jumpToTopRight() @@ -1332,7 +1340,8 @@ void ScrollView::jumpToTopRight() CCLOG("Scroll diretion is not both!"); return; } - jumpToDestination(Vec2(_size.width - _innerContainer->getSize().width, _size.height - _innerContainer->getSize().height)); + jumpToDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, + _contentSize.height - _innerContainer->getSize().height)); } void ScrollView::jumpToBottomLeft() @@ -1352,19 +1361,19 @@ void ScrollView::jumpToBottomRight() CCLOG("Scroll diretion is not both!"); return; } - jumpToDestination(Vec2(_size.width - _innerContainer->getSize().width, 0.0f)); + jumpToDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, 0.0f)); } void ScrollView::jumpToPercentVertical(float percent) { - float minY = _size.height - _innerContainer->getSize().height; + float minY = _contentSize.height - _innerContainer->getSize().height; float h = - minY; jumpToDestination(Vec2(_innerContainer->getPosition().x, minY + percent * h / 100.0f)); } void ScrollView::jumpToPercentHorizontal(float percent) { - float w = _innerContainer->getSize().width - _size.width; + float w = _innerContainer->getSize().width - _contentSize.width; jumpToDestination(Vec2(-(percent * w / 100.0f), _innerContainer->getPosition().y)); } @@ -1374,9 +1383,9 @@ void ScrollView::jumpToPercentBothDirection(const Vec2& percent) { return; } - float minY = _size.height - _innerContainer->getSize().height; + float minY = _contentSize.height - _innerContainer->getSize().height; float h = - minY; - float w = _innerContainer->getSize().width - _size.width; + float w = _innerContainer->getSize().width - _contentSize.width; jumpToDestination(Vec2(-(percent.x * w / 100.0f), minY + percent.y * h / 100.0f)); } diff --git a/cocos/ui/UISlider.cpp b/cocos/ui/UISlider.cpp index 7a2e9f441b..65886298a7 100644 --- a/cocos/ui/UISlider.cpp +++ b/cocos/ui/UISlider.cpp @@ -500,14 +500,14 @@ void Slider::barRendererScaleChangedWithSize() { _barRenderer->setScale(1.0f); - _barLength = _size.width; + _barLength = _contentSize.width; } else { - _barLength = _size.width; + _barLength = _contentSize.width; if (_scale9Enabled) { - static_cast(_barRenderer)->setPreferredSize(_size); + static_cast(_barRenderer)->setPreferredSize(_contentSize); } else { @@ -517,8 +517,8 @@ void Slider::barRendererScaleChangedWithSize() _barRenderer->setScale(1.0f); return; } - float bscaleX = _size.width / btextureSize.width; - float bscaleY = _size.height / btextureSize.height; + float bscaleX = _contentSize.width / btextureSize.width; + float bscaleY = _contentSize.height / btextureSize.height; _barRenderer->setScaleX(bscaleX); _barRenderer->setScaleY(bscaleY); } @@ -534,8 +534,8 @@ void Slider::progressBarRendererScaleChangedWithSize() if (!_scale9Enabled) { Size ptextureSize = _progressBarTextureSize; - float pscaleX = _size.width / ptextureSize.width; - float pscaleY = _size.height / ptextureSize.height; + float pscaleX = _contentSize.width / ptextureSize.width; + float pscaleY = _contentSize.height / ptextureSize.height; _progressBarRenderer->setScaleX(pscaleX); _progressBarRenderer->setScaleY(pscaleY); } @@ -544,7 +544,7 @@ void Slider::progressBarRendererScaleChangedWithSize() { if (_scale9Enabled) { - static_cast(_progressBarRenderer)->setPreferredSize(_size); + static_cast(_progressBarRenderer)->setPreferredSize(_contentSize); _progressBarTextureSize = _progressBarRenderer->getContentSize(); } else @@ -555,8 +555,8 @@ void Slider::progressBarRendererScaleChangedWithSize() _progressBarRenderer->setScale(1.0f); return; } - float pscaleX = _size.width / ptextureSize.width; - float pscaleY = _size.height / ptextureSize.height; + float pscaleX = _contentSize.width / ptextureSize.width; + float pscaleY = _contentSize.height / ptextureSize.height; _progressBarRenderer->setScaleX(pscaleX); _progressBarRenderer->setScaleY(pscaleY); } diff --git a/cocos/ui/UIText.cpp b/cocos/ui/UIText.cpp index 0ce8d0f57a..d8be8244ac 100644 --- a/cocos/ui/UIText.cpp +++ b/cocos/ui/UIText.cpp @@ -302,15 +302,15 @@ void Text::labelScaleChangedWithSize() } else { - _labelRenderer->setDimensions(_size.width,_size.height); + _labelRenderer->setDimensions(_contentSize.width,_contentSize.height); Size textureSize = _labelRenderer->getContentSize(); if (textureSize.width <= 0.0f || textureSize.height <= 0.0f) { _labelRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _labelRenderer->setScaleX(scaleX); _labelRenderer->setScaleY(scaleY); _normalScaleValueX = scaleX; diff --git a/cocos/ui/UITextAtlas.cpp b/cocos/ui/UITextAtlas.cpp index e7bac16081..6419e7b11a 100644 --- a/cocos/ui/UITextAtlas.cpp +++ b/cocos/ui/UITextAtlas.cpp @@ -159,8 +159,8 @@ void TextAtlas::labelAtlasScaleChangedWithSize() _labelAtlasRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _labelAtlasRenderer->setScaleX(scaleX); _labelAtlasRenderer->setScaleY(scaleY); } diff --git a/cocos/ui/UITextBMFont.cpp b/cocos/ui/UITextBMFont.cpp index 4e4c7f34a7..52187ecda1 100644 --- a/cocos/ui/UITextBMFont.cpp +++ b/cocos/ui/UITextBMFont.cpp @@ -155,8 +155,8 @@ void TextBMFont::labelBMFontScaleChangedWithSize() _labelBMFontRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _labelBMFontRenderer->setScaleX(scaleX); _labelBMFontRenderer->setScaleY(scaleY); } diff --git a/cocos/ui/UITextField.cpp b/cocos/ui/UITextField.cpp index 7159fa0f6b..1cbbd901c0 100644 --- a/cocos/ui/UITextField.cpp +++ b/cocos/ui/UITextField.cpp @@ -783,15 +783,15 @@ void TextField::textfieldRendererScaleChangedWithSize() } else { - _textFieldRenderer->setDimensions(_size.width,_size.height); + _textFieldRenderer->setDimensions(_contentSize.width, _contentSize.height); Size textureSize = getContentSize(); if (textureSize.width <= 0.0f || textureSize.height <= 0.0f) { _textFieldRenderer->setScale(1.0f); return; } - float scaleX = _size.width / textureSize.width; - float scaleY = _size.height / textureSize.height; + float scaleX = _contentSize.width / textureSize.width; + float scaleY = _contentSize.height / textureSize.height; _textFieldRenderer->setScaleX(scaleX); _textFieldRenderer->setScaleY(scaleY); } diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index 5a18f10f74..068b6221b5 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -145,7 +145,6 @@ _touchEndPosition(Vec2::ZERO), _touchEventListener(nullptr), _touchEventSelector(nullptr), _actionTag(0), -_size(Size::ZERO), _customSize(Size::ZERO), _ignoreSize(false), _affectByClipping(false), @@ -258,11 +257,11 @@ void Widget::setSize(const Size &size) _customSize = size; if (_ignoreSize) { - _size = getVirtualRendererSize(); + _contentSize = getVirtualRendererSize(); } else { - _size = size; + _contentSize = size; } if (_running) { @@ -309,11 +308,11 @@ void Widget::setSizePercent(const Vec2 &percent) } if (_ignoreSize) { - _size = getVirtualRendererSize(); + _contentSize = getVirtualRendererSize(); } else { - _size = cSize; + _contentSize = cSize; } _customSize = cSize; onSizeChanged(); @@ -342,11 +341,11 @@ void Widget::updateSizeAndPosition(const cocos2d::Size &parentSize) { if (_ignoreSize) { - _size = getVirtualRendererSize(); + _contentSize = getVirtualRendererSize(); } else { - _size = _customSize; + _contentSize = _customSize; } float spx = 0.0f; float spy = 0.0f; @@ -366,11 +365,11 @@ void Widget::updateSizeAndPosition(const cocos2d::Size &parentSize) Size cSize = Size(parentSize.width * _sizePercent.x , parentSize.height * _sizePercent.y); if (_ignoreSize) { - _size = getVirtualRendererSize(); + _contentSize = getVirtualRendererSize(); } else { - _size = cSize; + _contentSize = cSize; } _customSize = cSize; break; @@ -425,11 +424,11 @@ void Widget::ignoreContentAdaptWithSize(bool ignore) if (_ignoreSize) { Size s = getVirtualRendererSize(); - _size = s; + _contentSize = s; } else { - _size = _customSize; + _contentSize = _customSize; } onSizeChanged(); } @@ -441,7 +440,7 @@ bool Widget::isIgnoreContentAdaptWithSize() const const Size& Widget::getSize() const { - return _size; + return _contentSize; } const Size& Widget::getCustomSize() const @@ -466,7 +465,7 @@ Node* Widget::getVirtualRenderer() void Widget::onSizeChanged() { - setContentSize(_size); + setContentSize(_contentSize); for (auto& child : getChildren()) { Widget* widgetChild = dynamic_cast(child); @@ -486,11 +485,11 @@ void Widget::updateContentSizeWithTextureSize(const cocos2d::Size &size) { if (_ignoreSize) { - _size = size; + _contentSize = size; } else { - _size = _customSize; + _contentSize = _customSize; } onSizeChanged(); } @@ -911,22 +910,22 @@ bool Widget::isEnabled() const float Widget::getLeftBoundary() const { - return getPosition().x - getAnchorPoint().x * _size.width; + return getPosition().x - getAnchorPoint().x * _contentSize.width; } float Widget::getBottomBoundary() const { - return getPosition().y - getAnchorPoint().y * _size.height; + return getPosition().y - getAnchorPoint().y * _contentSize.height; } float Widget::getRightBoundary() const { - return getLeftBoundary() + _size.width; + return getLeftBoundary() + _contentSize.width; } float Widget::getTopBoundary() const { - return getBottomBoundary() + _size.height; + return getBottomBoundary() + _contentSize.height; } const Vec2& Widget::getTouchBeganPosition()const @@ -1012,7 +1011,7 @@ void Widget::copyProperties(Widget *widget) setName(widget->getName()); setActionTag(widget->getActionTag()); _ignoreSize = widget->_ignoreSize; - _size = widget->_size; + _contentSize = widget->_contentSize; _customSize = widget->_customSize; _sizeType = widget->getSizeType(); _sizePercent = widget->_sizePercent; diff --git a/cocos/ui/UIWidget.h b/cocos/ui/UIWidget.h index 4d201720b0..c059f19a5e 100644 --- a/cocos/ui/UIWidget.h +++ b/cocos/ui/UIWidget.h @@ -407,7 +407,7 @@ public: const Size& getCustomSize() const; - virtual const Size& getLayoutSize() {return _size;}; + virtual const Size& getLayoutSize() {return _contentSize;}; /** * Returns size percent of widget @@ -659,7 +659,6 @@ protected: //use int _actionTag; - Size _size; Size _customSize; Vec2 _sizePercent; From 043c6400376f4e5042d75c98c8d78bf38436e60f Mon Sep 17 00:00:00 2001 From: yinkaile Date: Fri, 20 Jun 2014 10:52:14 +0800 Subject: [PATCH 31/72] fixed warning and logic error --- .../cocostudio/ActionTimeline/CCFrame.cpp | 12 ++++++------ .../cocostudio/ActionTimeline/CCNodeReader.cpp | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp index 00facfb6ba..657db83656 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp @@ -175,7 +175,7 @@ void RotationFrame::onEnter(Frame *nextFrame) void RotationFrame::apply(float percent) { - if (_tween && percent != 0 || _betwennRotation != 0) + if (_tween && percent != 0 && _betwennRotation != 0) { float rotation = _rotation + percent * _betwennRotation; _node->setRotation(rotation); @@ -227,7 +227,7 @@ void SkewFrame::onEnter(Frame *nextFrame) void SkewFrame::apply(float percent) { - if (_tween && percent != 0 || (_betweenSkewX != 0 || _betweenSkewY != 0)) + if (_tween && percent != 0 && (_betweenSkewX != 0 || _betweenSkewY != 0)) { float skewx = _skewX + percent * _betweenSkewX; float skewy = _skewY + percent * _betweenSkewY; @@ -282,7 +282,7 @@ void RotationSkewFrame::onEnter(Frame *nextFrame) void RotationSkewFrame::apply(float percent) { - if (_tween && percent != 0 || (_betweenSkewX != 0 || _betweenSkewY != 0)) + if (_tween && percent != 0 && (_betweenSkewX != 0 || _betweenSkewY != 0)) { float skewx = _skewX + percent * _betweenSkewX; float skewy = _skewY + percent * _betweenSkewY; @@ -335,7 +335,7 @@ void PositionFrame::onEnter(Frame *nextFrame) void PositionFrame::apply(float percent) { - if (_tween && percent != 0 || (_betweenX != 0 || _betweenY != 0)) + if (_tween && percent != 0 && (_betweenX != 0 || _betweenY != 0)) { Point p; p.x = _position.x + _betweenX * percent; @@ -389,7 +389,7 @@ void ScaleFrame::onEnter(Frame *nextFrame) void ScaleFrame::apply(float percent) { - if (_tween && percent != 0 || (_betweenScaleX != 0 || _betweenScaleY != 0)) + if (_tween && percent != 0 && (_betweenScaleX != 0 || _betweenScaleY != 0)) { float scaleX = _scaleX + _betweenScaleX * percent; float scaleY = _scaleY + _betweenScaleY * percent; @@ -523,7 +523,7 @@ void ColorFrame::onEnter(Frame *nextFrame) void ColorFrame::apply(float percent) { - if (_tween && percent != 0 || (_betweenAlpha !=0 || _betweenRed != 0 || _betweenGreen != 0 || _betweenBlue != 0)) + if (_tween && percent != 0 && (_betweenAlpha !=0 || _betweenRed != 0 || _betweenGreen != 0 || _betweenBlue != 0)) { GLubyte alpha = _alpha + _betweenAlpha * percent; diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp index 9991baff0b..285c96118e 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp @@ -383,9 +383,9 @@ Node* NodeReader::loadSprite(const rapidjson::Value& json) bool flipY = DICTOOL->getBooleanValue_json(json, FLIPY); if(flipX != false) - sprite->setFlipX(flipX); + sprite->setFlippedX(flipX); if(flipY != false) - sprite->setFlipY(flipY); + sprite->setFlippedY(flipY); return sprite; } From 4ca184b58a3586161941dd054e5054dd07b0c9a8 Mon Sep 17 00:00:00 2001 From: andyque Date: Fri, 20 Jun 2014 11:18:53 +0800 Subject: [PATCH 32/72] issue #5161, deprecated getSize --- cocos/ui/UILayout.cpp | 6 +- cocos/ui/UILayoutManager.cpp | 12 +- cocos/ui/UIListView.cpp | 4 +- cocos/ui/UIPageView.cpp | 12 +- cocos/ui/UIScrollView.cpp | 70 +++++----- cocos/ui/UIWidget.cpp | 23 +-- cocos/ui/UIWidget.h | 5 +- .../Classes/LabelTest/LabelTestNew.cpp | 6 +- .../UIButtonTest/UIButtonTest.cpp | 16 +-- .../UIButtonTest/UIButtonTest_Editor.cpp | 6 +- .../UICheckBoxTest/UICheckBoxTest.cpp | 4 +- .../UICheckBoxTest/UICheckBoxTest_Editor.cpp | 6 +- .../UIImageViewTest/UIImageViewTest.cpp | 8 +- .../UIImageViewTest_Editor.cpp | 2 +- .../UILayoutTest/UILayoutTest.cpp | 132 +++++++++--------- .../UILayoutTest/UILayoutTest_Editor.cpp | 90 ++++++------ .../UIListViewTest/UIListViewTest.cpp | 50 +++---- .../UIListViewTest/UIListViewTest_Editor.cpp | 20 +-- .../UILoadingBarTest/UILoadingBarTest.cpp | 24 ++-- .../UILoadingBarTest_Editor.cpp | 2 +- .../UIPageViewTest/UIPageViewTest.cpp | 12 +- .../UIPageViewTest/UIPageViewTest_Editor.cpp | 10 +- .../UIRichTextTest/UIRichTextTest.cpp | 6 +- .../UITest/CocoStudioGUITest/UIScene.cpp | 2 +- .../UIScrollViewTest/UIScrollViewTest.cpp | 80 +++++------ .../UIScrollViewTest_Editor.cpp | 34 ++--- .../UISliderTest/UISliderTest.cpp | 8 +- .../UISliderTest/UISliderTest_Editor.cpp | 6 +- .../UITextAtlasTest/UITextAtlasTest.cpp | 4 +- .../UITextAtlasTest_Editor.cpp | 2 +- .../UITextBMFontTest/UITextBMFontTest.cpp | 6 +- .../UITextBMFontTest_Editor.cpp | 2 +- .../UITextFieldTest/UITextFieldTest.cpp | 24 ++-- .../UITextFieldTest_Editor.cpp | 6 +- .../UITextTest/UITextTest.cpp | 26 ++-- .../UITextTest/UITextTest_Editor.cpp | 2 +- .../UIVideoPlayerTest/UIVideoPlayerTest.cpp | 2 +- .../UIWidgetAddNodeTest.cpp | 4 +- .../UIWidgetAddNodeTest_Editor.cpp | 2 +- 39 files changed, 371 insertions(+), 365 deletions(-) diff --git a/cocos/ui/UILayout.cpp b/cocos/ui/UILayout.cpp index 092ef3a61c..6bc9516d9f 100644 --- a/cocos/ui/UILayout.cpp +++ b/cocos/ui/UILayout.cpp @@ -947,7 +947,7 @@ void Layout::requestDoLayout() Size Layout::getLayoutContentSize()const { - return this->getSize(); + return this->getContentSize(); } const Vector& Layout::getLayoutElements()const @@ -1068,7 +1068,7 @@ Size Layout::getLayoutAccumulatedSize()const { widgetCount++; Margin m = w->getLayoutParameter()->getMargin(); - layoutSize = layoutSize + w->getSize() + Size(m.right + m.left, m.top + m.bottom) * 0.5; + layoutSize = layoutSize + w->getContentSize() + Size(m.right + m.left, m.top + m.bottom) * 0.5; } } } @@ -1090,7 +1090,7 @@ Vec2 Layout::getWorldCenterPoint(Widget* widget)const { Layout *layout = dynamic_cast(widget); //FIXEDME: we don't need to calculate the content size of layout anymore - Size widgetSize = layout ? layout->getLayoutAccumulatedSize() : widget->getSize(); + Size widgetSize = layout ? layout->getLayoutAccumulatedSize() : widget->getContentSize(); // CCLOG("contnet size : width = %f, height = %f", widgetSize.width, widgetSize.height); return widget->convertToWorldSpace(Vec2(widgetSize.width/2, widgetSize.height/2)); } diff --git a/cocos/ui/UILayoutManager.cpp b/cocos/ui/UILayoutManager.cpp index c1c1d6d082..928b40e9a8 100644 --- a/cocos/ui/UILayoutManager.cpp +++ b/cocos/ui/UILayoutManager.cpp @@ -57,7 +57,7 @@ void LinearHorizontalLayoutManager::doLayout(LayoutProtocol* layout) { LinearLayoutParameter::LinearGravity childGravity = layoutParameter->getGravity(); Vec2 ap = child->getAnchorPoint(); - Size cs = child->getSize(); + Size cs = child->getContentSize(); float finalPosX = leftBoundary + (ap.x * cs.width); float finalPosY = layoutSize.height - (1.0f - ap.y) * cs.height; switch (childGravity) @@ -206,7 +206,7 @@ Widget* RelativeLayoutManager::getRelativeWidget(Widget* widget) bool RelativeLayoutManager::caculateFinalPositionWithRelativeWidget(LayoutProtocol *layout) { Vec2 ap = _widget->getAnchorPoint(); - Size cs = _widget->getSize(); + Size cs = _widget->getContentSize(); _finalPositionX = 0.0f; _finalPositionY = 0.0f; @@ -280,7 +280,7 @@ bool RelativeLayoutManager::caculateFinalPositionWithRelativeWidget(LayoutProtoc { return false; } - Size rbs = relativeWidget->getSize(); + Size rbs = relativeWidget->getContentSize(); float locationTop = relativeWidget->getTopBoundary(); _finalPositionY = locationTop + ap.y * cs.height; @@ -320,7 +320,7 @@ bool RelativeLayoutManager::caculateFinalPositionWithRelativeWidget(LayoutProtoc { return false; } - Size rbs = relativeWidget->getSize(); + Size rbs = relativeWidget->getContentSize(); float locationLeft = relativeWidget->getLeftBoundary(); _finalPositionX = locationLeft - (1.0f - ap.x) * cs.width; @@ -360,7 +360,7 @@ bool RelativeLayoutManager::caculateFinalPositionWithRelativeWidget(LayoutProtoc { return false; } - Size rbs = relativeWidget->getSize(); + Size rbs = relativeWidget->getContentSize(); float locationRight = relativeWidget->getRightBoundary(); _finalPositionX = locationRight + ap.x * cs.width; @@ -400,7 +400,7 @@ bool RelativeLayoutManager::caculateFinalPositionWithRelativeWidget(LayoutProtoc { return false; } - Size rbs = relativeWidget->getSize(); + Size rbs = relativeWidget->getContentSize(); float locationBottom = relativeWidget->getBottomBoundary(); _finalPositionY = locationBottom - (1.0f - ap.y) * cs.height; diff --git a/cocos/ui/UIListView.cpp b/cocos/ui/UIListView.cpp index 0d6a5b4cb2..8fd3a2ceec 100644 --- a/cocos/ui/UIListView.cpp +++ b/cocos/ui/UIListView.cpp @@ -96,7 +96,7 @@ void ListView::updateInnerContainerSize() float totalHeight = (length - 1) * _itemsMargin; for (auto& item : _items) { - totalHeight += item->getSize().height; + totalHeight += item->getContentSize().height; } float finalWidth = _contentSize.width; float finalHeight = totalHeight; @@ -109,7 +109,7 @@ void ListView::updateInnerContainerSize() float totalWidth = (length - 1) * _itemsMargin; for (auto& item : _items) { - totalWidth += item->getSize().width; + totalWidth += item->getContentSize().width; } float finalWidth = totalWidth; float finalHeight = _contentSize.height; diff --git a/cocos/ui/UIPageView.cpp b/cocos/ui/UIPageView.cpp index 4a4ad15605..ad9d4e33f7 100644 --- a/cocos/ui/UIPageView.cpp +++ b/cocos/ui/UIPageView.cpp @@ -121,7 +121,7 @@ void PageView::addWidgetToPage(Widget *widget, ssize_t pageIdx, bool forceCreate Layout* PageView::createPage() { Layout* newPage = Layout::create(); - newPage->setSize(getSize()); + newPage->setSize(getContentSize()); return newPage; } @@ -212,20 +212,20 @@ ssize_t PageView::getPageCount()const float PageView::getPositionXByIndex(ssize_t idx)const { - return (getSize().width * (idx-_curPageIdx)); + return (getContentSize().width * (idx-_curPageIdx)); } void PageView::onSizeChanged() { Layout::onSizeChanged(); - _rightBoundary = getSize().width; + _rightBoundary = getContentSize().width; _doLayoutDirty = true; } void PageView::updateAllPagesSize() { - Size selfSize = getSize(); + Size selfSize = getContentSize(); for (auto& page : _pages) { page->setSize(selfSize); @@ -247,7 +247,7 @@ void PageView::updateAllPagesPosition() _curPageIdx = pageCount-1; } - float pageWidth = getSize().width; + float pageWidth = getContentSize().width; for (int i=0; igetPosition(); ssize_t pageCount = this->getPageCount(); float curPageLocation = curPagePos.x; - float pageWidth = getSize().width; + float pageWidth = getContentSize().width; float boundary = pageWidth/2.0f; if (curPageLocation <= -boundary) { diff --git a/cocos/ui/UIScrollView.cpp b/cocos/ui/UIScrollView.cpp index 5977deb432..afd081327e 100644 --- a/cocos/ui/UIScrollView.cpp +++ b/cocos/ui/UIScrollView.cpp @@ -136,20 +136,20 @@ void ScrollView::onSizeChanged() _bounceBottomBoundary = bounceBoundaryParameterY; _bounceLeftBoundary = bounceBoundaryParameterX; _bounceRightBoundary = _contentSize.width - bounceBoundaryParameterX; - Size innerSize = _innerContainer->getSize(); + Size innerSize = _innerContainer->getContentSize(); float orginInnerSizeWidth = innerSize.width; float orginInnerSizeHeight = innerSize.height; float innerSizeWidth = MAX(orginInnerSizeWidth, _contentSize.width); float innerSizeHeight = MAX(orginInnerSizeHeight, _contentSize.height); _innerContainer->setSize(Size(innerSizeWidth, innerSizeHeight)); - _innerContainer->setPosition(Vec2(0, _contentSize.height - _innerContainer->getSize().height)); + _innerContainer->setPosition(Vec2(0, _contentSize.height - _innerContainer->getContentSize().height)); } void ScrollView::setInnerContainerSize(const Size &size) { float innerSizeWidth = _contentSize.width; float innerSizeHeight = _contentSize.height; - Size originalInnerSize = _innerContainer->getSize(); + Size originalInnerSize = _innerContainer->getContentSize(); if (size.width < _contentSize.width) { CCLOG("Inner width <= scrollview width, it will be force sized!"); @@ -172,7 +172,7 @@ void ScrollView::setInnerContainerSize(const Size &size) { case Direction::VERTICAL: { - Size newInnerSize = _innerContainer->getSize(); + Size newInnerSize = _innerContainer->getContentSize(); float offset = originalInnerSize.height - newInnerSize.height; scrollChildren(0.0f, offset); break; @@ -181,7 +181,7 @@ void ScrollView::setInnerContainerSize(const Size &size) { if (_innerContainer->getRightBoundary() <= _contentSize.width) { - Size newInnerSize = _innerContainer->getSize(); + Size newInnerSize = _innerContainer->getContentSize(); float offset = originalInnerSize.width - newInnerSize.width; scrollChildren(offset, 0.0f); } @@ -189,7 +189,7 @@ void ScrollView::setInnerContainerSize(const Size &size) } case Direction::BOTH: { - Size newInnerSize = _innerContainer->getSize(); + Size newInnerSize = _innerContainer->getContentSize(); float offsetY = originalInnerSize.height - newInnerSize.height; float offsetX = 0.0f; if (_innerContainer->getRightBoundary() <= _contentSize.width) @@ -204,29 +204,29 @@ void ScrollView::setInnerContainerSize(const Size &size) } if (_innerContainer->getLeftBoundary() > 0.0f) { - _innerContainer->setPosition(Vec2(_innerContainer->getAnchorPoint().x * _innerContainer->getSize().width, + _innerContainer->setPosition(Vec2(_innerContainer->getAnchorPoint().x * _innerContainer->getContentSize().width, _innerContainer->getPosition().y)); } if (_innerContainer->getRightBoundary() < _contentSize.width) { - _innerContainer->setPosition(Vec2(_contentSize.width - ((1.0f - _innerContainer->getAnchorPoint().x) * _innerContainer->getSize().width), + _innerContainer->setPosition(Vec2(_contentSize.width - ((1.0f - _innerContainer->getAnchorPoint().x) * _innerContainer->getContentSize().width), _innerContainer->getPosition().y)); } if (_innerContainer->getPosition().y > 0.0f) { _innerContainer->setPosition(Vec2(_innerContainer->getPosition().x, - _innerContainer->getAnchorPoint().y * _innerContainer->getSize().height)); + _innerContainer->getAnchorPoint().y * _innerContainer->getContentSize().height)); } if (_innerContainer->getTopBoundary() < _contentSize.height) { _innerContainer->setPosition(Vec2(_innerContainer->getPosition().x, - _contentSize.height - (1.0f - _innerContainer->getAnchorPoint().y) * _innerContainer->getSize().height)); + _contentSize.height - (1.0f - _innerContainer->getAnchorPoint().y) * _innerContainer->getContentSize().height)); } } const Size& ScrollView::getInnerContainerSize() const { - return _innerContainer->getSize(); + return _innerContainer->getContentSize(); } void ScrollView::addChild(Node *child) @@ -522,23 +522,23 @@ void ScrollView::jumpToDestination(const Vec2 &des) case Direction::VERTICAL: if (des.y <= 0) { - finalOffsetY = MAX(des.y, _contentSize.height - _innerContainer->getSize().height); + finalOffsetY = MAX(des.y, _contentSize.height - _innerContainer->getContentSize().height); } break; case Direction::HORIZONTAL: if (des.x <= 0) { - finalOffsetX = MAX(des.x, _contentSize.width - _innerContainer->getSize().width); + finalOffsetX = MAX(des.x, _contentSize.width - _innerContainer->getContentSize().width); } break; case Direction::BOTH: if (des.y <= 0) { - finalOffsetY = MAX(des.y, _contentSize.height - _innerContainer->getSize().height); + finalOffsetY = MAX(des.y, _contentSize.height - _innerContainer->getContentSize().height); } if (des.x <= 0) { - finalOffsetX = MAX(des.x, _contentSize.width - _innerContainer->getSize().width); + finalOffsetX = MAX(des.x, _contentSize.width - _innerContainer->getContentSize().width); } break; default: @@ -1222,7 +1222,7 @@ void ScrollView::scrollToBottom(float time, bool attenuated) void ScrollView::scrollToTop(float time, bool attenuated) { startAutoScrollChildrenWithDestination(Vec2(_innerContainer->getPosition().x, - _contentSize.height - _innerContainer->getSize().height), time, attenuated); + _contentSize.height - _innerContainer->getContentSize().height), time, attenuated); } void ScrollView::scrollToLeft(float time, bool attenuated) @@ -1232,7 +1232,7 @@ void ScrollView::scrollToLeft(float time, bool attenuated) void ScrollView::scrollToRight(float time, bool attenuated) { - startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, + startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getContentSize().width, _innerContainer->getPosition().y), time, attenuated); } @@ -1243,7 +1243,7 @@ void ScrollView::scrollToTopLeft(float time, bool attenuated) CCLOG("Scroll diretion is not both!"); return; } - startAutoScrollChildrenWithDestination(Vec2(0.0f, _contentSize.height - _innerContainer->getSize().height), time, attenuated); + startAutoScrollChildrenWithDestination(Vec2(0.0f, _contentSize.height - _innerContainer->getContentSize().height), time, attenuated); } void ScrollView::scrollToTopRight(float time, bool attenuated) @@ -1253,8 +1253,8 @@ void ScrollView::scrollToTopRight(float time, bool attenuated) CCLOG("Scroll diretion is not both!"); return; } - startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, - _contentSize.height - _innerContainer->getSize().height), time, attenuated); + startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getContentSize().width, + _contentSize.height - _innerContainer->getContentSize().height), time, attenuated); } void ScrollView::scrollToBottomLeft(float time, bool attenuated) @@ -1274,19 +1274,19 @@ void ScrollView::scrollToBottomRight(float time, bool attenuated) CCLOG("Scroll diretion is not both!"); return; } - startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, 0.0f), time, attenuated); + startAutoScrollChildrenWithDestination(Vec2(_contentSize.width - _innerContainer->getContentSize().width, 0.0f), time, attenuated); } void ScrollView::scrollToPercentVertical(float percent, float time, bool attenuated) { - float minY = _contentSize.height - _innerContainer->getSize().height; + float minY = _contentSize.height - _innerContainer->getContentSize().height; float h = - minY; startAutoScrollChildrenWithDestination(Vec2(_innerContainer->getPosition().x, minY + percent * h / 100.0f), time, attenuated); } void ScrollView::scrollToPercentHorizontal(float percent, float time, bool attenuated) { - float w = _innerContainer->getSize().width - _contentSize.width; + float w = _innerContainer->getContentSize().width - _contentSize.width; startAutoScrollChildrenWithDestination(Vec2(-(percent * w / 100.0f), _innerContainer->getPosition().y), time, attenuated); } @@ -1296,9 +1296,9 @@ void ScrollView::scrollToPercentBothDirection(const Vec2& percent, float time, b { return; } - float minY = _contentSize.height - _innerContainer->getSize().height; + float minY = _contentSize.height - _innerContainer->getContentSize().height; float h = - minY; - float w = _innerContainer->getSize().width - _contentSize.width; + float w = _innerContainer->getContentSize().width - _contentSize.width; startAutoScrollChildrenWithDestination(Vec2(-(percent.x * w / 100.0f), minY + percent.y * h / 100.0f), time, attenuated); } @@ -1310,7 +1310,7 @@ void ScrollView::jumpToBottom() void ScrollView::jumpToTop() { jumpToDestination(Vec2(_innerContainer->getPosition().x, - _contentSize.height - _innerContainer->getSize().height)); + _contentSize.height - _innerContainer->getContentSize().height)); } void ScrollView::jumpToLeft() @@ -1320,7 +1320,7 @@ void ScrollView::jumpToLeft() void ScrollView::jumpToRight() { - jumpToDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, _innerContainer->getPosition().y)); + jumpToDestination(Vec2(_contentSize.width - _innerContainer->getContentSize().width, _innerContainer->getPosition().y)); } void ScrollView::jumpToTopLeft() @@ -1330,7 +1330,7 @@ void ScrollView::jumpToTopLeft() CCLOG("Scroll diretion is not both!"); return; } - jumpToDestination(Vec2(0.0f, _contentSize.height - _innerContainer->getSize().height)); + jumpToDestination(Vec2(0.0f, _contentSize.height - _innerContainer->getContentSize().height)); } void ScrollView::jumpToTopRight() @@ -1340,8 +1340,8 @@ void ScrollView::jumpToTopRight() CCLOG("Scroll diretion is not both!"); return; } - jumpToDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, - _contentSize.height - _innerContainer->getSize().height)); + jumpToDestination(Vec2(_contentSize.width - _innerContainer->getContentSize().width, + _contentSize.height - _innerContainer->getContentSize().height)); } void ScrollView::jumpToBottomLeft() @@ -1361,19 +1361,19 @@ void ScrollView::jumpToBottomRight() CCLOG("Scroll diretion is not both!"); return; } - jumpToDestination(Vec2(_contentSize.width - _innerContainer->getSize().width, 0.0f)); + jumpToDestination(Vec2(_contentSize.width - _innerContainer->getContentSize().width, 0.0f)); } void ScrollView::jumpToPercentVertical(float percent) { - float minY = _contentSize.height - _innerContainer->getSize().height; + float minY = _contentSize.height - _innerContainer->getContentSize().height; float h = - minY; jumpToDestination(Vec2(_innerContainer->getPosition().x, minY + percent * h / 100.0f)); } void ScrollView::jumpToPercentHorizontal(float percent) { - float w = _innerContainer->getSize().width - _contentSize.width; + float w = _innerContainer->getContentSize().width - _contentSize.width; jumpToDestination(Vec2(-(percent * w / 100.0f), _innerContainer->getPosition().y)); } @@ -1383,9 +1383,9 @@ void ScrollView::jumpToPercentBothDirection(const Vec2& percent) { return; } - float minY = _contentSize.height - _innerContainer->getSize().height; + float minY = _contentSize.height - _innerContainer->getContentSize().height; float h = - minY; - float w = _innerContainer->getSize().width - _contentSize.width; + float w = _innerContainer->getContentSize().width - _contentSize.width; jumpToDestination(Vec2(-(percent.x * w / 100.0f), minY + percent.y * h / 100.0f)); } diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index 068b6221b5..0e85706cf3 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -251,17 +251,17 @@ void Widget::setEnabled(bool enabled) void Widget::initRenderer() { } - -void Widget::setSize(const Size &size) + +void Widget::setContentSize(const cocos2d::Size &contentSize) { - _customSize = size; + _customSize = contentSize; if (_ignoreSize) { _contentSize = getVirtualRendererSize(); } else { - _contentSize = size; + _contentSize = contentSize; } if (_running) { @@ -269,7 +269,7 @@ void Widget::setSize(const Size &size) Size pSize; if (widgetParent) { - pSize = widgetParent->getSize(); + pSize = widgetParent->getContentSize(); } else { @@ -290,6 +290,11 @@ void Widget::setSize(const Size &size) onSizeChanged(); } +void Widget::setSize(const Size &size) +{ + this->setContentSize(size); +} + void Widget::setSizePercent(const Vec2 &percent) { _sizePercent = percent; @@ -299,7 +304,7 @@ void Widget::setSizePercent(const Vec2 &percent) Widget* widgetParent = getWidgetParent(); if (widgetParent) { - cSize = Size(widgetParent->getSize().width * percent.x , widgetParent->getSize().height * percent.y); + cSize = Size(widgetParent->getContentSize().width * percent.x , widgetParent->getContentSize().height * percent.y); } else { @@ -440,7 +445,7 @@ bool Widget::isIgnoreContentAdaptWithSize() const const Size& Widget::getSize() const { - return _contentSize; + return this->getContentSize(); } const Size& Widget::getCustomSize() const @@ -855,7 +860,7 @@ void Widget::setPosition(const Vec2 &pos) Widget* widgetParent = getWidgetParent(); if (widgetParent) { - Size pSize = widgetParent->getSize(); + Size pSize = widgetParent->getContentSize(); if (pSize.width <= 0.0f || pSize.height <= 0.0f) { _positionPercent = Vec2::ZERO; @@ -877,7 +882,7 @@ void Widget::setPositionPercent(const Vec2 &percent) Widget* widgetParent = getWidgetParent(); if (widgetParent) { - Size parentSize = widgetParent->getSize(); + Size parentSize = widgetParent->getContentSize(); Vec2 absPos = Vec2(parentSize.width * _positionPercent.x, parentSize.height * _positionPercent.y); setPosition(absPos); } diff --git a/cocos/ui/UIWidget.h b/cocos/ui/UIWidget.h index c059f19a5e..4a85932bbc 100644 --- a/cocos/ui/UIWidget.h +++ b/cocos/ui/UIWidget.h @@ -371,7 +371,8 @@ public: * * @param size that is widget's size */ - virtual void setSize(const Size &size); + CC_DEPRECATED_ATTRIBUTE virtual void setSize(const Size &size); + virtual void setContentSize(const Size& contentSize) override; /** * Changes the percent that is widget's percent size @@ -403,7 +404,7 @@ public: * * @return size */ - const Size& getSize() const; + CC_DEPRECATED_ATTRIBUTE const Size& getSize() const; const Size& getCustomSize() const; diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp index e0c7dad219..df69db7b8a 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp @@ -1329,7 +1329,7 @@ LabelShadowTest::LabelShadowTest() slider->loadBarTexture("cocosui/sliderTrack.png"); slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", ""); slider->loadProgressBarTexture("cocosui/sliderProgress.png"); - slider->setPosition(Vec2(size.width / 2.0f, size.height * 0.15f + slider->getSize().height * 2.0f)); + slider->setPosition(Vec2(size.width / 2.0f, size.height * 0.15f + slider->getContentSize().height * 2.0f)); slider->setPercent(52); slider->addEventListener(CC_CALLBACK_2(LabelShadowTest::sliderEvent, this)); addChild(slider); @@ -1795,7 +1795,7 @@ LabelLineHeightTest::LabelLineHeightTest() slider->loadBarTexture("cocosui/sliderTrack.png"); slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", ""); slider->loadProgressBarTexture("cocosui/sliderProgress.png"); - slider->setPosition(Vec2(size.width / 2.0f, size.height * 0.15f + slider->getSize().height * 2.0f)); + slider->setPosition(Vec2(size.width / 2.0f, size.height * 0.15f + slider->getContentSize().height * 2.0f)); slider->setPercent(label->getLineHeight()); slider->addEventListener(CC_CALLBACK_2(LabelLineHeightTest::sliderEvent, this)); addChild(slider); @@ -1839,7 +1839,7 @@ LabelAdditionalKerningTest::LabelAdditionalKerningTest() slider->loadBarTexture("cocosui/sliderTrack.png"); slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", ""); slider->loadProgressBarTexture("cocosui/sliderProgress.png"); - slider->setPosition(Vec2(size.width / 2.0f, size.height * 0.15f + slider->getSize().height * 2.0f)); + slider->setPosition(Vec2(size.width / 2.0f, size.height * 0.15f + slider->getContentSize().height * 2.0f)); slider->setPercent(0); slider->addEventListener(CC_CALLBACK_2(LabelAdditionalKerningTest::sliderEvent, this)); addChild(slider); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp index 9e4d5f9bef..1db0c35f4d 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp @@ -18,7 +18,7 @@ bool UIButtonTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the button events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf",32); @@ -31,7 +31,7 @@ bool UIButtonTest::init() alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); @@ -90,7 +90,7 @@ bool UIButtonTest_Scale9::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the button events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32); @@ -102,7 +102,7 @@ bool UIButtonTest_Scale9::init() Text* alert = Text::create("Button scale9 render", "fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the button @@ -159,7 +159,7 @@ bool UIButtonTest_PressedAction::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the button events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf",32); @@ -172,7 +172,7 @@ bool UIButtonTest_PressedAction::init() alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); @@ -229,7 +229,7 @@ bool UIButtonTest_Title::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the text button events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32); @@ -241,7 +241,7 @@ bool UIButtonTest_Title::init() Text* alert = Text::create("Button with title", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp index 92f99b224d..f5100ed634 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp @@ -23,7 +23,7 @@ bool UIButtonTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -51,8 +51,8 @@ bool UIButtonTest_Editor::init() _displayValueLabel->setFontName("fonts/Marker Felt.ttf"); _displayValueLabel->setFontSize(30); _displayValueLabel->setString("No event"); - _displayValueLabel->setPosition(Vec2(_layout->getSize().width / 2, - _layout->getSize().height - _displayValueLabel->getSize().height * 1.75f)); + _displayValueLabel->setPosition(Vec2(_layout->getContentSize().width / 2, + _layout->getContentSize().height - _displayValueLabel->getContentSize().height * 1.75f)); _touchGroup->addChild(_displayValueLabel); return true; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp index a8741a1ae8..bb08a28141 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp @@ -18,7 +18,7 @@ bool UICheckBoxTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize();; + Size widgetSize = _widget->getContentSize();; // Add a label in which the checkbox events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32); @@ -29,7 +29,7 @@ bool UICheckBoxTest::init() // Add the alert Text* alert = Text::create("CheckBox","fonts/Marker Felt.ttf",30 ); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the checkbox diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp index 5ea65d689a..18df2c9528 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp @@ -23,7 +23,7 @@ bool UICheckBoxTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UICheckBox_Editor/ui_checkbox_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -41,8 +41,8 @@ bool UICheckBoxTest_Editor::init() _displayValueLabel->setFontName("fonts/Marker Felt.ttf"); _displayValueLabel->setFontSize(30); _displayValueLabel->setString("No event"); - _displayValueLabel->setPosition(Vec2(_layout->getSize().width / 2, - _layout->getSize().height - _displayValueLabel->getSize().height * 1.75f)); + _displayValueLabel->setPosition(Vec2(_layout->getContentSize().width / 2, + _layout->getContentSize().height - _displayValueLabel->getContentSize().height * 1.75f)); _touchGroup->addChild(_displayValueLabel); return true; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp index 57159b104a..7398d994c2 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp @@ -9,12 +9,12 @@ bool UIImageViewTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); Text* alert = Text::create("ImageView", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); @@ -39,12 +39,12 @@ bool UIImageViewTest_Scale9::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); Text* alert = Text::create("ImageView scale9 render", "fonts/Marker Felt.ttf", 26); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 2.125f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 2.125f)); _uiLayer->addChild(alert); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp index c0e9f0ba16..804a816f05 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest_Editor.cpp @@ -12,7 +12,7 @@ bool UIImageViewTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIImageView_Editor/ui_ImageView_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp index 3f84b98642..dc857bed18 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp @@ -17,13 +17,13 @@ bool UILayoutTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout", "fonts/Marker Felt.ttf", 30 ); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); @@ -34,28 +34,28 @@ bool UILayoutTest::init() // Create the layout Layout* layout = Layout::create(); layout->setSize(Size(280, 150)); - Size backgroundSize = background->getSize(); + Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); - button->setPosition(Vec2(button->getSize().width / 2.0f, - layout->getSize().height - button->getSize().height / 2.0f)); + button->setPosition(Vec2(button->getContentSize().width / 2.0f, + layout->getContentSize().height - button->getContentSize().height / 2.0f)); layout->addChild(button); Button* titleButton = Button::create("cocosui/backtotopnormal.png", "cocosui/backtotoppressed.png"); titleButton->setTitleText("Title Button"); - titleButton->setPosition(Vec2(layout->getSize().width / 2.0f, layout->getSize().height / 2.0f)); + titleButton->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(titleButton); Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); - button_scale9->setPosition(Vec2(layout->getSize().width - button_scale9->getSize().width / 2.0f, - button_scale9->getSize().height / 2.0f)); + button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, + button_scale9->getContentSize().height / 2.0f)); layout->addChild(button_scale9); @@ -79,13 +79,13 @@ bool UILayoutTest_Color::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout color render", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); @@ -100,27 +100,27 @@ bool UILayoutTest_Color::init() layout->setSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); - button->setPosition(Vec2(button->getSize().width / 2.0f, - layout->getSize().height - button->getSize().height / 2.0f)); + button->setPosition(Vec2(button->getContentSize().width / 2.0f, + layout->getContentSize().height - button->getContentSize().height / 2.0f)); layout->addChild(button); Button* titleButton = Button::create("cocosui/backtotopnormal.png", "cocosui/backtotoppressed.png"); titleButton->setTitleText("Title Button"); - titleButton->setPosition(Vec2(layout->getSize().width / 2.0f, layout->getSize().height / 2.0f)); + titleButton->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(titleButton); Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); - button_scale9->setPosition(Vec2(layout->getSize().width - button_scale9->getSize().width / 2.0f, - button_scale9->getSize().height / 2.0f)); + button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, + button_scale9->getContentSize().height / 2.0f)); layout->addChild(button_scale9); @@ -143,13 +143,13 @@ bool UILayoutTest_Gradient::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout gradient render", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); @@ -164,27 +164,27 @@ bool UILayoutTest_Gradient::init() layout->setSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); - button->setPosition(Vec2(button->getSize().width / 2.0f, - layout->getSize().height - button->getSize().height / 2.0f)); + button->setPosition(Vec2(button->getContentSize().width / 2.0f, + layout->getContentSize().height - button->getContentSize().height / 2.0f)); layout->addChild(button); Button* titleButton = Button::create("cocosui/backtotopnormal.png", "cocosui/backtotoppressed.png"); titleButton->setTitleText("Title Button"); - titleButton->setPosition(Vec2(layout->getSize().width / 2.0f, layout->getSize().height / 2.0f)); + titleButton->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(titleButton); Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); - button_scale9->setPosition(Vec2(layout->getSize().width - button_scale9->getSize().width / 2.0f, - button_scale9->getSize().height / 2.0f)); + button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, + button_scale9->getContentSize().height / 2.0f)); layout->addChild(button_scale9); @@ -207,12 +207,12 @@ bool UILayoutTest_BackGroundImage::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout background image", "fonts/Marker Felt.ttf", 20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 4.5f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 4.5f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -226,26 +226,26 @@ bool UILayoutTest_BackGroundImage::init() layout->setSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); - button->setPosition(Vec2(button->getSize().width / 2.0f, - layout->getSize().height - button->getSize().height / 2.0f)); + button->setPosition(Vec2(button->getContentSize().width / 2.0f, + layout->getContentSize().height - button->getContentSize().height / 2.0f)); layout->addChild(button); Button* titleButton = Button::create("cocosui/backtotopnormal.png", "cocosui/backtotoppressed.png"); titleButton->setTitleText("Title Button"); - titleButton->setPosition(Vec2(layout->getSize().width / 2.0f, layout->getSize().height / 2.0f)); + titleButton->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(titleButton); Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); - button_scale9->setPosition(Vec2(layout->getSize().width - button_scale9->getSize().width / 2.0f, - button_scale9->getSize().height / 2.0f)); + button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, + button_scale9->getContentSize().height / 2.0f)); layout->addChild(button_scale9); @@ -268,12 +268,12 @@ bool UILayoutTest_BackGroundImage_Scale9::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout background image scale9", "fonts/Marker Felt.ttf", 20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 4.5f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 4.5f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -287,27 +287,27 @@ bool UILayoutTest_BackGroundImage_Scale9::init() layout->setSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); - button->setPosition(Vec2(button->getSize().width / 2.0f, - layout->getSize().height - button->getSize().height / 2.0f)); + button->setPosition(Vec2(button->getContentSize().width / 2.0f, + layout->getContentSize().height - button->getContentSize().height / 2.0f)); layout->addChild(button); Button* titleButton = Button::create("cocosui/backtotopnormal.png", "cocosui/backtotoppressed.png"); titleButton->setTitleText("Title Button"); - titleButton->setPosition(Vec2(layout->getSize().width / 2.0f, layout->getSize().height / 2.0f)); + titleButton->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(titleButton); Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); - button_scale9->setPosition(Vec2(layout->getSize().width - button_scale9->getSize().width / 2.0f, - button_scale9->getSize().height / 2.0f)); + button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, + button_scale9->getContentSize().height / 2.0f)); layout->addChild(button_scale9); return true; @@ -329,13 +329,13 @@ bool UILayoutTest_Layout_Linear_Vertical::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout Linear Vertical", "fonts/Marker Felt.ttf", 20); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 4.5f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 4.5f)); _uiLayer->addChild(alert); @@ -347,11 +347,11 @@ bool UILayoutTest_Layout_Linear_Vertical::init() Layout* layout = Layout::create(); layout->setLayoutType(LayoutType::VERTICAL); layout->setSize(Size(280, 150)); - Size backgroundSize = background->getSize(); + Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); @@ -405,12 +405,12 @@ bool UILayoutTest_Layout_Linear_Horizontal::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout Linear Horizontal", "fonts/Marker Felt.ttf", 20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 4.5f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 4.5f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -422,11 +422,11 @@ bool UILayoutTest_Layout_Linear_Horizontal::init() layout->setLayoutType(LayoutType::HORIZONTAL); layout->setClippingEnabled(true); layout->setSize(Size(280, 150)); - Size backgroundSize = background->getSize(); + Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); @@ -479,12 +479,12 @@ bool UILayoutTest_Layout_Relative_Align_Parent::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout Relative Align Parent", "fonts/Marker Felt.ttf", 20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 4.5f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 4.5f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -497,11 +497,11 @@ bool UILayoutTest_Layout_Relative_Align_Parent::init() layout->setSize(Size(280, 150)); layout->setBackGroundColorType(Layout::BackGroundColorType::SOLID); layout->setBackGroundColor(Color3B::GREEN); - Size backgroundSize = background->getSize(); + Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); // top left @@ -614,12 +614,12 @@ bool UILayoutTest_Layout_Relative_Location::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("Layout Relative Location", "fonts/Marker Felt.ttf", 20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 4.5f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 4.5f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -630,11 +630,11 @@ bool UILayoutTest_Layout_Relative_Location::init() Layout* layout = Layout::create(); layout->setLayoutType(LayoutType::RELATIVE); layout->setSize(Size(280, 150)); - Size backgroundSize = background->getSize(); + Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - layout->getSize().width) / 2.0f, + (backgroundSize.width - layout->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - layout->getSize().height) / 2.0f)); + (backgroundSize.height - layout->getContentSize().height) / 2.0f)); _uiLayer->addChild(layout); // center diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp index 792ed2b36a..7b3b597491 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp @@ -22,7 +22,7 @@ bool UILayoutTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Editor/ui_layout_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -35,8 +35,8 @@ bool UILayoutTest_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -44,8 +44,8 @@ bool UILayoutTest_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -77,7 +77,7 @@ bool UILayoutTest_Color_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Color_Editor/ui_layout_color_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -90,8 +90,8 @@ bool UILayoutTest_Color_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -99,8 +99,8 @@ bool UILayoutTest_Color_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -132,7 +132,7 @@ bool UILayoutTest_Gradient_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Gradient_Color_Editor/ui_layout_gradient_color_editor_1_0.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -145,8 +145,8 @@ bool UILayoutTest_Gradient_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -154,8 +154,8 @@ bool UILayoutTest_Gradient_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -187,7 +187,7 @@ bool UILayoutTest_BackGroundImage_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_BackgroundImage_Editor/ui_layout_backgroundimage_editor_1_0_0.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -200,8 +200,8 @@ bool UILayoutTest_BackGroundImage_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -209,8 +209,8 @@ bool UILayoutTest_BackGroundImage_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -242,7 +242,7 @@ bool UILayoutTest_BackGroundImage_Scale9_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Scale9_BackgroundImage_Editor/ui_layout_scale9_backgroundimage_editor.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -255,8 +255,8 @@ bool UILayoutTest_BackGroundImage_Scale9_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -264,8 +264,8 @@ bool UILayoutTest_BackGroundImage_Scale9_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -297,7 +297,7 @@ bool UILayoutTest_Layout_Linear_Vertical_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Vertical_Layout_Editor/ui_layout_linear_vertical_layout_editor.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -310,8 +310,8 @@ bool UILayoutTest_Layout_Linear_Vertical_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -319,8 +319,8 @@ bool UILayoutTest_Layout_Linear_Vertical_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -352,7 +352,7 @@ bool UILayoutTest_Layout_Linear_Horizontal_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Linear_Horizontal_Layout_Editor/ui_layout_linear_horizontal_layout_editor.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -365,8 +365,8 @@ bool UILayoutTest_Layout_Linear_Horizontal_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -374,8 +374,8 @@ bool UILayoutTest_Layout_Linear_Horizontal_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -408,7 +408,7 @@ bool UILayoutTest_Layout_Relative_Align_Parent_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Parent_Editor/ui_layout_relative_align_parent_editor.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -421,8 +421,8 @@ bool UILayoutTest_Layout_Relative_Align_Parent_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -430,8 +430,8 @@ bool UILayoutTest_Layout_Relative_Align_Parent_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -463,7 +463,7 @@ bool UILayoutTest_Layout_Relative_Location_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILayout_Editor/UILayout_Relative_Align_Location_Editor/ui_layout_relative_align_location_editor.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -476,8 +476,8 @@ bool UILayoutTest_Layout_Relative_Location_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -485,8 +485,8 @@ bool UILayoutTest_Layout_Relative_Location_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp index ce6a001d2e..b108fab1b9 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp @@ -22,7 +22,7 @@ bool UIListViewTest_Vertical::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); _displayValueLabel = Text::create("Move by vertical direction", "fonts/Marker Felt.ttf", 32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); @@ -34,7 +34,7 @@ bool UIListViewTest_Vertical::init() Text* alert = Text::create("ListView vertical", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -62,9 +62,9 @@ bool UIListViewTest_Vertical::init() listView->setBackGroundImageScale9Enabled(true); listView->setSize(Size(240, 130)); listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - listView->getSize().width) / 2.0f, + (backgroundSize.width - listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - listView->getSize().height) / 2.0f)); + (backgroundSize.height - listView->getContentSize().height) / 2.0f)); listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEvent, this)); _uiLayer->addChild(listView); @@ -75,9 +75,9 @@ bool UIListViewTest_Vertical::init() Layout* default_item = Layout::create(); default_item->setTouchEnabled(true); - default_item->setSize(default_button->getSize()); - default_button->setPosition(Vec2(default_item->getSize().width / 2.0f, - default_item->getSize().height / 2.0f)); + default_item->setSize(default_button->getContentSize()); + default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f, + default_item->getContentSize().height / 2.0f)); default_item->addChild(default_button); // set model @@ -107,11 +107,11 @@ bool UIListViewTest_Vertical::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getSize()); + custom_button->setSize(default_button->getContentSize()); Layout *custom_item = Layout::create(); - custom_item->setSize(custom_button->getSize()); - custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); + custom_item->setSize(custom_button->getContentSize()); + custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); listView->addChild(custom_item); @@ -124,11 +124,11 @@ bool UIListViewTest_Vertical::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getSize()); + custom_button->setSize(default_button->getContentSize()); Layout *custom_item = Layout::create(); - custom_item->setSize(custom_button->getSize()); - custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); + custom_item->setSize(custom_button->getContentSize()); + custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); custom_item->setTag(1); @@ -204,7 +204,7 @@ bool UIListViewTest_Horizontal::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); _displayValueLabel = Text::create("Move by horizontal direction", "fonts/Marker Felt.ttf", 32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); @@ -217,7 +217,7 @@ bool UIListViewTest_Horizontal::init() Text* alert = Text::create("ListView horizontal", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -246,9 +246,9 @@ bool UIListViewTest_Horizontal::init() listView->setBackGroundImageScale9Enabled(true); listView->setSize(Size(240, 130)); listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - listView->getSize().width) / 2.0f, + (backgroundSize.width - listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - listView->getSize().height) / 2.0f)); + (backgroundSize.height - listView->getContentSize().height) / 2.0f)); listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Horizontal::selectedItemEvent, this)); _uiLayer->addChild(listView); @@ -259,8 +259,8 @@ bool UIListViewTest_Horizontal::init() Layout *default_item = Layout::create(); default_item->setTouchEnabled(true); - default_item->setSize(default_button->getSize()); - default_button->setPosition(Vec2(default_item->getSize().width / 2.0f, default_item->getSize().height / 2.0f)); + default_item->setSize(default_button->getContentSize()); + default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f, default_item->getContentSize().height / 2.0f)); default_item->addChild(default_button); // set model @@ -284,11 +284,11 @@ bool UIListViewTest_Horizontal::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getSize()); + custom_button->setSize(default_button->getContentSize()); Layout* custom_item = Layout::create(); - custom_item->setSize(custom_button->getSize()); - custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); + custom_item->setSize(custom_button->getContentSize()); + custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); listView->pushBackCustomItem(custom_item); @@ -301,11 +301,11 @@ bool UIListViewTest_Horizontal::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getSize()); + custom_button->setSize(default_button->getContentSize()); Layout* custom_item = Layout::create(); - custom_item->setSize(custom_button->getSize()); - custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); + custom_item->setSize(custom_button->getContentSize()); + custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); listView->insertCustomItem(custom_item, items_count); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp index 15f5f5567a..022f6d893c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp @@ -22,7 +22,7 @@ bool UIListViewTest_Vertical_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Vertical_Editor/ui_listview_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -38,8 +38,8 @@ bool UIListViewTest_Vertical_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback,this)); @@ -49,8 +49,8 @@ bool UIListViewTest_Vertical_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback,this)); @@ -83,7 +83,7 @@ bool UIListViewTest_Horizontal_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIListView_Editor/UIListView_Horizontal_Editor/ui_listview_horizontal_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -96,8 +96,8 @@ bool UIListViewTest_Horizontal_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback,this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -105,8 +105,8 @@ bool UIListViewTest_Horizontal_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.cpp index 97fe852f1e..6b2b36276c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.cpp @@ -22,19 +22,19 @@ bool UILoadingBarTest_Left::init() { scheduleUpdate(); - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("LoadingBar left", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the loading bar LoadingBar* loadingBar = LoadingBar::create("cocosui/sliderProgress.png"); loadingBar->setTag(0); loadingBar->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f + loadingBar->getSize().height / 4.0f)); + widgetSize.height / 2.0f + loadingBar->getContentSize().height / 4.0f)); _uiLayer->addChild(loadingBar); @@ -100,12 +100,12 @@ bool UILoadingBarTest_Right::init() { scheduleUpdate(); - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text *alert = Text::create("LoadingBar right", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the loading bar @@ -114,7 +114,7 @@ bool UILoadingBarTest_Right::init() loadingBar->setDirection(LoadingBar::Direction::RIGHT); loadingBar->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f + loadingBar->getSize().height / 4.0f)); + widgetSize.height / 2.0f + loadingBar->getContentSize().height / 4.0f)); _uiLayer->addChild(loadingBar); @@ -180,12 +180,12 @@ bool UILoadingBarTest_Left_Scale9::init() { scheduleUpdate(); - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("LoadingBar left scale9 render", "fonts/Marker Felt.ttf", 20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 2.7f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 2.7f)); _uiLayer->addChild(alert); // Create the loading bar @@ -196,7 +196,7 @@ bool UILoadingBarTest_Left_Scale9::init() loadingBar->setSize(Size(300, 13)); loadingBar->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f + loadingBar->getSize().height / 4.0f)); + widgetSize.height / 2.0f + loadingBar->getContentSize().height / 4.0f)); _uiLayer->addChild(loadingBar); @@ -262,12 +262,12 @@ bool UILoadingBarTest_Right_Scale9::init() { scheduleUpdate(); - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text *alert = Text::create("LoadingBar right scale9 render", "fonts/Marker Felt.ttf", 20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 2.7f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 2.7f)); _uiLayer->addChild(alert); // Create the loading bar @@ -279,7 +279,7 @@ bool UILoadingBarTest_Right_Scale9::init() loadingBar->setDirection(LoadingBar::Direction::RIGHT); loadingBar->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f + loadingBar->getSize().height / 4.0f)); + widgetSize.height / 2.0f + loadingBar->getContentSize().height / 4.0f)); _uiLayer->addChild(loadingBar); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp index 63c0c15386..507d4b5e40 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.cpp @@ -24,7 +24,7 @@ bool UILoadingBarTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILoadingBar_Editor/ui_loadingbar_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp index 66a1e79989..9f47bea3b3 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp @@ -18,7 +18,7 @@ bool UIPageViewTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the dragpanel events will be displayed _displayValueLabel = Text::create("Move by horizontal direction", "fonts/Marker Felt.ttf", 32); @@ -31,7 +31,7 @@ bool UIPageViewTest::init() // Add the black background Text* alert = Text::create("PageView", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -43,9 +43,9 @@ bool UIPageViewTest::init() pageView->setSize(Size(240.0f, 130.0f)); Size backgroundSize = background->getContentSize(); pageView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - pageView->getSize().width) / 2.0f, + (backgroundSize.width - pageView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - pageView->getSize().height) / 2.0f)); + (backgroundSize.height - pageView->getContentSize().height) / 2.0f)); pageView->removeAllPages(); @@ -58,12 +58,12 @@ bool UIPageViewTest::init() ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); imageView->setScale9Enabled(true); imageView->setSize(Size(240, 130)); - imageView->setPosition(Vec2(layout->getSize().width / 2.0f, layout->getSize().height / 2.0f)); + imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(imageView); Text* label = Text::create(StringUtils::format("page %d",(i+1)), "fonts/Marker Felt.ttf", 30); label->setColor(Color3B(192, 192, 192)); - label->setPosition(Vec2(layout->getSize().width / 2.0f, layout->getSize().height / 2.0f)); + label->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(label); pageView->insertPage(layout,i); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp index cec0c535f9..e593f4f0dd 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest_Editor.cpp @@ -23,7 +23,7 @@ bool UIPageViewTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIPageView_Editor/ui_pageview_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -36,8 +36,8 @@ bool UIPageViewTest_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -45,8 +45,8 @@ bool UIPageViewTest_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.cpp index 455dd43d4d..c811ed5ce2 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.cpp @@ -18,19 +18,19 @@ bool UIRichTextTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text *alert = Text::create("RichText", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.125)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.125)); _widget->addChild(alert); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); button->setTouchEnabled(true); button->setTitleText("switch"); - button->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + button->getSize().height * 2.5)); + button->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + button->getContentSize().height * 2.5)); // button->addTouchEventListener(this, toucheventselector(UIRichTextTest::touchEvent)); button->addTouchEventListener(CC_CALLBACK_2(UIRichTextTest::touchEvent, this)); button->setLocalZOrder(10); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene.cpp index 7d739ba69a..1eabf9a281 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene.cpp @@ -30,7 +30,7 @@ bool UIScene::init() _uiLayer->addChild(_widget); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _widget->getSize(); + Size rootSize = _widget->getContentSize(); _uiLayer->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp index d2119e1f43..235ea8f0ba 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp @@ -18,7 +18,7 @@ bool UIScrollViewTest_Vertical::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the scrollview alert will be displayed _displayValueLabel = Text::create("Move by vertical direction", "fonts/Marker Felt.ttf", 32); @@ -30,7 +30,7 @@ bool UIScrollViewTest_Vertical::init() // Add the alert Text* alert = Text::create("ScrollView vertical", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -42,34 +42,34 @@ bool UIScrollViewTest_Vertical::init() scrollView->setSize(Size(280.0f, 150.0f)); Size backgroundSize = background->getContentSize(); scrollView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - scrollView->getSize().width) / 2.0f, + (backgroundSize.width - scrollView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - scrollView->getSize().height) / 2.0f)); + (backgroundSize.height - scrollView->getContentSize().height) / 2.0f)); _uiLayer->addChild(scrollView); ImageView* imageView = ImageView::create("cocosui/ccicon.png"); - float innerWidth = scrollView->getSize().width; - float innerHeight = scrollView->getSize().height + imageView->getSize().height; + float innerWidth = scrollView->getContentSize().width; + float innerHeight = scrollView->getContentSize().height + imageView->getContentSize().height; scrollView->setInnerContainerSize(Size(innerWidth, innerHeight)); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); - button->setPosition(Vec2(innerWidth / 2.0f, scrollView->getInnerContainerSize().height - button->getSize().height / 2.0f)); + button->setPosition(Vec2(innerWidth / 2.0f, scrollView->getInnerContainerSize().height - button->getContentSize().height / 2.0f)); scrollView->addChild(button); Button* titleButton = Button::create("cocosui/backtotopnormal.png", "cocosui/backtotoppressed.png"); titleButton->setTitleText("Title Button"); - titleButton->setPosition(Vec2(innerWidth / 2.0f, button->getBottomBoundary() - button->getSize().height)); + titleButton->setPosition(Vec2(innerWidth / 2.0f, button->getBottomBoundary() - button->getContentSize().height)); scrollView->addChild(titleButton); Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); - button_scale9->setPosition(Vec2(innerWidth / 2.0f, titleButton->getBottomBoundary() - titleButton->getSize().height)); + button_scale9->setPosition(Vec2(innerWidth / 2.0f, titleButton->getBottomBoundary() - titleButton->getContentSize().height)); scrollView->addChild(button_scale9); - imageView->setPosition(Vec2(innerWidth / 2.0f, imageView->getSize().height / 2.0f)); + imageView->setPosition(Vec2(innerWidth / 2.0f, imageView->getContentSize().height / 2.0f)); scrollView->addChild(imageView); return true; @@ -93,7 +93,7 @@ bool UIScrollViewTest_Horizontal::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the scrollview alert will be displayed _displayValueLabel = Text::create("Move by horizontal direction","fonts/Marker Felt.ttf",32); @@ -103,7 +103,7 @@ bool UIScrollViewTest_Horizontal::init() Text* alert = Text::create("ScrollView horizontal","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -115,41 +115,41 @@ bool UIScrollViewTest_Horizontal::init() scrollView->setBounceEnabled(true); scrollView->setDirection(ui::ScrollView::Direction::HORIZONTAL); scrollView->setSize(Size(280.0f, 150.0f)); - scrollView->setInnerContainerSize(scrollView->getSize()); + scrollView->setInnerContainerSize(scrollView->getContentSize()); Size backgroundSize = background->getContentSize(); scrollView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - scrollView->getSize().width) / 2.0f, + (backgroundSize.width - scrollView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - scrollView->getSize().height) / 2.0f)); + (backgroundSize.height - scrollView->getContentSize().height) / 2.0f)); _uiLayer->addChild(scrollView); ImageView* imageView = ImageView::create("cocosui/ccicon.png"); - float innerWidth = scrollView->getSize().width + imageView->getSize().width; - float innerHeight = scrollView->getSize().height; + float innerWidth = scrollView->getContentSize().width + imageView->getContentSize().width; + float innerHeight = scrollView->getContentSize().height; scrollView->setInnerContainerSize(Size(innerWidth, innerHeight)); Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); - button->setPosition(Vec2(button->getSize().width / 2.0f, - scrollView->getInnerContainerSize().height - button->getSize().height / 2.0f)); + button->setPosition(Vec2(button->getContentSize().width / 2.0f, + scrollView->getInnerContainerSize().height - button->getContentSize().height / 2.0f)); scrollView->addChild(button); Button* titleButton = Button::create("cocosui/backtotopnormal.png", "cocosui/backtotoppressed.png"); titleButton->setTitleText("Title Button"); - titleButton->setPosition(Vec2(button->getRightBoundary() + button->getSize().width / 2.0f, - button->getBottomBoundary() - button->getSize().height / 2.0f)); + titleButton->setPosition(Vec2(button->getRightBoundary() + button->getContentSize().width / 2.0f, + button->getBottomBoundary() - button->getContentSize().height / 2.0f)); scrollView->addChild(titleButton); Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); - button_scale9->setPosition(Vec2(titleButton->getRightBoundary() + titleButton->getSize().width / 2.0f, - titleButton->getBottomBoundary() - titleButton->getSize().height / 2.0f)); + button_scale9->setPosition(Vec2(titleButton->getRightBoundary() + titleButton->getContentSize().width / 2.0f, + titleButton->getBottomBoundary() - titleButton->getContentSize().height / 2.0f)); scrollView->addChild(button_scale9); - imageView->setPosition(Vec2(innerWidth - imageView->getSize().width / 2.0f, - button_scale9->getBottomBoundary() - button_scale9->getSize().height / 2.0f)); + imageView->setPosition(Vec2(innerWidth - imageView->getContentSize().width / 2.0f, + button_scale9->getBottomBoundary() - button_scale9->getContentSize().height / 2.0f)); scrollView->addChild(imageView); return true; @@ -173,18 +173,18 @@ bool UIScrollViewTest_Both::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize();; + Size widgetSize = _widget->getContentSize();; // Add a label in which the dragpanel events will be displayed _displayValueLabel = Text::create("Move by any direction","fonts/Marker Felt.ttf",32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); - _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getSize().height * 1.5f)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f)); _uiLayer->addChild(_displayValueLabel); // Add the alert Text* alert = Text::create("ScrollView both","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -201,9 +201,9 @@ bool UIScrollViewTest_Both::init() scrollView->setSize(Size(210, 122.5)); Size backgroundSize = background->getContentSize(); scrollView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - scrollView->getSize().width) / 2.0f, + (backgroundSize.width - scrollView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - scrollView->getSize().height) / 2.0f)); + (backgroundSize.height - scrollView->getContentSize().height) / 2.0f)); ImageView* imageView = ImageView::create("Hello.png"); scrollView->addChild(imageView); @@ -234,18 +234,18 @@ bool UIScrollViewTest_ScrollToPercentBothDirection::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the dragpanel events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf",30); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); - _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getSize().height * 1.5f)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f)); _uiLayer->addChild(_displayValueLabel); // Add the alert Text* alert = Text::create("ScrollView scroll to percent both directrion","fonts/Marker Felt.ttf",20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 4.5)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 4.5)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -260,9 +260,9 @@ bool UIScrollViewTest_ScrollToPercentBothDirection::init() sc->setSize(Size(100,100)); Size backgroundSize = background->getContentSize(); sc->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - sc->getSize().width) / 2.0f, + (backgroundSize.width - sc->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - sc->getSize().height) / 2.0f)); + (backgroundSize.height - sc->getContentSize().height) / 2.0f)); sc->scrollToPercentBothDirection(Vec2(50, 50), 1, true); ImageView* iv = ImageView::create("cocosui/Hello.png"); iv->setPosition(Vec2(240, 160)); @@ -289,18 +289,18 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Bounce::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the dragpanel events will be displayed _displayValueLabel = Text::create("No Event","fonts/Marker Felt.ttf",32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); - _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getSize().height * 1.5f)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f)); _uiLayer->addChild(_displayValueLabel); // Add the alert Text* alert = Text::create("ScrollView scroll to percent both directrion bounce","fonts/Marker Felt.ttf",20); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 4.5)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 4.5)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -316,9 +316,9 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Bounce::init() sc->setSize(Size(100,100)); Size backgroundSize = background->getContentSize(); sc->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - sc->getSize().width) / 2.0f, + (backgroundSize.width - sc->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - sc->getSize().height) / 2.0f)); + (backgroundSize.height - sc->getContentSize().height) / 2.0f)); sc->scrollToPercentBothDirection(Vec2(50, 50), 1, true); ImageView* iv = ImageView::create("cocosui/Hello.png"); iv->setPosition(Vec2(240, 160)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp index dc7584afe9..d247eb9fa5 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp @@ -22,7 +22,7 @@ bool UIScrollViewTest_Vertical_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Vertical_Editor/ui_scrollview_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -35,8 +35,8 @@ bool UIScrollViewTest_Vertical_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -44,8 +44,8 @@ bool UIScrollViewTest_Vertical_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -77,7 +77,7 @@ bool UIScrollViewTest_Horizontal_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Horizontal_Editor/ui_scrollview_horizontal_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -90,8 +90,8 @@ bool UIScrollViewTest_Horizontal_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -99,8 +99,8 @@ bool UIScrollViewTest_Horizontal_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -132,7 +132,7 @@ bool UIScrollViewTest_Both_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIScrollView_Editor/UIScrollView_Both_Editor/ui_scrollview_both_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -145,8 +145,8 @@ bool UIScrollViewTest_Both_Editor::init() Button* left_button = Button::create(); left_button->loadTextures("Images/b1.png", "Images/b2.png", ""); - left_button->setPosition(Vec2(_layout->getSize().width / 2 - left_button->getSize().width, - left_button->getSize().height * 0.625)); + left_button->setPosition(Vec2(_layout->getContentSize().width / 2 - left_button->getContentSize().width, + left_button->getContentSize().height * 0.625)); left_button->setTouchEnabled(true); left_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::previousCallback, this)); left_button->setLocalZOrder(_layout->getLocalZOrder() + 1); @@ -154,8 +154,8 @@ bool UIScrollViewTest_Both_Editor::init() Button* right_button = Button::create(); right_button->loadTextures("Images/f1.png", "Images/f2.png", ""); - right_button->setPosition(Vec2(_layout->getSize().width / 2 + right_button->getSize().width, - right_button->getSize().height * 0.625)); + right_button->setPosition(Vec2(_layout->getContentSize().width / 2 + right_button->getContentSize().width, + right_button->getContentSize().height * 0.625)); right_button->setTouchEnabled(true); right_button->setLocalZOrder(_layout->getLocalZOrder() + 1); right_button->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::nextCallback, this)); @@ -187,7 +187,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -233,7 +233,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Bounce_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp index 04ab088cc5..1f6132062c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp @@ -19,7 +19,7 @@ bool UISliderTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the slider alert will be displayed _displayValueLabel = Text::create("Move the slider thumb","Move the slider thumb",32); @@ -30,7 +30,7 @@ bool UISliderTest::init() // Add the alert Text* alert = Text::create("Slider","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the slider @@ -74,7 +74,7 @@ bool UISliderTest_Scale9::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the slider alert will be displayed _displayValueLabel = Text::create("Move the slider thumb","fonts/Marker Felt.ttf",32); @@ -85,7 +85,7 @@ bool UISliderTest_Scale9::init() // Add the alert Text *alert = Text::create("Slider scale9 render","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the slider diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp index c6d0e0ea45..308998c7b1 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp @@ -23,7 +23,7 @@ bool UISliderTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UISlider_Editor/ui_slider_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -46,8 +46,8 @@ bool UISliderTest_Editor::init() _displayValueLabel->setFontName("fonts/Marker Felt.ttf"); _displayValueLabel->setFontSize(30); _displayValueLabel->setString("No event"); - _displayValueLabel->setPosition(Vec2(_layout->getSize().width / 2, - _layout->getSize().height - _displayValueLabel->getSize().height * 1.75f)); + _displayValueLabel->setPosition(Vec2(_layout->getContentSize().width / 2, + _layout->getContentSize().height - _displayValueLabel->getContentSize().height * 1.75f)); _touchGroup->addChild(_displayValueLabel); return true; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest.cpp index 1bf5bee405..f30001b2f4 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest.cpp @@ -9,12 +9,12 @@ bool UITextAtlasTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create("TextAtlas","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the text atlas diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp index 396337a5eb..e43f9426d5 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest_Editor.cpp @@ -11,7 +11,7 @@ bool UITextAtlasTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabelAtlas_Editor/ui_labelatlas_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest.cpp index 916ba0efbf..1769523560 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest.cpp @@ -9,16 +9,16 @@ bool UITextBMFontTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); Text* alert = Text::create("TextBMFont","TextBMFont",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the TextBMFont TextBMFont* textBMFont = TextBMFont::create("BMFont", "cocosui/bitmapFontTest2.fnt"); - textBMFont->setPosition(Vec2(widgetSize.width / 2, widgetSize.height / 2.0f + textBMFont->getSize().height / 8.0f)); + textBMFont->setPosition(Vec2(widgetSize.width / 2, widgetSize.height / 2.0f + textBMFont->getContentSize().height / 8.0f)); _uiLayer->addChild(textBMFont); return true; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp index 5b2bdcee10..73e8c75184 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest_Editor.cpp @@ -12,7 +12,7 @@ bool UITextBMFontTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabelBMFont_Editor/ui_labelbmfont_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp index f67469e9cb..4b040b9a3d 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp @@ -17,18 +17,18 @@ bool UITextFieldTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the textfield events will be displayed _displayValueLabel = Text::create("No Event","fonts/Marker Felt.ttf",32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); - _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getSize().height * 1.5f)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f)); _uiLayer->addChild(_displayValueLabel); // Add the alert Text* alert = Text::create("TextField","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); // Create the textfield @@ -100,13 +100,13 @@ bool UITextFieldTest_MaxLength::init() // Add a label in which the textfield events will be displayed _displayValueLabel = Text::create("No Event","fonts/Marker Felt.ttf",32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); - _displayValueLabel->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + _displayValueLabel->getSize().height * 1.5f)); + _displayValueLabel->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f)); _uiLayer->addChild(_displayValueLabel); // Add the alert Text *alert = Text::create("TextField max length","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); // Create the textfield @@ -184,13 +184,13 @@ bool UITextFieldTest_Password::init() // Add a label in which the textfield events will be displayed _displayValueLabel = Text::create("No Event","fonts/Marker Felt.ttf",32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); - _displayValueLabel->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + _displayValueLabel->getSize().height * 1.5f)); + _displayValueLabel->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f)); _uiLayer->addChild(_displayValueLabel); // Add the alert Text *alert = Text::create("TextField password","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); // Create the textfield @@ -258,18 +258,18 @@ bool UITextFieldTest_LineWrap::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add a label in which the textfield events will be displayed _displayValueLabel = Text::create("No Event","fonts/Marker Felt.ttf",30); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); - _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getSize().height * 1.5)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5)); _uiLayer->addChild(_displayValueLabel); // Add the alert Text *alert = Text::create("TextField line wrap","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075)); _uiLayer->addChild(alert); // Create the textfield @@ -294,7 +294,7 @@ void UITextFieldTest_LineWrap::textFieldEvent(Ref *pSender, TextField::EventType case TextField::EventType::ATTACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); textField->runAction(CCMoveTo::create(0.225f, Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + textField->getContentSize().height / 2))); textField->setTextHorizontalAlignment(TextHAlignment::LEFT); @@ -307,7 +307,7 @@ void UITextFieldTest_LineWrap::textFieldEvent(Ref *pSender, TextField::EventType case TextField::EventType::DETACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); textField->runAction(CCMoveTo::create(0.175f, Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f))); textField->setTextHorizontalAlignment(TextHAlignment::CENTER); textField->setTextVerticalAlignment(TextVAlignment::CENTER); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp index fe9bc0f924..95de4b961a 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp @@ -23,7 +23,7 @@ bool UITextFieldTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UITextField_Editor/ui_textfield_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -47,8 +47,8 @@ bool UITextFieldTest_Editor::init() _displayValueLabel->setFontName("fonts/Marker Felt.ttf"); _displayValueLabel->setFontSize(30); _displayValueLabel->setString("No event"); - _displayValueLabel->setPosition(Vec2(_layout->getSize().width / 2, - _layout->getSize().height - _displayValueLabel->getSize().height * 1.75f)); + _displayValueLabel->setPosition(Vec2(_layout->getContentSize().width / 2, + _layout->getContentSize().height - _displayValueLabel->getContentSize().height * 1.75f)); _touchGroup->addChild(_displayValueLabel); return true; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp index 1857624525..8c03e83c98 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp @@ -9,16 +9,16 @@ bool UITextTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); Text* alert = Text::create("Text","fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the text Text* text = Text::create("Text", "AmericanTypewriter", 30); - text->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + text->getSize().height / 4.0f)); + text->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + text->getContentSize().height / 4.0f)); _uiLayer->addChild(text); return true; @@ -32,11 +32,11 @@ bool UITextTest_LineWrap::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); Text* alert = Text::create("Text line wrap","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the line wrap @@ -44,7 +44,7 @@ bool UITextTest_LineWrap::init() text->ignoreContentAdaptWithSize(false); text->setSize(Size(280, 150)); text->setTextHorizontalAlignment(TextHAlignment::CENTER); - text->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - text->getSize().height / 8.0f)); + text->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - text->getContentSize().height / 8.0f)); _uiLayer->addChild(text); return true; @@ -59,14 +59,14 @@ bool UILabelTest_Effect::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); Text* alert = Text::create(); alert->setString("Label Effect"); alert->setFontName("fonts/Marker Felt.ttf"); alert->setFontSize(30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.05f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.05f)); _uiLayer->addChild(alert); @@ -75,7 +75,7 @@ bool UILabelTest_Effect::init() shadow_label->enableShadow(); shadow_label->setString("Shadow"); - shadow_label->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + shadow_label->getSize().height)); + shadow_label->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + shadow_label->getContentSize().height)); _uiLayer->addChild(shadow_label); @@ -97,7 +97,7 @@ bool UILabelTest_Effect::init() Text* outline_label = Text::create(); outline_label->enableOutline(Color4B::BLUE, 2); outline_label->setString("Outline"); - outline_label->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - shadow_label->getSize().height)); + outline_label->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - shadow_label->getContentSize().height)); _uiLayer->addChild(outline_label); @@ -114,16 +114,16 @@ bool UITextTest_TTF::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); Text* alert = Text::create("Text set TTF font","fonts/Marker Felt.ttf",30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); _uiLayer->addChild(alert); // Create the text, and set font with .ttf Text* text = Text::create("Text","fonts/A Damn Mess.ttf",30); - text->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + text->getSize().height / 4.0f)); + text->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + text->getContentSize().height / 4.0f)); _uiLayer->addChild(text); return true; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp index e8ef5acf1b..d9f1ad4678 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest_Editor.cpp @@ -14,7 +14,7 @@ bool UITextTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UILabel_Editor/ui_label_editor_1.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp index c62fcad662..33ec256f67 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp @@ -139,7 +139,7 @@ void VideoPlayerTest::createVideo() { auto centerPos = Vec2(_visibleRect.origin.x + _visibleRect.size.width / 2,_visibleRect.origin.y + _visibleRect.size.height /2); - auto widgetSize = _widget->getSize(); + auto widgetSize = _widget->getContentSize(); _videoPlayer = VideoPlayer::create(); _videoPlayer->setPosition(centerPos); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.cpp index ce6f6b36ed..3774666c37 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.cpp @@ -18,7 +18,7 @@ bool UIWidgetAddNodeTest::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); // Add the alert Text* alert = Text::create(); @@ -26,7 +26,7 @@ bool UIWidgetAddNodeTest::init() alert->setFontName("fonts/Marker Felt.ttf"); alert->setFontSize(30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 1.75)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 1.75)); _uiLayer->addChild(alert); // Create the ui node container diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp index 31d176084d..5faa7bd469 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest_Editor.cpp @@ -22,7 +22,7 @@ bool UIWidgetAddNodeTest_Editor::init() _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UIEditorTest/UIWidgetAddNode_Editor/ui_widget_add_node_editor.json")); _touchGroup->addChild(_layout); Size screenSize = CCDirector::getInstance()->getWinSize(); - Size rootSize = _layout->getSize(); + Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); From 510bc23b165a5300efb352b969cade75b4618c36 Mon Sep 17 00:00:00 2001 From: yinkaile Date: Fri, 20 Jun 2014 11:23:26 +0800 Subject: [PATCH 33/72] 1.fixed action may shake a little 2.fixed frame event will emit even they do not in current play section --- .../cocostudio/ActionTimeline/CCActionTimeline.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp index 60a5d5ff9d..5ec1b1ca83 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp @@ -171,7 +171,7 @@ void ActionTimeline::step(float delta) if(!_playing) _time = _endFrame * _frameInternal; else - _time = _startFrame * _frameInternal; + gotoFrameAndPlay(_startFrame, _endFrame, _loop); } } From 1aa07906a177a67c2d66eb328645893dd62bc62d Mon Sep 17 00:00:00 2001 From: yinkaile Date: Fri, 20 Jun 2014 11:36:48 +0800 Subject: [PATCH 34/72] add new line at the end of the file --- .../cocostudio/ActionTimeline/CCActionTimelineCache.cpp | 2 +- .../editor-support/cocostudio/ActionTimeline/CCTimelineMacro.h | 2 +- .../CocoStudioActionTimelineTest/ActionTimelineTestScene.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp index 442d23e501..6e6dcbdb8a 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp @@ -371,4 +371,4 @@ Frame* ActionTimelineCache::loadZOrderFrame(const rapidjson::Value& json) } } -} \ No newline at end of file +} diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCTimelineMacro.h b/cocos/editor-support/cocostudio/ActionTimeline/CCTimelineMacro.h index 0580adc68e..5a54856919 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCTimelineMacro.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCTimelineMacro.h @@ -35,4 +35,4 @@ Copyright (c) 2013-2014 Chukong Technologies #define USING_NS_TIMELINE #endif -#endif \ No newline at end of file +#endif diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.h index 30414845ef..35229ed358 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.h @@ -85,4 +85,4 @@ public: virtual std::string title() const override; }; -#endif // __ANIMATION_SCENE_H__ \ No newline at end of file +#endif // __ANIMATION_SCENE_H__ From 5f5b705beed7acb4d264d654a0e0729b1a0d227e Mon Sep 17 00:00:00 2001 From: andyque Date: Fri, 20 Jun 2014 14:03:33 +0800 Subject: [PATCH 35/72] refactor setSize to setContentSize and deprecated the old interface --- .../cocostudio/CCSGUIReader.cpp | 22 ++++++------- .../ButtonReader/ButtonReader.cpp | 2 +- .../ImageViewReader/ImageViewReader.cpp | 2 +- .../LayoutReader/LayoutReader.cpp | 2 +- .../LoadingBarReader/LoadingBarReader.cpp | 2 +- .../SliderReader/SliderReader.cpp | 2 +- .../cocostudio/WidgetReader/WidgetReader.cpp | 2 +- cocos/ui/UIHBox.cpp | 2 +- cocos/ui/UILayout.cpp | 2 +- cocos/ui/UIPageView.cpp | 4 +-- cocos/ui/UIRelativeBox.cpp | 2 +- cocos/ui/UIScrollView.cpp | 4 +-- cocos/ui/UIVBox.cpp | 2 +- cocos/ui/UIWidget.cpp | 13 ++------ .../UIButtonTest/UIButtonTest.cpp | 2 +- .../UIFocusTest/UIFocusTest.cpp | 2 +- .../UIImageViewTest/UIImageViewTest.cpp | 2 +- .../UILayoutTest/UILayoutTest.cpp | 32 +++++++++---------- .../UIListViewTest/UIListViewTest.cpp | 24 +++++++------- .../UILoadingBarTest/UILoadingBarTest.cpp | 4 +-- .../UIPageViewTest/UIPageViewTest.cpp | 6 ++-- .../UIRichTextTest/UIRichTextTest.cpp | 4 +-- .../UIScrollViewTest/UIScrollViewTest.cpp | 14 ++++---- .../UISliderTest/UISliderTest.cpp | 2 +- .../UITextFieldTest/UITextFieldTest.cpp | 2 +- .../UITextTest/UITextTest.cpp | 2 +- 26 files changed, 75 insertions(+), 84 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index f21f84af8e..625e7d0357 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -326,7 +326,7 @@ Widget* WidgetPropertiesReader0250::createWidget(const rapidjson::Value& data, c if (widget->getContentSize().equals(Size::ZERO)) { Layout* rootWidget = dynamic_cast(widget); - rootWidget->setSize(Size(fileDesignWidth, fileDesignHeight)); + rootWidget->setContentSize(Size(fileDesignWidth, fileDesignHeight)); } /* ********************** */ @@ -439,7 +439,7 @@ void WidgetPropertiesReader0250::setPropsForWidgetFromJsonDictionary(Widget*widg float w = DICTOOL->getFloatValue_json(options, "width"); float h = DICTOOL->getFloatValue_json(options, "height"); - widget->setSize(Size(w, h)); + widget->setContentSize(Size(w, h)); widget->setTag(DICTOOL->getIntValue_json(options, "tag")); widget->setActionTag(DICTOOL->getIntValue_json(options, "actiontag")); @@ -538,7 +538,7 @@ void WidgetPropertiesReader0250::setPropsForButtonFromJsonDictionary(Widget*widg { float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); - button->setSize(Size(swf, shf)); + button->setContentSize(Size(swf, shf)); } } else @@ -654,7 +654,7 @@ void WidgetPropertiesReader0250::setPropsForImageViewFromJsonDictionary(Widget*w { float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); - imageView->setSize(Size(swf, shf)); + imageView->setContentSize(Size(swf, shf)); } float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); @@ -847,7 +847,7 @@ void WidgetPropertiesReader0250::setPropsForSliderFromJsonDictionary(Widget*widg { slider->loadBarTexture(imageFileName_tp); } - slider->setSize(Size(barLength, slider->getContentSize().height)); + slider->setContentSize(Size(barLength, slider->getContentSize().height)); } else { @@ -1035,7 +1035,7 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c if (widget->getContentSize().equals(Size::ZERO)) { Layout* rootWidget = dynamic_cast(widget); - rootWidget->setSize(Size(fileDesignWidth, fileDesignHeight)); + rootWidget->setContentSize(Size(fileDesignWidth, fileDesignHeight)); } /* ********************** */ @@ -1219,7 +1219,7 @@ void WidgetPropertiesReader0300::setPropsForWidgetFromJsonDictionary(Widget*widg float w = DICTOOL->getFloatValue_json(options, "width"); float h = DICTOOL->getFloatValue_json(options, "height"); - widget->setSize(Size(w, h)); + widget->setContentSize(Size(w, h)); widget->setTag(DICTOOL->getIntValue_json(options, "tag")); widget->setActionTag(DICTOOL->getIntValue_json(options, "actiontag")); @@ -1406,7 +1406,7 @@ void WidgetPropertiesReader0300::setPropsForButtonFromJsonDictionary(Widget*widg { float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); - button->setSize(Size(swf, shf)); + button->setContentSize(Size(swf, shf)); } } bool tt = DICTOOL->checkObjectExist_json(options, "text"); @@ -1606,7 +1606,7 @@ void WidgetPropertiesReader0300::setPropsForImageViewFromJsonDictionary(Widget*w { float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); - imageView->setSize(Size(swf, shf)); + imageView->setContentSize(Size(swf, shf)); } float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); @@ -1825,7 +1825,7 @@ void WidgetPropertiesReader0300::setPropsForSliderFromJsonDictionary(Widget*widg break; } - slider->setSize(Size(barLength, slider->getContentSize().height)); + slider->setContentSize(Size(barLength, slider->getContentSize().height)); } else { @@ -2041,7 +2041,7 @@ void WidgetPropertiesReader0300::setPropsForLoadingBarFromJsonDictionary(Widget float width = DICTOOL->getFloatValue_json(options, "width"); float height = DICTOOL->getFloatValue_json(options, "height"); - loadingBar->setSize(Size(width, height)); + loadingBar->setContentSize(Size(width, height)); } /**/ diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index b26507dbe5..60866ac25b 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -79,7 +79,7 @@ namespace cocostudio { float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); - button->setSize(Size(swf, shf)); + button->setContentSize(Size(swf, shf)); } } bool tt = DICTOOL->checkObjectExist_json(options, "text"); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 7518098731..c10c3ae076 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -62,7 +62,7 @@ namespace cocostudio { float swf = DICTOOL->getFloatValue_json(options, "scale9Width"); float shf = DICTOOL->getFloatValue_json(options, "scale9Height"); - imageView->setSize(Size(swf, shf)); + imageView->setContentSize(Size(swf, shf)); } float cx = DICTOOL->getFloatValue_json(options, "capInsetsX"); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index 926083f0b5..85a686a695 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -51,7 +51,7 @@ namespace cocostudio w = DICTOOL->getFloatValue_json(options, "width"); h = DICTOOL->getFloatValue_json(options, "height"); } - panel->setSize(Size(w, h)); + panel->setContentSize(Size(w, h)); /**/ panel->setClippingEnabled(DICTOOL->getBooleanValue_json(options, "clipAble")); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp index c5452a908b..058aff4fd6 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp @@ -59,7 +59,7 @@ namespace cocostudio float width = DICTOOL->getFloatValue_json(options, "width"); float height = DICTOOL->getFloatValue_json(options, "height"); - loadingBar->setSize(Size(width, height)); + loadingBar->setContentSize(Size(width, height)); } /**/ diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index ca92886ef6..4a1254cc5b 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -55,7 +55,7 @@ namespace cocostudio if (barTextureScale9Enable) { - slider->setSize(Size(barLength, slider->getContentSize().height)); + slider->setContentSize(Size(barLength, slider->getContentSize().height)); } } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index fb45ed7017..22554cb663 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -63,7 +63,7 @@ namespace cocostudio w = DICTOOL->getFloatValue_json(options, "width"); h = DICTOOL->getFloatValue_json(options, "height"); } - widget->setSize(Size(w, h)); + widget->setContentSize(Size(w, h)); // before /* float w = DICTOOL->getFloatValue_json(options, "width"); diff --git a/cocos/ui/UIHBox.cpp b/cocos/ui/UIHBox.cpp index 4785742ced..3a86416593 100644 --- a/cocos/ui/UIHBox.cpp +++ b/cocos/ui/UIHBox.cpp @@ -74,7 +74,7 @@ bool HBox::initWithSize(const Size& size) { if (init()) { - setSize(size); + setContentSize(size); return true; } return false; diff --git a/cocos/ui/UILayout.cpp b/cocos/ui/UILayout.cpp index 6bc9516d9f..d9b65eb64a 100644 --- a/cocos/ui/UILayout.cpp +++ b/cocos/ui/UILayout.cpp @@ -145,7 +145,7 @@ bool Layout::init() if (Widget::init()) { ignoreContentAdaptWithSize(false); - setSize(Size::ZERO); + setContentSize(Size::ZERO); setAnchorPoint(Vec2::ZERO); onPassFocusToChild = CC_CALLBACK_2(Layout::findNearestChildWidgetIndex, this); return true; diff --git a/cocos/ui/UIPageView.cpp b/cocos/ui/UIPageView.cpp index ad9d4e33f7..59059870a9 100644 --- a/cocos/ui/UIPageView.cpp +++ b/cocos/ui/UIPageView.cpp @@ -121,7 +121,7 @@ void PageView::addWidgetToPage(Widget *widget, ssize_t pageIdx, bool forceCreate Layout* PageView::createPage() { Layout* newPage = Layout::create(); - newPage->setSize(getContentSize()); + newPage->setContentSize(getContentSize()); return newPage; } @@ -228,7 +228,7 @@ void PageView::updateAllPagesSize() Size selfSize = getContentSize(); for (auto& page : _pages) { - page->setSize(selfSize); + page->setContentSize(selfSize); } } diff --git a/cocos/ui/UIRelativeBox.cpp b/cocos/ui/UIRelativeBox.cpp index d46430c279..55c74871b6 100644 --- a/cocos/ui/UIRelativeBox.cpp +++ b/cocos/ui/UIRelativeBox.cpp @@ -74,7 +74,7 @@ bool RelativeBox::initWithSize(const Size& size) { if (init()) { - setSize(size); + setContentSize(size); return true; } return false; diff --git a/cocos/ui/UIScrollView.cpp b/cocos/ui/UIScrollView.cpp index afd081327e..d1d6664a1c 100644 --- a/cocos/ui/UIScrollView.cpp +++ b/cocos/ui/UIScrollView.cpp @@ -141,7 +141,7 @@ void ScrollView::onSizeChanged() float orginInnerSizeHeight = innerSize.height; float innerSizeWidth = MAX(orginInnerSizeWidth, _contentSize.width); float innerSizeHeight = MAX(orginInnerSizeHeight, _contentSize.height); - _innerContainer->setSize(Size(innerSizeWidth, innerSizeHeight)); + _innerContainer->setContentSize(Size(innerSizeWidth, innerSizeHeight)); _innerContainer->setPosition(Vec2(0, _contentSize.height - _innerContainer->getContentSize().height)); } @@ -166,7 +166,7 @@ void ScrollView::setInnerContainerSize(const Size &size) { innerSizeHeight = size.height; } - _innerContainer->setSize(Size(innerSizeWidth, innerSizeHeight)); + _innerContainer->setContentSize(Size(innerSizeWidth, innerSizeHeight)); switch (_direction) { diff --git a/cocos/ui/UIVBox.cpp b/cocos/ui/UIVBox.cpp index e9fc24b5bb..4491e7ccfd 100644 --- a/cocos/ui/UIVBox.cpp +++ b/cocos/ui/UIVBox.cpp @@ -74,7 +74,7 @@ bool VBox::initWithSize(const Size& size) { if (init()) { - setSize(size); + setContentSize(size); return true; } return false; diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index 0e85706cf3..a6b4cf33c7 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -325,16 +325,8 @@ void Widget::setSizePercent(const Vec2 &percent) void Widget::updateSizeAndPosition() { - Widget* widgetParent = getWidgetParent(); - Size pSize; - if (widgetParent) - { - pSize = widgetParent->getLayoutSize(); - } - else - { - pSize = _parent->getContentSize(); - } + Size pSize = _parent->getContentSize(); + updateSizeAndPosition(pSize); } @@ -470,7 +462,6 @@ Node* Widget::getVirtualRenderer() void Widget::onSizeChanged() { - setContentSize(_contentSize); for (auto& child : getChildren()) { Widget* widgetChild = dynamic_cast(child); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp index 1db0c35f4d..ebdb140dee 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp @@ -110,7 +110,7 @@ bool UIButtonTest_Scale9::init() // open scale9 render button->setScale9Enabled(true); button->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); - button->setSize(Size(150, 70)); + button->setContentSize(Size(150, 70)); // button->addTouchEventListener(this, toucheventselector(UIButtonTest_Scale9::touchEvent)); button->addTouchEventListener(CC_CALLBACK_2(UIButtonTest_Scale9::touchEvent, this)); _uiLayer->addChild(button); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.cpp index 718e5dc673..030c136b4c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.cpp @@ -598,7 +598,7 @@ bool UIFocusTestListView::init() _listView->setBounceEnabled(true); _listView->setBackGroundImage("cocosui/green_edit.png"); _listView->setBackGroundImageScale9Enabled(true); - _listView->setSize(Size(240, 130)); + _listView->setContentSize(Size(240, 130)); _listView->setPosition(Vec2(40, 70)); _uiLayer->addChild(_listView); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp index 7398d994c2..a8b34f408e 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp @@ -51,7 +51,7 @@ bool UIImageViewTest_Scale9::init() // Create the imageview ImageView* imageView = ImageView::create("cocosui/buttonHighlighted.png"); imageView->setScale9Enabled(true); - imageView->setSize(Size(300, 115)); + imageView->setContentSize(Size(300, 115)); imageView->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp index dc857bed18..3868af3b0c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp @@ -33,7 +33,7 @@ bool UILayoutTest::init() // Create the layout Layout* layout = Layout::create(); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - layout->getContentSize().width) / 2.0f, @@ -53,7 +53,7 @@ bool UILayoutTest::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, button_scale9->getContentSize().height / 2.0f)); @@ -97,7 +97,7 @@ bool UILayoutTest_Color::init() Layout* layout = Layout::create(); layout->setBackGroundColorType(Layout::BackGroundColorType::SOLID); layout->setBackGroundColor(Color3B(128, 128, 128)); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - layout->getContentSize().width) / 2.0f, @@ -118,7 +118,7 @@ bool UILayoutTest_Color::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, button_scale9->getContentSize().height / 2.0f)); @@ -161,7 +161,7 @@ bool UILayoutTest_Gradient::init() Layout* layout = Layout::create(); layout->setBackGroundColorType(Layout::BackGroundColorType::GRADIENT); layout->setBackGroundColor(Color3B(64, 64, 64), Color3B(192, 192, 192)); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - layout->getContentSize().width) / 2.0f, @@ -182,7 +182,7 @@ bool UILayoutTest_Gradient::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, button_scale9->getContentSize().height / 2.0f)); @@ -223,7 +223,7 @@ bool UILayoutTest_BackGroundImage::init() Layout* layout = Layout::create(); layout->setClippingEnabled(true); layout->setBackGroundImage("cocosui/Hello.png"); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - layout->getContentSize().width) / 2.0f, @@ -243,7 +243,7 @@ bool UILayoutTest_BackGroundImage::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, button_scale9->getContentSize().height / 2.0f)); @@ -284,7 +284,7 @@ bool UILayoutTest_BackGroundImage_Scale9::init() Layout* layout = Layout::create(); layout->setBackGroundImageScale9Enabled(true); layout->setBackGroundImage("cocosui/green_edit.png"); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - layout->getContentSize().width) / 2.0f, @@ -305,7 +305,7 @@ bool UILayoutTest_BackGroundImage_Scale9::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); button_scale9->setPosition(Vec2(layout->getContentSize().width - button_scale9->getContentSize().width / 2.0f, button_scale9->getContentSize().height / 2.0f)); layout->addChild(button_scale9); @@ -346,7 +346,7 @@ bool UILayoutTest_Layout_Linear_Vertical::init() // Create the layout Layout* layout = Layout::create(); layout->setLayoutType(LayoutType::VERTICAL); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - layout->getContentSize().width) / 2.0f, @@ -376,7 +376,7 @@ bool UILayoutTest_Layout_Linear_Vertical::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); layout->addChild(button_scale9); LinearLayoutParameter* lp3 = LinearLayoutParameter::create(); @@ -421,7 +421,7 @@ bool UILayoutTest_Layout_Linear_Horizontal::init() Layout* layout = Layout::create(); layout->setLayoutType(LayoutType::HORIZONTAL); layout->setClippingEnabled(true); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - layout->getContentSize().width) / 2.0f, @@ -450,7 +450,7 @@ bool UILayoutTest_Layout_Linear_Horizontal::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); layout->addChild(button_scale9); LinearLayoutParameter* lp3 = LinearLayoutParameter::create(); @@ -494,7 +494,7 @@ bool UILayoutTest_Layout_Relative_Align_Parent::init() // Create the layout Layout* layout = Layout::create(); layout->setLayoutType(LayoutType::RELATIVE); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); layout->setBackGroundColorType(Layout::BackGroundColorType::SOLID); layout->setBackGroundColor(Color3B::GREEN); Size backgroundSize = background->getContentSize(); @@ -629,7 +629,7 @@ bool UILayoutTest_Layout_Relative_Location::init() // Create the layout Layout* layout = Layout::create(); layout->setLayoutType(LayoutType::RELATIVE); - layout->setSize(Size(280, 150)); + layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - layout->getContentSize().width) / 2.0f, diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp index b108fab1b9..76624179c1 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp @@ -60,7 +60,7 @@ bool UIListViewTest_Vertical::init() listView->setBounceEnabled(true); listView->setBackGroundImage("cocosui/green_edit.png"); listView->setBackGroundImageScale9Enabled(true); - listView->setSize(Size(240, 130)); + listView->setContentSize(Size(240, 130)); listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + @@ -75,7 +75,7 @@ bool UIListViewTest_Vertical::init() Layout* default_item = Layout::create(); default_item->setTouchEnabled(true); - default_item->setSize(default_button->getContentSize()); + default_item->setContentSize(default_button->getContentSize()); default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f, default_item->getContentSize().height / 2.0f)); default_item->addChild(default_button); @@ -107,10 +107,10 @@ bool UIListViewTest_Vertical::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getContentSize()); + custom_button->setContentSize(default_button->getContentSize()); Layout *custom_item = Layout::create(); - custom_item->setSize(custom_button->getContentSize()); + custom_item->setContentSize(custom_button->getContentSize()); custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); @@ -124,10 +124,10 @@ bool UIListViewTest_Vertical::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getContentSize()); + custom_button->setContentSize(default_button->getContentSize()); Layout *custom_item = Layout::create(); - custom_item->setSize(custom_button->getContentSize()); + custom_item->setContentSize(custom_button->getContentSize()); custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); custom_item->setTag(1); @@ -244,7 +244,7 @@ bool UIListViewTest_Horizontal::init() listView->setBounceEnabled(true); listView->setBackGroundImage("cocosui/green_edit.png"); listView->setBackGroundImageScale9Enabled(true); - listView->setSize(Size(240, 130)); + listView->setContentSize(Size(240, 130)); listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + @@ -259,7 +259,7 @@ bool UIListViewTest_Horizontal::init() Layout *default_item = Layout::create(); default_item->setTouchEnabled(true); - default_item->setSize(default_button->getContentSize()); + default_item->setContentSize(default_button->getContentSize()); default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f, default_item->getContentSize().height / 2.0f)); default_item->addChild(default_button); @@ -284,10 +284,10 @@ bool UIListViewTest_Horizontal::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getContentSize()); + custom_button->setContentSize(default_button->getContentSize()); Layout* custom_item = Layout::create(); - custom_item->setSize(custom_button->getContentSize()); + custom_item->setContentSize(custom_button->getContentSize()); custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); @@ -301,10 +301,10 @@ bool UIListViewTest_Horizontal::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getContentSize()); + custom_button->setContentSize(default_button->getContentSize()); Layout* custom_item = Layout::create(); - custom_item->setSize(custom_button->getContentSize()); + custom_item->setContentSize(custom_button->getContentSize()); custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.cpp index 6b2b36276c..6eff4c32bb 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.cpp @@ -193,7 +193,7 @@ bool UILoadingBarTest_Left_Scale9::init() loadingBar->setTag(0); loadingBar->setScale9Enabled(true); loadingBar->setCapInsets(Rect(0, 0, 0, 0)); - loadingBar->setSize(Size(300, 13)); + loadingBar->setContentSize(Size(300, 13)); loadingBar->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + loadingBar->getContentSize().height / 4.0f)); @@ -275,7 +275,7 @@ bool UILoadingBarTest_Right_Scale9::init() loadingBar->setTag(0); loadingBar->setScale9Enabled(true); loadingBar->setCapInsets(Rect(0, 0, 0, 0)); - loadingBar->setSize(Size(300, 13)); + loadingBar->setContentSize(Size(300, 13)); loadingBar->setDirection(LoadingBar::Direction::RIGHT); loadingBar->setPosition(Vec2(widgetSize.width / 2.0f, diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp index 9f47bea3b3..e8ab78b8ce 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp @@ -40,7 +40,7 @@ bool UIPageViewTest::init() // Create the page view PageView* pageView = PageView::create(); - pageView->setSize(Size(240.0f, 130.0f)); + pageView->setContentSize(Size(240.0f, 130.0f)); Size backgroundSize = background->getContentSize(); pageView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - pageView->getContentSize().width) / 2.0f, @@ -53,11 +53,11 @@ bool UIPageViewTest::init() for (int i = 0; i < pageCount; ++i) { Layout* layout = Layout::create(); - layout->setSize(Size(240.0f, 130.0f)); + layout->setContentSize(Size(240.0f, 130.0f)); ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); imageView->setScale9Enabled(true); - imageView->setSize(Size(240, 130)); + imageView->setContentSize(Size(240, 130)); imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(imageView); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.cpp index c811ed5ce2..d69288aa6b 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.cpp @@ -40,7 +40,7 @@ bool UIRichTextTest::init() // RichText _richText = RichText::create(); _richText->ignoreContentAdaptWithSize(false); - _richText->setSize(Size(100, 100)); + _richText->setContentSize(Size(100, 100)); RichElementText* re1 = RichElementText::create(1, Color3B::WHITE, 255, "This color is white. ", "Helvetica", 10); RichElementText* re2 = RichElementText::create(2, Color3B::YELLOW, 255, "And this is yellow. ", "Helvetica", 10); @@ -85,7 +85,7 @@ void UIRichTextTest::touchEvent(Ref *pSender, Widget::TouchEventType type) if (_richText->isIgnoreContentAdaptWithSize()) { _richText->ignoreContentAdaptWithSize(false); - _richText->setSize(Size(100, 100)); + _richText->setContentSize(Size(100, 100)); } else { diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp index 235ea8f0ba..d75facfd0e 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp @@ -39,7 +39,7 @@ bool UIScrollViewTest_Vertical::init() // Create the scrollview by vertical ui::ScrollView* scrollView = ui::ScrollView::create(); - scrollView->setSize(Size(280.0f, 150.0f)); + scrollView->setContentSize(Size(280.0f, 150.0f)); Size backgroundSize = background->getContentSize(); scrollView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - scrollView->getContentSize().width) / 2.0f, @@ -65,7 +65,7 @@ bool UIScrollViewTest_Vertical::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); button_scale9->setPosition(Vec2(innerWidth / 2.0f, titleButton->getBottomBoundary() - titleButton->getContentSize().height)); scrollView->addChild(button_scale9); @@ -114,7 +114,7 @@ bool UIScrollViewTest_Horizontal::init() ui::ScrollView* scrollView = ui::ScrollView::create(); scrollView->setBounceEnabled(true); scrollView->setDirection(ui::ScrollView::Direction::HORIZONTAL); - scrollView->setSize(Size(280.0f, 150.0f)); + scrollView->setContentSize(Size(280.0f, 150.0f)); scrollView->setInnerContainerSize(scrollView->getContentSize()); Size backgroundSize = background->getContentSize(); scrollView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + @@ -143,7 +143,7 @@ bool UIScrollViewTest_Horizontal::init() Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button_scale9->setScale9Enabled(true); - button_scale9->setSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); + button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height)); button_scale9->setPosition(Vec2(titleButton->getRightBoundary() + titleButton->getContentSize().width / 2.0f, titleButton->getBottomBoundary() - titleButton->getContentSize().height / 2.0f)); scrollView->addChild(button_scale9); @@ -198,7 +198,7 @@ bool UIScrollViewTest_Both::init() scrollView->setBounceEnabled(true); scrollView->setBackGroundImageScale9Enabled(true); scrollView->setBackGroundImage("cocosui/green_edit.png"); - scrollView->setSize(Size(210, 122.5)); + scrollView->setContentSize(Size(210, 122.5)); Size backgroundSize = background->getContentSize(); scrollView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - scrollView->getContentSize().width) / 2.0f, @@ -257,7 +257,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection::init() sc->setBackGroundColorType(Layout::BackGroundColorType::SOLID); sc->setDirection(ui::ScrollView::Direction::BOTH); sc->setInnerContainerSize(Size(480, 320)); - sc->setSize(Size(100,100)); + sc->setContentSize(Size(100,100)); Size backgroundSize = background->getContentSize(); sc->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - sc->getContentSize().width) / 2.0f, @@ -313,7 +313,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Bounce::init() sc->setBounceEnabled(true); sc->setDirection(ui::ScrollView::Direction::BOTH); sc->setInnerContainerSize(Size(480, 320)); - sc->setSize(Size(100,100)); + sc->setContentSize(Size(100,100)); Size backgroundSize = background->getContentSize(); sc->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - sc->getContentSize().width) / 2.0f, diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp index 1f6132062c..b44118c57d 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp @@ -95,7 +95,7 @@ bool UISliderTest_Scale9::init() slider->loadProgressBarTexture("cocosui/slider_bar_active_9patch.png"); slider->setScale9Enabled(true); slider->setCapInsets(Rect(0, 0, 0, 0)); - slider->setSize(Size(250.0f, 19)); + slider->setContentSize(Size(250.0f, 19)); slider->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f/* + slider->getSize().height * 3.0f*/)); slider->addEventListener(CC_CALLBACK_2(UISliderTest_Scale9::sliderEvent, this)); _uiLayer->addChild(slider); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp index 4b040b9a3d..97d56c47b3 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp @@ -275,7 +275,7 @@ bool UITextFieldTest_LineWrap::init() // Create the textfield TextField* textField = TextField::create("input words here","fonts/Marker Felt.ttf",30); textField->ignoreContentAdaptWithSize(false); - textField->setSize(Size(240, 160)); + textField->setContentSize(Size(240, 160)); textField->setTextHorizontalAlignment(TextHAlignment::CENTER); textField->setTextVerticalAlignment(TextVAlignment::CENTER); textField->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp index 8c03e83c98..98dcbfba44 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp @@ -42,7 +42,7 @@ bool UITextTest_LineWrap::init() // Create the line wrap Text* text = Text::create("Text can line wrap","AmericanTypewriter",32); text->ignoreContentAdaptWithSize(false); - text->setSize(Size(280, 150)); + text->setContentSize(Size(280, 150)); text->setTextHorizontalAlignment(TextHAlignment::CENTER); text->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - text->getContentSize().height / 8.0f)); _uiLayer->addChild(text); From 9b945683b512d40ca0f380dfb702d5a709da6b50 Mon Sep 17 00:00:00 2001 From: andyque Date: Fri, 20 Jun 2014 14:55:42 +0800 Subject: [PATCH 36/72] fix contentSize not set properly problem --- cocos/ui/UIWidget.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index a6b4cf33c7..8a47bdaee9 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -201,13 +201,13 @@ bool Widget::init() { if (ProtectedNode::init()) { + _contentSize = Size::ZERO; initRenderer(); setBright(true); - //TODO: need refactor - ignoreContentAdaptWithSize(true); onFocusChanged = CC_CALLBACK_2(Widget::onFocusChange,this); onNextFocusedWidget = nullptr; this->setAnchorPoint(Vec2(0.5f, 0.5f)); + ignoreContentAdaptWithSize(true); this->setTouchEnabled(true); this->setCascadeColorEnabled(true); this->setCascadeOpacityEnabled(true); @@ -254,6 +254,9 @@ void Widget::initRenderer() void Widget::setContentSize(const cocos2d::Size &contentSize) { + ProtectedNode::setContentSize(contentSize); + + _customSize = contentSize; if (_ignoreSize) { From 2fc8889791d9a0b3980a6fd484f4ab76636cbb83 Mon Sep 17 00:00:00 2001 From: boyu0 Date: Fri, 20 Jun 2014 18:40:21 +0800 Subject: [PATCH 37/72] issue #5541: change RotateTo/RotateBy for Physics. --- cocos/2d/CCActionInterval.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 69bf25eae0..8a12fc5b56 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -828,8 +828,19 @@ void RotateTo::update(float time) { if (_target) { - _target->setRotationSkewX(_startAngleX + _diffAngleX * time); - _target->setRotationSkewY(_startAngleY + _diffAngleY * time); +#if CC_USE_PHYSICS + if (_target->getPhysicsBody() != nullptr && _startAngleX == _startAngleY && _diffAngleX == _diffAngleY) + { + _target->setRotation(_startAngleX + _diffAngleX * time); + } + else + { +#endif // CC_USE_PHYSICS + _target->setRotationSkewX(_startAngleX + _diffAngleX * time); + _target->setRotationSkewY(_startAngleY + _diffAngleY * time); +#if CC_USE_PHYSICS + } +#endif // CC_USE_PHYSICS } } @@ -952,8 +963,19 @@ void RotateBy::update(float time) } else { - _target->setRotationSkewX(_startAngleZ_X + _angleZ_X * time); - _target->setRotationSkewY(_startAngleZ_Y + _angleZ_Y * time); +#if CC_USE_PHYSICS + if (_target->getPhysicsBody() != nullptr && _startAngleZ_X == _startAngleZ_Y && _angleZ_X == _angleZ_Y) + { + _target->setRotation(_startAngleZ_X + _angleZ_X * time); + } + else + { +#endif // CC_USE_PHYSICS + _target->setRotationSkewX(_startAngleZ_X + _angleZ_X * time); + _target->setRotationSkewY(_startAngleZ_Y + _angleZ_Y * time); +#if CC_USE_PHYSICS + } +#endif // CC_USE_PHYSICS } } } From 2fa266e9177556ee83b89c2fcec5062f3027a8f7 Mon Sep 17 00:00:00 2001 From: boyu0 Date: Fri, 20 Jun 2014 18:42:36 +0800 Subject: [PATCH 38/72] closed #5541: change PhysicsActionTest for rotate action. --- tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp index 81bb2afe37..93c251f49a 100644 --- a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp +++ b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp @@ -916,6 +916,7 @@ std::string PhysicsDemoJoints::title() const void PhysicsDemoActions::onEnter() { PhysicsDemo::onEnter(); + _scene->getPhysicsWorld()->setGravity(Vect::ZERO); auto touchListener = EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = CC_CALLBACK_2(PhysicsDemoActions::onTouchBegan, this); @@ -934,16 +935,23 @@ void PhysicsDemoActions::onEnter() Sprite* sp4 = addGrossiniAtPosition(VisibleRect::leftTop() + Vec2(50, -50)); sp4->getPhysicsBody()->setGravityEnable(false); + sp1->getPhysicsBody()->setTag(DRAG_BODYS_TAG); + sp2->getPhysicsBody()->setTag(DRAG_BODYS_TAG); + sp3->getPhysicsBody()->setTag(DRAG_BODYS_TAG); + sp4->getPhysicsBody()->setTag(DRAG_BODYS_TAG); + auto actionTo = JumpTo::create(2, Vec2(100,100), 50, 4); auto actionBy = JumpBy::create(2, Vec2(300,0), 50, 4); auto actionUp = JumpBy::create(2, Vec2(0,50), 80, 4); auto actionByBack = actionBy->reverse(); + auto rotateBy = RotateBy::create(2, 180); + auto rotateByBack = RotateBy::create(2, -180); sp1->runAction(RepeatForever::create(actionUp)); sp2->runAction(RepeatForever::create(Sequence::create(actionBy, actionByBack, NULL))); sp3->runAction(actionTo); - sp4->runAction(RepeatForever::create(Sequence::create(actionBy->clone(), actionByBack->clone(), NULL))); + sp4->runAction(RepeatForever::create(Sequence::create(rotateBy, rotateByBack, NULL))); } std::string PhysicsDemoActions::title() const From 21330860a92403eed0fdfd21385df82cdce4ab36 Mon Sep 17 00:00:00 2001 From: Nite Luo Date: Fri, 20 Jun 2014 17:24:34 -0700 Subject: [PATCH 39/72] Fix NodeReader will crash when encountered unknown NodeType --- cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp index 9991baff0b..d4351cc362 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp @@ -220,7 +220,7 @@ Node* NodeReader::loadNode(const rapidjson::Value& json) Node* node = nullptr; std::string nodeType = DICTOOL->getStringValue_json(json, CLASSNAME); - NodeCreateFunc func = _funcs.at(nodeType); + NodeCreateFunc func = _funcs[nodeType]; if (func != nullptr) { const rapidjson::Value& options = DICTOOL->getSubDictionary_json(json, OPTIONS); From 8a463e7964e3863bad96c0cf7570d6e28ec26eec Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 10:02:09 +0800 Subject: [PATCH 40/72] remove Hungry style --- .../cocostudio/CCActionManagerEx.cpp | 6 +- .../cocostudio/CCActionManagerEx.h | 2 +- .../cocostudio/CCActionNode.cpp | 12 +- .../editor-support/cocostudio/CCActionNode.h | 2 +- .../cocostudio/CCActionObject.cpp | 12 +- .../cocostudio/CCActionObject.h | 2 +- .../cocostudio/CCDataReaderHelper.cpp | 114 +++++++++--------- .../cocostudio/CCDataReaderHelper.h | 20 +-- .../cocostudio/CCSGUIReader.cpp | 46 +++---- .../editor-support/cocostudio/CCSGUIReader.h | 24 ++-- .../editor-support/cocostudio/CocoLoader.cpp | 6 +- cocos/editor-support/cocostudio/CocoLoader.h | 2 +- .../ButtonReader/ButtonReader.cpp | 16 +-- .../WidgetReader/ButtonReader/ButtonReader.h | 2 +- .../CheckBoxReader/CheckBoxReader.cpp | 18 +-- .../CheckBoxReader/CheckBoxReader.h | 2 +- .../ImageViewReader/ImageViewReader.cpp | 12 +- .../ImageViewReader/ImageViewReader.h | 2 +- .../LayoutReader/LayoutReader.cpp | 12 +- .../WidgetReader/LayoutReader/LayoutReader.h | 2 +- .../ListViewReader/ListViewReader.cpp | 10 +- .../ListViewReader/ListViewReader.h | 2 +- .../LoadingBarReader/LoadingBarReader.cpp | 12 +- .../LoadingBarReader/LoadingBarReader.h | 2 +- .../PageViewReader/PageViewReader.cpp | 4 +- .../PageViewReader/PageViewReader.h | 2 +- .../ScrollViewReader/ScrollViewReader.cpp | 10 +- .../ScrollViewReader/ScrollViewReader.h | 2 +- .../SliderReader/SliderReader.cpp | 18 +-- .../WidgetReader/SliderReader/SliderReader.h | 2 +- .../TextAtlasReader/TextAtlasReader.cpp | 10 +- .../TextAtlasReader/TextAtlasReader.h | 2 +- .../TextBMFontReader/TextBMFontReader.cpp | 10 +- .../TextBMFontReader/TextBMFontReader.h | 2 +- .../TextFieldReader/TextFieldReader.cpp | 8 +- .../TextFieldReader/TextFieldReader.h | 2 +- .../WidgetReader/TextReader/TextReader.cpp | 8 +- .../WidgetReader/TextReader/TextReader.h | 2 +- .../cocostudio/WidgetReader/WidgetReader.cpp | 12 +- .../cocostudio/WidgetReader/WidgetReader.h | 6 +- .../WidgetReader/WidgetReaderProtocol.h | 2 +- 41 files changed, 221 insertions(+), 221 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCActionManagerEx.cpp b/cocos/editor-support/cocostudio/CCActionManagerEx.cpp index 655ace9e3b..4c1f2bb824 100644 --- a/cocos/editor-support/cocostudio/CCActionManagerEx.cpp +++ b/cocos/editor-support/cocostudio/CCActionManagerEx.cpp @@ -74,7 +74,7 @@ void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::V void ActionManagerEx::initWithBinary(const char* file, cocos2d::Ref *root, - CocoLoader* pCocoLoader, + CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) { std::string path = file; @@ -86,7 +86,7 @@ void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::V stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); stExpCocoNode *actionNode = NULL; for (int i=0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + std::string key = stChildArray[i].GetName(cocoLoader); if (key == "actionlist") { actionNode = &stChildArray[i]; break; @@ -99,7 +99,7 @@ void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::V ActionObject* action = new ActionObject(); action->autorelease(); - action->initWithBinary(pCocoLoader, actionNode->GetChildArray(), root); + action->initWithBinary(cocoLoader, actionNode->GetChildArray(), root); actionList.pushBack(action); } diff --git a/cocos/editor-support/cocostudio/CCActionManagerEx.h b/cocos/editor-support/cocostudio/CCActionManagerEx.h index b198f0fa23..ebea434825 100644 --- a/cocos/editor-support/cocostudio/CCActionManagerEx.h +++ b/cocos/editor-support/cocostudio/CCActionManagerEx.h @@ -99,7 +99,7 @@ public: /*init properties with json dictionay*/ void initWithDictionary(const char* jsonName,const rapidjson::Value &dic, Ref* root); - void initWithBinary(const char* file, Ref* root, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + void initWithBinary(const char* file, Ref* root, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); /** * Release all actions. diff --git a/cocos/editor-support/cocostudio/CCActionNode.cpp b/cocos/editor-support/cocostudio/CCActionNode.cpp index 33a553be2b..84ec680f15 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.cpp +++ b/cocos/editor-support/cocostudio/CCActionNode.cpp @@ -187,18 +187,18 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) return atof(value.c_str()); } - void ActionNode::initWithBinary(CocoLoader *pCocoLoader, - stExpCocoNode *pCocoNode, + void ActionNode::initWithBinary(CocoLoader *cocoLoader, + stExpCocoNode *cocoNode, cocos2d::Ref *root) { - stExpCocoNode *stChildNode = pCocoNode; + stExpCocoNode *stChildNode = cocoNode; int actionNodeCount = stChildNode->GetChildNum(); stChildNode = stChildNode[0].GetChildArray(); stExpCocoNode *frameListNode = NULL; for (int i = 0; i < actionNodeCount; ++i) { - std::string key = stChildNode[i].GetName(pCocoLoader); + std::string key = stChildNode[i].GetName(cocoLoader); std::string value = stChildNode[i].GetValue(); if (key == "ActionTag") { setActionTag(valueToInt(value)); @@ -227,7 +227,7 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) int framesCount = stFrameChildNode[i].GetChildNum(); stExpCocoNode *innerFrameNode = stFrameChildNode[i].GetChildArray(); for (int j = 0; j < framesCount; j++) { - std::string key = innerFrameNode[j].GetName(pCocoLoader); + std::string key = innerFrameNode[j].GetName(cocoLoader); std::string value = innerFrameNode[j].GetValue(); if (key == "frameid") { @@ -239,7 +239,7 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) int tweenParameterCount = innerFrameNode[j].GetChildNum(); stExpCocoNode *tweenParameterArray = innerFrameNode[j].GetChildArray(); for (int k = 0; k < tweenParameterCount; ++k) { - std::string t_key = tweenParameterArray[j].GetName(pCocoLoader); + std::string t_key = tweenParameterArray[j].GetName(cocoLoader); std::string t_value = tweenParameterArray[j].GetValue(); frameTweenParameter.push_back(valueToFloat(t_value)); } diff --git a/cocos/editor-support/cocostudio/CCActionNode.h b/cocos/editor-support/cocostudio/CCActionNode.h index cbccdd0a21..35f3d7391f 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.h +++ b/cocos/editor-support/cocostudio/CCActionNode.h @@ -151,7 +151,7 @@ public: /*init properties with a json dictionary*/ virtual void initWithDictionary(const rapidjson::Value& dic, cocos2d::Ref* root); - virtual void initWithBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode, Ref* root); + virtual void initWithBinary(CocoLoader* cocoLoader, stExpCocoNode* pCocoNode, Ref* root); /** * Gets if the action is done once time. diff --git a/cocos/editor-support/cocostudio/CCActionObject.cpp b/cocos/editor-support/cocostudio/CCActionObject.cpp index 1164bca760..ef23eb3bca 100644 --- a/cocos/editor-support/cocostudio/CCActionObject.cpp +++ b/cocos/editor-support/cocostudio/CCActionObject.cpp @@ -128,15 +128,15 @@ void ActionObject::initWithDictionary(const rapidjson::Value& dic, Ref* root) _fTotalTime = maxLength*_fUnitTime; } -void ActionObject::initWithBinary(CocoLoader *pCocoLoader, - stExpCocoNode *pCocoNode, +void ActionObject::initWithBinary(CocoLoader *cocoLoader, + stExpCocoNode *cocoNode, cocos2d::Ref *root) { - stExpCocoNode *stChildNode = pCocoNode->GetChildArray(); + stExpCocoNode *stChildNode = cocoNode->GetChildArray(); stExpCocoNode *actionNodeList = NULL; - int count = pCocoNode->GetChildNum(); + int count = cocoNode->GetChildNum(); for (int i = 0; i < count; ++i) { - std::string key = stChildNode[i].GetName(pCocoLoader); + std::string key = stChildNode[i].GetName(cocoLoader); std::string value = stChildNode[i].GetValue(); if (key == "name") { setName(value.c_str()); @@ -158,7 +158,7 @@ void ActionObject::initWithBinary(CocoLoader *pCocoLoader, ActionNode* actionNode = new ActionNode(); actionNode->autorelease(); - actionNode->initWithBinary(pCocoLoader, &actionNodeArray[i] , root); + actionNode->initWithBinary(cocoLoader, &actionNodeArray[i] , root); actionNode->setUnitTime(getUnitTime()); diff --git a/cocos/editor-support/cocostudio/CCActionObject.h b/cocos/editor-support/cocostudio/CCActionObject.h index 2c3f7684d6..a53edcfc84 100644 --- a/cocos/editor-support/cocostudio/CCActionObject.h +++ b/cocos/editor-support/cocostudio/CCActionObject.h @@ -164,7 +164,7 @@ public: /*init properties with a json dictionary*/ void initWithDictionary(const rapidjson::Value& dic, cocos2d::Ref* root); - void initWithBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode, cocos2d::Ref* root); + void initWithBinary(CocoLoader* cocoLoader, stExpCocoNode* pCocoNode, cocos2d::Ref* root); /*scheduler update function*/ diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp index 535b69069e..5ff23298f7 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp @@ -1865,11 +1865,11 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, } } - ArmatureData* DataReaderHelper::decodeArmature(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + ArmatureData* DataReaderHelper::decodeArmature(CocoLoader *cocoLoader, stExpCocoNode *cocoNode, DataInfo *dataInfo) { ArmatureData *armatureData = new ArmatureData(); armatureData->init(); - stExpCocoNode *pAramtureDataArray = pCocoNode->GetChildArray(); + stExpCocoNode *pAramtureDataArray = cocoNode->GetChildArray(); const char *name = pAramtureDataArray[2].GetValue(); //DICTOOL->getStringValue_json(json, A_NAME); if(name != NULL) { @@ -1886,7 +1886,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, { //const rapidjson::Value &dic = DICTOOL->getSubDictionary_json(json, BONE_DATA, i); //json[BONE_DATA][i]; child = &pBoneChildren[i]; - BoneData *boneData = decodeBone(pCocoLoader, child, dataInfo); + BoneData *boneData = decodeBone(cocoLoader, child, dataInfo); armatureData->addBoneData(boneData); boneData->release(); } @@ -1894,22 +1894,22 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return armatureData; } - BoneData* DataReaderHelper::decodeBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + BoneData* DataReaderHelper::decodeBone(CocoLoader *cocoLoader, stExpCocoNode *cocoNode, DataInfo *dataInfo) { BoneData *boneData = new BoneData(); boneData->init(); - decodeNode(boneData, pCocoLoader, pCocoNode, dataInfo); + decodeNode(boneData, cocoLoader, cocoNode, dataInfo); - int length = pCocoNode->GetChildNum(); - stExpCocoNode *pBoneChildren = pCocoNode->GetChildArray(); + int length = cocoNode->GetChildNum(); + stExpCocoNode *pBoneChildren = cocoNode->GetChildArray(); stExpCocoNode* child; const char *str = NULL; std::string key; for (int i = 0; i < length; ++i) { child = &pBoneChildren[i]; - key = child->GetName(pCocoLoader); + key = child->GetName(cocoLoader); str = child->GetValue(); if (key.compare(A_NAME) == 0) { @@ -1933,7 +1933,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, stExpCocoNode *pDisplayData = child->GetChildArray(); for (int ii = 0; ii < count; ++ii) { - DisplayData *displayData = decodeBoneDisplay(pCocoLoader, &pDisplayData[ii], dataInfo); + DisplayData *displayData = decodeBoneDisplay(cocoLoader, &pDisplayData[ii], dataInfo); if(displayData == NULL) continue; boneData->addDisplayData(displayData); @@ -1945,13 +1945,13 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return boneData; } - DisplayData* DataReaderHelper::decodeBoneDisplay(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + DisplayData* DataReaderHelper::decodeBoneDisplay(CocoLoader *cocoLoader, stExpCocoNode *cocoNode, DataInfo *dataInfo) { - stExpCocoNode* children = pCocoNode->GetChildArray(); + stExpCocoNode* children = cocoNode->GetChildArray(); stExpCocoNode* child = &children[1]; const char *str = NULL; - std::string key = child->GetName(pCocoLoader); + std::string key = child->GetName(cocoLoader); str = child->GetValue(); DisplayData *displayData = NULL; if (key.compare(A_DISPLAY_TYPE) == 0) @@ -1982,7 +1982,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, stExpCocoNode *SkinDataValue = pSkinData->GetChildArray(); for (int i = 0; i < length; ++i) { - key = SkinDataValue[i].GetName(pCocoLoader); + key = SkinDataValue[i].GetName(cocoLoader); str = SkinDataValue[i].GetValue(); if (key.compare(A_X) == 0) { @@ -2021,7 +2021,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, { displayData = new ArmatureDisplayData(); - const char *name = pCocoNode[0].GetValue(); + const char *name = cocoNode[0].GetValue(); if(name != NULL) { ((ArmatureDisplayData *)displayData)->displayName = name; @@ -2031,11 +2031,11 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, case CS_DISPLAY_PARTICLE: { displayData = new ParticleDisplayData(); - length = pCocoNode->GetChildNum(); - stExpCocoNode *pDisplayData = pCocoNode->GetChildArray(); + length = cocoNode->GetChildNum(); + stExpCocoNode *pDisplayData = cocoNode->GetChildArray(); for (int i = 0; i < length; ++i) { - key = pDisplayData[i].GetName(pCocoLoader); + key = pDisplayData[i].GetName(cocoLoader); str = pDisplayData[i].GetValue(); if (key.compare(A_PLIST) == 0) { @@ -2065,12 +2065,12 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return displayData; } - AnimationData* DataReaderHelper::decodeAnimation(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + AnimationData* DataReaderHelper::decodeAnimation(CocoLoader *cocoLoader, stExpCocoNode *cocoNode, DataInfo *dataInfo) { AnimationData *aniData = new AnimationData(); - int length = pCocoNode->GetChildNum(); - stExpCocoNode *pAnimationData = pCocoNode->GetChildArray(); + int length = cocoNode->GetChildNum(); + stExpCocoNode *pAnimationData = cocoNode->GetChildArray(); const char *str = NULL; std::string key; stExpCocoNode* child; @@ -2078,7 +2078,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, for (int i = 0; i < length; ++i) { child = &pAnimationData[i]; - key = child->GetName(pCocoLoader); + key = child->GetName(cocoLoader); str = child->GetValue(); if (key.compare(A_NAME) == 0) { @@ -2093,7 +2093,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, stExpCocoNode* movArray = child->GetChildArray(); for( int movnum =0; movnum addMovement(movementData); movementData->release(); } @@ -2102,13 +2102,13 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return aniData; } - MovementData* DataReaderHelper::decodeMovement(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + MovementData* DataReaderHelper::decodeMovement(CocoLoader *cocoLoader, stExpCocoNode *cocoNode, DataInfo *dataInfo) { MovementData *movementData = new MovementData(); movementData->scale = 1.0f; - int length = pCocoNode->GetChildNum(); - stExpCocoNode *pMoveDataArray = pCocoNode->GetChildArray(); + int length = cocoNode->GetChildNum(); + stExpCocoNode *pMoveDataArray = cocoNode->GetChildArray(); const char *str = NULL; std::string key; @@ -2116,7 +2116,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, for (int i = 0; i < length; ++i) { child = &pMoveDataArray[i]; - key = child->GetName(pCocoLoader); + key = child->GetName(cocoLoader); str = child->GetValue(); if (key.compare(A_NAME) == 0) { @@ -2183,7 +2183,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, MovementBoneData *movementBoneData; for (int ii = 0; ii < count; ++ii) { - movementBoneData = decodeMovementBone(pCocoLoader, &pMoveBoneData[ii],dataInfo); + movementBoneData = decodeMovementBone(cocoLoader, &pMoveBoneData[ii],dataInfo); movementData->addMovementBoneData(movementBoneData); movementBoneData->release(); } @@ -2192,19 +2192,19 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return movementData; } - MovementBoneData* DataReaderHelper::decodeMovementBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + MovementBoneData* DataReaderHelper::decodeMovementBone(CocoLoader *cocoLoader, stExpCocoNode *cocoNode, DataInfo *dataInfo) { MovementBoneData *movementBoneData = new MovementBoneData(); movementBoneData->init(); - int length = pCocoNode->GetChildNum(); - stExpCocoNode *pMovementBoneDataArray = pCocoNode->GetChildArray(); + int length = cocoNode->GetChildNum(); + stExpCocoNode *pMovementBoneDataArray = cocoNode->GetChildArray(); stExpCocoNode* movebonechild; const char *str = NULL; for (int i = 0; i < length; ++i) { movebonechild = &pMovementBoneDataArray[i]; - std::string key = movebonechild->GetName(pCocoLoader); + std::string key = movebonechild->GetName(cocoLoader); str = movebonechild->GetValue(); if (key.compare(A_NAME) == 0) { @@ -2226,7 +2226,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, stExpCocoNode *pFrameDataArray = movebonechild->GetChildArray(); for (int ii = 0; ii < count; ++ii) { - FrameData *frameData = decodeFrame(pCocoLoader, &pFrameDataArray[ii], dataInfo); + FrameData *frameData = decodeFrame(cocoLoader, &pFrameDataArray[ii], dataInfo); movementBoneData->addFrameData(frameData); frameData->release(); @@ -2286,18 +2286,18 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return movementBoneData; } - FrameData* DataReaderHelper::decodeFrame(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + FrameData* DataReaderHelper::decodeFrame(CocoLoader *cocoLoader, stExpCocoNode *cocoNode, DataInfo *dataInfo) { FrameData *frameData = new FrameData(); - decodeNode(frameData, pCocoLoader, pCocoNode, dataInfo); + decodeNode(frameData, cocoLoader, cocoNode, dataInfo); - int length = pCocoNode->GetChildNum(); - stExpCocoNode *pFrameDataArray = pCocoNode->GetChildArray(); + int length = cocoNode->GetChildNum(); + stExpCocoNode *pFrameDataArray = cocoNode->GetChildArray(); const char *str = NULL; for (int i = 0; i < length; ++i) { - std::string key = pFrameDataArray[i].GetName(pCocoLoader); + std::string key = pFrameDataArray[i].GetName(cocoLoader); str = pFrameDataArray[i].GetValue(); if (key.compare(A_TWEEN_EASING) == 0) { @@ -2390,33 +2390,33 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return frameData; } - TextureData* DataReaderHelper::decodeTexture(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + TextureData* DataReaderHelper::decodeTexture(CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { TextureData *textureData = new TextureData(); textureData->init(); - if(pCocoNode == NULL) + if(cocoNode == nullptr) { return textureData; } - int length = pCocoNode->GetChildNum(); - stExpCocoNode *pTextureDataArray = pCocoNode->GetChildArray(); - const char *str = NULL; + int length = cocoNode->GetChildNum(); + stExpCocoNode *pTextureDataArray = cocoNode->GetChildArray(); + const char *str = nullptr; for (int i = 0; i < length; ++i) { - std::string key = pTextureDataArray[i].GetName(pCocoLoader); + std::string key = pTextureDataArray[i].GetName(cocoLoader); str = pTextureDataArray[i].GetValue(); if (key.compare(A_NAME) == 0) { - if(str != NULL) + if(str != nullptr) { textureData->name = str; } } else if (key.compare(A_WIDTH) == 0) { - if(str != NULL) + if(str != nullptr) { textureData->width = atof(str); } @@ -2448,7 +2448,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, stExpCocoNode *pContourArray = pTextureDataArray[i].GetChildArray(); for (int ii = 0; ii < count; ++ii) { - ContourData *contourData = decodeContour(pCocoLoader, &pContourArray[ii]); + ContourData *contourData = decodeContour(cocoLoader, &pContourArray[ii]); textureData->contourDataList.pushBack(contourData); contourData->release(); } @@ -2457,17 +2457,17 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return textureData; } - ContourData* DataReaderHelper::decodeContour(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + ContourData* DataReaderHelper::decodeContour(CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { ContourData *contourData = new ContourData(); contourData->init(); - int length = pCocoNode->GetChildNum(); - stExpCocoNode *verTexPointArray = pCocoNode->GetChildArray(); - const char *str = NULL; + int length = cocoNode->GetChildNum(); + stExpCocoNode *verTexPointArray = cocoNode->GetChildArray(); + const char *str = nullptr; for (int i = 0; i < length; ++i) { - std::string key = verTexPointArray[i].GetName(pCocoLoader); + std::string key = verTexPointArray[i].GetName(cocoLoader); str = verTexPointArray[i].GetValue(); if (key.compare(VERTEX_POINT) == 0) { @@ -2487,10 +2487,10 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, return contourData; } - void DataReaderHelper::decodeNode(BaseData *node, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo) + void DataReaderHelper::decodeNode(BaseData *node, CocoLoader *cocoLoader, stExpCocoNode* cocoNode, DataInfo *dataInfo) { - int length = pCocoNode->GetChildNum(); - stExpCocoNode *NodeArray = pCocoNode->GetChildArray(); + int length = cocoNode->GetChildNum(); + stExpCocoNode *NodeArray = cocoNode->GetChildArray(); const char *str = NULL; bool isVersionL = dataInfo->cocoStudioVersion < VERSION_COLOR_READING; @@ -2498,7 +2498,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, for (int i = 0; i < length; ++i) { child = &NodeArray[i]; - std::string key = child->GetName(pCocoLoader); + std::string key = child->GetName(cocoLoader); str = child->GetValue(); if (key.compare(A_X) == 0) { @@ -2532,7 +2532,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, { if (!isVersionL) { - if (child->GetType(pCocoLoader) == rapidjson::kObjectType) + if (child->GetType(cocoLoader) == rapidjson::kObjectType) { if(child->GetChildNum() == 4) { @@ -2559,7 +2559,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, if(colorcoount>0) { - if (NodeArray[0].GetType(pCocoLoader) == rapidjson::kObjectType) + if (NodeArray[0].GetType(cocoLoader) == rapidjson::kObjectType) { if(NodeArray[0].GetChildNum() == 4) { diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.h b/cocos/editor-support/cocostudio/CCDataReaderHelper.h index f7a042b542..d591e63543 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.h +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.h @@ -180,19 +180,19 @@ public: // for binary decode public: static void addDataFromBinaryCache(const char *fileContent, DataInfo *dataInfo = NULL); - static ArmatureData *decodeArmature(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); - static BoneData *decodeBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); - static DisplayData *decodeBoneDisplay(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); - static AnimationData *decodeAnimation(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); - static MovementData *decodeMovement(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static ArmatureData *decodeArmature(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static BoneData *decodeBone(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static DisplayData *decodeBoneDisplay(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static AnimationData *decodeAnimation(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static MovementData *decodeMovement(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); - static MovementBoneData *decodeMovementBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); - static FrameData *decodeFrame(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static MovementBoneData *decodeMovementBone(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static FrameData *decodeFrame(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); - static TextureData *decodeTexture(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode); - static ContourData *decodeContour(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode); + static TextureData *decodeTexture(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode); + static ContourData *decodeContour(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode); - static void decodeNode(BaseData *node, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); + static void decodeNode(BaseData *node, CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); protected: void loadData(); diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index a6aa95f679..639253409c 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -1218,17 +1218,17 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c return widget; } - cocos2d::ui::Widget* WidgetPropertiesReader0300::createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName) + cocos2d::ui::Widget* WidgetPropertiesReader0300::createWidgetFromBinary(CocoLoader* cocoLoader,stExpCocoNode* cocoNode, const char* fileName) { - stExpCocoNode *tpChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *tpChildArray = cocoNode->GetChildArray(); float fileDesignWidth; float fileDesignHeight; Widget* widget = nullptr; - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = tpChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = tpChildArray[i].GetName(cocoLoader); if (key == "textures") { int texturesCount = tpChildArray[i].GetChildNum(); @@ -1257,11 +1257,11 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c stExpCocoNode *widgetTreeNode = &tpChildArray[i]; - rapidjson::Type tType = tpChildArray[i].GetType(pCocoLoader); + rapidjson::Type tType = tpChildArray[i].GetType(cocoLoader); if (rapidjson::kObjectType == tType) { - widget = widgetFromBinary(pCocoLoader, widgetTreeNode); + widget = widgetFromBinary(cocoLoader, widgetTreeNode); } if (widget->getContentSize().equals(Size::ZERO)) @@ -1274,12 +1274,12 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c /* ********************** */ /* ********************** */ - stExpCocoNode *optionChildNode = pCocoNode->GetChildArray(); - for (int k = 0; k < pCocoNode->GetChildNum(); ++k) { - std::string key = optionChildNode[k].GetName(pCocoLoader); + stExpCocoNode *optionChildNode = cocoNode->GetChildArray(); + for (int k = 0; k < cocoNode->GetChildNum(); ++k) { + std::string key = optionChildNode[k].GetName(cocoLoader); if (key == "animation") { Ref* rootWidget = (Ref*) widget; - ActionManagerEx::getInstance()->initWithBinary(fileName,rootWidget,pCocoLoader, &optionChildNode[k]); + ActionManagerEx::getInstance()->initWithBinary(fileName,rootWidget,cocoLoader, &optionChildNode[k]); break; } } @@ -1287,17 +1287,17 @@ Widget* WidgetPropertiesReader0300::createWidget(const rapidjson::Value& data, c return widget; } -Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) +Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* cocoLoader, stExpCocoNode* cocoNode) { Widget* widget = nullptr; - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); stExpCocoNode *optionsNode = nullptr; stExpCocoNode *childrenNode = nullptr; - int elementCount = pCocoNode->GetChildNum(); + int elementCount = cocoNode->GetChildNum(); std::string classname; for (int i = 0; i < elementCount; ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); if (key == "classname" ) @@ -1326,7 +1326,7 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s if (reader) { // widget parse with widget reader - setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader,optionsNode); + setPropsForAllWidgetFromBinary(reader, widget, cocoLoader,optionsNode); } else { @@ -1336,13 +1336,13 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s if (reader && widget) { - setPropsForAllWidgetFromBinary(reader, widget, pCocoLoader, optionsNode); + setPropsForAllWidgetFromBinary(reader, widget, cocoLoader, optionsNode); // 2nd., custom widget parse with custom reader //2nd. parse custom property const char* customProperty = NULL; stExpCocoNode *optionChildNode = optionsNode->GetChildArray(); for (int k = 0; k < optionsNode->GetChildNum(); ++k) { - std::string key = optionChildNode[k].GetName(pCocoLoader); + std::string key = optionChildNode[k].GetName(cocoLoader); if (key == "customProperty") { customProperty = optionChildNode[k].GetValue(); break; @@ -1364,17 +1364,17 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s //parse children if (nullptr != childrenNode) { - rapidjson::Type tType22 = childrenNode->GetType(pCocoLoader); + rapidjson::Type tType22 = childrenNode->GetType(cocoLoader); if (tType22 == rapidjson::kArrayType) { int childrenCount = childrenNode->GetChildNum(); stExpCocoNode* innerChildArray = childrenNode->GetChildArray(); for (int i=0; i < childrenCount; ++i) { - rapidjson::Type tType = innerChildArray[i].GetType(pCocoLoader); + rapidjson::Type tType = innerChildArray[i].GetType(cocoLoader); if (tType == rapidjson::kObjectType) { - Widget *child = widgetFromBinary(pCocoLoader, &innerChildArray[i]); + Widget *child = widgetFromBinary(cocoLoader, &innerChildArray[i]); if (child) { @@ -1417,10 +1417,10 @@ Widget* WidgetPropertiesReader0300::widgetFromBinary(CocoLoader* pCocoLoader, s void WidgetPropertiesReader0300::setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, - CocoLoader* pCocoLoader, - stExpCocoNode* pCocoNode) + CocoLoader* cocoLoader, + stExpCocoNode* cocoNode) { - reader->setPropsFromBinary(widget, pCocoLoader, pCocoNode); + reader->setPropsFromBinary(widget, cocoLoader, cocoNode); } diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index 5077ba1736..e7b8e6be26 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -104,16 +104,16 @@ public: const rapidjson::Value& customOptions) = 0; //add binary parsing - virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader,stExpCocoNode* pCocoNode, const char* fileName)=0; - virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) = 0; + virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* cocoLoader,stExpCocoNode* pCocoNode, const char* fileName)=0; + virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) = 0; virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, - CocoLoader* pCocoLoader, + CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) = 0; virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, cocos2d::ui::Widget* widget, - CocoLoader* pCocoLoader, + CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) = 0; protected: @@ -143,21 +143,21 @@ public: virtual cocos2d::ui::Widget* widgetFromJsonDictionary(const rapidjson::Value& dic); //added for binary parsing - virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader, + virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* cocoLoader, stExpCocoNode* pCocoNode, const char* fileName)override{return nullptr;} - virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, + virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* cocoLoader, stExpCocoNode* pCocoNode){return nullptr;} virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, - CocoLoader* pCocoLoader, + CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) {} virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, cocos2d::ui::Widget* widget, - CocoLoader* pCocoLoader, + CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) {} virtual void setPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); @@ -196,21 +196,21 @@ public: //add bin parse support - virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* pCocoLoader, + virtual cocos2d::ui::Widget* createWidgetFromBinary(CocoLoader* cocoLoader, stExpCocoNode* pCocoNode, const char* fileName)override; - virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* pCocoLoader, + virtual cocos2d::ui::Widget* widgetFromBinary(CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); virtual void setPropsForAllWidgetFromBinary(WidgetReaderProtocol* reader, cocos2d::ui::Widget* widget, - CocoLoader* pCocoLoader, + CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, cocos2d::ui::Widget* widget, - CocoLoader* pCocoLoader, + CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) { //TODO: custom property } diff --git a/cocos/editor-support/cocostudio/CocoLoader.cpp b/cocos/editor-support/cocostudio/CocoLoader.cpp index 36ff4a4ed4..90dfd12ecf 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.cpp +++ b/cocos/editor-support/cocostudio/CocoLoader.cpp @@ -122,19 +122,19 @@ stExpCocoNode* stExpCocoNode::GetChildArray() return (stExpCocoNode*)m_ChildArray; } -void stExpCocoNode::ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr) +void stExpCocoNode::ReBuild(char* cocoNodeAddr,char* pStringMemoryAddr) { m_szValue = m_szValue + (uint64_t)pStringMemoryAddr; if( -1 == m_AttribIndex ) { if(m_ChildNum > 0) { - m_ChildArray = m_ChildArray + (uint64_t)pCocoNodeAddr; + m_ChildArray = m_ChildArray + (uint64_t)cocoNodeAddr; stExpCocoNode* tpChildArray = (stExpCocoNode*)m_ChildArray; for(int i = 0 ; i < m_ChildNum ; i++) { - tpChildArray[i].ReBuild(pCocoNodeAddr,pStringMemoryAddr); + tpChildArray[i].ReBuild(cocoNodeAddr,pStringMemoryAddr); } } } diff --git a/cocos/editor-support/cocostudio/CocoLoader.h b/cocos/editor-support/cocostudio/CocoLoader.h index 7ccb736dc8..adf2394f97 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.h +++ b/cocos/editor-support/cocostudio/CocoLoader.h @@ -97,7 +97,7 @@ public: stExpCocoNode* GetChildArray(); public: - inline void ReBuild(char* pCocoNodeAddr,char* pStringMemoryAddr); + inline void ReBuild(char* cocoNodeAddr,char* pStringMemoryAddr); void WriteJson(CocoLoader* pCoco, void* pFileName = NULL, int vLayer = 0, bool bEndNode = false, bool bParentNodeIsArray = false); }; diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index e7ddf5d638..e809e207df 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -57,21 +57,21 @@ namespace cocostudio CC_SAFE_DELETE(instanceButtonReader); } - void ButtonReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void ButtonReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + WidgetReader::setPropsFromBinary(widget, cocoLoader, cocoNode); Button *button = static_cast(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); this->beginSetBasicProperties(widget); float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; int cri = 255, cgi = 255, cbi = 255; float scale9Width = 0.0f, scale9Height = 0.0f; - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); // CCLOG("Button: key = %s, value = %d", key.c_str(), i); @@ -91,7 +91,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); button->loadTextureNormal(backgroundValue, imageFileNameType); @@ -103,7 +103,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); button->loadTexturePressed(backgroundValue, imageFileNameType); @@ -115,7 +115,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); button->loadTextureDisabled(backgroundValue, imageFileNameType); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h index 4f3be3170c..d2ba76cbde 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h @@ -42,7 +42,7 @@ namespace cocostudio virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index baceef63fa..6cf60f4f84 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -38,15 +38,15 @@ namespace cocostudio return instanceCheckBoxReader; } - void CheckBoxReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void CheckBoxReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { CheckBox *checkBox = static_cast(widget); this->beginSetBasicProperties(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); // CCLOG("key = %s, index : %d", key.c_str(), i); //read all basic properties of widget @@ -61,7 +61,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureBackGround(backgroundValue, imageFileNameType); }else if(key == P_BackGroundBoxSelectedData){ @@ -70,7 +70,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureBackGroundSelected(backgroundValue, imageFileNameType); }else if(key == P_FrontCrossData){ @@ -79,7 +79,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureFrontCross(backgroundValue, imageFileNameType); }else if(key == P_BackGroundBoxDisabledData){ @@ -88,7 +88,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureBackGroundDisabled(backgroundValue, imageFileNameType); }else if (key == P_FrontCrossDisabledData){ @@ -97,7 +97,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); checkBox->loadTextureFrontCrossDisabled(backgroundValue, imageFileNameType); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h index 01c10e1298..1c934dfb99 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 5b8e58b9f4..537fdeebfb 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -42,18 +42,18 @@ namespace cocostudio return instanceImageViewReader; } - void ImageViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void ImageViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + WidgetReader::setPropsFromBinary(widget, cocoLoader, cocoNode); ImageView* imageView = static_cast(widget); this->beginSetBasicProperties(widget); float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); //read all basic properties of widget @@ -70,7 +70,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); imageView->loadTexture(backgroundValue, imageFileNameType); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h index e0672de4f6..27dd31eab5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index e39570d322..7c381ea5f5 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -54,14 +54,14 @@ namespace cocostudio return instanceLayoutReader; } - void LayoutReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void LayoutReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + WidgetReader::setPropsFromBinary(widget, cocoLoader, cocoNode); Layout* panel = static_cast(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); this->beginSetBasicProperties(widget); int cr=0, cg = 0, cb = 0; @@ -72,8 +72,8 @@ namespace cocostudio Layout::Type layoutType; int bgColorOpacity = panel->getBackGroundColorOpacity(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); //read all basic properties of widget @@ -126,7 +126,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); panel->setBackGroundImage(backgroundValue, imageFileNameType); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h index db69aadfa3..77518df738 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp index 1cc5301062..cf1bdbee4e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp @@ -35,16 +35,16 @@ namespace cocostudio return instanceListViewReader; } - void ListViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void ListViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode* cocoNode) { - ScrollViewReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + ScrollViewReader::setPropsFromBinary(widget, cocoLoader, cocoNode); ListView* listView = static_cast(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); if (key == P_Direction) { diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h index d327559ff7..226ac4fac8 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp index 9aaef346c8..92c23aa86d 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp @@ -42,19 +42,19 @@ namespace cocostudio return instanceLoadingBar; } - void LoadingBarReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void LoadingBarReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { - WidgetReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + WidgetReader::setPropsFromBinary(widget, cocoLoader, cocoNode); LoadingBar* loadingBar = static_cast(widget); this->beginSetBasicProperties(widget); float capsx = 0.0f, capsy = 0.0, capsWidth = 0.0, capsHeight = 0.0f; int percent = loadingBar->getPercent(); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); //read all basic properties of widget @@ -72,7 +72,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); loadingBar->loadTexture(backgroundValue, imageFileNameType); diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h index d1d3ca2ef0..7a08aa7e04 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp index ea4c08a796..6c741f5832 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp @@ -33,9 +33,9 @@ namespace cocostudio return instancePageViewReader; } - void PageViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void PageViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { - LayoutReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + LayoutReader::setPropsFromBinary(widget, cocoLoader, cocoNode); } void PageViewReader::setPropsFromJsonDictionary(Widget *widget, const rapidjson::Value &options) diff --git a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h index 59a1b17c3c..63f6f446ab 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* cocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp index a7318281c4..fb77972c2b 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp @@ -37,18 +37,18 @@ namespace cocostudio return instanceScrollViewReader; } - void ScrollViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void ScrollViewReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode* cocoNode) { //TODO::need to refactor... - LayoutReader::setPropsFromBinary(widget, pCocoLoader, pCocoNode); + LayoutReader::setPropsFromBinary(widget, cocoLoader, cocoNode); ScrollView* scrollView = static_cast(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); float innerWidth; float innerHeight; - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); if (key == P_InnerWidth) { innerWidth = valueToFloat(value); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h index 1ceb268dd7..ce95c3b5f7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index 8a185ac288..e117f61e24 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -43,7 +43,7 @@ namespace cocostudio return instanceSliderReader; } - void SliderReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void SliderReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode* cocoNode) { this->beginSetBasicProperties(widget); @@ -51,10 +51,10 @@ namespace cocostudio float barLength = 0.0f; int percent = slider->getPercent(); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); //read all basic properties of widget @@ -74,7 +74,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); slider->loadBarTexture(backgroundValue, imageFileNameType); @@ -86,7 +86,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); slider->loadSlidBallTextureNormal(backgroundValue, imageFileNameType); @@ -96,7 +96,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); slider->loadSlidBallTexturePressed(backgroundValue, imageFileNameType); @@ -106,7 +106,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); slider->loadSlidBallTextureDisabled(backgroundValue, imageFileNameType); @@ -116,7 +116,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); slider->loadProgressBarTexture(backgroundValue, imageFileNameType); diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h index c32a818c02..2ea5f002ff 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp index 0934240e10..d634c5cd39 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp @@ -41,22 +41,22 @@ namespace cocostudio return instanceTextAtalsReader; } - void TextAtlasReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void TextAtlasReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { this->beginSetBasicProperties(widget); TextAtlas* labelAtlas = static_cast(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); Widget::TextureResType type; std::string charMapFileName; std::string stringValue; std::string startCharMap; float itemWidth; float itemHeight; - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); //read all basic properties of widget @@ -73,7 +73,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); charMapFileName = backgroundValue; type = imageFileNameType; diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h index bae1cf7a94..99a00444c1 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h @@ -40,7 +40,7 @@ namespace cocostudio static TextAtlasReader* getInstance(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp index cfcb5503d3..f20326ba9b 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp @@ -35,17 +35,17 @@ namespace cocostudio return instanceTextBMFontReader; } - void TextBMFontReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void TextBMFontReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { this->beginSetBasicProperties(widget); TextBMFont* labelBMFont = static_cast(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); //read all basic properties of widget CC_BASIC_PROPERTY_BINARY_READER @@ -58,7 +58,7 @@ namespace cocostudio Widget::TextureResType imageFileNameType = (Widget::TextureResType)valueToInt(resType); - std::string backgroundValue = this->getResourcePath(pCocoLoader, &stChildArray[i], imageFileNameType); + std::string backgroundValue = this->getResourcePath(cocoLoader, &stChildArray[i], imageFileNameType); if (imageFileNameType == (Widget::TextureResType)0) { labelBMFont->setFntFile(backgroundValue); } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h index 211b5af9d6..4fdc193a40 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp index a7073ae485..5f56526e03 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp @@ -43,16 +43,16 @@ namespace cocostudio return instanceTextFieldReader; } - void TextFieldReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void TextFieldReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode* cocoNode) { this->beginSetBasicProperties(widget); TextField* textField = static_cast(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); //read all basic properties of widget diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h index fe6c9d60d5..bcd01d0021 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) ; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) ; }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp index d66bc19352..f7f0170bc7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp @@ -41,17 +41,17 @@ namespace cocostudio return instanceTextReader; } - void TextReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode) + void TextReader::setPropsFromBinary(cocos2d::ui::Widget *widget, CocoLoader *cocoLoader, stExpCocoNode *cocoNode) { this->beginSetBasicProperties(widget); - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); Text* label = static_cast(widget); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); //read all basic properties of widget CC_BASIC_PROPERTY_BINARY_READER diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.h b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.h index 09feb66b16..9482ecbe60 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.h @@ -41,7 +41,7 @@ namespace cocostudio static void purge(); virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index a735e854f7..5a4bb92783 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -291,9 +291,9 @@ namespace cocostudio return imageFileName_tp; } - std::string WidgetReader::getResourcePath(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, cocos2d::ui::Widget::TextureResType texType) + std::string WidgetReader::getResourcePath(CocoLoader *cocoLoader, stExpCocoNode *cocoNode, cocos2d::ui::Widget::TextureResType texType) { - stExpCocoNode *backGroundChildren = pCocoNode->GetChildArray(); + stExpCocoNode *backGroundChildren = cocoNode->GetChildArray(); std::string backgroundValue = backGroundChildren[0].GetValue(); if (backgroundValue.size() < 3) { @@ -342,14 +342,14 @@ namespace cocostudio } } - void WidgetReader::setPropsFromBinary(cocos2d::ui::Widget *widget, cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode) + void WidgetReader::setPropsFromBinary(cocos2d::ui::Widget *widget, cocostudio::CocoLoader *cocoLoader, cocostudio::stExpCocoNode *cocoNode) { - stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); + stExpCocoNode *stChildArray = cocoNode->GetChildArray(); this->beginSetBasicProperties(widget); - for (int i = 0; i < pCocoNode->GetChildNum(); ++i) { - std::string key = stChildArray[i].GetName(pCocoLoader); + for (int i = 0; i < cocoNode->GetChildNum(); ++i) { + std::string key = stChildArray[i].GetName(cocoLoader); std::string value = stChildArray[i].GetValue(); CC_BASIC_PROPERTY_BINARY_READER diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index e30d50fc98..a4945b4d4c 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -53,7 +53,7 @@ namespace cocostudio virtual void setColorPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options); - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode); + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); protected: std::string getResourcePath(const rapidjson::Value& dict, const std::string& key, @@ -61,7 +61,7 @@ namespace cocostudio void setAnchorPointForWidget(cocos2d::ui::Widget* widget, const rapidjson::Value&options); - std::string getResourcePath(CocoLoader* pCocoLoader, + std::string getResourcePath(CocoLoader* cocoLoader, stExpCocoNode* pCocoNode, cocos2d::ui::Widget::TextureResType texType); @@ -182,7 +182,7 @@ namespace cocostudio ui::Margin mg; \ int paramType = -1; \ for (int j = 0; j < stChildArray[i].GetChildNum(); ++j) { \ - std::string innerKey = layoutCocosNode[j].GetName(pCocoLoader); \ + std::string innerKey = layoutCocosNode[j].GetName(cocoLoader); \ std::string innerValue = layoutCocosNode[j].GetValue(); \ if (innerKey == P_Type) { \ paramType = valueToInt(innerValue); \ diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h index 605a97acab..c1494017cb 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h @@ -48,7 +48,7 @@ namespace cocostudio public: virtual ~WidgetReaderProtocol() {}; virtual void setPropsFromJsonDictionary(cocos2d::ui::Widget* widget, const rapidjson::Value& options) = 0; - virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* pCocoLoader, stExpCocoNode* pCocoNode) = 0; + virtual void setPropsFromBinary(cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) = 0; }; } From 87455b0ecb4d382c21b58c8c9b86312f10d13aa6 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 10:12:54 +0800 Subject: [PATCH 41/72] add constness to some function --- .../ActionTimeline/CCActionTimelineCache.cpp | 4 +- .../cocostudio/CCActionManagerEx.cpp | 4 +- .../cocostudio/CCActionNode.cpp | 8 +- .../editor-support/cocostudio/CCActionNode.h | 6 +- .../cocostudio/CCActionObject.cpp | 10 +-- .../cocostudio/CCActionObject.h | 6 +- .../cocostudio/CCDataReaderHelper.cpp | 78 +++++++++---------- .../cocostudio/CCDataReaderHelper.h | 2 +- .../ButtonReader/ButtonReader.cpp | 2 +- .../PageViewReader/PageViewReader.cpp | 2 +- .../ScrollViewReader/ScrollViewReader.cpp | 2 +- .../cocostudio/WidgetReader/WidgetReader.cpp | 6 +- .../cocostudio/WidgetReader/WidgetReader.h | 6 +- 13 files changed, 68 insertions(+), 68 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp index 442d23e501..0ad232ea06 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp @@ -332,7 +332,7 @@ Frame* ActionTimelineCache::loadTextureFrame(const rapidjson::Value& json) const char* texture = DICTOOL->getStringValue_json(json, Value); - if(texture != NULL) + if(texture != nullptr) { std::string path = texture; @@ -354,7 +354,7 @@ Frame* ActionTimelineCache::loadEventFrame(const rapidjson::Value& json) const char* evnt = DICTOOL->getStringValue_json(json, Value); - if(evnt != NULL) + if(evnt != nullptr) frame->setEvent(evnt); return frame; diff --git a/cocos/editor-support/cocostudio/CCActionManagerEx.cpp b/cocos/editor-support/cocostudio/CCActionManagerEx.cpp index 4c1f2bb824..21dc78b04b 100644 --- a/cocos/editor-support/cocostudio/CCActionManagerEx.cpp +++ b/cocos/editor-support/cocostudio/CCActionManagerEx.cpp @@ -84,7 +84,7 @@ void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::V cocos2d::Vector actionList; stExpCocoNode *stChildArray = pCocoNode->GetChildArray(); - stExpCocoNode *actionNode = NULL; + stExpCocoNode *actionNode = nullptr; for (int i=0; i < pCocoNode->GetChildNum(); ++i) { std::string key = stChildArray[i].GetName(cocoLoader); if (key == "actionlist") { @@ -92,7 +92,7 @@ void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::V break; } } - if (NULL != actionNode) + if (nullptr != actionNode) { int actionCount = actionNode->GetChildNum(); for (int i = 0; i < actionCount; ++i) { diff --git a/cocos/editor-support/cocostudio/CCActionNode.cpp b/cocos/editor-support/cocostudio/CCActionNode.cpp index 84ec680f15..eb68c98019 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.cpp +++ b/cocos/editor-support/cocostudio/CCActionNode.cpp @@ -169,11 +169,11 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) initActionNodeFromRoot(root); } - int ActionNode::valueToInt(std::string& value) + int ActionNode::valueToInt(const std::string& value) { return atoi(value.c_str()); } - bool ActionNode::valueToBool(std::string& value) + bool ActionNode::valueToBool(const std::string& value) { int intValue = valueToInt(value); if (1 == intValue) { @@ -182,7 +182,7 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) return false; } } - float ActionNode::valueToFloat(std::string& value) + float ActionNode::valueToFloat(const std::string& value) { return atof(value.c_str()); } @@ -196,7 +196,7 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) int actionNodeCount = stChildNode->GetChildNum(); stChildNode = stChildNode[0].GetChildArray(); - stExpCocoNode *frameListNode = NULL; + stExpCocoNode *frameListNode = nullptr; for (int i = 0; i < actionNodeCount; ++i) { std::string key = stChildNode[i].GetName(cocoLoader); std::string value = stChildNode[i].GetValue(); diff --git a/cocos/editor-support/cocostudio/CCActionNode.h b/cocos/editor-support/cocostudio/CCActionNode.h index 35f3d7391f..5b6da79620 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.h +++ b/cocos/editor-support/cocostudio/CCActionNode.h @@ -160,9 +160,9 @@ public: */ virtual bool isActionDoneOnce(); protected: - int valueToInt(std::string& value); - bool valueToBool(std::string& value); - float valueToFloat(std::string& value); + int valueToInt(const std::string& value); + bool valueToBool(const std::string& value); + float valueToFloat(const std::string& value); int _currentFrameIndex; int _destFrameIndex; diff --git a/cocos/editor-support/cocostudio/CCActionObject.cpp b/cocos/editor-support/cocostudio/CCActionObject.cpp index ef23eb3bca..0ab3dbdef8 100644 --- a/cocos/editor-support/cocostudio/CCActionObject.cpp +++ b/cocos/editor-support/cocostudio/CCActionObject.cpp @@ -133,7 +133,7 @@ void ActionObject::initWithBinary(CocoLoader *cocoLoader, cocos2d::Ref *root) { stExpCocoNode *stChildNode = cocoNode->GetChildArray(); - stExpCocoNode *actionNodeList = NULL; + stExpCocoNode *actionNodeList = nullptr; int count = cocoNode->GetChildNum(); for (int i = 0; i < count; ++i) { std::string key = stChildNode[i].GetName(cocoLoader); @@ -149,7 +149,7 @@ void ActionObject::initWithBinary(CocoLoader *cocoLoader, } } - if(NULL != actionNodeList) + if(nullptr != actionNodeList) { int actionNodeCount = actionNodeList->GetChildNum(); stExpCocoNode *actionNodeArray = actionNodeList->GetChildArray(); @@ -174,11 +174,11 @@ void ActionObject::initWithBinary(CocoLoader *cocoLoader, } } -int ActionObject::valueToInt(std::string& value) +int ActionObject::valueToInt(const std::string& value) { return atoi(value.c_str()); } -bool ActionObject::valueToBool(std::string& value) +bool ActionObject::valueToBool(const std::string& value) { int intValue = valueToInt(value); if (1 == intValue) { @@ -187,7 +187,7 @@ bool ActionObject::valueToBool(std::string& value) return false; } } -float ActionObject::valueToFloat(std::string& value) +float ActionObject::valueToFloat(const std::string& value) { return atof(value.c_str()); } diff --git a/cocos/editor-support/cocostudio/CCActionObject.h b/cocos/editor-support/cocostudio/CCActionObject.h index a53edcfc84..401a18431d 100644 --- a/cocos/editor-support/cocostudio/CCActionObject.h +++ b/cocos/editor-support/cocostudio/CCActionObject.h @@ -170,9 +170,9 @@ public: /*scheduler update function*/ void simulationActionUpdate(float dt); protected: - int valueToInt(std::string& value); - bool valueToBool(std::string& value); - float valueToFloat(std::string& value); + int valueToInt(const std::string& value); + bool valueToBool(const std::string& value); + float valueToFloat(const std::string& value); cocos2d::Vector _actionNodeList; std::string _name; diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp index 5ff23298f7..93a608bdaf 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp @@ -1405,7 +1405,7 @@ DisplayData *DataReaderHelper::decodeBoneDisplay(const rapidjson::Value& json, D displayData = new SpriteDisplayData(); const char *name = DICTOOL->getStringValue_json(json, A_NAME); - if(name != NULL) + if(name != nullptr) { ((SpriteDisplayData *)displayData)->displayName = name; } @@ -1823,7 +1823,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, } } // Auto losprite file - bool autoLoad = dataInfo->asyncStruct == NULL ? ArmatureDataManager::getInstance()->isAutoLoadSpriteFile() : dataInfo->asyncStruct->autoLoadSpriteFile; + bool autoLoad = dataInfo->asyncStruct == nullptr ? ArmatureDataManager::getInstance()->isAutoLoadSpriteFile() : dataInfo->asyncStruct->autoLoadSpriteFile; if (autoLoad) { for (int i = 0; i < nCount; ++i) @@ -1838,7 +1838,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, for (int ii = 0; ii < length; ii++) { const char *path = pConfigFilePath[ii].GetValue(); - if (path == NULL) + if (path == nullptr) { CCLOG("load CONFIG_FILE_PATH error."); return; @@ -1871,7 +1871,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, armatureData->init(); stExpCocoNode *pAramtureDataArray = cocoNode->GetChildArray(); const char *name = pAramtureDataArray[2].GetValue(); //DICTOOL->getStringValue_json(json, A_NAME); - if(name != NULL) + if(name != nullptr) { armatureData->name = name; } @@ -1904,7 +1904,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, int length = cocoNode->GetChildNum(); stExpCocoNode *pBoneChildren = cocoNode->GetChildArray(); stExpCocoNode* child; - const char *str = NULL; + const char *str = nullptr; std::string key; for (int i = 0; i < length; ++i) { @@ -1914,7 +1914,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, if (key.compare(A_NAME) == 0) { //DICTOOL->getStringValue_json(json, A_NAME); - if(str != NULL) + if(str != nullptr) { boneData->name = str; } @@ -1922,7 +1922,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, else if (key.compare(A_PARENT) == 0) { //DICTOOL->getStringValue_json(json, A_PARENT); - if(str != NULL) + if(str != nullptr) { boneData->parentName = str; } @@ -1934,7 +1934,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, for (int ii = 0; ii < count; ++ii) { DisplayData *displayData = decodeBoneDisplay(cocoLoader, &pDisplayData[ii], dataInfo); - if(displayData == NULL) + if(displayData == nullptr) continue; boneData->addDisplayData(displayData); displayData->release(); @@ -1949,11 +1949,11 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, { stExpCocoNode* children = cocoNode->GetChildArray(); stExpCocoNode* child = &children[1]; - const char *str = NULL; + const char *str = nullptr; std::string key = child->GetName(cocoLoader); str = child->GetValue(); - DisplayData *displayData = NULL; + DisplayData *displayData = nullptr; if (key.compare(A_DISPLAY_TYPE) == 0) { str = child->GetValue(); @@ -1967,15 +1967,15 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, displayData = new SpriteDisplayData(); const char *name = children[0].GetValue(); - if(name != NULL) + if(name != nullptr) { ((SpriteDisplayData *)displayData)->displayName = name; } stExpCocoNode *pSkinDataArray = children[2].GetChildArray(); - if (pSkinDataArray != NULL) + if (pSkinDataArray != nullptr) { stExpCocoNode *pSkinData = &pSkinDataArray[0]; - if (pSkinData != NULL) + if (pSkinData != nullptr) { SpriteDisplayData *sdd = (SpriteDisplayData *)displayData; length = pSkinData->GetChildNum(); @@ -2022,7 +2022,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, displayData = new ArmatureDisplayData(); const char *name = cocoNode[0].GetValue(); - if(name != NULL) + if(name != nullptr) { ((ArmatureDisplayData *)displayData)->displayName = name; } @@ -2040,7 +2040,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, if (key.compare(A_PLIST) == 0) { const char *plist = str; - if(plist != NULL) + if(plist != nullptr) { if (dataInfo->asyncStruct) { @@ -2071,7 +2071,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, int length = cocoNode->GetChildNum(); stExpCocoNode *pAnimationData = cocoNode->GetChildArray(); - const char *str = NULL; + const char *str = nullptr; std::string key; stExpCocoNode* child; MovementData *movementData; @@ -2082,7 +2082,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, str = child->GetValue(); if (key.compare(A_NAME) == 0) { - if(str != NULL) + if(str != nullptr) { aniData->name = str; } @@ -2110,7 +2110,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, int length = cocoNode->GetChildNum(); stExpCocoNode *pMoveDataArray = cocoNode->GetChildArray(); - const char *str = NULL; + const char *str = nullptr; std::string key; stExpCocoNode* child; for (int i = 0; i < length; ++i) @@ -2120,7 +2120,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, str = child->GetValue(); if (key.compare(A_NAME) == 0) { - if(str != NULL) + if(str != nullptr) { movementData->name = str; } @@ -2128,7 +2128,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, else if (key.compare(A_LOOP) == 0) { movementData->loop = true; - if(str != NULL) + if(str != nullptr) { if (strcmp("1", str) != 0) { @@ -2139,7 +2139,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, else if (key.compare(A_DURATION_TWEEN) == 0) { movementData->durationTween = 0; - if(str != NULL) + if(str != nullptr) { movementData->durationTween = atoi(str); } @@ -2147,7 +2147,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, else if (key.compare(A_DURATION_TO) == 0) { movementData->durationTo = 0; - if(str != NULL) + if(str != nullptr) { movementData->durationTo = atoi(str); } @@ -2155,7 +2155,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, else if (key.compare(A_DURATION) == 0) { movementData->duration = 0; - if(str != NULL) + if(str != nullptr) { movementData->duration = atoi(str); } @@ -2163,7 +2163,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, else if (key.compare(A_MOVEMENT_SCALE) == 0) { movementData->scale = 1.0; - if(str != NULL) + if(str != nullptr) { movementData->scale = atof(str); } @@ -2171,7 +2171,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, else if (key.compare(A_TWEEN_EASING) == 0) { movementData->tweenEasing = cocos2d::tweenfunc::Linear; - if(str != NULL) + if(str != nullptr) { movementData->tweenEasing = (TweenType)(atoi(str)); } @@ -2200,7 +2200,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, int length = cocoNode->GetChildNum(); stExpCocoNode *pMovementBoneDataArray = cocoNode->GetChildArray(); stExpCocoNode* movebonechild; - const char *str = NULL; + const char *str = nullptr; for (int i = 0; i < length; ++i) { movebonechild = &pMovementBoneDataArray[i]; @@ -2208,14 +2208,14 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, str = movebonechild->GetValue(); if (key.compare(A_NAME) == 0) { - if(str != NULL) + if(str != nullptr) { movementBoneData->name = str; } } else if (key.compare(A_MOVEMENT_DELAY) == 0) { - if(str != NULL) + if(str != nullptr) { movementBoneData->delay = atof(str); } @@ -2294,7 +2294,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, int length = cocoNode->GetChildNum(); stExpCocoNode *pFrameDataArray = cocoNode->GetChildArray(); - const char *str = NULL; + const char *str = nullptr; for (int i = 0; i < length; ++i) { std::string key = pFrameDataArray[i].GetName(cocoLoader); @@ -2302,28 +2302,28 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, if (key.compare(A_TWEEN_EASING) == 0) { frameData->tweenEasing = cocos2d::tweenfunc::Linear; - if(str != NULL) + if(str != nullptr) { frameData->tweenEasing = (TweenType)(atoi(str)); } } else if (key.compare(A_DISPLAY_INDEX) == 0) { - if(str != NULL) + if(str != nullptr) { frameData->displayIndex = atoi(str); } } else if (key.compare(A_BLEND_SRC) == 0) { - if(str != NULL) + if(str != nullptr) { frameData->blendFunc.src = (GLenum)(atoi(str)); } } else if (key.compare(A_BLEND_DST) == 0) { - if(str != NULL) + if(str != nullptr) { frameData->blendFunc.dst = (GLenum)(atoi(str)); } @@ -2331,7 +2331,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, else if (key.compare(A_TWEEN_FRAME) == 0) { frameData->isTween = true; - if(str != NULL) + if(str != nullptr) { if (strcmp("1", str) != 0) { @@ -2341,7 +2341,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, } else if (key.compare(A_EVENT) == 0) { - if(str != NULL) + if(str != nullptr) { frameData->strEvent = str; } @@ -2351,7 +2351,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, if (dataInfo->cocoStudioVersion < VERSION_COMBINED) { frameData->duration = 1; - if(str != NULL) + if(str != nullptr) { frameData->duration = atoi(str); } @@ -2361,7 +2361,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, { if (dataInfo->cocoStudioVersion >= VERSION_COMBINED) { - if(str != NULL) + if(str != nullptr) { frameData->frameID = atoi(str); } @@ -2377,7 +2377,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, for (int ii = 0; ii < count; ++ii) { str = pFrameData[ii].GetValue(); - if (str != NULL) + if (str != nullptr) { frameData->easingParams[ii] = atof(str); } @@ -2491,7 +2491,7 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json, { int length = cocoNode->GetChildNum(); stExpCocoNode *NodeArray = cocoNode->GetChildArray(); - const char *str = NULL; + const char *str = nullptr; bool isVersionL = dataInfo->cocoStudioVersion < VERSION_COLOR_READING; stExpCocoNode* child; diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.h b/cocos/editor-support/cocostudio/CCDataReaderHelper.h index d591e63543..12fb1f0844 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.h +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.h @@ -179,7 +179,7 @@ public: // for binary decode public: - static void addDataFromBinaryCache(const char *fileContent, DataInfo *dataInfo = NULL); + static void addDataFromBinaryCache(const char *fileContent, DataInfo *dataInfo = nullptr); static ArmatureData *decodeArmature(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); static BoneData *decodeBone(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); static DisplayData *decodeBoneDisplay(CocoLoader *cocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index e809e207df..7fc1ea8177 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -29,7 +29,7 @@ namespace cocostudio - static ButtonReader* instanceButtonReader = NULL; + static ButtonReader* instanceButtonReader = nullptr; IMPLEMENT_CLASS_WIDGET_READER_INFO(ButtonReader) diff --git a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp index 6c741f5832..048985cac1 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp @@ -10,7 +10,7 @@ using namespace ui; namespace cocostudio { - static PageViewReader* instancePageViewReader = NULL; + static PageViewReader* instancePageViewReader = nullptr; IMPLEMENT_CLASS_WIDGET_READER_INFO(PageViewReader) diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp index fb77972c2b..b2ab36cf47 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp @@ -14,7 +14,7 @@ namespace cocostudio static const char* P_Direction = "direction"; static const char* P_BounceEnable = "bounceEnable"; - static ScrollViewReader* instanceScrollViewReader = NULL; + static ScrollViewReader* instanceScrollViewReader = nullptr; IMPLEMENT_CLASS_WIDGET_READER_INFO(ScrollViewReader) diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index 5a4bb92783..1864f208e8 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -73,11 +73,11 @@ namespace cocostudio _positionPercentY(0.0f), _opacity(255) { - valueToInt = [=](std::string str) -> int{ + valueToInt = [=](const std::string& str) -> int{ return atoi(str.c_str()); }; - valueToBool = [=](std::string str) -> bool{ + valueToBool = [=](const std::string& str) -> bool{ int intValue = valueToInt(str); if (1 == intValue) { return true; @@ -86,7 +86,7 @@ namespace cocostudio } }; - valueToFloat = [=](std::string str) -> float{ + valueToFloat = [=](const std::string& str) -> float{ return atof(str.c_str()); }; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index a4945b4d4c..396da84a10 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -69,9 +69,9 @@ namespace cocostudio void endSetBasicProperties(cocos2d::ui::Widget *widget); - std::function valueToInt; - std::function valueToBool; - std::function valueToFloat; + std::function valueToInt; + std::function valueToBool; + std::function valueToFloat; float _sizePercentX; float _sizePercentY; From 39ee23795e6f3d18bbeda90236c05c11bf52f066 Mon Sep 17 00:00:00 2001 From: heliclei Date: Mon, 23 Jun 2014 10:26:36 +0800 Subject: [PATCH 42/72] send email notification if pull request build fail --- tools/jenkins-scripts/post-build.py | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tools/jenkins-scripts/post-build.py b/tools/jenkins-scripts/post-build.py index fb99727de8..0c1063e86a 100644 --- a/tools/jenkins-scripts/post-build.py +++ b/tools/jenkins-scripts/post-build.py @@ -4,6 +4,39 @@ import requests import jenkinsapi from jenkinsapi.jenkins import Jenkins from jenkinsapi.constants import STATUS_SUCCESS +from email.mime.text import MIMEText +import smtplib +def send_mail(sub,title,content): + #to_list = os.environ['EMAIL_LIST'].split(' ') + mail_user = os.environ['EMAIL_USER'] + mail_pass = os.environ['EMAIL_PWD'] + to_list = os.environ['EMAIL_LIST'].split(' ') + mail_postfix = 'gmail.com' + me = mail_user + "<" + mail_user + "@" + mail_postfix + ">" + msg = MIMEText(content, _subtype='plain', _charset='gb2312') + msg['Subject'] = sub + msg['From'] = me + msg['To'] = " ".join(to_list) + print 'to users:', msg['To'] + msg['Content'] = 'test' + try: + s = smtplib.SMTP('smtp.gmail.com', 587) + s.ehlo() + s.starttls() + s.login(mail_user,mail_pass) + s.sendmail(me, to_list, str(msg)) + print 'info:', me, to_list, str(msg) + s.close() + return True + except Exception, e: + print str(e) + return False + +def sendEmail(pr, html_url, target_url): + sub = "Pull request #" + str(pr) + " build is failed!" + title = "build failed!" + content = 'to view build result, check:\r\n'+target_url + '\r\nYou can view the failed pr at'+html_url + send_mail(sub, title, content) payload_str = os.environ['payload'] payload_str = payload_str.decode('utf-8','ignore') @@ -12,6 +45,7 @@ payload = json.loads(payload_str) #pr = payload['pull_request'] url = payload['html_url'] print "build pr:" + url +pr_num = payload['number'] #get statuses url statuses_url = payload['statuses_url'] @@ -30,6 +64,7 @@ if(result == STATUS_SUCCESS): else: data['state'] = "failure" data['description'] = "Build failed!" + sendEmail(pr_num, url, target_url) http_proxy = '' if(os.environ.has_key('HTTP_PROXY')): http_proxy = os.environ['HTTP_PROXY'] From 41c8a5e33b165393e173cf03e6741620ca49bdb7 Mon Sep 17 00:00:00 2001 From: heliclei Date: Mon, 23 Jun 2014 11:01:41 +0800 Subject: [PATCH 43/72] send email notification if build failed --- tools/jenkins-scripts/post-build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/jenkins-scripts/post-build.py b/tools/jenkins-scripts/post-build.py index 0c1063e86a..2efc346ded 100644 --- a/tools/jenkins-scripts/post-build.py +++ b/tools/jenkins-scripts/post-build.py @@ -35,7 +35,7 @@ def send_mail(sub,title,content): def sendEmail(pr, html_url, target_url): sub = "Pull request #" + str(pr) + " build is failed!" title = "build failed!" - content = 'to view build result, check:\r\n'+target_url + '\r\nYou can view the failed pr at'+html_url + content = 'to view build result, check:\r\n'+target_url + '\r\nYou can view the failed pr at:\r\n'+html_url send_mail(sub, title, content) payload_str = os.environ['payload'] From c9bcbfb2658d315d9ee6b31a3c6cd4ee81485bf0 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 12:09:49 +0800 Subject: [PATCH 44/72] fix addEventListener hidden problem --- cocos/ui/UIListView.cpp | 6 ++++++ cocos/ui/UIListView.h | 3 ++- cocos/ui/UIScrollView.h | 2 +- .../UIListViewTest/UIListViewTest.cpp | 17 +++++++++++++++++ .../UIListViewTest/UIListViewTest.h | 5 ++++- 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/cocos/ui/UIListView.cpp b/cocos/ui/UIListView.cpp index 16d9e29280..f171fae8b2 100644 --- a/cocos/ui/UIListView.cpp +++ b/cocos/ui/UIListView.cpp @@ -454,6 +454,12 @@ void ListView::addEventListenerListView(Ref *target, SEL_ListViewEvent selector) _listViewEventSelector = selector; } +void ListView::addEventListener(const ccScrollViewCallback& callback) +{ + ScrollView::addEventListener(callback); +} + + void ListView::addEventListener(const ccListViewCallback& callback) { _eventCallback = callback; diff --git a/cocos/ui/UIListView.h b/cocos/ui/UIListView.h index c14ff5f7a1..4e4f2fb6dd 100644 --- a/cocos/ui/UIListView.h +++ b/cocos/ui/UIListView.h @@ -174,7 +174,8 @@ public: CC_DEPRECATED_ATTRIBUTE void addEventListenerListView(Ref* target, SEL_ListViewEvent selector); void addEventListener(const ccListViewCallback& callback); - + virtual void addEventListener(const ccScrollViewCallback& callback) override; + /** * Changes scroll direction of scrollview. * diff --git a/cocos/ui/UIScrollView.h b/cocos/ui/UIScrollView.h index eb7271825b..9c6ae494e1 100644 --- a/cocos/ui/UIScrollView.h +++ b/cocos/ui/UIScrollView.h @@ -251,7 +251,7 @@ public: * Add call back function called scrollview event triggered */ CC_DEPRECATED_ATTRIBUTE void addEventListenerScrollView(Ref* target, SEL_ScrollViewEvent selector); - void addEventListener(const ccScrollViewCallback& callback); + virtual void addEventListener(const ccScrollViewCallback& callback); //all of these functions are related to innerContainer. virtual void addChild(Node * child) override; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp index ce6a001d2e..ae5167e272 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp @@ -66,6 +66,8 @@ bool UIListViewTest_Vertical::init() (widgetSize.height - backgroundSize.height) / 2.0f + (backgroundSize.height - listView->getSize().height) / 2.0f)); listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEvent, this)); + listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEventScrollView,this)); + _uiLayer->addChild(listView); @@ -187,6 +189,21 @@ void UIListViewTest_Vertical::selectedItemEvent(Ref *pSender, ListView::EventTyp } } +void UIListViewTest_Vertical::selectedItemEventScrollView(Ref* pSender, ui::ScrollView::EventType type) +{ + switch (type) { + case ui::ScrollView::EventType::SCROLL_TO_BOTTOM: + CCLOG("SCROLL_TO_BOTTOM"); + break; + case ui::ScrollView::EventType::SCROLL_TO_TOP: + CCLOG("SCROLL_TO_TOP"); + break; + default: + break; + } +} + + // UIListViewTest_Horizontal UIListViewTest_Horizontal::UIListViewTest_Horizontal() diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h index 4292cb364e..dfaab5f559 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h @@ -26,6 +26,7 @@ #define __TestCpp__UIListViewTest__ #include "../UIScene.h" +#include "ui/UIScrollView.h" class UIListViewTest_Vertical : public UIScene { @@ -34,7 +35,8 @@ public: ~UIListViewTest_Vertical(); bool init(); void selectedItemEvent(Ref* pSender, ListView::EventType type); - + void selectedItemEventScrollView(Ref* pSender, ui::ScrollView::EventType type); + protected: UI_SCENE_CREATE_FUNC(UIListViewTest_Vertical) Text* _displayValueLabel; @@ -49,6 +51,7 @@ public: ~UIListViewTest_Horizontal(); bool init(); void selectedItemEvent(Ref* pSender, ListView::EventType type); + protected: UI_SCENE_CREATE_FUNC(UIListViewTest_Horizontal) From c40c46184886acbe7f68ff80a37350898effaf4b Mon Sep 17 00:00:00 2001 From: boyu0 Date: Mon, 23 Jun 2014 13:55:52 +0800 Subject: [PATCH 45/72] closed #5541: add warning code and comment. --- cocos/2d/CCActionInterval.cpp | 22 +++++++++-- cocos/2d/CCActionInterval.h | 4 ++ cocos/2d/CCNode.cpp | 37 ++++++++++++++++++- cocos/2d/CCNode.h | 10 +++++ .../Classes/PhysicsTest/PhysicsTest.cpp | 1 + 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 8a12fc5b56..9caf34d096 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -835,11 +835,18 @@ void RotateTo::update(float time) } else { -#endif // CC_USE_PHYSICS + // _startAngleX != _startAngleY || _diffAngleX != _diffAngleY + if (_target->getPhysicsBody() != nullptr) + { + CCLOG("RotateTo WARNING: PhysicsBody doesn't support skew rotation"); + } + _target->setRotationSkewX(_startAngleX + _diffAngleX * time); _target->setRotationSkewY(_startAngleY + _diffAngleY * time); -#if CC_USE_PHYSICS } +#else + _target->setRotationSkewX(_startAngleX + _diffAngleX * time); + _target->setRotationSkewY(_startAngleY + _diffAngleY * time); #endif // CC_USE_PHYSICS } } @@ -970,11 +977,18 @@ void RotateBy::update(float time) } else { -#endif // CC_USE_PHYSICS + // _startAngleZ_X != _startAngleZ_Y || _angleZ_X != _angleZ_Y + if (_target->getPhysicsBody() != nullptr) + { + CCLOG("RotateBy WARNING: PhysicsBody doesn't support skew rotation"); + } + _target->setRotationSkewX(_startAngleZ_X + _angleZ_X * time); _target->setRotationSkewY(_startAngleZ_Y + _angleZ_Y * time); -#if CC_USE_PHYSICS } +#else + _target->setRotationSkewX(_startAngleZ_X + _angleZ_X * time); + _target->setRotationSkewY(_startAngleZ_Y + _angleZ_Y * time); #endif // CC_USE_PHYSICS } } diff --git a/cocos/2d/CCActionInterval.h b/cocos/2d/CCActionInterval.h index 79b2d1b0f7..b735a1fb3b 100644 --- a/cocos/2d/CCActionInterval.h +++ b/cocos/2d/CCActionInterval.h @@ -370,6 +370,7 @@ class CC_DLL RotateBy : public ActionInterval public: /** creates the action */ static RotateBy* create(float duration, float deltaAngle); + /** @warning The physics body contained in Node doesn't support rotate with different x and y angle. */ static RotateBy* create(float duration, float deltaAngleZ_X, float deltaAngleZ_Y); static RotateBy* create(float duration, const Vec3& deltaAngle3D); @@ -387,6 +388,7 @@ CC_CONSTRUCTOR_ACCESS: /** initializes the action */ bool initWithDuration(float duration, float deltaAngle); + /** @warning The physics body contained in Node doesn't support rotate with different x and y angle. */ bool initWithDuration(float duration, float deltaAngleZ_X, float deltaAngleZ_Y); bool initWithDuration(float duration, const Vec3& deltaAngle3D); @@ -675,6 +677,7 @@ private: /** @brief Scales a Node object to a zoom factor by modifying it's scale attribute. @warning This action doesn't support "reverse" + @warning The physics body contained in Node doesn't support this action. */ class CC_DLL ScaleTo : public ActionInterval { @@ -726,6 +729,7 @@ private: }; /** @brief Scales a Node object a zoom factor by modifying it's scale attribute. + @warning The physics body contained in Node doesn't support this action. */ class CC_DLL ScaleBy : public ScaleTo { diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 6916886755..37d5523378 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -319,6 +319,13 @@ void Node::setRotationSkewX(float rotationX) if (_rotationZ_X == rotationX) return; +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setRotationSkewX"); + } +#endif + _rotationZ_X = rotationX; _transformUpdated = _transformDirty = _inverseDirty = true; } @@ -333,6 +340,13 @@ void Node::setRotationSkewY(float rotationY) if (_rotationZ_Y == rotationY) return; +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setRotationSkewY"); + } +#endif + _rotationZ_Y = rotationY; _transformUpdated = _transformDirty = _inverseDirty = true; } @@ -349,7 +363,14 @@ void Node::setScale(float scale) { if (_scaleX == scale) return; - + +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setScale"); + } +#endif + _scaleX = _scaleY = _scaleZ = scale; _transformUpdated = _transformDirty = _inverseDirty = true; } @@ -377,6 +398,13 @@ void Node::setScaleX(float scaleX) if (_scaleX == scaleX) return; +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setScaleX"); + } +#endif + _scaleX = scaleX; _transformUpdated = _transformDirty = _inverseDirty = true; } @@ -409,6 +437,13 @@ void Node::setScaleY(float scaleY) if (_scaleY == scaleY) return; +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setScaleY"); + } +#endif + _scaleY = scaleY; _transformUpdated = _transformDirty = _inverseDirty = true; } diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index c8d5ba276d..10cfcb633c 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -201,6 +201,8 @@ public: * It is a scaling factor that multiplies the width of the node and its children. * * @param scaleX The scale factor on X axis. + * + * @warning The physics body doesn't support this. */ virtual void setScaleX(float scaleX); /** @@ -219,6 +221,8 @@ public: * It is a scaling factor that multiplies the height of the node and its children. * * @param scaleY The scale factor on Y axis. + * + * @warning The physics body doesn't support this. */ virtual void setScaleY(float scaleY); /** @@ -273,6 +277,8 @@ public: * * @param scaleX The scale factor on X axis. * @param scaleY The scale factor on Y axis. + * + * @warning The physics body doesn't support this. */ virtual void setScale(float scaleX, float scaleY); @@ -537,6 +543,8 @@ public: * Positive values rotate node clockwise, and negative values for anti-clockwise. * * @param rotationX The X rotation in degrees which performs a horizontal rotational skew. + * + * @warning The physics body doesn't support this. */ virtual void setRotationSkewX(float rotationX); CC_DEPRECATED_ATTRIBUTE virtual void setRotationX(float rotationX) { return setRotationSkewX(rotationX); } @@ -561,6 +569,8 @@ public: * Positive values rotate node clockwise, and negative values for anti-clockwise. * * @param rotationY The Y rotation in degrees. + * + * @warning The physics body doesn't support this. */ virtual void setRotationSkewY(float rotationY); CC_DEPRECATED_ATTRIBUTE virtual void setRotationY(float rotationY) { return setRotationSkewY(rotationY); } diff --git a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp index 93c251f49a..714d3b1fef 100644 --- a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp +++ b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp @@ -1711,6 +1711,7 @@ void Bug5482::onEnter() void Bug5482::onExit() { + PhysicsDemo::onExit(); _body->release(); } From 93319f3a3b823b24e70a171591b35123d80df3b2 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 14:56:41 +0800 Subject: [PATCH 46/72] fix lua ui binding compile error --- cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp b/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp index 026b8315b8..349afad181 100644 --- a/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp @@ -445,7 +445,7 @@ static int lua_cocos2dx_ListView_addEventListener(lua_State* L) #endif LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); - self->addEventListener([=](cocos2d::Ref* ref,ListView::EventType eventType){ + self->addEventListener((ui::ListView::ccListViewCallback)[=](cocos2d::Ref* ref,ListView::EventType eventType){ handleUIEvent(handler, ref, (int)eventType); }); From e72d89ba2f83df2a978c3defe3491f0d2800c707 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 15:21:25 +0800 Subject: [PATCH 47/72] fix windows tests compile error --- .../CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp index ae5167e272..ddaa54ada5 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp @@ -65,8 +65,8 @@ bool UIListViewTest_Vertical::init() (backgroundSize.width - listView->getSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + (backgroundSize.height - listView->getSize().height) / 2.0f)); - listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEvent, this)); - listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEventScrollView,this)); + listView->addEventListener((ui::ListView::ccListViewCallback)CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEvent, this)); + listView->addEventListener((ui::ListView::ccScrollViewCallback)CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEventScrollView,this)); _uiLayer->addChild(listView); @@ -266,7 +266,7 @@ bool UIListViewTest_Horizontal::init() (backgroundSize.width - listView->getSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + (backgroundSize.height - listView->getSize().height) / 2.0f)); - listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Horizontal::selectedItemEvent, this)); + listView->addEventListener((ui::ListView::ccListViewCallback)CC_CALLBACK_2(UIListViewTest_Horizontal::selectedItemEvent, this)); _uiLayer->addChild(listView); From 808c4bd76337c270d94aabfeb8516bbffafe8e5b Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 15:46:07 +0800 Subject: [PATCH 48/72] remove unused override method --- cocos/ui/UIListView.cpp | 5 ----- cocos/ui/UIListView.h | 2 +- tests/cpp-tests/Resources/ccs-res | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/cocos/ui/UIListView.cpp b/cocos/ui/UIListView.cpp index f171fae8b2..07cf75847e 100644 --- a/cocos/ui/UIListView.cpp +++ b/cocos/ui/UIListView.cpp @@ -453,11 +453,6 @@ void ListView::addEventListenerListView(Ref *target, SEL_ListViewEvent selector) _listViewEventListener = target; _listViewEventSelector = selector; } - -void ListView::addEventListener(const ccScrollViewCallback& callback) -{ - ScrollView::addEventListener(callback); -} void ListView::addEventListener(const ccListViewCallback& callback) diff --git a/cocos/ui/UIListView.h b/cocos/ui/UIListView.h index 4e4f2fb6dd..300b301b7c 100644 --- a/cocos/ui/UIListView.h +++ b/cocos/ui/UIListView.h @@ -174,7 +174,7 @@ public: CC_DEPRECATED_ATTRIBUTE void addEventListenerListView(Ref* target, SEL_ListViewEvent selector); void addEventListener(const ccListViewCallback& callback); - virtual void addEventListener(const ccScrollViewCallback& callback) override; + using ScrollView::addEventListener; /** * Changes scroll direction of scrollview. diff --git a/tests/cpp-tests/Resources/ccs-res b/tests/cpp-tests/Resources/ccs-res index b77212bf6f..2173b0b479 160000 --- a/tests/cpp-tests/Resources/ccs-res +++ b/tests/cpp-tests/Resources/ccs-res @@ -1 +1 @@ -Subproject commit b77212bf6fbdc33b9e08a68ed224121ad93864e5 +Subproject commit 2173b0b479e0e7be62df9ded754b20e75e74b0f2 From ce58c2ddd6bdece19c4721bea57f0de03a708ad3 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 16:53:06 +0800 Subject: [PATCH 49/72] remove unused header file --- cocos/editor-support/cocostudio/CocoLoader.h | 1 - 1 file changed, 1 deletion(-) diff --git a/cocos/editor-support/cocostudio/CocoLoader.h b/cocos/editor-support/cocostudio/CocoLoader.h index adf2394f97..5f59b496ee 100644 --- a/cocos/editor-support/cocostudio/CocoLoader.h +++ b/cocos/editor-support/cocostudio/CocoLoader.h @@ -29,7 +29,6 @@ #include #include #include -#include "extensions/ExtensionMacros.h" #include "json/rapidjson.h" #include "json/document.h" From dcc650a6f8a1d745248c1de7117d57fdf2461b00 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 17:04:59 +0800 Subject: [PATCH 50/72] fix android compile error --- .../scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp b/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp index 349afad181..f70115edf4 100644 --- a/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp @@ -445,9 +445,10 @@ static int lua_cocos2dx_ListView_addEventListener(lua_State* L) #endif LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); - self->addEventListener((ui::ListView::ccListViewCallback)[=](cocos2d::Ref* ref,ListView::EventType eventType){ + auto listViewCallback = [=](cocos2d::Ref* ref,ListView::EventType eventType){ handleUIEvent(handler, ref, (int)eventType); - }); + }; + self->addEventListener((ui::ListView::ccListViewCallback)listViewCallback); return 0; } From 3e5ab0ec8e957077de7389f82f7f66a90831c36c Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 17:09:54 +0800 Subject: [PATCH 51/72] fix linux compile error --- cocos/editor-support/cocostudio/CCDataReaderHelper.cpp | 3 +++ cocos/editor-support/cocostudio/CCDataReaderHelper.h | 4 ++-- cocos/editor-support/cocostudio/CCSGUIReader.h | 7 +++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp index 93a608bdaf..24d5147f47 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.cpp @@ -35,6 +35,9 @@ THE SOFTWARE. #include "cocostudio/CCArmatureDefine.h" #include "cocostudio/CCDatas.h" +#include "cocostudio/CocoLoader.h" + + using namespace cocos2d; diff --git a/cocos/editor-support/cocostudio/CCDataReaderHelper.h b/cocos/editor-support/cocostudio/CCDataReaderHelper.h index 12fb1f0844..2401d710d0 100644 --- a/cocos/editor-support/cocostudio/CCDataReaderHelper.h +++ b/cocos/editor-support/cocostudio/CCDataReaderHelper.h @@ -31,7 +31,6 @@ THE SOFTWARE. #include "cocostudio/DictionaryHelper.h" #include "json/document.h" -#include "Cocoloader.h" #include "DictionaryHelper.h" #include @@ -47,7 +46,8 @@ namespace tinyxml2 } namespace cocostudio { - + class CocoLoader; + struct stExpCocoNode; /** * @js NA * @lua NA diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index e7b8e6be26..4066e32fc8 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -30,11 +30,10 @@ THE SOFTWARE. #include "WidgetReader/WidgetReaderProtocol.h" #include "base/ObjectFactory.h" -class CocoLoader; -class stExpCocoNode; - - namespace cocostudio { + + class CocoLoader; + struct stExpCocoNode; #define kCCSVersion 1.0 From 8991ff739b30ad155d61d3d132824ca80d7d520e Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 23 Jun 2014 17:22:56 +0800 Subject: [PATCH 52/72] [ci skip] --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index dc7010aeaf..5c8f657170 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,7 @@ cocos2d-x-3.2 ??? [FIX] FileUtils: getStringFromFile may return a unterminated string [FIX] Lua-binding: Sequence:create will cause drop-dead issue [FIX] UIButton: doesn't support TTF font + [FIX] UIListView: addEventListener can not work cocos2d-x-3.2-alpha0 Jun.17 2014 [NEW] Console: add a command to show engine version From dce4c8a0a861201d943653a740d7f642235bf7d3 Mon Sep 17 00:00:00 2001 From: samuele3hu Date: Mon, 23 Jun 2014 17:29:56 +0800 Subject: [PATCH 53/72] Add Lua bindings for `addScrollViewEventListener` of `ui.ListView` and related test cases --- .../manual/lua_cocos2dx_ui_manual.cpp | 56 +++++++++++++++ .../CocoStudioGUITest/CocoStudioGUITest.lua | 68 ++++++++++--------- 2 files changed, 92 insertions(+), 32 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp b/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp index 026b8315b8..113144fcce 100644 --- a/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp @@ -463,6 +463,61 @@ tolua_lerror: #endif } +static int lua_cocos2dx_ListView_addScrollViewEventListener(lua_State* L) +{ + if (nullptr == L) + return 0; + + int argc = 0; + ListView* self = nullptr; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; + if (!tolua_isusertype(L,1,"ccui.ListView",0,&tolua_err)) goto tolua_lerror; +#endif + + self = static_cast(tolua_tousertype(L,1,0)); + +#if COCOS2D_DEBUG >= 1 + if (nullptr == self) { + tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_ListView_addScrollViewEventListener'\n", NULL); + return 0; + } +#endif + argc = lua_gettop(L) - 1; + if (1 == argc) + { +#if COCOS2D_DEBUG >= 1 + if (!toluafix_isfunction(L,2,"LUA_FUNCTION",0,&tolua_err)) + { + goto tolua_lerror; + } +#endif + LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); + + //TODO CHANGE + ui::ScrollView* scrollView = static_cast(self); + if(nullptr != scrollView) + { + scrollView->addEventListener([=](cocos2d::Ref* ref, ui::ScrollView::EventType eventType){ + handleUIEvent(handler, ref, (int)eventType); + }); + } + + return 0; + } + + CCLOG("'addScrollViewEventListener' function of ListView has wrong number of arguments: %d, was expecting %d\n", argc, 1); + + return 0; + +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(L,"#ferror in function 'addScrollViewEventListener'.",&tolua_err); + return 0; +#endif +} + static void extendListView(lua_State* L) { lua_pushstring(L, "ccui.ListView"); @@ -470,6 +525,7 @@ static void extendListView(lua_State* L) if (lua_istable(L,-1)) { tolua_function(L, "addEventListener", lua_cocos2dx_ListView_addEventListener); + tolua_function(L, "addScrollViewEventListener", lua_cocos2dx_ListView_addScrollViewEventListener); } lua_pop(L, 1); } diff --git a/tests/lua-tests/src/CocoStudioTest/CocoStudioGUITest/CocoStudioGUITest.lua b/tests/lua-tests/src/CocoStudioTest/CocoStudioGUITest/CocoStudioGUITest.lua index 7814234460..bd26c09888 100644 --- a/tests/lua-tests/src/CocoStudioTest/CocoStudioGUITest/CocoStudioGUITest.lua +++ b/tests/lua-tests/src/CocoStudioTest/CocoStudioGUITest/CocoStudioGUITest.lua @@ -2419,8 +2419,8 @@ function UIListViewVerticalTest:initExtend() local backgroundSize = background:getContentSize() local array = {} - for i = 0,19 do - array[i] = string.format("ListView_item_%d",i) + for i = 1,20 do + array[i] = string.format("ListView_item_%d",i - 1) end local function listViewEvent(sender, eventType) @@ -2429,10 +2429,17 @@ function UIListViewVerticalTest:initExtend() end end + local function scrollViewEvent(sender, evenType) + if evenType == ccui.ScrollviewEventType.scrollToBottom then + print("SCROLL_TO_BOTTOM") + elseif evenType == ccui.ScrollviewEventType.scrollToTop then + print("SCROLL_TO_TOP") + end + end + local listView = ccui.ListView:create() -- set list view ex direction listView:setDirection(ccui.ScrollViewDir.vertical) - listView:setTouchEnabled(true) listView:setBounceEnabled(true) listView:setBackGroundImage("cocosui/green_edit.png") listView:setBackGroundImageScale9Enabled(true) @@ -2442,14 +2449,13 @@ function UIListViewVerticalTest:initExtend() (widgetSize.height - backgroundSize.height) / 2.0 + (backgroundSize.height - listView:getSize().height) / 2.0)) listView:addEventListener(listViewEvent) + listView:addScrollViewEventListener(scrollViewEvent) self._uiLayer:addChild(listView) -- create model - local default_button = ccui.Button:create() + local default_button = ccui.Button:create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png") default_button:setName("Title Button") - default_button:setTouchEnabled(true) - default_button:loadTextures("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png", "") local default_item = ccui.Layout:create() default_item:setTouchEnabled(true) @@ -2461,8 +2467,7 @@ function UIListViewVerticalTest:initExtend() listView:setItemModel(default_item) --add default item - local count = table.getn(array) + 1 - print(math.floor(count / 4)) + local count = table.getn(array) for i = 1,math.floor(count / 4) do listView:pushBackDefaultItem() end @@ -2470,13 +2475,17 @@ function UIListViewVerticalTest:initExtend() for i = 1,math.floor(count / 4) do listView:insertDefaultItem(0) end + + listView:removeAllChildren() + + local testSprite = cc.Sprite:create("cocosui/backtotoppressed.png") + testSprite:setPosition(cc.p(200,200)) + listView:addChild(testSprite) --add custom item for i = 1,math.floor(count / 4) do - local custom_button = ccui.Button:create() + local custom_button = ccui.Button:create("cocosui/button.png", "cocosui/buttonHighlighted.png") custom_button:setName("Title Button") - custom_button:setTouchEnabled(true) - custom_button:loadTextures("cocosui/button.png", "cocosui/buttonHighlighted.png", "") custom_button:setScale9Enabled(true) custom_button:setSize(default_button:getSize()) @@ -2485,17 +2494,15 @@ function UIListViewVerticalTest:initExtend() custom_button:setPosition(cc.p(custom_item:getSize().width / 2.0, custom_item:getSize().height / 2.0)) custom_item:addChild(custom_button) - listView:pushBackCustomItem(custom_item) + listView:addChild(custom_item) end --insert custom item local items = listView:getItems() local items_count = table.getn(items) for i = 1, math.floor(count / 4) do - local custom_button = ccui.Button:create() + local custom_button = ccui.Button:create("cocosui/button.png", "cocosui/buttonHighlighted.png") custom_button:setName("Title Button") - custom_button:setTouchEnabled(true) - custom_button:loadTextures("cocosui/button.png", "cocosui/buttonHighlighted.png", "") custom_button:setScale9Enabled(true) custom_button:setSize(default_button:getSize()) @@ -2503,6 +2510,7 @@ function UIListViewVerticalTest:initExtend() custom_item:setSize(custom_button:getSize()) custom_button:setPosition(cc.p(custom_item:getSize().width / 2.0, custom_item:getSize().height / 2.0)) custom_item:addChild(custom_button) + custom_item:setTag(1) listView:insertCustomItem(custom_item, items_count) end @@ -2513,14 +2521,14 @@ function UIListViewVerticalTest:initExtend() local item = listView:getItem(i - 1) local button = item:getChildByName("Title Button") local index = listView:getIndex(item) - button:setTitleText(array[index]) + button:setTitleText(array[index + 1]) end -- remove last item - listView:removeLastItem() + listView:removeChildByTag(1) -- remove item by index - items_count = table.getn(items) + items_count = table.getn(listView:getItems()) listView:removeItem(items_count - 1) -- set all items layout gravity @@ -2580,8 +2588,8 @@ function UIListViewHorizontalTest:initExtend() local backgroundSize = background:getContentSize() local array = {} - for i = 0,19 do - array[i] = string.format("ListView_item_%d",i) + for i = 1,20 do + array[i] = string.format("ListView_item_%d",i - 1) end local function listViewEvent(sender, eventType) @@ -2607,10 +2615,8 @@ function UIListViewHorizontalTest:initExtend() -- create model - local default_button = ccui.Button:create() + local default_button = ccui.Button:create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png") default_button:setName("Title Button") - default_button:setTouchEnabled(true) - default_button:loadTextures("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png", "") local default_item = ccui.Layout:create() default_item:setTouchEnabled(true) @@ -2622,7 +2628,7 @@ function UIListViewHorizontalTest:initExtend() listView:setItemModel(default_item) --add default item - local count = table.getn(array) + 1 + local count = table.getn(array) for i = 1,math.floor(count / 4) do listView:pushBackDefaultItem() end @@ -2633,10 +2639,8 @@ function UIListViewHorizontalTest:initExtend() --add custom item for i = 1,math.floor(count / 4) do - local custom_button = ccui.Button:create() + local custom_button = ccui.Button:create("cocosui/button.png", "cocosui/buttonHighlighted.png") custom_button:setName("Title Button") - custom_button:setTouchEnabled(true) - custom_button:loadTextures("cocosui/button.png", "cocosui/buttonHighlighted.png", "") custom_button:setScale9Enabled(true) custom_button:setSize(default_button:getSize()) @@ -2652,10 +2656,8 @@ function UIListViewHorizontalTest:initExtend() local items = listView:getItems() local items_count = table.getn(items) for i = 1, math.floor(count / 4) do - local custom_button = ccui.Button:create() + local custom_button = ccui.Button:create("cocosui/button.png", "cocosui/buttonHighlighted.png") custom_button:setName("Title Button") - custom_button:setTouchEnabled(true) - custom_button:loadTextures("cocosui/button.png", "cocosui/buttonHighlighted.png", "") custom_button:setScale9Enabled(true) custom_button:setSize(default_button:getSize()) @@ -2669,18 +2671,20 @@ function UIListViewHorizontalTest:initExtend() -- set item data items_count = table.getn(listView:getItems()) + print("items_count", items_count) for i = 1,items_count do local item = listView:getItem(i - 1) local button = item:getChildByName("Title Button") local index = listView:getIndex(item) - button:setTitleText(array[index]) + print("index is ", index) + button:setTitleText(array[index + 1]) end -- remove last item listView:removeLastItem() -- remove item by index - items_count = table.getn(items) + items_count = table.getn(listView:getItems()) listView:removeItem(items_count - 1) -- set all items layout gravity From 6681d265403ca101a1b2b1c9056681e222326e4e Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 23 Jun 2014 09:37:28 +0000 Subject: [PATCH 54/72] [AUTO]: updating luabinding automatically --- .../scripting/lua-bindings/auto/api/Label.lua | 25 +- .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 229 ++++++++++++++---- .../lua-bindings/auto/lua_cocos2dx_auto.hpp | 3 + 3 files changed, 207 insertions(+), 50 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/api/Label.lua b/cocos/scripting/lua-bindings/auto/api/Label.lua index 158c715090..fe2250adc1 100644 --- a/cocos/scripting/lua-bindings/auto/api/Label.lua +++ b/cocos/scripting/lua-bindings/auto/api/Label.lua @@ -43,11 +43,6 @@ -- @param self -- @return color4b_table#color4b_table ret (return value: color4b_table) --------------------------------- --- @function [parent=#Label] getCommonLineHeight --- @param self --- @return int#int ret (return value: int) - -------------------------------- -- @function [parent=#Label] setWidth -- @param self @@ -90,6 +85,11 @@ -- @param self -- @return FontAtlas#FontAtlas ret (return value: cc.FontAtlas) +-------------------------------- +-- @function [parent=#Label] setLineHeight +-- @param self +-- @param #float float + -------------------------------- -- @function [parent=#Label] setSystemFontSize -- @param self @@ -120,6 +120,11 @@ -- @param #color4b_table color4b -- @param #int int +-------------------------------- +-- @function [parent=#Label] getAdditionalKerning +-- @param self +-- @return float#float ret (return value: float) + -------------------------------- -- overload function: setCharMap(cc.Texture2D, int, int, int) -- @@ -155,6 +160,11 @@ -- @param self -- @param #cc.TextVAlignment textvalignment +-------------------------------- +-- @function [parent=#Label] getLineHeight +-- @param self +-- @return float#float ret (return value: float) + -------------------------------- -- @function [parent=#Label] getTTFConfig -- @param self @@ -191,6 +201,11 @@ -- @param #int int -- @return Sprite#Sprite ret (return value: cc.Sprite) +-------------------------------- +-- @function [parent=#Label] setAdditionalKerning +-- @param self +-- @param #float float + -------------------------------- -- @function [parent=#Label] getSystemFontSize -- @param self diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 80ee426c6b..18904e44b5 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -32605,50 +32605,6 @@ int lua_cocos2dx_Label_getTextColor(lua_State* tolua_S) return 0; } -int lua_cocos2dx_Label_getCommonLineHeight(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::Label* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.Label",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::Label*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Label_getCommonLineHeight'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - return 0; - int ret = cobj->getCommonLineHeight(); - tolua_pushnumber(tolua_S,(lua_Number)ret); - return 1; - } - CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getCommonLineHeight",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Label_getCommonLineHeight'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_Label_setWidth(lua_State* tolua_S) { int argc = 0; @@ -33026,6 +32982,52 @@ int lua_cocos2dx_Label_getFontAtlas(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Label_setLineHeight(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Label* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Label",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Label*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Label_setLineHeight'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + double arg0; + + ok &= luaval_to_number(tolua_S, 2,&arg0); + if(!ok) + return 0; + cobj->setLineHeight(arg0); + return 0; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "setLineHeight",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Label_setLineHeight'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Label_setSystemFontSize(lua_State* tolua_S) { int argc = 0; @@ -33308,6 +33310,50 @@ int lua_cocos2dx_Label_enableOutline(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Label_getAdditionalKerning(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Label* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Label",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Label*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Label_getAdditionalKerning'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + return 0; + double ret = cobj->getAdditionalKerning(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getAdditionalKerning",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Label_getAdditionalKerning'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Label_setCharMap(lua_State* tolua_S) { int argc = 0; @@ -33579,6 +33625,50 @@ int lua_cocos2dx_Label_setVerticalAlignment(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Label_getLineHeight(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Label* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Label",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Label*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Label_getLineHeight'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + return 0; + double ret = cobj->getLineHeight(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getLineHeight",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Label_getLineHeight'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Label_getTTFConfig(lua_State* tolua_S) { int argc = 0; @@ -33896,6 +33986,52 @@ int lua_cocos2dx_Label_getLetter(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Label_setAdditionalKerning(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Label* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Label",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Label*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Label_setAdditionalKerning'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + double arg0; + + ok &= luaval_to_number(tolua_S, 2,&arg0); + if(!ok) + return 0; + cobj->setAdditionalKerning(arg0); + return 0; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "setAdditionalKerning",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Label_setAdditionalKerning'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Label_getSystemFontSize(lua_State* tolua_S) { int argc = 0; @@ -34435,7 +34571,6 @@ int lua_register_cocos2dx_Label(lua_State* tolua_S) tolua_function(tolua_S,"disableEffect",lua_cocos2dx_Label_disableEffect); tolua_function(tolua_S,"setTTFConfig",lua_cocos2dx_Label_setTTFConfig); tolua_function(tolua_S,"getTextColor",lua_cocos2dx_Label_getTextColor); - tolua_function(tolua_S,"getCommonLineHeight",lua_cocos2dx_Label_getCommonLineHeight); tolua_function(tolua_S,"setWidth",lua_cocos2dx_Label_setWidth); tolua_function(tolua_S,"getMaxLineWidth",lua_cocos2dx_Label_getMaxLineWidth); tolua_function(tolua_S,"getHorizontalAlignment",lua_cocos2dx_Label_getHorizontalAlignment); @@ -34444,17 +34579,20 @@ int lua_register_cocos2dx_Label(lua_State* tolua_S) tolua_function(tolua_S,"setSystemFontName",lua_cocos2dx_Label_setSystemFontName); tolua_function(tolua_S,"setBMFontFilePath",lua_cocos2dx_Label_setBMFontFilePath); tolua_function(tolua_S,"getFontAtlas",lua_cocos2dx_Label_getFontAtlas); + tolua_function(tolua_S,"setLineHeight",lua_cocos2dx_Label_setLineHeight); tolua_function(tolua_S,"setSystemFontSize",lua_cocos2dx_Label_setSystemFontSize); tolua_function(tolua_S,"updateContent",lua_cocos2dx_Label_updateContent); tolua_function(tolua_S,"getStringLength",lua_cocos2dx_Label_getStringLength); tolua_function(tolua_S,"setLineBreakWithoutSpace",lua_cocos2dx_Label_setLineBreakWithoutSpace); tolua_function(tolua_S,"getStringNumLines",lua_cocos2dx_Label_getStringNumLines); tolua_function(tolua_S,"enableOutline",lua_cocos2dx_Label_enableOutline); + tolua_function(tolua_S,"getAdditionalKerning",lua_cocos2dx_Label_getAdditionalKerning); tolua_function(tolua_S,"setCharMap",lua_cocos2dx_Label_setCharMap); tolua_function(tolua_S,"getDimensions",lua_cocos2dx_Label_getDimensions); tolua_function(tolua_S,"setMaxLineWidth",lua_cocos2dx_Label_setMaxLineWidth); tolua_function(tolua_S,"getSystemFontName",lua_cocos2dx_Label_getSystemFontName); tolua_function(tolua_S,"setVerticalAlignment",lua_cocos2dx_Label_setVerticalAlignment); + tolua_function(tolua_S,"getLineHeight",lua_cocos2dx_Label_getLineHeight); tolua_function(tolua_S,"getTTFConfig",lua_cocos2dx_Label_getTTFConfig); tolua_function(tolua_S,"getVerticalAlignment",lua_cocos2dx_Label_getVerticalAlignment); tolua_function(tolua_S,"setTextColor",lua_cocos2dx_Label_setTextColor); @@ -34462,6 +34600,7 @@ int lua_register_cocos2dx_Label(lua_State* tolua_S) tolua_function(tolua_S,"getWidth",lua_cocos2dx_Label_getWidth); tolua_function(tolua_S,"enableGlow",lua_cocos2dx_Label_enableGlow); tolua_function(tolua_S,"getLetter",lua_cocos2dx_Label_getLetter); + tolua_function(tolua_S,"setAdditionalKerning",lua_cocos2dx_Label_setAdditionalKerning); tolua_function(tolua_S,"getSystemFontSize",lua_cocos2dx_Label_getSystemFontSize); tolua_function(tolua_S,"getTextAlignment",lua_cocos2dx_Label_getTextAlignment); tolua_function(tolua_S,"getBMFontFilePath",lua_cocos2dx_Label_getBMFontFilePath); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index 5eeff5ebfd..44a7ca4c4b 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -1545,6 +1545,9 @@ int register_all_cocos2dx(lua_State* tolua_S); + + + From b23e1384f6f6f675dba0787cba056ed722db0b1c Mon Sep 17 00:00:00 2001 From: samuele3hu Date: Mon, 23 Jun 2014 17:42:04 +0800 Subject: [PATCH 55/72] Update the implementation of Lua bindings for `lua_cocos2dx_ListView_addScrollViewEventListener` --- .../lua-bindings/manual/lua_cocos2dx_ui_manual.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp b/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp index e74f5e09ae..8018cfaf81 100644 --- a/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/lua_cocos2dx_ui_manual.cpp @@ -496,14 +496,10 @@ static int lua_cocos2dx_ListView_addScrollViewEventListener(lua_State* L) #endif LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); - //TODO CHANGE - ui::ScrollView* scrollView = static_cast(self); - if(nullptr != scrollView) - { - scrollView->addEventListener([=](cocos2d::Ref* ref, ui::ScrollView::EventType eventType){ - handleUIEvent(handler, ref, (int)eventType); - }); - } + auto scrollViewCallback = [=](cocos2d::Ref* ref, ui::ScrollView::EventType eventType){ + handleUIEvent(handler, ref, (int)eventType); + }; + self->addEventListener((ui::ScrollView::ccScrollViewCallback)scrollViewCallback); return 0; } From d2680f2884341915528e99d13134d84aeca91f7e Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 23 Jun 2014 18:29:23 +0800 Subject: [PATCH 56/72] fix windows compile error --- .../cocostudio/ActionTimeline/CCNodeReader.cpp | 7 ++++--- .../cocostudio/ActionTimeline/CCNodeReader.h | 2 -- cocos/editor-support/cocostudio/CCSGUIReader.h | 10 ---------- .../cocostudio/WidgetReader/WidgetReader.h | 4 ++-- .../cocostudio/WidgetReader/WidgetReaderProtocol.h | 2 +- 5 files changed, 7 insertions(+), 18 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp index 9991baff0b..6f8d82afc8 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.cpp @@ -26,7 +26,7 @@ THE SOFTWARE. #include "CCActionTimelineCache.h" #include "CCActionTimeline.h" -#include "../CCSGUIReader.h" +#include "cocostudio/CCSGUIReader.h" using namespace cocos2d; using namespace ui; @@ -150,7 +150,6 @@ void NodeReader::init() _funcs.insert(Pair(ClassName_Widget, std::bind(&NodeReader::loadWidget, this, _1))); _funcs.insert(Pair(ClassName_Label, std::bind(&NodeReader::loadWidget, this, _1))); - _guiReader = new WidgetPropertiesReader0300(); } Node* NodeReader::createNode(const std::string& filename) @@ -445,7 +444,9 @@ Node* NodeReader::loadWidget(const rapidjson::Value& json) WidgetReaderProtocol* reader = dynamic_cast(ObjectFactory::getInstance()->createObject(readerName)); - _guiReader->setPropsForAllWidgetFromJsonDictionary(reader, widget, json); + 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)); diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.h b/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.h index 80a8a671ac..669a3123ed 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCNodeReader.h @@ -30,7 +30,6 @@ THE SOFTWARE. namespace cocostudio { -class WidgetPropertiesReader0300; namespace timeline{ @@ -78,7 +77,6 @@ protected: std::unordered_map _funcs; - WidgetPropertiesReader0300* _guiReader; bool _recordJsonPath; std::string _jsonPath; diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index 4066e32fc8..c5a798a878 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -110,11 +110,6 @@ public: CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) = 0; - virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, - cocos2d::ui::Widget* widget, - CocoLoader* cocoLoader, - stExpCocoNode* pCocoNode) = 0; - protected: void setAnchorPointForWidget(cocos2d::ui::Widget* widget, const rapidjson::Value&options); std::string getWidgetReaderClassName(const std::string& classname); @@ -153,11 +148,6 @@ public: cocos2d::ui::Widget* widget, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode) {} - - virtual void setPropsForAllCustomWidgetFromBinary(const std::string& classType, - cocos2d::ui::Widget* widget, - CocoLoader* cocoLoader, - stExpCocoNode* pCocoNode) {} virtual void setPropsForWidgetFromJsonDictionary(cocos2d::ui::Widget* widget,const rapidjson::Value& options); diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h index 396da84a10..25c5dbbe97 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.h @@ -26,7 +26,7 @@ #define __TestCpp__WidgetReader__ #include "WidgetReaderProtocol.h" -#include "../CCSGUIReader.h" +#include "cocostudio/CCSGUIReader.h" #include "ui/GUIDefine.h" #include "ui/UIWidget.h" @@ -34,7 +34,7 @@ namespace cocostudio { class CocoLoader; - class stExpCocoNode; + struct stExpCocoNode; class WidgetReader : public cocos2d::Ref, public WidgetReaderProtocol { diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h index c1494017cb..0461ca5cec 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h @@ -41,7 +41,7 @@ namespace cocos2d namespace cocostudio { class CocoLoader; - class stExpCocoNode; + struct stExpCocoNode; class WidgetReaderProtocol { From 8038db923c5af9debfc665254540a60acb1beaf6 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 23 Jun 2014 10:43:05 +0000 Subject: [PATCH 57/72] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index c0c0e1d3e0..2593c3a025 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -519,11 +519,11 @@ "cocos/editor-support/cocostudio/CCUtilMath.cpp", "cocos/editor-support/cocostudio/CCUtilMath.h", "cocos/editor-support/cocostudio/CMakeLists.txt", + "cocos/editor-support/cocostudio/CocoLoader.cpp", + "cocos/editor-support/cocostudio/CocoLoader.h", "cocos/editor-support/cocostudio/CocoStudio.h", "cocos/editor-support/cocostudio/DictionaryHelper.cpp", "cocos/editor-support/cocostudio/DictionaryHelper.h", - "cocos/editor-support/cocostudio/ObjectFactory.cpp", - "cocos/editor-support/cocostudio/ObjectFactory.h", "cocos/editor-support/cocostudio/TriggerBase.cpp", "cocos/editor-support/cocostudio/TriggerBase.h", "cocos/editor-support/cocostudio/TriggerMng.cpp", From 44d62480563cf8787d3686162342900b27567741 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Mon, 23 Jun 2014 08:31:29 -0700 Subject: [PATCH 58/72] added missing cocoloader files --- .../cocostudio/proj.wp8/libCocosStudio.vcxproj | 2 ++ .../cocostudio/proj.wp8/libCocosStudio.vcxproj.filters | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/cocos/editor-support/cocostudio/proj.wp8/libCocosStudio.vcxproj b/cocos/editor-support/cocostudio/proj.wp8/libCocosStudio.vcxproj index 4c0a02237d..63274ab39b 100644 --- a/cocos/editor-support/cocostudio/proj.wp8/libCocosStudio.vcxproj +++ b/cocos/editor-support/cocostudio/proj.wp8/libCocosStudio.vcxproj @@ -198,6 +198,7 @@ + @@ -271,6 +272,7 @@ + diff --git a/cocos/editor-support/cocostudio/proj.wp8/libCocosStudio.vcxproj.filters b/cocos/editor-support/cocostudio/proj.wp8/libCocosStudio.vcxproj.filters index 5080fc1d6e..391b28fbdc 100644 --- a/cocos/editor-support/cocostudio/proj.wp8/libCocosStudio.vcxproj.filters +++ b/cocos/editor-support/cocostudio/proj.wp8/libCocosStudio.vcxproj.filters @@ -247,6 +247,9 @@ TimelineAction + + json + @@ -451,5 +454,8 @@ TimelineAction + + json + \ No newline at end of file From 87a6b83001c28faf38cfef2cf26c7b712e4c965d Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Mon, 23 Jun 2014 08:35:39 -0700 Subject: [PATCH 59/72] added missing files for wp8 --- .../cpp-empty-test/Resources/fonts/arial.ttf | Bin 0 -> 778552 bytes .../cpp-empty-test/Package.appxmanifest | 59 ++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 tests/cpp-empty-test/Resources/fonts/arial.ttf create mode 100644 tests/cpp-empty-test/proj-wp8-xaml/cpp-empty-test/Package.appxmanifest diff --git a/tests/cpp-empty-test/Resources/fonts/arial.ttf b/tests/cpp-empty-test/Resources/fonts/arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..abc899cd55086105f439df7a6d01db84168aebb5 GIT binary patch literal 778552 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�~L; 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 z zHw$6aQj7K8qCe`gMJ2MP*`hu)VtI{TV$t`=tP8z(Vi?TN%?(@aY|}6ZT6($bcMh^`0Wk6zknZiJ8%@ zt8u&VQ{k-u+&J7`KHsUgmCrxdpOnu(V;)8O4!x}?Dq325X&3s0G7n|mfOboNyed8{ zx~z32y^#z?Gi?B^pbPYc=fTz+b!^eV=rELgC_7wU=Aet@RQY^~EOI4dXmmzm8#X{+ zV3OGKHcCtu_!cDUjKtZmuo##mPM=9BFiD&|jZ$EeIQ|Jrfl1=9v6KRn#DPO81ty8T z`ceu^61(J5Vp6QW53O-aVNJW9lSpAR1 zTQb5`!46gMt|}O<3KCU8f+~nt1wPe0qgclj-NC1hS=;j2s@8!IosL;`TRMB6iaLgj z#<0!Duus^?bT^chFJ&O)i@hOSBPuYDU6s`8#&Z3ZsUupq(_84ch1IY{j)2Ju+QMeE z1tnWhSCMHe=nI?RJd}ZrbS!Z^Up}qKv;nk&zVJAl2fN&z^SGjA1k-?v@0B~&fN3k} z5?In(_+zv+gNtG^YK2CICWp2&o{v-&qg0ouvMAmB#t(jlRdOpaP;kxfAyFmEBF%a@x^OcLPjcgJ9?v8TNCuo>k6g@F8TNC|QQG)oy3qq`;c zif)I#tjPY+8Kcp;Cc0H*pXjt3QcVMW)B%G}qS#C5gs$Ain&5PBLj1*_K zljn4CnmMUX3gh#l8LL;*sp5vYp>72?*bQ=B*LF=;yW&}HrUbj;P#Ui_7f4!T44Ox3}^X@GR-@AF^o9#^b_y7uy0ahb{=#&e{( znf?~Z9g3Z@ZvN)U9sEwt-FYjOn%eGytSfKrKg^&8JO33 z>baghCA`|$R^hF}(ktDPo%Mg2GVh{IffB&+{*<)zhCED3sOe z*}?x};KX4qL*y>B&05Q7Ic7cc)*9*RV%u(kdLuonXU`7BszW19h8*&NsM=m}vL(b!ogmSqAkEdMDQ~|k_qvP9Vt&C@aOm&}(E|(cy-S^)z zI}(sdV1i7w0@+b6v!hx;K*pb5u7>vyXRVB4f{2Qc$a0ZL6;Uoy?)l1ckp?$Kp7~qk znQ}|U4R6Y20u$7P9Q{isv#t`3J;h`BvUq-tT`j_YO4Q8kekD(wwod(E#I(=)SL=*aZ)jrZ1=@QF3oakR2jyqpXL zbNUcxz0}b!zF&rckOY#brwJn1@C`B;jrE%ewJ@ zH2i)0)5NXRva@OcEJjv`&>fXWMigTrvjzevJR!{0${#EDow&i5t zMrC~}TLuIT<8Q%0U0R^dmvdAaE5WJw)}N;ACK4dSBVeKzm@WPqU*7jNlI-vQ*wx z_c8K*qij|e==B~a0;?H~UtO|f9%JQa$BgT${VY|ZY_&9C6ukjoAbXcg zlyy=~g_oUTWc^ddSM+*HLL^pNOAh1lpHm&n9+KX2#C%ekOGifOk5mO^d1cefW|l2x z)Yw{Md)c4jl?WNY-xp=)tOI3-`Qee?@)9G1xUWe$o{#;J*FzVx9ln& z#K^<=U`i+XLT%E?Xdfg$sc<#HXoHqF%KT+pk&2Xicv@gCBj1~<+jWf9yR1{$7g7xy z}8+b}# zkBUk(G4mCD%3@n!pXXY{ouo_K_wZ;TQbi;egj$ny-($Q-nnuosk9`X#Q#*xX%Jp1uxx$i4@8siI|6F860A&d(T_*|b6 z-I=-ze|_{I{U8TpGxch{UtcvG#*J1qsv1eg?Z!REAf8rx#F%aPjh&3wJ!V`suJc!B z2AR=jteI#go41>N&4{%8l;57<+9O5zueYSNt?r>k=h&jGA)_PP0i zQJjqB^;w~QRNf{)B}D^FsKd9uQIP(3E^>$W^Ubj_W{ zcHCJlW51BAQq>isjKkp0Y(>qDALL27Umsxn=)*EqURDFmdwG7Sv6{eBKTG&j)U}2) zuCc26Oy6e~>dI=hX!C8NyM^ak46BMvR`(cl?eqFup7z;o21$vr9PfAY#9$}$g4In8 z;S=x}&m=uq_JllQ<(Yfcy$pTsAqnPD_HGl5R5OP8vrk*Yr+Xdyf!0PRYQoua zIajm~x@-a(m&%Xwyew5ul|IVTNl|=qN>oQHTkp2A%j)Su{jKh>|tM#{v5C#C(3hJXlHDa#-*M0%Cc-@B=H`Ru4QkP zMXMkgQZ`Jw$a;Cxv811q%sTd~y~O*d4AR}o#u$TmK5!Nu_GV8zgJAG z_%)I1I6iiUOL!ixvxuh!Q0FOSZ7=3HU^1K)2_6V+Rlz6tonD@GtGJWrWO>@KGJUEd zQ++JIz=giZeBO;2EaF2ho_Rdao+Tv0Qjx@Pm@iU$2EXYA$rpJ4{8f<#IsBR=`Wlg& zRGyk^lFe&h3V6rII^O+PBK+tR>>zD*L^47}TGKakA1{|Q`9%==bZ~h;V30^BYc$oSY-4lp{ei2_^VubF? z=S1e56?vtF$Xs;K#g|vn`)V(k4fr`P9VSCDApcrCa7^^t8j<owN6j^MFETQjPOGMu80pws= zGm+)^wPJ;cf4<1dLXjfYVbNHTRkK7^Ul94A1qU2+xyo1vu)l7$$cH5&AK}ji$hS>I4kB|1JBNxy4(Ez|M_#`}|95_#6m@wHl|Dyy^870G z-xJRd^!wqo$Z>2QFBbXnu*k`7Fb(#IoFdj!!-4*%E{mMT?rD5Fy`3j#ZDuIu>vXA_?Gt->*25XYr+xnjowJkPf(^PDKF2@HW{a9otlg&Mm6 zcED9pPLe23805e>SPEPj4AM{sMv4kf6cw@%w!v9Z6&gZ5%zzW3DsB}Ox?fbK2D_KK=jA0|VwsOmPLulg+5DJmSF!rKEr zL`)SGiO;p@6OH{CF2%+Yd)x$er<4w3!;)k zfn21}KV^?7-U_bj4S^!q1;kQ62$BH%^@qX?SOes$0e&?|g4Q_!q*F`mM2>oF(91zun7@AW?EyD z7b&Pr`eou@n>3g&Dhs)`RUiZA!BJ7ScNEo*<#yzy9sai?Z|zQt;+=u&jPTHj>N--_5kERF1>)~Q{5g4|x>bO57zX&zZ3kQx z)x8ejOZSmLF76Bk;=FU5sJpOzR|^;nvtYfbo)MyY;cKtcqV7%t+U}kWTYIPCbh`K>zUb10{#st5Op8x>i#fM4`6%5Oi>TU!&FhDs2ddv*d4P%)I;R? z;cQXk$o(VhL_NB%{A*lIyeR5%4agTHK}%>4y#QYd#*2D_7@t@Q#iAyqK$@s0@#D!z zQIqj+ayoQ|KBAr?e^1Ya!=k35b1HeBIu7VR^}48M@UIYmp1myUIqXa?5;X%FQ zx?e>8#XJ}yYSuX*2eSu?dU=DWIrus^N7Sp7Uz-eD0iE+xfj;x60=gGsV_~kS*9!r? zuP=kMfb1JHM7^0NYRNW0|65U9)F8&C$iBT9_KI3IOw>C&;jpL`_=HAn>Fc%K}vNf-42x%yzcsNxHv*5S{GV?})wBx*w)Q5#o_+Jya0*F|l? z_bu4ma*Ts(^7Ls0%op_;+sS7QMSVU;)ED8Rb}`?DzCA-keTm;+6^Ytc0+ja?!~Xh! z-TkGazNsMUz$H=NnxYQ26m_VbsKYFmkcT5@MSb5})Um~IS=8|ZqE6((Oi?FW0Bxt{ z!E#s+^gE57Gvw{;6;bDg0p)X>L|wqv{NG5Z3qWN2Zh2((O%?&xu+DePIQHNqASi29a>*> zr6!`on1?M9T{#M7!4AhK5@jE&<-YwP9%=R z&M*PiiLQNGbe%BKb*ZacB06cR=;R>SCOU=XdS^w~_W`;a;zPs9uuF8K1EN!@ZyXN` zfw-EWv*}>b&6qbIC%Of>yanC292eb^KDQEQ8trK(MYqa^kw6R?#F;^#)*D1;ZWY~T z1)x6*ds!*a0}4cE3lM8|E)YxhQrHXEMcp0o9o-@-;Vxwp!bexqT4S4?6*HE zx&!fbV10GyBf66-x(hMn;6qM-(OrqT>p9WgX}=SDJ#5i;O%dG_{dcz)-Fva2J{ca=D<|wEqd@A(L<_;zAsPo{TZT% zO@$&jEcyZZKad9a{{YLwBLV%x(LDm$5wl^Z=#dp57v{q*(GS{y-BH6uKZMPPusIf+ zW3f55H{kzRKO7YOunF}6`wvfo<*;A$IAR}{1n3<%5thPUxGwsUL?G9Xj0f`Z2sR(N zB6@r*bcEBQAEp1J^q&|65uzV&BD$c5=qF~0o`n9%6M(p$qVLmDqMxZCx{$b@y()Sd zeWua&9Q~#TK+p6Ya8UH~7ev31DSGB8z~2|~k zUNclQ=Q+BV^4fW#Ka3K+9zIGH%{h+VFh%r6^ls`b`s33;tXslGZ$)MseYT}Q8g%5o z@@!ZldV3!jF8Z?xFirFh;@Ux6pVRjF8qqs*VIZLQ3*y+dU$}?{*F}FB4Cwt5y?gO- zAMt$M4Uqe0v*?4a=)==Rmk`_c`1iv}(LWZ8{t0_O%>iV7+6%`-pG4QmX27~SIT8wB z8SI1Oa7pwj;y6WKPmO{}FcTI*5uoc7x=!KOX>^^&uhZFpuG8f5^j0`0`V9FvlL^CM zHf#cNb+!tm!w^6(=TG|V3DG}?LQ5bAKNHK(`2X`U(dV$in~d~1{5@9)tD!{nd15}F z3cXZCc;u6j$er5Vj|?gcvuX(;EL#9=fGjnm%70O zSORu&LIK@4L%5Bbg#gY!Vc?kt9*VKS76!EHdp zlO_gl|1p9o2aksXVuTXrXh-}y_ zM$KTD3dG6vB!-xXQL7GMyVeOYqKGGIwiwaakET6(gBZS87zva)Pc&ls06JobB?djQ zp^yQ{#9||^Axr^ckM9iBCAdI)0(}zkFEJA)z#`ZSSH!3t1v!8(wW+H^>~*FC{&VhW z)TM7-CFpihbo^h+56a{${ZC&j3T&3gD)Zz!OLYhy-z{H#w->n{Xy z*MQtKApQnpfw~5PI&3$LfNa3mhS+GNAr;WoXg=(O>tdv)0KTM7gH2*It_G~T#>=2Y zj3&*1K25fX(R82~&Ct=jn;0$7-vXIi@Q>d&Hg2mUMmqL0BE@KpY@2anWaW#|cD5MV zOUUUwr05in6FAQ>F7VHpXs6c(7-%#3zZWZHx{JS5Y?w<^s0KbMcfx*Cf z97exk*Tr~%96o^E2a16BhqFAK{0!eF#)vA=1CSqaK#Y;$&<$80BU$F0&v=kLJ;-`| z@T3@{@L?3bj>6t3bdPQU1=YLN8bh=fs%Ex|>M* z#O1*9+y4Fcye; z8vUNj0qUQ_hw1n*own&~0DI4)^Z6n%W&{Ji%$NY{;kp=a|>b}?R@D#k4O%wqYa zSQrD;&rX3Ea6*ii@%v@;%&7z9Y0h#WPp>qDQLtK!xj~Q*$h}JJuTB?ZUMTp*c&!_t z>$P2C%nyckFa@@Xv4A`*NEc%vwqLIx#-eyJ-pCMRG5Qwo6XQ+#EWw|*wu!M6`L~aW z@s5bGJW-5yJBqQQvl#E?0QG)+=NQTGUl3zudsqyI#VD#G#wzr#Y624gJ)AQetC3&5 z1lW$=kAU7V8}^8?hCXZZfbs|E`rx1##Zk})j*79izZmOSH|utY@nJX&hDA^!#(He6 z9}29ak8J1x*x8_g{u}p+@o^ep|Kkovn1OdMMR4T?va(aq5&k*~WrDB}Lr=L?`D6stVburGN@7zQV{c?cUA>!l33u62_9}O>oh)V?^6?|ZOc*03-`8es^wgy;2|Fp(#H_bLOs?gc4R(mx@Vc0d@GUhF z@Uw9e;A7)?a7D}}eP9{jSJPO)@21E#rGK-tVm8OW=8MH_(F+R2yrlvV$1P*Uyp?j= zTsSV~ZBc+fw`~G^P7eljrO$x9Vz$zNUCzJFR!iWdm>JYXTv1a3MHg(w>;G&qEtDCp?fGMyVj)~ds zf|%`li`fAi9nsejeVyvVb}_rK&U3KSwVRmT2E%OFA!hf@V%|9lDEGkUyCwp5^XQk? z2k4VW|DHKe0Ddv=&JeRVxw{7)eHM$^caNC;@TdPIF$dtsphz(X)9>DMP%7qq_&4;h znD>*9VJtsTLCoPnVvfMiktfA`keu^9X^y6S4C`miaM&Q`L(Iok0puP&D(1L-Vm^YO zOcnDnY)z~$=Htj0VB?9sVosVM=9BpIW$oH{n0~ zPIJpqxFF_Mf&Q>b%un$36Xx64o<8j@=Jxi`3yA46`hGSa4vM)0dpn5xb06dab===G zcM``J=>LLz?-~O5w41)WOU2xi3i$eEwwPb>+4w3;%&+OczX?#@KOQ!S`Hco-zL@|k z03Q#q9UnL*=C{PmZ8Y=X6u2zrA^bdq&BN)iRLt)p0om_Pi&-*5%p-LGn@8he5}@mQ zVn2qxWBB|7^B=Z}c{~a5`N!#Eo@fc%#r%mrKcVBN6Jnkm0?bbhgDYa5?gsdJrasIU z^K1oR9sf-Jex54kIbvWRZJxu&^Yg^K&;ro;OCoF)^I`_<74z3IVscN=ytGEl-@*Vp zzwHt8@>nr{r~dboVqU?gEBO6KJ6I~_)n>3>%xmponV8qHeSI7p74uJI{v@8#&OpA( zn3t^)i_tU|W0x#7K`fmF#bO!NU=myu%bX*Yl_?hEYb|?;SWXbk70V5Vd186!@0l$Y z_Yke18E{rCZ+qAyR&YmHEmlZ441>ZeD~D{$}#xHd7>4IeC#%{;#$CQvEo^d-z8Q;9VmcbhErtNHxAcOY zVztbK%VOP{1DoKwSZSSMpIEn%$J@}AUMyCtqhhrl3G~T~6{{^a+a41uI~}Hob^9f; z?#PB|Vzr+uR)(( zSa~8=PvY#gS**J+igk|**za>vtiCP^?En#Tvg@ ztO?}gG3q8VXRL?y1bLp6C)Se@P%74B>`j>^*3u7ek`3T*4rDzdI!DBCy4d#Y_Zx=b4GqH+^V_l+H zA5IZ#J?rJ8Nn&k4??!yt)IzL}$?ukyVttY%);8KdMfdi2SSQwJ=-g39tk3axCw}ar z&+eIG?O6lc;Idd>qI)lX>_c|nS+Ty}CD#7wVts?|Z}y6HV6|A^juPu2z8z+p{VpAL zz*VtIuvyXv&{=|?B}H&dtRrEN4dY=2Peoguc71zW{7HLMWZN)y|ThxKARJe1=4;F#E+d2mqdprK-WhY7dIfW9I9 z#jY?-?9kz2hcy(tGJ31b61!>ubW}YqcC`rT2;*QOY=_HYSI>pba8>N^R6tkwRG?q@ zMX_syLporu#$4DYc0?Ksgh2VM*fqnT1@wXGumR4A9a#tRfVxQPA}@$ts~XV1)<{?a zJnI!@Lke^Q{Np~F9Yvg64A=qaiXo<$!LSr|!F91?W1$@oL+m;@ zEp{AoaT$PY+-%qe_#KbVc>IpX@A%2E4EBnh&d*U)m{zg zs1pSpVG67eyKV)@fdW_#hs90`h9=M(=*zW1I~lp;Vc>^LVyDCdc2nq=LOdzNlX6+? zdXbO?$kxM;dh6ks*!5j#39PUBC&g|+EDa_AHX9rkyP<|UfWC&{J4fM3lwi`~KnbhMZT>j9r`A*Z+G0(NfME_TZ*kPpRT-x><|a4YNUR{Tm!gx)X{ zkiE?W*57TzV3XMC^i4-T9o?j=P3Yjm~VDt0Eh$;9u> zBEVLgmM{_aik*dB?t$7_QviKg7sYPd5XQm|v9r;iJs9x$_HY;nOW~l{?PzP)85Y7N zvF}I+^xT2}?Ngxuc0#Gx9njeUpF7NfU1E1M0lzzFctY$>X)qHmh}{{zofiXn z?@}N70P%G>Aa;%m9ib3512SFF-<4c-od?Kt3kUji!`E*3);$Ae!&$L&i9dHL>=*ma zM3@96V)tkU)8UxdcTv6z-|ku`cAf^-Z63bm9TmH0JPZNi=+y+~ihZ{LdAgf;d(*e~ zLO3b*J@|DGdhXdIcAsF#gXM5V?7qa?ml*nz^ZZ`0L+pO|)^Cy6{eu9T{qeK^Ubrsy zfJ_(<+kyTA>i{_&I0rU}Jtz!vfV>Sx@4ZDp>_Z}8B;eB!V!JO1#=&N>htg+g3$gF_ zi9O5|`+*)X8R$Da8;EE4Rk24Eva31UA!MeHY9ialw)*pt~trtA^>8T37yFZQ%0VsqYV&&U*eW*#g9;&_q#yhz(D zY|p~pY}Wgnkz&t9->Y-PeyyX}^I5M8*bWv_zwm(AuVdqNzu1egy=bf0oV(g@FkejD zoA~tRNwJqq6#Fgwe2czI$H8W?-!@@9920vP@xJ4OLO3V(@?5dstpJO~UZEic$o-1J zK&n6Aa|y19TQ+vv?}Zfu&F^_S*SkuY>jI z+mI^uMs#j05_=Q2HWBwG{P_5~*qhO_ITEPb8V03ee}ZqHL_vMAx6KlJyNLZ6{XR>B zj({(p4HJ7uXXqpL=bOadxkGHOH`=?A-Mv@rJvp#T>@UxWy%#_Ct`Yky*2g~L+_y~Z zug{9Tf4SJ-;QN8$Vt>p0V3OE}X24~!53duuWWCrN8`$005B$Gc4e;d}`mY}s z`%l(SS$}b4r#L!D9L^UVbC)=lUmQCe)`{cv635LG$FoVCpsV5pPZuZTfH)P_i^H`) zC)5XP#Hln+oUkb9BTf}`RXHpU_Y9qCJH!beDo%~DfbN=u;gUF!HZ%j4Bj>|@acTua zJD3RAj;;fv#PLz@TP#it`eV=;>%wYr;zXQy?8nnLVL2QZCovXgi&J}sIDB_Ib%~|! zMREA9c9Q6uR0Nx0FB}8fk~M@uETlpvbh|+cx>HVwQ*Vhl+`DrcEE1>D9B~@Y6{jh7 zn(q{c^D?Jp3vq63FHRb9r(-LfKCO~qyEqwF#A!`jtxLpdL(bYzpLJ9mzGIy1fk3Rc zPk>G0FuulVHx=lA#{qHL4~BW-bf^a8z5_Zso))JQ{W})|dFV`C7jnWiJ*UekC<0`1 zh$jc1bJoCRak@5x0@xu=w;*T_}Vm??Ub_{JU!#To5O(P#nG|9KI)D|P6euFqO z$ob5%;>@D&tZCxBMBQxk%^~(V^qoujRpOX;U7YzX#92Um3-NK$IB^z7it{FZzr}p% zL2;Jl19Hnpit}!NaaOb!=e-@`tfajtO`KKx#Cd<2I3J+r19HGV*jb0nx^v=uI03ec zv%U)8$45iqxHuc|eFM5TvE6)3-Dc#rOcZBpwm6@x6KC61aX$0G4smu|66fLHs#Pe!e>)4)<}Kqlw~tKTn(= zvc&n3eq8@^PM#L$R3C9pSAebJoEam|*;H}3C*z!JC=T~uoD0Za*dWd?9f5c+4iV>9 zbX;mF&TmoTTqeHDxAAQOtk_3jflcp2}^+AeMdWI|iQC2=dw5I1a+xRrF9u{LDEWGE3g z4j<#N6^Cqmfw+kiV5hjX(N$+6l=35G2gFTUE-vRe?*GHto4`j=W&7iGZ!NudSMN(Y zo$e&v*?$VbKt(}ka93~#6-5#tEc1*GqoWQ_XI#cz zW**`)qKuPa5J>a?o?9KjdGmhneg1*Ib!xA=_w47~Q+*$nto=G9Yh^KhSXM2Nto_f% z4=_IcX{}y{AI`7w;de-~)?!;Nu3w91uaoe@z3XsH-B!t3kL?ZPC2M07ew~taAf9a? zwhfw&AD#_4@z%j3@cWfyg-u{>j^Q^4KlDrUJ@`G2-)6~b?86WDIvvkB1kZd1-t|nJ zb0*e@#_=12AKrK9dy;h+o_iRcdD!nH>sh$oS+ns2d^U28m?Xims!Ea!87ZZ_DQ_AL zDilb^l5*EEgFZ`@RJtUIOPeH#ty1BOkZjV8FKHYFeKvD=YWRzW!`h_TZ3C4iZ6ITn z`+D|C%{}{@^InRJy&3F<8f168CFAod4N8-QPi8Q=iSs05>@B<9u_X1_{irZ-uHN0+ zG)h09@53eb>EBDu&7<_5{ira|t|AYZ=}mgmgbDqt{Ia*&E6cUj!LRDSsCnXTcBO1% zL$f=N{WJTkJ$vX`FOl2%wc=SF(){g`bo_98VY)``Jbu_H%#_tQ@YM@dQW$*3n&W$$ z)hf#zIzW@%V_R(FHcZ_%f-X;u?QS@w@Dq5R*nxtkt zk`4e3^ZFVa>DRxCRaE%t@$iiWYF7`~)AzIfd#dDi7Cv||`;FPsa|VxprA$!Y#V5%N zSbt-AX?{aK$7gWz`8dxu|F-z+{@3G&^EJkUl1-5Vl1CR-IDfdoouVo;C8!QcDqf=i$ua<$sP;@y!vTwi>Ar^G%4~cSNK=1 zwA=7Dj&`qgbNBp|{a1OmU*Wpwye(ds$4u(vkF_T^ToI|z54Bbt*r)G1vFxV)(nXu= zL9-wA9(1L*u@dcawO_@J`tIfZBDC=Q%OAS9wY4qmFRHEfr)pFFYMFl3!6G>oOvy$5 zlPm{#B+W`Qb(AMdO9wbP|?%#Lng?-}Vu38qx_sjI6TmTF0jscfyA zDNn6jC|{eJTX{p>^3>wWyXy4*oyR}l=4ebLlf^ZCI*;!)`Xq~LW?CD{L(ckSsJtrW zkb=(o{#7X{Sf8q@ded1Sa60R&oT+*xJV5K@Pi`H9&yF2n@g4k0DUWY#4;Q>!(aCBJ zJ3fZ7I2;bBQh6t<-^}a-u(hM?UFM4KU=29*{>`;>Glai(Ut?9q$SlstnNEJb;VBP= z!vzJ&Bz<$btPE%W(g;Zy)QXD!{T&Xwy-G5q#S$Vn7&fP2Q~S-mM!!kt`VMxNq_GCW z(~M7(+@!9;htQ&puiqgkp>@=O?zRI&v_u5Cf1r(1|8-;NyAMds-PqpUgkkOm?d%i( zTlaZ=;l}0eeih5zH;N(dUllpydSgVY-svw+7o`i+vgXUUJuVN|>Ql9&S#>FzKK_2A zr79#e}<3V)!|(;tWQcRD0`mWo_sEOO^nV zDq2~qTHBA8)Q7^Mus2hZ$<)@=*VTh;X@ez`De;EF2_6h+mY}R@!9XbNudA!A$&|3{ z@(nlGw*+g?nR(5;v8^jEYM=SY#S0=k^l9T)^to_mdL~q&z$VwgM+76J$q%>wPSo^$9hIx`doZwo3H1mLVtSZJuN$r*tTk=`ijTvo>YQa$`-@EI=VW>udv4Q@~AeFClU=rBGE`*&=ZaI zukh{SYw>NZX_Aw#H5_s*8kHGHIbBNI3$VQ(U%NT&i0|SLN)?a-{rQ9Kh0oV&v>wE| z2bZ)F70<63H&Ku&*#VHBWu znY`j8m-_Zi^zCQ2OL?JCelQsdC6hbseFJuT-%Od#YRVD=Wk=q!{Gv-H`)B*t`Q=K# z;phHO^H)V!q?1oH;?dI*bCUTizoDV*l6CmP;JW^oBrVJ`v%U?|8_fMccPnv&eccCI zu>cG`VBdk}14QC(aB+*fX}OygdXoSI7pISZ|Ljl7t)(@LX$i=&uAYd}9A=f()rU0; zQ6>{)SR}?g%$T4}jJ>>P!XFp@dFiYdUzj@N?MLo?Ir~>;=^Ncyb^f%)*I$)Q%pW@G ztl?9NirA>^)_bPkb@O=}H%^^;|Dp$0d~(5@yM`?NP3Mw7{3`p>_<5yWinW9lvJ6i-y`K|Ns_I`2R&zMq$^O5 zNX;gBkkUe`z>0oC4e#69-pQ)lrL}G=mWJ1| z){Vp{T~6YgY0rBfSt%~ubBKr$!n3)FdXZ%?lL&09TC?C^P-pCmHUBwk;;tpvmkcff zy=2eZg)bJmzyG-B=sOc`zjx=av-n)|&+b3XaF+5?o!jg>lYBOM0{dDS9}KPTK&`_| z+^DeGq3gT_z~K&$M*#aeTrL58XL#&(-r{i=Koxl2mwQH{(tmkQf05*^DFK%)sRnxu z>b!@zaN*#Rg-do#9QAhgJhqqpdDr%PZ=d+bqdgygpZzh5`CO7APv!5Umm<`sc>Og}G&&nSOX}UIZqi?ydRm*Hh(JK$KRBFN(xQKr)ar+{z$<8$ z6UbPiSxSJXM!&UZ``O)c;PPAh-L!Dx5nwma$mAh+K zw2WSH=ZKb7{h|`yZw_iA3{ZS?CNF|{op+6Bu-39 z@~G~n15NtArY5Pf8@f_=|EjbXY7n$ys6SrLvTbbDvusti?Et%HJuTN~uf~0z&3?{q zLCqSwbnX^A6#nPX1!IhiP{r|K*(S-3f{-%2XbqNuqfyV}8dRrP2kEoULFzf~+r3Z6 zeWCSI3q9TB{r#(|f!Yv|C3SW6Tlb6^H=q$zxTo!o%&6#;i*Vo5Stp;#uL6JUV?<~3 z*)ku+Msd!HBpy>|#{#xQ+1OGSR=1TiQygzi81G-6bq@A{cqY>>@R0K)Z zY*?KgA636Qf-7*T1$w<#?E+orbC2QjIGxTREgq-CF{DN7JpQ%erFAtz>lU5bJlg6Y z$UF+`-A2ge8qyNisP#ChwdmBo#L4zD?6HKR1`;k;7zWGNf+h(tqC}K7ujC{ul|oJ@ zTAYox5(K#i%^vg*^-!K^#r^zB-MEt0f-CI@bqnBoBkFJf@=Cb9)*|UnC$+Tg#3fH& zvqMWp^*GoCO3OO_`Fgr5&T5A@)36>T|R;aK5$!>!sZjtC#>KPNaMdPd%b{)>Yb zN6*ijWtrue>c28LD>^yvdVa08z_HM?T)W?Lul`2lWB!5mf#VZT?8J+slRBs;!=1-} z?4ZsAaM%b?Cxz$Qj8sugm5oU@UD$Np;t0`2aXP}bx&Xs~v%PLQ)oZ1V-nnGJ7)hL( zghtFIaRhu8I07CE93ibvkov11LT5s^MN437n*ehi%Uat|_NjsX7=EV|eS;3;*L@_* zLO!rRA>sTw=`3D7Q&ectT4uewZo%exLuS7F*n8LCy?w)?MH@E!V$q0J{w_WeJ^1-a z?b+iWXS3PgY`lLPdn9|`4+l|KY3BDcmJybJ0n|GRtg}lW8)w?hCl{?ANbf@S{vawaiJ)%sFJUQM&qg4I;>qaCNed*OY5shp?WaN44R7tVTf5}vXN^lCvbBzR=IWC3N+ z7+Xnf(I8rgRtOMVXh5;0yPbd>HQ2nmE8_QSEiOVYuU7!y8#Y}BlnAH^BC;?YkVw$p zMBI%%36L1tPQKG{a(g(8dcs~fI11npsC;h^wR@yW!j_6=YImckeqN4{>4r|9kBb`` zHjfvOd7r(8!{_HMi2!Y*Yj4J-%@^Q=>)#oo=l|W^h|1}HbT@G`qi&EoNW*7PwVjsN zt#8CF!<`eH7rJLTFLN*SE%e{!+vWQ*_GR9|nDb@FHb2ipdC+`4p=sC#BGad`X<1uSI2L5S{#bsAQhvC{j+RIQpG_r->K%z%(XWVJ;B~$<=p#nH; z2ySMd8-5qaOT@}{@+DGI(qV2oy<3`5Q|uak6Ib{SUJR3E)k}ixTFDHlAYP1aBstyG ze4xiPC54#oRW`{gfgI_j!3GJI-kcmIrh}c+6R?oxfCm#G^ z{R21L{4m?@Km3Px51swYtB+rt*tqfZrm0=O*!|`7S-*VvcK_QSeY zEUuQ}yQR)Z6k1sloR_yGEimwLO&p%7B!0f9lKx4)#^z?o%(O#bdgBy+aJZ9AW@DUhJDYDS1tjCnH26 z$;Cu)qDugnhXTkQYMGl6Y&*lGjGp0m)9!6_R%UhINGEI99DNtxu5W-m?=l=Gc=YN% zo$Q_*c96FL_>tqs-4(4Snn2$5z}Rr-N-Mf0kNBc0|03iyamAbLcOrVjb*qjMqyEnWpS$3 zvf2Z^3}fpGU?Qo`lU&C7UU3e9eOn0^_!f63TPeo-JCea9f4ebyU<&);L4??Vlj#ur zh&0HJjqpk+rVA0nEsANnpaA+B!QS699Mz3-Vc$ks$gcNYlEHe-)jG!%5T7A{N%ibAc9}k z0?jbf^6TIOSKi#Qapky`r5ohErlF z<}@Fm9jrNlXT+08pq)Oa)Enh)u^h|zW;RU950ps42}w&9iauO9oX_1OuXkKX^{i|ElQkZmFL8Pw#RZMb*4n1cV@s@Nbrh|yGW zrr4aWxd^~fM~)UcpUh((>s;GkrO`m9NnCEm;u>}n44^1DzaU2Pg0wY_>OOF;ey9x* zIkL-17i{zjrjOoe6aE8Dk~K?FozGW4Mc%S9dthXpXS;m!-)~cnY+Sh}>&qVP{A45h zmc9NkML;hA)kHxxVW~)}l80@V;^3&lRF4U^Y!NMJC%3gwtXGP*FVPQ?RvGOUygPI9 zaADaO3QB@$oU`;}Vx5i`{F|;|c!_^kiX9ozin{@WhqM$5PHvt~>oKt|PN!9Iy3nXA z#g2?B;x&w3Z-LjWQ&w});7l+=X}?~@Ey|aY^Acyy2P>6xy*HE`1jt|{Jui4kInI9 zj26jcB`x|Up{(vTqGd?sN<<_l9%EfUcJfJJHkzCkfXPMx95$I~V(!Z}X4}Cpmnw1x zRrDSNAjfMe=6Vc-5v$-O_UIn&>11~s(E-3QAYDW-n22C7k-3}T#p~pk8^L0+vsmmb z7CVdQ273+hWY7rm;OhP+k1<^taNuK@h_-|~!(7evVQVFIB571PUL)jM>zp>JZNjPS zhFH)kf9$05{)F-@!JY5#jnu${FQ3YQ*v#2i?ti)K+gVpFzcYL2qmQzO?!I){tSfH4 zZTjUa1`c0+!IJeGZ@%dnIj`*gnd?6OV%_xn%KGeHvFkYU1G-kd!Y;gG=`E9{E?;`= z_^8#RpI&_Pv+GG7lDwF{aq=pob{vr7-{|jR80;6kmLBq)~F@sLMg!Orr$A z-0dJ~?fto$xVjH%07e)pfIx?|prf>)qx4+pQl>*I={3CEyE-SUb94kroui?g{dq!3 z?3L6~D_q>Ccm_|BjHwl##%pUzNJ?Xg*mekCStNI1hLLfai*wH27+N&tf*Z%wvAUgC zZ9T>;udO<8!@|Ek{`|-Mt*7Q)w|T>&8y{mA=nJnt=cW&5J0oLfG3$q4F#W;oe<8B+ zRkr+0ZR8-94v2m?Qk(-#Nz~2s)U*bu0_+!>w zM4*l2E}RYmuLNuGQAYlYoijqQ90Lfi{qD$CmaVI2*t3B zz1}{|KGr_XzQz6*yTxI5Tj-vaCQVb_isL!xQe%uFwMh|=u>=uu&C;aU8yo}GN~Kxh zNrfqod3qnI31JG6g+R}y_n5(I@{G_!O8Oh597uE8dLQ&e;9^fMbkY0Ny#Wlo?`-KW z${>Y4$1~Azu96qSNvdkHm8(1XL~NA##Le8$b}&?B!jlH2=h$;eg~zN)lW?5Qx8!2z zO{A|#(aPAU1Ne)?a!-|uD%G+eW5L<-TgS38=S$YJ2is8v|CM$cn>p+;#E5V!jLlg_ ziK;Qhf={8yEG=_OT2Zt#RH?NnKhF8fm@R8#QL7m(+GmDTTH6q_LD*h&1M-vv7pIsJ ze#*dO4f5~kCttF@=OJ*+e|h7@e3b&@mB9(X>5Y*ehBsCXm`j+qXTC8~;AOct%5G#!Tu`GwrvLTJxEWQkD!;++joUOV@}$oA+z-})1R#kY*Fi}B7q zY(}wf=BR;#DxSJ@;Ec7a9|-OF_}ix^KR)l=5tFaX-Y4kfn(TR&_tp2Mvry;#pT;;P zr6)tFRJztx?H=kL9yv2Lta#Y)v<NURdT1rOQ~xR-T_JtBut)o{=6KnUH@`YHZoq z;Sm_MiZ*2vP>%KST0%QI28KE{nIMx=V%Jtb9+F%Isqgm&_?r8A_F zd}qfQ17$ltwY78GK$fhSUBN4Muu)P8-?_E&>|zgM{hj<4!=sNmO)B=S^AuO5-$UmtKB2W^pua-@IS6}C=t>O3pt%7_UpHiJHM!;KBiVBO1DNmr@C#41` z6jm12b4dnvP4$4>P`SBs+v$&;H(~vZCw`nW?$O4=_SK29{MxZ|ZhbDhanHBe8{dDQ z{qi47W0#KKQhhl4?B71m-j+Rl#)X$HWUnyeFuP;Ul;3ataA-@wl?~l|VZ)-fvzJdX z+GZM0jJ)WI50|WE&Fd~|eW+*3N>5(N;4#d#>KRt}!YA3wzx_w{(G8n^G2`Q#=6t#4 z*PnEM#yl+f)*Bn&%6|UmH_J<+?3~-~KV#`z(^uSk`s)7##^Y-wk~%>}maydJ`Q)BC zEUXGR%#H~Fn!33KE*%q40GQ4p)90rtq@kEzKpb?$3@chSl6N?^+g#^DUxC8VZJbVf zke-Rw5~5ZT`y9giXh$3g{v*-a+(HWyutmTO5qRDL&)kn4Ie^3|Ty%8Z38b}T6n;eo%K<)d~0%$r$|#$0q&n&cD05Y44GMog8rNJ)z`fL&aML2%fBB>;;gsW<~T%a%}8YeJKePdD4J zA?5fR1K-2sJD3BiqQmexlhQPceEt}G+T#mFUJVg~Z+#h#G0rZ_7fuvWVoqAuJ(jmE z{3gp{3%C5z^TD4)9K0bG&jY7&4PU#py+UK@**vTa0JI)uJ7LM z-o1OdYA(T5Ms9N8OF#*H38+Ky$X3e^1X+-*N}BZqHivvh|MOoFqRz;7M5d#hLHdEr ztN*~qfA(C@LyvvL{`SDI!g#g1K?VWd!je9RR>NmhIFZqVpt=lC9 zBUMJRTtyjHG`47Z(Olb7n>HghU!84(lvZzXXeA+=94RSJgz|xXrj;uI!W9CHJW_0J zHoq@XUS3uv#q$&B=>mkukgVN#JSz|vfT@xJIAplU-x0}ZPRc2PGQ8hNlQpUNNZZta zd1&Fa)>_E#jW$47rCkWmi+MEwCwwu73^+W8w4^i6I9<(Yr)xL~154-%&R8Ej4`FW3 z4P&RH6G#VFGD zgfALPQ}d$$6@E~^Ay|-7f*oE;6J{cpL_{``wsA^u!Oe?UYJeG=$`nCB52zPB4Dh`? zv;M8Q(=Weu)wsp4tjzwB4PMePV&t%!AI*NkuDT?1#>9aau34GgsP34secB~YSC{Ns zeECb0`^)EhL(@kMzozWyI*YSm*0A%h7qP18$G=h+K(^*fKWv%GXXbM-12R^`yMAp< zA}A>ha7~5wGcSL!v^0OU^q~5j{FH0E+~IoN^^UYJ|L^%;w=dtDpD&kdrQY&*vfwP& z*uc2p*yt7Nto$2%claKZA8%H&0{Zc@R=>a{afJ1z~xwKJOEJI5hb&tf9 zJh;o`yo6%YGoBGrCJBQkRuC3L7Z$pASPWe_le98~H!zA;a4N0E8cj^ah*0uQ1tbl6 z7^6YSsiu$26yVrJQF-{n=Aeo{2@S|_UvV`g2C_UM%Som{UeqZauMW=s=F0=wKRxs! zJLA<)S)V~KSHJqp4gYoVRr{Ac@fXhf|8VpbcJ&{>WGyf4eXH-fdmhjJaQDvaH@EL1 zjpb4B?}?x;1#JQ`ZFa&+ z8;n%60-*&=4tTK*%4GwLCeTVm>#Th&7&KA-gw4UPvU~;tyGy zgz-qPMGi!O1K-oB0l8po39$T8_S16{e=%X++;bP+z30{}vNZ30s{hbY_g#7J#_aFa z9l`u_F3rBZ`-rD<=IQgnU6-`2rF0Gf6vxz5^<=3%`p!nwi==tR|}&rMD92 zr}4$45J&>>_7kD83XCt-iQVHz2??N|GnJyecq|@`%bGKzr-PY-j5V!fiqa8Reo6{? z{3#q9@Fy);D^$}d7I%P<0$wx;TPh_L%VSae3#js%9@9b>7m^E7tDL9$q}9o_T33p9I${B+6sX?UD;b7V-yc z6ggqDud}~n=XRBIhZP*7cgO&kLk8fGfdBwlc@lY>6c!eG0QOVd23i2R9WA+5%Zb-( zjK)iAU5xM&cZdOVhyeo&!c`n5CjHADZl% z?NSC!h#;vT#}v`kIkBG`e1x9G*o%bR##WlZ0`0B>@nFoTs`eJ4eezX)QS|iBKS%8tMHsZnK1&c((B5i#qOiX z2N^<2%27k~1H;@n4(-3IyeP3=>J&x!1%D*MB;Jw~ z3dZBg2k6h<-lT~8=Ecy;TPL*5LE>#MK2s>4y79yx_29M@4z)zjqE=PiCHpc0vK_f%^>ho|yK6tn22cCMfkyq|}qGM{^snjEFoFEYx4qQ^D zn++#E=p`pq%(Er4nLlHsEReLMhRT8&%Yq4kZ~Py};85=voKQ)%f2We}Z#5JCNVg#E z0uTL1aD%^Zr02U|k~9yVPnW}n(^~ETKjfk{qZ`|i!Fb5z`Bt|J`IM0U;7$P0jo%xk z1UZp}gLRKnwjmANYIC?HtBuP@{aun2~ziB=Y^B3f0n7{(usB4U~3uR*XA<}hIRUV1$% zP)-0tu{9kpIN`8SK=LbtB;KUmSK|?l>Xaqsh6-$jE=(^@R}%o8Zr{nrNf;_SU!*K>UFTlzvO2hGZFJSSNAr;~GCQoJTtnRU`}qU%y_S2e>*Z%GnvZ+j z?kbgoPjD-OUsb9Vpw)T4=X_?sm1DKq;I(qO+-{x5X|ivzkNbA;^+@LFzgbOU`b>Xt zWSd>MwoFHsJ!v>^!W5Dncwskl;3(dS1!Ag@2E8Iypb4aD(lc9U$Z8$CEvZgc7pstT ze0{r@RDmeXhG=byKPv2jbdIa7U1hAT|mD^ z=HF3ZDL(&j`~%?u8o9{{CQ>Sxi0k;_m)v&p3*~ay-rJgLboWV#JhrX%jqU;U0^HIU zTXVT;6%*h?0;yA=3F8BjVWDtcJxf6&VMWY)KPzSzRfVF+QDf@P?ARBx!NRpCBvz za!HF7+}#TAxNNm4oZBo`1xG+(A#TwtjA;w>K-!c<& zO%$kRV4WEIhhLZZj@OT6G2ly-n=sgmk1mG)Vk)e%&(!xMx0J_1#>kk51@u55FPxXB zD7q4GgdKUxhVWMRYi>Clj^y!VzTqA1A00Mg#AZIDjKY zv*3ZT#h9Du5mLw_q>x8QAy0-dK%~G@_A2Nau5gUC$>E~$6Rsohvz+tDwCKR`%nc%j z4pvA0BRG-#I>i~tbs>zbdL7|eOl#wCB1u!(3Rd?P8}?jBcI(S;XLqds9n1gICoJ#! zZ|?rj?4S6X>?-!itJ$YM{UW<=%kS94|H%F``!=g#dF{;c%j}n?|48Wpow+dE?VypE z=A9MbBlVGii}Z^Eio=P3zgr4N$fbc|8NFTlvz%+B%77*_AkRaFmtZRp8MG)S>|krR z(U-c*8cW6){v(Y@beT(ZnM-t;>wgv8|Kce)p+lYU6hu#z-@Vq-xq6$~wW6O-_zO&H z36?7u)BrKrnx|4;z+#>?d4zb`J)^F?XTtZ{H?k|(4Z9v~J*WTD>}~1}w{P0kt9E94 zdY+fr%9}2}CFmj_9KP?aeh(bRcZ%5)#+pf)wHY3b)CajEj&ESY_zn~VinMaIZ@3~e zNNoxa%$%d16CR#vRa=V2XRc9ikQb^e<(29heDD29={fm*>HW}`(wE^cBeA$zA(g9x zRHaqDCvtD*{fv?hm1k-~jhW$*;qjpbLyJac##+aFTY?kg6Z6Lwj7yFyoS{w+&dS`7 zxhsBG=99>$nW!Vefcx)l&T9n2dC#cIYg8hENVz&tRk$1~l`W;2NC?4q`1WHerxi&p zP9!`sw-zTXHe?-{lmx(}Bmg;=dMx9QkOA%QB^>~!?E&DRARPcE=@4KHCS353;IU-+ z;&NV|61b2OxR4UKkjjA3!Y>3wav;-1YoWLh+GyEH!Z}GdqjFkv&U8U;0KBg`??<>% z@>c6_=x>;61LCQWP9Ul|X`0SkqMhQBCE~)?x*Sz`iNxwNCCWdR&uM)0ktcrpdUn@~ zo7m7dh|;d^*}wj(=RjZ|W>RKE2}Ni>5u&TCu$GhKst`#UFpfF5B@+_NkAzWWTtx zvh`ush@uI<%>F5hgR}oxG6?f8x%3!h8=U5#xI)+#DWAj5e0A}O1=Fop6~Gxy+LTqa zH2+R(ft#sIa3f@pQ%aW^Y!Cn>p}7SV`ImNItOm=2?S&;Z$QJoadwxj`GDO7^Ic;Kz z{U5gHXUzRLUhKz`_8Y?iq}?OpBa#<5E{QmkfQz|HuvP+$AdMnwdZY>k8;Jm6+*Tx` znMieNdRoptPGsBvXbX)*?jT(A=4O0}!CzC9mUA(whE-s7+EXpON2`q~I zUpb1&oBy30E+VV!zxy6@9+>F9NX}DD+E&gHiTTG^X{>~@%7BM7HHh-EiIs!7pZp{7 zDANAzR>RZi(Fb~c1F>lWYZJPb8@5#}+USL3_TlF?;*C1&EWNM*zZ0T%0&%b091-}o z{Y5g$N@R+P1S1o3N>Y#U+jswd;hXP{Ds4IEc=xL``CIDPD0ZJ(q*dZpN4i;`Fk<-RS%S1a>o~q21 z=P63Mq*iW>pCJ#ooRdGa;LPG-B^SsOEEngGE4|I{E+URZ#u8}61n^8IfTuKpl3oA@ z1Cz{yO#la*01h?*9DK+aMhBI;GR3@DE=kvUYKqQG53QV-99z_qzS1$%HOoCcFfDSu zW1(xI=SF>g@!a$>`F6)`uG>9#>bDl(lD@}vujk%iA~(OUZz|)<%fxIMBu_|ES= z6_nIb(M`PoIzx|$@FsL!WVzv-+#h&-FNh@(oxeW8g-;9hR5D27Ko*CXiAMr~VsgPi zIE0K2ns`OxA#?FI*QDRwc+ImHjJbGF_R8~ST>gt6fAz#q%hVm7jT<&S*4V&48ozkq zvZIf@p8fj+>`(gDca9q}_spS}7lo%()ITxpnpZBH@%tt2JMLO?(dg>xS*3%vESUfH z+KnB)` zX~_Y|S#n%Bg0a5W=tq)>wcM+qM(qVa z_zM8pE`;@VVa{RQH0J>19831rAenO~#fTZ;L=Y$Edd+F32h6$}6^N$5+iEKM!tp9* zN_dsYuU?it`rdzLkIa7ctc^E*uvOi0?4{4L$DX*0xxSG{AKU!$mP=nnF#$|Ihi)+p zy=rF%48Pikn5!ljsv=tGM6C!dt43>@Ao!IrG>GU_9Yg}k&-~rzP383Bs zAR8GWssOdPz($YUO9h z5Z>dht_C7CgRCiKzPM6luM|3 zk%;5sMrq?D&Q|fY$Z@1C-lRH4v!dNG8EOK#XWI6G-Ow*WS(b2H z#i9q0rb7-}^4FS$#c~-q0k~K;OCI3K-!|KP;K+a53?CMBXt-hUHvxy0!V^;`JTaJj ziYfiV9{iV?HaYG_oGpdy9N}xJX8iP?-~Ex@*sq|lFI)Lq58@X`|Fn4ab=N6nB8~wS z)UtrIPrisU)3b!Z7#YEQP;JG;3h0A9xg9d?7CQ(_utVhUAh%0oc*(-qWugcY!Eh*! zr|XFpr;+Y2PBXEG&KGzGz2LnLa+*Tqy=Mr=X_=JqmiaP~Mybx*=&Oqim(KDI_nj3P zFOBn#_l=9__gnAx$lC5v);boM)wI+g*Krk5bIc>H?& zuznL^{XX~z{YWlDlwGqh_GtEo*S{!^HP~7B+dqyjiuc|Bo9xv)vu~AH!h!4?;C#*Z zt@&%Q{CQ6-``zE~=#XE4GpTiDa@tu(pCHLf9B?@B+b<`#OFDRV4sGFOCCCfMw!r6H zVxl>>mDr)l^H8A?`xS8%DY52Re!)G#1HU$^X}>ua7HUnDg&e%hSLSbE^>Tx?!Pej! z=&tqE`|UnI1+RS6fDA;$3fB`$Tt_T%*S*G-I6x6`E^4l2*E)DcDYKM1%H0`Xoiflm z&_P!`+j^nWYQ5Mo(S4!sayCtwX`SVm;hyH3uPn5ZDtfK&TK_WTcFXPdHA<&-o9{K{ z4eOtj53L`$Kk$8}d~N;Oz2DadHWVspI1zf#L)1E~)PnyUMvRE}R-|w^F(Xuu*fFmI zCwy(V3DPx*yAUYjV6L!t2(2)xw8%4BK|nSegU%t#P$~Q#l!;)v?($-;Ey8Lx?sCXZ zzumz!o%?Nezdvb~gOo89GU=29PNxhujX8PT?{Z-}x3v{^GRkI~=OWt6a*WZ08ZG!T3>MI5=}+-@S1*2tI91FZ*I0SHQ= zfX+!$S+4$!Dro*J{yZKcgeI$?hu(!r7rQ42J(74aBy}$;3!}|J0kLQ!BZDoH*9hJA zb2wb!^PmMnlwWVnL$oZf5o6!AIZm$gE~6mc=!bEKuf#UG+@Wxj-xmraatTOQ0KsDV z+~@~yMxn3K;ml7BW>S8t$zdmm6Xf)VvCSXGHi9^y-e)qGCms>2urB{qAx0UY6H=p> z{A|2F>->t@FDUAN1}k~Dr-xS@%&sa(^$%uO^JDx!vMc5{j~T~q?HP6KC+_H5J0_83 zpgJw5cQ`pWV2TjWcZyad3*_{Kqo#w<%=C4_uLHfHSK>g85Xuy256YBKM~(^7CDIfC zdhSPa!ny3BBOF3UcK#bpSr9rx&$2QICwChO|aOUXbQ3C-X8&Dg?hdX%$K?mFUhJ7)TR65xfbd|%Il;rbAqa+S# z8Cwh_8%dBFLLmps5~{hF+lUVO3nVA);E}B^cMi`*0H3sQRGKgs5C;@2Mo|KibdUq6 zNKj#g4x$pj7tnG_3)az$+!O{6kAq`(Se-Vfvg0^D?s>dh%dbaVaz7;8Uwi_`pNE3=irDoz2d&o^6xuR)?)u7jQczw~ILvPKfaY zYX3GP2e!vdgU&N5o>MRu4D){Niq&q*&ELBzmy5b0DGyIh?lrB)U^Q5SYtRtxVD4C{H zk}lG;y4z4YO+NESe7*%i z8gxH(uV6vdwJ1!8sWd@mNd?RJ4`a?g_Mb}Z*c%h%^&RqamyOuC@tEau%HX>rJA+5i zvleNXQK85cjO(gafsYCRBQ4qsikb%P3akPLN3j>2^1SttE6Bow&k9f6TQ%2wcGML_ z9J~m1C+=W(Vy@&2%Xw>l`e+S};mMk3=NQF|!C@ugcR#dlB<-w&yJLaOQN{!0fwXWc zcZOPL+fee1^;SC*`Lhr$qF+w9%~YTg+mIc1H(PI(J7ZEwb_VMZ@6>FB6}7^m=`yc? zqNk}aB3@ABv<1ZS9b!F1EzjE?qJpBRqx|1rhNWr|oT^Q+j_llzK4N!fXROgm#M{*I z&GH@ad}-1YOj85u1@S&ebja{BcvmzZFvms4 z)?I9XlwvQlB`7&naj5%HHwwZGZmcxT1I$O!DQBw(sF? z@aUM1@#pLeSj~S$m%)p}FdZ(YqI}&MrxTLprdsu{l7R>X%7*NWn{TF(n4mn%{-C~! zb0(t{YeP6%!wnCjfuNvvtWXTlh=rmxW7rs(8!{%5fmcaPM_}5BYIZY~+>iK%3kIiK( zkGf*zWv=pa1mA=8c>~Lbm$$lF%V)Y~luxd@-LJu}4MFYcyE@>+`zPORRk9<`)Nji&X2a6zP^PkBwF(%5IX za(17w)(I8UturbXIG3Z!%ulYLD!lbIZl>s!#WmppsX$~>*)?UnEMDnucCSKh>Emv7 zt@}my518aCBoZ+qx2SE0bu%jqK(~>i`dn0|0U^X}A)Y0^Zow$k#QpM!564jahW*uqgKvPDctWg@>5?3>Sjo z6(sgBy9=%O6O$q;zWkEBrTb8XtfxX$U+UeBbK9WYk$xv!r{pN4eWFZ?)MicqBVQnD zn&Ka3!jd=8QgRx+g(2jP2dNHoQ3kag+(_G}v^X3jH(j=U=8L<|ntOKbtdB2e)k9a@ zbbbD&$kp%Mw&K|_x-DF|D;~ad_ca#}xN61~k7x34X&Lt1t>-Q|H{f=~iqrP1`wpJa z7HPX)N{`>ZssmyW7Dd-6r22VYCnv<%clSrDk}$lfq+V5-wotk$YS zRkgWbQvok1z^t42kofF^)dku>e^aOlvz^b0wOU(U<2|jROJXyvSGun7TphYP)>ZJ4 z^W*Tx(ZBe=3x5~=ul&6Q#|xrKwbD}=s8X9fhI)=?j5=NYIR78Y5#6Z=-3sJrUL5wA zJs5X8VDp(1mjRgeJAfaJG>vYg_#FqzCL2hNSnN>D`2-F@F;ol)Mg}1`4Kx5VBnZGP z`v_n!b|Jh+m~{b-y<;Bp!YrTyiKHKTt0kceNQ$5bf%62z8Ch+58f1Zha+>ol21oWf zwuv2NN&#kdjz(n|@^_Io1>l&GPrhm

%_(Aj7q33!xs4IE+IDaLfo1Ni*OlT3|2Q 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≻eV-cDRM4!ASV-ak`k|4qmt_)#7vDc`VQe!pAaY!}E^17L~FVB~F5 zkR91i$jV48BOfv~z|BsmGpH35Z@3NSpmnf*i19-Gc;hU6o6%V3Y;rgG>H`Cv!`;Ju z0|S$ElS~&lC%Y&6E(pxm%{NVV&UerEO%Gho3QT&PZK90$Qu9RXJb8w0hIyXV?2jl0 z7Z_FdD0GtK&Krj#->3*=Ln|2;7LKqW9RyhC%UBtNr8)0QA<>Q|H{SkQ+`DMdNQnj! z3K}qRCR25Qp^ywtL!4kJpmZbA67pw{kHD?y6Z6SPi8gsZ$Z0L8R}hUoDWP~FNJZe? zNq7fs+&s2;A9SGc55X;|gd2{i_&Q=tC`m?FqjP90bjKbcGE@o`7-q5jkFbj^&LZJb z3k}c?(^28Tz`{rtX_912V{~Iom+3AuDI~7Y=RBe?0HO|sBcr?FW55H~zw|!yUGcX~ zALULS+I{VY-FvRNb~pF1%uOqDe{Mhex1X{ov%UGoo4r+Mo+d}B z-UmmiWQVm=Vs_ot_GJwTd`fSAs> z0Lb3u0KN8srdwxUcWln`kFJ=oxzhE}ij|K&ylm;NT$}FMjpv_#L&w(pbKh+m(bWE( z{J_x{-+1SZ*WV+*#E@K@{4vJeDMi>yb)JQ1d0C)0AI?`<^(_T0!QsK1quZmpI!|4= zB|5+}APoOxc$#NgcxrTA^lkk+?oaifTfYc6OL@YYMOJ&gbtoTXoxt1pAFS^O{_6WY z_-Xhocc7kxHv|urUGIgTL9+YpwP3&6c%z|>HyYol!t99}B+g?F=5(lzsg89HB`VCG zr~*R9MPc?N&z0tcatO1hLzq2D7}Jc_4j+l5#Lk33AwE7?aJXgp3W8!{=4%Qj|I6Pb zCU4&Vn4}3$J|=91ebXSOx^+KAGQ;-V)eqhDZGZWR zqeowOX@Q@17kZ{zhUB9;PBbAlC>R04sWfWLbT-nR zjZ|kN+1V)WY$Q4xMV*Z}8tPhN{z}4|Xfh2m4M<*?n31^Bbdza)@*&S-<-d|`CVwd4 zuO43hu3s1C$R%;sFmqs%agu40d6H$4b&_q4agJ$@d5&d{b&hRsdT+)->37M}p2-R3 z@s{c7=_SjGmm!z;HuKM|x0c*detY!;=0~jeXC5folYS}f6VF0KFK&+-;)baq9)TM9 z=gohHSXTa_@}Hq2P?0`V-OhSY5clqg3&uy??3}L3Lz$WU&Zjrq>EG1B#&{zs5HuRQQGvAEbGLT6R0Gzv9Z3^{Lxl zzO%Joud-Xl{N&jQuASDUZCB3m`KrR}kKA!#+si-s%^z5w$lN6}2J|Toq-usFuGBa87IZ;Z-3|UCFIGhP7!EE0XPoS8EKL@2ZbQ^qGWWx#Nl&yfPG=PuX>&-rbzmWle(w7MZcn^rW$PXIp?!U{4FMcsx@ z={DuZx`sFka^Jcdz^RK}qJ#{0hDJ1BHm`jB`aS#hd9o$Zd$&3J&bW_HyMY-N@VJuGST_^iz1v%oLzLjOs% zaCK>VDH@uPfriMmCKWK?Cj~Mjv{S#(OZ{$Ivfv4Y(Skb3FZ5FEi)1G_OT9Env7h&? z`GvUx`vm6!R?y*R&-s~u6bwessTop6LtlsZqR{rx&QM24p%50=Xek8$IqlTt%lNb}x4=%kuAPg_3;3>W*twPqR>{GMSAs-{pX{!8r? z{x+#Z-6%LWpFd{vb-WQS8YYFvkBSjB z^PXD9g2*}1Y}%5>P`jtfa`0%VPejhtYnWR=uAvrXCwFDU`gKOhY}7M-S3+!(*rcv1 z+dVIqWa;pMdL5Gzu0~A74^dUQ(FA)&osl+3BmH6zUay%VYl zhE>Uj4fg)1t|_Sma49wpYpGNMaLPuh-aJGaY`zdM`Qwcjn`W|^yv^8VS}7qrjjuAU zG+l1K7NO!BXVAy4TO?t`vN9i5&-=)8rzmrax%keno zfaEimNK|>HRf5@Er@DQ0I#6j{-o}n1&=NhmgnK%LL=UV-W>P(&iozE`$Akt#X~N(e*yT%b z2}i=Y)JixA!16_WaTn)Dc6VpUo=Dgg`Hx6^WKZVi{qlGUaqE9Slv|*r+t<%pICcfU zj(mYyX4L^unp<}XWg>{+G-&r?c@?hrLQ4F{G{V*??3X&R)niV;Idzl6ve*FcLjx}8XK^%^3^u%!?-o|K`?n6=kQ^@b*6Z~FjwuwFHcG!D1)cMNt7b5C?! z;GT;jmb2We^s5cajED4x9sAw?)_-RzvA9a45?jVz;>ftGyuG9b_vOY7#;x)l)`!^+ zzQck@U1`7mu>DoI4F6y{p`37h=02tW))cXzdr|U0Y@K3j7h8wey7O~8Y_>ZTx8yP! z;8S#@>~5GR>;~D!tSNX2-c=iDO|W5#mQjP*nAd}#1y|afb&XXnFi&#Lb6x4$=rX&^ z3MMQKhc+MF%}yW~9qbs6^lmqV z)}iW5v%?;L!DRqEtjq1rBGv`2aXZF2WwU#M`DldkG;1~@>CZ^X-+6X|`b!44VsyBy zcAL08H`YQ;^Qc| zK;=Nk58qjYY{FU*#BA*Nc$Xor9d+X<6&*Q57upXk0M`a5IJVnRO;_A4_2N`>4d2vt zad9;|&o9n%Az|7aSK?G(T_lwYSE{|^?fodRRgQm5@LeAAfsUsMM@A`ZN$3`6l;4-W z=>tFZQ-qXsk&5o|i+prBBeUVTrw>2UqSQWeXj^@s{ZHlgKK)4PdtlLbA9uaZ7qoAE z<0zl`-5>dt`_BFbyxIY&;2+@CPR(_#wp@%IG|X3+!k7%_u3 z5Vk`oe2yv@O^J&T6A2%1xS0dle~`aFR7VFJCpdnl{LF|t7mnw2&*`5tyx}l8R9|CA z_LvH6A!j{nvRuV(vKXt}7b)Wn<1H84?_gWaTP+9pLF=oQ*X?gQ|0us>`mODK=O<=& z=Nv`Sx7+0i*dQO`dyw=^Er&?@Hk-Mg4E*0u`ksk=H!ba35C1>PZELIvv*S{|X^o03+3*2X zKU%*|RMzRQ+T-#Xo@hm94|QEBtSysIX$v#fW#=c(Qzr##Z}%i`q*>+{=E-pMi!5*C zc#Hh*7qu;3Xa>OVk9C_I`+Mzy!bYe<$muRbJ#Ig$cKgLXT=(#K0vDzLY1zolMCx`Y zDUBCi4RHI(f(9wM8cJNxh6eJy%NbN+TA#b~&-YhG%2RvZ%iY2@eelPo+~>T6<<1PQ zKCkw>oVESeY}okRWLou$5bgOTC@I9}sxb@;Rz9z=)X15DPsmu4)w>)v6|= z)(zT_2e8%R8#Pye78Rt4?Kme-jG8c?C&ogv*CAWvNYLTdTl5~)jhIN)8qX7Duqqq+ zAQU(Xw=BH~dzM({!h0MMO2qh3ogZl|@m}b7$}Fok6(b)nsjhR<2IZ98K3l+@v1F_n zTTg3GTfO~Gm!-sA;u+!_?;h_NU(n`m^RyML(yy?sa;^5RF1W_F(RG9S2G8~0t>zt; zXPi&F4tu{af9CzSt=)OX+YyO&lCBS_x?#mJz_A_yox!f#7xxEdsI3jCy$Wa#pmDe% z4hFp*Ps(lfV#i?x^G;dJFz1+o`(Z`uHa))-aYlGmhKJ8!>(C8U92F!HflZ>e#h)U;aV(bf)uU2xu>DoRq}EqlZ9E5XRodF@oo z3Din3z5(Z{<3T52V@`&U7%Ex-@`WNw1Wd6hl(^j$n?ke;7ERy;!*|-j9RuKwPeXS< zfm)L%h}q`p_mJcTq-#T?85ryk#!l=j0Gyl#9S1T6XGD^5o=!W-m)NBzL%NVig3H5m zKs<#E1nqaNw|9B-5Wg#}v*hOg>Vs?|mi_DA+`N9t>MJj-%guVkS&|ITbrdQk?RPG} z>dF;-?su;~b>8?fM9U@Mif@CK?dYb zED*m^hoMo*OH5Txq#v4xvO#>1aj2=)If;$sV~rC`qn-2EG(HX1#Vgn{;}xb&>>9uW zonfb_I$xTV8ndQGP0cSxS$7%sq{I*&QI}mR&nK`1JQj8-LoHMHY#V@6d zV!ioNn?xZDs!0eZS-TnO`HsC<+jaVuvt?;L}}b&zr4p!nu9x|tmAz-oBr2u_d z=gat{(y}sZEEV@)O>lut#o|wf-L8}_*c48spa2Ay+OmtZ{B*?Q zBcK6JC;U-tKKhMp0x0f>(!nCumS~$T_Vnd$)U;~oSqsArLhezoPb&>fsy`iq4UVVN znZ}Wq0wBuNV@R*`g}q|42Uy$}OK%^F;*3O%_*^yF2zR>zln z(1)cklhJD$6MPSP5;NvYwGj<}i67{E%oa}-x$G&Mrzjq`+n#iXnj)!;x5=H-XPQc$ zWJ;6%NmTJ&2fA-7zxzgLxVVRNJ&LaVL61_FgXqx$JHP`_fKp!!dl)4y!hG34X+{~K z=+PmVF5NyKU-E+vH94nVymX4r(7i+X^!xef>vOy7$Ia;DwA?fN>Tmlmye8GK@4Xk& z{p;^>`ey$kxApqb=z)uPg>s?1T=Gfd$o8)I!WOSjvBk62-e9zVw4;!9JDy&0#!YWq zrMJCt74rD&hz@G;&GdZF2?!v5#AP9K8K9baGHb*)of z*Lok>tOhBl0_UIu0+LmloyA3?yp*C|7uVP0`=yz=iBw+==cL8=|A}n@lR}jjfDOj0 zTdU=&>b2FItL17%8j@u!W)vq+UX1V4Dp?uIaV~f@zUf9bmd%k$R3}7QcFgg$gI76j z#&XUN=H$I}w&M^z4}Cj;?C1&tuU-EguFykV;XU>+5UhspVicJm(riSC0z$;~<30{| zg!#hoQ(@j3W@6`(@Xf%%R1W4=i>t$n(bZe@1q6~Ho>8EMi$1Q&_wg&}<8rN!i#zYB zvx8%(%7hL+@Kl_|W$N9@qIWgqL2;E{`Kw%ys|0~H#H50VRq6+<|48S>vRdy7Tm#*& z@O%Tb9+Lin-VLjEUe&v$H}4%mr*hW&5Km~`vRK^j56|i^eVadPTjN)ayfI>?vl_e3 zn*5_@y(^)(iqun0^KDHm-c;SRsA*l3a&y!6rkzb6H+|itYf>v~>ZGPVkw`zz`gUE7 zv>+NA?Ji#Ey7!yJ^)f1Ai<(ulSwC)3^Sb7*o8{)nWw;%gw{%@$^7o$p(XK1JC$7*- zjq;)JW$VWc6_**R219j2$)>k<=;on(C;}0WVLUk--0gy(@pJcdvg?ZPOCR7FqeS73 zezAVMUqqwveqE=6%<(Lva|%yF2#$@ zW{hgG>jF@0yWKa9s&?Nui7OPt(!moVu;i%(OPE3S7|~SM*_|W$Ec}?2;;G-kQ|qN0 z@%1$am;q;M@kWFc0uKt}j$kLQ0$e_uK;38Pb|q~ji*f$l-LBOCbxCjzor){yRGdu( znqifGNX%_r_X}V|JHEo5%hM zLqT+AjMJSP5eWi}8*b@3DNn(OxRpQE5e1(wM)^GmW0F+A2P<&8^Ru0N!(YrS;2Vde z5{Qh6WL;|s1Q(z$?IIQe4o%!vM4ySfz93IEr#h*o@N4*ciOF(S*m>!!Mm0Y?tG}2> zpc=s(1=WPvB7|^hr-#p-u2Ibo&wp3?7~dL)LJ}bsur0!*NK7(-UgBM+g3P<_m-lQ9|v3&pnU+*YFt!VAc*E1$z!0;U4!~iyT*Is8r1;6smiuw`Pytp zmbYd%XSLld44Quz)4#OqUZ|V_T}k-EMDJak@4e6P97U>!MPPlci$z+Yce$FyeC;|J zT|hnm!*lzC3rJD{D29bx(vS>Zx=#7A&%XnIr8DC#YZc~<{%5YinSHv z+%>58wEMkDT%!;gE?b24H5hZbXwf*=>65W)KxP@5dq|1uwn`RhidxGVY>zCCupuN- z7!1k+Jqj9`V3Pzs*a8b6B^3o}t_x(9-wZ6UzScz$SA<9=bU{eD+AGCc3KgMQRCpyl z5jG1KWO7K1gtW_k4>0e|d)ckI1^D`BwzHq*=4}5C%NCc`$vgOCkRmOTU+N9?Pk!S* zR9G=xjcm^wcgqaQ*p2%fuy|i>MGMXkJi_CFdsdP2V=~egkvc(J2&Z)GmlxQn^DS&A7s261Gv zUZwu5Anc9so@}ymv2(U#c3^hVO2^X3^1|y&A1V5jop788e-l4b^i8pANN`x;(D>}& z?84b)`eCNw@ixcY_$tRk(u1x?N*^iv)NURaovE77t7^M(Hwz8ra;=8TzS7w0jg+`e{jzuN8NFNRq2SYae9pqDx7#KvLZx984+_qpQ zWYF8qwouTA5@3(2z2HCz1f`fHy;qm=TGtPZ~nynWP)`Zvb2iH-TG3ip1P4 zuowihpB`q_@B>G#5i&nk!;vQe6NZxYBA%+H{W#&?R-Fq}AS14;(FhDTBh)`K0FZqf zFL*;lW+R1#a#dcWtQBhM$c)9HBnJAgQr*e4ry!N`rjrGkLMiPjF4VFO5u+fIQjn9( zWTEp542g`K@uVpp0mJL}_+=51kRdUcDx&-Oi4Th+v+r>2Df-Wj9z9nqTDtVs<)5!g zs*4vanl`84snE{2`-07b)!y=&c5b?9o%hh&_T2I~yQzV(=XZCkGqS7Wxu0ZjnIB%% zCQm%FX8rzh5Lme5xY7igY?QuKhs|$Tk=>A$eW*WaXbKDs$fYHjq>?CWlw?`g3*~*1 z$y79rl#dKljc8>}=8_%@d+;7P71iHME16j>Ow^f4oQB=-_B~Y;7|VeZ>2*e3kJ+PM z3u?_z*dMjjOaZpgLAF^fkGra2cn|ev{K3Q&TBt_$nsTJ33>!J5`q#5N{)o=aI?VPvSUS)`&bot}l&ae(H)B5p|;Zg(v`e zGQ(u0Ib@*D#uzkcLjXmTI^2+fPr5DxZHg2t=&sOB3_>F*@Uk0N@7!_Em`hswjhX#; zpJ6MSCe5fR%Z86etEz_F-+$oL4XzjODsta-<<5P7gKh5i*$Z!zOShDlU-YXPzF=vu z2QvYqu0?OG$v#p4(oKC@wk(>}szE`wdpCmOa*6Y{1HWgl9v8nH-mQCuWepe5iTZKa-MX`+WRq`%v$3_P!;F=f^znyNB#vtda8^IDo3t1>CK)ohKho)KjOi)4^5 z;ZZAM5vXe!#PT(V`(_POYWg;pwnEbgjYv!>=<8t3Qm=uftuU$uhcA9u8x(>jgEH4y zh8az%g%Ykw!=oM-T~E`7?CF%R;BSEHPnv5cozenusF%Oj$&{Q8ZLq+Lc$7{=_%suP zf)UEljGzx}-WOTjHgjpRZ|;jN%ZIIO8{G8jgHQji;OT<4@sk!OdwqLP!{Giy%NC7p zo&L=HBOmkHVMFWcAHTl;`2#B}@7*vc^wYN4gKD$GADuYsh7nVL9viT<-@0dZKjK+E zby{;>`GBocE1K60Up%_9s?QChFTQ8Y5q3O1qq?!BWzN{1m6Lk4G&Ww+O6$ygc8t%K z-vD1nB#+F-sCJY7P0HEl(sJuX=p^FbQq>PQ_x#&ux7~hw+w9xpO;ByE=2lCqz14wIK+JKNeIYT{hT?lBd$G|V*{sE8%MuqmBRQN<4joQo$fX3G zdsfq+0Gtl=kBmE*5hybj8k71qxQzKKrHmo~&mIMvCtc7Xu4m=jYMTP)N}Dx0YQ@%kHfW2NAGD zQTC@q5YkCvA%yvXF02C9r=WLo%D~>G<>=6&fZ8|O3zZ(BGLiY5M$NgWEeUnib-p5$ zM@z^32?V$WBVnm95(?KU^@UOoJy>RuFNQ-QZ0dMTA*(jjh%h(d#wKY4YZfBhC}LGB zo>1T=P&942Xd*%8-0Z?k!Nd{;<;nEsx^w)opFZ(&a#FxoF#Wm;_2~9BzpT2uW_rVj zdGUgY4`oWiv*Pn7&b?0l?7&Nlo>)>l@7|U`JQnXazURocO)p1+{F`e78)odAtEq?puGQrXpN&%4}Pd|N_yMc;S7?Rz`)e$;rR z{7?l?XG$wdtFt{GmUmblvF*>koP9TIo?)!+Q8m44SrxB>*19KMQCD@4U#7+?%e|GA zyH; z4=#tx_F04dv^fO`Mj4puMTw(gE}B=<0TZ9uPNV+3~F?ljfJYSs7_P}JR_ zyQ2?*c6QhfRlg0&dLNYaPVKur?Td`@gZ!~QMb{=lJCE(Du4I)@^Qlr6?(NG|XKRu< zk_(e-lV2s3Bne5 z8}SvP?b3rhE?3J_Wmygu{NWI*1lAB1=;l-Hr%r>(pFVw>rZrG@J42uU~ob%HLh_KHtRmuUgeUOs;BQ z&NrR?Eq}ayEZ^TgjMmf-l}CB2j!Dt7PzjmF65oY#ImFvUU6;CNGrNN^50# zp|p_kRyLZ$y&=O=Ctu4H-~&zFjZi?K#_j_$?H@FWY-IZ>c(8yKOSg+3Pzdf*{_vW= z|A~-db0?^``zWXR0^JL^1A{a~Ek=}{p&3y+lHNdt>5%ExtZb8;FM;EX>V9vRbbuX7 z?lCUPOX4HjPq)*0M8D`Pv=>W9XE=Uh+a{ zt`+zpaO=da3EEF98qz{qJ^eyl5-(uv-S+cdKu7+EdY8$?9w`6fzgC7$fq(YZudaI` z_bHpcI+x&?7dO1XLb;!>Vjr-3bN$(~J6ORE_DpWTj@;jN&^R#oGH(_VAM$Hd2MgGM z_irZ{e^jhMO65O9*tQAJrfH;Qc-#>&IYp#ot4Po0QTED${dP^bxQnWF#mKh&XOM&XrYQIbtb zB>j{=MQ;if0ShHoNk}?4+GuEQh8A5*YMQXCh*z14*)smTvZp=9pJ*S$&z|kq{`#vd z#E##hJN!hh&*M4A6YSyKcs_;`8qb)Hmvkp}UrS+lWvWpfa$PBm9w~?HgrguK_i{9a z2d0N+29{i4npAW_dTeEz{c33)Cf(KY`tUW8r^9EZZ__?Y#E`aRMOA73;vb3y5Zin*+fudd$2uSspn+-Ew)0*Y+$c$Kh6L5=4MWHMAB z2#>sEy~*hBh#Rq$GbNyFE=AHHV^&s@PAP?vOtq4zI@d0b0eG(($z1pZ6zHdS2jy~l zv6z5=ZQ08!s?s9Xo<%E$t-hV$@(7$@55hF*xnSKJzaSQZQA7 z^ScCb5#GiKpvg-Ru(HpMrdxQp$CGgqs9dbUPtu51ZWRKFAtPLy?j$sDp@2&iGwx?7 zw}Vv*sGG`Pc1+uOVYFm_?!cjqi!NM>z01zq%Lcx(;WcH-jhDQi`-{(6D>t_XNA?>x z?T;*?t9xeb%j>4D`T3u7+xKRo={jQ{EEb1lIl zR>yqDKu346^}49yMa@X^u>D#+FBwdQQt93$y?cx(8PQ`}Xj*!CXnA^lXnoo?z!)@C zWa3_jrC2IdG6-f-;uYehx~$CKOQ|k%^(rj09AwX^uHrI9A1^b6YAedT!J1#d)CVI+ zmq`j8E)lN@aYRUyBp{G+p@!$pA2`H!we=o7 zzU{z(n@5Zv-Mj6&J7?T-%ZxjZUNoe#am1{)Q9ZIvr$s8(xSpf{hOQ-0(>Gjk7tKbGldl?GAR=-rP&M z=lA^M;UC=TMm4aGZ&vbms&FP-Kp0pwRR}p%jxUV-} z<2Ej{t+#QoM-+ZCA?d&j#0c`!Mu$N#`ho44>++Rt8m zUi||0U3=q}&6{#hLyp*vEbMO)=@n!bs(nh75?zU}m(t7JXc?jmF%PkfS0&{1=zA$_r%ohzIuaYu(6C?7_?s$F9i`CJ@VYSH8GbIzkA*)*_<;kV-Zl!| z5?_PHHzM^+H0Tb{AXFF8_(psmj(jBq6g2)Rf*jCjM=cl%a#GUGLNdu?p5cfnfY+B&2?%F9|y)vX|s< z@2#sHGWcJ6zCOA!b$!}8E;Kj5n^FTqysETk zh(`+S!4ryHe8O&uoG3V9?o%qAU>o9TS6j*5B07r}j?*W}V?+U2Wc9-{!t%;s*Vf`} z3Y=8u5RAT|Cv32=4zWDAenU?;d-U2tFHRY8MXajgiQFG=y8f{{Ut%vRB~$zLUBP~G z>aVxW958&`^4pXp&G%f_THE^j8*(4#THf9N;9u_jjd91$OQz+@?eqSgf|ixTya`EPi&cwBvQ(h7ATwTw3RShcAf*T$j*K#3{bC(x{*;7GY)EYH3gn~) zEu^HZV74(5Fu|)fDes(3@=Mw;SDfED`MmZAb#Faz_RQJW?|oYK$_hQjy?Ba$;VBGK zUo}Cz#9&vjHWf=;ISlXCVLs0U9wzAz8&();B^PEQ8URIrKI)90~r>oWAVMZ z3yz$vd|vm~H*557pDCyBz>hLr$)KnDsZqUwTe5J(qc|QE99g-Qg=}EvX49Ttd@@@#3iopgs`RN-owe~sIb=V2fuus@E9{)YPXo&*s)s{$?Gjovi6z5d zbD2uRmsHdYug?^h`du!+DdjX?&~tR%d9|66Ca=q9O38b<=gt}Z`t>iVYD{_yi_2!^ zW_I*%|4;4@v-=OIujmPjV%aDd5x7*vzu>>d*cU_k+XNFr)RIn?S<>!`q9R^#m|uxy zKej(ukZJKT#F`z%tzW6u2bq0svM_m~`b@M};!M1V6}8=5%huICSIei?E~@2f?P$P< z6r7-wGB9wq)!a?W>FJZS&d_v)*WlDi5DpSe;O>GE2`dXJtQte2ctAvh3Rw;P(ttlP zkI8jKF0FzBgIBAX0hZNSHiIWuZ&C0Vr_a#6_3F;2UVZVY zy{}%gd>;( z#^Cz2qc>-jWIi0CmYU?OueXn%!JssGn%vn;?+m{_b0)(xO=V4zJCD0H^R(#ylQq=H@qm0hu z*?Tl^lR$|ACpYvX<&D(6B=NP(U9M7%Ey z%<1BULGSXq{lsCvp4WKMlx?i)MK*fx)$=Z@pUUR7KR>#B$n@H2uWdfkcI*D_?MJrv zZ<)&EdtPKicjgY~zTJ^)pWM`(sWwX`=I9hOG*ul9%Cpqdk#7)P3*FqAtgvTM}#G0TWw%0*XCJv#7oWMg*_yId-I}jS#p+86T+Z zf^&me8;V2~@CHEPgFwKW=(m$U>0hq-diUBRBWJ&J#p6e&?fTWvX0o=cFIw5?c`DNO z;?)n&>|LVXxAeZZFXQcu_rLApS)0S{NB9u?*41n7J=FTI`Q^Rm%vkzZ$iW6aynpJ< znNxSIz3`4vL2qHuxn@S$$Z-YBuOC%Ys16!>PcHWpPua~sy=cW;7Wu`k+fOAju0+*{ z!Iv%>R|h+ybXCVLti!V;M3_if{wuX3AQ$KofV58q2T5at(}Tu>APYNbuu6)6isRKG zVZ{}37bFJBLv16RBU}Ruho>imW)@73&P;3!txNnShavC|HvkE>UDY~f+9d{ptd^acN$tXyoGu9>0v>E)7w zn4`o%KFpz{gB79jL}N&KPM5&Q5Gf z=-hImSZzQQ4wphjP6wio9Y3*ig5WDE4keV57_We}SS~R*%AGd59P>&Mzb$2P*uf59 zo}Rcj67d^Qd~xFb6h!}$Byuvx` z75ICAiWBHh2wL@i^Tx5q}HsDXw ze>Fd_*yc@RhVHg7tZc#%CLs&N+E|1MzCY5KfDsIMIUlO#U}GqeY7D7SGK!INkL+Ry z!4~2>HR)%uz;TO~1{0y;g#5XK70by`JRyH7eZr5+e^rhrzN*j*4cbd%c#pX?Xw!?&(;mvc;TSw*W}*5aq;MD2j4hg!2FG@g4xP;4SMtSpUq%jv>$4D z^UV>BWnhoL$c<52p_|H5Lb^_ExFN=_jNK6Bb7NOV`BdlJD4!gi9OJ{I7dZI{_wYjA zxDta3n~}SBsF`+brw7QwrwAlYqo&<_Tp=;yU}3IO2^~6#oMG z9Hgm(jbW`5G6mMT({R;;aUIWxplJO#nH3b*dmv?i19epv>+*ydoA z;epGS+#NU={LkyZ?-+me_?|(oq>moW-H~uD7}?Z2`@m&QbAEC2)`B=(h5%GR8-Z#j4 z%NtUY(o1LRB{w0qOs8*-BNq4#v*oIyKl~fw_UXxZw)W#lwmuFavC7&0X^-mRV=msK z0JMRT8Dji+@r)j593FP$H`^ONf?kUIzU}Ncxu@Ac*+`Po61GEWQuOffRP86vkDLOo zbRooC&H&^dGRQ&wMJVD(Q6;CFN5Ya{MUtp6twFzlg{SG!vwwjZZ3o*Aj|P**cI;NB z8%9D?x>oJ2=)I_A2G~RnjY(DvEr2;kPKE(tn2`EM==8|+Mv+&^U>Kp5Z#4krT4&%0 zq&diDs&MY;^+pyl>4HYn%A&=jWQ@|HTLMVcInEGt(I^7+bWrRNs232bp4LFfUVeQ- z5~v}QVoGRO?$w<0Ssy#=OIOJM++#36m55v7w%1ra9;M+`oxNo>-WkugX={o}rZL@Cp?wKu%iI!{G zN~K0ALk3U?>2`iUkYsZbh0{K0zO zQ&%7C85zh2=>`S|MK0tQ250aY!4HkyzLqc85#76^g}daa&523MCmYKFGHp z$ix@L*Tp$x^F6zfSwx4BzuqJV;;8Vr{XjOpD6}rbfg!eMkC!0}iErPF%p-l~Y1S8+ zKylW0PqMh!NqaCCvc7w5*0!oF?fOx!t?wR`nfKBj7Jb(D00My9Dn%|9Ji#ZOpMu7* z1<`-%B>f#*(!`+CBm9tpfKIgw6^&?YGNhpYA%{u+@zkbTq&8iB#ktg`d0!&6Y3z?3 zeEFv}Jbbp}CrC_zeq#4x8& zU3*c|_AufNAmA+UlwUS3^%~5 z3(AEi;CLKlZ>SddDbE-TmNVw%NPK^8PcTwPuWA^Xb^0ewD)vn(pxjK`Bvh+y(w$M3 z!-^jyC z&$E^-YnX9s?iJR!l{<62*sJW-TrcgFX#WO0!zcM?Sf?UKnVWpF8wjcfdWL|`V(xkf zx??>Re8t`8Z$T4{HAGh6eh;7h<5&rx3Pdah`r}Os@ zZdNQ)W!_@hpZjhLYso!-+uGbWcd(}1%Xa_}uj}6F8AzT*mWRPD9YxE4QD|0CtCyqn zax-CND2i-0H^crN+>HPLyd035r8lg!zBo_A$$uK51R#DgY5P%Ski7e-+bjORI?6sg z%0Bot`T36??aZ7LnQTe0RD;x?%|a$y(Jn5s_AM4y9emo9n&Ir8V-T!=|14 z9=i}ZY<>1%xsP`HbZ4@FBP>yRnOfk8vyM26tAWBgK)O2X;_L!S<;yN!qUDNcS!;CN z8gWnWu{UttTDoqwGtI2?qLC7jv!Dq1S|B^9g!2tHco39{FS60Yj_%y0x&4!@LS zTh-Ctpf?(hhm(pDRHBx+C8^AdFG%tkp=nWG9juP>crYI2s|-wMW1m^r0sYGszFA&p z=W`Xd$j+8qmfH9l`AUTs$4vl}hCKN3UTVOSeO9ftpe6hKcDL6PMW9vzcLbtV+2xKR z;8XHP88^nFI#Z&;!J}@!&^8HdOqdA-s+fjCCcys)bxc^z^PdnnWCHUCErEwkpHM4F zM)p_xNBemkwW7E`l`a_T8deR55g#p0m3SOwsK9O3rdc|Y24VkGi1KLQT7;Hm0u&Lp z6huJsIvW2`g-eCrfKwTsmSBo3ws#8SrBFHZ^7UyjQ7v#_^5kxz1MSTMYYdZ@ESp#$ z^C1JBwe~R7d2y~wN+uhGz9^mnuAo#D_oF_u7DK=idKCS1*VZ76h#QWaz3vUEYm2}6I_BH~h|RL_2{&QBLyWZ?sR1B!>IhnEeg7+y1= z?jqeq#xcd0q%SEOQ!&dp+defpFFmhpT7_p)&Dc7Afp21v*Z69Sd#9VqYAgEI)YKu! zw*;`vDO-JQRpe&xb}#pOIg(=_$2AQ`-+MS`I5FX3oG zz;#rt*RC!^{6_`$LU4ky?oJOq>JGQNEUb} zLAsE>gzixgEFx z^@h9Zb&{kc$y#+jEe9ZtN;{e^M5>Wqr`ajw-;H>A^`CPmmw$EZ#-p|BYghh>Ir-VI zEu6g^Fmycfdoa>ICKLAhYS@ycJkWU0XMG*;9PxZ#*Sf7KU zNV_I3B6k|5I;uIYC`;Mvx74P0KJxJ27=Gj7M+`?i{3*jz9=^@6&BHevHhcIQ!x|6& z&iI{|&oj>R@(IQXUT!s7L6{z+0eFVUu5z5Q%V)UV#+kL*CN9Q zay`Lo(E0lP&g$x?#f#BzB)!%OO&IQj23q7vE2j2E&&RS8%TaLq_ni&p8+1_b^GgT& zE*W#KMRd4M{ueu6P}Lf>=M}~qjNE2q?FRNCj5hpPRAc3L8=f@q35IzF#87}(@SKP~ zYG%e>3)xz>nMy{Z0}2edmUu+aM4V{CN@;MNFbzOSpog2xj!Q%qct|+fK>`r&#K_a* zbRX@0KQ_krhI#VmtdAJkWor5@!(R=2m*E8i|EH1NX1v$Pml}U+z25wWkL5u?RzSK#iM5Wz3{K_BeTUu8}u@=O|%tDJKw|V=F z&6F~DkUyfDRCpiHz`dfUy;`YxCu7wp!Hq)PA2U9hEn+}NTfm#81$t$HrP-u6El_o% zbvNs_>lEGMd|bz=$s-XsgDHk+8L5g)OYNr@w=X`um|QR*0tWS7yuNXit)cjn_I*d? zyI?^0WJfN5;7-hsD%|EPx|<;1o1{C`$@m_l{u&BU)MFH3+BF%jQFLC#U?ii2NpHM{ z)O@1>(+Bufcu&TAdia1T02OZ=nPSu{1{2fExFnYm3yQ24i_&HmPSsC^!VFOW;by|% zcC9h*+%@J^e;m+k09}n9)g}&+-)|z|xchQb7Uov5Ya4TqL-?PiyQ#gQy*Gb}zjkT+ z*7iI3EabQf^e2(!OzAJcl92X8L2TN`8L~_ho$0NeGGjPl@rZoo7^Hkhwi+2LvDnu! zIp#n1rnhASNs#J*st36mpHq$a}uq z)2O$eIfd(X97jga7+kkX`sJRP91$}BctdS10zuqka@7F?QM|&m`ljl$N9roFm6cN3 zA4k(4^!cJ*102F*_8K>*SPG5ZF-H_HYNb5}^KUdOd!s><&1upr_QH5Fqgc|hL=%tH#^^LMjS$A(X) z4!rEwO>E_ec^k@lcndbLK{s7|{^1$mC6lBfyj*CABM2w-OH>zwe)^?qMld86j)!6H zB304H*%`iE(!B!>u$jWpZ-&-7M}LqF-vtXB85ZEEgCCUEYpSLP6%V>9Hm2KiFR|XY z!}{9DUSY50zp+SsW8FT3>_>bUeSu$ricH@@U(h0NgJL&TG?UaoriY z|J=^1bH{E63e?LvHCGK<^J7LY2X!E*7j>p1YK6~eLGgHFa7{q6MT`LT&&m-uLb9Mb z>O%!)zt0yAht$GAFc^sd<^5}@0x-K5iYgb_KcN*4lyO$NKc8J2*r zDJlzJbydEkaF?}BD=17HQwCWd*uMR`+op|;)R#{l@atc*3sGrOzI)TGU+nO2H4R%i zaMRft-3m`aqeH(h)%qRg*D~sL*=!61{F2A(1+ix3e4o=GU>Zu)^=dGP;zgu=p_c-P zj>opE%LAgzvHyiyF1kE$1SOc{Kq%a;%TYJ^|F2#T{V%Q>Rl@I3i>6kZbu- z5Lk!*-@Bbs@PE+dV}ID;oi*SH8z7;32ssH`)$`%pf)P4yAXHrAbqE@S#tPbwgWUtM zj$P*=C}gK=fd}SbP=N!48kZ=cAP*VPw%mOB&ppJJ+{@p&mtCH_{@(WN zy}6sf;iW@-F54jY!fXzyb|mfc<~WXS7jRc_kH8uR4nq>ip`(1R$kLdX`v=0cehVpM zfm-q}BfG`8-N=_1*Bh}0v)>umUXqQ*8m2>X(_|qCZ$exRK!n3L80D*k%*N=8x=TV3 zgveWl=On?sOAaDgO$hAWh0QKGsJmPV89et7K1$r1UwSt$gG)wa_x#21m;VyKw;Q&5 z_$`K8^5XYW!%`0y0{e91bT4r0#{P&5ZV@uLt=WndiX_l-O~%7hb&23s62GnI#Ba8l zp0k^>A_P9tRnAF%kiMHq0wgK?`_i|Br|*)$;enaly%)N-|6BY%*EQ!_kPcHFuN&SM zvVucGm2zbC50u8THL7JRyF=!CP&iaZn$TUULrWgvtR@Rq@AN#ww@Ee@lfrzPYJpe= zf0PUinez|wZM*yQK~m&4DS@|3q@g&_zkel;?=7)h*f#PReisrw_e+ELUAvp+)X;7U zyIJhU=J{#Yj9n+cYmd@4?!trYeAJz!c;I_kh-9GP)r)#cVvtW8GzQX^U!K2%EqMnVkFH~ zl%iFYK`Wwn#-xzZA7gGiT3#z!V|$+;W20KI89Z=kOd8P-o5pz07^_WUQ(jgXlX|4F ziR!{J7BFGsa(H5>28fN8d6_pvXyNqvovs(e)|2qXehAmmATr-6IOczOOZUH=rSkDt zx9`YZde2qsw%>5;y6sz9`}K}z%M;Cgiz@he_pDoY@42HDiQaV7PM_U$+xI`)Q*S!+ zALXi7_U-@Gi?1AhY3rPd=DWAHR8_W|T_TRXeCVY+=2rB%>(0Jam3_DT_n{xL_`Zvh zEOUSf zC19A4^4UB{+EE%-){fP&bK3|7^!6knSGxCJo0qE zF^s>4TK2;y?9Z;k-4U+aHrrD+zR(^G1Rp2-LCR($1Au>%^oOLfOpb9+^Nk7*e96P9g138 zSEs0ju{woaDh%r52|Gx^wdzH$X?JuJt`(I~oe}!nIrOLe4G7$#p1AWTyM25Ajt}td zjr8q6qx#;rSD+ZS0OfQ1H++=_|CGmn5;lEtP0gl%BV^(^|A)Qzj*qfR|3KgKmZ_PR z=_QkyR6+s?X+RRpixg?01(X&*q)Cw`C_Nxe5Gi8823U4o6oYh77sRr5a79$q1zqgo zy1VEqWG46foOdP(?Ed!t?&se7x&PciCTC{e)6aR%bDr{jgscSqm)+wpotb_%T}+qw zFV64*=xuR)GJX4N1*@^87_IrE}+j>Ki`eLtkniy7Qr{nDWwC`{sz=3 ztu~-eCGrC83%PeReXV5hwn7y{bI8^pcfJ~AJ~hQ!I>5)$eT6=8sc(Z%^Z`N%Jio7{ z2!QYL-Ews)r+F#4dl&;uRqH{7@w7K!W?l2kf(PI~;&AoK%^yxEN>`WAjjcpGfLO*n zgcY{b!?wZZQEPxFStj3TXtwYgUKVgmhAFrQ!!HIQgU^#>9|1BR=K+8r`lh(i&29o< z*YPDj(F`4t(Aae(8dV-TNkF`Ncn3T#YXKfKx=EM4uLyq|x-LZJa=f;W4C(2pg~#k> z}v&5OnhRu5Sqhp`Htqe(c$HMAbep!4%*$JNfe$}zs%2c5J z!!g$E6)J4i2Ef|vaaO}nW1s3z0k$Oqv(Gaxv)4Et@y-*L`uyjj0+$EQu97=j%yCJcV!@5Op-b`>3r4HCn7Kt~G4n9Im@Eb?atsa* z89E`6;%-~c9CF*@lIo5nq~FhlxLU9C>RCnS;nz&9%#38{mrK)!R8Q)bp5gW|`Q^#i zTvLu9m9uAe%JTUjwqfv3drMrei~*OJNnXg1UjV#ElRIO)Y4kLa0%Xp(aXTSEP7`O! zZ*AFvyzS-v;$r0x^y+>04h0JczCcZ}%S#c@9qb)~j{30LM>xpP>akI73#lX8K} za<5mdx)rH4QccPVVVaK%mwt))FJ8m~(TL$5+X|?!5G@F(rbeTCg~X~aloaO2g8Pgs zY&DR&?b|QZ@Q;zr_X~b63`c!epW6vT$j7Gk?lWad@4i#|RRf~vnu7dlrK0zgsr_oE zOdU|Ds_ojT)zqu0@sVN(tIjQS-DftYR6x|Xf4}wN0r(2wNd$RjN~thEshgKt!^DRn zExl&1=LW9xj*&qEB;-{P-(9#!UH5h@(Xex{HabG1L3~F}&PS!IqC>CWxM}b;W;HxI zC(V1!gU?Mh4K3|ECuOc2aHXY&To|be?6%9;Z6tT>3d|YMea+`w2Q)!JSEbCh$xQwf z_X;*!@Ec|xMlfYAp(Xp#i*UZ9iye%Gw0%b2=Oy^9nE&1TZ!P`$gyw~=d7?9+Z+tL& z6cRRwj#R75@eClsU62$$V@k0J)g>2-t65>m+ZUjFj&dL@GIN1|CqqLHV#7OEw=eY; zxq4TZ^egfAx;ArCS=$PWxjr+k6W)YKlahPif?E98wNWe^h1#Il_S^}dsVl< z46;R%Ew~|ydN|`TICJQqXI5NZz-R1XW*}u*)vOeV$szYNm}D_xX67L_z2P$j@;%c8 z1ZlNE+b2>$Z*p=57|pOZKmRLS zz_2IyEnKMfL*fPr8>EH&f^vbJ+Od4~Wr(olfbSuBU2od7={V~b-zR?5I8iKH`1?iT zXR+6r|M&5)V}IU-zT%?5j-sz-;bpZ~IuEjO%yQDwWYJN_&5~@sqT|3Ce}kFKzzXDj z6%d4s_fnP5f*a^>DJOA`nKaeZVav z!k;ut=Kd)>m{qdtAevv*CA;6c?{p*8dJYYU*7uHXy(4qw^5uJ1uih(ObIYT*h<}M4 zne)h;SRPK%QIMQ|ug`%Tm-rgJaF(@U;{~ACvY$Gz4xUsxzDrw9PkwguSdkoW@p>(f zumy{R^2|gYH_ua+6e|Nzm`>|FtfJk#9&(|gdR(Z7BXg!g4Aqq}dvh(sWq^m3PVqYG z5_KFx9UN!Tc|-&(?v?1rE(glU5AGL`uy!S`3VXfl|IggD(7-!nM8g7U{C*MVDD$M^C6p40vVheMJ9F;n)E05lxKI(;JTRK~z+fJM zb99;6QHl%z0uCP^2!-6yM|bRCmv)X=GW^y#cfYpmx()H?Sm(`86!qv|v*>|G;%~Dp z@oC~iE5wJ~Y5m5I0_ki>jG5A>*hzY+`z0f?;`{SC+={PB6+I#Ef>bf-pq zUY#fl{$Ri_OHkrvDu%RRK!FRLKN5IU(zdi?s;b~a_Q2&8b zI3#}IvR)*<;38fmv@qRBe9Lz{|Abt1k@!k2r|C8X+Gb|ixZQ&-OjBy(q{0U03*aqq zf?)&x1+2XZy)G|lT9BMhOs$sGjJvDzNiqrhz663D*GfRDDupg^dbLhv# zz<{LBH0I%e(HHOy_elskrhz_XMcWu17C^#hrU}`IgDvEm($ZLlJ(9+X>-E zV%W7=<)!fp1%JB{4kjy>?`*iEey?(*ylCRY+W5x!?XmbL$CrM_6c+Mj_8wHZbkg(@ zjgK9B>#g^Wzj6ZfgzKyLtwqyUt!Fj3E%*rM)vgN=&g&H>T*#qm&5naIYFe}PbZ3Ah zz`+mZQZLZi+yC&_0BKC+vT-&$WVR=WB5nBRI+Gg8ZmV?ru60c^b?q zL{fNnQIkn&mlEtv3J)qqqYms-VynP>M;|@TCT;FNZS$}n<8Q>*u!S!?I;vlXmGL{3 zBk|K#=Y#{(kHll~)9k~$mW*8C1}JJGUOIa2g8DdH&FdApK^~SmQJ$RoeMHwW9RW1l zF2U)u!D>PXhxB@12nH6`U>1%$1UDigXyzg1`ALbeT6oVRCDZrVH~fG+&xsm6(Q;B+ z`QaJJ5GAJzp|t2i=B1rTfo18H(?jl*hVQh9Ov7dx$VE}jm ze-z=#Nr{!%M{qlffeCEcSbS%ZQl*+3Z;_CXQ_PS*&0sZVTXND2!8GQ#;w5AXr?Eha zkM9XCUL&Xq#0da%0zwGK1;Pm7x1Os4nD6V|vDYXb!F)mOb>+QUg)r9-iZ#~wGZ4i5 ziFo6>XrS*EQOscnFD{iUq+IkQ05p0;N#n}ZX47}g@`g0xas`KCSjw&4cd&?Tl-CGm z7TKRGvn)9gVgUYtCW(-tdP_s4iPB1#^Fza4QWV_12qyZfH|#L!%pxqx%@Q1<5!MXh zDMX|4ym%WnpCsP47w$7gdS`&I&~2(u(1}~xf=$|DC;}dnSSx zLSK$oFlFLq#6~eHTjVX$Zu2p-xDAa1U)h-Q=wY@@Gcm2JtMWHCR{88dB>q7k0kk83 zV_ovYD*A$WBQ$r9uC3vZO{WDtgh>*9&G1^Z;0g|lV#ND2f-_@Yib{qEVZ-|l8m1b- zyBY=fcI)x^aEgmVZemWxIzkT*TYScL07Uh*1+0Q~zCHdrt5^_!4GPY!tdb{L=lStJ z@vq~rf}Ihjil4DhmABE&fsmfTTSmgK9>z?vWCTh>`d$OVfgTbcS8c$EVg_Rw!$nY< zYr5eugY7bwBurfMwtctK1px!`BMWbYW+<+aH+-fTW5ZNJk zs^6%(9B>4v(C4|13YI);uHaA8uGR39CanMgmT1nsF%4^&{_N*N3L@)&*9$CnhxCU*X32SNHDu+_iMYl?@!yX>i+eW?Y7ruvgP7uojYIu zUN|qm=$gWA_8B+N8#<(Kr#W4+=A(a6@hx!``j-!+6Gx`O?##5;*lZq!hMbt;xzJ*72Ue$}CvjzN?q31|7S4sy&8|p(<#pHhx*^4FHFyT~ zt*Y!)?cI>K`1Xx=T-R;*kViM)wME)ttMY{VcPxfc*)6OpKfAP`!aHTi)PWtZcX}pt zuUk6gL&^dVVL=V(9PAedD=a99R_An&4v9X~=7lytv?0calqOM4Y0@SS z$fZ)yDo6-KS&$F!B*mZ)`GWdyAQF0fk6A{9!E}-cR=`#yJy;m54oblq-%$)8V2p(} z_-hsNFly$uZLt;v$!N_D9uaTC!bww|?!1f&0A}A@pvWnfJfM`n1qpNaz4=b)@IDT34W| zv%Jt#NG&_zzpb+K+?1p|u~)k2+FnCzu162P<~FXRHMeaD)*LrBkvuJXDJFO7e8b6f zEW$2@*V<-ki}2Pine%b{^ZB?tF&{o5$e0@OI9P;5#5_lSu)bv_b!+`dE;0AVay*~$j-#Q(;j3xrjP%Ik&a^J zYa`tb2-B6UWPf3oq;4=*Tjr^52OrKZRoN--;*yGN2cn)DJ5&@GrPeqcJ|jREcf!tuT^4MgA{qauKOOZdSL(^!~*V4KhFXBF#CFow-MK#5s(z`X!s+YV}(HJk$W zTtGA#uz#!U4q0>vR?CyXPpW|d^c1HaL0fJ12qf)@^)b)E1yV2)`;lMQkoX6`t|38k zC?1-ZA`$Zh8SCgMST90u(?!g&Ep-P6DM&Dhv`MNkCG^8-8&NgFfvCEe4>A`gH+0Nk zhoX)EV{btMbiP%joXUuiVy&2xBiqmCj-Xg7&MA{leaJfob192pD zUR+zF7mZ16&8RqRgLphCP0sWws|6NWMD?)r5_YWQrxFoZA|>tobfGG44yr@#twxNV z=Xi`BP1^LSunqT%iv8$yv5A64CA(Z)(!M=)ImKSW&QXcGQ6g^T2chLGX^-$9RJA)w;k9y1bvmJRi=K^&g;5qIr7L66WM4^(#C2f< zo4%1Qa4A(!tsLP^jAaqcNb{{Q*}O2&E~$AIA-p{-E)BCV*-4_PRxKhqoYtbVY1G6^dO4VR) zEIGcm;m($FUwNn^yN{)Zw`Z_-_6W-e*A4FL5!E8i@5ux|5za3aPDutMC5)%^V{|ig zV!EzSSFIbP+on@=n-p;jfL)=YER?FHF)-9qq)iAd4e4lF$ZDpr7KkY*PE|V?Bsp7& zl)$9MoNdyNHL&dlw%c$Lesh}@oiUg1$4;S}l ze*44wANkHi;#c)r+L?BfYN|I$rdtD9sT^rE711JrixDQOkjig*sj!0r0BC?qQ4msN zKS)GTihCvp$s=UN1{x!GH;t3Sa;=V(+F+zn}2R(hufNId#X_ z`wC<4KQnjUlTR(YeTV$=iaB#uT<)^!(Yr1`zKuz12X&24eEZFpUOV&lD_DX}pXEP_-E7LWl2+OH$*PIfofX^>GZG+>+xk>f?W{0Cil*)mYqAH~J&d8rR_ z+xElK8vkKe#ge8~KfWU_hG|u^odQv!EWYkPW`jYA5H&|+&J^S1T>NR?D@3`pm|;Y7 zx@*r1KPPC;i7HkVl8EM1HPaj(-KZ%RAFPa4j)>*F4zKVR=@{~u4~RmhO_sVcO^@6s zK3J{-btva0<0+9eFZ5KuPPsYBr|_9Ff=i#lq>}Vm_&au2JJl_QvC$EvNF_-?7}5Rk z3fSUbc%-40{f>12$&Mskhh6j|c9Dro7)#Zn^4!|=+T3yJ<8qZUUpb&7q7|0jmTul2 z;ofaVSf*GE?JSu-QD+iTaw7ha2THbXD%>QQq{2}^2nK|lULJkOY>M=TB8e*N zfUq)|C1!shC1B1D@lAkuWEWL0Nk~F`6NLCC2$@Onf$s=gjwgQ9fNeuY>IuI1TD^u# zltOA~Y^XjYhi*;#Pn&_CWT}8#!Di4?2HFaUFOvt+e*%`PSxnq&FJK4YEF)OTIPoAg zcFnU*+X}=pl1w?lcF-okmAQ^=NrBK#o*3-PT|jD@RvSSsKh&##yOIuK{HazuVQ(yw z+zJXie0aj*jPBkW248AwwI4+5rJiDH^Pc$sXu_AH(kahVNmrNuoUro&&p+ z2_AUHC3h$ErE-|>;a=KPa2wY4aA8!IlTT^ZM|46`S)@TK!5;pv_Ejw^CC$D{xH?YW zS>YUN;&dyF(0ZU-*z<{)i$u5X1Gm|h^9f{L09zMfF!%%>9n2`sB&o6S3OaW!p4zKV zLmLNZ&o_-{BZVsB2d-k2_5&b-_$0)I)3-8xGPeqkhv;ym$P%?yaH?Y$9@z_G0{i+w zDlWJaL}3DM9~RRf)FuHZ9LJ?NfiXxlQ-EI(wwn#MK&r(WNik<7G?1Fk72?x4Q3~+O za#Hb_kR3y;=68_nn7ott`9}~L{Ry;<64eBYihvL}-mvopytG)s;-c4Tb7MP4-Qw%- z47{PZb4M{Y`MCIJ`NBKz%vzUIT0^gq~0^_^>%Ta{j6OafE%tQMF1hSShG{m#a3!p z2XPKps9jr$lra=UKAUy0jY-M!Zz>|5YdTob+~0N`u4Gq9gE1%=5&J9xx66;gP!{8X z&p`ST7P55ty=qk0!%4!nY2OtzjN5W2R~>du4*4RHY>{*5dC$Q!3eittW2HlE)8DIz z_Q`ZA++6UMorFCZq<>`)EpvVA9T?TE7}dl|L>Ygwo|$nxn;qU-2EZ70gCq#jCV}Ev;-0HKsP)_^pu)IBLIcNFFB3aPJd%2O@ zERDlmjRW*6&MVVurM>h8T9mbqk@Sr^22-5?tgy~-)4`Ugdr%-_Os;O%S#}%R<%j-8 zK)^Kx{BG;!X=8A8jc0j{oJS7%5tOlYY(J{wYP-14*f!LWp*o=_jzl8jPZ1W8u7~-h zBsNEf1^?bEnjvY62J_y1CVY5Jxy?NhQ&#WW(t3NT7%s z+WKm|AIc@Bqpgx+P_uJO4YYL)7@l3UOE{?qHOy@Khe*0ZlaL|&q_&-*OoN~C-FkT} z8><_upUGy*v-S0?UN#6`pBqPk*%C~#nq5)E0%@maG0;trOVCSw2?IZ=GF1#@1zq_8 zw=RlnSRf?>vaO;6zO-zws|SpVHMj#Le%VJp?MP^##7K}oJr9oX4QDR-GyJwhtSAqh zAOM@%pGiQ(nye~$NrDR|kju~WTM<$W3Nu`x0O~{{ULuVoFW10-kPsXtC2%7pWmqdh zDS5RU60S-m4p{Ku(!{}u#U2Ubxhc@EYTUGf6)X1c-|x(C6K+LGFK^#wzh=T?;!Srk z{j~V{yJGj$6a;9cbIa9y%%^6#`UzVLsGLeNLi5#ERFyU)yonCMieqv0?0jEYSwgsQ z5F_diB9=2YYw#f4Xu>*Sa>5Q(iy%s|hllYM@ClFRN%9n|ltd`cW+zMJC%)op+ttt5 z{aE`Ynnz}Hu;?U_{dOOZBaM|~KIUg*DVpd|k{nO~YAWsO7^a^I`>>ijXr(nr5lzY= zLJ=O7^stZy(Fka6nj;Y^yp+n)>~v^XYIZv7h0ACe*?6CzGqwR|EKbW(JE*~MzO7q$ zEHsFy0l2d(EO*ume?V)(``G|27yY65%{*IbDpgir64YAlrySoA@_d6C%pNpmql@1IF{s21J@cFcY4@ zKJJ8lrwDhbA>cNH<4_EC2A3%Yz%V(YC<14ppf}c7C?vk)QbHsMAsu9n`GS->rJWST~mDzi1*35 zbhq6*osCm&(oZqZNYMj@PEI$Zn(Vf8M@rlGGHHW$y(ben3`Y_W4!j>F?2jUR4 zKpYS>_|qs52WO@TekwsZ2%L&MXgIdrEHa>l`B4G$nX?@RXO!7YmZ;#Ck@AX2rRwcb z!J2{>m*R;sAHxd`DSyd_cAc~ibxwjz5ePUXBTMY)0z@Fa$;=SQ`gbfS0PKU=>iE3) zJD*71(&&0=m#zsDM8R$xtFkbVq&hazx z`e$(PNW##jw{#ZeD4!EtZ=Ul zZ_C)8aWvzn44076NfPtiIo_O5n{X%HWcgOxCm<@K_hs3LA*K(v}Fi5+K(QK^d!v5xmS)wkg|{qsmW;UI}Cf8TJe{L$YTS z;m_`jV;M>Y@iQs*)KX85mCGjJPx761nXnqDRJ~Jp>@! z?4;Qira^k>P|wPqm3#9&weeqHzxeZ;iy!T-j~`lg-`z_W{q7+-=Tn#xE!i}F^chxw zD}{kYCrrw8oqXl!nGfH5<@Ll26o3vpp^v4Ueu4k>*(@y;C!x#ha2sM@eBF_^-}& zv+;_vhY$)%V4se6V8?K!t(#3afV1c@f<=P|n=dm%gwY7jit<_%vB10@8Z;|hWjr32P>pqkNHH`|#+fNc;cu7XC!2>onRlgKodomKm{cm@%_v{laD2e|-MX?t7ly_pbEp#Cf5yHVZ^8?!^~gj#H>7MKko`9xu7nlsC!V(FXsS~u~v zj*A8=HSx7>;%glTT9X>4NilKljS04~NE5Q@&~#HZEGIjJTCI9o_g?||F~-jtkhXkS zGLW`Lb6_sv0varEjVZt@0gbjIX!6VPvn%7Do%{&y5Sj1v9kc6>=XR~#^zFp8+I( zQQOgY*u{uQyunHFocNQdR}oxlH=r_GeWo+QWuuQ+IJ$21Y)<%TZ1Mp>1~3VN`Kjha zfb86%w{o*f`{Lh-Z%bPmr%78jZzf8O(8}M+)j|*&#jx64&1IQNrnil+Q(CXIIVlUg zYmIk#_bLAp&4Voyr4ruR*sIaHzxIXz}K3kew^vmU1T;F6E2 zZlkpn>gbS5Hvj?KvRyjjJPFyF>*kSY)OMtc^O7!-Z5#y*oXek{WuxPi76uZCG6;%@ zgr*fl;vZV19^jBsfa!>>$R^u5E{;revVOJ4Ys&L4%t^H z*A;Dgj8gQFqyy$oz$oKRBd}Ku-Qd7x|C#e%xT$MA7*`JxUM$^4NJq#tJ>lgWDoh zIc}3@I&`TP007zHRGq6!0hZrz)u#*D^_FbYa+g@mV9iTLdwzGTP-BoEP(XHA8p5!G zsI6vp%S~zB+QQ7&{9#;_^s)LMCPXku_eXr*=S4R;P-GxEU^505nILZ(cm&=c}!x(hRd z1(~IR9{y_seJcA@50Zw;Lp+es&Tv}SzF)Rp< z3OhdElcFC3_dK<8`+Sq4D>EU3c~B^7?oy?+pQ23BXMb7OKi50Du1ihUt9?4vOzB=> z$S%-x4-vhANC+X)t0hE9_4=_l+B=0EoraDM2X5?GcBH&q;N~wvTVhUx9C}=6YsRC3 zf9#Ei*xwQ;2mSeVHE~t_1repV6o+svvCe0Y@fwjSlgg zGhs7b%z6HtOy4|sXo@#8DDKRB${;uTVqwJ%5sSiPz2fMMCR zoBMUnY#(pvbp4=+a%9;}&$4nBe=9U`@FrG!!@%|(v$FaPTGMysyM1c!Fc|t5Oceig z>wQsAY^P$2{ZzbQRPFq#_?pZJb8@i@P}bH>_h+{+ym#Xp(Ljhoe%ISKh zM<2G{Hd{lHkni{8RCrSjm5_>DNcbp?Ju{1l?4*2~sN5MaE-n z%6R#aOHFdqVk&!VS?Y}9>&5_ zU>Nh*@Y3Se;L3^&5D{!;{NTlEh`Ua2y!_ z=lL0D7N)3GW>dDI+6ei_F$$v$L~DU%7l~|}cmnc~ql#Xa4clh3S=PgCAz(3@Oh8D| ziOip(`9oafrVMoW@i59r0L}=qIN}?*AOe5+VMtay#1YZ2<~KpU6Z9*0`F-r6r|_R7 z36GFGQC>c)Q;{oxv_#N>T;sQ}0`z^L=5IiHEjt|BB%|hgY z&OCBKyM0nNb1NPvHzb^ec6`B}5=TE3C(}ML zBNmfR>fQjty}&T`WNMU%GzNZyZ0z0Q-c5UFb-S)4I~+_c^g662Ss#n(ouB-rYeAb* zo2hpS#BNi_M=}-@_a;h0lt2(xsT zB@N=e_^|l$;s&iYM@-NE+_ubtMhHVb?vPBp|nXu!qb7{>E^)J{C4Hex7R zs-kbTN#PTdm=~0XRn9%E-P9dGfOn5g74N0NQGRN8r=gKf87h;{Ve(nbA{=Os$znXO z;T?Qej3&yrUcL+ahd)d0B$Rzxy+rHqH0EtagUlMAWs4fbmAv%$ipEO$Rz8Qc1`=&S zujrpPvf>uL7T7Q}D1Ft~7 z6@}8A^R>-uNQ_Hjee<=+$3=QoTXWKPiB{9F@YYD*U2bBh(VE1n!+zlFh(D>d1T8MZ z{Lmk%vf*-*G&sJZA+`_=u{W?q(yN#6LQl0ljM8aF=~-GUXngaiXnTo|3l@yF251Zk zDK?n{fhPGnWFN-!5^Iq!ZH-Py+8RS1_;*A8!E=FKL|uG!Vzu#6jV%yYAwQ=sN>}+- z)OqPB77<^k8ZAk*6aC87MuP8AOdTJxhQyd*KPOg5b36HZ(x#EoisD1py!{jH)K=A% z?L-SPXJwunYm*?OB+tU zQWA75(N3BU>LumnG%7)Oq*og&iTG&i@G7dN?F!`J!%6#sQ$W5k(8^Z(f@YltvV`v@ zUXyqW4P}E=8(V-a)m$C5QL8dBGMEpimYdU#mL;mqJ*Y^6rV?pOE`j8Fy|Ro}tKf=J zPBg!HsHp?=OG8c+UDie%Euo#|5P+en?Qm^(X=ATZLg{or4;a-(lSXtEjn6_)fy)d2v)FPiFc~ z{D7}y?K|;@=I_MQSUt3ZsZ8V(Pd9%V7AD3GiMG)GwqfMG;L+2COd%J(dxb)Y&{3#_ zCvG?4I-xIaD7CP{7%7YqZW1O5Q-vAA9N{+Hc3>Ego%mH+rS+}S|I_E*R?qxjeSYHN z#q1yW{paGvF&F(^w20pSws>*ef?w<6#qwY1@1jNY9v>&4rYHXW)Bm9i%9kiv-)k}b zENb<-coF^Z5B^U+7pj`R`+s1x7Ya*-JA~E3I*4oU5$+crf+xn~fC7G6Xb|=a2ZiT_ zqr%I=pMjv$*^k1JzEVtH+>)+Gb0_3YOu?+wHnJd50o^4sS|NgunvasHNqfas4yHB9ybaTgqwxw!YpB~Fke_KEE84=cfyizlW?!F6?d*3!jrK7 z*d;tC>=zCTFA6USuL^G(uo4hZDZ-ooO--#Y&x&chm@{7}~qzpmOulR+# z2Dxlp^_%I={F_PU78U5qlCUz^)Si?-#b)th7=u!#TT_n@z9TfS(uL|cE1_9cIC>)wpJ z`nA$-I;9ZHJi1xh-8hhbu}JX0i@r%bO5YLJqHjW6v7_-N;M^a9l{;evu>#76?_N-*Y2WEyh*iWYlxdgdqNFSG zF$dGVMcFP56Hk#uVUKX9oGD#`e>cg=I9>#qu|QWy;iMD5DbT>@h*M^qnir2BI2e!5 zJ2j*3*>R`uzyE`A&q|kOpPG%&n0Ro``?LFv-aY#M)2HvpACz5>5f~z!LNCER5qpNn zLd^lH>!nk1&yaby)ef0APde3DAnuztr1my?i|5-S=PsGL{;>_C zA=Y9KG~KDYM_vJ5!3!Rt5WIoFnr(X`f>cVQq1DS;BorQ{RT?g?kPvGTF?ILE*TsLu zzqM>0><|oW?x^@nUwlEa)4uqERmUm|GonRB(Tqa&Z88c{Bp(lG=_2i0vD4ODeOSJ(D z+yaTi0R%hdVkC2Qd#`SL>kCXuLsReH{yx#lINSXKY=M7axs(R?GsuI;X@N*dW_AUE<%B zu<(#4ru3MyZ3s*69RI3k7enkIvd2%MnD<#b+CLZLy%n?aS6FD}V&(AL3s-GAxFcRd zapV#tzL%1#R|>JW;$@ZbQug+wpEs@h_0BcFt&M+vVczFUnDh9{%(>)q_D=kk%6M;f zu##=Q{?@6cTf3e`@_yy*CdBGR+QU8qiC1tg42(0(W!_({3ON{F{ zXlp>4MtWz)a-COHFCWW#yz|}h2e&-1_BX1Um3-2F7@HjX+81fn1lEXIW{o64Lrm=QYu!9yKOqlsUOM zxmb4|uiU3`x8ce1L6caQhLN{Ewqoe@(MYA89ck8y2p4a8ge)Q4l!^gEz43FG;`{P|ovWIOu+$Ap^t%3!)ybP@h zp>V<> z#(n)O=FF-bc<-bUFF$%><;^Hvg-y$8l!8K!bRio<@b&1^VFKb!NNhe z2OgQQZJvDM{#~z6>VNLQ#?l_QZ_9jX&Iga8l_1kiwYoaD-8ykne)lo{NaKt1R}We^ z{^kuZPGGQEtXGPazwy$uTbBlnh|>DKSM*4s>ifq`U;f~NHeGteb~P6-|LfPw&n#Lp zc=1i+H(ArfQ->R0n7?}9!kefDXoru&V)b^e9WFqHdZC?&+pO>?d{E>tMR$;S1T`3o z5EdG@EJ3h9la5SG8a4Dond{*c zyPr^Pk{E)ED10zgBWy1a77kE-sEp#n@g5-2$Sr`8(BP?%cvtn23FKHOqGqK#i<~o@ z8=c#o=bSnxOg{?9AXz}yw34Xjya4`5qSu#H7d2ae4NU}av>VXt;F{*fm!a`m;1BeJ z?60R`f1gGas9bQ(KcW3P9_=R;Y6K=^{zN`&zD&5fAsjbDe5<|eZuC?UDgcR?5r~$G z`~?Wavdokpp+!MB_GN|OZ~VGPID9T5EXAOHuOjmqFZ8(i`A#QrS*7}v(s#>lMtP|} z{~Z4j?LgV$A7~UAp?>SxdI~HEY#PlD9d_LVaFV1PVoOyUrf>iogIG@zOX*3L?dVhK zaOh5MYXig_e3jjPrWG1VG zn3jTZLM+DZXvm%wZ}45!YK4Q=Xo_#v9F?04DD?@gH<*)h9tO2VRg=@Pm7$$DZK3P; z3m!OpPRp^4yk;wu<6R1zJ*gT22m( z?eYX)#JAD6-M8C!%%}5h%l!j@XJIZw@iJf|Kv)>C4v2BINo@^v?rgPJ8SGW7Wgg!N zuv#6H$|_M0yO|_DZcbU59@=f39yz4Ga@(F;IAiRh+n)p;WA~e9%pNs$z^~&91Fmqo z&C7oGJ^RxaTbEBC75~>)@f(NdNBcZ>!|bJ>j}!C%P~WjjhCk5uIqGu@=MOCh@%~Qm zzMTK>C;9j_V0_~@5~1MU!Cn*xOLu|K)g)Pi;~k{C;vLutl+yAY*OfpjijqV;!S0B^ z!8&Ts^^3oOtgX2Ct9W>E>Mbo?`<1*pwR9%iDNdBObMBXNaz!2;S>XMfIdwL5@;&!V zo_x>dn|n{3)T`GdWT3b7+iy~@-V-PG?uB?@O);E#!*zdz&qNmOOyMKe2j2TRsuzoZ z*=;9nB3Vb_4dSQ*Jl>Y{V*;U>O%z7+<{yLn-L?GOn;(%H#hIO$(5X@sk*m{T@n!5; zqOp`mL)>V=w>aH`ZxPAl_!e+fN%*wU^H<|roE9#DdT`&pvd&qKwBtX}{6EfimEQ!pD)~A@DY)*qGRrv6Pld@x11JOykxoF>dFyJ`qm8-iAR# zBNKy0ed6WoGn&i)m`9YzCSS~EubX5WofcG>AKd3uh=6MC)9NGC1+Bi1g^Q?t zu@2tOEq+NY{UMYWtv_ej|E51QhFbY&l5^C$Kdt6S!>@_rdE6Q?UZ**J4ew8zAr2Q?+mYx&reRC ziRP!pkCMh)E1&wKm4Al&-C_-i`FRC!+obr)$?nj2O^=UM4s%Q!-XHd(Xh3_&L$It& zr{f-ipclMUT^s15vVU;B_>4-@B|sy$*VGL1FO1k%Yd z(@B%wM4@xdmQaSx(W6bsY0@1LN5Zr+Ma?oA*%DDq^MryWFh$M|hl{ykdNDUrPvf2( zi2sm)T1n$56KNi@2ICRV%w%3mPw|Lnno%XbXhg6n@FpkIm_1ER8=F?2Ca2x%0kBI( zc9thXT%8BtDtOJHk~}cu)eZGen^e{7Vm=eIK zaPAB!n*_R-d`F+bEaT$O-1zT8=RyLBzW_V4SRG!@!^IFb5wWUY;622B3W;Mb$E6?0 zjdYZhmw{~-;XeY78m@&J7v0*NUA+ChKBLR)?D75$j=#=dmoxX-Pyg|cPme74-KZ}g zI(>TU&iTt8f9S5|k3!u$cjjH$wYk$TO$t0UcH{natn$;pv+@V(8>f7IX36tX;DZ-l zeRJn0CupTS0g9`|%mA}WE0;Z+q!d=jd9V_#$qm3)?rP{+v{*8I6VDgmd7@@+g}bzR zTOOy=0g@Nx_u#dlLt(nZf**FY1x|Nqp`ST$P{^r>)+af=2A$|)W-*)symF5_j4)|V zgDl#dhLl5Moocj2tX8AV5J8Xt4G0SfVC>Mu899V1j~?KpDKs*gJY!vwFPEi}(ln$NFdbW%3Tv zWpCGxY$-5UjQj;H}B0hYj{IwHPo-;wgaO1IQ01oqC7gq>q4Z zr)I;66T2d)(sjkg;lFJzGO&k*@(-$m2HPgnjY$-i}oI#`jw^xDF8$B z_rIt-+__CHDKBlZv10&(?oZ8Cy`|-)yMsRk#hJnF!QH{8pd3_u*)lAhFY(I~B{ZB| zKd;db^C+NK^SI{xJGiUB92));^h$N&(_?BX>iNkJW2A`xr2m{>_V*7Yt)cmZ!Ai=G zy_ztPPRt<;%M0rY2`%A5HJ`V9;7DMi1iE>_WGp#b5Wc>ri9245J&#@1bPQWzwB7~!t=%_2Y&w$M zWwM>0$1SKtp!ZFG#`80kop}BO>@uD3;oAugqvh!&xyRGz@$?W~Lv!gLAyUvl?X(9f zES)CJ5FfOMo4&>K!xcL1wbDOoF1`8bma`r-LJ<4w4b7#0-1J_ubhE-sH?(Ydln!o4 z?9EZ!w9-FLmfrGoOWU=G6x`pPM#jUjAn2U(0cMh)Q>fpMs1?)rGySw@-lell6ha2M z*(1Iq@YRQKlmdv;j#E2_!Lr%8yCw~^JRmS8Zks1k#U^~R5ix)e&c<%bw!km(lG=^-nw8^1TRBm)0tgJBfW?CY zmF7%kpcQZBr_@F(ONS@b0IOv6yA67`%Rpfmy3JQp%&EYt4zd)73D;UI;bm}{BgmBG zT^wG$fKBN!q5D^}{BRM#$5#dIAq#1`6LEM=m_%zv(auB!ACgp;mw}>@`1-3^?|gLZ z+*|RQjM8Xz`+alo>z#<~^V^ZF*4j1lsLR`5-A(7rec(t2bL0>b@#xu)49h}DdyXYM zq{hP)(*w6BhoE$|3WX&9;GFE5_(8)5R9tt-?Q8tN?vmDiMGmM?W*8qZlS z$v^8X)s_+RaOGzCX5|6hQ#!q(3(7uY8)GNqFnp}m#x>i^m?5n16j`GQWVn!xVjqYJ<}<&&TKH~O;79akpXWdeMDccKZ?-p zqB$GlAq^!4iAyR+i6JLt2#`4Nc;agaU$irkCrDJo6A4;~@em@yN#Ps>7X4FN)52I4 zrrz6m7KJc|AfT!m!GLFzAb@VV_=^w|R;2W}{2~svw^N6rP7J;{a9f^D%ZO}VSP4b7 z)jL-0V>`cv*TT`i#CI%}bK(Qp?)bdecrkrJd}Lzg<+gkV3llRq1T*MV&6q(Z*v*)5 z1D|l3Z(ys9WY6-a2jFQP`w>E3h79LNvruy87wKGK|@ikPg;C-jF6Vs-r9QrRHi+ zSM$xzX`Y4BT-|K_T+ce`At^WL^qDCYr`Yu=)T3Igc|BNu?*CVWA zB#rYh;B7S?h9?qiu;%BFPskaGGs2qN6+Lr+h(=mn7^r{R501eEa(wgAR|uyd@;fU5 z<^@0f2t&L?b6QE|4rn~CQF&^aJxY22N9L2S%=u#R{x8?W8$Vq-|Aw($YnJzmPhI&& zzgLta2UhfbEPf*X54f%`?X|UZ8PmTfc3b??dyQu??7})i`GgN(8modksjt-E-G9#a zrC)J}PC5RZ`bDa|GW8MLGq#ZmT4OCDLluB zF>wQ^BjP^kKIfL*{loAs0%dKzCBdD*afq0c7D`Q`DZ-ED+zG|RDk&rulJ+6v^jDje zvZPNDj0D`orFf+8K#IF(ltsE0OulXI#2wLxbY7THA91(|2RJUq_JD7p;|@rS;MNV~Lq)!Z{6IwF3r=^CAXpvF zuEV7t3l^W8Q%$s>$rVuqaQB?O_5)iXDQ$*VBpgw?=i-Gt-82+oEMF{CEi?~+#mLSP zzu=m=k)h~}A7FjrY4H9FvR?5+$HloTMAxoeu^(2%)?sjk6rc+^m8}S1Vm&M+Fr$NC?yhU(BEF3=U^Je&hd3TKg* z8ZL$SC7dAu8xW&~O9&om8At8@(F$q^H%2a0h1dW(ww$s}D_5>qfoSK?Jd>?P3In~n zOqqj#Yb%&5fiM*RVZ{eSuhDO__nNzgcDaV{W5tfqkcK{FPbAkZ=E{L}2o$cQI1zYWPSn+3SZ_C*4yFhBTQ1lWBa5hxZ%M&1D&*bGpUaz2)X@Ty{L==PH1OGw#h z1c4#xmUHkF)k9CgI+Q=v&M)|y?>K^>*KnVq1*iLqI1N;gkJeRTNB0ZCu)#>9#83FHVZKYI|hBu85#EXm%ueR>1scTxz_R{4AK`xBtV`2A^m^8RE?6-^ku z7GXQlv#VneorYCqqP~9{y|hS5D%BTE&Mx-*owy}l4<5@Z>{n|B*f-j@+jrZK0m$hm zyIxD2vp3ll!Jcj>9K~&RCEeav8ZJ$iX4(}~2+lGlyH=S^Zpmr z%T=x#yR1dm;oj&t;u`@0ge|)bNBcQanb0XO9itN;t2)Ul+jvAf+?Zz1);K2YNkAn) zN|23JF~XFR;rc6NZ0zVVtrTERVaj#r3|5KsN^!>sH+9?!0zb7puq!c z>-!EUtyRa4#Y?A7r9$o4+6}cQYvm0nORTN$R9#w2#N1fWzO=SJuaLjno7;x|*6+>C z(%z?M@b{`M97Zv2A07p^U~T9SQ-y%f{;4(>c%4Pl^2(`KFct9PT; zNAVtQ^@@TE@mRsMv=U3=dGHOoH~DVao_HR6lk^V~>z@t%1O7BqGoqTcO|L2!c=?+W zWB3-zhtyLl^%wWbms$lPl!mU*j zvXT*2m2FZLu(5Zvg!_yE8ym+5fp9@|c=#P@_&e{QZT_n$M>laT+UBDuv%fnS^n+Az zG|5(!?`m4njZH@D5;@!mL4X{PmL$26|4_$zUI$5i{RS)mPKuKi(0E;4!+Kr=J@3@> z=OOM&7EjOfKIlHj8r7)Z-JpJ9Az#CZ1DV&#PSP*jqKN)I7xIFQ(Wo&Wb*)x9aWoou zH>ZI-Vz!4@D~brWoUE6q80Bb9^}6xcYaB(_s>NPwk$zJRu0~~Uq7Ji>xD}BpG!tTK+Tz5cX20?ln5Cj8NpOFbwMx#NHZ-$GLU|goJhP9vH z^hooR*Kt2j9%`1OxpQC;fglMpxo*C!tc3L)Elw+_>-CcS>%#@twY~d}C$XNIK1a0S zH+i&S#Mfd#>g71=-C9Q(*1!|e#cz3#VXVPm(|Nf96uF!gs;`=}oN}J8BDJ>t^n!8i zSG6&G59Vz-2?Pn*Mbvv-@v z91Vvge`ax+AW21SN9Wya`7&ZHf`LS!Q%PwlG)}AiqazZNYKlf5%{-C$w@fK>wl|WV z9t;Lv^*r5>&bp1^a8x`@nf|R<#a1E1@&s9~_J8YR+HeF$c+9B%%9vqk2Z%g{zEhB1IP+_3)062U|zlN4N)jr^=J{hDfkN?ko3p^l>YxLO*Ar{{%E9expry zv%;Q{o;I3Y6~1RYPuuj$(;E;;p+R?4cS3hohaZ>okoc177E&Xrq8%?qsZweOOtR1K zhfeUNgXt;Nu(#+y(sym_kU$C}3i}*j5d(aoP#a+!to%Yt_gQW5z}CV#m#iF}xegqz zdI#%z`=0pvUbmlHcp?5N%lZB^u0dbdKhrQDmx}fCf63o9iK##Ti(L~xAOE@!%bUL- z{t>n{k8@Oy^-OW6q5?(WIj>p^D;7F#bFX!*aw`;X3g_pwqe|(o>d37um8!Ly`8TJJEg@a;>e_0L@%;w0uUOO zVIuHUXCOG!^1R^ZafLN;9mSoZp}Z=XQHu#|sdX|**?p5AV4c&X)!0WsB?AJQ@kz+c7x5YOX&KWpk>h*Klw= z&TVbi=B#Y1ziMLKttKWEiu&5MtH{jkt4&TtVMR6I3@eINihb0E9fJ(Pidg{aSk$My z8UeJED390Emr<4u16LOhpX4rdSG%R9ZZ^g}!!7a`_a+z)-MH7+JefUEjH8%Orq!~| z-Z3vbw_9ErO=z&NOJ06%ue`#*06w7u`rGpY8K%4d3H#9L^ltb z)PIp?q6UTWY(Vq?ZiE6S5#eb)(f0G8L&>>L#!6}q<3_;Ut)`tQ)Rj{&%uYm0;&Ym* z?^s+`iVcK-1|<=Q+&#hzex#{mywNA!ysT|L^;MQ6}f!Nis9%d7iWW&N-LV zTvNHI=IPX5Q-4o=6SKld_SK)zC#f4TBc(=TvGal<tl$arpnE@*R6 z-!L5;jDERHWLra#Xc(>BPF)uQghdL4qev*!^FHd|t)j;1hVffvPDPI)-D+!&?bf68 z1l~g@jEV(`GkNx1o36O{4*jP8eM|i{e9lRYL&iHvF?a4=18zER&MmVG z{rLuPN8MKEve(nHr+L}Sy9H``cFWSTcT3iEi`De)mMk62%RYFJ>DJvj zR%`X1X(KQHbD#7js3GXwYcJ8XVlqgA6d%hysmJiqaS2 zsVxm(7SS4 zyZ)DrC)z#g9+>YB_tnoIapKRs7wIP)t&;EXzW%T}20md4ssdpmw11}mNqrhsAJoUf zR!(*X>8nilD%&w_Y>nlxZWk|5G-D-2IaW3SNTqr_igwW+%z<~{>#NU+RnrtC;)POw zLG$i?b+fshBR#-gD5ah-LrbZpIrcz5t+NtYOxgUxMPeuduWzhgZG2ex#}<6iyFr%U zn1Xn-3lW*Hcx1is6Am6>fAo}=goJ?wY5H?UMIpqwOHnvIsv%W*umUG8L z;n+>yEv_A2ZMjzf3@#jB!1ZUBIv*)o)pb*3v$%u1WmAYZiGTPXNbB9DNz4{X1ot9B zQ3?b$WH366QQ$YY8|Si)thB|HUB!3m4u_GUgBJ&%eb)ahvaa$wQnEHr=o7%d0T?i?=!jfj!4 zb(qqU$1*!X849%FAjbVduR3^_R(J4q?W*s$GsjjJ8XqnAR_ph4@ajSE>LbZ3(PNVm z!YAwnMB5>r=~~9U3W!G>Sj$jV3`Ru*%RI{L`0o9kjhfaS>ADhfNsgunl ze`&N#@r%6Vdbuf!>}D8TGk&bNo$JbxTBd&lcw=T`@Xr3N0K2ta&YW($Up*P~u?XuX znXR^i*DA0BEF-r$eFN@#cW-nL*A-U~hwyFFz@}6zW2`xLITB!>>Hu(}S|>qoUME(g zSY?Yd4XmcZoK;R-@H=0$8X5v8c(-%MY{^7;XtF=D>~VpULsP=dv6JFU!?&v|^f($Orq%S@ zsZzD0RetH%)Y#=|k^VHvn=MIPVX#~PTv?S|n^YGdkHf9>kw51x$EiYWurD}62x5-} zNSYi;$MrX?06=`_G|+C5ee^w~CxGVwib?TM6_Ubez#`*D(wYPS2d&3q_9`Qub+p+h zChf+FrSJGUad$n-Hpw^Y*I4A-zwMV#B5%@v?3Z6yj2-sBbj-hl4>-$0R6%dXG=rdc zdA;QxqUlEfjPdchaJ)Z|Js&%M5PA|18a?2tH`gV~>8UrJ?jZD9JcO(DZdP|seONzR zoNbzY!tsmLwp;WP#Zf&U53tdbO$9_#o-bxhZHoY z#=2Ip;K=deV66{3?YPH7CbZhKCS{5#aKYa`qAbR2c^=4D!I9wb8rpY4 zGVg9?{b-SbWc(3Re(1!-^e}2|9Lg|F%FyzLkbQu1F5H z@DC^d{l}7nv7aW>rs6M%oqoXFp%NH~Tsni=V{I>eF3QI{N1Ya(4V%+Pqh;Z z!>_#P!sTMk!F6ae(<%8$OWubFMj3($t(8`X@ja^TUA0QAR0ELWuA&uZSNh9D|PSybdv;h49%q@j# zAXFj)%0PVUgy{eWBWn6Ht>~Bs3Kytj=@1Fq-Q49G203oj1?w=50j3r0tfJbX zErnVx!X*%-SIQ1*84t`%LwQvQ;~Dz()x)u%0kuB>*D65wxQfAo>Zi>VPGS2hQT6gm zBCw{gT{vyq#OViK{PTBWM%#1GVt1@Ai1VKpLpMBF*!E`O#=`1*?icI65yJ{ke_A;1 z;d?svirzj4nrlp_bstdHq21-LJ-%ND9N0X%SP3|1GR^5E_w}(Lkp$5yEqPn^3%FF4@+Ceb@3kb>H}|gdJu%%!|9le zY`BSP67qLwLgA-;ork}pwiodH$*jvg%HN!!S6O1EC0uG;t@rl!&M}vYMe42kFO3cQ zM&o(?1>3MYQprvUMT7{!f+qn*|DfKnUtt6(7c`Sqo-Y?wCdBLK&D!9bf+*ZtX(824Y(BnUS@o0%R@R zK^s3m0(|x;A3LSf3_xp$!Lz*jL~W`*!O%Pyg#sbYU^b#O!%$sdp8^yr2C#eqr2vK+ zs$mi6OAcsJVK7CZ3;6k3ejcVR(8xHwD9i9f-EI&50HCj`usn)td8mc^X4LMvfnp^o z4J7eyg18*9e!L47SH%frH2ZR-_e+6z4g49%iAcbl2Q*eJ<(c-j~ zBb^!}gM&E6H4VegmbuWQRe=v=VS>AA{z}a7Oz^pWrOdD=09?Ck7yaWr678PZ@VqHb zM*lSYTcTGUc<&VLtb@1B)h8c7NzCd(^`nLA)p!q#fHPjhdjJ9sD_C4{_~MUl0t2DB z;a||6H8MiQ&hDs!0r5{KN!-;KFs?N(094e>DU1`v3QL?Q6CJic%VOO526H>eW4w`Vp}I0ZfEuFAC+|vhoEkF7V>C^~t&?+x}kt zav1f*dBeB=Yka=Dz*9_)!{q2IX0Ky9E~jp-}&`}8+d9pGno z37WuHt3BNf>JY8bJyP?Wqn+!Xqs?(|)Hb>Iso%RXs#{Z`(LXYKOJOIZR>W>_$r@z+UbB|}2XP?Jq8O^~+ z1je~)qLMyrxk5P;gY*u_Z4nNa*f}2n+Ati!VkmSFpYh%SvC~QM-a#a-x6kqEj*l$O z<-S$EcAp8Oq}d537NEv@dqP{4*qPXq&=S~P>)fIK0Q>KCcz2dSc%bZ#r%#rk=mEud z?0EtcjvRfn6346usr*rI^${atDVl|oMgF~%$hZJa#vdwmW&^LxqYTjCdteBfD`;Rh zRw<$RTi@8R^_35wX{YeOMVPQtwI#1yU@tlcqTM(W? zIThT#gX}zH9Htblyvh0`W1??LbX;swd{RPMeD;59@0Dc!m4)|zY`&2@(A9jyY;3+p zROH`TZG4P_5#c{~T2^HLe=ys44DIwXp_Jvy)Uro2I4+%Dur%5Z1qps&v{8QIFk=me z=f5)4PW?|t+J83CaF%o^`~i$Lf&K*2?FLj!Wt3WpHTltGOv8f`Ct%ks0w4n`*NGb8 zzaX)4H;5+u1(eUJB4iW1MOC9+CejusEAj*{!UPGffI$>^FV1obc%Pl+d*BWbm{098 zx7Gwn8?e%C8Qp64CYtpEM5cy893B9*#3+HH`(a)=i;?L8o5b`D(WaLd3 zU=K+a!lb>%KVJ$8^I5M}I;TQQ3`-Gp6Zo;&Glh2f@GdjOw}erO8XnmfF`QZ}s_Vy<$YS z$@zz@N8z~!J^ubr_+Ijy5>0pm7J=7klw5uu|afyhn`hBsONK`d?#*lBT zj&s~KRlTBgN`fTOsA~y`El!l?Sp`vs5)9^oTCh*AEYG=tBSmLTWdtFB!}vXDlYdHh zzlxef#J_oNAnq1xZ7@?4gKcQ2jjoRF+2t5OU&!fJyWtC?CX~%dl4UZ1PlK*d6iSK% zY9kMsg|=xjwdSHOOloCCq$5R-x(gmPN*Q}J+7XTGro6x8#XmoA-fy1T@#>p(8y{RY zvw3N@_g!cG{1-FtyrOh*+Xu$g5B>hMA-n`) z#8BSEZWq6p3qcLOTi~(^JpG*<+o-?*+v(cl(jAvr3+D(wsBnq-0?%@ffqBa)^V;%w zth9gKY+`CL8VMx=C6Pp-E~Py2zueD{t7sG!9z2-}prjnaJh?+g=OLRD>V-?5s2)a8 z;Gi;;d`ff^y*Cyv+@Mz9{8|0&_@3Fz8){KY~xO9)-M+4S?D7b|T&c zF~^(mA+qMhOdxYSBFM7N2gGL%cOvp~0NCrzidk45+Lc2PEf7XkDr|$vDUKSaREpU^ zd1L#haKFs#IfYOln$cerj3DOx5PFVWsZfU0(;-Ymuf&Va<3zkq}Hi{6~dC zylY|OVge%O2xU~7AXJI2``Dm0y->`qG?ag)URU_KaMO8ne|6=IId{(P^WebIKfU#~ z6U2ni3)2l$ueW`?YtGL+{%-RppL*|6_eU=6c4S!BXK%h}xA=A?*ufGF^+FNR&6#*X zs3mr-|BB!hp*#GK`X36diap_98`~0lEkuPi?Xe)rY*2_7DskoY0s3(Lt>8}W%aGd+ zD4sytaKYUU1tK<>mB;L9>}NOg78Wl?;IW&+C*I9Ny>Pc!IphYSfGe`TmoYduS2*MO zeGc~uXmPJ{uf=$WcFeUL9n;j?!x8q;i{(P7*n_R3aJdjxw^${laFvk4RYJ7pvPuXa z7%qFUWG@=>MzAZp2or2&1U5RBhZg4W5+RO+&8DetvJR-ryrFAl4Nxo91IenNUmbW? zFOy|J@O-8MC!ByZb^$LH7X6)5CyI$0#hK3%XK7|tuv>VDJ-|00I3zq=jMPQ~H#yQC z?mIeoeE3Y`9M{Fcx#2~@rQzQOH-}5yX+ln5v#FspK0Bt?y8TtU6{u3+X~Sm0Y%K5| zR(o;qpw5E_b&fByQBRwa3EHVl(8gtgb}b07i$piPcy2zW>3#G*J1}jFo;fB{*}pev zg{QSCI3M6X0+o2=g;jWVmI9Cv93UAv;rWCLjd;rfYN9HABAxapcpOAc)<<1N6ygq~ zI+>w31?23(*Q1UOkzjc)gntoq5~<9I@^E=>s(4?#U#KWlY*t5jR$W&3R2|l~(Z&e% zQuRG`Uz?}R){Yc|ceYJv`xr~V6hdSelt({2 z%7eXvk+qF5kSUO}w3Pxjc#TDr?&S*Elc~~17RDla-K9eINa9so6~|ygm+xe4G61UQ z=nH(mG#*5FW}A)@S>x{(N@TTfjG$qpw1ib_4YDTT2VKXbB%IET*KGw6LU6l*YJdp; z-Wf}4>dKqwdWp0RCTr1=(p=<7KwY?@F5G9pdqr45$51d`GlB0nJ&zc;zTT3!+#dYxD87Sz+U@Oj&~-K+HAzSyu8d>y+>QW*rwFP_;=n4cR(2a7@IrlQ7)n*A&)ySBq6jP)epMo9NTbWMAwA+&5GDOSjP{M?ntT5~; z_=+;7!HX^Ayb;0qxy*XkE&lnl3fnr(b?miK$Oh?a(O&rL@5D8C{Z6g=omP7ABRwo0 z+&`S`(^arcFs%@tF%&GWVWn!H@bzT&gr`E|wm@ptBIDf0UGA&lxTUs7I1Gxz0QpE78l>PcUX8`^A%6is&E}9DkV*-!-V*}5|;h3(AhrpDe*d|V@u7n z|De64eXD+F8RsU>O-@fONIht7GR$eo8QQt#dF~m3^I~R`HqDskZVF6`8H0lZ!VQ?5 zJ2E&tJiKINVuCi&nB<=9#jIWLHQs>Nqxhp~kL^$Eu29GqufmoGwgd9p<)?53E~!%t zwmzA%2|5bBUDE;G0NN&qGJDO{X9uw8{7a-QK%Pv;|+&ig)VnqS(M` zIi#fzH5u7WilV3|Xq}{;R2;5KDTvt-o=i;5fYB`XuwKSje(~W4B2Z|1^|=d0<&}5+ zYSH3{*JJNrEqaNH!XNj2TX^Z`1>JC7eCN4mUwY>Kr%7&1z}`oFD*B~<;fz9`yX-(~ zaBjGDe9l~y`(^e)?IT<+rBBHcj0K{!kSEnV)4gu_0}lUEW| zJ_ZW-IPHxH&q3xL2)WNe&{TEIX(on6Nb&ka2b8MMjw(?__lFQ8L7P<>i+WjPU}w@J zDHGuOq46_1F*6gP<;bwI%`~EDvQOn9i>50JvB^>Kd}yE7L(O9DFLt-Ay6P}E!AjYb zg8GkQTPx*#wQb#7T3-C(%B|O4HvIkjj~?G+NZs`F$6WsYTVk@Pny064sr>%IpRMbc z|DOv-EnVxs&wJ7l0|%$-5B}yWlnjEi?7>1uMwEX#gO9;{^l{oruG>SmgfX+eNuT06 zO+VLlp+3*Gh3mQ7V|GhyZA^vjX`}h-EXZoHrX$#&l}HMFW7&zzSF*S+b%nRLEt&xV57k{ z4T0Vq7C}91#pQu(Y2v|BP&4ClS#I(hZJ$(a=&6nDx9)~L{#`3Q1L7N}mY#LzJsLv3 z2o|#s>V`>Sdi*Xo{uT_!+f8Mehw%)=S0bDYjjj!tSu=+u{p~)FO==HV5l;@Clt#k) z`Upu!{Hsf_LkavA=Z83uCEZBQTacb(m=`NN`WfJu0%Rm2IE;VNm4x2I|Gl3TRif9n z!lmN&mkZAow!SEC1A|-D6VR1CuAb3$hx#G7duibuV=%az7U2!8k)4_L3y@_;Sa;%Q ze`>w@g=>3(w|j58{VbREz`@C`8Moc0dfWDI|HG}W!a^}$KW4?fDCiQ(#P&}NSQ$!{ z81IZ!s%ta3>cN>28K?RrV`{j$?4<1J#?0{fWv6B@PFz}cQTEcRs}oDB)>QAQE>WtH zR4_v$(&mU9n$XyGPALKN)37p2i2rd+n}ScT#N$cCOti`jiBYu)VJ!0X!${77*&a`2 z)Jd`-0jv&psX+THPU_=Yb`1vcDI2ql=II8RoJ;mjs!+H}G6+z7@8p`~o}?)+9JDSo zl6`hyOgXKEha@#<&8g%+PqMkvpasVD0jG@KLnVANJhF9D$+Eh#u~MzI{AR_1)0~$4y8LWs#)6wy-}TPJADlYlgLSXKgx>Jsnm10r?sCykcyZqH(_UZu zp%_{C7;W#rEqwmvm!jf;u#l1d3rrE!Ks}%;W1BbJtaOR<9v0nH{#Be;#xd#lIgY8^ zfHGn9EOG*>XrcBpDFuC{5bNy>z&1nobXY?aQ!RF-=o0BI+k+^%&XL~EGHJBYpx=_O zMv+_jYS(kr)JB8Fju)Vx;+@Iy+G=c6#Dm37yeF=T&)3-AAH{~Wno641zBK5um7QMuc zz|xXav_ZVVe+q=mH-XsCf0OT!TmeCl5+>+}nfPiw+iByFfMC%<4^VTko%vGky?Rd1 zVuCm}Csos6JJN_SQSrJ$cVZTMOvcy}B^yw8BR(JzjXD{NDW9 zMK?TgO4}sEhqb&LdC>7xRjeY@&$0ajvZ`2^+5=QaYIan-t6>g)j}Rv01~esB1}Q^dGId%9un%bYW{C1#Mdo)zOW1Rfg($mN zC8GEb<&fcixky|s&nXcJ(TTg%@(R_ZO>Wy^AAC-nGWm)5g;e3b!fN|gG3d=*qTj&Z zom6<{jjz4hsMX&VJ`_LeQz*q)yW?IE$G`T$i+x4ELg8IHG2E#Iy--b5oze9V@e}{w z^Fio6r=7~#*`7Fys^V+^*y@JUl!7uyJU+~dZ4`bd6rB+knd)lWmr1E+UJP0 zn?bf>`qcV!r4(al9bL*Xb`%#4aYC`;slqdjZruMqIcScLqlptD!6b5GtQB$n zfm1o=c(t)B(!$Z9RMEQSWY>Mpxn5sFG!1I4^KWPVp@gD&4d;dh6yKy<`9)D_j7%jwoQN)?2MDDR`MD8xnR-j$zE z**b99xpx=7-C8Ii9X0Hfg*%@sTrTDhN=(_Ro!gD-KO|BLCc5;&i~h*eXec6&+SdtcxlW6xA~TgMoqE(@6$>A^<4K z0^d%b?lx7`mC6xa-J!u4*aFP$fwQzte=8E7tGaO~+eT5gWPx8?RK zIL>Acgq&|$!IF$2Nr0SDtO)Mu z%LI{883&CBHz8L!DJ6t{rui*d%GJXr-@dz1kU!jnlQ(WH_Q(PPh!V^V(0>9fGbm!cf zyU&hN0eymsdGaDaYk}NSjBKqcB~snOuOryb4P1>(2)aU+AA!cKxlAX~xB z)HT%DA*+Le2>yH^_Bg%h0BEptu*m|N7?Ra?Xlg)PMh`2sHQMjBcFoX6l|;_4Z7YL) zx6cVun9wbMC5xzhEI9OnAgmIy-60q+IHma%$)w#dS!6uCc#S3#Lx&EnmoY80=YVb^ zU?Ox>IFv7k0q-hD$=qdEtv=YW`hv&Q%>{Av4E0_*Lv3whLg8Vc8*Hsdw^2{DUGf*~ zgu@WJkku~O5>t#Plwsn2=f3L`SCw8{eMPNa-zWl&^^H#BCDE3~#nAg=i|Jv^x7Nsp|&IDT=rIX%pp@#d858N+g33Yq2Po?$}n5!@kf z4XywcsQGBo_vA!NZf8!-LD=#7Q1}tO1b5Ark4ocSfcRmCuvZ2J{YejYdc7E8y)_ zixTIg(aC2u)yxj|56_%Yeo^MWtm#UQ%AB0}nWk?MPnWzDe<7jQT3Or4Hf5)0Te1tX zMz+iw|FAJJCNV8BKcSql~t*9D2&Fhso+4MS6l-{C=D@hR_X(h z+k$bk5MP9^MJ}bG7&ihGYJhYYkn}QRHDL&U>UV($y)rj?Q*6Vnw?F>mJyxa+x2Xv4EA*D<08hp zC|;>K31@XFquYx@+r=hwUUVaM#ndUTYg`6>tjE2f{^+02l~;5Ki!oY3Vpvq(y;k!+ zv-aTE&|e2G(U$_Czv#fFMQhW@u@!k#(TbeYVMPL0Nmk^cZd}x-nXOaE;d0@2j=nZ| zRZ8`^%3M8M^_3SVmb$LbxQ0ZA#0HgVCc1COBIpeg!Kf|E#*!camBcu%WHOyiQ48=$ zEEtcIHd~j?mIvu5l)LAlYgQ^%Zl%&mt<==xv51yqsaV>xQsi>T9e>987!Z=nAS9PT zNNEV-J69i5S>@FW%(aCPI`}ggd4Oxe}6Y5C?Y1p`zd^T$J!}3pN93(vL zFnLFOrbE&1f01=}Z@v1waS&&dT1-z-oE?AWaW`BedVTfH8B5N?qO@Ip*0YCX*5*^o zYIcy!x^G?^HQ80dkV`9Z8p6t#k0&i3VjCO0Gdu>_lf*b5`ZZXnX+-l>J|h?%L6!l6 zMPx5aKxG$0;xi}7JKrLkP~}amHZMSy+{^)vzKb~w0!S+QD`51pX_g;{x_ zpmB)f_90kF#|3F0M);`|e; zeqdp=Zv*`*cNB(|AI59Dno;C)s1$@JpcEqtom}Mb5P2zem{!Kt)+&ABGi^FHlq>`x zP8?PVf@_|=#j!aAX>fg59R&6o`<38CP}$(b&s4=7syJH}zY;fTsv1;95YiGK7Fkx_ zJ(-{q4XRpD!LxLiV`gf`(9zrl*cLTtpoqq9_8f0fK2TASav9+SEjRGL2FgXK4a-gF zx-6z*n@>gm>ToCt-Bb@?3*e&!Ddl3Y1a=CKN09xS7~w*_azLQ3gQU0?j7pP=pi$m2 z11RCq;CU8^uzQ|vd;6@b=8gL4=!wUjb)>QR;N{vC2d;bLs>=I&PPqsA83)bSYHY)l z&IICBE@xz}Tm;L`FW*^iUYQ56?@wy^(p@OmDB4<(-eFYd6`+jMAuy z7BmpKNuc>ax;hXhu^xyLj}Ri-=fp^32Lg>~d=ijNj=l^SfsNvsb)FK6B})GU#6BlQ zzhtsKkBSph4Vu##gtgN&&|~@;RC7fw0-%MWb(6)~LdTbc7*GuOTXAx0j*o1gQ2pJ8Ni?U6i?Iqz%6$6u#s;Enxfm#pv zc6n%hfC1FC>qSBwQ`lB`e|_O#;eO=$pLp`k*9zDCcISH=4bPKL1`03l+EI8R_|#J# z(QWTHqWX?D#r?vXM_=?<+a6o<0&+$_sv91V!cPTmR43bmjW%Bm0wf^lkn zCMJvpEN^DHf0chN=H~eS&-wEOA8YXE)ec7ObJD~p4{J}w(}d9jfQvvP(%?JEvi|t& z0baxaFJgcfF~CYYz>63_#XXh}NDMqOlAi^2fKF>5AjWVfIt?QF-|?Rp68!!rzdsP4 zI2rn5nn^(vM-yK{;b}Q-7O%mVnyDQMJ+>XWSd6Pz z?~is_4k;KYIwdP^(NCj9dCAFCpm?^V#N&l66mM4a`6e0QVRm|=yq9@48Sh`7`Qh>K;?RC}lP~7kt)R3J@F$XS^aYE% z6S3Ffp2}cjLXSqO0~TWHQ5_FKI_+U2){z5Q2$@)(3!~nl90X;oWROu^fO)}_|N4F5 z^|n_FN8#$U4fme9YBL2H+in1!b>kkxci@-v7ESqiCGa20gW%3g>{yQyRT84V6DIy3 z2Mf%Xok;)=LJC>-Q~>cVdvPHC)S+iSaB5gZYqZ);rl6eP7IV7^1?@mrFF@N?9hj#? z4yBjxvLpcUM`=x$a7UmL&RF5@r|hbLfU!-|vV?8&5?19Ul)@~@p)sLT+Elur)F>5p z&cik(m@Rb@6Ql=0$Xpc&X@nEO!CudyU@voCE&`ST(SeSbHywMKm6A!ugdPr6`>X(h zy*eKJF7H4kXdoyc^N9;dGUTWgA%?hjE(7_R4{in6VbWWl6rO8)Wh>U`*s1qHhwUSIti+V(oRU0NA{MhzrvXtMtaf3-H>+zY zHKDG*<~lMETbxSTsxE{Ei{Mfxz97Clz9z26g*Rt2pP+?1b+?>7NP3yqk)NWC3gVy4 zC%d_%!z=vZ4uwT3H)yFIG4kPRzZ;Q~h>nMVLdlh_n^U7&=JtecK7d(6R!|lp_x1Bd>UKQEn#{+RN)p!*h>+6jzin0aaBj8`$ ziqBU=%s~GCz4f%>zNu+$;1dE)0lC)pk6o(~xeBAE=}Bjx8FR{FC(Gr!L5e9E8O@2;Mhjo?T<}1lO>Li9;G=HCZroj~0!6 zR*hvn?tbT#(J|Iondh|m2#jmm+XD0Gc<;d1m3xN?`gO5SVN3lz=#HDBwpm7d93hM;tnNDy66oE9E%_6QJ;@!LbuTv}TqtE%n~5 zqBJI2L{MbK+`^K=JB59PJF^AYIxB^;{q@5B*WWsTlXkusgevRv3ilU&i7{c*#K5+z z)He#B6KNlaC5_sHh;!^<&w%{knvtI2`4Kgf{gXrEV^gv}$xp5E z4oe7kuG(E0SNe%%M!HnVVd`deI$|p~irdSox^qQTciyQ``o&U6nxTp8KZ7;c6kz)* zfOIiq0%Qd%p6E>cqdO3Zpn#y(eYt=Z=+m9#($SQo>n^%4=q@U&;#?0E=X$6(qdenW z4;AO$K5;ZpGsnl-5{Wb5FWwke<9%cig5(Bz@K93vke!U+F7F=%Pxf*om!?(0U853& zxF0|%#M!Bw6Tt^nRw8~9tgEaHBPS(Gw|A=1rxPtfwM{(yHK4EbLGQ4bTcN#F;N>0urTzI@hth{Z-%*Mu1r+J=zqEOzt<-!TaT(W%I?%OWVjym_ExAp3N zOQxMLyE?h_lv{69&q|E!H}0r5?YN2kCIbCRE2RDdD`Y6AJGO?k0QAzOQ}M;VRz_Qs zw_5CNL?)fWEW^`#*|w#V>%i;78O9dIV<&{-ShI^ui?&b{)9Xl>E>TY_`~($nD-O=0 zv#S(d)z8Cw@G2p3gcI=5yFgmfQ->1d8}SN=tFeG#(+JlR)d)g{b3q_(Nw2;PAIJ&3 z*s<_7f=PLfJ>h&I{Kmj4z(oVShKafBbjbjIJLZGK`7dS6g6C5DrYpEu< zB1q%@CAdpa6LzqqpN2c%I0y`&UO;OsrcrmmziQX4F_c=}fgsT6h*c+{@wC^WwDwA+ zwZkm}Zb5m~aBwJ_UIdmr)K-+X14RRnvyx%Y6z+0|llwQFiMg0yN##ME6E-hA-M zo2UKmhUj(b5vY(pztAXp7G4!kqcHhE+kx-YHb_&R0MF8N1f;2GKLF`J9V;?OY;*?K z7y=(T9|@=PL2mIreMrlYHA6hgknE7&L&gl5KV-p>9YekxV)ZXMqWr3oYs+sgxue`1 z(61jY5G@>te>%rgDSE%UZZ*+v-D=R~$WPZsoj-`F#zCa^^06p#0?}M~dA_1DT2WD{ z83X$1mI(T5y6JW}9~PClcvLT|Xb>Aw#nf023F~u6`l48{=Bb^!63fF*Qh7~==+!KZ$-PpI!%%l2@h{oz_j~Q{% ztZmz#K4Q|ajYB6L@$|OmS}tmGoRVZ|KVNO~?D0nrJnGnqz<>`pYUQonyR8thlAoU4 zRG!^b*dRupeqB+Gsz&FW=GWXJ zSUbLKf%_`&6=jB%6h~NLMU*a6QcbDpsTPc;Hn!8ml8j<63wY*pM^{G(F=Dy0ilj)w z8sT$gMkMTTuv`ek^P;^h^=JW zTyVij$DexQFNZzSB>F!5^yN)W+n*?`81hj3`YBW9o-kpyTkO1E1e=DAoVYG6>NYRD z;>5bEr!0G199?y0%UMlFPK^`)7Z>%jTa0x=NiAxr6V$WRd6-XiJ?9P)8|C7j5_*Ir z{mdEc#<6wb8iEhm)4F2zlv1Upg(~5^?GPJnwxEFV!td!}I#}=uc9U5RilwT~u>qa+ zyl#>P$4~6#8VV2xB@R$$9H1`Rf&3cHx}ArW14yQ}*b4wHqpB>!R`Zaga(EySvL4IL zRoe2J{Q_1^xGvUX5r!(~-tOLsp6{cPWbHViu*MIE`eAK$%hc*R^nF&b{DV`VOr|E| z?8@3&nS(`Iysl10$l(bWbF7P7#n)R~3%;$8zi(*W54^4A557Yl9rK^2bE`A394_T8 zWgp}(BlQmDSc}7pD95@8>$MzmxlA1Cj5^Y2G#g#V7{|nKj+;KSUhjcnll9pX%u~!u zUDvv9F+HR7QRW@`9p)qYBjywO6Xr|$OQt8AZOqQo=b6j&Wf-^|G6N{6B}}m3QK@ipzvgt#r0v$aEGX5u3>u|E77D6s0UfNq&;>+)cS5 zMyH_YnHqgla#m2(ym>Z7%?>4I|CMxH)H>nVqX!%{VOmw+;~)XM9dq2zTAtgs1riW8 z3kkZ*o6?61y3-m9F*;9)_V4vdtWQ`BcS_Qh0ZT^f=k=#i^p=nEk-#DPqcmq!#25Kc z75A%(ln`ITc_K?oWlIY`|9LCfrywLM5JWK(r0TS;@jVdqY&Dfb+8j(dswW^sphvvr62Uh#<5DxT2RThEG@v~5-x zEp^;c;4e$8lzWA^O}$-PVcq4n1ua($-5lMv2YcR)u2R%rn1m;>nC^l2Mg|T$$2r54^5)q{yJBuCG%_WkQDGUXybgimxELt3*21>C3x8b;srVahES7QN!H2X3 z2N%#uBG2(dtf7sm-^uNi=~H1iV@|ur<lhH2A<6q8&cwXs)C#A&9wek56qu?>yO-8GS8SBz1T~Y(g;W;`Dk7 zhmnddkw(5F|1_OS5a?$`RhIZLMFF-4Ue*uWTKq`aa2Wt+xVnV*IfK6hTBH?PgoMy= zvH8H;;;)5nq(u&|_m{l;6L{ysG=-oJ8DwgZKW=6jw&MYL>;;3T1v3tJ5oRX&gSPiL zC8C-bM|XKofY>kd_h|Ww4<``w$0Ku4h#jIGzQkzOtgN2hd)#W)-O+}}aGU>*iT}#4 z?A(Pim;yd_#*F@zMz9VkZjvfLVkfpLX=rvmB@kkXHoUb^0Va~%I5>;6FlwdC+50(( zaSu(fN_X=$0?}B$YV5_UiJ!{t7)XSk_l|oSdJLgaEBni?C&Waw-cZHF$MrmKHa?%U z*?992#7OQ!7O41%FF1AyLb4ac0jHWytieGH1$|tajJ3uVAeli-H&)>SW}Nwqeu@bJ3A!|Yvazo7lWa}v2r2e1@~%8V+UV;+yldKtRg4nY0Q zj7ebuRgaQz!1o)n4O6tKzVYFc(vx$OD<)Tu?=hj*`2Oc==laeFpPoK9cYekB)o0h9 z+2f2}XZD|~U2M+vT^znReWkh7cXhZj(_1Jt{raViQdfDuo@qO32mN3n1fxGBCMf7yV;wY@gobZBd^~gkrfIvAPBeK>;=u{jK3w#Uor@%Qiha z?hx=q(&|^OgBG3m)O%k%He}AY)`3@^@WB2Le&2LOzjargcK#j9TIS4cJLT4vi+*yM?u zHG(f#5fC!y0pg1dBn?b=9da+y$s$6E6IU($8Zhtp9o$9O96#zJb27Nx6w{Fr+k(>m z(LS_PpqDC63g&hnvMm&M_rr5v@%n@KkM<$KC_3y6LQ!0BkdzgclD`p!)uYKHU1Te# zO|NMc|7`u)%?GzpghabhMoH-G9}6y`L6;IyUUtH1%M!l82mnWf>Gin1d1TUxMwBN< zr`^LLV%*)&JDCz~4x(1bbRq$PM@B+;&_aSfE>QZ!?BYBSHotK9pi{+hwi1E`DO}*D zBv_-QiOpGM43u&$^^fTMOr81DL*R%afETlT08g(D<&B_Prf6ZatkbaSM|M6#BWSZS zTH@H&?8TGMyr;GG{^fHw9i>;lc*R8%2a3Nz(LCCJ-s3aDjq4E?dXM+eWlo-IQ))+g`aS5%kw;MYRJqV0(Z;0L&V}W5Bc%jGT7VWSA5Orn?fSX%k*^tlRDH~FN zlQG3>MjJqm%RwJ+tf#>NW<`tvGx5K)20Dt4usyq^``a)nr?Vc3!+ae%|HIH1*SCt> zTg4sg_LCVki!_?{3+^m-ec@Ge9M&ozE^~TeEI|$f2&Myqu`0AB^koQbma$5}U?BAF z^ZV<(fbjsQ$=ehl%`d5wHLf}J?Dd9vhno0TVS4>nOS&7=H1PXwfK$-x=l}9DeuX1~ zKc4-+wrKp>v4~$6L)qM{KX7Q3f+SWtR_V|hbzPy|&8#3gBn(CJSjco;E0#1J>vhSB z{jkxbu;~;yIN9)B(8v<8@R)+F6A5A*j7Ww>QWvp0)PZ|pa`@^zo=_EwV6rSg$eMf* zGAjy#%Jo@He@-I~K*e{&1^oOiP6=tnH~=_#j5mS&@u2H7qXa0N&4euVhwwtK57HaN zmUYP!`qOvEWBd9qM?7slq3L-$3?A zr@(%j&nrKHWI92umV4BIM@(nr&=!x5QdW$5Kph_JVwUwVia(HP0^$Z+%W&twFFXPJ z1&jfK=0e07!JV}Q%Nj8{X#~iRLoS;B8pMltk=!pLpQiuxwI{4kt z!EOE0*4Bfe)?GWkdhxx&k*!ZXa^rcM!0rRcClyXz{mZMLx_R8>W6y&wx(XWdbMV`P zo}jQSvX)vGiJ`WwCcxST6#1mVb2D0qBlwfBu7n1d{>?2C)mtQ$+rL#LugK#LBL0guPbR z{*Lws{YaoYey$^!v_)|gW$-TY-0CZjVLgvLXoO4|J-NI>kCLLkniOSt~lVc=))czax38Q&h?8Q%j;PFyLY6G?6!3mb|4 zz#X|{ASA>C1WX11=kUHUHJ_pjNyc z<|Wun2e2di&fOX0b7X~eVmKhtWVo>(`3H!sQcE4R24!x7S^^e*fu*f)Cw4z|_vX3# z-*|pc;O$oJi;L!daZX zmvHvNnC6~ysxjHf>hC?qJH;C3ea-8dYl|w&t9mewg(Z}nszQF21NL|JCsJKB?5z}2L`GqeT z&?PfBfdFE{mrVN56DJmmr_iahG^O~wCBZ0$pw}V6!eWl<4#D*b)E3Ib7d2co%H<;T z(_UJ4_O#~7ckb9adD87Gp4lV@qujoE>2IDVi6`#rbM+@8b7d&jdeJqHt~mYZX_IkY zIcG}!j1=Tdsh5wk1AbPegHAjZ9BNsEDm+gU+Q@6_p|0@F)PJ6gKXePkoEarA2BFIX zx_ag90rqg)7#Kb_a%uM3ERID%L~RdR`k!+H_o1Y+HcqCPhWDy6_*q~JAUNG zzqjSTSRA>{-}o!_uL~Dm^IF>zzjW7#9N(3*8Fk z>gR5begy8I3Sgh{tgwR)JB`S#V`=>iAVTC<_4i5jmoa*bt?sbJFy*f}q?4zhcc~1m zqey;7X((}>S_465MdAo=m}&#T&r0Ghq$A<*Ei5bz{bJ#+Zfn#3_}vHJnL^$1_`8WU zJ^nK1wvc-6&8t@nE57CpA5NCgMD0^6(r-O>1M#>K(YD7p+BSisZ{WEY%Kdvz;A=P5 zUorcf_1F|yGzTf-~ zvNEYuKvrgBddv(~X`-&8!fn?jfkARd>cU}ExO-5K3nvF29_?{Ahe_$0wHgS@i?F-; z78@D3vjb2Hlai5By9l53Y-#B?GljWF4ZfNxRS%BTS~gzK=uvCf?aOlOH57fcO6N>fI!D)nRj{_fY$eo#2F;H#N+cG;}s zY8z{{DNj9m_d^j6Tx zBL|O~us~fYX0(R%V`!|&F+()g-0Q^1{E2Y)r9h-U zqDCU#coi&Y2@C=u8Q#^nMyCw2GNnzeqD?u5+!6n6a*IIwZ4_fuG@M@A%eJ|fgHX6j zD73@-{Y!HJPZdQRh9P@%-tFF<_?^+vYn|o-8Iy;)(bB1s-0#}<2Q;6t4%-o|myLYL zoaB&UrFQk--~Z|l?}F)Pwvyxj)avCkH@~i)cmFRIwo*C(j7MtV;8|nF9d!n28Q2G; zWl|#Jgf(x}o3{p7!!6^|@HJso=Z3p|p;=O|8KtGLr6OsME0FN$IlwG}`7%~2Wvo)Fp>2 z5{&&InMVEkD{H!_k5*P2i-a-gklvW4-Ypddvp z>PE`@qtT_z`&Xpx$o~j|j?-Q8{!0q4$ZQz${(g)sRsF6y_>CTgAZ&;=;(UOR7+Me# z8wp|$YBC^TrlHbgJ|N5(t5pp30!#6glyB6L6nG8#Sxx{UO9`oBa{>r=0eyn#0`U!t zE)d^2C=tUg4xrn-$~LdEE!t7aCUa@AALr6IcPVqvIFE9ziI8iJIpTO(S{v1=Q^jC&@(R8w3Lj-X>tPpf!Q#c0f32+Z?DPH9?fzaIe4+MNE!rrFU8;t z$uHcIC3PU$I1CP=odpUA2@y93Bb`;0%AE*sj#=*}n}^?bWk_vb-L?Tm6XKS(r%-RT z8SfZ6Q}Y^6;vL`WR3chXN1b(*eDN)_m4G%d^p>OimSxu^TvE)7O@ti4iS!Zjcr$X5 z=v~RR0SW}48Fi;v8%yK0#v`+Sf$P?9|o~d4>Uac;38G|t9(lj^A zEIfMYqi8wX9d+|(IQ~pR(-ewt{fZUP!Y7p6m)WlCDp8ySy}<&Wc2|B&%fnpmJVNsZcVj#AA3U z3uLpR+{OcAli&<-jU*x!R1S?jMJag!XGlieDykbgyi!O&nw7Zf8TI8&Tifc_>wkX! z-d{iS;(a%~zGmj=k+UxvKI*5xQXguYh|Uqq^%iuFn0a7@7JBTJH#cm0^O@HcExGdQ z>wbPk+vVu{+sX^Tj`->^dmaEj3tJVqhP+$JtFWU`NCI|&AOXe%HR@wR zhVJpyK?mjlj4f6&?rPe5?xRdNNuS_Q@tVVMqu=ht&miwWTb~AG;;}?J zcq2W+(h;ICRy@@HC&VJlls=nq=hY3Ce{8EfhRF{-gC-7L;t&{BCmu}_b@q8jX;I&S=syEOFnZj80 zy5hU(j_HQOm8p+s0vH(ms$=Kl#Wyynj^3H0^uc@UrM~+3fC1=E^XmV@-gkhvRi68w zrM>sEEXk5A*|II!l2>fU$8lmicJ?G8CJ;gh2_z&CD1=SJDA0r!D60uAv}IGAI137< zBV{zDEfhMSPztxK5K1AfAy)ps_dD_mNontGpZh%j=MpR(Nk>QLd*Ana_t+u56=;s& zVEg3cTWC}BLVtj6IDq@i4-5@h^VA87YsDdEBMjhapgMEZ{f=}2Q&z+J!mzc$6vs-* z-#hXNy&8VGURez-lQ+8KK4r-nUQ?FBVYE7v|9Pl36T?{*{3XiguDE|392^P1a*uF~(pMaA@iJT8k>GJ+jPg=2`Y?pMWips`YShA&T6;8z%8o+;2!fvgHh0ah*n z4OK823UKAzB;}W7owGnfMUUf`V?ah2J1dz)E4HKWh%9gHCnBCNyfw{ucpURi<lX zj&;-HI0bU(@;?!Zk5pnMmVQiOK*k#UE+gXjdj4zqpR8O7zJ5K{S$t#}G>=HXxLhr4 z1B8FPOQlk8fK5){v0?>W>!AU1gcj(8FWSO??W_4Y_pV%dFJuGHOI!K-R2{%}m~qG* zRyaG*tKfxQAxukt#3&lm>wqCP*J=Dp`T5Fr$BxdZIskoTk3Xoxc$g};}Bsa0gOaJ8mR}IkKttzXT%HXfui&wRAL`0 zpaTje;pTJfjd<8tvOMbL@{wD0mhy&CZ166HGZATJNB9&@K68YWW0{p>jtOG?2mF1) zEud=u(lo*UNlHs#qFw2KmZ&DfN?-`=8Y19FMRRnCdy^HsJMP6cr%Nyaf=j@Y z0if|$L9f9i8_q8qxn^F~EQuOU(=4UgERXa7MTgD0MA(>n_V3>>F518U@b}=q=eaYW z&~^ioF76%qLZ7zO*uYN^nzT*2Mq`t!i=Qq`)lSzOj7*7{3)t=+LUU!A_ zGS~Nvzu{hX`L#lsBk5`pT3wgxHoLxS{GCfjU6MILrw1r8@IcRF8$k-9IqId zi9}CwM$phf^mL@ZLh2_HJ~ig%W*WTST$oWRc+q$au93Hu24ty4N?Lp*itG>+pV;d$ zYpSlUzCH_mTqAYApI?2FEwwLI-1oQl_<0kn&AxqJ>(UKEOZJZZjhLgzE#{Zx<7KCx z_v_!^(BDaPgZbQ2nN$rg(s^=)%Idbxvz}^w!>Zz>L6q_in()6#KWNdY!Z_PW+8^&H z-4SuwLis6=K|AzX_}LD8ZX!QUzX>;OlJ*GCap+J5?u*Gmii!>q4t|^^gcfq{;_yD# zM&K(brDBb`Y*=!Mm)&<*Cv2Yd(5|*?tXJR47xVmGciqLWy6NT<%v;@mKTP-S1L3@l z`}T3q$O}ZT-5d3$0}c9|w@1H7ze>MRze&ACb)Uh6x!8Mo0h8VZ6@nI8Jw|EkRgzxI z8{fvpz|3sPjd}zGv67tPHG}K~G3@KqmVdIl|DkKX_t=w?J#;8P^dmvP?dIu4`9BZcFDw8I?*O5l z#CUZ54nZ#>g$YcRqiOX@iU=K$okT7H+5=*N+d}Ib!dwPsvBRu6=|@uhv)|)7Jhv27 z`v#62+$?l6afMxAG2Gj>K|7+)oQE&5Ee;;m0cspvcIImc+j*?>C+G#H4C_I? z6j=(S-hjH8YoM2fLOpI58cF36V7K)^knqNB59#~^PR-T%kA*A6t&e;?IPaqsUw?Sj zE8W%KS;yoH)+jXsV>a#_*?Fqv9IMc7nTz^PyI4B^*@;@u*^adOHk$xD!UwA`cEH zo++IT@sWaXCQb|UI9P)z<{rzYJq?r+iIH}#2YP#HCsW1}^8nP<*5(wx20=KY319!@ zL#x+sN?yHmX7icfyMD{e*B-h3Pm87a&~M+nW!3##u6}3Lvc6Ydoc8m#zkBQ3zaTmk zhUu_j2ik1@BRXVtECo6wSVQo)vREJ4*F=azzehM4*G%SDidV3mdQyK%-=r7By+=Oe zB*4j`F=L~uIpd&!BWyvoQ$LbD6z?bR4Ibgf!(*6;UPasw$zAv{l+{vXvB2=EGYu$S zV0%xp;pY`ZCvU%uFX!D)F4}$JnKwxR_n-0y52wU$KlHUpPTbY3BOiiQ)N>wgom|_k z>eek$EzvEqEpn>MRTa7>RTHWgwt=&4LuThT2&Qco4UcdEXKbaZ*wZUD+r=Oh5s!7NvE#6eQy7K%X|GB zmhgH$b@`zudd&|O_ujwud%r4vusHwh!8<>^1$W|!smhKH(gc`Q9gV$xoc?|}qBh2_Rxmj?4d`_H+1I2%f17&zL{|VWFAs6n-Oc4dsBjobVRo8p1fPLBz$l z2E!D(6Dhnx9A+L;SUMLGOO*gM;c9t=3g0)wvc+ zi&bZ+R@rr&mAU$Rj7EzGVm^#vNYMRU9(0lb9z0<$=k$7kUzh0R9fOF}qJRD%S_^yi zuo^rrRQ&VaVp>uwB8P(4YoSJE1sG6vAj`N>I43OTr{UCOi-JO!@@3OrXn>>*Qpy?i zEh&@&jVK5#Q^U*nJvJ4Qt3%9s3fV9uiWNwxMJh=C_@2jRq@ON2;wng zW!jQy19V!*7Xz{}tq6D+BoZ_SDPX9ckN%_p zmyHcGX794D2x;4sw&!i4jerMv&s^iAPeaWb*~$c%$Otq@n;;Kjws~Ng0w~nv3x*vx z)=j;bxBc;|-`sTe8+ZLNfAE*LUVGE#+poQGi(t<4bsI2a=$n7Pm9IYh_%GjhXyBzk z(~j~T*(&x!m$7j-%Au=myq2pqUBF!+ZZK{zUCU{ZLnJmyXGjwE2RV$eidQO7s$e&(C^FVH`w*E;6klmAivcY*Dfi}xJ< zM*C+^@Mq=!{M@I2;_NI3SLkjFO{_s)_Tt16KclR6M0ZFtnOs;l=~7rHM_qP?^O9IyziSi_ z7e4fZcld_m#%t*cu0jR*er!*9=<186uWOuyo5l2Duf0KHR>sNXxPMkSD91YMntL;`GwL-VTHIt`jT*-^o}?vqLYFX@!Yhf&d?=v zN+%!?V&$bXIinRFYK;PC)@jkro=im|bw90>kI}U@BMi-_VR~PRVj*6Ko$w*-v9LvG z6_yH@3X%Y=K(_}FvlQF|4P+!D3Gx6F2+fqV)q5bzcs}0dX$UtAeo(fcvhj=Z1JCi? zOj#fNX(X8c2&*X*ZW=n6KIatPoZp}S=#0Y$uu47T)(W;$@7O~Ph~*+8Q-jll`_q`x zjtQy>`Y!!>(w8L+*H)1pXu@39mh+*;FWMFkgxPLqA?#=X(Pnc!~Jbki@ zpoE^x!ehd-&>K9$pZeTxu-kW-#)5;tG9wxXN?e~=2g>9ZxH%LNRnWW??WL6h(8t!j z9Dvg;;Z+Br`qCN`x4Lrbi?Nc~!OZCBTtjrVUp>*^WP>K9Gj{OO;>4-VUD2Pc75 zMT1|ti!}JDdT~UDcWI!Ajp*=coXr)qc$CFMXJ@r!*tANYUL4RUm7{cdlC8(k<;U33 z$=fgICk;I@@%vj>-waiL@H4WYZ@g&~j6@(EIy4ro!)+;Y`249*I$CY1 zwYE4~{ME%>&Mw~~%pYAGS_vI&RcM1@z42V@dHxGR*Q>5AzBW{37SW+?u*l%nMAXnJ z|1PtlSvO-o5%#DJYcvse7^CO*^+(Mj7mkn^EU|t(R8xZ;h23)i0+7)jy~q*@%La>ze;ddf4C?KAjd#$f(d#*H82lBgzXro<>5+(3!&WG3c#Xyij8px4 z8f7DTM;O_s3eDj_!66P599l_1Qii1!WG2~USUO9rCK$krQ-g$ptPg#_2^@;yQ)^@H zw;E{#!5XD6d@_=2nUY&@vF*+GK0vpVC(~PZo*dtB?n%DQ_Lf<~a{IR6tY1G*n7?Do zVqxgw<*O#sj)a9EE(HF`r#o|}fbql{)S5vA`rtreQ&dExOT%Y!lN8o4?+H|(A-18| z0fPk@0ZK~55R@6xGnKMKSd)~5A};(<{@H?ag*jM0|GRqizv*|=1r7J;-&O2stXCLa z?~H!o-}bY_GLBj<{UrNYxO0Vj_-h%IeX>ymji`lYe!2J{eDC1=u>6s(;{a(dUbcTH zPQ5&TDbsg_dxXOU++<`wC!v+Rq$+%MDKQImvue5KL3rN}lUJi~Eo!cWyTRqqLQUlN zSAM9{2Rm8)klkV-9k&oOf+SqMI!uI4ZQ5sQqJy7`(&Jd^(e z5j8U13cea-P~VTc(g-(jTKIckU_~8N*qwphy&)K;W9jqk-cj)=eSIn6RCS# zAdt11n18gcmB&9rp8%yf)0C@V!C|58wN?^1a`5a7i?e zlVg{~gm7$DY)kC>v4I#y5e98UMd&B@dg1GAFBD>2`2O9>_h)d*@1kTsZ2!Jp;_L<$ z4OxN{;gvDJTZmHOd-pJUy_Gi}d4elOJ%k)Q8~M~C-LDp8j{E)N@b^H6_>ccSlbd#K z;U3Cs*dP~yUJr9blU_q!D+N`QjH3SPI=eAoGYd9xF11 zyo%u^vh0GUv4N@~-$z9~Y|Jfl-)HEXjq0 zJo1ZxQy3V-D5YdH1)-$O9in`qiX`^l=Os6Glzq1%aea2P7Au0NFAyg2-$K*`5O_e@ z2cP_mOFqh%P*NuBcHDi*$t7o(h+Ij)q`|j=x#4Y?qVEsKEffilUkf#I^^fuqlGJ2} z(7`Se*<6I)guXzMI^riuO~Svhw-mWd_oMjQaX$|iFw%PDapnHw#V#|x6d1XK!tax( z80W*7ha9~1$TDPoRX@t3Tj(3ZZ9@lk;YY1STZ&+szq_l*C5X5Vl$DW{kWL_u^W`Ra zpBzb-kN4kd$2)g5jOF_-^>6bFVgGA>Ax+HRGwkGL{M{ZZomna@E!|wYtyC;6HUB3) zzvcg3&o7!<7yP~BJ-_fI_9F8O{@=nx0=6f6kM9RQD&^|fZecz;x6;h0V6yR9BDtMAvoh-4@KEE^{@wTHI2>-D-9{249rG`LM|xkqCKR zO=WiUwDBNxp!x~&<_G$H$sFc7g30ZSGiPfY)PWg>;AU|-TAGW?zM@r(QuT$D^6*S|~kO#QxSE-*1p z8M-NS$_o=TQ_L5Uk|WVvieQ>b{S#i`^cQ%6tCS$vs27;UDn6iep<(Yg0LuglJu^M~ z3%$Vw`c*jXv0cMRz5YEJ+)tO^DiG`~jS6)385RPT&B;v~jPbxUo&H|@8 z?Z^#WY8PK*Cn*7b^?}R^^|_)Vovy7D#izuh6kbgZ7-p9hyp^~LDwc@faZf{HO^}O( zD1&lTp4gs?%Gr861VgzaQU2^G{K|LliWYesP)nd4zcH)_5yXgx7QBJD=5Ab5kr?4e zdCa^00PXmJK<;y*12-d#@zYgtzmXTGGy5ISIiK_W&iOl^`X0kQ#`~T3`yO*X=2H** zi1JIHfv2LZDU<}aoV?QEBJ~EH}mcVNP`;h-NOiy zQ3qdU#KDI&pAiRN?+{=>Y>sKmto{-yRt0h)rTB{-e#5evg!31B|3oWDCPwM;|CApv zFH}dP)yPU!XsF;51g7>X*ypc0ayM5bTll-mzF#JAWhGuaL>r3N#_FDMO28k{0SRa4 zW;{l^C$hO;Wob!>slTutldYZPkNBeWB!toct)c&dc|i^d78Hbb;ux=wAywq$Q3kK5 zoP1;qM+e0*tzXrHb&%Gt5$>R>JuW7@d8cf5<&do8eBFt1B$vT}w$5Pr>JBItpmKVD{44jIXh?cNBi>ar{bUEKJHg?^h{x$_8gt4viP+LZ%*vtdiaIDwc4*}ukh*>YY+nBZMlirg+2r# zl{8Ro%A1RIsdR&Hs*C8nIL`aMY7=MXdD-q&c?`mIVY*r1jc=Ju(p$)<7}%~e z=a2~f8`-4Nzok>ZrPIiG2QI+h>{Myx*47-hJ$ekfsg_4&P?-h!hOg!X`NSo7C@sSS zj1CMLDA74{DqI!UFv+RP90!GaxA2mz)3H~m7}+bl#2JqKLAIo_IfKFcfPmjuzonsj z*oiM-KD$V#XbLaERPg;>suG;8QVEbYsW&mdyEkQhAOEOuX!IqQMjVUSED*xdYOLs? zz)nlO-)wy!a6#+B^$uwGiTXsnr{1ISXcDomtEwM(p!)v%>G7)k0o7U8RNr?my}0+j z>T47j^A7`ddTuG^31MODwNPKR{9D3$l$buC)o|;zss|8O!$){i(7mnIiY3XioG63T z#qUTDXwu{qr?NJ7(;ya9R#D4)>&I^@Q$BG(?ql2+^NS|x`G1;%JZ??3^@{43Uar1^cJl*>tsD@qN8UmEqXueYv)y82eYN_LDvc)5yM_06AyN&0 zrW$7XKtBvKIJ9^3MVkoC;CuKVsn>*4iUt*IGPL>kpus=7$?ykewN77gLTW*zDOCSk z{#&*4wyeJS?E04ax@2cvT?R7qF5b<*A-#?}2y(sS?*VP6=_ZKY#K7ai2b@cIpR)^S z;^Rg2^%vb0$O}xFT<*ucJ8{^CL>34C#@IUzv}ZD%9o5y7ginsT<$Otc%9M0w@+91Q zJMR_lR6WWixGZ<&9?p5>XWOBKBbyAJ6!pfOB)j~0(Ajd5yk9PTp=6t?t zT2KlL@(O?1>GLJ4u%6vmn?-~9lR1s%GD_JfDM{`X4sca`Y*QLsjYSa=%x0+@%HmSU za3b9qz=wwH)D(2V{A)u~D3>g$onN~x^myBfQ0;m%l@Tr+8noNJp~E}P5s zExfAx5@XMfO<%fq=hR$v*VJ6LL)tSjT|22_@?>{O`PAC#Y3G)lap9ynyj`Dbm~^&z z(b}u~u04Eac4~J`ZfZBE>H_ZT!rNk&i*euR$8(0I3z$u4 zukcs!FE^kAAY>I?7x18eM3weN;y+C1Ra_}hZ4^k+01D(Zfl^t1FAlOb0G0+YqB?s5 zT%GWC=GJBFdP63+!*^~rnVC3ic2Bh-nTu;$5}B3F>7~~RzI#g3bqj4(iITvil4N+^ z^7aKOUDcI7q{)<&l?F@NvBJG*i+V4QG7irB1Jo^H(E?n$!iSHl__USG9o!KG>hI0l zQAHDnnJ;i1(#!mv>K4TNtlVUZn0(SF2X=rlwbsnTDvIG9k?1@iT%zZiFS%N2ZOI0d9E0v5+ z%y^vaVE8WHQZMGx+yw3+StmB?;#zIgR7pRX1vfBQa@lMn?qg>>j*Px2{9~W=Ii1nM zEy-rBx>1*j*Oo;?Xg>>tAL26j8W5Pt)b17z$;L9;9c5)9lh=zP#zR~P9LN*Mg@_ZG z?YR&r8whNqb&w!YNFUiONK>Mr7ld4JAYhz*N@*_i87)^$6N*6jSZ);9RpwV<+7uz0 zKA=OkA=n!lN`q0b&cEe$o9&tfRTDZFCMEQcciJ^hjlo$}QYvZ0DXliEKar{ply;)P z*{&)!sr~V`61~TiE^DtVj!n`9Q0wZ|M>|6GlgeGLpv9TC+JfP9I#)X1Q(9zqssj!N z+x#K^PVPit*uqWO183$ZeV9f`kTXNB>MS|4Spq{~c&B$I;cpDZ#$%wEz)+oukDz!M z!@0$TVfJ`px*|HeB3aUuu8ht}l}E8lJ5==zw~h*lsxu31

^0r7XT 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 =6j z1yMIEgFD#o=`<*p$X?2h!f8k(J(b|EiQ+(%r$me*RwPGRD@JM926;n7XI3O~cwbh6 zF?lLNMI<6O3H6ub(Qe7{)+*mCtj-dvqcJ%zt!}wIO>$hSCML&yjS*iPZJC@s9oipy zE2J(By%0JYLY=1PEmtT!bolu;96A0EisQc~cy}x2Pp?$FBgx#dL~jD#{lBwZiCQlb ztZ-h!z0#yMa1fnUlJCA~vad#ms;{0AiPgJqCTYgKVHnFkO_=JYXQwCn5{eqQ2P zQ`g6Emrm*8z{ZLL(ka3_%vo631K{g!+_%oPx~>Rc7rr&DQWeu%Of{xA=|}_Z^&)gL zii?)hlim+mP*vFwP}@+Dt4Cdmm{V1#YX@y3f_?V`Tg;%!64f8ip!R&w&Kg60J=z2P zFZRFs{HOlRF8#p|^6xy--aEei%8xzFHvQjK6Ztj&_gnUkQE}$fdG|~m3(U`etU4m} zg)^`o%y;0JF%k2P!#C|G)|W(Xwt1dUc=+v}`zQ%Tm6tb$*oF9ibaC{vQT5~LPpA3E z>pxx3Cp4eg%p-_>s|vt`>ooZW$7Tm#hbli5u;;kM@kz&x4&CXfX-qnuE$}U`2qfTJ zmadpxp(+*a6;?%Gh2~Q$DzdS9#ZoL-4uNT9RJI}DZi7Qwk9(6>X_KXE=I=dtPxnC6Ud-iN# z6c~1_1V)jUkd57=j2ZZ`wHPmPw~xJV?6I-xZKLlQ%~v_>28@%-Aubx+uX=eIg9L+D#j&sfRYTq?r?neNQ2j7mS2W;SQ`XO3hB zGKN#lgq09Q)hx!fus+mSU13Zd%fx;xaophGlN@ZUBhiLLaGpCH_u~Q=&4%hz!Y9dz z_wyh;EL+oJCmLIFDd+|q+kxyYxz;+r<+qwzb5HyC`;Yk56bc2*^7kNxF)Uu?Z|jA> z$W4OO@81iJ0A_*yJ}RJwbf0h=B&|T~A=Nw+ukP5;;vZRO6WeA#Sj#-Jupx-OqY##^ zPJM7p;yB03#mf%l|L^0A-@5s#D<@7mu;k{amTVtC?Z%laLE7&&eOld{eOG=^B-F<=d{U7zrEy}pIUSKl7HK{ban4y z9K=PSj5Ivf#<2Jvr4f(ZGoYo3FyDVynMePoj>ue{C|bQf#ICI(x1%@XY;N76I=-lR zMe}XV>XOzQTJJ<{y`Iq05Z|0(N`^Td^%PuoqtBn)Q_pTgJWqv{yG+HLPa#=o6!PYV^9%JTQ90Xufpx)1!}!R!3L2)pXY^tyxvGxkeAv z^oXw;YILKfMoV2^e|tS&OtDJdq~$@q$X*Zkcv6%SID&kkpc^}$n8MBQ*hhL9i0X&r z^|D+fszdr|Y$6q%#}7(6Z@;jjlvW`!l3qV#L>f{%(T==p;UB%X`;00%jSP^ zqWIZ#wuZ2D9;i*hyLT&V-lNpu^xqEOV5b8C z*sfhsb}-5=i!P7yU^Elu2jgr;a&B@_QvGEHUbK-~{&p?X>%;Z+^{Th2x@lCC8c?e! z#H>Y7S_=!bbhpfEQR&Chmd!2uTaL60v>48ojITQFo$cicYB2K(uNRi#6e_`?a$hV` zoiG}4P4{Go6wkmjl%8RCXMUCWb4I;3b4!M2Qld&zEL&N(Dzz@P0q$nb`V(2UF?%A* zS5fd{tcCX9P)5g|>#JgT6L3~xd!&(y_Jgb>WkF={RFXbq2p0n>3HuvjV`xW3SwUe4 zp$k0zperK-&eHx@E!5m!*P8 z9X}-gt7+>;C!Wuyf1BtDHee^{sY&^nmA<}$T^nVngZ*X)R1ogeo!|QEb(ekVWXE4P6|t|aJ{@%tMm+m_|K)8u^{|Q_ z#Hr6H-`=BC;h;^%ssHy%_R-4ADk;FAlADfrB+f$|97GM%nXW;hbhyZbQeZ|nsG*AL zsKL^$mg+`I@e@`XPU<2wPOK;FgwlaJi9j`>)%T=Xnk$)fWv4*yu@bjz5i?Ze@Gj3w3;H9b1K$Og^h_gLu@`>fFf$ zk0gVxOtmIzdVsOoOcb^#;ZY&jC|RY50P#_zJv^fff2AvED8>}<$+xeZJM6tq=p}+d z-gMP#>Lo+o?f&+swWs%xPC}e92G00>*eRP4UH{3Jx>M@Ts#9ZiOi#1x(zm90eYz`s zditd_ZeJo{kLuH-)s=2aX5ekLsvS*&2R5-lQ+LxWa7O%C+O)Z8f76ksfhNP*GlSFJW7b62ruM;Cg#&YZikhu zw{m^umdZZV)X`tS2d}L3RF$3>;M%#=%hIr-Y(YjD91Xk9(p}~ceviOu7ag1x+{)U zyj7v~P*!qZP5oPdoeBEt_xqXRPy3JhRniM-p;C!heoY@)?&SjeVe_H4P$Gu1-ACYH z;l(Zl=R~RJIc~D|ywQGJ{L2;1(`$jJ&-fisQ(JDxlN4U z%GiAxTj6A|fnoboEk)IgiP4it%WsmK=NN+c@c^@_L7LlRq6k`)aOk?hcN*Q9f46mh`4 z2P#%UOQxqXWC$SA5L(z?64!-$3+=hU3_TTRWM~Y^kHcYKB=n7nI@73{tMBPwng7=J zc8gll$ChoLpWjKvq;I^1vESb?KmSqw+jrhUa_PBLGCF@wJDVbkM!$96BVSu_&$oyM z?3(d{2A008v9PD!!>{w)>ftl}42dkyGe2(fapnw@kFPwV^5sf(PUXT%J~z53%H!3E z1YeI@Zam;i`4Gt!sCFCSYVL{0gH^tI)X;@xkun3dDFccYK?%NK9WY{L8*(W}H!dB; zDibIz1r4QG%N3jxA@4RifB=aKWJyICBd`a$_u9Vgf-B%6km*v7=Rb1%=IfC*lwB#E z+NYlL@Tbq3k>AHd{RiO7j?AIbmHqL>pFiiUPm+viA2_Ce8uTAk?z9$#nxN9(6J$$} zm(yTPjtPz@9O|vXyMzB0B#&(mpB*_7;i<^F2oFRyMEKIk(~%<)HBt$B2xFxwRIh}C z19Y`2p%0>tZ5kn1JYeE!%W}_lYe(G-Aw1S`s-qz~>W#Xk5MI@yFkJNV0pP?gm)#_JO*q;a9!zU!4e3&G8*v4OQ-~ zM3sYzDEDg#;^=J&7D%KL#IH5_u`2O&;z;7Hgd<^kTYZi&Ru-?f?9&{uD#N)zfcaGT zg`1X1f1QOSZ%0I}n!Wb1?kBZVl*GnQ*mmh;_oE23R6p@Mtg@Wg%NHprUE5dW?&LbY zX(Xn8_uct)k&&~3>G?~P?+zTsE8Oi?S~Y7jIh{U~fEj>Opy}pK4$XplvS#@`9^%&& zh2!zyDovh7UiO4qhfD1;g^`m%FLtrlWB+#|+b|`r+*i;9k){B72$6nLR3SvTc_jSZOM0%jXx%02@|U!4+}Qr{`|9B@cAui= zpVPLpN&0ih_E-g7#hT`aA?8KJp`scnepV`Je8%xN)EVV3?l8?7SN19V3d98K7TuR5&a(mjA^l{UyRCwP&;K?b-I2=MDNcwzl*w+pat4-?Ht^l^4>N z+Of@*tL2w=oP~kUXxo)L9G4;9;(jZ_kO;|TIGk>fdIpGdpfm^)>7p|HOm{H1*?8L6 z4_0WHh_qD=*Ebxj9UOo%r|X;DPrLUc|D0!`hG#v>^{;B`X80%WSJbN%rYRx3#v#0# zA){6;YrIvd>h6oZh6A*`?=@s!drkh>2de{I@(^az*%{x5^VQK2g`QbyWRb{Noeke z_+ql26e^H{JY_;!QrZgN=Qf0@G9B&N^9ny5%IGRzM<&~z-)?_V)PXZF;`bbr#E1!H z=FX~xF3^G2k_YWqUGWiw>)N!hiMi8F$2?=k%YL65d*{-Vo-2 z1efq*js(R;u2dx)={G^rC;Ua22DZ*1-8gr`0KH#!2C{XBLy z?eJXC)24yfG0V$#GBcT>GTbMu%8GFA0@sy@uR)$J{#Ur8^=eOnCUnIE`l+?TQ)*NGTiQJB%<0SX zm$3O}tfF)2lv8Lv*8*#69Z?+mnR|f5J}ZFoHi~MhNPDEF5iE&;cHmc>A)l}1=^?Sk z8Ba3=Mfb(`&EGd4DrXg{6@f^r=#YR;E0Gs;?V2@f^eeV)+lHLMFM|%7k-Iphd<*_< z$WIfD=3o^*WQ{e!N~KAR zMqKk>ee6p8GdjOrzfb2rJ>f{Qx0CExk}V0dPlT@z^JLge5ZghBlCsM~PFR#adtdz3 z`Ej_;Ocb_DJfYE50bVEv_Qg%4N2V;rj4&tu2zr-c1-Pag@?6TO4)~vrkFe%>)*0iX zZ5?eFOpPv@Yn{LZ;yI^8f_gG*Y`>-9> z@(DNr6Za?{*t`7Tr-q3WFwbD_UY+(Gbr96LodHTxOiNa}kwqDMdtB@-<_GG?%Cu2k zX}PUzj`nkVTQ9;Wih_L}Gq4vYXw4pw<6lH_JWXfF)9l5gCbOc6T!5um8^a})aU>k% z^s7~zvbd>uGs6SArKze_mC31=CcF!G<2!hUrPG62qww=K#C| z-d0tnI1@M>W83MB;$ljigN^yz_U)hBp1)+r4m{)VfsYlbBBE@Pbb&!mSQWs^Lj79g zLB&+NQ7})hAV%V~=;d^KO_m%&`Ya?G%6VND?{yRIT%hO|w;?+a{gWr0$@PWVX56Gz zk~<(JzLfL*{0Qfi=S<};in<_Dat$FR2v*xINf1@sd|rCUP)#lh6U6gr)I`+)O7{bg zy`l_=MnG%Jr=N*^*+v|GZ0&hx-T%3eWg_Gd6PXZSw z0k7b_E?NyRPbUFY0X#<8Nsv@dG%l0IWf7K`*(670bM#-x(M&d9oCVO|oRg0uI1R!I zM;fPi;#k=@Y|cmnaXQ)dI8mi%j}pO(TsYgvpd8M*DSRn_zZKRu&(BQk$WANl1+&Aq zZ7we|$k*+Tip5sS)%M}wLlBFj|H7+rLcOHV^7-f^&aJQsgV14b10hE1|BAMqFLFE! zpTrcZzKmx%>uRUb>@d@HImN-;y6$LJE!B!Ab4S#-)BzP{%M{*@Hme$VW7hJ;Q)X9C zv<{+mMX)Pmg{XBZ)P^)$>a0*tXaipSv`||h-WKnU&x$XNZ;lVd@rDpjE0%E7jVF@1 z7nGwYH46pTgfr$w1<;YsgswNotWH-TXE-q-r|vK`cTER5-l5Bp=v&c&s7h&Rd!n18 z=n@@OV+CVqZW5+l=#oMjJ*}oK+9}WNK2jg$)4@LT*=Wb`-zs!3-nW+`oZ$(!uagSY z5*2p}+Lqmi{EMv>HG<>#^rvymDp! ze$nm1RiB%G?$}im=A1iq%IuF$?mlPEgvlSB4Ss^R!R<&4N;{iSzGa;T-#HgDsZRH=_TRqQdWh51ZvP-+i+p_GbA9Z`O#IKPirZ zNuXQGoDw!s0jP*Q9xTV$*##U8!py}sGQeGyfV4s8BS}@7QR;ivfQU=*Db`vi|_cpZ7 zXpYXE>(0!btN(uHxGC;C*jIn#T{VZe+l}Dqw+w871j=mXLaJ#fr(CzoTE!Uah2lc8 zn1tH1&=@k5o%WXeU$#L%nwv-O#pr$S{|Dt)rI26umWi(sbUGosgifblsTXy+qI^={ zpCB5f)0K;yqMRwo7X@4xl7EiSFr&)7WwO)-F6<+X6Aln3tTg_1LGVgS64UJCP^T^^ zpQ^t%OdL6acyD6S?p_`c;xladhsw|JU;%3O#iTOY7l*-(VUy#>&6lJYfl?~;($-eJ zOmLQeXLAZ%8_TeTXlZd~QH;|0T7?sG)4&19`>U#D|6)1;_=KCPrEjUCrG?sC< zGX9?_Fn#Tp<$S)#-^;BMYxgKV#6>}|fb{{n-tmQWMILaZ9I#CY{V)oXgx5l0WHMBs zJaWLPXedhl)EEaq0ZF5p5IEkO8}dC`N*c;9!y8gyecep{Xh~a;WL_ zFDCwl4tbhGd*_xSE@$rdudH_$E^Q@UUEKL?Wxbr)Y1@Ua4!(|=-{LSZ^K?01-)?EW zG!3OY{*w{dy0#r`-M*Jd?(}!=zqZ79-}m1ltATz~cK;>LGW-I}`oB$dB<`jUe;9Yu zmiKlyRXmo7i|N*c(uON(=|&2s^KLg%VSad*8|eqQkMe;p00Y_I%A*MG^l(FwiUP~Nt-I4ojnZLpagG4u);zqsX(=QwGB(R7Y9 z`!-~a1EpEais2WGHK}mzWiY2%dheYBs10%T9rzgYNqit~7K!62(|I=vbWru^r}Y8d zxlZ4pZ`SwgM|54$;pwBR*6nxT`aJ8?_?UV+KE|Jdk1?J2sB6XtE(@xKGQz55_;M#y z)+S^9S3#Pg`U^z@*ngxbB2zE^2pt?x8z}ll@=2h&_@!td2KGU}o#e;+$;i%mAV_kYv@i>$1(LW-_i_sm z1rz~M{Qu{Of=v@TXr}+ypI`lJ!jsXtO&|)GI)ZalE6!1veRU@ah=g;{?~ZOas${68 z-w!0<>ISu&T%Ug!-qSNyR;;-_hhW1?mzljXOBytyq-yq7 z65!8R$U;L$*g;3wK}XmjjxfEO(R0x($12A<$J34hhm-u+Haqq^jyO=D3P;%S4;q#pargbvb zirQ4dUJDUSTgr?rtq<0ne%ZK=Sq%@gb{m~{-0|?{bI(1$t##&1yc3jm7!OQr`OXT{ zT}gJ?qj=1ylIjFfL&!Ve4l|ZRT2f%uZOKHWs*_l`<)+QUhHE;^8WF3)3MiUpRn_NE z&wMm;5IKBe|Efap9TfW~eq#UVr`*2~_74$UC_#eqJ|XO1s5eTmK4&4yl=ja}`{$

okG(z1$EL-Iw)0HFW9 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

5T4(J7RUssJ3lH8XDc6u&1)6 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 literal 0 HcmV?d00001 diff --git a/tests/cpp-empty-test/proj-wp8-xaml/cpp-empty-test/Package.appxmanifest b/tests/cpp-empty-test/proj-wp8-xaml/cpp-empty-test/Package.appxmanifest new file mode 100644 index 0000000000..53a9ad22fb --- /dev/null +++ b/tests/cpp-empty-test/proj-wp8-xaml/cpp-empty-test/Package.appxmanifest @@ -0,0 +1,59 @@ + + + + + + + + + cpp-empty-test + dalestam + Assets\StoreLogo.png + + + + 6.3.1 + 6.3.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + AgHostSvcs.dll + + + + + \ No newline at end of file From 50f82ce1d0e6c66cf37f839fc6b45f9735e2a62e Mon Sep 17 00:00:00 2001 From: samuele3hu Date: Tue, 24 Jun 2014 10:12:32 +0800 Subject: [PATCH 60/72] Fix compile error for lua bindings in the different platforms --- cocos/scripting/lua-bindings/Android.mk | 2 ++ cocos/scripting/lua-bindings/CMakeLists.txt | 2 ++ cocos/scripting/lua-bindings/proj.win32/liblua.vcxproj | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cocos/scripting/lua-bindings/Android.mk b/cocos/scripting/lua-bindings/Android.mk index deb09960e1..6d0b337577 100644 --- a/cocos/scripting/lua-bindings/Android.mk +++ b/cocos/scripting/lua-bindings/Android.mk @@ -66,6 +66,8 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../external/lua/tolua \ $(LOCAL_PATH)/../../editor-support/cocosbuilder \ $(LOCAL_PATH)/../../editor-support/cocostudio \ $(LOCAL_PATH)/../../ui \ + $(LOCAL_PATH)/../../2d \ + $(LOCAL_PATH)/../../3d \ $(LOCAL_PATH)/auto \ $(LOCAL_PATH)/manual \ $(LOCAL_PATH)/manual/platform/android \ diff --git a/cocos/scripting/lua-bindings/CMakeLists.txt b/cocos/scripting/lua-bindings/CMakeLists.txt index 00db47361c..9ac8d5f1ff 100644 --- a/cocos/scripting/lua-bindings/CMakeLists.txt +++ b/cocos/scripting/lua-bindings/CMakeLists.txt @@ -33,6 +33,8 @@ include_directories( ../../editor-support/cocostudio ../../editor-support/spine ../../ui + ../../2d + ../../3d ../../../external/lua/lua ../../../external/lua/tolua ../../../external/xxtea diff --git a/cocos/scripting/lua-bindings/proj.win32/liblua.vcxproj b/cocos/scripting/lua-bindings/proj.win32/liblua.vcxproj index 8bfdfe3e54..4ebf5661d4 100644 --- a/cocos/scripting/lua-bindings/proj.win32/liblua.vcxproj +++ b/cocos/scripting/lua-bindings/proj.win32/liblua.vcxproj @@ -188,7 +188,7 @@ Disabled - $(EngineRoot);$(EngineRoot)cocos;$(EngineRoot)cocos\ui;$(EngineRoot)cocos\editor-support;$(EngineRoot)cocos\editor-support\cocostudio;$(EngineRoot)cocos\editor-support\cocosbuilder;$(EngineRoot)cocos\editor-support\spine;$(EngineRoot)cocos\audio\include;$(EngineRoot)extensions;$(EngineRoot)extensions\network;$(EngineRoot)external;$(EngineRoot)external\libwebsockets\win32\include;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\lua\luajit\include;$(EngineRoot)external\lua;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;%(AdditionalIncludeDirectories) + $(EngineRoot);$(EngineRoot)cocos;$(EngineRoot)cocos\ui;$(EngineRoot)cocos\editor-support;$(EngineRoot)cocos\editor-support\cocostudio;$(EngineRoot)cocos\editor-support\cocosbuilder;$(EngineRoot)cocos\editor-support\spine;$(EngineRoot)cocos\audio\include;$(EngineRoot)extensions;$(EngineRoot)extensions\network;$(EngineRoot)external;$(EngineRoot)external\libwebsockets\win32\include;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\lua\luajit\include;$(EngineRoot)external\lua;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\2d;$(EngineRoot)cocos\3d;%(AdditionalIncludeDirectories) WIN32;_WINDOWS;_DEBUG;COCOS2D_DEBUG=1;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) false EnableFastChecks @@ -220,7 +220,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\..\..\external\lua\luajit\prebuilt\win32\*.*" "$ MinSpace true - $(EngineRoot);$(EngineRoot)cocos;$(EngineRoot)cocos\ui;$(EngineRoot)cocos\editor-support;$(EngineRoot)cocos\editor-support\cocostudio;$(EngineRoot)cocos\editor-support\cocosbuilder;$(EngineRoot)cocos\editor-support\spine;$(EngineRoot)cocos\audio\include;$(EngineRoot)extensions;$(EngineRoot)extensions\network;$(EngineRoot)external;$(EngineRoot)external\libwebsockets\win32\include;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\lua\luajit\include;$(EngineRoot)external\lua;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;%(AdditionalIncludeDirectories) + $(EngineRoot);$(EngineRoot)cocos;$(EngineRoot)cocos\ui;$(EngineRoot)cocos\editor-support;$(EngineRoot)cocos\editor-support\cocostudio;$(EngineRoot)cocos\editor-support\cocosbuilder;$(EngineRoot)cocos\editor-support\spine;$(EngineRoot)cocos\audio\include;$(EngineRoot)extensions;$(EngineRoot)extensions\network;$(EngineRoot)external;$(EngineRoot)external\libwebsockets\win32\include;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\lua\luajit\include;$(EngineRoot)external\lua;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\2d;$(EngineRoot)cocos\3d;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;LIBLUA_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true From 199ad9c623c65bbe118ffdb140cd3f6df4913674 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 24 Jun 2014 10:18:01 +0800 Subject: [PATCH 61/72] issue #5161, replace deprecated methods --- .../ImageViewReader/ImageViewReader.cpp | 4 +- .../UIListViewTest/UIListViewTest.cpp | 50 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 537fdeebfb..bfc61f031e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -76,9 +76,9 @@ namespace cocostudio } else if(key == P_Scale9Width){ - imageView->setSize(Size(valueToFloat(value), imageView->getSize().height)); + imageView->setContentSize(Size(valueToFloat(value), imageView->getContentSize().height)); }else if(key == P_Scale9Height){ - imageView->setSize(Size(imageView->getSize().width, valueToFloat(value))); + imageView->setContentSize(Size(imageView->getContentSize().width, valueToFloat(value))); } else if(key == P_CapInsetsX){ capsx = valueToFloat(value); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp index ddaa54ada5..7c39e5bc00 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp @@ -22,7 +22,7 @@ bool UIListViewTest_Vertical::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); _displayValueLabel = Text::create("Move by vertical direction", "fonts/Marker Felt.ttf", 32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); @@ -34,7 +34,7 @@ bool UIListViewTest_Vertical::init() Text* alert = Text::create("ListView vertical", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, - widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -62,9 +62,9 @@ bool UIListViewTest_Vertical::init() listView->setBackGroundImageScale9Enabled(true); listView->setSize(Size(240, 130)); listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - listView->getSize().width) / 2.0f, + (backgroundSize.width - listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - listView->getSize().height) / 2.0f)); + (backgroundSize.height - listView->getContentSize().height) / 2.0f)); listView->addEventListener((ui::ListView::ccListViewCallback)CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEvent, this)); listView->addEventListener((ui::ListView::ccScrollViewCallback)CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEventScrollView,this)); @@ -77,9 +77,9 @@ bool UIListViewTest_Vertical::init() Layout* default_item = Layout::create(); default_item->setTouchEnabled(true); - default_item->setSize(default_button->getSize()); - default_button->setPosition(Vec2(default_item->getSize().width / 2.0f, - default_item->getSize().height / 2.0f)); + default_item->setSize(default_button->getContentSize()); + default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f, + default_item->getContentSize().height / 2.0f)); default_item->addChild(default_button); // set model @@ -109,11 +109,11 @@ bool UIListViewTest_Vertical::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getSize()); + custom_button->setSize(default_button->getContentSize()); Layout *custom_item = Layout::create(); - custom_item->setSize(custom_button->getSize()); - custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); + custom_item->setSize(custom_button->getContentSize()); + custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); listView->addChild(custom_item); @@ -126,11 +126,11 @@ bool UIListViewTest_Vertical::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getSize()); + custom_button->setSize(default_button->getContentSize()); Layout *custom_item = Layout::create(); - custom_item->setSize(custom_button->getSize()); - custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); + custom_item->setSize(custom_button->getContentSize()); + custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); custom_item->setTag(1); @@ -221,7 +221,7 @@ bool UIListViewTest_Horizontal::init() { if (UIScene::init()) { - Size widgetSize = _widget->getSize(); + Size widgetSize = _widget->getContentSize(); _displayValueLabel = Text::create("Move by horizontal direction", "fonts/Marker Felt.ttf", 32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); @@ -234,7 +234,7 @@ bool UIListViewTest_Horizontal::init() Text* alert = Text::create("ListView horizontal", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); - alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); _uiLayer->addChild(alert); Layout* root = static_cast(_uiLayer->getChildByTag(81)); @@ -263,9 +263,9 @@ bool UIListViewTest_Horizontal::init() listView->setBackGroundImageScale9Enabled(true); listView->setSize(Size(240, 130)); listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + - (backgroundSize.width - listView->getSize().width) / 2.0f, + (backgroundSize.width - listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + - (backgroundSize.height - listView->getSize().height) / 2.0f)); + (backgroundSize.height - listView->getContentSize().height) / 2.0f)); listView->addEventListener((ui::ListView::ccListViewCallback)CC_CALLBACK_2(UIListViewTest_Horizontal::selectedItemEvent, this)); _uiLayer->addChild(listView); @@ -276,8 +276,8 @@ bool UIListViewTest_Horizontal::init() Layout *default_item = Layout::create(); default_item->setTouchEnabled(true); - default_item->setSize(default_button->getSize()); - default_button->setPosition(Vec2(default_item->getSize().width / 2.0f, default_item->getSize().height / 2.0f)); + default_item->setSize(default_button->getContentSize()); + default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f, default_item->getContentSize().height / 2.0f)); default_item->addChild(default_button); // set model @@ -301,11 +301,11 @@ bool UIListViewTest_Horizontal::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getSize()); + custom_button->setSize(default_button->getContentSize()); Layout* custom_item = Layout::create(); - custom_item->setSize(custom_button->getSize()); - custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); + custom_item->setSize(custom_button->getContentSize()); + custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); listView->pushBackCustomItem(custom_item); @@ -318,11 +318,11 @@ bool UIListViewTest_Horizontal::init() Button* custom_button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); - custom_button->setSize(default_button->getSize()); + custom_button->setSize(default_button->getContentSize()); Layout* custom_item = Layout::create(); - custom_item->setSize(custom_button->getSize()); - custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); + custom_item->setSize(custom_button->getContentSize()); + custom_button->setPosition(Vec2(custom_item->getContentSize().width / 2.0f, custom_item->getContentSize().height / 2.0f)); custom_item->addChild(custom_button); listView->insertCustomItem(custom_item, items_count); From 0a6193273035cfa0dc4152416993c385e0121458 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 24 Jun 2014 10:30:36 +0800 Subject: [PATCH 62/72] [ci skip] --- CHANGELOG | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 5c8f657170..bf917d70d2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ cocos2d-x-3.2 ??? - [NEW] Node: added getName(), setName(), getChildByName(), enumerateChildren() [NEW] Label: support setting line height and additional kerning of label that not using system font + [NEW] Lua-binding: Animation3D supported + [NEW] Node: added getName(), setName(), getChildByName(), enumerateChildren() + [FIX] FileUtils: getStringFromFile may return a unterminated string [FIX] Lua-binding: Sequence:create will cause drop-dead issue From cb9e5c2d77c39d75c1cd6f03cf2c8d1339bc81d6 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 24 Jun 2014 02:31:03 +0000 Subject: [PATCH 63/72] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index c0c0e1d3e0..2593c3a025 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -519,11 +519,11 @@ "cocos/editor-support/cocostudio/CCUtilMath.cpp", "cocos/editor-support/cocostudio/CCUtilMath.h", "cocos/editor-support/cocostudio/CMakeLists.txt", + "cocos/editor-support/cocostudio/CocoLoader.cpp", + "cocos/editor-support/cocostudio/CocoLoader.h", "cocos/editor-support/cocostudio/CocoStudio.h", "cocos/editor-support/cocostudio/DictionaryHelper.cpp", "cocos/editor-support/cocostudio/DictionaryHelper.h", - "cocos/editor-support/cocostudio/ObjectFactory.cpp", - "cocos/editor-support/cocostudio/ObjectFactory.h", "cocos/editor-support/cocostudio/TriggerBase.cpp", "cocos/editor-support/cocostudio/TriggerBase.h", "cocos/editor-support/cocostudio/TriggerMng.cpp", From f2ecb31958a9f9ca0bd11c459d912507f0178771 Mon Sep 17 00:00:00 2001 From: boyu0 Date: Tue, 24 Jun 2014 10:33:21 +0800 Subject: [PATCH 64/72] closed #5541: add more warning for unsupported functions. --- cocos/2d/CCNode.cpp | 33 ++++++++++++++++++++++++++++++--- cocos/2d/CCNode.h | 10 ++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 37d5523378..fc9d7a5171 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -203,6 +203,13 @@ void Node::setSkewX(float skewX) if (_skewX == skewX) return; +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setSkewX"); + } +#endif + _skewX = skewX; _transformUpdated = _transformDirty = _inverseDirty = true; } @@ -217,6 +224,13 @@ void Node::setSkewY(float skewY) if (_skewY == skewY) return; +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setSkewY"); + } +#endif + _skewY = skewY; _transformUpdated = _transformDirty = _inverseDirty = true; } @@ -298,10 +312,9 @@ void Node::setRotation3D(const Vec3& rotation) _rotationZ_Y = _rotationZ_X = rotation.z; #if CC_USE_PHYSICS - if (_physicsBody) + if (_physicsBody != nullptr) { - Scene* scene = _physicsBody->getWorld() != nullptr ? &_physicsBody->getWorld()->getScene() : nullptr; - updatePhysicsBodyRotation(scene); + CCLOG("Node WARNING: PhysicsBody doesn't support setRotation3D"); } #endif } @@ -387,6 +400,13 @@ void Node::setScale(float scaleX,float scaleY) if (_scaleX == scaleX && _scaleY == scaleY) return; +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setScale"); + } +#endif + _scaleX = scaleX; _scaleY = scaleY; _transformUpdated = _transformDirty = _inverseDirty = true; @@ -421,6 +441,13 @@ void Node::setScaleZ(float scaleZ) if (_scaleZ == scaleZ) return; +#if CC_USE_PHYSICS + if (_physicsBody != nullptr) + { + CCLOG("Node WARNING: PhysicsBody doesn't support setScaleZ"); + } +#endif + _scaleZ = scaleZ; _transformUpdated = _transformDirty = _inverseDirty = true; } diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 10cfcb633c..c3b9b42e93 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -240,6 +240,8 @@ public: * The Default value is 1.0 if you haven't changed it before. * * @param scaleY The scale factor on Y axis. + * + * @warning The physics body doesn't support this. */ virtual void setScaleZ(float scaleZ); /** @@ -258,6 +260,8 @@ public: * It is a scaling factor that multiplies the width, height and depth of the node and its children. * * @param scale The scale factor for both X and Y axis. + * + * @warning The physics body doesn't support this. */ virtual void setScale(float scale); /** @@ -401,6 +405,8 @@ public: * The default skewX angle is 0. Positive values distort the node in a CW direction. * * @param skewX The X skew angle of the node in degrees. + * + * @warning The physics body doesn't support this. */ virtual void setSkewX(float skewX); /** @@ -424,6 +430,8 @@ public: * The default skewY angle is 0. Positive values distort the node in a CCW direction. * * @param skewY The Y skew angle of the node in degrees. + * + * @warning The physics body doesn't support this. */ virtual void setSkewY(float skewY); /** @@ -526,6 +534,8 @@ public: /** * Sets the rotation (X,Y,Z) in degrees. * Useful for 3d rotations + * + * @warning The physics body doesn't support this. */ virtual void setRotation3D(const Vec3& rotation); /** From 879862b993a24c0104452546d5669c460ed3a0c3 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 24 Jun 2014 02:35:55 +0000 Subject: [PATCH 65/72] [AUTO]: updating luabinding automatically --- .../lua-bindings/auto/api/ActionManagerEx.lua | 8 + .../lua-bindings/auto/api/ActionObject.lua | 7 + .../lua-bindings/auto/api/Animate3D.lua | 57 +++ .../lua-bindings/auto/api/Animation3D.lua | 18 + .../lua-bindings/auto/api/GUIReader.lua | 6 + .../auto/api/lua_cocos2dx_auto_api.lua | 10 + .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 351 ++++++++++++++++++ .../lua-bindings/auto/lua_cocos2dx_auto.hpp | 9 + .../auto/lua_cocos2dx_studio_auto.cpp | 157 ++++++++ .../auto/lua_cocos2dx_studio_auto.hpp | 3 + 10 files changed, 626 insertions(+) create mode 100644 cocos/scripting/lua-bindings/auto/api/Animate3D.lua create mode 100644 cocos/scripting/lua-bindings/auto/api/Animation3D.lua diff --git a/cocos/scripting/lua-bindings/auto/api/ActionManagerEx.lua b/cocos/scripting/lua-bindings/auto/api/ActionManagerEx.lua index 3592d682f3..bf55e3aae9 100644 --- a/cocos/scripting/lua-bindings/auto/api/ActionManagerEx.lua +++ b/cocos/scripting/lua-bindings/auto/api/ActionManagerEx.lua @@ -22,6 +22,14 @@ -- @param #char char -- @return ActionObject#ActionObject ret (return value: ccs.ActionObject) +-------------------------------- +-- @function [parent=#ActionManagerEx] initWithBinary +-- @param self +-- @param #char char +-- @param #cc.Ref ref +-- @param #ccs.CocoLoader cocoloader +-- @param #ccs.stExpCocoNode stexpcoconode + -------------------------------- -- @function [parent=#ActionManagerEx] releaseActions -- @param self diff --git a/cocos/scripting/lua-bindings/auto/api/ActionObject.lua b/cocos/scripting/lua-bindings/auto/api/ActionObject.lua index ec83feaa15..750570361d 100644 --- a/cocos/scripting/lua-bindings/auto/api/ActionObject.lua +++ b/cocos/scripting/lua-bindings/auto/api/ActionObject.lua @@ -60,6 +60,13 @@ -- @param self -- @return bool#bool ret (return value: bool) +-------------------------------- +-- @function [parent=#ActionObject] initWithBinary +-- @param self +-- @param #ccs.CocoLoader cocoloader +-- @param #ccs.stExpCocoNode stexpcoconode +-- @param #cc.Ref ref + -------------------------------- -- @function [parent=#ActionObject] addActionNode -- @param self diff --git a/cocos/scripting/lua-bindings/auto/api/Animate3D.lua b/cocos/scripting/lua-bindings/auto/api/Animate3D.lua new file mode 100644 index 0000000000..10f59f3ed2 --- /dev/null +++ b/cocos/scripting/lua-bindings/auto/api/Animate3D.lua @@ -0,0 +1,57 @@ + +-------------------------------- +-- @module Animate3D +-- @extend ActionInterval + +-------------------------------- +-- @function [parent=#Animate3D] setPlayBack +-- @param self +-- @param #bool bool + +-------------------------------- +-- @function [parent=#Animate3D] setSpeed +-- @param self +-- @param #float float + +-------------------------------- +-- @function [parent=#Animate3D] getPlayBack +-- @param self +-- @return bool#bool ret (return value: bool) + +-------------------------------- +-- @function [parent=#Animate3D] getSpeed +-- @param self +-- @return float#float ret (return value: float) + +-------------------------------- +-- @function [parent=#Animate3D] create +-- @param self +-- @param #cc.Animation3D animation3d +-- @return Animate3D#Animate3D ret (return value: cc.Animate3D) + +-------------------------------- +-- @function [parent=#Animate3D] startWithTarget +-- @param self +-- @param #cc.Node node + +-------------------------------- +-- @function [parent=#Animate3D] step +-- @param self +-- @param #float float + +-------------------------------- +-- @function [parent=#Animate3D] clone +-- @param self +-- @return Animate3D#Animate3D ret (return value: cc.Animate3D) + +-------------------------------- +-- @function [parent=#Animate3D] reverse +-- @param self +-- @return Animate3D#Animate3D ret (return value: cc.Animate3D) + +-------------------------------- +-- @function [parent=#Animate3D] update +-- @param self +-- @param #float float + +return nil diff --git a/cocos/scripting/lua-bindings/auto/api/Animation3D.lua b/cocos/scripting/lua-bindings/auto/api/Animation3D.lua new file mode 100644 index 0000000000..2de6b2682f --- /dev/null +++ b/cocos/scripting/lua-bindings/auto/api/Animation3D.lua @@ -0,0 +1,18 @@ + +-------------------------------- +-- @module Animation3D +-- @extend Ref + +-------------------------------- +-- @function [parent=#Animation3D] getDuration +-- @param self +-- @return float#float ret (return value: float) + +-------------------------------- +-- @function [parent=#Animation3D] getOrCreate +-- @param self +-- @param #string str +-- @param #string str +-- @return Animation3D#Animation3D ret (return value: cc.Animation3D) + +return nil diff --git a/cocos/scripting/lua-bindings/auto/api/GUIReader.lua b/cocos/scripting/lua-bindings/auto/api/GUIReader.lua index c5d7484390..487ffc1cc3 100644 --- a/cocos/scripting/lua-bindings/auto/api/GUIReader.lua +++ b/cocos/scripting/lua-bindings/auto/api/GUIReader.lua @@ -19,6 +19,12 @@ -- @param self -- @return string#string ret (return value: string) +-------------------------------- +-- @function [parent=#GUIReader] widgetFromBinaryFile +-- @param self +-- @param #char char +-- @return Widget#Widget ret (return value: ccui.Widget) + -------------------------------- -- @function [parent=#GUIReader] getVersionInteger -- @param self diff --git a/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_auto_api.lua b/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_auto_api.lua index d33736bfff..63856c59c7 100644 --- a/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_auto_api.lua +++ b/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_auto_api.lua @@ -1221,4 +1221,14 @@ -- @field [parent=#cc] ProtectedNode#ProtectedNode ProtectedNode preloaded module +-------------------------------------------------------- +-- the cc Animation3D +-- @field [parent=#cc] Animation3D#Animation3D Animation3D preloaded module + + +-------------------------------------------------------- +-- the cc Animate3D +-- @field [parent=#cc] Animate3D#Animate3D Animate3D preloaded module + + return nil diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 18904e44b5..4391b38834 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -2,6 +2,8 @@ #include "cocos2d.h" #include "SimpleAudioEngine.h" #include "CCProtectedNode.h" +#include "CCAnimation3D.h" +#include "CCAnimate3D.h" #include "tolua_fix.h" #include "LuaBasicConversions.h" @@ -63993,6 +63995,353 @@ int lua_register_cocos2dx_ProtectedNode(lua_State* tolua_S) g_typeCast["ProtectedNode"] = "cc.ProtectedNode"; return 1; } + +int lua_cocos2dx_Animation3D_getDuration(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Animation3D* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Animation3D",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Animation3D*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Animation3D_getDuration'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + return 0; + double ret = cobj->getDuration(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getDuration",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animation3D_getDuration'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_Animation3D_getOrCreate(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"cc.Animation3D",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 1) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0); + if(!ok) + return 0; + cocos2d::Animation3D* ret = cocos2d::Animation3D::getOrCreate(arg0); + object_to_luaval(tolua_S, "cc.Animation3D",(cocos2d::Animation3D*)ret); + return 1; + } + if (argc == 2) + { + std::string arg0; + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 2,&arg0); + ok &= luaval_to_std_string(tolua_S, 3,&arg1); + if(!ok) + return 0; + cocos2d::Animation3D* ret = cocos2d::Animation3D::getOrCreate(arg0, arg1); + object_to_luaval(tolua_S, "cc.Animation3D",(cocos2d::Animation3D*)ret); + return 1; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d\n ", "getOrCreate",argc, 1); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animation3D_getOrCreate'.",&tolua_err); +#endif + return 0; +} +static int lua_cocos2dx_Animation3D_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (Animation3D)"); + return 0; +} + +int lua_register_cocos2dx_Animation3D(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"cc.Animation3D"); + tolua_cclass(tolua_S,"Animation3D","cc.Animation3D","cc.Ref",nullptr); + + tolua_beginmodule(tolua_S,"Animation3D"); + tolua_function(tolua_S,"getDuration",lua_cocos2dx_Animation3D_getDuration); + tolua_function(tolua_S,"getOrCreate", lua_cocos2dx_Animation3D_getOrCreate); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocos2d::Animation3D).name(); + g_luaType[typeName] = "cc.Animation3D"; + g_typeCast["Animation3D"] = "cc.Animation3D"; + return 1; +} + +int lua_cocos2dx_Animate3D_setPlayBack(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Animate3D* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Animate3D",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Animate3D*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Animate3D_setPlayBack'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0); + if(!ok) + return 0; + cobj->setPlayBack(arg0); + return 0; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "setPlayBack",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animate3D_setPlayBack'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_Animate3D_setSpeed(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Animate3D* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Animate3D",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Animate3D*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Animate3D_setSpeed'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + double arg0; + + ok &= luaval_to_number(tolua_S, 2,&arg0); + if(!ok) + return 0; + cobj->setSpeed(arg0); + return 0; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "setSpeed",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animate3D_setSpeed'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_Animate3D_getPlayBack(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Animate3D* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Animate3D",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Animate3D*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Animate3D_getPlayBack'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + return 0; + bool ret = cobj->getPlayBack(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getPlayBack",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animate3D_getPlayBack'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_Animate3D_getSpeed(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Animate3D* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Animate3D",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Animate3D*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Animate3D_getSpeed'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + return 0; + double ret = cobj->getSpeed(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getSpeed",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animate3D_getSpeed'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_Animate3D_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"cc.Animate3D",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 1) + { + cocos2d::Animation3D* arg0; + ok &= luaval_to_object(tolua_S, 2, "cc.Animation3D",&arg0); + if(!ok) + return 0; + cocos2d::Animate3D* ret = cocos2d::Animate3D::create(arg0); + object_to_luaval(tolua_S, "cc.Animate3D",(cocos2d::Animate3D*)ret); + return 1; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d\n ", "create",argc, 1); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animate3D_create'.",&tolua_err); +#endif + return 0; +} +static int lua_cocos2dx_Animate3D_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (Animate3D)"); + return 0; +} + +int lua_register_cocos2dx_Animate3D(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"cc.Animate3D"); + tolua_cclass(tolua_S,"Animate3D","cc.Animate3D","cc.ActionInterval",nullptr); + + tolua_beginmodule(tolua_S,"Animate3D"); + tolua_function(tolua_S,"setPlayBack",lua_cocos2dx_Animate3D_setPlayBack); + tolua_function(tolua_S,"setSpeed",lua_cocos2dx_Animate3D_setSpeed); + tolua_function(tolua_S,"getPlayBack",lua_cocos2dx_Animate3D_getPlayBack); + tolua_function(tolua_S,"getSpeed",lua_cocos2dx_Animate3D_getSpeed); + tolua_function(tolua_S,"create", lua_cocos2dx_Animate3D_create); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocos2d::Animate3D).name(); + g_luaType[typeName] = "cc.Animate3D"; + g_typeCast["Animate3D"] = "cc.Animate3D"; + return 1; +} TOLUA_API int register_all_cocos2dx(lua_State* tolua_S) { tolua_open(tolua_S); @@ -64180,6 +64529,7 @@ TOLUA_API int register_all_cocos2dx(lua_State* tolua_S) lua_register_cocos2dx_Spawn(tolua_S); lua_register_cocos2dx_EaseQuarticActionInOut(tolua_S); lua_register_cocos2dx_GLProgramState(tolua_S); + lua_register_cocos2dx_Animation3D(tolua_S); lua_register_cocos2dx_PageTurn3D(tolua_S); lua_register_cocos2dx_TransitionSlideInL(tolua_S); lua_register_cocos2dx_TransitionSlideInT(tolua_S); @@ -64218,6 +64568,7 @@ TOLUA_API int register_all_cocos2dx(lua_State* tolua_S) lua_register_cocos2dx_ParticleRain(tolua_S); lua_register_cocos2dx_Waves(tolua_S); lua_register_cocos2dx_EaseOut(tolua_S); + lua_register_cocos2dx_Animate3D(tolua_S); lua_register_cocos2dx_MenuItemFont(tolua_S); lua_register_cocos2dx_TransitionFadeUp(tolua_S); lua_register_cocos2dx_EaseSineOut(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index 44a7ca4c4b..b87c20bc2b 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -1542,6 +1542,15 @@ int register_all_cocos2dx(lua_State* tolua_S); + + + + + + + + + diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp index 3cbd51b0c5..10de1fbfd3 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp @@ -500,6 +500,58 @@ int lua_cocos2dx_studio_ActionObject_getLoop(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionObject_initWithBinary(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::ActionObject* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionObject",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::ActionObject*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionObject_initWithBinary'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 3) + { + cocostudio::CocoLoader* arg0; + cocostudio::stExpCocoNode* arg1; + cocos2d::Ref* arg2; + + ok &= luaval_to_object(tolua_S, 2, "ccs.CocoLoader",&arg0); + + #pragma warning NO CONVERSION TO NATIVE FOR stExpCocoNode*; + + ok &= luaval_to_object(tolua_S, 4, "cc.Ref",&arg2); + if(!ok) + return 0; + cobj->initWithBinary(arg0, arg1, arg2); + return 0; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "initWithBinary",argc, 3); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionObject_initWithBinary'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionObject_addActionNode(lua_State* tolua_S) { int argc = 0; @@ -830,6 +882,7 @@ int lua_register_cocos2dx_studio_ActionObject(lua_State* tolua_S) tolua_function(tolua_S,"getCurrentTime",lua_cocos2dx_studio_ActionObject_getCurrentTime); tolua_function(tolua_S,"removeActionNode",lua_cocos2dx_studio_ActionObject_removeActionNode); tolua_function(tolua_S,"getLoop",lua_cocos2dx_studio_ActionObject_getLoop); + tolua_function(tolua_S,"initWithBinary",lua_cocos2dx_studio_ActionObject_initWithBinary); tolua_function(tolua_S,"addActionNode",lua_cocos2dx_studio_ActionObject_addActionNode); tolua_function(tolua_S,"getUnitTime",lua_cocos2dx_studio_ActionObject_getUnitTime); tolua_function(tolua_S,"isPlaying",lua_cocos2dx_studio_ActionObject_isPlaying); @@ -960,6 +1013,61 @@ int lua_cocos2dx_studio_ActionManagerEx_getActionByName(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionManagerEx_initWithBinary(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::ActionManagerEx* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionManagerEx",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::ActionManagerEx*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionManagerEx_initWithBinary'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 4) + { + const char* arg0; + cocos2d::Ref* arg1; + cocostudio::CocoLoader* arg2; + cocostudio::stExpCocoNode* arg3; + + std::string arg0_tmp; ok &= luaval_to_std_string(tolua_S, 2, &arg0_tmp); arg0 = arg0_tmp.c_str(); + + ok &= luaval_to_object(tolua_S, 3, "cc.Ref",&arg1); + + ok &= luaval_to_object(tolua_S, 4, "ccs.CocoLoader",&arg2); + + #pragma warning NO CONVERSION TO NATIVE FOR stExpCocoNode*; + if(!ok) + return 0; + cobj->initWithBinary(arg0, arg1, arg2, arg3); + return 0; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "initWithBinary",argc, 4); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionManagerEx_initWithBinary'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionManagerEx_releaseActions(lua_State* tolua_S) { int argc = 0; @@ -1078,6 +1186,7 @@ int lua_register_cocos2dx_studio_ActionManagerEx(lua_State* tolua_S) tolua_beginmodule(tolua_S,"ActionManagerEx"); tolua_function(tolua_S,"playActionByName",lua_cocos2dx_studio_ActionManagerEx_playActionByName); tolua_function(tolua_S,"getActionByName",lua_cocos2dx_studio_ActionManagerEx_getActionByName); + tolua_function(tolua_S,"initWithBinary",lua_cocos2dx_studio_ActionManagerEx_initWithBinary); tolua_function(tolua_S,"releaseActions",lua_cocos2dx_studio_ActionManagerEx_releaseActions); tolua_function(tolua_S,"destroyInstance", lua_cocos2dx_studio_ActionManagerEx_destroyInstance); tolua_function(tolua_S,"getInstance", lua_cocos2dx_studio_ActionManagerEx_getInstance); @@ -12155,6 +12264,53 @@ int lua_cocos2dx_studio_GUIReader_getFilePath(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_GUIReader_widgetFromBinaryFile(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::GUIReader* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.GUIReader",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::GUIReader*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_GUIReader_widgetFromBinaryFile'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + const char* arg0; + + std::string arg0_tmp; ok &= luaval_to_std_string(tolua_S, 2, &arg0_tmp); arg0 = arg0_tmp.c_str(); + if(!ok) + return 0; + cocos2d::ui::Widget* ret = cobj->widgetFromBinaryFile(arg0); + object_to_luaval(tolua_S, "ccui.Widget",(cocos2d::ui::Widget*)ret); + return 1; + } + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "widgetFromBinaryFile",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_GUIReader_widgetFromBinaryFile'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_GUIReader_getVersionInteger(lua_State* tolua_S) { int argc = 0; @@ -12278,6 +12434,7 @@ int lua_register_cocos2dx_studio_GUIReader(lua_State* tolua_S) tolua_function(tolua_S,"setFilePath",lua_cocos2dx_studio_GUIReader_setFilePath); tolua_function(tolua_S,"widgetFromJsonFile",lua_cocos2dx_studio_GUIReader_widgetFromJsonFile); tolua_function(tolua_S,"getFilePath",lua_cocos2dx_studio_GUIReader_getFilePath); + tolua_function(tolua_S,"widgetFromBinaryFile",lua_cocos2dx_studio_GUIReader_widgetFromBinaryFile); tolua_function(tolua_S,"getVersionInteger",lua_cocos2dx_studio_GUIReader_getVersionInteger); tolua_function(tolua_S,"destroyInstance", lua_cocos2dx_studio_GUIReader_destroyInstance); tolua_function(tolua_S,"getInstance", lua_cocos2dx_studio_GUIReader_getInstance); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp index edc1c84387..d18f6d1b03 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp @@ -305,6 +305,9 @@ int register_all_cocos2dx_studio(lua_State* tolua_S); + + + From d9c99e62517b4555c0f4568d9d1968f429515181 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 24 Jun 2014 10:47:50 +0800 Subject: [PATCH 66/72] [ci skip] --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index bf917d70d2..b7961aab38 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ cocos2d-x-3.2 ??? [NEW] Label: support setting line height and additional kerning of label that not using system font [NEW] Lua-binding: Animation3D supported [NEW] Node: added getName(), setName(), getChildByName(), enumerateChildren() + [NEW] Node: physical body supports rotation [FIX] FileUtils: getStringFromFile may return a unterminated string From 7f104f4bf7e72ba21d0f868ddaa754e2d6ffe123 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 24 Jun 2014 02:47:56 +0000 Subject: [PATCH 67/72] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 2593c3a025..5a81bbfe86 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -3531,7 +3531,9 @@ "cocos/scripting/lua-bindings/auto/api/ActionTimelineData.lua", "cocos/scripting/lua-bindings/auto/api/ActionTween.lua", "cocos/scripting/lua-bindings/auto/api/Animate.lua", + "cocos/scripting/lua-bindings/auto/api/Animate3D.lua", "cocos/scripting/lua-bindings/auto/api/Animation.lua", + "cocos/scripting/lua-bindings/auto/api/Animation3D.lua", "cocos/scripting/lua-bindings/auto/api/AnimationCache.lua", "cocos/scripting/lua-bindings/auto/api/AnimationData.lua", "cocos/scripting/lua-bindings/auto/api/AnimationFrame.lua", From aa7e48794b517306a5ce64e1c6891fc3071ed62b Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 24 Jun 2014 10:50:09 +0800 Subject: [PATCH 68/72] [ci skip] --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index b7961aab38..21cc95aefe 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,7 @@ cocos2d-x-3.2 ??? [FIX] FileUtils: getStringFromFile may return a unterminated string [FIX] Lua-binding: Sequence:create will cause drop-dead issue + [FIX] Studio support: NodeReader may cause crash [FIX] UIButton: doesn't support TTF font [FIX] UIListView: addEventListener can not work From 3336f7edadb7b5ffa37fde8f9ad12f2102c10de7 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 24 Jun 2014 14:31:55 +0800 Subject: [PATCH 69/72] use reference instead --- cocos/2d/CCSprite.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index cc04c47c47..c616626f13 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -521,8 +521,8 @@ void Sprite::updateTransform(void) else { CCASSERT( dynamic_cast(_parent), "Logic error in Sprite. Parent must be a Sprite"); - Mat4 nodeToParent = getNodeToParentTransform(); - Mat4 parentTransform = static_cast(_parent)->_transformToBatch; + const Mat4 &nodeToParent = getNodeToParentTransform(); + Mat4 &parentTransform = static_cast(_parent)->_transformToBatch; _transformToBatch = parentTransform * nodeToParent; } From 4d826737608b445281747d81bbbfc7b23a635a62 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 24 Jun 2014 15:08:58 +0800 Subject: [PATCH 70/72] issue #5161, replace _size with _contentSize --- cocos/ui/UIRichText.cpp | 4 ++-- cocos/ui/UIWidget.cpp | 24 +++++++++++------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/cocos/ui/UIRichText.cpp b/cocos/ui/UIRichText.cpp index 03e59cb301..97ca400d27 100644 --- a/cocos/ui/UIRichText.cpp +++ b/cocos/ui/UIRichText.cpp @@ -430,11 +430,11 @@ void RichText::formarRenderers() if (_ignoreSize) { Size s = getVirtualRendererSize(); - _contentSize = s; + this->setContentSize(s); } else { - _contentSize = _customSize; + this->setContentSize(_customSize); } updateContentSizeWithTextureSize(_contentSize); _elementRenderersContainer->setPosition(_contentSize.width / 2.0f, _contentSize.height / 2.0f); diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index 8a47bdaee9..1041ff9fc7 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -201,7 +201,6 @@ bool Widget::init() { if (ProtectedNode::init()) { - _contentSize = Size::ZERO; initRenderer(); setBright(true); onFocusChanged = CC_CALLBACK_2(Widget::onFocusChange,this); @@ -256,7 +255,6 @@ void Widget::setContentSize(const cocos2d::Size &contentSize) { ProtectedNode::setContentSize(contentSize); - _customSize = contentSize; if (_ignoreSize) { @@ -316,11 +314,11 @@ void Widget::setSizePercent(const Vec2 &percent) } if (_ignoreSize) { - _contentSize = getVirtualRendererSize(); + this->setContentSize(getVirtualRendererSize()); } else { - _contentSize = cSize; + this->setContentSize(cSize); } _customSize = cSize; onSizeChanged(); @@ -341,11 +339,11 @@ void Widget::updateSizeAndPosition(const cocos2d::Size &parentSize) { if (_ignoreSize) { - _contentSize = getVirtualRendererSize(); + this->setContentSize(getVirtualRendererSize()); } else { - _contentSize = _customSize; + this->setContentSize(_customSize); } float spx = 0.0f; float spy = 0.0f; @@ -365,11 +363,11 @@ void Widget::updateSizeAndPosition(const cocos2d::Size &parentSize) Size cSize = Size(parentSize.width * _sizePercent.x , parentSize.height * _sizePercent.y); if (_ignoreSize) { - _contentSize = getVirtualRendererSize(); + this->setContentSize(getVirtualRendererSize()); } else { - _contentSize = cSize; + this->setContentSize(cSize); } _customSize = cSize; break; @@ -424,11 +422,11 @@ void Widget::ignoreContentAdaptWithSize(bool ignore) if (_ignoreSize) { Size s = getVirtualRendererSize(); - _contentSize = s; + this->setContentSize(s); } else { - _contentSize = _customSize; + this->setContentSize(_customSize); } onSizeChanged(); } @@ -484,11 +482,11 @@ void Widget::updateContentSizeWithTextureSize(const cocos2d::Size &size) { if (_ignoreSize) { - _contentSize = size; + this->setContentSize(size); } else { - _contentSize = _customSize; + this->setContentSize(_customSize); } onSizeChanged(); } @@ -1010,7 +1008,7 @@ void Widget::copyProperties(Widget *widget) setName(widget->getName()); setActionTag(widget->getActionTag()); _ignoreSize = widget->_ignoreSize; - _contentSize = widget->_contentSize; + this->setContentSize(widget->_contentSize); _customSize = widget->_customSize; _sizeType = widget->getSizeType(); _sizePercent = widget->_sizePercent; From 7155eb4ebbd0d49793b2d962ce4be6d5dcd40218 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 24 Jun 2014 18:23:10 +0800 Subject: [PATCH 71/72] use reference instead --- cocos/2d/CCSprite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index c616626f13..489a386a71 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -530,7 +530,7 @@ void Sprite::updateTransform(void) // calculate the Quad based on the Affine Matrix // - Size size = _rect.size; + Size &size = _rect.size; float x1 = _offsetPosition.x; float y1 = _offsetPosition.y; From 2cd212b1b02117008e78570bc9ac17673cbbca54 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 24 Jun 2014 10:48:02 +0000 Subject: [PATCH 72/72] [AUTO]: updating luabinding automatically --- .../lua-bindings/auto/api/Widget.lua | 19 ++-- .../auto/lua_cocos2dx_ui_auto.cpp | 106 ++---------------- .../auto/lua_cocos2dx_ui_auto.hpp | 2 - 3 files changed, 14 insertions(+), 113 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/api/Widget.lua b/cocos/scripting/lua-bindings/auto/api/Widget.lua index 90efd001e2..49af59f421 100644 --- a/cocos/scripting/lua-bindings/auto/api/Widget.lua +++ b/cocos/scripting/lua-bindings/auto/api/Widget.lua @@ -29,9 +29,9 @@ -- @return Node#Node ret (return value: cc.Node) -------------------------------- --- @function [parent=#Widget] getSize +-- @function [parent=#Widget] getSizePercent -- @param self --- @return size_table#size_table ret (return value: size_table) +-- @return vec2_table#vec2_table ret (return value: vec2_table) -------------------------------- -- @function [parent=#Widget] setPositionPercent @@ -203,11 +203,6 @@ -- @param self -- @param #size_table size --------------------------------- --- @function [parent=#Widget] getSizePercent --- @param self --- @return vec2_table#vec2_table ret (return value: vec2_table) - -------------------------------- -- @function [parent=#Widget] getTouchMovePosition -- @param self @@ -260,11 +255,6 @@ -- @param self -- @param #ccui.Widget::SizeType sizetype --------------------------------- --- @function [parent=#Widget] setSize --- @param self --- @param #size_table size - -------------------------------- -- @function [parent=#Widget] setBright -- @param self @@ -295,6 +285,11 @@ -- @param self -- @param #vec2_table vec2 +-------------------------------- +-- @function [parent=#Widget] setContentSize +-- @param self +-- @param #size_table size + -------------------------------- -- @function [parent=#Widget] Widget -- @param self diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp index 0a8a23aeff..23e22bba47 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp @@ -1039,7 +1039,7 @@ int lua_cocos2dx_ui_Widget_getVirtualRenderer(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_Widget_getSize(lua_State* tolua_S) +int lua_cocos2dx_ui_Widget_getSizePercent(lua_State* tolua_S) { int argc = 0; cocos2d::ui::Widget* cobj = nullptr; @@ -1059,7 +1059,7 @@ int lua_cocos2dx_ui_Widget_getSize(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Widget_getSize'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Widget_getSizePercent'", nullptr); return 0; } #endif @@ -1069,16 +1069,16 @@ int lua_cocos2dx_ui_Widget_getSize(lua_State* tolua_S) { if(!ok) return 0; - const cocos2d::Size& ret = cobj->getSize(); - size_to_luaval(tolua_S, ret); + const cocos2d::Vec2& ret = cobj->getSizePercent(); + vec2_to_luaval(tolua_S, ret); return 1; } - CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getSize",argc, 0); + CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getSizePercent",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Widget_getSize'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Widget_getSizePercent'.",&tolua_err); #endif return 0; @@ -2567,50 +2567,6 @@ int lua_cocos2dx_ui_Widget_updateSizeAndPosition(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_Widget_getSizePercent(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::Widget* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.Widget",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::Widget*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Widget_getSizePercent'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - return 0; - const cocos2d::Vec2& ret = cobj->getSizePercent(); - vec2_to_luaval(tolua_S, ret); - return 1; - } - CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getSizePercent",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Widget_getSizePercent'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_ui_Widget_getTouchMovePosition(lua_State* tolua_S) { int argc = 0; @@ -3065,52 +3021,6 @@ int lua_cocos2dx_ui_Widget_setSizeType(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_Widget_setSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::Widget* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.Widget",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::Widget*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Widget_setSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Size arg0; - - ok &= luaval_to_size(tolua_S, 2, &arg0); - if(!ok) - return 0; - cobj->setSize(arg0); - return 0; - } - CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "setSize",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Widget_setSize'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_ui_Widget_setBright(lua_State* tolua_S) { int argc = 0; @@ -3316,7 +3226,7 @@ int lua_register_cocos2dx_ui_Widget(lua_State* tolua_S) tolua_function(tolua_S,"setFlippedY",lua_cocos2dx_ui_Widget_setFlippedY); tolua_function(tolua_S,"setFlippedX",lua_cocos2dx_ui_Widget_setFlippedX); tolua_function(tolua_S,"getVirtualRenderer",lua_cocos2dx_ui_Widget_getVirtualRenderer); - tolua_function(tolua_S,"getSize",lua_cocos2dx_ui_Widget_getSize); + tolua_function(tolua_S,"getSizePercent",lua_cocos2dx_ui_Widget_getSizePercent); tolua_function(tolua_S,"setPositionPercent",lua_cocos2dx_ui_Widget_setPositionPercent); tolua_function(tolua_S,"getLayoutSize",lua_cocos2dx_ui_Widget_getLayoutSize); tolua_function(tolua_S,"setHighlighted",lua_cocos2dx_ui_Widget_setHighlighted); @@ -3350,7 +3260,6 @@ int lua_register_cocos2dx_ui_Widget(lua_State* tolua_S) tolua_function(tolua_S,"getCurrentFocusedWidget",lua_cocos2dx_ui_Widget_getCurrentFocusedWidget); tolua_function(tolua_S,"requestFocus",lua_cocos2dx_ui_Widget_requestFocus); tolua_function(tolua_S,"updateSizeAndPosition",lua_cocos2dx_ui_Widget_updateSizeAndPosition); - tolua_function(tolua_S,"getSizePercent",lua_cocos2dx_ui_Widget_getSizePercent); tolua_function(tolua_S,"getTouchMovePosition",lua_cocos2dx_ui_Widget_getTouchMovePosition); tolua_function(tolua_S,"getSizeType",lua_cocos2dx_ui_Widget_getSizeType); tolua_function(tolua_S,"addTouchEventListener",lua_cocos2dx_ui_Widget_addTouchEventListener); @@ -3361,7 +3270,6 @@ int lua_register_cocos2dx_ui_Widget(lua_State* tolua_S) tolua_function(tolua_S,"isFlippedY",lua_cocos2dx_ui_Widget_isFlippedY); tolua_function(tolua_S,"isClippingParentContainsPoint",lua_cocos2dx_ui_Widget_isClippingParentContainsPoint); tolua_function(tolua_S,"setSizeType",lua_cocos2dx_ui_Widget_setSizeType); - tolua_function(tolua_S,"setSize",lua_cocos2dx_ui_Widget_setSize); tolua_function(tolua_S,"setBright",lua_cocos2dx_ui_Widget_setBright); tolua_function(tolua_S,"isFocusEnabled",lua_cocos2dx_ui_Widget_isFocusEnabled); tolua_function(tolua_S,"enableDpadNavigation", lua_cocos2dx_ui_Widget_enableDpadNavigation); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp index ee7cd91061..075036bb49 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp @@ -384,8 +384,6 @@ int register_all_cocos2dx_ui(lua_State* tolua_S); - -