#include "HtmlObject.h" #include "HtmlElement.h" #include "display/FUIRichText.h" #include "utils/ToolSet.h" #include "UIPackage.h" NS_FGUI_BEGIN USING_NS_AX; using namespace std; std::string HtmlObject::buttonResource; std::string HtmlObject::inputResource; std::string HtmlObject::selectResource; bool HtmlObject::usePool = true; GObjectPool HtmlObject::objectPool; ax::Vector HtmlObject::loaderPool; HtmlObject::HtmlObject() :_ui(nullptr), _hidden(false) { } HtmlObject::~HtmlObject() { if (_ui != nullptr) { destroy(); if (usePool) { if (!_ui->getResourceURL().empty()) objectPool.returnObject(_ui); else if (dynamic_cast(_ui) != nullptr) loaderPool.pushBack(_ui); } } AX_SAFE_RELEASE(_ui); } void HtmlObject::create(FUIRichText* owner, HtmlElement* element) { _owner = owner; _element = element; switch (element->type) { case HtmlElement::Type::IMAGE: createImage(); break; case HtmlElement::Type::INPUT: { string type = element->getString("type"); transform(type.begin(), type.end(), type.begin(), ::tolower); if (type == "button" || type == "submit") createButton(); else createInput(); break; } case HtmlElement::Type::SELECT: createSelect(); break; case HtmlElement::Type::OBJECT: createCommon(); break; } } void HtmlObject::destroy() { switch (_element->type) { case HtmlElement::Type::IMAGE: ((GLoader*)_ui)->setURL(STD_STRING_EMPTY); break; } } void HtmlObject::createCommon() { string src = _element->getString("src"); if (!src.empty()) _ui = objectPool.getObject(src); else _ui = GComponent::create(); _ui->retain(); int width = _element->getInt("width", _ui->sourceSize.width); int height = _element->getInt("height", _ui->sourceSize.height); _ui->setSize(width, height); _ui->setText(_element->getString("title")); _ui->setIcon(_element->getString("icon")); } void HtmlObject::createImage() { int width = 0; int height = 0; string src = _element->getString("src"); if (!src.empty()) { PackageItem* pi = UIPackage::getItemByURL(src); if (pi) { width = pi->width; height = pi->height; } } width = _element->getInt("width", width); height = _element->getInt("height", height); GLoader* loader; if (!loaderPool.empty()) { loader = (GLoader*)loaderPool.back(); loader->retain(); loaderPool.popBack(); } else { loader = GLoader::create(); loader->retain(); } _ui = loader; loader->setSize(width, height); loader->setFill(LoaderFillType::SCALE_FREE); loader->setURL(src); } void HtmlObject::createButton() { if (!buttonResource.empty()) _ui = objectPool.getObject(buttonResource); else { _ui = GComponent::create(); AXLOGWARN("Set HtmlObject.buttonResource first"); } _ui->retain(); int width = _element->getInt("width", _ui->sourceSize.width); int height = _element->getInt("height", _ui->sourceSize.height); _ui->setSize(width, height); _ui->setText(_element->getString("value")); GButton *button = dynamic_cast(_ui); if (button != nullptr) { button->setSelected(_element->getString("checked") == "true"); } } void HtmlObject::createInput() { if (!inputResource.empty()) _ui = objectPool.getObject(inputResource); else { _ui = GComponent::create(); AXLOGWARN("Set HtmlObject.inputResource first"); } _ui->retain(); string type = _element->getString("type"); transform(type.begin(), type.end(), type.begin(), ::tolower); _hidden = type == "hidden"; int width = _element->getInt("width"); int height = _element->getInt("height"); if (width == 0) { width = _element->space; if (width > _owner->getContentSize().width / 2 || width < 100) width = _owner->getContentSize().width / 2; } if (height == 0) height = _element->format.fontSize + 10; _ui->setSize(width, height); _ui->setText(_element->getString("value")); GLabel *label = dynamic_cast(_ui); if (label != nullptr) { GTextInput* input = dynamic_cast(label->getTextField()); if (input != nullptr) { input->setPassword(type == "password"); } } } void HtmlObject::createSelect() { if (!selectResource.empty()) _ui = objectPool.getObject(selectResource); else { _ui = GComponent::create(); AXLOGWARN("Set HtmlObject.selectResource first"); } _ui->retain(); int width = _element->getInt("width", _ui->sourceSize.width); int height = _element->getInt("height", _ui->sourceSize.height); _ui->setSize(width, height); GComboBox* comboBox = dynamic_cast(_ui); if (comboBox != nullptr) { auto& items = _element->getArray("items"); auto& values = _element->getArray("values"); comboBox->getItems().clear(); comboBox->getValues().clear(); for (auto it : items) comboBox->getItems().push_back(it.asString()); for (auto it : values) comboBox->getValues().push_back(it.asString()); comboBox->setValue(_element->getString("value")); comboBox->refresh(); } } NS_FGUI_END