void OverlappedLayer::deserialization(xml::ElementPtr _node, Version _version) { mName = _node->findAttribute("name"); if (_version >= Version(1, 2)) { MyGUI::xml::ElementEnumerator propert = _node->getElementEnumerator(); while (propert.next("Property")) { const std::string& key = propert->findAttribute("key"); const std::string& value = propert->findAttribute("value"); if (key == "Pick") mIsPick = utility::parseValue<bool>(value); } } else { mIsPick = utility::parseBool(_version < Version(1, 0) ? _node->findAttribute("peek") : _node->findAttribute("pick")); } }
void ResourceSkin::deserialization(xml::ElementPtr _node, Version _version) { Base::deserialization(_node, _version); std::string stateCategory = SubWidgetManager::getInstance().getStateCategoryName(); // парсим атрибуты скина std::string name, texture, tmp; IntSize size; _node->findAttribute("name", name); _node->findAttribute("texture", texture); if (_node->findAttribute("size", tmp)) size = IntSize::parse(tmp); LanguageManager& localizator = LanguageManager::getInstance(); // вспомогательный класс для биндинга сабскинов SubWidgetBinding bind; // поддержка замены тегов в скинах if (_version >= Version(1, 1)) { texture = localizator.replaceTags(texture); } setInfo(size, texture); // проверяем маску if (_node->findAttribute("mask", tmp)) addProperty("MaskPick", tmp); // берем детей и крутимся, цикл с саб скинами xml::ElementEnumerator basis = _node->getElementEnumerator(); while (basis.next()) { if (basis->getName() == "Property") { // загружаем свойства std::string key, value; if (!basis->findAttribute("key", key)) continue; if (!basis->findAttribute("value", value)) continue; // поддержка замены тегов в скинах if (_version >= Version(1, 1)) { value = localizator.replaceTags(value); } // добавляем свойство addProperty(key, value); } else if (basis->getName() == "Child") { ChildSkinInfo child( basis->findAttribute("type"), WidgetStyle::parse(basis->findAttribute("style")), basis->findAttribute("skin"), IntCoord::parse(basis->findAttribute("offset")), Align::parse(basis->findAttribute("align")), basis->findAttribute("layer"), basis->findAttribute("name") ); xml::ElementEnumerator child_params = basis->getElementEnumerator(); while (child_params.next("Property")) child.addParam(child_params->findAttribute("key"), child_params->findAttribute("value")); addChild(child); //continue; } else if (basis->getName() == "BasisSkin") { // парсим атрибуты std::string basisSkinType, tmp_str; IntCoord offset; Align align = Align::Default; basis->findAttribute("type", basisSkinType); if (basis->findAttribute("offset", tmp_str)) offset = IntCoord::parse(tmp_str); if (basis->findAttribute("align", tmp_str)) align = Align::parse(tmp_str); bind.create(offset, align, basisSkinType); // берем детей и крутимся, цикл со стейтами xml::ElementEnumerator state = basis->getElementEnumerator(); // проверяем на новый формат стейтов bool new_format = false; // если версия меньше 1.0 то переименовываем стейты if (_version < Version(1, 0)) { while (state.next()) { if (state->getName() == "State") { const std::string& name_state = state->findAttribute("name"); if ((name_state == "normal_checked") || (state->findAttribute("name") == "normal_check")) { new_format = true; break; } } } // обновляем state = basis->getElementEnumerator(); } while (state.next()) { if (state->getName() == "State") { // парсим атрибуты стейта std::string basisStateName; state->findAttribute("name", basisStateName); // если версия меньше 1.0 то переименовываем стейты if (_version < Version(1, 0)) { // это обсолет новых типов if (basisStateName == "disable_check") basisStateName = "disabled_checked"; else if (basisStateName == "normal_check") basisStateName = "normal_checked"; else if (basisStateName == "active_check") basisStateName = "highlighted_checked"; else if (basisStateName == "pressed_check") basisStateName = "pushed_checked"; else if (basisStateName == "disable") basisStateName = "disabled"; else if (basisStateName == "active") basisStateName = "highlighted"; else if (basisStateName == "select") basisStateName = "pushed"; else if (basisStateName == "pressed") { if (new_format) basisStateName = "pushed"; else basisStateName = "normal_checked"; } } // конвертируем инфу о стейте IStateInfo* data = nullptr; IObject* object = FactoryManager::getInstance().createObject(stateCategory, basisSkinType); if (object != nullptr) { data = object->castType<IStateInfo>(); data->deserialization(state.current(), _version); } // добавляем инфо о стайте bind.add(basisStateName, data, name); } } // теперь всё вместе добавляем в скин addInfo(bind); } } }
void ResourceTrueTypeFont::deserialization(xml::ElementPtr _node, Version _version) { Base::deserialization(_node, _version); xml::ElementEnumerator node = _node->getElementEnumerator(); while (node.next()) { if (node->getName() == "Property") { const std::string& key = node->findAttribute("key"); const std::string& value = node->findAttribute("value"); if (key == "Source") setSource(value); else if (key == "Size") setSize(utility::parseFloat(value)); else if (key == "Resolution") setResolution(utility::parseUInt(value)); else if (key == "Antialias") setAntialias(utility::parseBool(value)); else if (key == "TabWidth") setTabWidth(utility::parseFloat(value)); else if (key == "OffsetHeight") setOffsetHeight(utility::parseInt(value)); else if (key == "SubstituteCode") setSubstituteCode(utility::parseInt(value)); else if (key == "Distance") setDistance(utility::parseInt(value)); else if (key == "Hinting") setHinting(value); else if (key == "SpaceWidth") { mSpaceWidth = utility::parseFloat(value); MYGUI_LOG(Warning, _node->findAttribute("type") << ": Property '" << key << "' in font '" << _node->findAttribute("name") << "' is deprecated; remove it to use automatic calculation."); } else if (key == "CursorWidth") { MYGUI_LOG(Warning, _node->findAttribute("type") << ": Property '" << key << "' in font '" << _node->findAttribute("name") << "' is deprecated; value ignored."); } } else if (node->getName() == "Codes") { // Range of inclusions. xml::ElementEnumerator range = node->getElementEnumerator(); while (range.next("Code")) { std::string range_value; if (range->findAttribute("range", range_value)) { std::vector<std::string> parse_range = utility::split(range_value); if (!parse_range.empty()) { Char first = utility::parseUInt(parse_range[0]); Char last = parse_range.size() > 1 ? utility::parseUInt(parse_range[1]) : first; addCodePointRange(first, last); } } } // If no code points have been included, include the Unicode Basic Multilingual Plane by default before processing // any exclusions. if (mCharMap.empty()) addCodePointRange(0, 0xFFFF); // Range of exclusions. range = node->getElementEnumerator(); while (range.next("Code")) { std::string range_value; if (range->findAttribute("hide", range_value)) { std::vector<std::string> parse_range = utility::split(range_value); if (!parse_range.empty()) { Char first = utility::parseUInt(parse_range[0]); Char last = parse_range.size() > 1 ? utility::parseUInt(parse_range[1]) : first; removeCodePointRange(first, last); } } } } } initialise(); }