summaryrefslogtreecommitdiffstats
path: root/xbmc/interfaces/info/SkinVariable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/interfaces/info/SkinVariable.cpp')
-rw-r--r--xbmc/interfaces/info/SkinVariable.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/xbmc/interfaces/info/SkinVariable.cpp b/xbmc/interfaces/info/SkinVariable.cpp
new file mode 100644
index 0000000..53980b9
--- /dev/null
+++ b/xbmc/interfaces/info/SkinVariable.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "SkinVariable.h"
+
+#include "GUIInfoManager.h"
+#include "ServiceBroker.h"
+#include "guilib/GUIComponent.h"
+#include "utils/XBMCTinyXML.h"
+
+using namespace INFO;
+using namespace KODI;
+
+const CSkinVariableString* CSkinVariable::CreateFromXML(const TiXmlElement& node, int context)
+{
+ const char* name = node.Attribute("name");
+ if (name)
+ {
+ CSkinVariableString* tmp = new CSkinVariableString;
+ tmp->m_name = name;
+ tmp->m_context = context;
+ const TiXmlElement* valuenode = node.FirstChildElement("value");
+ while (valuenode)
+ {
+ CSkinVariableString::ConditionLabelPair pair;
+ const char *condition = valuenode->Attribute("condition");
+ if (condition)
+ pair.m_condition = CServiceBroker::GetGUI()->GetInfoManager().Register(condition, context);
+
+ auto label = valuenode->FirstChild() ? valuenode->FirstChild()->ValueStr() : "";
+ pair.m_label = GUILIB::GUIINFO::CGUIInfoLabel(label);
+ tmp->m_conditionLabelPairs.push_back(pair);
+ if (!pair.m_condition)
+ break; // once we reach default value (without condition) break iterating
+
+ valuenode = valuenode->NextSiblingElement("value");
+ }
+ if (!tmp->m_conditionLabelPairs.empty())
+ return tmp;
+ delete tmp;
+ }
+ return NULL;
+}
+
+CSkinVariableString::CSkinVariableString() = default;
+
+int CSkinVariableString::GetContext() const
+{
+ return m_context;
+}
+
+const std::string& CSkinVariableString::GetName() const
+{
+ return m_name;
+}
+
+std::string CSkinVariableString::GetValue(int contextWindow,
+ bool preferImage /* = false */,
+ const CGUIListItem* item /* = nullptr */) const
+{
+ for (const auto& it : m_conditionLabelPairs)
+ {
+ // use propagated context in case this skin variable has the default context (i.e. if not tied to a specific window)
+ // nested skin variables are supported
+ int context = m_context == INFO::DEFAULT_CONTEXT ? contextWindow : m_context;
+ if (!it.m_condition || it.m_condition->Get(context, item))
+ {
+ if (item)
+ return it.m_label.GetItemLabel(item, preferImage);
+ else
+ {
+ return it.m_label.GetLabel(context, preferImage);
+ }
+ }
+ }
+ return "";
+}