summaryrefslogtreecommitdiff
path: root/libtemplate
diff options
context:
space:
mode:
Diffstat (limited to 'libtemplate')
-rw-r--r--libtemplate/parameter.h4
-rw-r--r--libtemplate/templatefunction.c141
-rw-r--r--libtemplate/templatefunction.h4
-rw-r--r--libtemplate/templatepixmap.c5
-rw-r--r--libtemplate/templateview.c7
-rw-r--r--libtemplate/templateviewelement.h1
6 files changed, 149 insertions, 13 deletions
diff --git a/libtemplate/parameter.h b/libtemplate/parameter.h
index 914f3fc..c055560 100644
--- a/libtemplate/parameter.h
+++ b/libtemplate/parameter.h
@@ -83,13 +83,15 @@ public:
enum eTextTokenType {
ttConstString,
ttToken,
- ttConditionalToken
+ ttConditionalToken,
+ ttPrintfToken
};
class cTextToken {
public:
eTextTokenType type;
string value;
+ vector<string> parameters;
vector<cTextToken> subTokens;
};
diff --git a/libtemplate/templatefunction.c b/libtemplate/templatefunction.c
index 4b0c66f..2a6e5a3 100644
--- a/libtemplate/templatefunction.c
+++ b/libtemplate/templatefunction.c
@@ -272,6 +272,36 @@ bool cTemplateFunction::CalculateParameters(void) {
return paramsValid;
}
+bool cTemplateFunction::ReCalculateParameters(void) {
+ bool paramValid = true;
+ bool paramsValid = true;
+ for (map< eParamType, string >::iterator param = nativeParameters.begin(); param != nativeParameters.end(); param++) {
+ paramValid = true;
+ eParamType type = param->first;
+ string value = param->second;
+ switch (type) {
+ case ptX:
+ case ptY:
+ case ptWidth:
+ case ptHeight:
+ case ptMenuItemWidth:
+ case ptFontSize:
+ case ptFloatWidth:
+ case ptFloatHeight:
+ case ptMaxLines:
+ case ptColumnWidth:
+ case ptRowHeight:
+ SetNumericParameter(type, value);
+ break;
+ }
+ if (!paramValid) {
+ paramsValid = false;
+ esyslog("skindesigner: %s: invalid parameter %d, value %s", GetFuncName().c_str(), type, value.c_str());
+ }
+ }
+ return paramsValid;
+}
+
void cTemplateFunction::CompleteParameters(void) {
switch (type) {
case ftDrawImage: {
@@ -733,8 +763,11 @@ bool cTemplateFunction::SetNumericParameter(eParamType type, string value) {
if (this->type < ftLoop && type == ptY) {
val += containerY;
}
+ numericParameters.erase(type);
+ numericDynamicParameters.erase(type);
numericParameters.insert(pair<eParamType, int>(type, val));
} else {
+ numericDynamicParameters.erase(type);
numericDynamicParameters.insert(pair<eParamType, string>(type, parsedValue));
}
return param.Valid();
@@ -844,7 +877,9 @@ bool cTemplateFunction::SetTextTokens(string value) {
//search for conditional token or normal token
size_t tokenStart = value.find_first_of('{');
size_t conditionStart = value.find_first_of('|');
+ size_t printfStart = value.find("{printf(");
if (tokenStart == string::npos && conditionStart == string::npos) {
+ //find constant strings
if (value.size() > 0) {
cTextToken token;
token.type = ttConstString;
@@ -855,12 +890,25 @@ bool cTemplateFunction::SetTextTokens(string value) {
continue;
} else if (tokenStart != string::npos && conditionStart == string::npos) {
size_t tokenEnd = value.find_first_of('}');
- ParseTextToken(value, tokenStart, tokenEnd);
+ if (printfStart != string::npos && printfStart <= tokenStart) {
+ //replace printf text token
+ ParsePrintfTextToken(value, printfStart, tokenEnd);
+ } else {
+ //replace normal text token
+ ParseTextToken(value, tokenStart, tokenEnd);
+ }
} else if (tokenStart != string::npos && conditionStart != string::npos) {
if (tokenStart < conditionStart) {
size_t tokenEnd = value.find_first_of('}');
- ParseTextToken(value, tokenStart, tokenEnd);
+ if (printfStart != string::npos && printfStart <= tokenStart) {
+ //replace printf text token
+ ParsePrintfTextToken(value, printfStart, tokenEnd);
+ } else {
+ //replace normal text token
+ ParseTextToken(value, tokenStart, tokenEnd);
+ }
} else {
+ //replace conditional text token
size_t conditionEnd = value.find_first_of('|', conditionStart+1);
ParseConditionalTextToken(value, conditionStart, conditionEnd);
}
@@ -931,6 +979,34 @@ void cTemplateFunction::ParseConditionalTextToken(string &value, size_t start, s
}
+void cTemplateFunction::ParsePrintfTextToken(string &value, size_t start, size_t end) {
+ cTextToken token;
+ if (start > 0) {
+ string constString = value.substr(0, start);
+ value = value.replace(0, start, "");
+ token.type = ttConstString;
+ token.value = constString;
+ textTokens.push_back(token);
+ } else {
+ token.type = ttPrintfToken;
+ //fetch parameter list from printf
+ string printfParams = value.substr(start + 8, end - start - 9);
+ value = value.replace(0, end - start + 1, "");
+ splitstring s(printfParams.c_str());
+ vector<string> flds = s.split(',', 1);
+
+ int numParams = flds.size();
+ if (numParams < 1)
+ return;
+ string formatString = trim(flds[0]);
+ token.value = formatString.substr(1, formatString.size() - 2);
+ for (int i=1; i < numParams; i++) {
+ token.parameters.push_back(trim(flds[i]));
+ }
+ }
+ textTokens.push_back(token);
+}
+
bool cTemplateFunction::SetScrollMode(string value) {
eScrollMode mode = smNone;
bool ok = true;
@@ -1063,6 +1139,45 @@ void cTemplateFunction::ParseStringParameters(void) {
found = true;
}
}
+ } else if ((*it).type == ttPrintfToken) {
+ cTextToken token = *it;
+ int paramCount = token.parameters.size();
+ string printfResult = "";
+ switch (paramCount) {
+ case 1: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1);
+ break; }
+ case 2: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ int param2 = ReplaceIntToken(token.parameters[1]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1, param2);
+ break; }
+ case 3: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ int param2 = ReplaceIntToken(token.parameters[1]);
+ int param3 = ReplaceIntToken(token.parameters[2]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1, param2, param3);
+ break; }
+ case 4: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ int param2 = ReplaceIntToken(token.parameters[1]);
+ int param3 = ReplaceIntToken(token.parameters[2]);
+ int param4 = ReplaceIntToken(token.parameters[3]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1, param2, param3, param4);
+ break; }
+ case 5: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ int param2 = ReplaceIntToken(token.parameters[1]);
+ int param3 = ReplaceIntToken(token.parameters[2]);
+ int param4 = ReplaceIntToken(token.parameters[3]);
+ int param5 = ReplaceIntToken(token.parameters[4]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1, param2, param3, param4, param5);
+ break; }
+ default:
+ break;
+ }
+ text << printfResult;
}
}
parsedText = text.str();
@@ -1239,6 +1354,21 @@ int cTemplateFunction::CalculateTextBoxHeight(void) {
return ((textLinesTall+textLinesFull) * fontHeight);
}
+int cTemplateFunction::ReplaceIntToken(string intTok) {
+ if (intTokens) {
+ map<string,int>::iterator hit = intTokens->find(intTok);
+ if (hit != intTokens->end())
+ return hit->second;
+ }
+ if (stringTokens) {
+ map<string,string>::iterator hit = stringTokens->find(intTok);
+ if (hit != stringTokens->end()) {
+ return atoi(hit->second.c_str());
+ }
+ }
+ return 0;
+}
+
/*******************************************************************
* Helper Functions
*******************************************************************/
@@ -1466,6 +1596,8 @@ void cTemplateFunction::Debug(void) {
tokType = "Token: ";
else if (tokenType == ttConditionalToken)
tokType = "Conditional Token: ";
+ else if (tokenType == ttPrintfToken)
+ tokType = "PrintF Token: ";
esyslog("skindesigner: %s %d = \"%s\"", tokType.c_str(), i++, (*it).value.c_str());
if (tokenType == ttConditionalToken) {
for (vector<cTextToken>::iterator it2 = (*it).subTokens.begin(); it2 != (*it).subTokens.end(); it2++) {
@@ -1478,6 +1610,11 @@ void cTemplateFunction::Debug(void) {
esyslog("skindesigner: %s \"%s\"", tokTypeCond.c_str(), (*it2).value.c_str());
}
}
+ if (tokenType == ttPrintfToken) {
+ for (vector<string>::iterator it2 = (*it).parameters.begin(); it2 != (*it).parameters.end(); it2++) {
+ esyslog("skindesigner: Printf parameter: %s", (*it2).c_str());
+ }
+ }
}
}
if (fontName.size() > 0) {
diff --git a/libtemplate/templatefunction.h b/libtemplate/templatefunction.h
index b6c2d53..f7af25c 100644
--- a/libtemplate/templatefunction.h
+++ b/libtemplate/templatefunction.h
@@ -143,6 +143,7 @@ protected:
bool SetTextTokens(string value);
void ParseTextToken(string &value, size_t start, size_t end);
void ParseConditionalTextToken(string &value, size_t start, size_t end);
+ void ParsePrintfTextToken(string &value, size_t start, size_t end);
bool SetScrollMode(string value);
bool SetScrollSpeed(string value);
bool SetOrientation(string value);
@@ -152,6 +153,7 @@ protected:
void ParseNumericalParameters(void);
void CalculateAlign(int elementWidth, int elementHeight);
int CalculateTextBoxHeight(void);
+ int ReplaceIntToken(string intTok);
public:
cTemplateFunction(eFuncType type);
virtual ~cTemplateFunction(void);
@@ -170,6 +172,8 @@ public:
void SetTranslatedText(string translation);
//PreCache Parameters
bool CalculateParameters(void);
+ //Complete Parameters
+ bool ReCalculateParameters(void);
void CompleteParameters(void);
//Set and Unset Dynamic Tokens from view
void SetStringTokens(map < string, string > *tok) { stringTokens = tok; };
diff --git a/libtemplate/templatepixmap.c b/libtemplate/templatepixmap.c
index 4fbd513..a1d032b 100644
--- a/libtemplate/templatepixmap.c
+++ b/libtemplate/templatepixmap.c
@@ -78,11 +78,12 @@ void cTemplatePixmap::ParseDynamicParameters(map <string,int> *intTokens, bool i
for (vector<cTemplateFunction*>::iterator func = functions.begin(); func != functions.end(); func++) {
(*func)->SetContainer(x, y, width, height);
- (*func)->CalculateParameters();
+ (*func)->ReCalculateParameters();
(*func)->CompleteParameters();
if ((*func)->GetType() == ftLoop) {
cTemplateLoopFunction *loopFunc = dynamic_cast<cTemplateLoopFunction*>(*func);
if (!loopFunc->Ready()) {
+ loopFunc->CalculateParameters();
loopFunc->SetIntTokens(intTokens);
loopFunc->ParseParameters();
loopFunc->UnsetIntTokens();
@@ -137,8 +138,6 @@ bool cTemplatePixmap::CalculateParameters(void) {
for (vector<cTemplateFunction*>::iterator func = functions.begin(); func != functions.end(); func++) {
(*func)->SetGlobals(globals);
- if (!Ready())
- continue;
(*func)->SetContainer(0, 0, pixWidth, pixHeight);
paramsValid = (*func)->CalculateParameters();
(*func)->CompleteParameters();
diff --git a/libtemplate/templateview.c b/libtemplate/templateview.c
index a032349..1dabe8c 100644
--- a/libtemplate/templateview.c
+++ b/libtemplate/templateview.c
@@ -362,6 +362,7 @@ void cTemplateView::PreCache(bool isSubview) {
pixOffset += viewElement->GetNumPixmaps();
}
+
//Cache ViewLists
for (map < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
cTemplateViewList *viewList = it->second;
@@ -613,7 +614,6 @@ void cTemplateViewChannel::SetViewElements(void) {
viewElementsAllowed.insert("signalquality");
viewElementsAllowed.insert("signalqualityback");
viewElementsAllowed.insert("devices");
- viewElementsAllowed.insert("bitrate");
viewElementsAllowed.insert("scrapercontent");
viewElementsAllowed.insert("datetime");
viewElementsAllowed.insert("message");
@@ -656,9 +656,6 @@ string cTemplateViewChannel::GetViewElementName(eViewElement ve) {
case veSignalQualityBack:
name = "Signal Quality Background";
break;
- case veBitRate:
- name = "Bit Rate";
- break;
case veDevices:
name = "Devices";
break;
@@ -706,8 +703,6 @@ void cTemplateViewChannel::AddPixmap(string sViewElement, cTemplatePixmap *pix,
ve = veSignalQuality;
} else if (!sViewElement.compare("signalqualityback")) {
ve = veSignalQualityBack;
- } else if (!sViewElement.compare("bitrate")) {
- ve = veBitRate;
} else if (!sViewElement.compare("devices")) {
ve = veDevices;
} else if (!sViewElement.compare("scrapercontent")) {
diff --git a/libtemplate/templateviewelement.h b/libtemplate/templateviewelement.h
index a2605ca..7fe78b9 100644
--- a/libtemplate/templateviewelement.h
+++ b/libtemplate/templateviewelement.h
@@ -37,7 +37,6 @@ enum eViewElement {
veScreenResolution,
veSignalQuality,
veSignalQualityBack,
- veBitRate,
veScraperContent,
//DisplayMenu ViewElements
veHeader,