aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpieh <misiek.piechowiak@gmail.com>2011-10-18 03:53:57 -0700
committerpieh <misiek.piechowiak@gmail.com>2011-10-18 03:53:57 -0700
commit70eda64fd99b6d634a1b24077078593a43fda556 (patch)
tree1f32c878062a2ed0901fe35d2ac83caa24c179e7
parent9c72e406f12d21ad86e66298a23be1483bc06881 (diff)
parente4ee1d0ef16645de39270129f924e2e1a02c7928 (diff)
Merge pull request #481 from pieh/skin_vars_infobool_context
Store context in skin variables
-rw-r--r--xbmc/GUIInfoManager.cpp28
-rw-r--r--xbmc/GUIInfoManager.h6
-rw-r--r--xbmc/addons/Skin.cpp5
-rw-r--r--xbmc/addons/Skin.h1
-rw-r--r--xbmc/guilib/GUIButtonControl.cpp4
-rw-r--r--xbmc/guilib/GUIControlFactory.cpp26
-rw-r--r--xbmc/guilib/GUIControlFactory.h8
-rw-r--r--xbmc/guilib/GUIFadeLabelControl.cpp2
-rw-r--r--xbmc/guilib/GUIImage.cpp2
-rw-r--r--xbmc/guilib/GUIIncludes.cpp20
-rw-r--r--xbmc/guilib/GUIIncludes.h6
-rw-r--r--xbmc/guilib/GUIInfoTypes.cpp22
-rw-r--r--xbmc/guilib/GUIInfoTypes.h6
-rw-r--r--xbmc/guilib/GUILabelControl.cpp2
-rw-r--r--xbmc/guilib/GUIListItemLayout.cpp6
-rw-r--r--xbmc/guilib/GUIStaticItem.cpp10
-rw-r--r--xbmc/guilib/GUITextBox.cpp2
-rw-r--r--xbmc/interfaces/info/SkinVariable.cpp62
-rw-r--r--xbmc/interfaces/info/SkinVariable.h8
19 files changed, 129 insertions, 97 deletions
diff --git a/xbmc/GUIInfoManager.cpp b/xbmc/GUIInfoManager.cpp
index 1a2aeaa323..6a89b230ab 100644
--- a/xbmc/GUIInfoManager.cpp
+++ b/xbmc/GUIInfoManager.cpp
@@ -1047,7 +1047,7 @@ TIME_FORMAT CGUIInfoManager::TranslateTimeFormat(const CStdString &format)
CStdString CGUIInfoManager::GetLabel(int info, int contextWindow)
{
if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
- return GetSkinVariableString(info, contextWindow, false);
+ return GetSkinVariableString(info, false);
CStdString strLabel;
if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
@@ -2789,7 +2789,7 @@ CStdString CGUIInfoManager::GetMultiInfoLabel(const GUIInfo &info, int contextWi
CStdString CGUIInfoManager::GetImage(int info, int contextWindow)
{
if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
- return GetSkinVariableString(info, contextWindow, true);
+ return GetSkinVariableString(info, true);
if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
{
@@ -3770,7 +3770,7 @@ CStdString CGUIInfoManager::GetItemLabel(const CFileItem *item, int info)
if (!item) return "";
if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
- return GetSkinVariableString(info, 0, false, item);
+ return GetSkinVariableString(info, false, item);
if (info >= LISTITEM_PROPERTY_START && info - LISTITEM_PROPERTY_START < (int)m_listitemProperties.size())
{ // grab the property
@@ -4156,7 +4156,7 @@ CStdString CGUIInfoManager::GetItemLabel(const CFileItem *item, int info)
CStdString CGUIInfoManager::GetItemImage(const CFileItem *item, int info)
{
if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
- return GetSkinVariableString(info, 0, true, item);
+ return GetSkinVariableString(info, true, item);
switch (info)
{
@@ -4496,35 +4496,35 @@ bool CGUIInfoManager::GetLibraryBool(int condition)
return false;
}
-int CGUIInfoManager::RegisterSkinVariableString(const CSkinVariableString& info)
+int CGUIInfoManager::RegisterSkinVariableString(const CSkinVariableString* info)
{
- CSingleLock lock(m_critInfo);
- int id = TranslateSkinVariableString(info.GetName());
- if (id != 0)
- return id;
+ if (!info)
+ return 0;
- m_skinVariableStrings.push_back(info);
+ CSingleLock lock(m_critInfo);
+ m_skinVariableStrings.push_back(*info);
+ delete info;
return CONDITIONAL_LABEL_START + m_skinVariableStrings.size() - 1;
}
-int CGUIInfoManager::TranslateSkinVariableString(const CStdString& name)
+int CGUIInfoManager::TranslateSkinVariableString(const CStdString& name, int context)
{
for (vector<CSkinVariableString>::const_iterator it = m_skinVariableStrings.begin();
it != m_skinVariableStrings.end(); ++it)
{
- if (it->GetName().Equals(name))
+ if (it->GetName().Equals(name) && it->GetContext() == context)
return it - m_skinVariableStrings.begin() + CONDITIONAL_LABEL_START;
}
return 0;
}
-CStdString CGUIInfoManager::GetSkinVariableString(int info, int contextWindow,
+CStdString CGUIInfoManager::GetSkinVariableString(int info,
bool preferImage /*= false*/,
const CGUIListItem *item /*= NULL*/)
{
info -= CONDITIONAL_LABEL_START;
if (info >= 0 && info < (int)m_skinVariableStrings.size())
- return m_skinVariableStrings[info].GetValue(contextWindow, preferImage, item);
+ return m_skinVariableStrings[info].GetValue(preferImage, item);
return "";
}
diff --git a/xbmc/GUIInfoManager.h b/xbmc/GUIInfoManager.h
index 70517b4ce4..6dafdee0c0 100644
--- a/xbmc/GUIInfoManager.h
+++ b/xbmc/GUIInfoManager.h
@@ -676,9 +676,9 @@ public:
int TranslateSingleString(const CStdString &strCondition);
- int RegisterSkinVariableString(const INFO::CSkinVariableString& info);
- int TranslateSkinVariableString(const CStdString& name);
- CStdString GetSkinVariableString(int info, int contextWindow, bool preferImage = false, const CGUIListItem *item=NULL);
+ int RegisterSkinVariableString(const INFO::CSkinVariableString* info);
+ int TranslateSkinVariableString(const CStdString& name, int context);
+ CStdString GetSkinVariableString(int info, bool preferImage = false, const CGUIListItem *item=NULL);
protected:
friend class INFO::InfoSingle;
bool GetBool(int condition, int contextWindow = 0, const CGUIListItem *item=NULL);
diff --git a/xbmc/addons/Skin.cpp b/xbmc/addons/Skin.cpp
index 8eda71659a..fd1b252bb1 100644
--- a/xbmc/addons/Skin.cpp
+++ b/xbmc/addons/Skin.cpp
@@ -256,4 +256,9 @@ bool CSkinInfo::IsInUse() const
return g_guiSettings.GetString("lookandfeel.skin") == ID();
}
+const INFO::CSkinVariableString* CSkinInfo::CreateSkinVariable(const CStdString& name, int context)
+{
+ return m_includes.CreateSkinVariable(name, context);
+}
+
} /*namespace ADDON*/
diff --git a/xbmc/addons/Skin.h b/xbmc/addons/Skin.h
index 323dde7842..694c78e02e 100644
--- a/xbmc/addons/Skin.h
+++ b/xbmc/addons/Skin.h
@@ -109,6 +109,7 @@ public:
// static bool Check(const CStdString& strSkinDir); // checks if everything is present and accounted for without loading the skin
static double GetMinVersion();
void LoadIncludes();
+ const INFO::CSkinVariableString* CreateSkinVariable(const CStdString& name, int context);
protected:
/*! \brief Given a resolution, retrieve the corresponding directory name
\param res RESOLUTION to translate
diff --git a/xbmc/guilib/GUIButtonControl.cpp b/xbmc/guilib/GUIButtonControl.cpp
index 7c60bd3e43..5b7a33a2f6 100644
--- a/xbmc/guilib/GUIButtonControl.cpp
+++ b/xbmc/guilib/GUIButtonControl.cpp
@@ -213,13 +213,13 @@ void CGUIButtonControl::SetInvalid()
void CGUIButtonControl::SetLabel(const string &label)
{ // NOTE: No fallback for buttons at this point
- m_info.SetLabel(label, "");
+ m_info.SetLabel(label, "", GetParentID());
SetInvalid();
}
void CGUIButtonControl::SetLabel2(const string &label2)
{ // NOTE: No fallback for buttons at this point
- m_info2.SetLabel(label2, "");
+ m_info2.SetLabel(label2, "", GetParentID());
SetInvalid();
}
diff --git a/xbmc/guilib/GUIControlFactory.cpp b/xbmc/guilib/GUIControlFactory.cpp
index 6853b93b83..c055aa427c 100644
--- a/xbmc/guilib/GUIControlFactory.cpp
+++ b/xbmc/guilib/GUIControlFactory.cpp
@@ -230,11 +230,11 @@ bool CGUIControlFactory::GetAspectRatio(const TiXmlNode* pRootNode, const char*
return true;
}
-bool CGUIControlFactory::GetInfoTexture(const TiXmlNode* pRootNode, const char* strTag, CTextureInfo &image, CGUIInfoLabel &info)
+bool CGUIControlFactory::GetInfoTexture(const TiXmlNode* pRootNode, const char* strTag, CTextureInfo &image, CGUIInfoLabel &info, int parentID)
{
GetTexture(pRootNode, strTag, image);
image.filename = "";
- GetInfoLabel(pRootNode, strTag, info);
+ GetInfoLabel(pRootNode, strTag, info, parentID);
return true;
}
@@ -457,15 +457,15 @@ bool CGUIControlFactory::GetInfoColor(const TiXmlNode *control, const char *strT
return false;
}
-void CGUIControlFactory::GetInfoLabel(const TiXmlNode *pControlNode, const CStdString &labelTag, CGUIInfoLabel &infoLabel)
+void CGUIControlFactory::GetInfoLabel(const TiXmlNode *pControlNode, const CStdString &labelTag, CGUIInfoLabel &infoLabel, int parentID)
{
vector<CGUIInfoLabel> labels;
- GetInfoLabels(pControlNode, labelTag, labels);
+ GetInfoLabels(pControlNode, labelTag, labels, parentID);
if (labels.size())
infoLabel = labels[0];
}
-bool CGUIControlFactory::GetInfoLabelFromElement(const TiXmlElement *element, CGUIInfoLabel &infoLabel)
+bool CGUIControlFactory::GetInfoLabelFromElement(const TiXmlElement *element, CGUIInfoLabel &infoLabel, int parentID)
{
if (!element || !element->FirstChild())
return false;
@@ -483,11 +483,11 @@ bool CGUIControlFactory::GetInfoLabelFromElement(const TiXmlElement *element, CG
fallback = g_localizeStrings.Get(atoi(fallback));
else
g_charsetConverter.unknownToUTF8(fallback);
- infoLabel.SetLabel(label, fallback);
+ infoLabel.SetLabel(label, fallback, parentID);
return true;
}
-void CGUIControlFactory::GetInfoLabels(const TiXmlNode *pControlNode, const CStdString &labelTag, vector<CGUIInfoLabel> &infoLabels)
+void CGUIControlFactory::GetInfoLabels(const TiXmlNode *pControlNode, const CStdString &labelTag, vector<CGUIInfoLabel> &infoLabels, int parentID)
{
// we can have the following infolabels:
// 1. <number>1234</number> -> direct number
@@ -506,7 +506,7 @@ void CGUIControlFactory::GetInfoLabels(const TiXmlNode *pControlNode, const CStd
while (labelNode)
{
CGUIInfoLabel label;
- if (GetInfoLabelFromElement(labelNode, label))
+ if (GetInfoLabelFromElement(labelNode, label, parentID))
infoLabels.push_back(label);
labelNode = labelNode->NextSiblingElement(labelTag);
}
@@ -523,7 +523,7 @@ void CGUIControlFactory::GetInfoLabels(const TiXmlNode *pControlNode, const CStd
{
CStdString info;
info.Format("$INFO[%s]", infoNode->FirstChild()->Value());
- infoLabels.push_back(CGUIInfoLabel(info, fallback));
+ infoLabels.push_back(CGUIInfoLabel(info, fallback, parentID));
}
infoNode = infoNode->NextSibling("info");
}
@@ -856,7 +856,7 @@ CGUIControl* CGUIControlFactory::Create(int parentID, const CRect &rect, TiXmlEl
GetTexture(pControlNode, "overlaytexture", textureOverlay);
// the <texture> tag can be overridden by the <info> tag
- GetInfoTexture(pControlNode, "texture", texture, textureFile);
+ GetInfoTexture(pControlNode, "texture", texture, textureFile, parentID);
#ifdef PRE_SKIN_VERSION_9_10_COMPATIBILITY
if (type == CGUIControl::GUICONTROL_IMAGE && insideContainer && textureFile.IsConstant())
aspect.ratio = CAspectRatio::AR_STRETCH;
@@ -869,7 +869,7 @@ CGUIControl* CGUIControlFactory::Create(int parentID, const CRect &rect, TiXmlEl
// fade label can have a whole bunch, but most just have one
vector<CGUIInfoLabel> infoLabels;
- GetInfoLabels(pControlNode, "label", infoLabels);
+ GetInfoLabels(pControlNode, "label", infoLabels, parentID);
GetString(pControlNode, "label", strLabel);
GetString(pControlNode, "altlabel", altLabel);
@@ -889,7 +889,7 @@ CGUIControl* CGUIControlFactory::Create(int parentID, const CRect &rect, TiXmlEl
XMLUtils::GetBoolean(pControlNode, "scroll", bScrollLabel);
XMLUtils::GetBoolean(pControlNode,"pulseonselect", bPulse);
- GetInfoTexture(pControlNode, "imagepath", texture, texturePath);
+ GetInfoTexture(pControlNode, "imagepath", texture, texturePath, parentID);
XMLUtils::GetUInt(pControlNode,"timeperimage", timePerImage);
XMLUtils::GetUInt(pControlNode,"fadetime", fadeTime);
@@ -1032,7 +1032,7 @@ CGUIControl* CGUIControlFactory::Create(int parentID, const CRect &rect, TiXmlEl
labelInfo, strLabel);
CGUIInfoLabel hint_text;
- GetInfoLabel(pControlNode, "hinttext", hint_text);
+ GetInfoLabel(pControlNode, "hinttext", hint_text, parentID);
((CGUIEditControl *) control)->SetHint(hint_text);
if (bPassword)
diff --git a/xbmc/guilib/GUIControlFactory.h b/xbmc/guilib/GUIControlFactory.h
index 48803bc243..ea009c26fb 100644
--- a/xbmc/guilib/GUIControlFactory.h
+++ b/xbmc/guilib/GUIControlFactory.h
@@ -74,7 +74,7 @@ public:
*/
static bool GetDimension(const TiXmlNode* pRootNode, const char* strTag, float &value, float &min);
static bool GetAspectRatio(const TiXmlNode* pRootNode, const char* strTag, CAspectRatio &aspectRatio);
- static bool GetInfoTexture(const TiXmlNode* pRootNode, const char* strTag, CTextureInfo &image, CGUIInfoLabel &info);
+ static bool GetInfoTexture(const TiXmlNode* pRootNode, const char* strTag, CTextureInfo &image, CGUIInfoLabel &info, int parentID);
static bool GetTexture(const TiXmlNode* pRootNode, const char* strTag, CTextureInfo &image);
static bool GetAlignment(const TiXmlNode* pRootNode, const char* strTag, uint32_t& dwAlignment);
static bool GetAlignmentY(const TiXmlNode* pRootNode, const char* strTag, uint32_t& dwAlignment);
@@ -90,9 +90,9 @@ public:
\param infoLabel returned infoLabel
\return true if a valid info label was read, false otherwise
*/
- static bool GetInfoLabelFromElement(const TiXmlElement *element, CGUIInfoLabel &infoLabel);
- static void GetInfoLabel(const TiXmlNode *pControlNode, const CStdString &labelTag, CGUIInfoLabel &infoLabel);
- static void GetInfoLabels(const TiXmlNode *pControlNode, const CStdString &labelTag, std::vector<CGUIInfoLabel> &infoLabels);
+ static bool GetInfoLabelFromElement(const TiXmlElement *element, CGUIInfoLabel &infoLabel, int parentID);
+ static void GetInfoLabel(const TiXmlNode *pControlNode, const CStdString &labelTag, CGUIInfoLabel &infoLabel, int parentID);
+ static void GetInfoLabels(const TiXmlNode *pControlNode, const CStdString &labelTag, std::vector<CGUIInfoLabel> &infoLabels, int parentID);
static bool GetColor(const TiXmlNode* pRootNode, const char* strTag, color_t &value);
static bool GetInfoColor(const TiXmlNode* pRootNode, const char* strTag, CGUIInfoColor &value);
static CStdString FilterLabel(const CStdString &label);
diff --git a/xbmc/guilib/GUIFadeLabelControl.cpp b/xbmc/guilib/GUIFadeLabelControl.cpp
index b610fee5b3..dceba435bc 100644
--- a/xbmc/guilib/GUIFadeLabelControl.cpp
+++ b/xbmc/guilib/GUIFadeLabelControl.cpp
@@ -67,7 +67,7 @@ void CGUIFadeLabelControl::SetInfo(const vector<CGUIInfoLabel> &infoLabels)
void CGUIFadeLabelControl::AddLabel(const string &label)
{
- m_infoLabels.push_back(CGUIInfoLabel(label));
+ m_infoLabels.push_back(CGUIInfoLabel(label, "", GetParentID()));
}
void CGUIFadeLabelControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
diff --git a/xbmc/guilib/GUIImage.cpp b/xbmc/guilib/GUIImage.cpp
index 5204ef1a95..1614068e42 100644
--- a/xbmc/guilib/GUIImage.cpp
+++ b/xbmc/guilib/GUIImage.cpp
@@ -302,7 +302,7 @@ void CGUIImage::SetCrossFade(unsigned int time)
void CGUIImage::SetFileName(const CStdString& strFileName, bool setConstant)
{
if (setConstant)
- m_info.SetLabel(strFileName, "");
+ m_info.SetLabel(strFileName, "", GetParentID());
if (m_crossFadeTime)
{
diff --git a/xbmc/guilib/GUIIncludes.cpp b/xbmc/guilib/GUIIncludes.cpp
index 8cdf3c5d81..0ca7ce3d7b 100644
--- a/xbmc/guilib/GUIIncludes.cpp
+++ b/xbmc/guilib/GUIIncludes.cpp
@@ -85,6 +85,7 @@ void CGUIIncludes::ClearIncludes()
m_includes.clear();
m_defaults.clear();
m_constants.clear();
+ m_skinvariables.clear();
m_files.clear();
}
@@ -153,7 +154,16 @@ bool CGUIIncludes::LoadIncludesFromXML(const TiXmlElement *root)
node = node->NextSiblingElement("constant");
}
- INFO::CSkinVariable::LoadFromXML(root);
+ node = root->FirstChildElement("variable");
+ while (node)
+ {
+ if (node->Attribute("name") && node->FirstChild())
+ {
+ CStdString tagName = node->Attribute("name");
+ m_skinvariables.insert(make_pair(tagName, *node));
+ }
+ node = node->NextSiblingElement("variable");
+ }
return true;
}
@@ -273,3 +283,11 @@ CStdString CGUIIncludes::ResolveConstant(const CStdString &constant) const
StringUtils::JoinString(values, ",", value);
return value;
}
+
+const INFO::CSkinVariableString* CGUIIncludes::CreateSkinVariable(const CStdString& name, int context)
+{
+ map<CStdString, TiXmlElement>::const_iterator it = m_skinvariables.find(name);
+ if (it != m_skinvariables.end())
+ return INFO::CSkinVariable::CreateFromXML(it->second, context);
+ return NULL;
+}
diff --git a/xbmc/guilib/GUIIncludes.h b/xbmc/guilib/GUIIncludes.h
index 7c8ec9027c..2558908070 100644
--- a/xbmc/guilib/GUIIncludes.h
+++ b/xbmc/guilib/GUIIncludes.h
@@ -28,6 +28,10 @@
// forward definitions
class TiXmlElement;
+namespace INFO
+{
+ class CSkinVariableString;
+}
class CGUIIncludes
{
@@ -45,6 +49,7 @@ public:
\param node an XML Element - all child elements are traversed.
*/
void ResolveIncludes(TiXmlElement *node);
+ const INFO::CSkinVariableString* CreateSkinVariable(const CStdString& name, int context);
private:
void ResolveIncludesForNode(TiXmlElement *node);
@@ -52,6 +57,7 @@ private:
bool HasIncludeFile(const CStdString &includeFile) const;
std::map<CStdString, TiXmlElement> m_includes;
std::map<CStdString, TiXmlElement> m_defaults;
+ std::map<CStdString, TiXmlElement> m_skinvariables;
std::map<CStdString, CStdString> m_constants;
std::vector<CStdString> m_files;
typedef std::vector<CStdString>::const_iterator iFiles;
diff --git a/xbmc/guilib/GUIInfoTypes.cpp b/xbmc/guilib/GUIInfoTypes.cpp
index 0216e23259..975a26b296 100644
--- a/xbmc/guilib/GUIInfoTypes.cpp
+++ b/xbmc/guilib/GUIInfoTypes.cpp
@@ -28,6 +28,7 @@
#include "GUIColorManager.h"
#include "GUIListItem.h"
#include "utils/StringUtils.h"
+#include "addons/Skin.h"
using namespace std;
using ADDON::CAddonMgr;
@@ -118,15 +119,15 @@ CGUIInfoLabel::CGUIInfoLabel()
{
}
-CGUIInfoLabel::CGUIInfoLabel(const CStdString &label, const CStdString &fallback)
+CGUIInfoLabel::CGUIInfoLabel(const CStdString &label, const CStdString &fallback, int context)
{
- SetLabel(label, fallback);
+ SetLabel(label, fallback, context);
}
-void CGUIInfoLabel::SetLabel(const CStdString &label, const CStdString &fallback)
+void CGUIInfoLabel::SetLabel(const CStdString &label, const CStdString &fallback, int context)
{
m_fallback = fallback;
- Parse(label);
+ Parse(label, context);
}
CStdString CGUIInfoLabel::GetLabel(int contextWindow, bool preferImage) const
@@ -260,7 +261,7 @@ const static infoformat infoformatmap[] = {{ "$INFO[", FORMATINFO },
{ "$ESCINFO[", FORMATESCINFO},
{ "$VAR[", FORMATVAR}};
-void CGUIInfoLabel::Parse(const CStdString &label)
+void CGUIInfoLabel::Parse(const CStdString &label, int context)
{
m_info.clear();
// Step 1: Replace all $LOCALIZE[number] with the real string
@@ -301,12 +302,11 @@ void CGUIInfoLabel::Parse(const CStdString &label)
int info;
if (format == FORMATVAR)
{
- info = g_infoManager.TranslateSkinVariableString(params[0]);
+ info = g_infoManager.TranslateSkinVariableString(params[0], context);
if (info == 0)
- {
- // we didn't register this conditional label yet!
- CLog::Log(LOGWARNING, "Label Formating: $VAR[%s] is not yet defined", params[0].c_str());
- }
+ info = g_infoManager.RegisterSkinVariableString(g_SkinInfo->CreateSkinVariable(params[0], context));
+ if (info == 0) // skinner didn't define this conditional label!
+ CLog::Log(LOGWARNING, "Label Formating: $VAR[%s] is not defined", params[0].c_str());
}
else
info = g_infoManager.TranslateString(params[0]);
@@ -358,6 +358,6 @@ CStdString CGUIInfoLabel::CInfoPortion::GetLabel(const CStdString &info) const
CStdString CGUIInfoLabel::GetLabel(const CStdString &label, int contextWindow, bool preferImage)
{ // translate the label
- CGUIInfoLabel info(label, "");
+ CGUIInfoLabel info(label, "", contextWindow);
return info.GetLabel(contextWindow, preferImage);
}
diff --git a/xbmc/guilib/GUIInfoTypes.h b/xbmc/guilib/GUIInfoTypes.h
index 373463172c..ac1a220cd9 100644
--- a/xbmc/guilib/GUIInfoTypes.h
+++ b/xbmc/guilib/GUIInfoTypes.h
@@ -72,9 +72,9 @@ class CGUIInfoLabel
{
public:
CGUIInfoLabel();
- CGUIInfoLabel(const CStdString &label, const CStdString &fallback = "");
+ CGUIInfoLabel(const CStdString &label, const CStdString &fallback = "", int context = 0);
- void SetLabel(const CStdString &label, const CStdString &fallback);
+ void SetLabel(const CStdString &label, const CStdString &fallback, int context = 0);
CStdString GetLabel(int contextWindow, bool preferImage = false) const;
CStdString GetItemLabel(const CGUIListItem *item, bool preferImage = false) const;
bool IsConstant() const;
@@ -99,7 +99,7 @@ public:
static CStdString ReplaceAddonStrings(const CStdString &label);
private:
- void Parse(const CStdString &label);
+ void Parse(const CStdString &label, int context);
class CInfoPortion
{
diff --git a/xbmc/guilib/GUILabelControl.cpp b/xbmc/guilib/GUILabelControl.cpp
index af7e39fa29..f78c8a9a28 100644
--- a/xbmc/guilib/GUILabelControl.cpp
+++ b/xbmc/guilib/GUILabelControl.cpp
@@ -142,7 +142,7 @@ bool CGUILabelControl::CanFocus() const
void CGUILabelControl::SetLabel(const string &strLabel)
{
- m_infoLabel.SetLabel(strLabel, "");
+ m_infoLabel.SetLabel(strLabel, "", GetParentID());
if (m_iCursorPos > (int)strLabel.size())
m_iCursorPos = strLabel.size();
diff --git a/xbmc/guilib/GUIListItemLayout.cpp b/xbmc/guilib/GUIListItemLayout.cpp
index 1efe1236ec..2f9d72576f 100644
--- a/xbmc/guilib/GUIListItemLayout.cpp
+++ b/xbmc/guilib/GUIListItemLayout.cpp
@@ -189,14 +189,14 @@ void CGUIListItemLayout::CreateListControlLayouts(float width, float height, boo
m_group.AddControl(tex);
}
CGUIImage *image = new CGUIImage(0, 0, 8, 0, iconWidth, texHeight, CTextureInfo(""));
- image->SetInfo(CGUIInfoLabel("$INFO[ListItem.Icon]"));
+ image->SetInfo(CGUIInfoLabel("$INFO[ListItem.Icon]", "", m_group.GetParentID()));
image->SetAspectRatio(CAspectRatio::AR_KEEP);
m_group.AddControl(image);
float x = iconWidth + labelInfo.offsetX + 10;
- CGUIListLabel *label = new CGUIListLabel(0, 0, x, labelInfo.offsetY, width - x - 18, height, labelInfo, CGUIInfoLabel("$INFO[ListItem.Label]"), false);
+ CGUIListLabel *label = new CGUIListLabel(0, 0, x, labelInfo.offsetY, width - x - 18, height, labelInfo, CGUIInfoLabel("$INFO[ListItem.Label]", "", m_group.GetParentID()), false);
m_group.AddControl(label);
x = labelInfo2.offsetX ? labelInfo2.offsetX : m_width - 16;
- label = new CGUIListLabel(0, 0, x, labelInfo2.offsetY, x - iconWidth - 20, height, labelInfo2, CGUIInfoLabel("$INFO[ListItem.Label2]"), false);
+ label = new CGUIListLabel(0, 0, x, labelInfo2.offsetY, x - iconWidth - 20, height, labelInfo2, CGUIInfoLabel("$INFO[ListItem.Label2]", "", m_group.GetParentID()), false);
m_group.AddControl(label);
}
//#endif
diff --git a/xbmc/guilib/GUIStaticItem.cpp b/xbmc/guilib/GUIStaticItem.cpp
index 8c318b8f80..0138af2a1f 100644
--- a/xbmc/guilib/GUIStaticItem.cpp
+++ b/xbmc/guilib/GUIStaticItem.cpp
@@ -39,10 +39,10 @@ CGUIStaticItem::CGUIStaticItem(const TiXmlElement *item, int parentID) : CFileIt
if (click && click->FirstChild())
{
CGUIInfoLabel label, label2, thumb, icon;
- CGUIControlFactory::GetInfoLabel(item, "label", label);
- CGUIControlFactory::GetInfoLabel(item, "label2", label2);
- CGUIControlFactory::GetInfoLabel(item, "thumb", thumb);
- CGUIControlFactory::GetInfoLabel(item, "icon", icon);
+ CGUIControlFactory::GetInfoLabel(item, "label", label, parentID);
+ CGUIControlFactory::GetInfoLabel(item, "label2", label2, parentID);
+ CGUIControlFactory::GetInfoLabel(item, "thumb", thumb, parentID);
+ CGUIControlFactory::GetInfoLabel(item, "icon", icon, parentID);
const char *id = item->Attribute("id");
CStdString condition;
CGUIControlFactory::GetConditionalVisibility(item, condition);
@@ -63,7 +63,7 @@ CGUIStaticItem::CGUIStaticItem(const TiXmlElement *item, int parentID) : CFileIt
{
CStdString name = property->Attribute("name");
CGUIInfoLabel prop;
- if (!name.IsEmpty() && CGUIControlFactory::GetInfoLabelFromElement(property, prop))
+ if (!name.IsEmpty() && CGUIControlFactory::GetInfoLabelFromElement(property, prop, parentID))
{
SetProperty(name, prop.GetLabel(parentID, true).c_str());
if (!prop.IsConstant())
diff --git a/xbmc/guilib/GUITextBox.cpp b/xbmc/guilib/GUITextBox.cpp
index 81c0367499..3e8c77c143 100644
--- a/xbmc/guilib/GUITextBox.cpp
+++ b/xbmc/guilib/GUITextBox.cpp
@@ -244,7 +244,7 @@ bool CGUITextBox::OnMessage(CGUIMessage& message)
m_scrollOffset = 0;
ResetAutoScrolling();
CGUITextLayout::Reset();
- m_info.SetLabel(message.GetLabel(), "");
+ m_info.SetLabel(message.GetLabel(), "", GetParentID());
}
if (message.GetMessage() == GUI_MSG_LABEL_RESET)
diff --git a/xbmc/interfaces/info/SkinVariable.cpp b/xbmc/interfaces/info/SkinVariable.cpp
index 9228bb4cdf..2f0f8e6fe7 100644
--- a/xbmc/interfaces/info/SkinVariable.cpp
+++ b/xbmc/interfaces/info/SkinVariable.cpp
@@ -28,56 +28,54 @@ using namespace INFO;
#define DEFAULT_VALUE -1
-void CSkinVariable::LoadFromXML(const TiXmlElement *root)
+const CSkinVariableString* CSkinVariable::CreateFromXML(const TiXmlElement& node, int context)
{
- const TiXmlElement* node = root->FirstChildElement("variable");
- while (node)
+ const char* name = node.Attribute("name");
+ if (name)
{
- if (node->Attribute("name") && node->FirstChild())
+ CSkinVariableString* tmp = new CSkinVariableString;
+ tmp->m_name = name;
+ tmp->m_context = context;
+ const TiXmlElement* valuenode = node.FirstChildElement("value");
+ while (valuenode)
{
- const char* type = node->Attribute("type");
-
- // parameter type will be used in future for numeric and bool variables
- if (!type || strnicmp(type, "text", 4) == 0)
+ if (valuenode->FirstChild())
{
- CSkinVariableString tmp;
- tmp.m_name = node->Attribute("name");
- const TiXmlElement* valuenode = node->FirstChildElement("value");
- while (valuenode)
- {
- if (valuenode->FirstChild())
- {
- CSkinVariableString::ConditionLabelPair pair;
- if (valuenode->Attribute("condition"))
- pair.m_condition = g_infoManager.Register(valuenode->Attribute("condition"));
- else
- pair.m_condition = DEFAULT_VALUE;
+ CSkinVariableString::ConditionLabelPair pair;
+ if (valuenode->Attribute("condition"))
+ pair.m_condition = g_infoManager.Register(valuenode->Attribute("condition"), context);
+ else
+ pair.m_condition = DEFAULT_VALUE;
- pair.m_label = CGUIInfoLabel(valuenode->FirstChild()->Value());
- tmp.m_conditionLabelPairs.push_back(pair);
- if (pair.m_condition == DEFAULT_VALUE)
- break; // once we reach default value (without condition) break iterating
- }
- valuenode = valuenode->NextSiblingElement("value");
- }
- if (tmp.m_conditionLabelPairs.size() > 0)
- g_infoManager.RegisterSkinVariableString(tmp);
+ pair.m_label = CGUIInfoLabel(valuenode->FirstChild()->Value());
+ tmp->m_conditionLabelPairs.push_back(pair);
+ if (pair.m_condition == DEFAULT_VALUE)
+ break; // once we reach default value (without condition) break iterating
}
+ valuenode = valuenode->NextSiblingElement("value");
}
- node = node->NextSiblingElement("variable");
+ if (tmp->m_conditionLabelPairs.size() > 0)
+ return tmp;
+ delete tmp;
}
+ return NULL;
}
CSkinVariableString::CSkinVariableString()
{
}
+int CSkinVariableString::GetContext() const
+{
+ return m_context;
+}
+
const CStdString& CSkinVariableString::GetName() const
{
return m_name;
}
-CStdString CSkinVariableString::GetValue(int contextWindow, bool preferImage /* = false*/, const CGUIListItem *item /* = NULL */)
+CStdString CSkinVariableString::GetValue(bool preferImage /* = false*/, const CGUIListItem *item /* = NULL */)
{
for (VECCONDITIONLABELPAIR::const_iterator it = m_conditionLabelPairs.begin() ; it != m_conditionLabelPairs.end(); it++)
{
@@ -86,7 +84,7 @@ CStdString CSkinVariableString::GetValue(int contextWindow, bool preferImage /*
if (item)
return it->m_label.GetItemLabel(item, preferImage);
else
- return it->m_label.GetLabel(contextWindow, preferImage);
+ return it->m_label.GetLabel(m_context, preferImage);
}
}
return "";
diff --git a/xbmc/interfaces/info/SkinVariable.h b/xbmc/interfaces/info/SkinVariable.h
index b880121b7e..907aab718b 100644
--- a/xbmc/interfaces/info/SkinVariable.h
+++ b/xbmc/interfaces/info/SkinVariable.h
@@ -26,21 +26,25 @@ class TiXmlElement;
namespace INFO
{
+class CSkinVariableString;
+
class CSkinVariable
{
public:
- static void LoadFromXML(const TiXmlElement *root);
+ static const CSkinVariableString* CreateFromXML(const TiXmlElement& node, int context);
};
class CSkinVariableString
{
public:
const CStdString& GetName() const;
- CStdString GetValue(int contextWindow, bool preferImage = false, const CGUIListItem *item = NULL );
+ int GetContext() const;
+ CStdString GetValue(bool preferImage = false, const CGUIListItem *item = NULL );
private:
CSkinVariableString();
CStdString m_name;
+ int m_context;
struct ConditionLabelPair
{