mirror of https://github.com/axmolengine/axmol.git
fix: Label updateColor() and underline color work as expected (#16486)
fixes Github issue #15214 correctly. underline uses _displayColor and not _textColorF. _textColorF is only for the text. This also emulates the SystemFont underline behavior fixes Github issue #16471
This commit is contained in:
parent
e0900e09dd
commit
e57c30c83b
|
@ -1409,6 +1409,7 @@ void Label::updateContent()
|
||||||
|
|
||||||
if (_numberOfLines)
|
if (_numberOfLines)
|
||||||
{
|
{
|
||||||
|
// This is the logic for TTF fonts
|
||||||
const float charheight = (_textDesiredHeight / _numberOfLines);
|
const float charheight = (_textDesiredHeight / _numberOfLines);
|
||||||
_underlineNode->setLineWidth(charheight/6);
|
_underlineNode->setLineWidth(charheight/6);
|
||||||
|
|
||||||
|
@ -1420,12 +1421,15 @@ void Label::updateContent()
|
||||||
offsety += charheight / 2;
|
offsety += charheight / 2;
|
||||||
// FIXME: Might not work with different vertical alignments
|
// FIXME: Might not work with different vertical alignments
|
||||||
float y = (_numberOfLines - i - 1) * charheight + offsety;
|
float y = (_numberOfLines - i - 1) * charheight + offsety;
|
||||||
_underlineNode->drawLine(Vec2(_linesOffsetX[i],y), Vec2(_linesWidth[i] + _linesOffsetX[i],y), _textColorF);
|
|
||||||
|
// Github issue #15214. Uses _displayedColor instead of _textColor for the underline.
|
||||||
|
// This is to have the same behavior of SystemFonts.
|
||||||
|
_underlineNode->drawLine(Vec2(_linesOffsetX[i],y), Vec2(_linesWidth[i] + _linesOffsetX[i],y), Color4F(_displayedColor));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (_textSprite)
|
else if (_textSprite)
|
||||||
{
|
{
|
||||||
// system font
|
// ...and is the logic for System fonts
|
||||||
float y = 0;
|
float y = 0;
|
||||||
const auto spriteSize = _textSprite->getContentSize();
|
const auto spriteSize = _textSprite->getContentSize();
|
||||||
_underlineNode->setLineWidth(spriteSize.height/6);
|
_underlineNode->setLineWidth(spriteSize.height/6);
|
||||||
|
@ -1896,9 +1900,6 @@ void Label::updateDisplayedColor(const Color3B& parentColor)
|
||||||
{
|
{
|
||||||
Node::updateDisplayedColor(parentColor);
|
Node::updateDisplayedColor(parentColor);
|
||||||
|
|
||||||
if (_currentLabelType == LabelType::TTF || _currentLabelType == LabelType::STRING_TEXTURE)
|
|
||||||
setTextColor(Color4B(_displayedColor));
|
|
||||||
|
|
||||||
if (_textSprite)
|
if (_textSprite)
|
||||||
{
|
{
|
||||||
_textSprite->updateDisplayedColor(_displayedColor);
|
_textSprite->updateDisplayedColor(_displayedColor);
|
||||||
|
@ -1911,6 +1912,11 @@ void Label::updateDisplayedColor(const Color3B& parentColor)
|
||||||
|
|
||||||
if (_underlineNode)
|
if (_underlineNode)
|
||||||
{
|
{
|
||||||
|
// FIXME: _underlineNode is not a sprite/label. It is a DrawNode
|
||||||
|
// and updating its color doesn't work. it must be re-drawn,
|
||||||
|
// which makes it super expensive to change update it frequently
|
||||||
|
// Correct solution is to update the DrawNode directly since we know it is
|
||||||
|
// a line. Returning a pointer to the line is an option
|
||||||
_contentDirty = true;
|
_contentDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,6 +109,7 @@ NewLabelTests::NewLabelTests()
|
||||||
|
|
||||||
ADD_TEST_CASE(LabelIssue15214);
|
ADD_TEST_CASE(LabelIssue15214);
|
||||||
ADD_TEST_CASE(LabelIssue16293);
|
ADD_TEST_CASE(LabelIssue16293);
|
||||||
|
ADD_TEST_CASE(LabelIssue16471);
|
||||||
};
|
};
|
||||||
|
|
||||||
LabelFNTColorAndOpacity::LabelFNTColorAndOpacity()
|
LabelFNTColorAndOpacity::LabelFNTColorAndOpacity()
|
||||||
|
@ -3153,25 +3154,45 @@ void LabelLocalizationTest::onChangedRadioButtonSelect(RadioButton* radioButton,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LabelBMFontBinaryFormat
|
//
|
||||||
|
// LabelIssue15214
|
||||||
|
//
|
||||||
LabelIssue15214::LabelIssue15214()
|
LabelIssue15214::LabelIssue15214()
|
||||||
{
|
{
|
||||||
auto size = Director::getInstance()->getVisibleSize();
|
auto size = Director::getInstance()->getVisibleSize();
|
||||||
Label* label = Label::createWithTTF("CHECK!", "fonts/arial.ttf", 48.0f);
|
|
||||||
|
// 1
|
||||||
|
Label* label = Label::createWithTTF("TTF with setColor()", "fonts/arial.ttf", 24.0f);
|
||||||
label->enableUnderline();
|
label->enableUnderline();
|
||||||
label->setColor(cocos2d::Color3B::BLUE);
|
label->setColor(cocos2d::Color3B::BLUE);
|
||||||
label->setPosition(size.width/2, size.height/3*2);
|
label->setPosition(size.width/2, size.height/5*4);
|
||||||
this->addChild(label);
|
|
||||||
label = Label::createWithSystemFont("CHECK!", "Verdana", 48.0f);
|
|
||||||
label->enableUnderline();
|
|
||||||
label->setColor(cocos2d::Color3B::BLUE);
|
|
||||||
label->setPosition(size.width/2, size.height/3*1);
|
|
||||||
this->addChild(label);
|
this->addChild(label);
|
||||||
|
|
||||||
|
// 2
|
||||||
|
Label* label2 = Label::createWithSystemFont("System with setColor()", "Verdana", 24.0f);
|
||||||
|
label2->enableUnderline();
|
||||||
|
label2->setColor(cocos2d::Color3B::BLUE);
|
||||||
|
label2->setPosition(size.width/2, size.height/5*3);
|
||||||
|
this->addChild(label2);
|
||||||
|
|
||||||
|
// 3
|
||||||
|
Label* label3 = Label::createWithTTF("TTF with setTextColor()", "fonts/arial.ttf", 24.0f);
|
||||||
|
label3->enableUnderline();
|
||||||
|
label3->setTextColor(Color4B::BLUE);
|
||||||
|
label3->setPosition(size.width/2, size.height/5*2);
|
||||||
|
this->addChild(label3);
|
||||||
|
|
||||||
|
// 4
|
||||||
|
Label* label4 = Label::createWithSystemFont("System with setTextColor()", "Verdana", 24.0f);
|
||||||
|
label4->enableUnderline();
|
||||||
|
label4->setTextColor(Color4B::BLUE);
|
||||||
|
label4->setPosition(size.width/2, size.height/5*1);
|
||||||
|
this->addChild(label4);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LabelIssue15214::title() const
|
std::string LabelIssue15214::title() const
|
||||||
{
|
{
|
||||||
return "Githug Issue 15214";
|
return "Github Issue 15214";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LabelIssue15214::subtitle() const
|
std::string LabelIssue15214::subtitle() const
|
||||||
|
@ -3179,7 +3200,9 @@ std::string LabelIssue15214::subtitle() const
|
||||||
return "Font and underline should be of the same color";
|
return "Font and underline should be of the same color";
|
||||||
}
|
}
|
||||||
|
|
||||||
// LabelBMFontBinaryFormat
|
//
|
||||||
|
// LabelIssue16293
|
||||||
|
//
|
||||||
LabelIssue16293::LabelIssue16293()
|
LabelIssue16293::LabelIssue16293()
|
||||||
{
|
{
|
||||||
auto size = Director::getInstance()->getVisibleSize();
|
auto size = Director::getInstance()->getVisibleSize();
|
||||||
|
@ -3190,10 +3213,45 @@ LabelIssue16293::LabelIssue16293()
|
||||||
|
|
||||||
std::string LabelIssue16293::title() const
|
std::string LabelIssue16293::title() const
|
||||||
{
|
{
|
||||||
return "Githug Issue 16293";
|
return "Github Issue 16293";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LabelIssue16293::subtitle() const
|
std::string LabelIssue16293::subtitle() const
|
||||||
{
|
{
|
||||||
return "No TextureAtlas resizes";
|
return "No TextureAtlas resizes";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// LabelIssue16471
|
||||||
|
//
|
||||||
|
LabelIssue16471::LabelIssue16471()
|
||||||
|
{
|
||||||
|
auto size = Director::getInstance()->getVisibleSize();
|
||||||
|
|
||||||
|
auto node = Node::create();
|
||||||
|
addChild(node, 100);
|
||||||
|
node->setPosition(size.width/2, size.height/2);
|
||||||
|
|
||||||
|
// Used Google Translate to translate from Chinese:
|
||||||
|
// Here is set to false then textLabel: TextColor valid
|
||||||
|
// set to true testLabel: setTextColor invalid
|
||||||
|
// Original:
|
||||||
|
// 此处设置为false则testLabel:setTextColor有效
|
||||||
|
// 设置为true则testLabel:setTextColor无效
|
||||||
|
// if set false then testLabel:setTextColor is useful
|
||||||
|
node->setCascadeColorEnabled(true);
|
||||||
|
Label* label = Label::createWithTTF("Should be Yellow", "fonts/arial.ttf", 12);
|
||||||
|
label->setTextColor(Color4B::YELLOW);
|
||||||
|
node->addChild(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string LabelIssue16471::title() const
|
||||||
|
{
|
||||||
|
return "Github Issue 16471";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string LabelIssue16471::subtitle() const
|
||||||
|
{
|
||||||
|
return "Label should be yellow";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -872,4 +872,15 @@ public:
|
||||||
virtual std::string subtitle() const override;
|
virtual std::string subtitle() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class LabelIssue16471 : public AtlasDemoNew
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CREATE_FUNC(LabelIssue16471);
|
||||||
|
|
||||||
|
LabelIssue16471();
|
||||||
|
|
||||||
|
virtual std::string title() const override;
|
||||||
|
virtual std::string subtitle() const override;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue