From f9f2c47cb258874dcdd75bd2154a60c65f068657 Mon Sep 17 00:00:00 2001 From: louis Date: Sat, 1 Nov 2014 13:03:52 +0100 Subject: added printf function for --- libtemplate/parameter.h | 4 +- libtemplate/templatefunction.c | 93 +++++++++++++++++++++++++++++++++++++++++- libtemplate/templatefunction.h | 2 + 3 files changed, 96 insertions(+), 3 deletions(-) (limited to 'libtemplate') 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 parameters; vector subTokens; }; diff --git a/libtemplate/templatefunction.c b/libtemplate/templatefunction.c index 4b0c66f..df3e653 100644 --- a/libtemplate/templatefunction.c +++ b/libtemplate/templatefunction.c @@ -844,7 +844,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 +857,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 +946,26 @@ void cTemplateFunction::ParseConditionalTextToken(string &value, size_t start, s } +void cTemplateFunction::ParsePrintfTextToken(string &value, size_t start, size_t end) { + cTextToken token; + 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 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 +1098,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 +1313,21 @@ int cTemplateFunction::CalculateTextBoxHeight(void) { return ((textLinesTall+textLinesFull) * fontHeight); } +int cTemplateFunction::ReplaceIntToken(string intTok) { + if (intTokens) { + map::iterator hit = intTokens->find(intTok); + if (hit != intTokens->end()) + return hit->second; + } + if (stringTokens) { + map::iterator hit = stringTokens->find(intTok); + if (hit != stringTokens->end()) { + return atoi(hit->second.c_str()); + } + } + return 0; +} + /******************************************************************* * Helper Functions *******************************************************************/ diff --git a/libtemplate/templatefunction.h b/libtemplate/templatefunction.h index b6c2d53..2af95dd 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); -- cgit v1.2.3 From f9f68cae8d64f5c60ffaa34118b66f5ebab28506 Mon Sep 17 00:00:00 2001 From: louis Date: Sat, 1 Nov 2014 13:19:07 +0100 Subject: removed code for displaying bitrates in displaychannel again --- libtemplate/templateview.c | 6 ------ libtemplate/templateviewelement.h | 1 - 2 files changed, 7 deletions(-) (limited to 'libtemplate') diff --git a/libtemplate/templateview.c b/libtemplate/templateview.c index a032349..f122732 100644 --- a/libtemplate/templateview.c +++ b/libtemplate/templateview.c @@ -613,7 +613,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 +655,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 +702,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, -- cgit v1.2.3 From f478ad10bbac192819c98a2edab464fb6347d5e9 Mon Sep 17 00:00:00 2001 From: louis Date: Sat, 1 Nov 2014 16:02:56 +0100 Subject: optimized performance when creating a menu list --- libtemplate/templatefunction.c | 33 +++++++++++++++++++++++++++++++++ libtemplate/templatefunction.h | 2 ++ libtemplate/templatepixmap.c | 5 ++--- libtemplate/templateview.c | 1 + 4 files changed, 38 insertions(+), 3 deletions(-) (limited to 'libtemplate') diff --git a/libtemplate/templatefunction.c b/libtemplate/templatefunction.c index df3e653..699e872 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(type, val)); } else { + numericDynamicParameters.erase(type); numericDynamicParameters.insert(pair(type, parsedValue)); } return param.Valid(); diff --git a/libtemplate/templatefunction.h b/libtemplate/templatefunction.h index 2af95dd..f7af25c 100644 --- a/libtemplate/templatefunction.h +++ b/libtemplate/templatefunction.h @@ -172,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 *intTokens, bool i for (vector::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(*func); if (!loopFunc->Ready()) { + loopFunc->CalculateParameters(); loopFunc->SetIntTokens(intTokens); loopFunc->ParseParameters(); loopFunc->UnsetIntTokens(); @@ -137,8 +138,6 @@ bool cTemplatePixmap::CalculateParameters(void) { for (vector::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 f122732..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; -- cgit v1.2.3 From 80ac2607514422cfd77efb3429e0f70fc8713c39 Mon Sep 17 00:00:00 2001 From: louis Date: Sun, 2 Nov 2014 11:19:05 +0100 Subject: fixed bug in printf function --- libtemplate/templatefunction.c | 43 ++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) (limited to 'libtemplate') diff --git a/libtemplate/templatefunction.c b/libtemplate/templatefunction.c index 699e872..2a6e5a3 100644 --- a/libtemplate/templatefunction.c +++ b/libtemplate/templatefunction.c @@ -981,20 +981,28 @@ void cTemplateFunction::ParseConditionalTextToken(string &value, size_t start, s void cTemplateFunction::ParsePrintfTextToken(string &value, size_t start, size_t end) { cTextToken token; - 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 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])); + 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 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); } @@ -1588,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::iterator it2 = (*it).subTokens.begin(); it2 != (*it).subTokens.end(); it2++) { @@ -1600,6 +1610,11 @@ void cTemplateFunction::Debug(void) { esyslog("skindesigner: %s \"%s\"", tokTypeCond.c_str(), (*it2).value.c_str()); } } + if (tokenType == ttPrintfToken) { + for (vector::iterator it2 = (*it).parameters.begin(); it2 != (*it).parameters.end(); it2++) { + esyslog("skindesigner: Printf parameter: %s", (*it2).c_str()); + } + } } } if (fontName.size() > 0) { -- cgit v1.2.3