#include "cXMLoader.hpp" /*** Custom Header Files ***/ #include "../../UtilityEngine/cUtility.hpp" #include "../cGUI.hpp" #include "../cLayout.hpp" using GUIHelpers::cXMLoader; using UtilityEngine::cUtility; /*static*/ cXMLoader* cXMLoader::sp_inst = nullptr; cXMLoader::cXMLoader() {} cXMLoader::~cXMLoader() {} //PUBLIC ///Functions /*static*/ cXMLoader& cXMLoader::Inst() { if (sp_inst == nullptr) sp_inst = new cXMLoader(); return *sp_inst; } /*static*/ void cXMLoader::Delete() { delete sp_inst; sp_inst = nullptr; } void cXMLoader::Load( const cString& filename, const cString& dir /*= ""*/ ) const { cString file = dir + filename; tinyxml2::XMLDocument doc; if (doc.LoadFile(file.c_str()) != tinyxml2::XMLError::XML_NO_ERROR) cUtility::Inst().Message("Could not load file. " + file + " Error='" + doc.ErrorName() + "'."); else { tinyxml2::XMLNode* node = doc.FirstChildElement("GUI"); if (node == nullptr) cUtility::Inst().Message("No GUI tag found."); else GetElement(*node->ToElement()); } } void cXMLoader::GetElement( tinyxml2::XMLElement& element, GUIEngine::cWindow* parent /*= nullptr*/ ) const { cString name = element.Name(); GUIEngine::cWindow* tmp = nullptr; if (name == "GUI") GUISetup(element); if (name == "Layout") tmp = LayoutBuild(element, parent); if (name == "Label") tmp = LabelBuild(element, parent); tinyxml2::XMLElement* child = element.FirstChildElement(); if (child != nullptr) GetElement(*child, tmp); tinyxml2::XMLElement* sibling = element.NextSiblingElement(); if (sibling != nullptr) GetElement(*sibling, parent); if ((parent == nullptr) && (tmp != nullptr)) tmp->Resize(); } const cString cXMLoader::GetAttribute( const tinyxml2::XMLElement& element, const cString& attribute ) const { cString rtn = ""; const char* str = element.Attribute(attribute.c_str()); if (str == nullptr) cUtility::Inst().Message("Error no attribute: " + attribute + " found in tag <" + element.Value() + ">"); else rtn = str; return rtn; } void cXMLoader::GUISetup( const tinyxml2::XMLElement& element ) const { unsigned long int debug = getDebug(element); GUIEngine::cWindow::sDebug = debug; } GUIEngine::cLayout* cXMLoader::LayoutBuild( const tinyxml2::XMLElement& element, GUIEngine::cWindow* parent ) const { signed long int id = getID(element); GUIHelpers::eOrientation orientation = getOrientation(element); GUIHelpers::eAlign align = getAlign(element); GUIHelpers::eLayout layout = getLayout(element); GUIHelpers::Position pos = getPosition(element); GUIHelpers::Size size = getSize(element); GUIHelpers::Padding pad = getPadding(element); GUIEngine::cLayout* rtn = new GUIEngine::cLayout(parent, id, orientation, align, layout, pos, size, pad); if (parent == nullptr) GUIEngine::cGUI::Inst().AddObject(rtn); return rtn; } GUIEngine::cLabel* cXMLoader::LabelBuild( const tinyxml2::XMLElement& element, GUIEngine::cWindow* parent ) const { signed long int id = getID(element); //GUIHelpers::eOrientation orientation = getOrientation(element); GUIHelpers::eAlign align = getAlign(element); GUIHelpers::eLayout layout = getLayout(element); GUIHelpers::Position pos = getPosition(element); GUIHelpers::Size size = getSize(element); GUIHelpers::Padding pad = getPadding(element); cString txt = getText(element); GUIEngine::cLabel* rtn = new GUIEngine::cLabel(parent, id, txt, align, layout, pos, size, pad); return rtn; } const unsigned long int cXMLoader::getDebug( const tinyxml2::XMLElement& element ) const { unsigned long int rtn = 0; cString str = GetAttribute(element, "debug").lower(); if ((str != "") && (str != "false")) { if (str == "true") rtn = 1; else rtn = str.ToInt(); } return rtn; } const signed long int cXMLoader::getID( const tinyxml2::XMLElement& element ) const { cString rtn = GetAttribute(element, "id"); return rtn.ToInt(); } const GUIHelpers::eOrientation cXMLoader::getOrientation( const tinyxml2::XMLElement& element ) const { GUIHelpers::eOrientation rtn = GUIHelpers::eOrientation::DEFAULT_ORIENTATION; cString str = GetAttribute(element, "orientation").lower(); if (str == "none") rtn = GUIHelpers::eOrientation::NONE; if (str == "horizontal") rtn = GUIHelpers::eOrientation::HORIZONTAL; if (str == "vertical") rtn = GUIHelpers::eOrientation::VERTICAL; return rtn; } const GUIHelpers::eAlign cXMLoader::getAlign( const tinyxml2::XMLElement& element ) const { GUIHelpers::eAlign rtn = GUIHelpers::eAlign::DEFAULT_ALIGN; cString str = GetAttribute(element, "align").lower(); if (str == "center") rtn = GUIHelpers::eAlign::CENTER; if (str == "top") rtn = GUIHelpers::eAlign::TOP; if (str == "right") rtn = GUIHelpers::eAlign::RIGHT; if (str == "bottom") rtn = GUIHelpers::eAlign::BOTTOM; if (str == "left") rtn = GUIHelpers::eAlign::LEFT; return rtn; } const GUIHelpers::eLayout cXMLoader::getLayout( const tinyxml2::XMLElement& element ) const { GUIHelpers::eLayout rtn = GUIHelpers::eLayout::DEFAULT_LAYOUT; cString str = GetAttribute(element, "layout").lower(); if (str == "fill_parent") rtn = GUIHelpers::eLayout::FILL_PARENT; if (str == "match_parent") rtn = GUIHelpers::eLayout::MATCH_PARENT; if (str == "wrap_content") rtn = GUIHelpers::eLayout::WRAP_CONTENT; return rtn; } const GUIHelpers::Position cXMLoader::getPosition( const tinyxml2::XMLElement& element ) const { GUIHelpers::Position rtn = { 0, 0 }; /*cString str = GetAttribute(element, "position");*/ return rtn; } const GUIHelpers::Size cXMLoader::getSize( const tinyxml2::XMLElement& element ) const { GUIHelpers::Size rtn = { 0, 0 }; /*cString str = GetAttribute(element, "position");*/ return rtn; } const GUIHelpers::Padding cXMLoader::getPadding( const tinyxml2::XMLElement& element ) const { GUIHelpers::Padding rtn = { -1, -1, -1, -1 }; cString str = GetAttribute(element, "padding"); if (str != "") { rtn = { 0, 0, 0, 0 }; std::vector strV = str.split(","); switch (strV.size()) { case 4: rtn.z = strV[3].ToInt(); case 3: rtn.w = strV[2].ToInt(); case 2: rtn.y = strV[1].ToInt(); case 1: rtn.x = strV[0].ToInt(); } } return rtn; } const cString cXMLoader::getText( const tinyxml2::XMLElement& element ) const { return GetAttribute(element, "text"); }