From be3b49f695ca8cffef906d893fb2f6f205f75898 Mon Sep 17 00:00:00 2001 From: louis Date: Sat, 15 Nov 2014 09:47:22 +0100 Subject: added Plugin Interface --- views/displaymenudetailview.c | 24 ++++++++++++++- views/displaymenudetailview.h | 2 ++ views/displaymenuitemcurrentview.c | 45 +++++++++++++++++++++++++++ views/displaymenuitemcurrentview.h | 13 ++++++++ views/displaymenuitemview.c | 55 +++++++++++++++++++++++++++++++++ views/displaymenuitemview.h | 12 ++++++++ views/displaymenulistview.c | 11 +++++++ views/displaymenulistview.h | 1 + views/displaymenurootview.c | 62 +++++++++++++++++++++++++++++++++----- views/displaymenurootview.h | 12 ++++++++ 10 files changed, 228 insertions(+), 9 deletions(-) (limited to 'views') diff --git a/views/displaymenudetailview.c b/views/displaymenudetailview.c index 390ef86..c1fbc9c 100644 --- a/views/displaymenudetailview.c +++ b/views/displaymenudetailview.c @@ -8,6 +8,7 @@ cDisplayMenuDetailView::cDisplayMenuDetailView(cTemplateView *tmplDetailView) : recording = NULL; text = NULL; detailViewInit = true; + isPluginTextView = false; currentTmplTab = NULL; tabView = NULL; } @@ -18,6 +19,21 @@ cDisplayMenuDetailView::~cDisplayMenuDetailView() { delete tabView; } +void cDisplayMenuDetailView::SetPluginTokens(map *plugStringTokens, map *plugIntTokens, map > > *plugLoopTokens) { + for (map::iterator it = plugStringTokens->begin(); it != plugStringTokens->end(); it++) { + stringTokens.insert(pair(it->first, it->second)); + } + + for (map::iterator it = plugIntTokens->begin(); it != plugIntTokens->end(); it++) { + intTokens.insert(pair(it->first, it->second)); + } + + for(map > >::iterator it = plugLoopTokens->begin(); it != plugLoopTokens->end(); it++) { + loopTokens.insert(pair > >(it->first, it->second)); + } + isPluginTextView = true; +} + void cDisplayMenuDetailView::Clear(void) { ClearViewElement(veDetailHeader); ClearViewElement(veScrollbar); @@ -435,7 +451,7 @@ bool cDisplayMenuDetailView::LoadReruns(vector< map< string, string > > *reruns) int rerunNaxChannel = config.rerunMaxChannel; Epgsearch_searchresults_v1_0 data; - string strQuery = event->Title(); + string strQuery = (event->Title()) ? event->Title() : ""; data.query = (char *)strQuery.c_str(); data.mode = 0; data.channelNr = 0; @@ -879,6 +895,7 @@ void cDisplayMenuDetailView::DrawHeader(void) { } DrawViewElement(veDetailHeader, &headerStringTokens, &headerIntTokens); + return; } else if (recording) { string name = recording->Name() ? recording->Name() : ""; headerStringTokens.insert(pair("name", name)); @@ -937,6 +954,11 @@ void cDisplayMenuDetailView::DrawHeader(void) { headerStringTokens.insert(pair("recimgpath", "")); } DrawViewElement(veDetailHeader, &headerStringTokens, &headerIntTokens); + return; + } + + if (isPluginTextView) { + DrawViewElement(veDetailHeader, &stringTokens, &intTokens); } } diff --git a/views/displaymenudetailview.h b/views/displaymenudetailview.h index c739a28..2387609 100644 --- a/views/displaymenudetailview.h +++ b/views/displaymenudetailview.h @@ -9,6 +9,7 @@ class cDisplayMenuDetailView : public cView { private: bool detailViewInit; + bool isPluginTextView; const cEvent *event; const cRecording *recording; const char *text; @@ -39,6 +40,7 @@ public: void SetEvent(const cEvent *event) { this->event = event; }; void SetRecording(const cRecording *recording) { this->recording = recording; }; void SetText(const char *text) { this->text = text; }; + void SetPluginTokens(map *plugStringTokens, map *plugIntTokens, map > > *plugLoopTokens); void Clear(void); void Render(void); void KeyLeft(void); diff --git a/views/displaymenuitemcurrentview.c b/views/displaymenuitemcurrentview.c index 4044b4f..2be72be 100644 --- a/views/displaymenuitemcurrentview.c +++ b/views/displaymenuitemcurrentview.c @@ -668,3 +668,48 @@ void cDisplayMenuItemCurrentRecordingView::Action(void) { } } } + +/************************************************************* +* cDisplayMenuItemCurrentPluginView +*************************************************************/ + +cDisplayMenuItemCurrentPluginView::cDisplayMenuItemCurrentPluginView(cTemplateViewElement *tmplCurrent, map &plugStringTokens, + map &plugIntTokens, map > > &pluginLoopTokens) + : cDisplayMenuItemCurrentView(tmplCurrent) { + + stringTokens = plugStringTokens; + intTokens = plugIntTokens; + loopTokens = pluginLoopTokens; +} + +cDisplayMenuItemCurrentPluginView::~cDisplayMenuItemCurrentPluginView() { +} + +void cDisplayMenuItemCurrentPluginView::Prepare(void) { +} + + +void cDisplayMenuItemCurrentPluginView::Render(void) { + SetTokensPosMenuItem(); + DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens, &loopTokens); +} + +void cDisplayMenuItemCurrentPluginView::Clear(void) { + +} + +void cDisplayMenuItemCurrentPluginView::Action(void) { + SetInitFinished(); + DoSleep(delay); + Render(); + FadeIn(); + DoFlush(); + if (scrolling) { + DoSleep(scrollDelay); + if (scrollOrientation == orHorizontal) { + ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode); + } else { + ScrollVertical(scrollingPix, scrollDelay, scrollSpeed); + } + } +} diff --git a/views/displaymenuitemcurrentview.h b/views/displaymenuitemcurrentview.h index 12f31e3..e88742f 100644 --- a/views/displaymenuitemcurrentview.h +++ b/views/displaymenuitemcurrentview.h @@ -91,4 +91,17 @@ public: void Render(void); void Clear(void); }; + +class cDisplayMenuItemCurrentPluginView: public cDisplayMenuItemCurrentView { +private: + map > > loopTokens; + void Action(void); +public: + cDisplayMenuItemCurrentPluginView(cTemplateViewElement *tmplCurrent, map &plugStringTokens, map &plugIntTokens, map > > &pluginLoopTokens); + virtual ~cDisplayMenuItemCurrentPluginView(); + void Prepare(void); + void Render(void); + void Clear(void); +}; + #endif //__DISPLAYMENUITEMCURRENTVIEW_H diff --git a/views/displaymenuitemview.c b/views/displaymenuitemview.c index 0618363..360dcd9 100644 --- a/views/displaymenuitemview.c +++ b/views/displaymenuitemview.c @@ -764,6 +764,61 @@ void cDisplayMenuItemRecordingView::Debug(void) { esyslog("skindesigner: Recording: %s", recording ? recording->Title() : "Recording is NULL"); } +/************************************************************* +* cDisplayMenuItemPluginView +*************************************************************/ + +cDisplayMenuItemPluginView::cDisplayMenuItemPluginView(cTemplateViewList *tmplList, map *plugStringTokens, map *plugIntTokens, + map > > *pluginLoopTokens, int index, bool current, bool selectable) + : cDisplayMenuItemView(tmplList, current, selectable) { + + for (map::iterator it = plugStringTokens->begin(); it != plugStringTokens->end(); it++) { + stringTokens.insert(pair(it->first, it->second)); + } + + for (map::iterator it = plugIntTokens->begin(); it != plugIntTokens->end(); it++) { + intTokens.insert(pair(it->first, it->second)); + } + + for(map > >::iterator it = pluginLoopTokens->begin(); it != pluginLoopTokens->end(); it++) { + loopTokens.insert(pair > >(it->first, it->second)); + } +} + +cDisplayMenuItemPluginView::~cDisplayMenuItemPluginView() { +} + +void cDisplayMenuItemPluginView::SetTokens(void) { + if (!itemInit) return; + itemInit = false; + intTokens.insert(pair("current", current)); +} + + +void cDisplayMenuItemPluginView::Prepare(void) { + ArrangeContainer(); +} + +void cDisplayMenuItemPluginView::Render(void) { + + DrawListItem(&stringTokens, &intTokens); + + if (current) { + cTemplateViewElement *tmplCurrent = tmplList->GetListElementCurrent(); + if (tmplCurrent) { + currentView = new cDisplayMenuItemCurrentPluginView(tmplCurrent, stringTokens, intTokens, loopTokens); + currentView->Start(); + } + } + + dirty = false; +} + +void cDisplayMenuItemPluginView::Debug(void) { + esyslog("skindesigner: Plugin Menu Item ---------------"); + cDisplayMenuItemView::Debug(); +} + /************************************************************* * cDisplayMenuItemTrackView *************************************************************/ diff --git a/views/displaymenuitemview.h b/views/displaymenuitemview.h index 724fed5..d47dadd 100644 --- a/views/displaymenuitemview.h +++ b/views/displaymenuitemview.h @@ -125,6 +125,18 @@ public: void Debug(void); }; +class cDisplayMenuItemPluginView: public cDisplayMenuItemView { +private: + map > > loopTokens; +public: + cDisplayMenuItemPluginView(cTemplateViewList *tmplList, map *plugStringTokens, map *plugIntTokens, map > > *pluginLoopTokens, int index, bool current, bool selectable); + virtual ~cDisplayMenuItemPluginView(); + void SetTokens(void); + void Prepare(void); + void Render(void); + void Debug(void); +}; + class cDisplayMenuItemTrackView: public cDisplayMenuItemView { private: const char *title; diff --git a/views/displaymenulistview.c b/views/displaymenulistview.c index c5f1506..6416857 100644 --- a/views/displaymenulistview.c +++ b/views/displaymenulistview.c @@ -182,6 +182,17 @@ void cDisplayMenuListView::AddRecordingMenuItem(int index, const cRecording *rec menuItems[index] = item; } +void cDisplayMenuListView::AddPluginMenuItem(map *stringTokens, map *intTokens, map > > *loopTokens, int index, bool current, bool selectable) { + if (index >= itemCount) + return; + if (menuItems[index]) { + menuItems[index]->SetCurrent(current); + return; + } + cDisplayMenuItemView *item = new cDisplayMenuItemPluginView(tmplList, stringTokens, intTokens, loopTokens, index, current, selectable); + menuItems[index] = item; +} + void cDisplayMenuListView::AddTracksMenuItem(int index, const char *title, bool current, bool selectable) { if (index >= itemCount) return; diff --git a/views/displaymenulistview.h b/views/displaymenulistview.h index 1c2c85f..2d9d30f 100644 --- a/views/displaymenulistview.h +++ b/views/displaymenulistview.h @@ -27,6 +27,7 @@ public: void AddChannelsMenuItem(int index, const cChannel *channel, bool withProvider, bool current, bool selectable); void AddTimersMenuItem(int index, const cTimer *timer, bool current, bool selectable); void AddRecordingMenuItem(int index, const cRecording *recording, int level, int total, int isNew, bool current, bool selectable); + void AddPluginMenuItem(map *stringTokens, map *intTokens, map > > *loopTokens, int index, bool current, bool selectable); void AddTracksMenuItem(int index, const char *title, bool current, bool selectable); void Render(void); void Debug(void); diff --git a/views/displaymenurootview.c b/views/displaymenurootview.c index 7c8ee6a..5920502 100644 --- a/views/displaymenurootview.c +++ b/views/displaymenurootview.c @@ -10,6 +10,10 @@ cDisplayMenuRootView::cDisplayMenuRootView(cTemplateView *rootView) : cView(root viewType = svUndefined; subView = NULL; subViewAvailable = false; + pluginName = ""; + pluginMenu = -1; + pluginMenuType = mtUnknown; + pluginMenuChanged = false; view = NULL; listView = NULL; detailView = NULL; @@ -84,6 +88,12 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { eSubView newViewType = svUndefined; cat = menuCat; bool isListView = true; + if (menuCat != mcPlugin) { + pluginName = ""; + pluginMenu = -1; + pluginMenuType = mtUnknown; + pluginMenuChanged = false; + } switch (menuCat) { case mcMain: newViewType = svMenuMain; @@ -119,17 +129,34 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { newViewType = svMenuDetailedText; isListView = false; break; + case mcPlugin: + newViewType = svMenuPlugin; + isListView = ( pluginMenuType == mtList ) ? true : false; + break; default: newViewType = svMenuDefault; break; } - if (newViewType != viewType) { - subView = tmplView->GetSubView(newViewType); - if (!subView) { - subViewAvailable = false; - subView = tmplView->GetSubView(svMenuDefault); + if (newViewType != viewType || pluginMenuChanged) { + if (newViewType == svMenuPlugin) { + subView = tmplView->GetPluginView(pluginName, pluginMenu); + if (!subView) { + subViewAvailable = false; + if (isListView) + subView = tmplView->GetSubView(svMenuDefault); + else + subView = tmplView->GetSubView(svMenuDetailedText); + } else { + subViewAvailable = true; + } } else { - subViewAvailable = true; + subView = tmplView->GetSubView(newViewType); + if (!subView) { + subViewAvailable = false; + subView = tmplView->GetSubView(svMenuDefault); + } else { + subViewAvailable = true; + } } //Cleanup if (view) { @@ -144,7 +171,6 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { delete detailView; detailView = NULL; } - //Create new View switch (newViewType) { case svMenuMain: @@ -162,7 +188,6 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { view->SetMenuCat(cat); //Cleanup root view ClearRootView(); - if (isListView) { //Create menu item list cTemplateViewList *tmplMenuItems = subView->GetViewList(vlMenuItem); @@ -177,6 +202,17 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { } } +void cDisplayMenuRootView::SetPluginMenu(string name, int menu, int type) { + if (pluginName.compare(name) || menu != pluginMenu || type != pluginMenuType) + pluginMenuChanged = true; + else + pluginMenuChanged = false; + + pluginName = name; + pluginMenu = menu; + pluginMenuType = (ePluginMenuType)type; +} + void cDisplayMenuRootView::SetTitle(const char *title) { menuTitle = title; if (view) @@ -254,6 +290,16 @@ void cDisplayMenuRootView::SetDetailedViewText(const char *text) { detailView->SetText(text); } +bool cDisplayMenuRootView::SetDetailedViewPlugin(map *stringTokens, map *intTokens, map > > *loopTokens) { + if (!detailView) { + SetMenu(mcPlugin, true); + if (!subViewAvailable) + return false; + } + detailView->SetPluginTokens(stringTokens, intTokens, loopTokens); + return true; +} + void cDisplayMenuRootView::KeyInput(bool up, bool page) { if (!detailView) return; diff --git a/views/displaymenurootview.h b/views/displaymenurootview.h index 5b491e5..d49e6b5 100644 --- a/views/displaymenurootview.h +++ b/views/displaymenurootview.h @@ -6,12 +6,22 @@ #include "displaymenulistview.h" #include "displaymenudetailview.h" +enum ePluginMenuType { + mtList, + mtText, + mtUnknown +}; + class cDisplayMenuRootView : public cView { private: eMenuCategory cat; eSubView viewType; cTemplateView *subView; bool subViewAvailable; + string pluginName; + int pluginMenu; + ePluginMenuType pluginMenuType; + bool pluginMenuChanged; cDisplayMenuView *view; cDisplayMenuListView *listView; cDisplayMenuDetailView *detailView; @@ -34,6 +44,7 @@ public: virtual ~cDisplayMenuRootView(); bool createOsd(void); void SetMenu(eMenuCategory menuCat, bool menuInit); + void SetPluginMenu(string name, int menu, int type); void SetTitle(const char *title); void SetChannel(const cChannel *channel) { view->SetChannel(channel); }; const cChannel *GetChannel(void) { return view->GetChannel(); }; @@ -43,6 +54,7 @@ public: void SetDetailedViewEvent(const cEvent *event); void SetDetailedViewRecording(const cRecording *recording); void SetDetailedViewText(const char *text); + bool SetDetailedViewPlugin(map *stringTokens, map *intTokens, map > > *loopTokens); void KeyInput(bool up, bool page); void Clear(void); int GetMaxItems(void); -- cgit v1.2.3