Exemplo n.º 1
0
void RichText::handleTextRenderer(const char *text, const char *fontName, float fontSize, const Color3B &color, GLubyte opacity)
{
    Label* textRenderer = Label::create(text, fontName, fontSize);
    float textRendererWidth = textRenderer->getContentSize().width;
    _leftSpaceWidth -= textRendererWidth;
    if (_leftSpaceWidth < 0.0f)
    {
        float overstepPercent = (-_leftSpaceWidth) / textRendererWidth;
        std::string curText = text;
        size_t stringLength = _calcCharCount(text);
        int leftLength = stringLength * (1.0f - overstepPercent);
        std::string leftWords = curText.substr(0, leftLength);
        std::string cutWords = curText.substr(leftLength, curText.length()-1);
        if (leftLength > 0)
        {
            Label* leftRenderer = Label::create(leftWords.substr(0, leftLength).c_str(), fontName, fontSize);
            leftRenderer->setColor(color);
            leftRenderer->setOpacity(opacity);
            pushToContainer(leftRenderer);
        }

        addNewLine();
        handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity);
    }
    else
    {
        textRenderer->setColor(color);
        textRenderer->setOpacity(opacity);
        pushToContainer(textRenderer);
    }
}
Exemplo n.º 2
0
void RichText::handleTextRenderer(const std::string& text, const std::string& fontName, float fontSize, const Color3B &color, GLubyte opacity)
{
    auto fileExist = FileUtils::getInstance()->isFileExist(fontName);
    Label* textRenderer = nullptr;
    if (fileExist)
    {
        textRenderer = Label::createWithTTF(text, fontName, fontSize);
    } 
    else
    {
        textRenderer = Label::createWithSystemFont(text, fontName, fontSize);
    }
    float textRendererWidth = textRenderer->getContentSize().width;
    _leftSpaceWidth -= textRendererWidth;
    if (_leftSpaceWidth < 0.0f)
    {
        float overstepPercent = (-_leftSpaceWidth) / textRendererWidth;
        std::string curText = text;
        size_t stringLength = StringUtils::getCharacterCountInUTF8String(text);
        int leftLength = stringLength * (1.0f - overstepPercent);
        //The minimum cut length is 1, otherwise will cause the infinite loop.
        if (0 == leftLength) leftLength = 1;
        std::string leftWords = Helper::getSubStringOfUTF8String(curText,0,leftLength);
        std::string cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength);
        if (leftLength > 0)
        {
            Label* leftRenderer = nullptr;
            if (fileExist)
            {
                leftRenderer = Label::createWithTTF(Helper::getSubStringOfUTF8String(leftWords, 0, leftLength), fontName, fontSize);
            }
            else
            {
                leftRenderer = Label::createWithSystemFont(Helper::getSubStringOfUTF8String(leftWords, 0, leftLength), fontName, fontSize);
            }
            if (leftRenderer)
            {
                leftRenderer->setColor(color);
                leftRenderer->setOpacity(opacity);
                pushToContainer(leftRenderer);
            }
        }

        addNewLine();
        handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity);
    }
    else
    {
        textRenderer->setColor(color);
        textRenderer->setOpacity(opacity);
        pushToContainer(textRenderer);
    }
}
Exemplo n.º 3
0
void RichText::handleTextRenderer(const std::string& text, const std::string& fontName, float fontSize, const Color3B &color, GLubyte opacity)
{
    auto fileExist = FileUtils::getInstance()->isFileExist(fontName);
    Label* textRenderer = nullptr;
    if (fileExist)
    {
        textRenderer = Label::createWithTTF(text, fontName, fontSize);
    } 
    else
    {
        textRenderer = Label::createWithSystemFont(text, fontName, fontSize);
    }
    float textRendererWidth = textRenderer->getContentSize().width;
    _leftSpaceWidth -= textRendererWidth;
    if (_leftSpaceWidth < 0.0f)
    {
        float overstepPercent = (-_leftSpaceWidth) / textRendererWidth;
        std::string curText = text;
        size_t stringLength = _calcCharCount(text.c_str());
        int leftLength = stringLength * (1.0f - overstepPercent);
        std::string leftWords = curText.substr(0, leftLength);
        std::string cutWords = curText.substr(leftLength, curText.length()-1);
        if (leftLength > 0)
        {
            Label* leftRenderer = nullptr;
            if (fileExist)
            {
                leftRenderer = Label::createWithTTF(leftWords.substr(0, leftLength).c_str(), fontName, fontSize);
            } 
            else
            {
                leftRenderer = Label::createWithSystemFont(leftWords.substr(0, leftLength).c_str(), fontName, fontSize);
            }
            if (leftRenderer)
            {
                leftRenderer->setColor(color);
                leftRenderer->setOpacity(opacity);
                pushToContainer(leftRenderer);
            }
        }

        addNewLine();
        handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity);
    }
    else
    {
        textRenderer->setColor(color);
        textRenderer->setOpacity(opacity);
        pushToContainer(textRenderer);
    }
}
Exemplo n.º 4
0
void RichText::formatText()
{
    if (_formatTextDirty)
    {
        _elementRenderersContainer->removeAllChildren();
        _elementRenders.clear();
        if (_ignoreSize)
        {
            addNewLine();
            for (ssize_t i=0; i<_richElements.size(); i++)
            {
                RichElement* element = _richElements.at(i);
                Node* elementRenderer = nullptr;
                switch (element->_type)
                {
                case RichElement::Type::TEXT:
                {
                    RichElementText* elmtText = static_cast<RichElementText*>(element);
                    if (FileUtils::getInstance()->isFileExist(elmtText->_fontName))
                    {
                        elementRenderer = Label::createWithTTF(elmtText->_text.c_str(), elmtText->_fontName, elmtText->_fontSize);
                    }
                    else
                    {
                        elementRenderer = Label::createWithSystemFont(elmtText->_text.c_str(), elmtText->_fontName, elmtText->_fontSize);
                    }
                    break;
                }
                case RichElement::Type::IMAGE:
                {
                    RichElementImage* elmtImage = static_cast<RichElementImage*>(element);
                    elementRenderer = Sprite::create(elmtImage->_filePath.c_str());
                    break;
                }
                case RichElement::Type::CUSTOM:
                {
                    RichElementCustomNode* elmtCustom = static_cast<RichElementCustomNode*>(element);
                    elementRenderer = elmtCustom->_customNode;
                    break;
                }
                default:
                    break;
                }
                elementRenderer->setColor(element->_color);
                elementRenderer->setOpacity(element->_opacity);
                pushToContainer(elementRenderer);
            }
        }
        else
        {
            addNewLine();
            for (ssize_t i=0; i<_richElements.size(); i++)
            {

                RichElement* element = static_cast<RichElement*>(_richElements.at(i));
                switch (element->_type)
                {
                case RichElement::Type::TEXT:
                {
                    RichElementText* elmtText = static_cast<RichElementText*>(element);
                    handleTextRenderer(elmtText->_text.c_str(), elmtText->_fontName.c_str(), elmtText->_fontSize, elmtText->_color, elmtText->_opacity);
                    break;
                }
                case RichElement::Type::IMAGE:
                {
                    RichElementImage* elmtImage = static_cast<RichElementImage*>(element);
                    handleImageRenderer(elmtImage->_filePath.c_str(), elmtImage->_color, elmtImage->_opacity);
                    break;
                }
                case RichElement::Type::CUSTOM:
                {
                    RichElementCustomNode* elmtCustom = static_cast<RichElementCustomNode*>(element);
                    handleCustomRenderer(elmtCustom->_customNode);
                    break;
                }
                default:
                    break;
                }
            }
        }
        formarRenderers();
        _formatTextDirty = false;
    }
}
Exemplo n.º 5
0
 void RTContent::handleTextRenderer(const std::string& text, const std::string& fontName, float fontSize, const Color3B &color, GLubyte opacity)
 {
     auto fileExist = FileUtils::getInstance()->isFileExist(fontName);
     Label* textRenderer = nullptr;
     if (fileExist)
     {
         textRenderer = Label::createWithTTF(text, fontName, fontSize);
     }
     else
     {
         textRenderer = Label::createWithSystemFont(text, fontName, fontSize);
     }
     float textRendererWidth = textRenderer->getContentSize().width;
     float tmpLeftSpaceWidth = _leftSpaceWidth;
     tmpLeftSpaceWidth -= textRendererWidth;
     if (tmpLeftSpaceWidth < 0.0f)
     {
         //percent cut words
         float overstepPercent = (-tmpLeftSpaceWidth) / textRendererWidth;
         std::string curText = text;
         size_t stringLength = StringUtils::getCharacterCountInUTF8String(text);
         int leftLength = stringLength * (1.0f - overstepPercent);
         std::string leftWords = Helper::getSubStringOfUTF8String(curText, 0, leftLength);
         std::string cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength);
         
         Label* leftRenderer = nullptr;
         
         if (leftWords.length() > 0) {
             
             if (fileExist)
             {
                 leftRenderer = Label::createWithTTF(leftWords, fontName, fontSize);
             }
             else
             {
                 leftRenderer = Label::createWithSystemFont(leftWords, fontName, fontSize);
             }
         }
         
         if (!leftRenderer) {
             return;
         }
         
         // 处理需截文本字宽度不均,前半部分超出的情况 例如 "测试文本测试文本12341234",取宽度10/16 前半部分宽度10则超出很多
         while (true) {
             if (leftWords.length() > 0)
             {
                 leftRenderer->setString(leftWords);
                 
                 float leftRendererWidth = leftRenderer->getContentSize().width;
                 tmpLeftSpaceWidth = _leftSpaceWidth;
                 tmpLeftSpaceWidth -= leftRendererWidth;
                 
                 if (tmpLeftSpaceWidth < 0.0f) {
                     int leftWordsLen = (int)leftWords.length();
                     if (leftWordsLen <= 0) {
                         break;
                     }
                     else {
                         //cut char one by one to get the fit length
                         while (true) {
                             leftLength -= 1;
                             leftWords = Helper::getSubStringOfUTF8String(curText, 0, leftLength);
                             cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength);
                             if (leftWords.length() == 0) {
                                 break;
                             }
                             if (leftWords.length() < leftWordsLen) {
                                 break;
                             }
                         }
                     }
                 }
                 else {
                     //if _leftSpaceWidth > 0 break
                     break;
                 }
             }
             else {
                 //if leftWords is empty, break
                 break;
             }
         }
         
         // 处理需截文本字宽度不均,后半部分超出的情况 例如 "12341234测试文本测试文本",取宽度10/16 前半部分宽度10则缺少很多
         std::string lastLeftWords = leftWords;
         std::string lastCutWords = cutWords;
         float lastTmpLeftSpaceWidth = tmpLeftSpaceWidth;
         while (true) {
             if (cutWords.length() > 0)
             {
                 int leftWordsLen = (int)leftWords.length();
                 while (true) {
                     leftLength += 1;
                     leftWords = Helper::getSubStringOfUTF8String(curText, 0, leftLength);
                     cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength);
                     if (cutWords.length() == 0) {
                         break;
                     }
                     if (leftWords.length() > leftWordsLen) {
                         break;
                     }
                 }
                 
                 leftRenderer->setString(leftWords);
                 
                 float leftRendererWidth = leftRenderer->getContentSize().width;
                 tmpLeftSpaceWidth = _leftSpaceWidth;
                 tmpLeftSpaceWidth -= leftRendererWidth;
                 
                 if (tmpLeftSpaceWidth < 0.0f) {
                     leftWords = lastLeftWords;
                     cutWords = lastCutWords;
                     tmpLeftSpaceWidth = lastTmpLeftSpaceWidth;
                     leftRenderer->setString(leftWords);
                     break;
                 }
                 else {
                     lastLeftWords = leftWords;
                     lastCutWords = cutWords;
                     lastTmpLeftSpaceWidth = tmpLeftSpaceWidth;
                 }
             }
             else {
                 //if cutWords is empty, break
                 leftWords = lastLeftWords;
                 cutWords = lastCutWords;
                 tmpLeftSpaceWidth = lastTmpLeftSpaceWidth;
                 leftRenderer->setString(leftWords);
                 break;
             }
         }
         
         _leftSpaceWidth = tmpLeftSpaceWidth;
         leftRenderer->setColor(color);
         leftRenderer->setOpacity(opacity);
         pushToContainer(leftRenderer);
         
         _leftSpaceWidth = tmpLeftSpaceWidth;
         addNewLine();
         handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity);
     }
     else
     {
         _leftSpaceWidth = tmpLeftSpaceWidth;
         textRenderer->setColor(color);
         textRenderer->setOpacity(opacity);
         pushToContainer(textRenderer);
     }
 }
