From 8d7584d66eda54d751336b4b5beaca7056219d25 Mon Sep 17 00:00:00 2001 From: louis Date: Thu, 14 May 2015 11:26:30 +0200 Subject: [PATCH] chachged displaymessage in menus to detachable --- HISTORY | 1 + dtd/displaymenu.dtd | 8 ++++++ skins/blackhole/xmlfiles/displaymenu.xml | 2 +- views/displaymenurootview.c | 35 +++++++++++++++--------- views/displaymenuview.c | 33 ++++++++++++++-------- views/displaymessageview.c | 9 +----- views/displaymessageview.h | 2 +- views/displayviewelements.c | 15 ++++++++++ views/displayviewelements.h | 10 +++++++ views/view.c | 10 +++++++ views/view.h | 1 + views/viewhelpers.c | 8 ++++++ views/viewhelpers.h | 1 + 13 files changed, 101 insertions(+), 34 deletions(-) diff --git a/HISTORY b/HISTORY index c6a1073..1caafd9 100644 --- a/HISTORY +++ b/HISTORY @@ -322,4 +322,5 @@ Version 0.4.5 correctly - implemented shiftout for views - fixed blinking for animated views +- chachged displaymessage in menus to detachable diff --git a/dtd/displaymenu.dtd b/dtd/displaymenu.dtd index 3f1747a..30b34da 100644 --- a/dtd/displaymenu.dtd +++ b/dtd/displaymenu.dtd @@ -66,6 +66,14 @@ diff --git a/skins/blackhole/xmlfiles/displaymenu.xml b/skins/blackhole/xmlfiles/displaymenu.xml index a96521e..26199da 100644 --- a/skins/blackhole/xmlfiles/displaymenu.xml +++ b/skins/blackhole/xmlfiles/displaymenu.xml @@ -94,7 +94,7 @@ {warning} true if message is an warn message {error} true if message is an error message --> - + diff --git a/views/displaymenurootview.c b/views/displaymenurootview.c index 74e805f..6de16c7 100644 --- a/views/displaymenurootview.c +++ b/views/displaymenurootview.c @@ -680,21 +680,30 @@ void cDisplayMenuRootView::DrawColorButtons(void) { void cDisplayMenuRootView::DrawMessage(eMessageType type, const char *text) { if (!text) { - ClearViewElement(veMessage); + if (DetachViewElement(veMessage)) + DestroyDetachedViewElement(veMessage); + else + ClearViewElement(veMessage); return; } - - map < string, string > stringTokens; - map < string, int > intTokens; - - intTokens.insert(pair("status", (type == mtStatus) ? true : false)); - intTokens.insert(pair("info", (type == mtInfo) ? true : false)); - intTokens.insert(pair("warning", (type == mtWarning) ? true : false)); - intTokens.insert(pair("error", (type == mtError) ? true : false)); - stringTokens.insert(pair("text", text)); - - ClearViewElement(veMessage); - DrawViewElement(veMessage, &stringTokens, &intTokens); + + if (DetachViewElement(veMessage)) { + cViewElement *viewElement = GetViewElement(veMessage); + if (!viewElement) { + viewElement = new cViewElementMenuMessage(tmplView->GetViewElement(veMessage), type, text); + AddViewElement(veMessage, viewElement); + viewElement->Start(); + } else { + if (!viewElement->Starting()) + viewElement->Render(); + } + } else { + map < string, string > stringTokens; + map < string, int > intTokens; + SetMenuMessage(type, text, stringTokens, intTokens); + ClearViewElement(veMessage); + DrawViewElement(veMessage, &stringTokens, &intTokens); + } } void cDisplayMenuRootView::Action(void) { diff --git a/views/displaymenuview.c b/views/displaymenuview.c index a70535d..a7e840d 100644 --- a/views/displaymenuview.c +++ b/views/displaymenuview.c @@ -173,20 +173,31 @@ bool cDisplayMenuView::DrawMessage(eMessageType type, const char *text) { return false; } if (!text) { - ClearViewElement(veMessage); + if (DetachViewElement(veMessage)) + DestroyDetachedViewElement(veMessage); + else + ClearViewElement(veMessage); return true; } - map < string, string > stringTokens; - map < string, int > intTokens; - intTokens.insert(pair("status", (type == mtStatus) ? true : false)); - intTokens.insert(pair("info", (type == mtInfo) ? true : false)); - intTokens.insert(pair("warning", (type == mtWarning) ? true : false)); - intTokens.insert(pair("error", (type == mtError) ? true : false)); - stringTokens.insert(pair("text", text)); - - ClearViewElement(veMessage); - DrawViewElement(veMessage, &stringTokens, &intTokens); + if (DetachViewElement(veMessage)) { + cViewElement *viewElement = GetViewElement(veMessage); + if (!viewElement) { + viewElement = new cViewElementMenuMessage(tmplView->GetViewElement(veMessage), type, text); + AddViewElement(veMessage, viewElement); + viewElement->Start(); + } else { + if (!viewElement->Starting()) + viewElement->Render(); + } + } else { + map < string, string > stringTokens; + map < string, int > intTokens; + + SetMenuMessage(type, text, stringTokens, intTokens); + ClearViewElement(veMessage); + DrawViewElement(veMessage, &stringTokens, &intTokens); + } return true; } diff --git a/views/displaymessageview.c b/views/displaymessageview.c index 85727cb..6f92f5b 100644 --- a/views/displaymessageview.c +++ b/views/displaymessageview.c @@ -30,14 +30,7 @@ void cDisplayMessageView::DrawBackground(void) { void cDisplayMessageView::DrawMessage(eMessageType type, const char *text) { map < string, string > stringTokens; map < string, int > intTokens; - - stringTokens.insert(pair("text", text)); - - intTokens.insert(pair("status", (type == mtStatus) ? true : false)); - intTokens.insert(pair("info", (type == mtInfo) ? true : false)); - intTokens.insert(pair("warning", (type == mtWarning) ? true : false)); - intTokens.insert(pair("error", (type == mtError) ? true : false)); - + SetMenuMessage(type, text, stringTokens, intTokens); DrawViewElement(veMessage, &stringTokens, &intTokens); } diff --git a/views/displaymessageview.h b/views/displaymessageview.h index 8e68d49..bab15c6 100644 --- a/views/displaymessageview.h +++ b/views/displaymessageview.h @@ -4,7 +4,7 @@ #include "../libtemplate/template.h" #include "view.h" -class cDisplayMessageView : public cView { +class cDisplayMessageView : public cView, public cViewHelpers { public: cDisplayMessageView(cTemplateView *tmplView); virtual ~cDisplayMessageView(); diff --git a/views/displayviewelements.c b/views/displayviewelements.c index 5f337a3..b09f1d5 100644 --- a/views/displayviewelements.c +++ b/views/displayviewelements.c @@ -122,3 +122,18 @@ bool cViewElementMenuHeader::Render(void) { DrawViewElement(veHeader, &stringTokens, &intTokens); return true; } + +/********************************************************************************************************************/ + +cViewElementMenuMessage::cViewElementMenuMessage(cTemplateViewElement *tmplViewElement, eMessageType type, string text) : cViewElement(tmplViewElement) { + this->type = type; + this->text = text; +} + +bool cViewElementMenuMessage::Render(void) { + ClearTokens(); + SetMenuMessage(type, text, stringTokens, intTokens); + ClearViewElement(veMessage); + DrawViewElement(veMessage, &stringTokens, &intTokens); + return true; +} diff --git a/views/displayviewelements.h b/views/displayviewelements.h index 0dcd45b..d55f562 100644 --- a/views/displayviewelements.h +++ b/views/displayviewelements.h @@ -75,4 +75,14 @@ public: bool Render(void); }; +class cViewElementMenuMessage : public cViewElement, public cViewHelpers { +private: + eMessageType type; + string text; +public: + cViewElementMenuMessage(cTemplateViewElement *tmplViewElement, eMessageType type, string text); + virtual ~cViewElementMenuMessage() {}; + bool Render(void); +}; + #endif //__DISPLAYCHANNELVIEWELEMENTS_H \ No newline at end of file diff --git a/views/view.c b/views/view.c index b8e5840..0d59019 100644 --- a/views/view.c +++ b/views/view.c @@ -245,6 +245,16 @@ void cView::DestroyViewElement(eViewElement ve) { ClearAnimations(ve); } +void cView::DestroyDetachedViewElement(eViewElement ve) { + map < eViewElement, cViewElement* >::iterator hit = detachedViewElements.find(ve); + if (hit == detachedViewElements.end()) + return; + cViewElement *viewElement = hit->second; + delete viewElement; + detachedViewElements.erase(hit); +} + + void cView::ClearAnimations(int cat) { //stop and delete all animated elements from this viewelement if (animations.size() == 0) diff --git a/views/view.h b/views/view.h index f7d2ab5..1dcaef9 100644 --- a/views/view.h +++ b/views/view.h @@ -58,6 +58,7 @@ protected: void DrawViewElement(eViewElement ve, map *stringTokens = NULL, map *intTokens = NULL, map < string, vector< map< string, string > > > *loopTokens = NULL); void ClearViewElement(eViewElement ve); void DestroyViewElement(eViewElement ve); + void DestroyDetachedViewElement(eViewElement ve); void ClearAnimations(int cat); bool ExecuteViewElement(eViewElement ve); bool DetachViewElement(eViewElement ve); diff --git a/views/viewhelpers.c b/views/viewhelpers.c index 8598e7c..c43a068 100644 --- a/views/viewhelpers.c +++ b/views/viewhelpers.c @@ -1125,3 +1125,11 @@ bool cViewHelpers::CompareECMInfos(sDVBAPIEcmInfo *ecmInfo) { return false; return true; } + +void cViewHelpers::SetMenuMessage(eMessageType type, string text, stringmap &stringTokens, intmap &intTokens) { + intTokens.insert(pair("status", (type == mtStatus) ? true : false)); + intTokens.insert(pair("info", (type == mtInfo) ? true : false)); + intTokens.insert(pair("warning", (type == mtWarning) ? true : false)); + intTokens.insert(pair("error", (type == mtError) ? true : false)); + stringTokens.insert(pair("text", text)); +} diff --git a/views/viewhelpers.h b/views/viewhelpers.h index 3ba13b3..2ef4980 100644 --- a/views/viewhelpers.h +++ b/views/viewhelpers.h @@ -37,6 +37,7 @@ protected: void SetMenuHeader(eMenuCategory cat, string menuTitle, stringmap &stringTokens, intmap &intTokens); void SetCurrentSchedule(string recName, stringmap &stringTokens, intmap &intTokens); bool SetEcmInfos(int channelSid, stringmap &stringTokens, intmap &intTokens); + void SetMenuMessage(eMessageType type, string text, stringmap &stringTokens, intmap &intTokens); public: cViewHelpers(void); virtual ~cViewHelpers(void);