Add test wrap unicode text (#18570)

* fix LabelFNTMultiLineAlignment test

* Added test for unicode text wrap
This commit is contained in:
Dimon4eg 2018-01-10 11:01:19 +02:00 committed by minggo
parent b2ecbca549
commit 3d63730c06
4 changed files with 194 additions and 76 deletions

View File

@ -43,6 +43,7 @@ NewLabelTests::NewLabelTests()
ADD_TEST_CASE(LabelFNTMultiLine); ADD_TEST_CASE(LabelFNTMultiLine);
ADD_TEST_CASE(LabelFNTRetina); ADD_TEST_CASE(LabelFNTRetina);
ADD_TEST_CASE(LabelFNTMultiLineAlignment); ADD_TEST_CASE(LabelFNTMultiLineAlignment);
ADD_TEST_CASE(LabelFNTMultiLineAlignmentUNICODE);
ADD_TEST_CASE(LabelFNTUNICODELanguages); ADD_TEST_CASE(LabelFNTUNICODELanguages);
ADD_TEST_CASE(LabelFNTBounds); ADD_TEST_CASE(LabelFNTBounds);
ADD_TEST_CASE(LabelFNTandTTFEmpty); ADD_TEST_CASE(LabelFNTandTTFEmpty);
@ -556,8 +557,13 @@ std::string LabelFNTGlyphDesigner::subtitle() const
static float alignmentItemPadding = 50; static float alignmentItemPadding = 50;
static float menuItemPaddingCenter = 50; static float menuItemPaddingCenter = 50;
LabelFNTMultiLineAlignment::LabelFNTMultiLineAlignment() bool LabelFNTMultiLineAlignment::init()
{ {
if (!AtlasDemoNew::init())
{
return false;
}
auto listener = EventListenerTouchAllAtOnce::create(); auto listener = EventListenerTouchAllAtOnce::create();
listener->onTouchesBegan = CC_CALLBACK_2(LabelFNTMultiLineAlignment::onTouchesBegan, this); listener->onTouchesBegan = CC_CALLBACK_2(LabelFNTMultiLineAlignment::onTouchesBegan, this);
listener->onTouchesMoved = CC_CALLBACK_2(LabelFNTMultiLineAlignment::onTouchesMoved, this); listener->onTouchesMoved = CC_CALLBACK_2(LabelFNTMultiLineAlignment::onTouchesMoved, this);
@ -568,13 +574,10 @@ LabelFNTMultiLineAlignment::LabelFNTMultiLineAlignment()
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
// create and initialize a Label // create and initialize a Label
this->_labelShouldRetain = Label::createWithBMFont("fonts/markerFelt.fnt", LongSentencesExample, TextHAlignment::CENTER, size.width/1.5); this->_label = Label::createWithBMFont("fonts/markerFelt.fnt", "", TextHAlignment::CENTER, size.width/1.5);
this->_labelShouldRetain->retain();
this->_arrowsBarShouldRetain = Sprite::create("Images/arrowsBar.png"); this->_arrowsBar = Sprite::create("Images/arrowsBar.png");
this->_arrowsBarShouldRetain->retain(); this->_arrows = Sprite::create("Images/arrows.png");
this->_arrowsShouldRetain = Sprite::create("Images/arrows.png");
this->_arrowsShouldRetain->retain();
MenuItemFont::setFontSize(20); MenuItemFont::setFontSize(20);
auto longSentences = MenuItemFont::create("Long Flowing Sentences", CC_CALLBACK_1(LabelFNTMultiLineAlignment::stringChanged, this)); auto longSentences = MenuItemFont::create("Long Flowing Sentences", CC_CALLBACK_1(LabelFNTMultiLineAlignment::stringChanged, this));
@ -583,52 +586,50 @@ LabelFNTMultiLineAlignment::LabelFNTMultiLineAlignment()
auto stringMenu = Menu::create(longSentences, lineBreaks, mixed, nullptr); auto stringMenu = Menu::create(longSentences, lineBreaks, mixed, nullptr);
stringMenu->alignItemsVertically(); stringMenu->alignItemsVertically();
longSentences->setColor(Color3B::RED);
_lastSentenceItem = longSentences;
longSentences->setTag(LongSentences); longSentences->setTag(LongSentences);
lineBreaks->setTag(LineBreaks); lineBreaks->setTag(LineBreaks);
mixed->setTag(Mixed); mixed->setTag(Mixed);
_menuItems.push_back(longSentences);
_menuItems.push_back(lineBreaks);
_menuItems.push_back(mixed);
MenuItemFont::setFontSize(30); MenuItemFont::setFontSize(30);
auto left = MenuItemFont::create("Left", CC_CALLBACK_1(LabelFNTMultiLineAlignment::alignmentChanged, this)); auto left = MenuItemFont::create("Left", CC_CALLBACK_1(LabelFNTMultiLineAlignment::alignmentChanged, this));
auto center = MenuItemFont::create("Center", CC_CALLBACK_1(LabelFNTMultiLineAlignment::alignmentChanged, this)); auto center = MenuItemFont::create("Center", CC_CALLBACK_1(LabelFNTMultiLineAlignment::alignmentChanged, this));
auto right = MenuItemFont::create("Right", CC_CALLBACK_1(LabelFNTMultiLineAlignment::alignmentChanged, this)); auto right = MenuItemFont::create("Right", CC_CALLBACK_1(LabelFNTMultiLineAlignment::alignmentChanged, this));
auto alignmentMenu = Menu::create(left, center, right, nullptr); auto alignmentMenu = Menu::create(left, center, right, nullptr);
alignmentMenu->alignItemsHorizontallyWithPadding(alignmentItemPadding); alignmentMenu->alignItemsHorizontallyWithPadding(alignmentItemPadding);
center->setColor(Color3B::RED);
_lastAlignmentItem = center;
left->setTag(LeftAlign); left->setTag(LeftAlign);
center->setTag(CenterAlign); center->setTag(CenterAlign);
right->setTag(RightAlign); right->setTag(RightAlign);
// position the label on the center of the screen // position the label on the center of the screen
this->_labelShouldRetain->setPosition(Vec2(size.width/2, size.height/2)); this->_label->setPosition(Vec2(size.width/2, size.height/2));
this->_arrowsBarShouldRetain->setVisible(false); this->_arrowsBar->setVisible(false);
float arrowsWidth = (ArrowsMax - ArrowsMin) * size.width; float arrowsWidth = (ArrowsMax - ArrowsMin) * size.width;
this->_arrowsBarShouldRetain->setScaleX(arrowsWidth / this->_arrowsBarShouldRetain->getContentSize().width); this->_arrowsBar->setScaleX(arrowsWidth / this->_arrowsBar->getContentSize().width);
this->_arrowsBarShouldRetain->setPosition(Vec2(((ArrowsMax + ArrowsMin) / 2) * size.width, this->_labelShouldRetain->getPosition().y)); this->_arrowsBar->setPosition(Vec2(((ArrowsMax + ArrowsMin) / 2) * size.width, this->_label->getPosition().y));
this->snapArrowsToEdge();
stringMenu->setPosition(Vec2(size.width/2, size.height - menuItemPaddingCenter)); stringMenu->setPosition(Vec2(size.width/2, size.height - menuItemPaddingCenter));
alignmentMenu->setPosition(Vec2(size.width/2, menuItemPaddingCenter+15)); alignmentMenu->setPosition(Vec2(size.width/2, menuItemPaddingCenter+15));
this->addChild(this->_labelShouldRetain); this->selectSentenceItem(longSentences);
this->addChild(this->_arrowsBarShouldRetain); this->selectAlignmentItem(center);
this->addChild(this->_arrowsShouldRetain); this->snapArrowsToEdge();
this->addChild(this->_label);
this->addChild(this->_arrowsBar);
this->addChild(this->_arrows);
this->addChild(stringMenu); this->addChild(stringMenu);
this->addChild(alignmentMenu); this->addChild(alignmentMenu);
}
LabelFNTMultiLineAlignment::~LabelFNTMultiLineAlignment() return true;
{
this->_labelShouldRetain->release();
this->_arrowsBarShouldRetain->release();
this->_arrowsShouldRetain->release();
} }
std::string LabelFNTMultiLineAlignment::title() const std::string LabelFNTMultiLineAlignment::title() const
@ -641,28 +642,75 @@ std::string LabelFNTMultiLineAlignment::subtitle() const
return ""; return "";
} }
void LabelFNTMultiLineAlignment::stringChanged(cocos2d::Ref *sender) void LabelFNTMultiLineAlignment::selectAlignmentItem(cocos2d::MenuItemFont * item)
{ {
auto item = (MenuItemFont*)sender; if (this->_lastAlignmentItem && this->_lastAlignmentItem != item)
item->setColor(Color3B::RED);
this->_lastAlignmentItem->setColor(Color3B::WHITE);
this->_lastAlignmentItem = item;
switch(item->getTag())
{ {
case LongSentences: this->_lastAlignmentItem->setColor(Color3B::WHITE);
this->_labelShouldRetain->setString(LongSentencesExample); }
this->_lastAlignmentItem = item;
item->setColor(Color3B::RED);
switch (item->getTag())
{
case LeftAlign:
this->_label->setAlignment(TextHAlignment::LEFT);
break; break;
case LineBreaks: case CenterAlign:
this->_labelShouldRetain->setString(LineBreaksExample); this->_label->setAlignment(TextHAlignment::CENTER);
break; break;
case Mixed: case RightAlign:
this->_labelShouldRetain->setString(MixedExample); this->_label->setAlignment(TextHAlignment::RIGHT);
break; break;
default: default:
break; break;
} }
}
void LabelFNTMultiLineAlignment::selectSentenceItem(cocos2d::MenuItemFont* item)
{
if (this->_lastSentenceItem && this->_lastSentenceItem != item)
{
this->_lastSentenceItem->setColor(Color3B::WHITE);
}
this->_lastSentenceItem = item;
item->setColor(Color3B::RED);
auto str = this->getItemString(item);
this->_label->setString(str);
}
std::string LabelFNTMultiLineAlignment::getItemString(cocos2d::MenuItemFont* item)
{
std::string str;
switch (item->getTag())
{
case LongSentences:
str = LongSentencesExample;
break;
case LineBreaks:
str = LineBreaksExample;
break;
case Mixed:
str = MixedExample;
break;
default:
break;
}
return str;
}
void LabelFNTMultiLineAlignment::stringChanged(cocos2d::Ref *sender)
{
auto item = (MenuItemFont*)sender;
selectSentenceItem(item);
this->snapArrowsToEdge(); this->snapArrowsToEdge();
} }
@ -670,25 +718,8 @@ void LabelFNTMultiLineAlignment::stringChanged(cocos2d::Ref *sender)
void LabelFNTMultiLineAlignment::alignmentChanged(cocos2d::Ref *sender) void LabelFNTMultiLineAlignment::alignmentChanged(cocos2d::Ref *sender)
{ {
auto item = static_cast<MenuItemFont*>(sender); auto item = static_cast<MenuItemFont*>(sender);
item->setColor(Color3B::RED);
this->_lastAlignmentItem->setColor(Color3B::WHITE);
this->_lastAlignmentItem = item;
switch(item->getTag()) selectAlignmentItem(item);
{
case LeftAlign:
this->_labelShouldRetain->setAlignment(TextHAlignment::LEFT);
break;
case CenterAlign:
this->_labelShouldRetain->setAlignment(TextHAlignment::CENTER);
break;
case RightAlign:
this->_labelShouldRetain->setAlignment(TextHAlignment::RIGHT);
break;
default:
break;
}
this->snapArrowsToEdge(); this->snapArrowsToEdge();
} }
@ -698,10 +729,10 @@ void LabelFNTMultiLineAlignment::onTouchesBegan(const std::vector<Touch*>& touch
auto touch = touches[0]; auto touch = touches[0];
auto location = touch->getLocationInView(); auto location = touch->getLocationInView();
if (this->_arrowsShouldRetain->getBoundingBox().containsPoint(location)) if (this->_arrows->getBoundingBox().containsPoint(location))
{ {
_drag = true; _drag = true;
this->_arrowsBarShouldRetain->setVisible(true); this->_arrowsBar->setVisible(true);
} }
} }
@ -710,7 +741,7 @@ void LabelFNTMultiLineAlignment::onTouchesEnded(const std::vector<Touch*>& touch
_drag = false; _drag = false;
this->snapArrowsToEdge(); this->snapArrowsToEdge();
this->_arrowsBarShouldRetain->setVisible(false); this->_arrowsBar->setVisible(false);
} }
void LabelFNTMultiLineAlignment::onTouchesMoved(const std::vector<Touch*>& touches, cocos2d::Event *event) void LabelFNTMultiLineAlignment::onTouchesMoved(const std::vector<Touch*>& touches, cocos2d::Event *event)
@ -725,24 +756,83 @@ void LabelFNTMultiLineAlignment::onTouchesMoved(const std::vector<Touch*>& touch
auto winSize = Director::getInstance()->getWinSize(); auto winSize = Director::getInstance()->getWinSize();
this->_arrowsShouldRetain->setPosition(Vec2(MAX(MIN(location.x, ArrowsMax*winSize.width), ArrowsMin*winSize.width), this->_arrows->setPosition(Vec2(MAX(MIN(location.x, ArrowsMax*winSize.width), ArrowsMin*winSize.width),
this->_arrowsShouldRetain->getPosition().y)); this->_arrows->getPosition().y));
float labelWidth = fabs(this->_arrowsShouldRetain->getPosition().x - this->_labelShouldRetain->getPosition().x) * 2; float labelWidth = fabs(this->_arrows->getPosition().x - this->_label->getPosition().x) * 2;
this->_labelShouldRetain->setMaxLineWidth(labelWidth); this->_label->setMaxLineWidth(labelWidth);
} }
void LabelFNTMultiLineAlignment::snapArrowsToEdge() void LabelFNTMultiLineAlignment::snapArrowsToEdge()
{ {
this->_arrowsShouldRetain->setPosition(Vec2(this->_labelShouldRetain->getPosition().x + this->_labelShouldRetain->getContentSize().width/2, this->_arrows->setPosition(Vec2(this->_label->getPosition().x + this->_label->getContentSize().width/2,
this->_labelShouldRetain->getPosition().y)); this->_label->getPosition().y));
}
/// LabelFNTMultiLineAlignmentUNICODE
bool LabelFNTMultiLineAlignmentUNICODE::init()
{
if (!LabelFNTMultiLineAlignment::init())
{
return false;
}
this->_menuItems[0]->setString("French");
this->_menuItems[1]->setString("Spanish");
this->_menuItems[2]->setString("Ukrainian");
auto ttfConfig = this->_label->getTTFConfig();
ttfConfig.fontSize = 20;
ttfConfig.fontFilePath = "fonts/tahoma.ttf";
this->_label->setTTFConfig(ttfConfig);
this->selectSentenceItem(this->_menuItems[0]);
this->snapArrowsToEdge();
return true;
}
std::string LabelFNTMultiLineAlignmentUNICODE::title() const
{
return "";
}
std::string LabelFNTMultiLineAlignmentUNICODE::subtitle() const
{
return "";
}
std::string LabelFNTMultiLineAlignmentUNICODE::getItemString(cocos2d::MenuItemFont* item)
{
std::string str;
auto strings = FileUtils::getInstance()->getValueMapFromFile("strings/LabelFNTMultiLineAlignmentUNICODE.xml");
switch (item->getTag())
{
case LongSentences:
str = strings["french"].asString();
break;
case LineBreaks:
str = strings["spanish"].asString();
break;
case Mixed:
str = strings["ukrainian"].asString();
break;
default:
break;
}
return str;
} }
/// BMFontUnicodeNew /// BMFontUnicodeNew
LabelFNTUNICODELanguages::LabelFNTUNICODELanguages() LabelFNTUNICODELanguages::LabelFNTUNICODELanguages()
{ {
auto strings = FileUtils::getInstance()->getValueMapFromFile("fonts/strings.xml"); auto strings = FileUtils::getInstance()->getValueMapFromFile("strings/LabelFNTUNICODELanguages.xml");
std::string chinese = strings["chinese1"].asString(); std::string chinese = strings["chinese1"].asString();
std::string russian = strings["russian"].asString(); std::string russian = strings["russian"].asString();
std::string spanish = strings["spanish"].asString(); std::string spanish = strings["spanish"].asString();

View File

@ -142,8 +142,7 @@ class LabelFNTMultiLineAlignment : public AtlasDemoNew
public: public:
CREATE_FUNC(LabelFNTMultiLineAlignment); CREATE_FUNC(LabelFNTMultiLineAlignment);
LabelFNTMultiLineAlignment(); virtual bool init() override;
~LabelFNTMultiLineAlignment();
void snapArrowsToEdge(); void snapArrowsToEdge();
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
@ -152,13 +151,30 @@ public:
void onTouchesBegan(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event); void onTouchesBegan(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event);
void onTouchesEnded(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event); void onTouchesEnded(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event);
void onTouchesMoved(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event); void onTouchesMoved(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event);
void selectAlignmentItem(cocos2d::MenuItemFont* item);
void selectSentenceItem(cocos2d::MenuItemFont* item);
virtual std::string getItemString(cocos2d::MenuItemFont* item);
protected:
cocos2d::Label* _label = nullptr;
cocos2d::Sprite* _arrowsBar = nullptr;
cocos2d::Sprite* _arrows = nullptr;
std::vector<cocos2d::MenuItemFont*> _menuItems;
cocos2d::MenuItemFont *_lastSentenceItem = nullptr;
cocos2d::MenuItemFont *_lastAlignmentItem = nullptr;
bool _drag = false;
};
class LabelFNTMultiLineAlignmentUNICODE : public LabelFNTMultiLineAlignment
{
public: public:
cocos2d::Label* _labelShouldRetain; CREATE_FUNC(LabelFNTMultiLineAlignmentUNICODE);
cocos2d::Sprite* _arrowsBarShouldRetain;
cocos2d::Sprite* _arrowsShouldRetain; bool init() override;
cocos2d::MenuItemFont *_lastSentenceItem, *_lastAlignmentItem;
bool _drag; virtual std::string title() const override;
virtual std::string subtitle() const override;
virtual std::string getItemString(cocos2d::MenuItemFont* item) override;
}; };
class LabelFNTUNICODELanguages : public AtlasDemoNew class LabelFNTUNICODELanguages : public AtlasDemoNew

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>french</key>
<string>Loin, très loin, au delà des monts Mots, à mille lieues des pays Voyellie et Consonnia, demeurent les Bolos Bolos</string>
<key>spanish</key>
<string>Muy lejos, más allá de las montañas de palabras, alejados de los países de las vocales y las consonantes, viven</string>
<key>ukrainian</key>
<string>Далеко-далеко за словесними горами в країні голосних і приголосних живуть рибні тексти. Далеко від усіх живуть вони в буквених будинках</string>
</dict>
</plist>