Exemplo n.º 6
0
void RichText::formatText()
{
    if (_formatTextDirty)
    {
        _elementRenderersContainer->removeAllChildren();
        _elementRenders.clear();
        if (_ignoreSize)
        {
            addNewLine();
            for (unsigned int i=0; i<_richElements->count(); i++)
            {
                RichElement* element = static_cast<RichElement*>(_richElements->objectAtIndex(i));
                CCNode* elementRenderer = NULL;
                switch (element->_type)
                {
                    case RICH_TEXT:
                    {
                        RichElementText* elmtText = static_cast<RichElementText*>(element);
                        elementRenderer = CCLabelTTF::create(elmtText->_text.c_str(), elmtText->_fontName.c_str(), elmtText->_fontSize);
                        break;
                    }
                    case RICH_IMAGE:
                    {
                        RichElementImage* elmtImage = static_cast<RichElementImage*>(element);
                        elementRenderer = CCSprite::create(elmtImage->_filePath.c_str());
                        break;
                    }
                    case RICH_CUSTOM:
                    {
                        RichElementCustomNode* elmtCustom = static_cast<RichElementCustomNode*>(element);
                        elementRenderer = elmtCustom->_customNode;
                        break;
                    }
                    default:
                        break;
                }
                CCRGBAProtocol* colorRenderer = dynamic_cast<CCRGBAProtocol*>(elementRenderer);
                colorRenderer->setColor(element->_color);
                colorRenderer->setOpacity(element->_opacity);
                pushToContainer(elementRenderer);
            }
        }
        else
        {
            addNewLine();
            for (unsigned int i=0; i<_richElements->count(); i++)
            {
                
                RichElement* element = static_cast<RichElement*>(_richElements->objectAtIndex(i));
                switch (element->_type)
                {
                    case RICH_TEXT:
                    {
                        RichElementText* elmtText = static_cast<RichElementText*>(element);
                        handleTextRenderer(elmtText->_text.c_str(), elmtText->_fontName.c_str(), elmtText->_fontSize, elmtText->_color, elmtText->_opacity);
                        break;
                    }
                    case RICH_IMAGE:
                    {
                        RichElementImage* elmtImage = static_cast<RichElementImage*>(element);
                        handleImageRenderer(elmtImage->_filePath.c_str(), elmtImage->_color, elmtImage->_opacity);
                        break;
                    }
                    case RICH_CUSTOM:
                    {
                        RichElementCustomNode* elmtCustom = static_cast<RichElementCustomNode*>(element);
                        handleCustomRenderer(elmtCustom->_customNode);
                        break;
                    }
                    default:
                        break;
                }
            }
        }
        formarRenderers();
        _formatTextDirty = false;
    }
}