Skip to content

Commit

Permalink
Merge pull request #481 from pieh/skin_vars_infobool_context
Browse files Browse the repository at this point in the history
Store context in skin variables
  • Loading branch information
pieh committed Oct 18, 2011
2 parents 9c72e40 + e4ee1d0 commit 70eda64
Show file tree
Hide file tree
Showing 19 changed files with 129 additions and 97 deletions.
28 changes: 14 additions & 14 deletions xbmc/GUIInfoManager.cpp
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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 "";
}
6 changes: 3 additions & 3 deletions xbmc/GUIInfoManager.h
Expand Up @@ -676,9 +676,9 @@ class CGUIInfoManager : public IMsgTargetCallback

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);
Expand Down
5 changes: 5 additions & 0 deletions xbmc/addons/Skin.cpp
Expand Up @@ -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*/
1 change: 1 addition & 0 deletions xbmc/addons/Skin.h
Expand Up @@ -109,6 +109,7 @@ class CSkinInfo : public CAddon
// 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
Expand Down
4 changes: 2 additions & 2 deletions xbmc/guilib/GUIButtonControl.cpp
Expand Up @@ -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();
}

Expand Down
26 changes: 13 additions & 13 deletions xbmc/guilib/GUIControlFactory.cpp
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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);
}
Expand All @@ -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");
}
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 4 additions & 4 deletions xbmc/guilib/GUIControlFactory.h
Expand Up @@ -74,7 +74,7 @@ class CGUIControlFactory
*/
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);
Expand All @@ -90,9 +90,9 @@ class CGUIControlFactory
\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);
Expand Down
2 changes: 1 addition & 1 deletion xbmc/guilib/GUIFadeLabelControl.cpp
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion xbmc/guilib/GUIImage.cpp
Expand Up @@ -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)
{
Expand Down
20 changes: 19 additions & 1 deletion xbmc/guilib/GUIIncludes.cpp
Expand Up @@ -85,6 +85,7 @@ void CGUIIncludes::ClearIncludes()
m_includes.clear();
m_defaults.clear();
m_constants.clear();
m_skinvariables.clear();
m_files.clear();
}

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
6 changes: 6 additions & 0 deletions xbmc/guilib/GUIIncludes.h
Expand Up @@ -28,6 +28,10 @@

// forward definitions
class TiXmlElement;
namespace INFO
{
class CSkinVariableString;
}

class CGUIIncludes
{
Expand All @@ -45,13 +49,15 @@ class CGUIIncludes
\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);
CStdString ResolveConstant(const CStdString &constant) const;
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;
Expand Down
22 changes: 11 additions & 11 deletions xbmc/guilib/GUIInfoTypes.cpp
Expand Up @@ -28,6 +28,7 @@
#include "GUIColorManager.h"
#include "GUIListItem.h"
#include "utils/StringUtils.h"
#include "addons/Skin.h"

using namespace std;
using ADDON::CAddonMgr;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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]);
Expand Down Expand Up @@ -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);
}

0 comments on commit 70eda64

Please sign in to comment.