diff options
author | louis <louis.braun@gmx.de> | 2015-01-24 10:47:47 +0100 |
---|---|---|
committer | louis <louis.braun@gmx.de> | 2015-01-24 10:47:47 +0100 |
commit | a74cb93163146e547abc641638874697904672e5 (patch) | |
tree | 5ade879d4ad7808cfb8eca6ad2bd40636a4fa22b /libtemplate | |
parent | 5733a499407a11b095887e06df09c4e5d6debeda (diff) | |
download | vdr-plugin-skindesigner-a74cb93163146e547abc641638874697904672e5.tar.gz vdr-plugin-skindesigner-a74cb93163146e547abc641638874697904672e5.tar.bz2 |
introduced globals.xml in skinpath, theme.xml in theme path
Diffstat (limited to 'libtemplate')
-rw-r--r-- | libtemplate/globals.c | 153 | ||||
-rw-r--r-- | libtemplate/globals.h | 26 | ||||
-rw-r--r-- | libtemplate/parameter.c | 43 | ||||
-rw-r--r-- | libtemplate/templatefunction.c | 36 | ||||
-rw-r--r-- | libtemplate/templateview.h | 4 | ||||
-rw-r--r-- | libtemplate/templateviewlist.c | 27 | ||||
-rw-r--r-- | libtemplate/xmlparser.c | 46 | ||||
-rw-r--r-- | libtemplate/xmlparser.h | 2 |
8 files changed, 227 insertions, 110 deletions
diff --git a/libtemplate/globals.c b/libtemplate/globals.c index 9a94b4f..36e2c19 100644 --- a/libtemplate/globals.c +++ b/libtemplate/globals.c @@ -1,5 +1,6 @@ #include "globals.h" #include "xmlparser.h" +#include "../config.h" #include <locale.h> cGlobals::cGlobals(void) { @@ -11,15 +12,134 @@ cGlobals::cGlobals(void) { } bool cGlobals::ReadFromXML(void) { + //globals.xml is mandatory string xmlFile = "globals.xml"; cXmlParser parser; - if (!parser.ReadGlobals(this, xmlFile)) + if (!parser.ReadGlobals(this, xmlFile, true)) return false; if (!parser.ParseGlobals()) return false; + //theme.xml is optional + xmlFile = "theme.xml"; + if (parser.ReadGlobals(this, xmlFile, false)) { + parser.ParseGlobals(); + } return true; } +void cGlobals::AddColor(string &name, tColor &col) { + colors.erase(name); + colors.insert(pair<string, tColor>(name, col)); +} + +bool cGlobals::GetColor(string &name, tColor &col) { + int size = name.size(); + if (size < 2) + return false; + string nameCutted = name.substr(1, size-2); + map <string, tColor>::iterator hit = colors.find(nameCutted); + if (hit != colors.end()) { + col = hit->second; + return true; + } + return false; +} + +void cGlobals::AddFont(string &name, string &font) { + fonts.erase(name); + fonts.insert(pair<string, string>(name, font)); +} + +bool cGlobals::GetFont(string name, string &font) { + int size = name.size(); + if (size < 2) + return false; + string nameCutted = name.substr(1, size-2); + map<string,string>::iterator hit = fonts.find(nameCutted); + if (hit != fonts.end()) { + font = hit->second; + return true; + } + return false; +} + +void cGlobals::AddInt(string &name, int value) { + intVars.erase(name); + intVars.insert(pair<string, int>(name, value)); +} + +void cGlobals::ReplaceIntVars(string &value) { + for (map<string, int>::iterator it = intVars.begin(); it != intVars.end(); it++) { + stringstream sToken; + sToken << "{" << it->first << "}"; + string token = sToken.str(); + size_t foundToken = value.find(token); + if (foundToken != string::npos) { + stringstream st; + st << it->second; + value = value.replace(foundToken, token.size(), st.str()); + } + } +} + +bool cGlobals::GetInt(string name, int &val) { + map < string, int >::iterator hit = intVars.find(name); + if (hit != intVars.end()) { + val = hit->second; + return true; + } + return false; +} + +void cGlobals::AddDouble(string &name, string &value) { + doubleVars.erase(name); + if (config.replaceDecPoint) { + if (value.find_first_of('.') != string::npos) { + std::replace( value.begin(), value.end(), '.', config.decPoint); + } + } + double val = atof(value.c_str()); + doubleVars.insert(pair<string, double>(name, val)); +} + +void cGlobals::ReplaceDoubleVars(string &value) { + for (map<string, double>::iterator it = doubleVars.begin(); it != doubleVars.end(); it++) { + stringstream sToken; + sToken << "{" << it->first << "}"; + string token = sToken.str(); + size_t foundToken = value.find(token); + if (foundToken != string::npos) { + stringstream st; + st << it->second; + string doubleVal = st.str(); + value = value.replace(foundToken, token.size(), doubleVal); + } + } +} + +void cGlobals::AddString(string &name, string &value) { + stringVars.erase(name); + stringVars.insert(pair<string, string>(name, value)); +} + +void cGlobals::ReplaceStringVars(string &value) { + for (map<string,string>::iterator it = stringVars.begin(); it != stringVars.end(); it++) { + stringstream sToken; + sToken << "{" << it->first << "}"; + string token = sToken.str(); + size_t foundToken = value.find(token); + if (foundToken != string::npos) { + value = value.replace(foundToken, token.size(), it->second); + } + } + +} + +bool cGlobals::AddTranslation(string name, map < string, string > transl) { + translations.erase(name); + translations.insert(pair<string, map < string, string > >(name, transl)); +} + bool cGlobals::Translate(string text, string &translation) { string transStart = "{tr("; string transEnd = ")}"; @@ -63,6 +183,34 @@ string cGlobals::DoTranslate(string token) { return translation; } +void cGlobals::AddCustomInt(string &name, int value) { + customIntTokens.erase(name); + customIntTokens.insert(pair<string,int>(name, value)); +} + +void cGlobals::AddCustomString(string &name, string &value) { + customStringTokens.erase(name); + customStringTokens.insert(pair<string,string>(name, value)); +} + +bool cGlobals::GetCustomInt(string name, int &val) { + map < string, int >::iterator hit = customIntTokens.find(name); + if (hit != customIntTokens.end()) { + val = hit->second; + return true; + } + return false; +} + +void cGlobals::ListCustomTokens(void) { + for (map<string, string>::iterator it = customStringTokens.begin(); it != customStringTokens.end(); it++) { + dsyslog("skindesigner: custom string token \"%s\" = \"%s\"", (it->first).c_str(), (it->second).c_str()); + } + for (map<string, int>::iterator it = customIntTokens.begin(); it != customIntTokens.end(); it++) { + dsyslog("skindesigner: custom int token \"%s\" = \"%d\"", (it->first).c_str(), it->second); + } +} + void cGlobals::Debug(void) { dsyslog("skindesigner: GLOBAL VARIABLES"); for (map <string, tColor>::iterator col = colors.begin(); col != colors.end(); col++) { @@ -80,7 +228,7 @@ void cGlobals::Debug(void) { for (map <string, string>::iterator font = fonts.begin(); font != fonts.end(); font++) { dsyslog("skindesigner: Font \"%s\": \"%s\"", (font->first).c_str(), (font->second).c_str()); } - /* + for (map <string, map< string, string > >::iterator trans = translations.begin(); trans != translations.end(); trans++) { dsyslog("skindesigner: Translation Token %s", (trans->first).c_str()); map< string, string > tokenTrans = trans->second; @@ -88,5 +236,4 @@ void cGlobals::Debug(void) { dsyslog("skindesigner: language %s, translation %s", (transTok->first).c_str(), (transTok->second).c_str()); } } - */ } diff --git a/libtemplate/globals.h b/libtemplate/globals.h index 17f5242..9629e63 100644 --- a/libtemplate/globals.h +++ b/libtemplate/globals.h @@ -22,19 +22,37 @@ class cGlobals { private: string language; string DoTranslate(string token); -public: - cGlobals(void); - virtual ~cGlobals(void) {}; map <string, tColor> colors; + map <string, string> fonts; map <string, int> intVars; map <string, double> doubleVars; map <string, string> stringVars; - map <string, string> fonts; map <string, map< string, string > > translations; map <string, string> customStringTokens; map <string, int> customIntTokens; +public: + cGlobals(void); + virtual ~cGlobals(void) {}; bool ReadFromXML(void); + void AddColor(string &name, tColor &col); + bool GetColor(string &name, tColor &col); + void AddFont(string &name, string &font); + bool GetFont(string name, string &font); + void AddInt(string &name, int value); + void ReplaceIntVars(string &value); + bool GetInt(string name, int &val); + void AddDouble(string &name, string &value); + void ReplaceDoubleVars(string &value); + void AddString(string &name, string &value); + void ReplaceStringVars(string &value); + bool AddTranslation(string name, map < string, string > transl); bool Translate(string text, string &translation); + void AddCustomInt(string &name, int value); + void AddCustomString(string &name, string &value); + bool GetCustomInt(string name, int &val); + map <string, string> GetCustomStringTokens(void) { return customStringTokens; }; + map <string, int> GetCustomIntTokens(void) { return customIntTokens; }; + void ListCustomTokens(void); void Debug(void); }; diff --git a/libtemplate/parameter.c b/libtemplate/parameter.c index 83597c8..1479014 100644 --- a/libtemplate/parameter.c +++ b/libtemplate/parameter.c @@ -146,34 +146,8 @@ bool cNumericParameter::CheckExpression(int &val, string &parsedVal) { } if (globals) { - for (map<string, int>::iterator globInt = globals->intVars.begin(); globInt != globals->intVars.end(); globInt++) { - stringstream sToken; - sToken << "{" << globInt->first << "}"; - string token = sToken.str(); - size_t foundToken = parsedValue.find(token); - if (foundToken != string::npos) { - stringstream st; - st << globInt->second; - parsedValue = parsedValue.replace(foundToken, token.size(), st.str()); - } - } - for (map<string, double>::iterator globDouble = globals->doubleVars.begin(); globDouble != globals->doubleVars.end(); globDouble++) { - stringstream sToken; - sToken << "{" << globDouble->first << "}"; - string token = sToken.str(); - size_t foundToken = parsedValue.find(token); - if (foundToken != string::npos) { - stringstream st; - st << globDouble->second; - string doubleVal = st.str(); - if (config.replaceDecPoint) { - if (doubleVal.find_first_of('.') != string::npos) { - std::replace( doubleVal.begin(), doubleVal.end(), '.', config.decPoint); - } - } - parsedValue = parsedValue.replace(foundToken, token.size(), doubleVal); - } - } + globals->ReplaceIntVars(parsedValue); + globals->ReplaceDoubleVars(parsedValue); } if (IsNumber(parsedValue)) { @@ -339,15 +313,12 @@ bool cConditionalParameter::Evaluate(map < string, int > *intTokens, map < strin int cConditionalParameter::EvaluateParameter(string token, map < string, int > *intTokens, map < string, string > *stringTokens) { //first check globals - map < string, int >::iterator hitGlobals = globals->intVars.find(token); - if (hitGlobals != globals->intVars.end()) { - return hitGlobals->second; - } + int result = 0; + if (globals->GetInt(token, result)) + return result; //then check custom tokens - map < string, int >::iterator hitCustomTokens = globals->customIntTokens.find(token); - if (hitCustomTokens != globals->customIntTokens.end()) { - return hitCustomTokens->second; - } + if (globals->GetCustomInt(token, result)) + return result; //then check tokens if (intTokens) { map < string, int >::iterator hit = intTokens->find(token); diff --git a/libtemplate/templatefunction.c b/libtemplate/templatefunction.c index 80cf762..0b3de8a 100644 --- a/libtemplate/templatefunction.c +++ b/libtemplate/templatefunction.c @@ -777,16 +777,11 @@ bool cTemplateFunction::SetAlign(eParamType type, string value) { bool cTemplateFunction::SetFont(eParamType type, string value) {
//check if token
- if ((value.find("{") == 0) && (value.find("}") == (value.size()-1))) {
- value = value.substr(1, value.size()-2);
- map<string,string>::iterator hit = globals->fonts.find(value);
- if (hit != globals->fonts.end()) {
- fontName = hit->second;
- } else {
- map<string,string>::iterator def = globals->fonts.find("vdrOsd");
- if (def == globals->fonts.end())
+ if (IsToken(value)) {
+ if (!globals->GetFont(value, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
return false;
- fontName = def->second;
+ }
}
} else {
//if no token, directly use input
@@ -820,15 +815,10 @@ bool cTemplateFunction::SetImageType(eParamType type, string value) { bool cTemplateFunction::SetColor(eParamType type, string value) {
if (globals) {
- for (map<string, tColor>::iterator col = globals->colors.begin(); col != globals->colors.end(); col++) {
- stringstream sColName;
- sColName << "{" << col->first << "}";
- string colName = sColName.str();
- if (!colName.compare(value)) {
- tColor colVal = col->second;
- colorParameters.insert(pair<eParamType, tColor>(type, colVal));
- return true;
- }
+ tColor colVal = 0x00000000;
+ if (globals->GetColor(value, colVal)) {
+ colorParameters.insert(pair<eParamType, tColor>(type, colVal));
+ return true;
}
}
if (value.size() != 8)
@@ -844,15 +834,7 @@ bool cTemplateFunction::SetColor(eParamType type, string value) { bool cTemplateFunction::SetTextTokens(string value) {
textTokens.clear();
//first replace globals
- for (map<string,string>::iterator globStr = globals->stringVars.begin(); globStr != globals->stringVars.end(); globStr++) {
- stringstream sToken;
- sToken << "{" << globStr->first << "}";
- string token = sToken.str();
- size_t foundToken = value.find(token);
- if (foundToken != string::npos) {
- value = value.replace(foundToken, token.size(), globStr->second);
- }
- }
+ globals->ReplaceStringVars(value);
//now tokenize
bool tokenFound = true;
while (tokenFound) {
diff --git a/libtemplate/templateview.h b/libtemplate/templateview.h index 1ad5734..1cd4289 100644 --- a/libtemplate/templateview.h +++ b/libtemplate/templateview.h @@ -105,8 +105,8 @@ public: int GetNumPixmapsViewElement(eViewElement ve); int GetNumListViewMenuItems(void); bool GetScalingWindow(cRect &scalingWindow); - map<string,string> GetCustomStringTokens(void) { return globals->customStringTokens; }; - map<string,int> GetCustomIntTokens(void) { return globals->customIntTokens; }; + map<string,string> GetCustomStringTokens(void) { return globals->GetCustomStringTokens(); }; + map<string,int> GetCustomIntTokens(void) { return globals->GetCustomIntTokens(); }; //Checks for parsing template XML files bool ValidSubView(const char *subView); bool ValidViewElement(const char *viewElement); diff --git a/libtemplate/templateviewlist.c b/libtemplate/templateviewlist.c index e75c528..0a6cabc 100644 --- a/libtemplate/templateviewlist.c +++ b/libtemplate/templateviewlist.c @@ -1,5 +1,6 @@ #include "templateviewlist.h"
#include "../config.h"
+#include "../libcore/helpers.h"
cTemplateViewList::cTemplateViewList(void) : cTemplateViewElement() {
listElement = NULL;
@@ -87,16 +88,11 @@ int cTemplateViewList::GetAverageFontWidth(void) { string paramFontSize = fontFunc->GetParameter(ptFontSize);
string fontName = "";
- if ((fontNameToken.find("{") == 0) && (fontNameToken.find("}") == (fontNameToken.size()-1))) {
- fontNameToken = fontNameToken.substr(1, fontNameToken.size()-2);
- map<string,string>::iterator hit = globals->fonts.find(fontNameToken);
- if (hit != globals->fonts.end()) {
- fontName = hit->second;
- } else {
- map<string,string>::iterator def = globals->fonts.find("vdrOsd");
- if (def == globals->fonts.end())
+ if (IsToken(fontNameToken)) {
+ if (!globals->GetFont(fontNameToken, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
return defaultAverageFontWidth;
- fontName = def->second;
+ }
}
} else {
//if no token, directly use input
@@ -135,16 +131,11 @@ cFont *cTemplateViewList::GetTextAreaFont(void) { string paramFontSize = fontFunc->GetParameter(ptFontSize);
string fontName = "";
- if ((fontNameToken.find("{") == 0) && (fontNameToken.find("}") == (fontNameToken.size()-1))) {
- fontNameToken = fontNameToken.substr(1, fontNameToken.size()-2);
- map<string,string>::iterator hit = globals->fonts.find(fontNameToken);
- if (hit != globals->fonts.end()) {
- fontName = hit->second;
- } else {
- map<string,string>::iterator def = globals->fonts.find("vdrOsd");
- if (def == globals->fonts.end())
+ if (IsToken(fontNameToken)) {
+ if (!globals->GetFont(fontNameToken, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
return NULL;
- fontName = def->second;
+ }
}
} else {
//if no token, directly use input
diff --git a/libtemplate/xmlparser.c b/libtemplate/xmlparser.c index 01b48a6..9e095a4 100644 --- a/libtemplate/xmlparser.c +++ b/libtemplate/xmlparser.c @@ -89,7 +89,7 @@ bool cXmlParser::ReadPluginView(string plugName, int templateNumber, string temp return true; } -bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile) { +bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile, bool mandatory) { this->globals = globals; string xmlPath = GetPath(xmlFile); @@ -101,20 +101,30 @@ bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile) { doc = xmlCtxtReadFile(ctxt, xmlPath.c_str(), NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID); - if (doc == NULL ) { - esyslog("skindesigner: ERROR: Globals %s not parsed successfully.", xmlPath.c_str()); + if (doc == NULL) { + if (mandatory) { + esyslog("skindesigner: ERROR: Globals %s not parsed successfully.", xmlPath.c_str()); + } else { + dsyslog("skindesigner: Globals %s not parsed successfully.", xmlPath.c_str()); + } return false; } root = xmlDocGetRootElement(doc); if (ctxt->valid == 0) { - esyslog("skindesigner: Failed to validate %s", xmlPath.c_str()); + if (mandatory) { + esyslog("skindesigner: ERROR: Failed to validate %s", xmlPath.c_str()); + } else { + dsyslog("skindesigner: Failed to validate %s", xmlPath.c_str()); + } return false; } if (root == NULL) { - esyslog("skindesigner: ERROR: Globals %s is empty", xmlPath.c_str()); + if (mandatory) { + esyslog("skindesigner: ERROR: Globals %s is empty", xmlPath.c_str()); + } return false; } @@ -234,7 +244,6 @@ bool cXmlParser::ParsePluginView(string plugName, int templateNumber) { bool cXmlParser::ParseGlobals(void) { xmlNodePtr node = root->xmlChildrenNode; - while (node != NULL) { if (node->type != XML_ELEMENT_NODE) { node = node->next; @@ -304,6 +313,8 @@ string cXmlParser::GetPath(string xmlFile) { string activeTheme = Setup.OSDTheme; string path = ""; if (!xmlFile.compare("globals.xml")) { + path = *cString::sprintf("%s%s/%s", *config.skinPath, activeSkin.c_str(), xmlFile.c_str()); + } else if (!xmlFile.compare("theme.xml")) { path = *cString::sprintf("%s%s/themes/%s/%s", *config.skinPath, activeSkin.c_str(), activeTheme.c_str(), xmlFile.c_str()); } else if (!xmlFile.compare("setup.xml")) { path = *cString::sprintf("%s%s/%s", *config.skinPath, activeSkin.c_str(), xmlFile.c_str()); @@ -424,7 +435,7 @@ void cXmlParser::InsertColor(string name, string value) { str << value; tColor colVal; str >> std::hex >> colVal; - globals->colors.insert(pair<string, tColor>(name, colVal)); + globals->AddColor(name, colVal); } void cXmlParser::ParseGlobalVariables(xmlNodePtr node) { @@ -476,17 +487,11 @@ void cXmlParser::ParseGlobalVariables(xmlNodePtr node) { void cXmlParser::InsertVariable(string name, string type, string value) { if (!type.compare("int")) { int val = atoi(value.c_str()); - globals->intVars.insert(pair<string, int>(name, val)); + globals->AddInt(name, val); } else if (!type.compare("double")) { - if (config.replaceDecPoint) { - if (value.find_first_of('.') != string::npos) { - std::replace( value.begin(), value.end(), '.', config.decPoint); - } - } - double val = atof(value.c_str()); - globals->doubleVars.insert(pair<string, double>(name, val)); + globals->AddDouble(name, value); } else if (!type.compare("string")) { - globals->stringVars.insert(pair<string, string>(name, value)); + globals->AddString(name, value); } } @@ -523,8 +528,11 @@ void cXmlParser::ParseGlobalFonts(xmlNodePtr node) { } if (ok) { fontValue = xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - if (fontName && fontValue) - globals->fonts.insert(pair<string, string>((const char*)fontName, (const char*)fontValue)); + if (fontName && fontValue) { + string fN = (const char*)fontName; + string fV = (const char*)fontValue; + globals->AddFont(fN, fV); + } } if (fontName) xmlFree(fontName); @@ -607,7 +615,7 @@ void cXmlParser::ParseTranslations(xmlNodePtr node) { nodeTrans = nodeTrans->next; } if (globals) { - globals->translations.insert(pair<string, map < string, string > >((const char*)tokenName, tokenTranslations)); + globals->AddTranslation((const char*)tokenName, tokenTranslations); } else if (skinSetup) { skinSetup->SetTranslation((const char*)tokenName, tokenTranslations); } diff --git a/libtemplate/xmlparser.h b/libtemplate/xmlparser.h index 0369622..27399bd 100644 --- a/libtemplate/xmlparser.h +++ b/libtemplate/xmlparser.h @@ -50,7 +50,7 @@ public: virtual ~cXmlParser(void); bool ReadView(cTemplateView *view, string xmlFile); bool ReadPluginView(string plugName, int templateNumber, string templateName); - bool ReadGlobals(cGlobals *globals, string xmlFile); + bool ReadGlobals(cGlobals *globals, string xmlFile, bool mandatory); bool ReadSkinSetup(cSkinSetup *skinSetup, string skin, string xmlFile); bool ParseView(void); bool ParsePluginView(string plugName, int templateNumber); |