bool CGUIControlFactory::GetAnimations(TiXmlNode *control, const CRect &rect, int context, vector<CAnimation> &animations) { TiXmlElement* node = control->FirstChildElement("animation"); bool ret = false; if (node) animations.clear(); while (node) { ret = true; if (node->FirstChild()) { CAnimation anim; anim.Create(node, rect, context); animations.push_back(anim); if (strcmpi(node->FirstChild()->Value(), "VisibleChange") == 0) { // add the hidden one as well TiXmlElement hidden(*node); hidden.FirstChild()->SetValue("hidden"); const char *start = hidden.Attribute("start"); const char *end = hidden.Attribute("end"); if (start && end) { CStdString temp = end; hidden.SetAttribute("end", start); hidden.SetAttribute("start", temp.c_str()); } else if (start) hidden.SetAttribute("end", start); else if (end) hidden.SetAttribute("start", end); CAnimation anim2; anim2.Create(&hidden, rect, context); animations.push_back(anim2); } } node = node->NextSiblingElement("animation"); } return ret; }
bool CGUIWindow::Load(TiXmlDocument &xmlDoc) { TiXmlElement* pRootElement = xmlDoc.RootElement(); if (strcmpi(pRootElement->Value(), "window")) { CLog::Log(LOGERROR, "file : XML file doesnt contain <window>"); return false; } // set the scaling resolution so that any control creation or initialisation can // be done with respect to the correct aspect ratio g_graphicsContext.SetScalingResolution(m_coordsRes, m_needsScaling); // Resolve any includes that may be present g_SkinInfo->ResolveIncludes(pRootElement); // now load in the skin file SetDefaults(); CGUIControlFactory::GetInfoColor(pRootElement, "backgroundcolor", m_clearBackground, GetID()); CGUIControlFactory::GetActions(pRootElement, "onload", m_loadActions); CGUIControlFactory::GetActions(pRootElement, "onunload", m_unloadActions); CGUIControlFactory::GetHitRect(pRootElement, m_hitRect); TiXmlElement *pChild = pRootElement->FirstChildElement(); while (pChild) { CStdString strValue = pChild->Value(); if (strValue == "type" && pChild->FirstChild()) { // if we have are a window type (ie not a dialog), and we have <type>dialog</type> // then make this window act like a dialog if (!IsDialog() && strcmpi(pChild->FirstChild()->Value(), "dialog") == 0) m_isDialog = true; } else if (strValue == "previouswindow" && pChild->FirstChild()) { m_previousWindow = CButtonTranslator::TranslateWindow(pChild->FirstChild()->Value()); } else if (strValue == "defaultcontrol" && pChild->FirstChild()) { const char *always = pChild->Attribute("always"); if (always && strcmpi(always, "true") == 0) m_defaultAlways = true; m_defaultControl = atoi(pChild->FirstChild()->Value()); } else if (strValue == "visible" && pChild->FirstChild()) { CStdString condition; CGUIControlFactory::GetConditionalVisibility(pRootElement, condition); m_visibleCondition = g_infoManager.Register(condition, GetID()); } else if (strValue == "animation" && pChild->FirstChild()) { CRect rect(0, 0, (float)m_coordsRes.iWidth, (float)m_coordsRes.iHeight); CAnimation anim; anim.Create(pChild, rect, GetID()); m_animations.push_back(anim); } else if (strValue == "zorder" && pChild->FirstChild()) { m_renderOrder = atoi(pChild->FirstChild()->Value()); } else if (strValue == "coordinates") { XMLUtils::GetFloat(pChild, "posx", m_posX); XMLUtils::GetFloat(pChild, "posy", m_posY); TiXmlElement *originElement = pChild->FirstChildElement("origin"); while (originElement) { COrigin origin; originElement->QueryFloatAttribute("x", &origin.x); originElement->QueryFloatAttribute("y", &origin.y); if (originElement->FirstChild()) origin.condition = g_infoManager.Register(originElement->FirstChild()->Value(), GetID()); m_origins.push_back(origin); originElement = originElement->NextSiblingElement("origin"); } } else if (strValue == "camera") { // z is fixed pChild->QueryFloatAttribute("x", &m_camera.x); pChild->QueryFloatAttribute("y", &m_camera.y); m_hasCamera = true; } else if (strValue == "controls") { TiXmlElement *pControl = pChild->FirstChildElement(); while (pControl) { if (strcmpi(pControl->Value(), "control") == 0) { LoadControl(pControl, NULL); } pControl = pControl->NextSiblingElement(); } } else if (strValue == "allowoverlay") { bool overlay = false; if (XMLUtils::GetBoolean(pRootElement, "allowoverlay", overlay)) m_overlayState = overlay ? OVERLAY_STATE_SHOWN : OVERLAY_STATE_HIDDEN; } pChild = pChild->NextSiblingElement(); } LoadAdditionalTags(pRootElement); m_windowLoaded = true; OnWindowLoaded(); return true; }
bool CGUIWindow::Load(TiXmlElement *pRootElement) { if (!pRootElement) return false; // set the scaling resolution so that any control creation or initialisation can // be done with respect to the correct aspect ratio CServiceBroker::GetWinSystem()->GetGfxContext().SetScalingResolution(m_coordsRes, m_needsScaling); // now load in the skin file SetDefaults(); CGUIControlFactory::GetInfoColor(pRootElement, "backgroundcolor", m_clearBackground, GetID()); CGUIControlFactory::GetActions(pRootElement, "onload", m_loadActions); CGUIControlFactory::GetActions(pRootElement, "onunload", m_unloadActions); CRect parentRect(0, 0, static_cast<float>(m_coordsRes.iWidth), static_cast<float>(m_coordsRes.iHeight)); CGUIControlFactory::GetHitRect(pRootElement, m_hitRect, parentRect); TiXmlElement *pChild = pRootElement->FirstChildElement(); while (pChild) { std::string strValue = pChild->Value(); if (strValue == "previouswindow" && pChild->FirstChild()) { m_previousWindow = CWindowTranslator::TranslateWindow(pChild->FirstChild()->Value()); } else if (strValue == "defaultcontrol" && pChild->FirstChild()) { const char *always = pChild->Attribute("always"); if (always && StringUtils::EqualsNoCase(always, "true")) m_defaultAlways = true; m_defaultControl = atoi(pChild->FirstChild()->Value()); } else if(strValue == "menucontrol" && pChild->FirstChild()) { m_menuControlID = atoi(pChild->FirstChild()->Value()); } else if (strValue == "visible" && pChild->FirstChild()) { std::string condition; CGUIControlFactory::GetConditionalVisibility(pRootElement, condition); m_visibleCondition = CServiceBroker::GetGUI()->GetInfoManager().Register(condition, GetID()); } else if (strValue == "animation" && pChild->FirstChild()) { CRect rect(0, 0, static_cast<float>(m_coordsRes.iWidth), static_cast<float>(m_coordsRes.iHeight)); CAnimation anim; anim.Create(pChild, rect, GetID()); m_animations.push_back(anim); } else if (strValue == "zorder" && pChild->FirstChild()) { m_renderOrder = atoi(pChild->FirstChild()->Value()); } else if (strValue == "coordinates") { XMLUtils::GetFloat(pChild, "posx", m_posX); XMLUtils::GetFloat(pChild, "posy", m_posY); XMLUtils::GetFloat(pChild, "left", m_posX); XMLUtils::GetFloat(pChild, "top", m_posY); TiXmlElement *originElement = pChild->FirstChildElement("origin"); while (originElement) { COrigin origin; origin.x = CGUIControlFactory::ParsePosition(originElement->Attribute("x"), static_cast<float>(m_coordsRes.iWidth)); origin.y = CGUIControlFactory::ParsePosition(originElement->Attribute("y"), static_cast<float>(m_coordsRes.iHeight)); if (originElement->FirstChild()) origin.condition = CServiceBroker::GetGUI()->GetInfoManager().Register(originElement->FirstChild()->Value(), GetID()); m_origins.push_back(origin); originElement = originElement->NextSiblingElement("origin"); } } else if (strValue == "camera") { // z is fixed m_camera.x = CGUIControlFactory::ParsePosition(pChild->Attribute("x"), static_cast<float>(m_coordsRes.iWidth)); m_camera.y = CGUIControlFactory::ParsePosition(pChild->Attribute("y"), static_cast<float>(m_coordsRes.iHeight)); m_hasCamera = true; } else if (strValue == "depth" && pChild->FirstChild()) { float stereo = static_cast<float>(atof(pChild->FirstChild()->Value())); m_stereo = std::max(-1.f, std::min(1.f, stereo)); } else if (strValue == "controls") { TiXmlElement *pControl = pChild->FirstChildElement(); while (pControl) { if (StringUtils::EqualsNoCase(pControl->Value(), "control")) { LoadControl(pControl, nullptr, CRect(0, 0, static_cast<float>(m_coordsRes.iWidth), static_cast<float>(m_coordsRes.iHeight))); } pControl = pControl->NextSiblingElement(); } } pChild = pChild->NextSiblingElement(); } return true; }
bool CGUIWindow::Load(TiXmlElement* pRootElement) { if (!pRootElement) return false; if (strcmpi(pRootElement->Value(), "window")) { CLog::Log(LOGERROR, "file : XML file doesnt contain <window>"); return false; } // we must create copy of root element as we will manipulate it when resolving includes // and we don't want original root element to change pRootElement = (TiXmlElement*)pRootElement->Clone(); // set the scaling resolution so that any control creation or initialisation can // be done with respect to the correct aspect ratio g_graphicsContext.SetScalingResolution(m_coordsRes, m_needsScaling); // Resolve any includes that may be present and save conditions used to do it g_SkinInfo->ResolveIncludes(pRootElement, &m_xmlIncludeConditions); // now load in the skin file SetDefaults(); CGUIControlFactory::GetInfoColor(pRootElement, "backgroundcolor", m_clearBackground, GetID()); CGUIControlFactory::GetActions(pRootElement, "onload", m_loadActions); CGUIControlFactory::GetActions(pRootElement, "onunload", m_unloadActions); CGUIControlFactory::GetHitRect(pRootElement, m_hitRect); TiXmlElement *pChild = pRootElement->FirstChildElement(); while (pChild) { std::string strValue = pChild->Value(); if (strValue == "type" && pChild->FirstChild()) { // if we have are a window type (ie not a dialog), and we have <type>dialog</type> // then make this window act like a dialog if (!IsDialog() && strcmpi(pChild->FirstChild()->Value(), "dialog") == 0) m_isDialog = true; } else if (strValue == "previouswindow" && pChild->FirstChild()) { m_previousWindow = CButtonTranslator::TranslateWindow(pChild->FirstChild()->Value()); } else if (strValue == "defaultcontrol" && pChild->FirstChild()) { const char *always = pChild->Attribute("always"); if (always && strcmpi(always, "true") == 0) m_defaultAlways = true; m_defaultControl = atoi(pChild->FirstChild()->Value()); } else if(strValue == "menucontrol" && pChild->FirstChild()) { m_menuControlID = atoi(pChild->FirstChild()->Value()); } else if (strValue == "visible" && pChild->FirstChild()) { std::string condition; CGUIControlFactory::GetConditionalVisibility(pRootElement, condition); m_visibleCondition = g_infoManager.Register(condition, GetID()); } else if (strValue == "animation" && pChild->FirstChild()) { CRect rect(0, 0, (float)m_coordsRes.iWidth, (float)m_coordsRes.iHeight); CAnimation anim; anim.Create(pChild, rect, GetID()); m_animations.push_back(anim); } else if (strValue == "zorder" && pChild->FirstChild()) { m_renderOrder = atoi(pChild->FirstChild()->Value()); } else if (strValue == "coordinates") { XMLUtils::GetFloat(pChild, "posx", m_posX); XMLUtils::GetFloat(pChild, "posy", m_posY); XMLUtils::GetFloat(pChild, "left", m_posX); XMLUtils::GetFloat(pChild, "top", m_posY); TiXmlElement *originElement = pChild->FirstChildElement("origin"); while (originElement) { COrigin origin; originElement->QueryFloatAttribute("x", &origin.x); originElement->QueryFloatAttribute("y", &origin.y); if (originElement->FirstChild()) origin.condition = g_infoManager.Register(originElement->FirstChild()->Value(), GetID()); m_origins.push_back(origin); originElement = originElement->NextSiblingElement("origin"); } } else if (strValue == "camera") { // z is fixed pChild->QueryFloatAttribute("x", &m_camera.x); pChild->QueryFloatAttribute("y", &m_camera.y); m_hasCamera = true; } else if (strValue == "depth" && pChild->FirstChild()) { float stereo = (float)atof(pChild->FirstChild()->Value());; m_stereo = std::max(-1.f, std::min(1.f, stereo)); } else if (strValue == "controls") { TiXmlElement *pControl = pChild->FirstChildElement(); while (pControl) { if (strcmpi(pControl->Value(), "control") == 0) { LoadControl(pControl, NULL, CRect(0, 0, (float)m_coordsRes.iWidth, (float)m_coordsRes.iHeight)); } pControl = pControl->NextSiblingElement(); } } pChild = pChild->NextSiblingElement(); } LoadAdditionalTags(pRootElement); m_windowLoaded = true; OnWindowLoaded(); delete pRootElement; return true; }