diff options
Diffstat (limited to 'views/displaymenurootview.c')
| -rw-r--r-- | views/displaymenurootview.c | 495 |
1 files changed, 495 insertions, 0 deletions
diff --git a/views/displaymenurootview.c b/views/displaymenurootview.c new file mode 100644 index 0000000..9ee1bcf --- /dev/null +++ b/views/displaymenurootview.c @@ -0,0 +1,495 @@ +#define __STL_CONFIG_H +#include <vdr/menu.h> +#include "displaymenurootview.h" +#include "../config.h" +#include "../libcore/helpers.h" + +cDisplayMenuRootView::cDisplayMenuRootView(cTemplateView *rootView) : cView(rootView) { + viewType = svUndefined; + subView = NULL; + subViewAvailable = false; + view = NULL; + listView = NULL; + detailView = NULL; + defaultBackgroundDrawn = false; + defaultHeaderDrawn = false; + defaultButtonsDrawn = false; + defaultDateTimeDrawn = false; + defaultMessageDrawn = false; + DeleteOsdOnExit(); + SetFadeTime(tmplView->GetNumericParameter(ptFadeTime)); +} + +cDisplayMenuRootView::~cDisplayMenuRootView() { + if (view) + delete view; + if (listView) + delete listView; + if (detailView) + delete detailView; +} + +/******************************************************************* +* Public Functions +*******************************************************************/ + +bool cDisplayMenuRootView::createOsd(void) { + cRect osdSize = tmplView->GetOsdSize(); + bool ok = CreateOsd(cOsd::OsdLeft() + osdSize.X(), + cOsd::OsdTop() + osdSize.Y(), + osdSize.Width(), + osdSize.Height()); + return ok; +} + +/* Categories: +mcUndefined = -1, +mcUnknown = 0, +1 mcMain, +2 mcSchedule, +3 mcScheduleNow, +4 mcScheduleNext, +5 mcChannel, +6 mcChannelEdit, +7 mcTimer, +8 mcTimerEdit, +9 mcRecording, +10 mcRecordingInfo, +11 mcPlugin, +12 mcPluginSetup, +13 mcSetup, +14 mcSetupOsd, +15 mcSetupEpg, +16 mcSetupDvb, +17 mcSetupLnb, +18 mcSetupCam, +19 mcSetupRecord, +20 mcSetupReplay, +21 mcSetupMisc, +22 mcSetupPlugins, +23 mcCommand, +24 mcEvent, +25 mcText, +26 mcFolder, +27 mcCam +*/ + +void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { + eSubView newViewType = svUndefined; + bool isListView = true; + switch (menuCat) { + case mcMain: + newViewType = svMenuMain; + break; + case mcSetup: + newViewType = svMenuSetup; + break; + case mcSchedule: + case mcScheduleNow: + case mcScheduleNext: + newViewType = svMenuSchedules; + if (view) + view->SetMenuCat(menuCat); + break; + case mcChannel: + newViewType = svMenuChannels; + break; + case mcTimer: + newViewType = svMenuTimers; + break; + case mcRecording: + newViewType = svMenuRecordings; + break; + case mcEvent: + newViewType = svMenuDetailedEpg; + isListView = false; + break; + case mcRecordingInfo: + newViewType = svMenuDetailedRecording; + isListView = false; + break; + case mcText: + newViewType = svMenuDetailedText; + isListView = false; + break; + default: + newViewType = svMenuDefault; + break; + } + if (newViewType != viewType) { + subView = tmplView->GetSubView(newViewType); + if (!subView) { + subViewAvailable = false; + subView = tmplView->GetSubView(svMenuDefault); + } else { + subViewAvailable = true; + } + //Cleanup + if (view) { + delete view; + view = NULL; + } + if (listView) { + delete listView; + listView = NULL; + } + if (detailView) { + delete detailView; + detailView = NULL; + } + + //Create new View + switch (newViewType) { + case svMenuMain: + view = new cDisplayMenuMainView(subView, menuInit); + break; + case svMenuSchedules: + if (subViewAvailable) + view = new cDisplayMenuSchedulesView(subView, menuCat, menuInit); + else + view = new cDisplayMenuView(subView, menuInit); + break; + default: + view = new cDisplayMenuView(subView, menuInit); + } + + //Cleanup root view + ClearRootView(); + + if (isListView) { + //Create menu item list + cTemplateViewList *tmplMenuItems = subView->GetViewList(vlMenuItem); + if (!tmplMenuItems) + return; + listView = new cDisplayMenuListView(tmplMenuItems); + } else { + //Create detailed view + detailView = new cDisplayMenuDetailView(subView); + } + viewType = newViewType; + } +} + +void cDisplayMenuRootView::SetTitle(const char *title) { + menuTitle = title; + if (view) + view->SetTitle(title); +} + +void cDisplayMenuRootView::SetButtonTexts(const char *Red, const char *Green, const char *Yellow, const char *Blue) { + if (Red) + buttonTexts[0] = Red; + else + buttonTexts[0] = ""; + if (Green) + buttonTexts[1] = Green; + else + buttonTexts[1] = ""; + if (Yellow) + buttonTexts[2] = Yellow; + else + buttonTexts[2] = ""; + if (Blue) + buttonTexts[3] = Blue; + else + buttonTexts[3] = ""; + if (view) + view->SetButtonTexts(buttonTexts); +} + +void cDisplayMenuRootView::SetTabs(int tab1, int tab2, int tab3, int tab4, int tab5) { + if (listView) { + listView->SetTabs(tab1, tab2, tab3, tab4, tab5); + } +} + +void cDisplayMenuRootView::SetMessage(eMessageType type, const char *text) { + if (!view) + return; + if (!view->DrawMessage(type, text)) { + defaultMessageDrawn = true; + DrawMessage(type, text); + } else { + defaultMessageDrawn = false; + } +} + +void cDisplayMenuRootView::SetDetailedViewEvent(const cEvent *event) { + if (!detailView) + detailView = new cDisplayMenuDetailView(subView); + detailView->SetEvent(event); +} + +void cDisplayMenuRootView::SetDetailedViewRecording(const cRecording *recording) { + if (!detailView) + detailView = new cDisplayMenuDetailView(subView); + detailView->SetRecording(recording); +} + +void cDisplayMenuRootView::SetDetailedViewText(const char *text) { + if (!detailView) + detailView = new cDisplayMenuDetailView(subView); + detailView->SetText(text); +} + +void cDisplayMenuRootView::KeyInput(bool up, bool page) { + if (!detailView) + return; + + if (up && page) { + detailView->KeyLeft(); + } else if (!up && page) { + detailView->KeyRight(); + } else if (up && !page) { + detailView->KeyUp(); + } else if (!up && !page) { + detailView->KeyDown(); + } +} + +void cDisplayMenuRootView::Clear(void) { + if (listView) { + listView->Clear(); + } + if (detailView) { + delete detailView; + detailView = NULL; + } +} + +void cDisplayMenuRootView::ClearRootView(void) { + if (defaultBackgroundDrawn && view->BackgroundImplemented()) + ClearViewElement(veBackground); + if (defaultHeaderDrawn) + ClearViewElement(veHeader); + if (defaultButtonsDrawn) + ClearViewElement(veButtons); + if (defaultDateTimeDrawn) + ClearViewElement(veDateTime); + if (defaultMessageDrawn) + ClearViewElement(veMessage); +} + +int cDisplayMenuRootView::GetMaxItems(void) { + if (listView) { + return listView->GetMaxItems(); + } + return 0; +} + +int cDisplayMenuRootView::GetListViewWidth(void) { + if (listView) { + return listView->GetListWidth(); + } + return 0; +} + +int cDisplayMenuRootView::GetTextAreaWidth(void) { + if (!tmplView) + return 1900; + cTemplateView *tempSubView = tmplView->GetSubView(svMenuDefault); + if (!tempSubView) + return 1900; + int areaWidth = tempSubView->GetNumericParameter(ptWidth); + if (areaWidth > 0) + return areaWidth; + return 1900; +} + + +void cDisplayMenuRootView::Render(void) { + + if (!view->DrawBackground()) { + if (!defaultBackgroundDrawn) { + defaultBackgroundDrawn = true; + DrawBackground(); + } + } else { + defaultBackgroundDrawn = false; + } + + if (!view->DrawHeader()) { + defaultHeaderDrawn = true; + DrawHeader(); + } else { + defaultHeaderDrawn = false; + } + + if (!view->DrawColorButtons()) { + defaultButtonsDrawn = true; + DrawColorButtons(); + } else { + defaultButtonsDrawn = false; + } + + if (!view->DrawDateTime()) { + defaultDateTimeDrawn = true; + DrawDateTime(); + } else { + defaultDateTimeDrawn = false; + } + + view->DrawStaticViewElements(); + view->DrawDynamicViewElements(); +} + +void cDisplayMenuRootView::RenderMenuItems(void) { + if (listView) + listView->Render(); +} + +void cDisplayMenuRootView::RenderDetailView(void) { + if (detailView) + detailView->Render(); +} + +void cDisplayMenuRootView::RenderMenuScrollBar(int Total, int Offset) { + if (!listView) + return; + view->DrawScrollbar(listView->GetMaxItems(), Total, Offset); +} + +bool cDisplayMenuRootView::RenderDynamicElements(void) { + return view->DrawDynamicViewElements(); +} + +/******************************************************************* +* Private Functions +*******************************************************************/ + +void cDisplayMenuRootView::DrawBackground(void) { + DrawViewElement(veBackground); +} +void cDisplayMenuRootView::DrawHeader(void) { + if (!ViewElementImplemented(veHeader)) { + return; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + stringTokens.insert(pair<string,string>("title", menuTitle)); + stringTokens.insert(pair<string,string>("vdrversion", VDRVERSION)); + + //check for standard menu entries + bool hasIcon = false; + string icon = imgCache->GetIconName(menuTitle); + if (icon.size() > 0) + hasIcon = true; + + stringTokens.insert(pair<string,string>("icon", icon)); + intTokens.insert(pair<string,int>("hasicon", hasIcon)); + + ClearViewElement(veHeader); + DrawViewElement(veHeader, &stringTokens, &intTokens); +} + +void cDisplayMenuRootView::DrawDateTime(void) { + if (!ViewElementImplemented(veDateTime)) { + return; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + time_t t = time(0); // get time now + struct tm * now = localtime(&t); + + intTokens.insert(pair<string, int>("year", now->tm_year + 1900)); + intTokens.insert(pair<string, int>("day", now->tm_mday)); + + char monthname[20]; + char monthshort[10]; + strftime(monthshort, sizeof(monthshort), "%b", now); + strftime(monthname, sizeof(monthname), "%B", now); + + stringTokens.insert(pair<string,string>("monthname", monthname)); + stringTokens.insert(pair<string,string>("monthnameshort", monthshort)); + stringTokens.insert(pair<string,string>("month", *cString::sprintf("%02d", now->tm_mon + 1))); + stringTokens.insert(pair<string,string>("dayleadingzero", *cString::sprintf("%02d", now->tm_mday))); + stringTokens.insert(pair<string,string>("dayname", *WeekDayNameFull(now->tm_wday))); + stringTokens.insert(pair<string,string>("daynameshort", *WeekDayName(now->tm_wday))); + stringTokens.insert(pair<string,string>("time", *TimeString(t))); + + ClearViewElement(veDateTime); + DrawViewElement(veDateTime, &stringTokens, &intTokens); + +} + + +void cDisplayMenuRootView::DrawColorButtons(void) { + if (!ViewElementImplemented(veButtons)) { + return; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + stringTokens.insert(pair<string,string>("red", buttonTexts[0])); + stringTokens.insert(pair<string,string>("green", buttonTexts[1])); + stringTokens.insert(pair<string,string>("yellow", buttonTexts[2])); + stringTokens.insert(pair<string,string>("blue", buttonTexts[3])); + + int colorKeys[4] = { Setup.ColorKey0, Setup.ColorKey1, Setup.ColorKey2, Setup.ColorKey3 }; + + for (int button = 1; button < 5; button++) { + string red = *cString::sprintf("red%d", button); + string green = *cString::sprintf("green%d", button); + string yellow = *cString::sprintf("yellow%d", button); + string blue = *cString::sprintf("blue%d", button); + bool isRed = false; + bool isGreen = false; + bool isYellow = false; + bool isBlue = false; + switch (colorKeys[button-1]) { + case 0: + isRed = true; + break; + case 1: + isGreen = true; + break; + case 2: + isYellow = true; + break; + case 3: + isBlue = true; + break; + default: + break; + } + intTokens.insert(pair<string, int>(red, isRed)); + intTokens.insert(pair<string, int>(green, isGreen)); + intTokens.insert(pair<string, int>(yellow, isYellow)); + intTokens.insert(pair<string, int>(blue, isBlue)); + } + + ClearViewElement(veButtons); + DrawViewElement(veButtons, &stringTokens, &intTokens); +} + +void cDisplayMenuRootView::DrawMessage(eMessageType type, const char *text) { + if (!text) { + ClearViewElement(veMessage); + return; + } + + map < string, string > stringTokens; + map < string, int > intTokens; + + intTokens.insert(pair<string, int>("status", (type == mtStatus) ? true : false)); + intTokens.insert(pair<string, int>("info", (type == mtInfo) ? true : false)); + intTokens.insert(pair<string, int>("warning", (type == mtWarning) ? true : false)); + intTokens.insert(pair<string, int>("error", (type == mtError) ? true : false)); + stringTokens.insert(pair<string,string>("text", text)); + + ClearViewElement(veMessage); + DrawViewElement(veMessage, &stringTokens, &intTokens); +} + +void cDisplayMenuRootView::Action(void) { + SetInitFinished(); + Render(); + view->Start(); + FadeIn(); + DoFlush(); +} |
