#include "viewdisplaymenu.h" #include "../config.h" /************************************************************************************ * cViewMenu ************************************************************************************/ cViewMenu::cViewMenu(void) { menuDefault = NULL; menuMain = NULL; menuSetup = NULL; menuSchedules = NULL; menuChannels = NULL; menuTimers = NULL; menuRecordings = NULL; menuDetailedEpg = NULL; menuDetailedRec = NULL; menuDetailedText = NULL; ClearVariables(); viewId = eViewType::DisplayMenu; viewName = strdup("displaymenu"); numViewElements = (int)eVeDisplayMenu::count; viewElements = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElements[i] = NULL; } viewElementsHorizontal = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElementsHorizontal[i] = NULL; } SetViewElements(); int numPluginMenus = plgManager->GetNumPluginMenus(); numSubviews = (int)eSvDisplayMenu::count + numPluginMenus; subViews = new cSubView*[numSubviews]; for (int i=0; i < numSubviews; i++) { subViews[i] = NULL; } SetSubViews(); menuCat = mcUnknown; plugName = NULL; } cViewMenu::~cViewMenu() { for (int i=0; i< numSubviews; i++) delete subViews[i]; delete[] subViews; } void cViewMenu::SetGlobals(cGlobals *globals) { cView::SetGlobals(globals); for (int i=0; i < numSubviews; ++i) { if (subViews[i]) { subViews[i]->SetGlobals(globals); } } } void cViewMenu::PreCache(void) { cView::PreCache(); for (int i=0; i < numSubviews; i++) { if (subViews[i]) { subViews[i]->SetContainer(0, 0, attribs->Width(), attribs->Height()); subViews[i]->PreCache(); //setting default viewelements for subviews for (int ve = (int)eVeDisplayMenu::background; ve < (int)eVeDisplayMenu::count; ve++) { if (viewElements[ve] && !subViews[i]->ViewElementSet(ve)) { subViews[i]->SetViewElement((eVeDisplayMenu)ve, viewElements[ve]); } } for (int ve = (int)eVeDisplayMenu::background; ve < (int)eVeDisplayMenu::count; ve++) { if (viewElementsHorizontal[ve] && !subViews[i]->ViewElementHorizontalSet(ve)) { subViews[i]->SetViewElementHorizontal((eVeDisplayMenu)ve, viewElementsHorizontal[ve]); } } } } } void cViewMenu::SetViewElementObjects(void) { //setting subviews for (int i=0; i < numSubviews; i++) { if (!subViews[i]) continue; if (i == (int)eSvDisplayMenu::menudefault) menuDefault = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::main) menuMain = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::setup) menuSetup = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::schedules) menuSchedules = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::channels) menuChannels = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::timers) menuTimers = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::recordings) menuRecordings = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::detailepg) menuDetailedEpg = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::detailrec) menuDetailedRec = dynamic_cast(subViews[i]); else if (i == (int)eSvDisplayMenu::detailtext) menuDetailedText = dynamic_cast(subViews[i]); } } void cViewMenu::SetViewElements(void) { viewElementNames.insert(pair("background", (int)eVeDisplayMenu::background)); viewElementNames.insert(pair("header", (int)eVeDisplayMenu::header)); viewElementNames.insert(pair("datetime", (int)eVeDisplayMenu::datetime)); viewElementNames.insert(pair("time", (int)eVeDisplayMenu::time)); viewElementNames.insert(pair("colorbuttons", (int)eVeDisplayMenu::colorbuttons)); viewElementNames.insert(pair("message", (int)eVeDisplayMenu::message)); viewElementNames.insert(pair("scrollbar", (int)eVeDisplayMenu::scrollbar)); viewElementNames.insert(pair("sortmode", (int)eVeDisplayMenu::sortmode)); } void cViewMenu::SetSubViews(void) { //adding VDR submenus subviewNames.insert(pair("menudefault", (int)eSvDisplayMenu::menudefault)); subviewNames.insert(pair("menumain", (int)eSvDisplayMenu::main)); subviewNames.insert(pair("menusetup", (int)eSvDisplayMenu::setup)); subviewNames.insert(pair("menuschedules", (int)eSvDisplayMenu::schedules)); subviewNames.insert(pair("menuchannels", (int)eSvDisplayMenu::channels)); subviewNames.insert(pair("menutimers", (int)eSvDisplayMenu::timers)); subviewNames.insert(pair("menurecordings", (int)eSvDisplayMenu::recordings)); subviewNames.insert(pair("menudetailedepg", (int)eSvDisplayMenu::detailepg)); subviewNames.insert(pair("menudetailedrecording", (int)eSvDisplayMenu::detailrec)); subviewNames.insert(pair("menudetailedtext", (int)eSvDisplayMenu::detailtext)); //adding additional plugin subviews int subViewNumber = (int)eSvDisplayMenu::count; map *plugMenus = NULL; string plugName = ""; int plugId = -1; plgManager->InitPluginMenuIterator(); while ( plugMenus = plgManager->GetPluginMenus(plugName, plugId) ) { for (map ::iterator it = plugMenus->begin(); it != plugMenus->end(); it++) { int menuNumber = it->first; cString menuName = cString::sprintf("menuplugin-%s-%d", plugName.c_str(), menuNumber); subviewNames.insert(pair(*menuName, subViewNumber)); plgManager->AddSubviewMapping(plugId, menuNumber, subViewNumber); subViewNumber++; } } } void cViewMenu::ClearVariables(void) { cView::ClearVariables(); menuChange = true; listChange = true; detailViewInit = false; menuCat = mcUnknown; pluginIdSet = false; plugId = -1; plugMenuId = -1; activeSubview = NULL; activeSubviewLast = NULL; } int cViewMenu::SubviewId(const char *name) { map::iterator hit = subviewNames.find(name); if (hit != subviewNames.end()) return (int)hit->second; return ATTR_UNKNOWN; } bool cViewMenu::ValidSubView(const char *subView) { if (SubviewId(subView) != ATTR_UNKNOWN) return true; return false; } cSubView *cViewMenu::CreateSubview(const char *name) { cSubView *sv = NULL; if (!strcmp(name, "menudefault")) sv = new cViewMenuDefault(name); else if (!strcmp(name, "menumain")) sv = new cViewMenuMain(name); else if (!strcmp(name, "menusetup")) sv = new cViewMenuSetup(name); else if (!strcmp(name, "menuschedules")) sv = new cViewMenuSchedules(name); else if (!strcmp(name, "menuchannels")) sv = new cViewMenuChannels(name); else if (!strcmp(name, "menutimers")) sv = new cViewMenuTimers(name); else if (!strcmp(name, "menurecordings")) sv = new cViewMenuRecordings(name); else if (!strcmp(name, "menudetailedepg")) sv = new cViewMenuDetail(name); else if (!strcmp(name, "menudetailedrecording")) sv = new cViewMenuDetail(name); else if (!strcmp(name, "menudetailedtext")) sv = new cViewMenuDetail(name); return sv; } cSubView *cViewMenu::CreatePluginview(const char *plugname, int plugId, int menuNumber, int menuType) { cString menuName = cString::sprintf("menuplugin-%s-%d", plugname, menuNumber); cSubView *pv = NULL; if (menuType == skindesignerapi::mtList) pv = new cViewMenuPlugin(*menuName); else if (menuType == skindesignerapi::mtText) pv = new cViewMenuDetail(*menuName); if (pv) { pv->SetPlugId(plugId); pv->SetPlugMenuId(menuNumber); } return pv; } void cViewMenu::AddPluginview(cSubView *plugView) { int id = SubviewId(plugView->GetViewName()); if (id == ATTR_UNKNOWN) return; subViews[id] = plugView; } void cViewMenu::AddSubview(const char *sSubView, cSubView *subView) { int id = SubviewId(sSubView); if (id == ATTR_UNKNOWN) return; subViews[id] = subView; } /* eMenuCategory: -1 mcUndefined, 0 mcUnknown, 1 mcMain, 2 mcSchedule, 3 mcScheduleNow, 4 mcScheduleNext, 5 mcChannel, 6 mcChannelEdit, 7 mcTimer, 8 mcTimerEdit, 9 mcRecording, 10 mcRecordingInfo, 11 mcRecordingEdit, 12 mcPlugin, 13 mcPluginSetup, 14 mcSetup, 15 mcSetupOsd, 16 mcSetupEpg, 17 mcSetupDvb, 18 mcSetupLnb, 19 mcSetupCam, 20 mcSetupRecord, 21 mcSetupReplay, 22 mcSetupMisc, 23 mcSetupPlugins, 24 mcCommand, 25 mcEvent, 26 mcText, 27 mcFolder, 28 mcCam */ void cViewMenu::SetSubView(eMenuCategory MenuCat) { //menuCat --> old menucat //MenuCat --> new menucat if (menuCat == mcMain) { cViewMenuMain *menuMain = dynamic_cast(activeSubview); if (menuMain) { plugName = menuMain->GetPlugin(); } } //first check plugin menu if (MenuCat == mcPlugin) { bool plugMenuFound = SetPluginSubView(MenuCat); if (plugMenuFound) { menuCat = MenuCat; return; } } //then check regular menus bool catChange = false; if (menuCat != MenuCat) { catChange = true; } else { //assume at least menuChange for mcSchedules menu //that correct channel will be set in header if (menuCat == mcSchedule) menuChange = true; return; } cSubView *newSubview = NULL; menuCat = MenuCat; switch (MenuCat) { case mcMain: newSubview = subViews[(int)eSvDisplayMenu::main]; break; case mcSchedule: case mcScheduleNow: case mcScheduleNext: newSubview = subViews[(int)eSvDisplayMenu::schedules]; break; case mcChannel: newSubview = subViews[(int)eSvDisplayMenu::channels]; break; case mcTimer: newSubview = subViews[(int)eSvDisplayMenu::timers]; break; case mcRecording: newSubview = subViews[(int)eSvDisplayMenu::recordings]; break; case mcSetup: newSubview = subViews[(int)eSvDisplayMenu::setup]; break; case mcEvent: newSubview = subViews[(int)eSvDisplayMenu::detailepg]; break; case mcRecordingInfo: newSubview = subViews[(int)eSvDisplayMenu::detailrec]; break; case mcText: newSubview = subViews[(int)eSvDisplayMenu::detailtext]; break; default: newSubview = subViews[(int)eSvDisplayMenu::menudefault]; //setting plugin name for detecting plugins in default menus cViewMenuDefault *menuDefault = dynamic_cast(newSubview); if (menuDefault) { menuDefault->SetPlugin(plugName); } break; }; if (catChange) { menuChange = true; activeSubview->Clear(); activeSubviewLast = activeSubview; activeSubview = newSubview; if (!activeSubview) activeSubview = subViews[(int)eSvDisplayMenu::menudefault]; activeSubview->SetMenuCategory(MenuCat); } } bool cViewMenu::SetPluginSubView(eMenuCategory menuCat) { if (!pluginIdSet) return false; cSubView *newSubview = NULL; if (plugId >= 0 && plugMenuId >= 0) { int subViewId = plgManager->GetSubviewId(plugId, plugMenuId); if (subViewId >= 0 && subViews[subViewId]) { newSubview = subViews[subViewId]; menuChange = true; activeSubview->Clear(); activeSubviewLast = activeSubview; activeSubview = newSubview; activeSubview->SetMenuCategory(menuCat); return true; } } return false; } void cViewMenu::WakeViewElements(void) { cView::WakeViewElements(); if (activeSubview) activeSubview->WakeViewElements(); } void cViewMenu::SetSortMode(eMenuSortMode sortMode) { if (activeSubview) activeSubview->SetSortMode(sortMode); } void cViewMenu::SetPluginMenu(int plugId, int plugMenuId) { this->plugId = plugId; this->plugMenuId = plugMenuId; pluginIdSet = true; } int cViewMenu::NumListItems(void) { return activeSubview->NumListItems(); } eMenuOrientation cViewMenu::MenuOrientation(void) { return activeSubview->MenuOrientation(); } const cFont *cViewMenu::GetTextAreaFont(void) { return activeSubview->GetTextAreaFont(); } int cViewMenu::GetTextAreaWidth(void) { if (!menuDetailedText) return 0; return menuDetailedText->GetWidth(); } int cViewMenu::GetListWidth(void) { return activeSubview->GetListWidth(); } void cViewMenu::SetTitleHeader(const char *title) { activeSubview->SetTitle(title); } void cViewMenu::SetMessage(eMessageType type, const char *text) { activeSubview->SetMessage(type, text); } void cViewMenu::SetChannelHeader(const cEvent *event) { if (!event) return; if (menuChange && menuCat == mcSchedule) { #if defined (APIVERSNUM) && (APIVERSNUM >= 20301) LOCK_CHANNELS_READ; const cChannel *channel = Channels->GetByChannelID(event->ChannelID()); #else const cChannel *channel = Channels.GetByChannelID(event->ChannelID()); #endif if (channel) activeSubview->SetChannel(channel); } } void cViewMenu::SetMenuButtons(const char *red, const char *green, const char *yellow, const char *blue) { activeSubview->SetMenuButtons(red, green, yellow, blue); } void cViewMenu::SetScrollbar(int total, int offset) { activeSubview->SetScrollbar(total, offset); } void cViewMenu::SetTabs(int tab1, int tab2, int tab3, int tab4, int tab5) { menuDefault->SetTabs(tab1, tab2, tab3, tab4, tab5); } void cViewMenu::SetItem(const char *text, int index, bool current, bool selectable) { if (menuCat == mcMain && menuMain) { menuMain->SetItem(text, index, current, selectable); } else if (menuCat == mcSetup && menuSetup) { menuSetup->SetItem(text, index, current, selectable); } else { menuDefault->SetItem(text, index, current, selectable); } listChange = true; } bool cViewMenu::SetItemEvent(const cEvent *event, int index, bool current, bool selectable, const cChannel *channel, bool withDate, eTimerMatch timerMatch) { if (!menuSchedules) return false; menuSchedules->SetItem(event, index, current, selectable, channel, withDate, timerMatch); listChange = true; return true; } bool cViewMenu::SetItemTimer(const cTimer *timer, int index, bool current, bool selectable) { if (!menuTimers) return false; menuTimers->SetItem(timer, index, current, selectable); listChange = true; return true; } bool cViewMenu::SetItemChannel(const cChannel *channel, int index, bool current, bool selectable, bool withProvider) { if (!menuChannels) return false; menuChannels->SetItem(channel, index, current, selectable, withProvider); listChange = true; return true; } bool cViewMenu::SetItemRecording(const cRecording *recording, int index, bool current, bool selectable, int level, int total, int New) { if (!menuRecordings) return false; menuRecordings->SetItem(recording, index, current, selectable, level, total, New); listChange = true; return true; } bool cViewMenu::SetItemPlugin(skindesignerapi::cTokenContainer *tk, int index, bool current, bool selectable) { cViewMenuPlugin *menuPlugin = dynamic_cast(activeSubview); if (!menuPlugin) { return false; } menuPlugin->SetItem(tk, index, current, selectable); listChange = true; return true; } void cViewMenu::SetEvent(const cEvent *event) { menuDetailedEpg->SetEvent(event); detailViewInit = true; } void cViewMenu::SetRecording(const cRecording *recording) { menuDetailedRec->SetRecording(recording); detailViewInit = true; } void cViewMenu::SetText(const char *text) { menuDetailedText->SetText(text); detailViewInit = true; } bool cViewMenu::SetPluginText(skindesignerapi::cTokenContainer *tk) { cViewMenuDetail *menuPlugin = dynamic_cast(activeSubview); if (!menuPlugin) { return false; } menuPlugin->SetPluginText(tk); detailViewInit = true; return true; } void cViewMenu::SetCurrentRecording(const char *currentRec) { if (menuMain) { menuMain->SetCurrentRecording(currentRec); } } void cViewMenu::KeyDetailView(bool up, bool page) { cViewMenuDetail *detailView = dynamic_cast(activeSubview); 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(); } } bool cViewMenu::Init(void) { activeSubview = subViews[(int)eSvDisplayMenu::menudefault]; return cView::Init(); } void cViewMenu::Close(void) { delete fader; fader = NULL; if (FadeTime() > 0) { fader = new cAnimation((cFadable*)this, false); fader->Fade(); delete fader; fader = NULL; } for (int i=0; i < numSubviews; i++) { if (subViews[i]) { subViews[i]->Close(); } } for (int i=0; i < numViewElements; i++) { if (viewElements[i]) { viewElements[i]->Close(); } if (viewElementsHorizontal[i]) { viewElementsHorizontal[i]->Close(); } } UnScaleTv(); ClearVariables(); sdOsd.DeleteOsd(); } void cViewMenu::Clear(void) { activeSubview->ClearViewList(); } void cViewMenu::Flush(void) { if (init) { sdOsd.LockFlush(); } bool staticInitiated = false; if (menuChange) { newTvFrame = activeSubview->GetTvFrame(); menuInit = true; activeSubview->DrawStaticVEs(); pluginIdSet = false; menuChange = false; staticInitiated = true; } if (listChange) { activeSubview->DrawList(); listChange = false; } if (detailViewInit) { if (!staticInitiated) activeSubview->DrawStaticVEs(); activeSubview->DrawDetailedView(); pluginIdSet = false; detailViewInit = false; } activeSubview->DrawDynamicVEs(); cView::Flush(); } void cViewMenu::SetTransparency(int transparency, bool forceDetached) { activeSubview->SetTransparency(transparency, forceDetached); if (menuDetailedEpg) menuDetailedEpg->SetTransparency(transparency); if (menuDetailedRec) menuDetailedRec->SetTransparency(transparency); if (menuDetailedText) menuDetailedText->SetTransparency(transparency); } void cViewMenu::Debug(void) { cView::Debug(); for (int i=0; i < numSubviews; i++) { if (subViews[i]) { subViews[i]->Debug(); } } } /*********************************************************** * cSubView ***********************************************************/ cSubView::cSubView(const char *name) { menuCat = mcUnknown; plugId = -1; plugMenuId = -1; this->viewName = strdup(name); numViewElements = (int)eVeDisplayMenu::count; viewElements = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElements[i] = NULL; } viewElementsHorizontal = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElementsHorizontal[i] = NULL; } background = NULL; header = NULL; datetime = NULL; time = NULL; message = NULL; sortmode = NULL; colorbuttons = NULL; scrollbar = NULL; viewList = NULL; viewListVertical = NULL; viewListHorizontal = NULL; SetViewElements(); } cSubView::~cSubView(void) { delete viewListHorizontal; delete viewListVertical; } void cSubView::SetGlobals(cGlobals *globals) { cView::SetGlobals(globals); if (viewListVertical) viewListVertical->SetGlobals(globals); if (viewListHorizontal) viewListHorizontal->SetGlobals(globals); } void cSubView::PreCache(void) { attribs->SetContainer(container.X(), container.Y(), container.Width(), container.Height()); attribs->Cache(); cView::PreCache(); if (viewListVertical) { viewListVertical->SetPlugId(plugId); viewListVertical->SetPlugMenuId(plugMenuId); viewListVertical->SetContainer(attribs->X(), attribs->Y(), attribs->Width(), attribs->Height()); viewListVertical->PreCache(); } if (viewListHorizontal) { viewListHorizontal->SetPlugId(plugId); viewListHorizontal->SetPlugMenuId(plugMenuId); viewListHorizontal->SetContainer(attribs->X(), attribs->Y(), attribs->Width(), attribs->Height()); viewListHorizontal->PreCache(); } } bool cSubView::ViewElementSet(int ve) { if (ve >= 0 && ve < (int)eVeDisplayMenu::count && viewElements[ve]) return true; return false; } bool cSubView::ViewElementHorizontalSet(int ve) { if (ve >= 0 && ve < (int)eVeDisplayMenu::count && viewElementsHorizontal[ve]) return true; return false; } void cSubView::SetViewElement(eVeDisplayMenu ve, cViewElement *viewElement) { switch (ve) { case eVeDisplayMenu::background: if (!background) background = viewElement; break; case eVeDisplayMenu::header: if (!header) header = dynamic_cast(viewElement); break; case eVeDisplayMenu::datetime: if (!datetime) datetime = dynamic_cast(viewElement); break; case eVeDisplayMenu::time: if (!time) time = dynamic_cast(viewElement); break; case eVeDisplayMenu::message: if (!message) message = dynamic_cast(viewElement); break; case eVeDisplayMenu::sortmode: if (!sortmode) sortmode = dynamic_cast(viewElement); break; case eVeDisplayMenu::colorbuttons: if (!colorbuttons) colorbuttons = dynamic_cast(viewElement); break; case eVeDisplayMenu::scrollbar: if (!scrollbar) scrollbar = dynamic_cast(viewElement); break; default: break; }; } void cSubView::SetViewElementHorizontal(eVeDisplayMenu ve, cViewElement *viewElement) { eOrientation orientation = attribs->Orientation(); if (orientation != eOrientation::horizontal) return; switch (ve) { case eVeDisplayMenu::background: if (!background) background = viewElement; break; case eVeDisplayMenu::header: if (!header) header = dynamic_cast(viewElement); break; case eVeDisplayMenu::datetime: if (!datetime) datetime = dynamic_cast(viewElement); break; case eVeDisplayMenu::time: if (!time) time = dynamic_cast(viewElement); break; case eVeDisplayMenu::message: if (!message) message = dynamic_cast(viewElement); break; case eVeDisplayMenu::sortmode: if (!sortmode) sortmode = dynamic_cast(viewElement); break; case eVeDisplayMenu::colorbuttons: if (!colorbuttons) colorbuttons = dynamic_cast(viewElement); break; case eVeDisplayMenu::scrollbar: if (!scrollbar) scrollbar = dynamic_cast(viewElement); break; default: break; }; } void cSubView::AddViewList(cViewList *viewList) { eOrientation orientation = viewList->Orientation(); if (orientation == eOrientation::vertical) { viewListVertical = viewList; } else if (orientation == eOrientation::horizontal) { viewListHorizontal = viewList; } else { viewListVertical = viewList; } } int cSubView::NumListItems(void) { if (viewList) return viewList->NumItems(); return 0; } eMenuOrientation cSubView::MenuOrientation(void) { eOrientation orientation = attribs->Orientation(); if (orientation == eOrientation::horizontal) return moHorizontal; return moVertical; } void cSubView::SetTitle(const char *title) { if (header) { header->SetTitle(title); } } void cSubView::SetChannel(const cChannel *channel) { if (header) { header->SetChannel(channel); } } void cSubView::SetMessage(eMessageType type, const char *text) { if (!message) return; if (!text) { message->Clear(); message->Hide(); return; } message->Set(type, text); message->Show(); if (message->Parse()) message->Render(); } void cSubView::SetMenuButtons(const char *red, const char *green, const char *yellow, const char *blue) { if (!colorbuttons) return; colorbuttons->SetButtons(red, green, yellow, blue); if (colorbuttons->Parse()) { colorbuttons->Show(); colorbuttons->Render(); } } void cSubView::SetScrollbar(int total, int offset) { if (!scrollbar) return; scrollbar->SetList(total, offset, NumListItems()); if (scrollbar->Parse()) { scrollbar->Show(); scrollbar->Render(); } } void cSubView::SetSortMode(eMenuSortMode sortMode) { if (!sortmode) return; sortmode->Set(sortMode); if (sortmode->Parse()) { sortmode->Show(); sortmode->Render(); } } void cSubView::Close(void) { ClearVariables(); for (int i=0; i < numViewElements; i++) { if (!viewElements[i]) continue; viewElements[i]->Close(); } for (int i=0; i < numViewElements; i++) { if (!viewElementsHorizontal[i]) continue; viewElementsHorizontal[i]->Close(); } if (viewList) viewList->Close(); } void cSubView::ClearViewList(void) { if (viewList) viewList->Clear(); } void cSubView::WakeViewElements(void) { for (int i = 0; i < numViewElements; i++) { if (viewElements[i]) { viewElements[i]->WakeUp(); } if (viewElementsHorizontal[i]) { viewElementsHorizontal[i]->WakeUp(); } } } void cSubView::Clear(void) { if (background) background->Hide(); if (datetime) datetime->Hide(); if (time) time->Hide(); if (header) header->Hide(); if (colorbuttons) colorbuttons->Hide(); if (scrollbar) scrollbar->Hide(); if (sortmode) { sortmode->Reset(); sortmode->Hide(); } if (viewList) viewList->Close(); } void cSubView::DrawStaticVEs(void) { if (background) { background->Show(); background->Render(); } } void cSubView::DrawDynamicVEs(void) { if (header) { header->Show(); header->Set(menuCat); if (header->Parse()) header->Render(); } if (datetime) { datetime->Show(); if (datetime->Parse()) datetime->Render(); } if (time) { time->Show(); if (time->Parse()) { time->Render(); } } } void cSubView::DrawList(void) { if (viewList) { viewList->Draw(menuCat); } } void cSubView::SetTransparency(int transparency, bool forceDetached) { for (int i = 0; i < numViewElements; i++) { if (viewElements[i] && (!viewElements[i]->Detached() || forceDetached)) { viewElements[i]->SetTransparency(transparency); } if (viewElementsHorizontal[i] && (!viewElementsHorizontal[i]->Detached() || forceDetached)) { viewElementsHorizontal[i]->SetTransparency(transparency); } } if (viewList) viewList->SetTransparency(transparency); } /*********************************************************** * Protected Functions ***********************************************************/ void cSubView::SetViewElementObjects(void) { eOrientation orientation = attribs->Orientation(); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::background]) background = viewElementsHorizontal[(int)eVeDisplayMenu::background]; else if (viewElements[(int)eVeDisplayMenu::background]) background = viewElements[(int)eVeDisplayMenu::background]; if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::header]) header = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenu::header]); else if (viewElements[(int)eVeDisplayMenu::header]) header = dynamic_cast(viewElements[(int)eVeDisplayMenu::header]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::datetime]) datetime = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenu::datetime]); else if (viewElements[(int)eVeDisplayMenu::datetime]) datetime = dynamic_cast(viewElements[(int)eVeDisplayMenu::datetime]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::time]) time = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenu::time]); else if (viewElements[(int)eVeDisplayMenu::time]) time = dynamic_cast(viewElements[(int)eVeDisplayMenu::time]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::message]) message = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenu::message]); else if (viewElements[(int)eVeDisplayMenu::message]) message = dynamic_cast(viewElements[(int)eVeDisplayMenu::message]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::sortmode]) sortmode = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenu::sortmode]); else if (viewElements[(int)eVeDisplayMenu::sortmode]) sortmode = dynamic_cast(viewElements[(int)eVeDisplayMenu::sortmode]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::colorbuttons]) colorbuttons = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenu::colorbuttons]); else if (viewElements[(int)eVeDisplayMenu::colorbuttons]) colorbuttons = dynamic_cast(viewElements[(int)eVeDisplayMenu::colorbuttons]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::scrollbar]) scrollbar = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenu::scrollbar]); else if (viewElements[(int)eVeDisplayMenu::scrollbar]) scrollbar = dynamic_cast(viewElements[(int)eVeDisplayMenu::scrollbar]); if (attribs->Orientation() == eOrientation::horizontal) viewList = viewListHorizontal; else viewList = viewListVertical; } void cSubView::SetViewElements(void) { viewElementNames.insert(pair("background", (int)eVeDisplayMenu::background)); viewElementNames.insert(pair("header", (int)eVeDisplayMenu::header)); viewElementNames.insert(pair("datetime", (int)eVeDisplayMenu::datetime)); viewElementNames.insert(pair("time", (int)eVeDisplayMenu::time)); viewElementNames.insert(pair("colorbuttons", (int)eVeDisplayMenu::colorbuttons)); viewElementNames.insert(pair("message", (int)eVeDisplayMenu::message)); viewElementNames.insert(pair("scrollbar", (int)eVeDisplayMenu::scrollbar)); viewElementNames.insert(pair("sortmode", (int)eVeDisplayMenu::sortmode)); } /*********************************************************** * cViewMenuDefault ***********************************************************/ cViewMenuDefault::cViewMenuDefault(const char *name) : cSubView(name) { listDefault = NULL; } cViewMenuDefault::~cViewMenuDefault(void) { } void cViewMenuDefault::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); listDefault = dynamic_cast(viewList); } void cViewMenuDefault::SetTabs(int tab1, int tab2, int tab3, int tab4, int tab5) { if (listDefault) listDefault->SetTabs(tab1, tab2, tab3, tab4, tab5); } void cViewMenuDefault::SetPlugin(const char *plugName) { listDefault->SetPlugin(plugName); } void cViewMenuDefault::SetItem(const char *text, int index, bool current, bool selectable) { listDefault->Set(text, index, current, selectable); } const cFont *cViewMenuDefault::GetTextAreaFont(void) { if (!listDefault) return NULL; return listDefault->GetListFont(); } int cViewMenuDefault::GetListWidth(void) { if (!listDefault) return 0; return listDefault->GetListWidth(); } /************************************************************************************ * cViewMenuMain ************************************************************************************/ cViewMenuMain::cViewMenuMain(const char *name) : cSubView(name) { for (int i=0; i < numViewElements; i++) { delete viewElements[i]; } delete[] viewElements; numViewElements = (int)eVeDisplayMenuMain::count; viewElements = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElements[i] = NULL; } delete[] viewElementsHorizontal; viewElementsHorizontal = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElementsHorizontal[i] = NULL; } listMain = NULL; timers = NULL; devices = NULL; weather = NULL; discusage = NULL; load = NULL; memory = NULL; vdrstats = NULL; temperatures = NULL; currentSchedule = NULL; lastRecordings = NULL; customTokens = NULL; lastDrawDynamic = 0; SetViewElements(); } cViewMenuMain::~cViewMenuMain() { } void cViewMenuMain::ClearVariables(void) { init = true; } void cViewMenuMain::SetViewElements(void) { viewElementNames.insert(pair("timers", (int)eVeDisplayMenuMain::timers)); viewElementNames.insert(pair("devices", (int)eVeDisplayMenuMain::devices)); viewElementNames.insert(pair("currentweather", (int)eVeDisplayMenuMain::currentweather)); viewElementNames.insert(pair("currentschedule", (int)eVeDisplayMenuMain::currentschedule)); viewElementNames.insert(pair("discusage", (int)eVeDisplayMenuMain::discusage)); viewElementNames.insert(pair("systemload", (int)eVeDisplayMenuMain::systemload)); viewElementNames.insert(pair("systemmemory", (int)eVeDisplayMenuMain::systemmemory)); viewElementNames.insert(pair("vdrstatistics", (int)eVeDisplayMenuMain::vdrstatistics)); viewElementNames.insert(pair("temperatures", (int)eVeDisplayMenuMain::temperatures)); viewElementNames.insert(pair("lastrecordings", (int)eVeDisplayMenuMain::lastrecordings)); viewElementNames.insert(pair("customtokens", (int)eVeDisplayMenuMain::customtokens)); } void cViewMenuMain::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); eOrientation orientation = attribs->Orientation(); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::timers]) timers = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::timers]); else if (viewElements[(int)eVeDisplayMenuMain::timers]) timers = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::timers]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::devices]) devices = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::devices]); else if (viewElements[(int)eVeDisplayMenuMain::devices]) devices = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::devices]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::currentweather]) weather = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::currentweather]); else if (viewElements[(int)eVeDisplayMenuMain::currentweather]) weather = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::currentweather]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::currentschedule]) currentSchedule = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::currentschedule]); else if (viewElements[(int)eVeDisplayMenuMain::currentschedule]) currentSchedule = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::currentschedule]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::discusage]) discusage = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::discusage]); else if (viewElements[(int)eVeDisplayMenuMain::discusage]) discusage = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::discusage]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::systemload]) load = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::systemload]); else if (viewElements[(int)eVeDisplayMenuMain::systemload]) load = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::systemload]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::systemmemory]) memory = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::systemmemory]); else if (viewElements[(int)eVeDisplayMenuMain::systemmemory]) memory = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::systemmemory]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::vdrstatistics]) vdrstats = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::vdrstatistics]); else if (viewElements[(int)eVeDisplayMenuMain::vdrstatistics]) vdrstats = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::vdrstatistics]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::temperatures]) temperatures = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::temperatures]); else if (viewElements[(int)eVeDisplayMenuMain::temperatures]) temperatures = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::temperatures]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::lastrecordings]) lastRecordings = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::lastrecordings]); else if (viewElements[(int)eVeDisplayMenuMain::lastrecordings]) lastRecordings = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::lastrecordings]); if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::customtokens]) customTokens = dynamic_cast(viewElementsHorizontal[(int)eVeDisplayMenuMain::customtokens]); else if (viewElements[(int)eVeDisplayMenuMain::customtokens]) customTokens = dynamic_cast(viewElements[(int)eVeDisplayMenuMain::customtokens]); if (devices) devices->SetDetached(); if (weather) weather->SetDetached(); if (discusage) discusage->SetDetached(); if (load) load->SetDetached(); if (memory) memory->SetDetached(); if (vdrstats) vdrstats->SetDetached(); if (temperatures) temperatures->SetDetached(); if (timers) timers->SetDetached(); if (currentSchedule) currentSchedule->SetDetached(); if (lastRecordings) lastRecordings->SetDetached(); if (customTokens) customTokens->SetDetached(); listMain = dynamic_cast(viewList); } void cViewMenuMain::Clear(void) { cSubView::Clear(); lastDrawDynamic = 0; if (devices) devices->Hide(); if (weather) weather->Hide(); if (discusage) discusage->Hide(); if (load) { load->Reset(); load->Hide(); } if (memory) { memory->Reset(); memory->Hide(); } if (vdrstats) { vdrstats->Reset(); vdrstats->Hide(); } if (temperatures) { temperatures->Reset(); temperatures->Hide(); } if (timers) { timers->Hide(); } if (currentSchedule) { currentSchedule->Hide(); } if (lastRecordings) { lastRecordings->Hide(); } if (customTokens) { customTokens->Reset(); customTokens->Hide(); } } void cViewMenuMain::SetItem(const char *text, int index, bool current, bool selectable) { listMain->Set(text, index, current, selectable); } void cViewMenuMain::SetCurrentRecording(const char *currentRec) { if (currentSchedule) currentSchedule->SetRecording(currentRec); } void cViewMenuMain::DrawStaticVEs(void) { cSubView::DrawStaticVEs(); if (weather) { weather->Show(); if (weather->Parse()) weather->Render(); } if (discusage) { discusage->Show(); if (discusage->Parse()) discusage->Render(); } if (timers) { timers->Show(); if (timers->Parse()) timers->Render(); } if (currentSchedule) { currentSchedule->Show(); if (currentSchedule->Parse()) currentSchedule->Render(); } if (lastRecordings) { lastRecordings->Show(); if (lastRecordings->Parse()) lastRecordings->Render(); } } void cViewMenuMain::DrawDynamicVEs(void) { cSubView::DrawDynamicVEs(); //draw main menu dynamic elements //only every 3 seconds uint64_t now = cTimeMs::Now(); if (now - lastDrawDynamic < 3000) return; else { lastDrawDynamic = now; } if (devices) { devices->Show(); if (devices->Parse()) devices->Render(); } if (load) { load->Show(); if (load->Parse()) load->Render(); } if (memory) { memory->Show(); if (memory->Parse()) memory->Render(); } if (vdrstats) { vdrstats->Show(); if (vdrstats->Parse()) vdrstats->Render(); } if (temperatures) { temperatures->Show(); if (temperatures->Parse()) temperatures->Render(); } if (customTokens) { customTokens->Show(); if (customTokens->Parse()) customTokens->Render(); } } const char *cViewMenuMain::GetPlugin(void) { return listMain->GetPlugin(); } /*********************************************************** * cViewMenuSetup ***********************************************************/ cViewMenuSetup::cViewMenuSetup(const char *name) : cSubView(name) { listSetup = NULL; } cViewMenuSetup::~cViewMenuSetup(void) { } void cViewMenuSetup::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); listSetup = dynamic_cast(viewList); } void cViewMenuSetup::SetItem(const char *text, int index, bool current, bool selectable) { listSetup->Set(text, index, current, selectable); } /*********************************************************** * cViewMenuSchedules ***********************************************************/ cViewMenuSchedules::cViewMenuSchedules(const char *name) : cSubView(name) { listSchedules = NULL; } cViewMenuSchedules::~cViewMenuSchedules(void) { } void cViewMenuSchedules::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); listSchedules = dynamic_cast(viewList); } void cViewMenuSchedules::SetItem(const cEvent *event, int index, bool current, bool selectable, const cChannel *channel, bool withDate, eTimerMatch timerMatch) { bool epgSearchFavMenu = (menuCat == mcSchedule && channel) ? true : false; listSchedules->IsEpgSearchFav(epgSearchFavMenu); if (header) header->IsEpgSearchFav(epgSearchFavMenu); listSchedules->Set(event, index, current, selectable, channel, withDate, timerMatch); } /*********************************************************** * cViewMenuChannels ***********************************************************/ cViewMenuChannels::cViewMenuChannels(const char *name) : cSubView(name) { listChannels = NULL; } cViewMenuChannels::~cViewMenuChannels(void) { } void cViewMenuChannels::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); listChannels = dynamic_cast(viewList); } void cViewMenuChannels::SetItem(const cChannel *channel, int index, bool current, bool selectable, bool withProvider) { listChannels->Set(channel, index, current, selectable, withProvider); } /*********************************************************** * cViewMenuTimers ***********************************************************/ cViewMenuTimers::cViewMenuTimers(const char *name) : cSubView(name) { listTimers = NULL; } cViewMenuTimers::~cViewMenuTimers(void) { } void cViewMenuTimers::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); listTimers = dynamic_cast(viewList); } void cViewMenuTimers::SetItem(const cTimer *timer, int index, bool current, bool selectable) { listTimers->Set(timer, index, current, selectable); } /*********************************************************** * cViewMenuRecordings ***********************************************************/ cViewMenuRecordings::cViewMenuRecordings(const char *name) : cSubView(name) { listRecordings = NULL; } cViewMenuRecordings::~cViewMenuRecordings(void) { } void cViewMenuRecordings::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); listRecordings = dynamic_cast(viewList); } void cViewMenuRecordings::SetItem(const cRecording *recording, int index, bool current, bool selectable, int level, int total, int New) { listRecordings->Set(recording, index, current, selectable, level, total, New); } /*********************************************************** * cViewMenuPlugin ***********************************************************/ cViewMenuPlugin::cViewMenuPlugin(const char *name) : cSubView(name) { listPlugin = NULL; } cViewMenuPlugin::~cViewMenuPlugin(void) { } void cViewMenuPlugin::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); listPlugin = dynamic_cast(viewList); } void cViewMenuPlugin::SetItem(skindesignerapi::cTokenContainer *tk, int index, bool current, bool selectable) { listPlugin->Set(tk, index, current, selectable); } /*********************************************************** * cViewMenuDetail ***********************************************************/ cViewMenuDetail::cViewMenuDetail(const char *name) : cSubView(name) { firstTab = true; for (int i=0; i < numViewElements; i++) { delete viewElements[i]; } delete[] viewElements; numViewElements = (int)eVeDisplayDetailedMenu::count; viewElements = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElements[i] = NULL; } delete[] viewElementsHorizontal; viewElementsHorizontal = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElementsHorizontal[i] = NULL; } SetViewElements(); detailedheaderEpg = NULL; detailedheaderRec = NULL; detailedheaderPlug = NULL; tablabels = NULL; detailViewEpg = NULL; detailViewRec = NULL; detailViewText = NULL; detailViewPlugin = NULL; SetDetailedView(); } cViewMenuDetail::~cViewMenuDetail(void) { } void cViewMenuDetail::SetDetailedView(void) { if (!strcmp(viewName, "menudetailedepg")) { detailViewEpg = new cViewDetailEpg(); detailView = detailViewEpg; } else if (!strcmp(viewName, "menudetailedrecording")) { detailViewRec = new cViewDetailRec(); detailView = detailViewRec; } else if (!strcmp(viewName, "menudetailedtext")) { detailViewText = new cViewDetailText(); detailView = detailViewText; } else if (startswith(viewName, "menuplugin")) { detailViewPlugin = new cViewDetailPlugin(); detailView = detailViewPlugin; } else { esyslog("skindesigner: invalid detailedview %s", viewName); } if (detailView) { detailView->SetOsd(&sdOsd); } } void cViewMenuDetail::AddTab(cArea *tab) { if (firstTab) { tab->SetActiveTab(true); firstTab = false; } detailView->AddArea(tab); } void cViewMenuDetail::SetGlobals(cGlobals *globals) { cView::SetGlobals(globals); detailView->SetGlobals(globals); } void cViewMenuDetail::PreCache(void) { attribs->SetContainer(container.X(), container.Y(), container.Width(), container.Height()); attribs->Cache(); if (plugId >= 0 && plugMenuId >= 0) { cVeDmDetailheaderPlugin *dhPlug = dynamic_cast(viewElements[(int)eVeDisplayDetailedMenu::detailheader]); dhPlug->SetPlugId(plugId); dhPlug->SetPlugMenuId(plugMenuId); dhPlug->SetTokenContainer(); } cView::PreCache(); detailView->SetPlugId(plugId); detailView->SetPlugMenuId(plugMenuId); detailView->SetTokenContainer(); detailView->SetContainer(attribs->X(), attribs->Y(), attribs->Width(), attribs->Height()); detailView->Cache(); } int cViewMenuDetail::GetWidth(void) { return detailView->GetWidth(); } void cViewMenuDetail::SetViewElements(void) { viewElementNames.insert(pair("detailheader", (int)eVeDisplayDetailedMenu::detailheader)); viewElementNames.insert(pair("tablabels", (int)eVeDisplayDetailedMenu::tablabels)); } void cViewMenuDetail::SetViewElementObjects(void) { cSubView::SetViewElementObjects(); if (viewElements[(int)eVeDisplayDetailedMenu::detailheader]) { if (!strcmp(viewName, "menudetailedepg")) detailedheaderEpg = dynamic_cast(viewElements[(int)eVeDisplayDetailedMenu::detailheader]); else if (!strcmp(viewName, "menudetailedrecording")) detailedheaderRec = dynamic_cast(viewElements[(int)eVeDisplayDetailedMenu::detailheader]); else if (startswith(viewName, "menuplugin")) detailedheaderPlug = dynamic_cast(viewElements[(int)eVeDisplayDetailedMenu::detailheader]); } if (viewElements[(int)eVeDisplayDetailedMenu::tablabels]) tablabels = dynamic_cast(viewElements[(int)eVeDisplayDetailedMenu::tablabels]); } void cViewMenuDetail::SetEvent(const cEvent *event) { if (detailedheaderEpg) detailedheaderEpg->SetEvent(event); if (detailViewEpg) detailViewEpg->SetEvent(event); } void cViewMenuDetail::SetRecording(const cRecording *recording) { if (detailedheaderRec) detailedheaderRec->SetRecording(recording); if (detailViewRec) detailViewRec->SetRecording(recording); } void cViewMenuDetail::SetText(const char *text) { if (detailViewText) detailViewText->SetText(text); } void cViewMenuDetail::SetPluginText(skindesignerapi::cTokenContainer *tk) { if (detailedheaderPlug) detailedheaderPlug->Set(tk); if (detailViewPlugin) detailViewPlugin->Set(tk); } void cViewMenuDetail::Clear(void) { cSubView::Clear(); cSubView::Close(); if (detailedheaderEpg) { detailedheaderEpg->Close(); } else if (detailedheaderRec) { detailedheaderRec->Close(); } else if (detailedheaderPlug) { detailedheaderPlug->Close(); } if (header) { header->Hide(); } if (detailView) { detailView->Close(); } } void cViewMenuDetail::Close(void) { cSubView::Clear(); cSubView::Close(); if (detailView) { detailView->Close(); } } void cViewMenuDetail::DrawStaticVEs(void) { cSubView::DrawStaticVEs(); if (header) { header->Show(); header->Set(menuCat); if (header->Parse()) header->Render(); } if (detailedheaderEpg && detailedheaderEpg->Parse()) { detailedheaderEpg->Render(); } else if (detailedheaderRec && detailedheaderRec->Parse()) { detailedheaderRec->Render(); } else if (detailedheaderPlug && detailedheaderPlug->Parse()) { detailedheaderPlug->Render(); } } void cViewMenuDetail::DrawDynamicVEs(void) { if (datetime) { datetime->Show(); if (datetime->Parse()) datetime->Render(); } if (time) { time->Show(); if (time->Parse()) time->Render(); } } void cViewMenuDetail::DrawDetailedView(void) { detailView->Clear(); detailView->ResetTabs(); if (detailView->Parse()) { detailView->Render(); } if (scrollbar) { scrollbar->Show(); DrawScrollbar(); } vector tabs; int activeTab = detailView->GetTabs(tabs); if (tablabels) { tablabels->SetTabs(tabs); tablabels->SetActiveTab(activeTab); if (tablabels->Parse()) tablabels->Render(); } } void cViewMenuDetail::KeyLeft(void) { if (detailView->NumTabs() > 1) { detailView->Clear(); detailView->PrevTab(); detailView->SetDirty(); if (tablabels) { tablabels->Clear(); tablabels->SetActiveTab(detailView->ActiveTab()); if (tablabels->Parse()) tablabels->Render(); } sdOsd.Flush(); detailView->Render(); if (scrollbar) { DrawScrollbar(); } } else { //scroll page if (detailView->ScrollUp(true)) { if (scrollbar) DrawScrollbar(); } } } void cViewMenuDetail::KeyRight(void) { if (detailView->NumTabs() > 1) { detailView->Clear(); detailView->NextTab(); detailView->SetDirty(); if (tablabels) { tablabels->Clear(); tablabels->SetActiveTab(detailView->ActiveTab()); if (tablabels->Parse()) tablabels->Render(); } sdOsd.Flush(); detailView->Render(); if (scrollbar) { DrawScrollbar(); } } else { //scroll page if (detailView->ScrollDown(true)) { if (scrollbar) DrawScrollbar(); } } } void cViewMenuDetail::KeyUp(void) { if (detailView->ScrollUp()) { if (scrollbar) DrawScrollbar(); } } void cViewMenuDetail::KeyDown(void) { if (scrollbar && detailView->ScrollDown()) { if (scrollbar) DrawScrollbar(); } } void cViewMenuDetail::SetTransparency(int transparency, bool forceDetached) { if (detailedheaderEpg) detailedheaderEpg->SetTransparency(transparency); if (detailedheaderRec) detailedheaderRec->SetTransparency(transparency); if (tablabels) tablabels->SetTransparency(transparency); if (detailView) detailView->SetTransparency(transparency); } void cViewMenuDetail::DrawScrollbar(void) { int barheight = 0; int offset = 0; bool end = true; detailView->Scrollbar(barheight, offset, end); scrollbar->SetDetail(barheight, offset, end); scrollbar->Render(); }