diff --git a/recmenuview.c b/recmenuview.c index ccfe0ff..68a02f5 100644 --- a/recmenuview.c +++ b/recmenuview.c @@ -1,939 +1,939 @@ -#include "recmenu.h" -#include "recmenus.h" -#include "switchtimer.h" -#include "timerconflict.h" -#include "recmenuview.h" - -cRecMenuView::cRecMenuView(void) { - footer = NULL; - active = false; - activeMenu = NULL; - activeMenuBuffer = NULL; - activeMenuBuffer2 = NULL; - recManager = new cRecManager(); - recManager->SetEPGSearchPlugin(); - timerConflicts = NULL; - detailViewActive = false; -} - -cRecMenuView::~cRecMenuView(void) { - if (activeMenu) { - active = false; - delete activeMenu; - activeMenu = NULL; - } - if (timerConflicts) { - delete timerConflicts; - timerConflicts = NULL; - } - delete recManager; -} - -void cRecMenuView::Start(const cEvent *event) { - active = true; - activeMenuBuffer = NULL; - detailViewActive = false; - SetBackground(); - this->event = event; - activeMenu = new cRecMenuMain(recManager->EpgSearchAvailable(), recManager->CheckEventForTimer(event), SwitchTimers.EventInSwitchList(event)); - activeMenu->Display(); - osdManager.flush(); -} - -void cRecMenuView::StartFavorites(void) { - active = true; - activeMenuBuffer = NULL; - detailViewActive = false; - SetBackground(); - std::vector favorites; - recManager->GetFavorites(&favorites); - activeMenu = new cRecMenuFavorites(favorites); - activeMenu->Display(); - osdManager.flush(); -} - - -void cRecMenuView::Close(void) { - event = NULL; - active = false; - if (activeMenu) { - delete activeMenu; - activeMenu = NULL; - } - if (timerConflicts) { - delete timerConflicts; - timerConflicts = NULL; - } - DeleteBackground(); -} - -void cRecMenuView::SetBackground(void) { - int backgroundWidth = geoManager.osdWidth; - int backgroundHeight = geoManager.osdHeight; - pixmapBackground = osdManager.requestPixmap(3, cRect(0, 0, backgroundWidth, backgroundHeight)); - pixmapBackground->Fill(theme.Color(clrRecMenuBackground)); - if (tvguideConfig.scaleVideo) { - int tvHeight = geoManager.statusHeaderHeight; - int tvWidth = tvHeight * 16 / 9; - int tvX = geoManager.osdWidth - tvWidth; - pixmapBackground->DrawRectangle(cRect(tvX, 0, tvWidth, tvHeight), clrTransparent); - } -} - -void cRecMenuView::DeleteBackground(void) { - osdManager.releasePixmap(pixmapBackground); -} - -eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { - eOSState state = osContinue; - switch (nextState) { - /*************************************************************************************** - * INSTANT RECORDING - ****************************************************************************************/ - case rmsInstantRecord: { - //caller: main menu or folder chooser - //Creating timer for active Event, if no conflict, confirm and exit - std::string recFolder = ""; - if (cRecMenuAskFolder *menu = dynamic_cast(activeMenu)) { - recFolder = menu->GetFolder(); - } - delete activeMenu; - cTimer *timer = recManager->createTimer(event, recFolder); - if (!DisplayTimerConflict(timer)) { - activeMenu = new cRecMenuConfirmTimer(event); - activeMenu->Display(); - } - break; } - case rmsInstantRecordFolder: - //caller: main menu - //Asking for Folder - delete activeMenu; - activeMenu = new cRecMenuAskFolder(event, rmsInstantRecord); - activeMenu->Display(); - break; - case rmsIgnoreTimerConflict: - //caller: cRecMenuTimerConflict - //Confirming created Timer - delete activeMenu; - activeMenu = new cRecMenuConfirmTimer(event); - activeMenu->Display(); - break; - case rmsTimerConflictShowInfo: { - //caller: cRecMenuTimerConflict - int timerIndex; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { - timerIndex = menu->GetTimerConflictIndex(); - } else break; - int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); -#if VDRVERSNUM >= 20301 - LOCK_TIMERS_READ; - const cTimer *t = Timers->Get(timerID); -#else - cTimer *t = Timers.Get(timerID); -#endif - if (t) { - const cEvent *ev = t->Event(); - if (ev) { - DisplayDetailedView(ev); - } - } - break; } - case rmsDeleteTimerConflictMenu: { - //caller: cRecMenuTimerConflict - //delete timer out of current timer conflict - int timerIndex; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { - timerIndex = menu->GetTimerConflictIndex(); - } else break; - int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); - recManager->DeleteTimer(timerID); - delete activeMenu; - if (!DisplayTimerConflict(timerID)) { - activeMenu = new cRecMenuConfirmTimer(event); - activeMenu->Display(); - } - break; } - case rmsEditTimerConflictMenu: { - //caller: cRecMenuTimerConflict - //edit timer out of current timer conflict - int timerIndex; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { - timerIndex = menu->GetTimerConflictIndex(); - } else break; - int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); -#if VDRVERSNUM >= 20301 - LOCK_TIMERS_READ; - const cTimer *timer = Timers->Get(timerID); -#else - const cTimer *timer = Timers.Get(timerID); -#endif - if (timer) { - delete activeMenu; - activeMenu = new cRecMenuEditTimer(timer, rmsSaveTimerConflictMenu); - activeMenu->Display(); - } - break; } - case rmsSaveTimerConflictMenu: { - //caller: cRecMenuEditTimer - //save timer from current timer conflict - cTimer timerModified; - const cTimer *originalTimer; - if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { - timerModified = menu->GetTimer(); - originalTimer = menu->GetOriginalTimer(); - } else break; - recManager->SaveTimer(originalTimer, timerModified); - delete activeMenu; - if (!DisplayTimerConflict(originalTimer)) { - activeMenu = new cRecMenuConfirmTimer(event); - activeMenu->Display(); - } - break; } - case rmsDeleteTimer: - //caller: main menu - //delete timer for active event - delete activeMenu; - if (recManager->IsRecorded(event)) { - activeMenu = new cRecMenuAskDeleteTimer(event); - } else { - recManager->DeleteTimer(event); - activeMenu = new cRecMenuConfirmDeleteTimer(event); - } - activeMenu->Display(); - break; - case rmsDeleteTimerConfirmation: - //delete running timer for active event - recManager->DeleteTimer(event); - delete activeMenu; - activeMenu = new cRecMenuConfirmDeleteTimer(event); - activeMenu->Display(); - break; - case rmsEditTimer: { - //edit timer for active event - const cTimer *timer; -#if VDRVERSNUM >= 20301 - { - LOCK_TIMERS_READ; - timer = recManager->GetTimerForEvent(event); - } -#else - timer = recManager->GetTimerForEvent(event); -#endif - if (timer) { - delete activeMenu; - activeMenu = new cRecMenuEditTimer(timer, rmsSaveTimer); - activeMenu->Display(); - } - break; } - case rmsSaveTimer: { - //caller: cRecMenuEditTimer - //save timer for active event - cTimer timerModified; - const cTimer *originalTimer; - if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { - timerModified = menu->GetTimer(); - originalTimer = menu->GetOriginalTimer(); - } else break; - recManager->SaveTimer(originalTimer, timerModified); - state = osEnd; - Close(); - break; } - /*************************************************************************************** - * SERIES TIMER - ****************************************************************************************/ - case rmsSeriesTimer: { - //caller: main menu oder folder chooser - std::string recFolder = ""; - if (cRecMenuAskFolder *menu = dynamic_cast(activeMenu)) { - recFolder = menu->GetFolder(); - } - delete activeMenu; -#if VDRVERSNUM >= 20301 - LOCK_CHANNELS_READ; - const cChannel *channel = Channels->GetByChannelID(event->ChannelID()); -#else - cChannel *channel = Channels.GetByChannelID(event->ChannelID()); -#endif - activeMenu = new cRecMenuSeriesTimer(channel, event, recFolder); - activeMenu->Display(); - break; } - case rmsSeriesTimerFolder: - //caller: main menu - //Asking for Folder - delete activeMenu; - activeMenu = new cRecMenuAskFolder(event, rmsSeriesTimer); - activeMenu->Display(); - break; - case rmsSeriesTimerCreate: { - //caller: cRecMenuSeriesTimer - cTimer *seriesTimer; - if (cRecMenuSeriesTimer *menu = dynamic_cast(activeMenu)) { - seriesTimer = menu->GetTimer(); - } else break; - recManager->CreateSeriesTimer(seriesTimer); - delete activeMenu; - activeMenu = new cRecMenuConfirmSeriesTimer(seriesTimer); - activeMenu->Display(); - break; } - /********************************************************************************************** - * SEARCH TIMER - ***********************************************************************************************/ - case rmsSearchTimer: - //Caller: main menu - //set search String for search timer - delete activeMenu; - activeMenu = new cRecMenuSearchTimer(event); - activeMenu->Display(); - break; - case rmsSearchTimerOptions: { - //Caller: cRecMenuSearchTimer, cRecMenuSearchTimerTemplates - //Choose to set options manually or by template - std::string searchString; - cTVGuideSearchTimer searchTimer; - bool reload = false; - if (cRecMenuSearchTimer *menu = dynamic_cast(activeMenu)) { - searchString = menu->GetSearchString(); - } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - reload = true; - } else break; - delete activeMenu; - if (searchString.size() < 4) { - activeMenu = new cRecMenuSearchTimer(event); - } else { - if (!reload) { - searchTimer.SetSearchString(searchString); - } - std::vector epgSearchTemplates; - recManager->ReadEPGSearchTemplates(&epgSearchTemplates); - if (epgSearchTemplates.size() > 0) { - activeMenu = new cRecMenuSearchTimerTemplates(searchTimer, epgSearchTemplates); - } else { - std::vector channelGroups; - recManager->GetChannelGroups(&channelGroups); - activeMenu = new cRecMenuSearchTimerEdit(searchTimer, channelGroups); - } - } - activeMenu->Display(); - break; } - case rmsSearchTimers: { - //caller: main menu - DisplaySearchTimerList(); - break; } - case rmsSearchTimerEdit: { - //caller: cRecMenuSearchTimers, cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplates - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else if (cRecMenuSearchTimerTemplates *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else break; - delete activeMenu; - std::vector channelGroups; - recManager->GetChannelGroups(&channelGroups); - activeMenu = new cRecMenuSearchTimerEdit(searchTimer, channelGroups); - activeMenu->Display(); - break; } - case rmsSearchTimerTest: { - //caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate, cRecMenuSearchTimers, cRecMenuFavorites - //show results of currently choosen search timer - cTVGuideSearchTimer searchTimer; - eRecMenuState recState = rmsDisabled; - if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - recState = rmsSearchTimerRecord; - } else if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - recState = rmsSearchTimerRecord; - } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - TVGuideEPGSearchTemplate tmpl = menu->GetTemplate(); - searchTimer.SetTemplate(tmpl.templValue); - searchTimer.Parse(true); - } else if (cRecMenuFavorites *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetFavorite(); - recState = rmsFavoritesRecord; - } else break; - int numSearchResults = 0; - std::string searchString = searchTimer.BuildSearchString(); - const cEvent **searchResult = recManager->PerformSearchTimerSearch(searchString, numSearchResults); - if (numSearchResults) { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerResults(searchTimer.GetSearchString(), searchResult, numSearchResults, "", recState); - activeMenu->Display(); - } else { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerNothingFound(searchTimer.GetSearchString()); - activeMenu->Display(); - } - break; } - case rmsSearchTimerSave: { - //caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate - //create new or modify existing search timer - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - TVGuideEPGSearchTemplate tmpl = menu->GetTemplate(); - searchTimer.SetTemplate(tmpl.templValue); - searchTimer.Parse(true); - } else break; - bool success = recManager->SaveSearchTimer(&searchTimer); - recManager->UpdateSearchTimers(); - if (searchTimer.GetID() >= 0) { - //Timer modified, show list - DisplaySearchTimerList(); - } else { - //new timer, confirm - delete activeMenu; - activeMenu = new cRecMenuSearchTimerCreateConfirm(success); - activeMenu->Display(); - } - break; } - case rmsSearchTimerCreateWithTemplate: { - //caller: cRecMenuSearchTimerTemplates - //create new search timer from template - TVGuideEPGSearchTemplate templ; - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimerTemplates *menu = dynamic_cast(activeMenu)) { - templ = menu->GetTemplate(); - searchTimer = menu->GetSearchTimer(); - } else break; - delete activeMenu; - activeMenu = new cRecMenuSearchTimerTemplatesCreate(templ, searchTimer); - activeMenu->Display(); - break; } - case rmsSearchTimerDeleteConfirm: { - //caller: cRecMenuSearchTimers - //Ask for confirmation and if timers created by this search timer should alo be deleted - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else break; - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerDeleteConfirm(searchTimer); - activeMenu->Display(); - break; } - case rmsSearchTimerDelete: - case rmsSearchTimerDeleteWithTimers: { - //caller: cRecMenuSearchTimerDeleteConfirm - //actually delete searchtimer - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimerDeleteConfirm *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else break; - bool delTimers = (nextState==rmsSearchTimerDeleteWithTimers)?true:false; - recManager->DeleteSearchTimer(&searchTimer, delTimers); - delete activeMenuBuffer; - activeMenuBuffer = NULL; - DisplaySearchTimerList(); - break; } - case rmsSearchTimerRecord: { - //caller: cRecMenuSearchTimerResults - const cEvent *ev = NULL; - if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { - ev = menu->GetEvent(); - } else break; - if (!ev) - break; - recManager->createTimer(ev, ""); - activeMenuBuffer2 = activeMenu; - activeMenuBuffer2->Hide(); - activeMenu = new cRecMenuSearchConfirmTimer(ev, rmsFavoritesRecordConfirm); - activeMenu->Display(); - break; } - /********************************************************************************************** - * SWITCH TIMER - ***********************************************************************************************/ - case rmsSwitchTimer: - delete activeMenu; - activeMenu = new cRecMenuSwitchTimer(); - activeMenu->Display(); - break; - case rmsSwitchTimerCreate: { - cSwitchTimer switchTimer; - if (cRecMenuSwitchTimer *menu = dynamic_cast(activeMenu)) { - switchTimer = menu->GetSwitchTimer(); - } else break; - bool success = recManager->CreateSwitchTimer(event, switchTimer); - delete activeMenu; - activeMenu = new cRecMenuSwitchTimerConfirm(success); - activeMenu->Display(); - break; } - case rmsSwitchTimerDelete: - recManager->DeleteSwitchTimer(event); - delete activeMenu; - activeMenu = new cRecMenuSwitchTimerDelete(); - activeMenu->Display(); - break; - /********************************************************************************************** - * RECORDINGS SEARCH - ***********************************************************************************************/ - case rmsRecordingSearch: { - //caller: main menu or rmsRecordingSearchResult - std::string searchString = event->Title(); - if (cRecMenuRecordingSearchResults *menu = dynamic_cast(activeMenu)) { - searchString = menu->GetSearchString(); - }; - delete activeMenu; - activeMenu = new cRecMenuRecordingSearch(searchString); - activeMenu->Display(); - break; } - case rmsRecordingSearchResult: { - //caller: cRecMenuRecordingSearch - std::string searchString; - if (cRecMenuRecordingSearch *menu = dynamic_cast(activeMenu)) { - searchString = menu->GetSearchString(); - } else break; - delete activeMenu; - if (searchString.size() < 4) { - activeMenu = new cRecMenuRecordingSearch(searchString); - } else { - int numSearchResults = 0; - const cRecording **searchResult = recManager->SearchForRecordings(searchString, numSearchResults); - if (numSearchResults == 0) { - activeMenu = new cRecMenuRecordingSearchNotFound(searchString); - } else { - activeMenu = new cRecMenuRecordingSearchResults(searchString, searchResult, numSearchResults); - } - } - activeMenu->Display(); - break; } - /********************************************************************************************** - * SEARCH - ***********************************************************************************************/ - case rmsSearch: - case rmsSearchWithOptions: { - //caller: main menu, cRecMenuSearch, cRecMenuSearchResults - bool withOptions = false; - std::string searchString = event->Title(); - if (cRecMenuSearch *menu = dynamic_cast(activeMenu)) { - withOptions = true; - searchString = menu->GetSearchString(); - } else if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { - searchString = menu->GetSearchString(); - } - delete activeMenu; - activeMenu = new cRecMenuSearch(searchString, withOptions); - activeMenu->Display(); - break; } - case rmsSearchPerform: { - //caller: cRecMenuSearch - Epgsearch_searchresults_v1_0 epgSearchData; - if (cRecMenuSearch *menu = dynamic_cast(activeMenu)) { - epgSearchData = menu->GetEPGSearchStruct(); - } else break; - std::string searchString = epgSearchData.query; - if (searchString.size() < 3) { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchNothingFound(searchString, true); - } else { - int numSearchResults = 0; - const cEvent **searchResult = recManager->PerformSearch(epgSearchData, numSearchResults); - if (searchResult) { - delete activeMenu; - activeMenu = new cRecMenuSearchResults(searchString, searchResult, numSearchResults); - } else { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchNothingFound(searchString); - } - } - activeMenu->Display(); - break; } - case rmsSearchNothingFoundConfirm: - delete activeMenu; - activeMenu = activeMenuBuffer; - activeMenuBuffer = NULL; - activeMenu->Show(); - break; - case rmsSearchShowInfo: { - //caller: cRecMenuSearchResults, cRecMenuSearchTimerResults - const cEvent *ev = NULL; - if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { - ev = menu->GetEvent(); - } else if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { - ev = menu->GetEvent(); - } else break; - if (ev) { - DisplayDetailedView(ev); - } - break;} - case rmsSearchRecord: { - //caller: cRecMenuSearchResults - const cEvent *ev = NULL; - if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { - ev = menu->GetEvent(); - } else break; - if (!ev) - break; - recManager->createTimer(ev, ""); - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchConfirmTimer(ev, rmsSearchRecordConfirm); - activeMenu->Display(); - break;} - case rmsSearchRecordConfirm: - delete activeMenu; - activeMenu = activeMenuBuffer; - activeMenuBuffer = NULL; - activeMenu->UpdateActiveMenuItem(); - activeMenu->Show(); - break; - /********************************************************************************************** - * CHECK FOR TIMER CONFLICTS - ***********************************************************************************************/ - case rmsTimerConflicts: { - //caller: main menu - //Show timer conflict - if (timerConflicts) { - delete timerConflicts; - } - timerConflicts = recManager->CheckTimerConflict(); - delete activeMenu; - int numConflicts = timerConflicts->NumConflicts(); - if (numConflicts > 0) { - activeMenu = new cRecMenuTimerConflicts(timerConflicts); - } else { - activeMenu = new cRecMenuNoTimerConflict(); - } - activeMenu->Display(); - break; } - case rmsTimerConflict: { - //caller: cRecMenuTimerConflicts - //Show timer conflict - if (!timerConflicts) - break; - int timerConflict; - if (cRecMenuTimerConflicts *menu = dynamic_cast(activeMenu)) { - timerConflict = menu->GetTimerConflict(); - } else break; - timerConflicts->SetCurrentConflict(timerConflict); - delete activeMenu; - activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict()); - activeMenu->Display(); - break; } - case rmsSearchRerunsTimerConflictMenu: { - //caller: cRecMenuTimerConflict - //Show reruns for timer from timer conflict - if (!timerConflicts) - break; - int timerConflict; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { - timerConflict = menu->GetTimerConflictIndex(); - } else break; - int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict); -#if VDRVERSNUM >= 20301 - LOCK_TIMERS_READ; - const cTimer *timer = Timers->Get(timerID); -#else - cTimer *timer = Timers.Get(timerID); -#endif - if (timer) { - const cEvent *event = timer->Event(); - if (event) { - int numReruns = 0; - const cEvent **reruns = recManager->LoadReruns(event, numReruns); - if (reruns && (numReruns > 0)) { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuRerunResults(event, reruns, numReruns); - activeMenu->Display(); - } else { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuNoRerunsFound((event->Title())?event->Title():""); - activeMenu->Display(); - } - } - } - break; } - case rmsTimerConflictIgnoreReruns: { - delete activeMenu; - activeMenu = activeMenuBuffer; - activeMenuBuffer = NULL; - activeMenu->Show(); - break; } - case rmsTimerConflictRecordRerun: { - //caller: cRecMenuRerunResults - //buffer: cRecMenuTimerConflict - if (!activeMenuBuffer) - break; - if (!timerConflicts) - break; - const cEvent *replace; - int originalConflictIndex; - if (cRecMenuRerunResults *menu = dynamic_cast(activeMenu)) { - replace = menu->GetRerunEvent(); - } else break; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenuBuffer)) { - originalConflictIndex = menu->GetTimerConflictIndex(); - } else break; - int originalTimerID = timerConflicts->GetCurrentConflictTimerID(originalConflictIndex); -#if VDRVERSNUM >= 20301 - LOCK_TIMERS_READ; - const cTimer *timerOriginal = Timers->Get(originalTimerID); -#else - cTimer *timerOriginal = Timers.Get(originalTimerID); -#endif - if (replace && timerOriginal) { - recManager->DeleteTimer(timerOriginal->Event()); - recManager->createTimer(replace); - delete activeMenu; - if (activeMenuBuffer) { - delete activeMenuBuffer; - activeMenuBuffer = NULL; - } - activeMenu = new cRecMenuConfirmRerunUsed(timerOriginal->Event(), replace); - activeMenu->Display(); - } - break; } - /********************************************************************************************** - * TIMELINE - ***********************************************************************************************/ - case rmsTimeline: { - if (timerConflicts) { - delete timerConflicts; - } - timerConflicts = recManager->CheckTimerConflict(); - delete activeMenu; - activeMenu = new cRecMenuTimeline(timerConflicts); - activeMenu->Display(); - break; } - case rmsTimelineTimerEdit: { - const cTimer *timer; - if (cRecMenuTimeline *menu = dynamic_cast(activeMenu)) { - timer = menu->GetTimer(); - } else break; - if (timer) { - delete activeMenu; - activeMenu = new cRecMenuEditTimer(timer, rmsTimelineTimerSave); - activeMenu->Display(); - } - break;} - case rmsTimelineTimerSave: { - cTimer timerModified; - const cTimer *originalTimer; - if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { - timerModified = menu->GetTimer(); - originalTimer = menu->GetOriginalTimer(); - } else break; - recManager->SaveTimer(originalTimer, timerModified); - delete activeMenu; - if (timerConflicts) { - delete timerConflicts; - } - timerConflicts = recManager->CheckTimerConflict(); - activeMenu = new cRecMenuTimeline(timerConflicts); - activeMenu->Display(); - break; } - case rmsTimelineTimerDelete: { - const cTimer *timer; - if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { - timer = menu->GetOriginalTimer(); - } else break; -#if VDRVERSNUM >= 20301 - { - LOCK_TIMERS_WRITE; - recManager->DeleteTimer(Timers->GetTimer(timer)); - } -#else - recManager->DeleteTimer(Timers.GetTimer((cTimer*)timer)); -#endif - delete activeMenu; - if (timerConflicts) { - delete timerConflicts; - } - timerConflicts = recManager->CheckTimerConflict(); - activeMenu = new cRecMenuTimeline(timerConflicts); - activeMenu->Display(); - break; } - /********************************************************************************************** - * FAVORITES - *********************************************************************************************/ - case rmsFavoritesRecord: { - //caller: cRecMenuSearchTimerResults - const cEvent *ev = NULL; - if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { - ev = menu->GetEvent(); - } else break; - if (!ev) - break; - recManager->createTimer(ev, ""); - activeMenuBuffer2 = activeMenu; - activeMenuBuffer2->Hide(); - activeMenu = new cRecMenuSearchConfirmTimer(ev, rmsFavoritesRecordConfirm); - activeMenu->Display(); - break;} - case rmsFavoritesRecordConfirm: - delete activeMenu; - activeMenu = activeMenuBuffer2; - activeMenuBuffer2 = NULL; - activeMenu->UpdateActiveMenuItem(); - activeMenu->Show(); - break; - case rmsFavoritesNow: - case rmsFavoritesNext: { - int numResults = 0; - bool nowOrNext; - std::string header; - if (nextState == rmsFavoritesNow) { - nowOrNext = true; - header = tr("What's on now"); - } else { - nowOrNext = false; - header = tr("What's on next"); - } - const cEvent **result = recManager->WhatsOnNow(nowOrNext, numResults); - DisplayFavoriteResults(header, result, numResults); - break; } - case rmsFavoritesUser1: { - int numResults = 0; - const cEvent **result = recManager->UserDefinedTime(1, numResults); - DisplayFavoriteResults(tvguideConfig.descUser1, result, numResults); - break; } - case rmsFavoritesUser2: { - int numResults = 0; - const cEvent **result = recManager->UserDefinedTime(2, numResults); - DisplayFavoriteResults(tvguideConfig.descUser2, result, numResults); - break; } - case rmsFavoritesUser3: { - int numResults = 0; - const cEvent **result = recManager->UserDefinedTime(3, numResults); - DisplayFavoriteResults(tvguideConfig.descUser3, result, numResults); - break; } - case rmsFavoritesUser4: { - int numResults = 0; - const cEvent **result = recManager->UserDefinedTime(4, numResults); - DisplayFavoriteResults(tvguideConfig.descUser4, result, numResults); - break; } - - /********************************************************************************************** - * COMMON - *********************************************************************************************/ - case rmsClose: { - if (activeMenuBuffer == NULL) { - state = osEnd; - Close(); - } else { - delete activeMenu; - activeMenu = activeMenuBuffer; - activeMenuBuffer = NULL; - activeMenu->UpdateActiveMenuItem(); - activeMenu->Show(); - state = osContinue; - } - break; } - default: - break; - } - return state; -} - -void cRecMenuView::DisplayFavoriteResults(std::string header, const cEvent **result, int numResults) { - if (numResults) { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerResults(header, result, numResults, "", rmsFavoritesRecord); - activeMenu->Display(); - } else { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerNothingFound(header); - activeMenu->Display(); - } -} - -void cRecMenuView::DisplaySearchTimerList(void) { - delete activeMenu; - std::vector searchTimers; - recManager->GetSearchTimers(&searchTimers); - activeMenu = new cRecMenuSearchTimers(searchTimers); - activeMenu->Display(); -} - -bool cRecMenuView::DisplayTimerConflict(const cTimer *timer) { - int timerID = 0; -#if VDRVERSNUM >= 20301 - LOCK_TIMERS_READ; - for (const cTimer *t = Timers->First(); t; t = Timers->Next(t)) { -#else - for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) { -#endif - if (t == timer) - return DisplayTimerConflict(timerID); - timerID++; - } - return false; -} - -bool cRecMenuView::DisplayTimerConflict(int timerID) { - if (timerConflicts) - delete timerConflicts; - timerConflicts = recManager->CheckTimerConflict(); - if (!timerConflicts) - return false; - int showTimerConflict = timerConflicts->GetCorrespondingConflict(timerID); - if (showTimerConflict > -1) { - timerConflicts->SetCurrentConflict(showTimerConflict); - cTVGuideTimerConflict *conflict = timerConflicts->GetCurrentConflict(); - if (!conflict) - return false; - activeMenu = new cRecMenuTimerConflict(conflict); - activeMenu->Display(); - return true; - } - return false; -} - -void cRecMenuView::DisplayDetailedView(const cEvent *ev) { - activeMenu->Hide(); - detailView = new cDetailView(ev, footer); - footer->SetDetailedViewMode(true); - detailView->Start(); - detailViewActive = true; -} - -eOSState cRecMenuView::ProcessKey(eKeys Key) { - eOSState state = osContinue; - eRecMenuState nextState = rmsContinue; - if (!activeMenu) - return state; - if (detailViewActive) { - state = detailView->ProcessKey(Key); - if (state == osEnd) { - delete detailView; - detailView = NULL; - detailViewActive = false; - activeMenu->Show(); - state = osContinue; - } - } else { - nextState = activeMenu->ProcessKey(Key); - if ((nextState == rmsClose) || ((nextState == rmsNotConsumed)&&(Key == kBack))){ - if (activeMenuBuffer == NULL) { - state = osEnd; - Close(); - } else { - delete activeMenu; - activeMenu = activeMenuBuffer; - activeMenuBuffer = NULL; - activeMenu->UpdateActiveMenuItem(); - activeMenu->Show(); - state = osContinue; - osdManager.flush(); - } - return state; - } - state = StateMachine(nextState); - } - osdManager.flush(); - return state; -} +#include "recmenu.h" +#include "recmenus.h" +#include "switchtimer.h" +#include "timerconflict.h" +#include "recmenuview.h" + +cRecMenuView::cRecMenuView(void) { + footer = NULL; + active = false; + activeMenu = NULL; + activeMenuBuffer = NULL; + activeMenuBuffer2 = NULL; + recManager = new cRecManager(); + recManager->SetEPGSearchPlugin(); + timerConflicts = NULL; + detailViewActive = false; +} + +cRecMenuView::~cRecMenuView(void) { + if (activeMenu) { + active = false; + delete activeMenu; + activeMenu = NULL; + } + if (timerConflicts) { + delete timerConflicts; + timerConflicts = NULL; + } + delete recManager; +} + +void cRecMenuView::Start(const cEvent *event) { + active = true; + activeMenuBuffer = NULL; + detailViewActive = false; + SetBackground(); + this->event = event; + activeMenu = new cRecMenuMain(recManager->EpgSearchAvailable(), recManager->CheckEventForTimer(event), SwitchTimers.EventInSwitchList(event)); + activeMenu->Display(); + osdManager.flush(); +} + +void cRecMenuView::StartFavorites(void) { + active = true; + activeMenuBuffer = NULL; + detailViewActive = false; + SetBackground(); + std::vector favorites; + recManager->GetFavorites(&favorites); + activeMenu = new cRecMenuFavorites(favorites); + activeMenu->Display(); + osdManager.flush(); +} + + +void cRecMenuView::Close(void) { + event = NULL; + active = false; + if (activeMenu) { + delete activeMenu; + activeMenu = NULL; + } + if (timerConflicts) { + delete timerConflicts; + timerConflicts = NULL; + } + DeleteBackground(); +} + +void cRecMenuView::SetBackground(void) { + int backgroundWidth = geoManager.osdWidth; + int backgroundHeight = geoManager.osdHeight; + pixmapBackground = osdManager.requestPixmap(3, cRect(0, 0, backgroundWidth, backgroundHeight)); + pixmapBackground->Fill(theme.Color(clrRecMenuBackground)); + if (tvguideConfig.scaleVideo) { + int tvHeight = geoManager.statusHeaderHeight; + int tvWidth = tvHeight * 16 / 9; + int tvX = geoManager.osdWidth - tvWidth; + pixmapBackground->DrawRectangle(cRect(tvX, 0, tvWidth, tvHeight), clrTransparent); + } +} + +void cRecMenuView::DeleteBackground(void) { + osdManager.releasePixmap(pixmapBackground); +} + +eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { + eOSState state = osContinue; + switch (nextState) { + /*************************************************************************************** + * INSTANT RECORDING + ****************************************************************************************/ + case rmsInstantRecord: { + //caller: main menu or folder chooser + //Creating timer for active Event, if no conflict, confirm and exit + std::string recFolder = ""; + if (cRecMenuAskFolder *menu = dynamic_cast(activeMenu)) { + recFolder = menu->GetFolder(); + } + delete activeMenu; + cTimer *timer = recManager->createTimer(event, recFolder); + if (!DisplayTimerConflict(timer)) { + activeMenu = new cRecMenuConfirmTimer(event); + activeMenu->Display(); + } + break; } + case rmsInstantRecordFolder: + //caller: main menu + //Asking for Folder + delete activeMenu; + activeMenu = new cRecMenuAskFolder(event, rmsInstantRecord); + activeMenu->Display(); + break; + case rmsIgnoreTimerConflict: + //caller: cRecMenuTimerConflict + //Confirming created Timer + delete activeMenu; + activeMenu = new cRecMenuConfirmTimer(event); + activeMenu->Display(); + break; + case rmsTimerConflictShowInfo: { + //caller: cRecMenuTimerConflict + int timerIndex; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { + timerIndex = menu->GetTimerConflictIndex(); + } else break; + int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); +#if VDRVERSNUM >= 20301 + LOCK_TIMERS_READ; + const cTimer *t = Timers->Get(timerID); +#else + cTimer *t = Timers.Get(timerID); +#endif + if (t) { + const cEvent *ev = t->Event(); + if (ev) { + DisplayDetailedView(ev); + } + } + break; } + case rmsDeleteTimerConflictMenu: { + //caller: cRecMenuTimerConflict + //delete timer out of current timer conflict + int timerIndex; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { + timerIndex = menu->GetTimerConflictIndex(); + } else break; + int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); + recManager->DeleteTimer(timerID); + delete activeMenu; + if (!DisplayTimerConflict(timerID)) { + activeMenu = new cRecMenuConfirmTimer(event); + activeMenu->Display(); + } + break; } + case rmsEditTimerConflictMenu: { + //caller: cRecMenuTimerConflict + //edit timer out of current timer conflict + int timerIndex; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { + timerIndex = menu->GetTimerConflictIndex(); + } else break; + int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); +#if VDRVERSNUM >= 20301 + LOCK_TIMERS_READ; + const cTimer *timer = Timers->Get(timerID); +#else + const cTimer *timer = Timers.Get(timerID); +#endif + if (timer) { + delete activeMenu; + activeMenu = new cRecMenuEditTimer(timer, rmsSaveTimerConflictMenu); + activeMenu->Display(); + } + break; } + case rmsSaveTimerConflictMenu: { + //caller: cRecMenuEditTimer + //save timer from current timer conflict + cTimer timerModified; + const cTimer *originalTimer; + if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { + timerModified = menu->GetTimer(); + originalTimer = menu->GetOriginalTimer(); + } else break; + recManager->SaveTimer(originalTimer, timerModified); + delete activeMenu; + if (!DisplayTimerConflict(originalTimer)) { + activeMenu = new cRecMenuConfirmTimer(event); + activeMenu->Display(); + } + break; } + case rmsDeleteTimer: + //caller: main menu + //delete timer for active event + delete activeMenu; + if (recManager->IsRecorded(event)) { + activeMenu = new cRecMenuAskDeleteTimer(event); + } else { + recManager->DeleteTimer(event); + activeMenu = new cRecMenuConfirmDeleteTimer(event); + } + activeMenu->Display(); + break; + case rmsDeleteTimerConfirmation: + //delete running timer for active event + recManager->DeleteTimer(event); + delete activeMenu; + activeMenu = new cRecMenuConfirmDeleteTimer(event); + activeMenu->Display(); + break; + case rmsEditTimer: { + //edit timer for active event + const cTimer *timer; +#if VDRVERSNUM >= 20301 + { + LOCK_TIMERS_READ; + timer = recManager->GetTimerForEvent(event); + } +#else + timer = recManager->GetTimerForEvent(event); +#endif + if (timer) { + delete activeMenu; + activeMenu = new cRecMenuEditTimer(timer, rmsSaveTimer); + activeMenu->Display(); + } + break; } + case rmsSaveTimer: { + //caller: cRecMenuEditTimer + //save timer for active event + cTimer timerModified; + const cTimer *originalTimer; + if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { + timerModified = menu->GetTimer(); + originalTimer = menu->GetOriginalTimer(); + } else break; + recManager->SaveTimer(originalTimer, timerModified); + state = osEnd; + Close(); + break; } + /*************************************************************************************** + * SERIES TIMER + ****************************************************************************************/ + case rmsSeriesTimer: { + //caller: main menu oder folder chooser + std::string recFolder = ""; + if (cRecMenuAskFolder *menu = dynamic_cast(activeMenu)) { + recFolder = menu->GetFolder(); + } + delete activeMenu; +#if VDRVERSNUM >= 20301 + LOCK_CHANNELS_READ; + const cChannel *channel = Channels->GetByChannelID(event->ChannelID()); +#else + cChannel *channel = Channels.GetByChannelID(event->ChannelID()); +#endif + activeMenu = new cRecMenuSeriesTimer(channel, event, recFolder); + activeMenu->Display(); + break; } + case rmsSeriesTimerFolder: + //caller: main menu + //Asking for Folder + delete activeMenu; + activeMenu = new cRecMenuAskFolder(event, rmsSeriesTimer); + activeMenu->Display(); + break; + case rmsSeriesTimerCreate: { + //caller: cRecMenuSeriesTimer + cTimer *seriesTimer; + if (cRecMenuSeriesTimer *menu = dynamic_cast(activeMenu)) { + seriesTimer = menu->GetTimer(); + } else break; + recManager->CreateSeriesTimer(seriesTimer); + delete activeMenu; + activeMenu = new cRecMenuConfirmSeriesTimer(seriesTimer); + activeMenu->Display(); + break; } + /********************************************************************************************** + * SEARCH TIMER + ***********************************************************************************************/ + case rmsSearchTimer: + //Caller: main menu + //set search String for search timer + delete activeMenu; + activeMenu = new cRecMenuSearchTimer(event); + activeMenu->Display(); + break; + case rmsSearchTimerOptions: { + //Caller: cRecMenuSearchTimer, cRecMenuSearchTimerTemplates + //Choose to set options manually or by template + std::string searchString; + cTVGuideSearchTimer searchTimer; + bool reload = false; + if (cRecMenuSearchTimer *menu = dynamic_cast(activeMenu)) { + searchString = menu->GetSearchString(); + } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + reload = true; + } else break; + delete activeMenu; + if (searchString.size() < 4) { + activeMenu = new cRecMenuSearchTimer(event); + } else { + if (!reload) { + searchTimer.SetSearchString(searchString); + } + std::vector epgSearchTemplates; + recManager->ReadEPGSearchTemplates(&epgSearchTemplates); + if (epgSearchTemplates.size() > 0) { + activeMenu = new cRecMenuSearchTimerTemplates(searchTimer, epgSearchTemplates); + } else { + std::vector channelGroups; + recManager->GetChannelGroups(&channelGroups); + activeMenu = new cRecMenuSearchTimerEdit(searchTimer, channelGroups); + } + } + activeMenu->Display(); + break; } + case rmsSearchTimers: { + //caller: main menu + DisplaySearchTimerList(); + break; } + case rmsSearchTimerEdit: { + //caller: cRecMenuSearchTimers, cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplates + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else if (cRecMenuSearchTimerTemplates *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else break; + delete activeMenu; + std::vector channelGroups; + recManager->GetChannelGroups(&channelGroups); + activeMenu = new cRecMenuSearchTimerEdit(searchTimer, channelGroups); + activeMenu->Display(); + break; } + case rmsSearchTimerTest: { + //caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate, cRecMenuSearchTimers, cRecMenuFavorites + //show results of currently choosen search timer + cTVGuideSearchTimer searchTimer; + eRecMenuState recState = rmsDisabled; + if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + recState = rmsSearchTimerRecord; + } else if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + recState = rmsSearchTimerRecord; + } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + TVGuideEPGSearchTemplate tmpl = menu->GetTemplate(); + searchTimer.SetTemplate(tmpl.templValue); + searchTimer.Parse(true); + } else if (cRecMenuFavorites *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetFavorite(); + recState = rmsFavoritesRecord; + } else break; + int numSearchResults = 0; + std::string searchString = searchTimer.BuildSearchString(); + const cEvent **searchResult = recManager->PerformSearchTimerSearch(searchString, numSearchResults); + if (numSearchResults) { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerResults(searchTimer.GetSearchString(), searchResult, numSearchResults, "", recState); + activeMenu->Display(); + } else { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerNothingFound(searchTimer.GetSearchString()); + activeMenu->Display(); + } + break; } + case rmsSearchTimerSave: { + //caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate + //create new or modify existing search timer + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + TVGuideEPGSearchTemplate tmpl = menu->GetTemplate(); + searchTimer.SetTemplate(tmpl.templValue); + searchTimer.Parse(true); + } else break; + bool success = recManager->SaveSearchTimer(&searchTimer); + recManager->UpdateSearchTimers(); + if (searchTimer.GetID() >= 0) { + //Timer modified, show list + DisplaySearchTimerList(); + } else { + //new timer, confirm + delete activeMenu; + activeMenu = new cRecMenuSearchTimerCreateConfirm(success); + activeMenu->Display(); + } + break; } + case rmsSearchTimerCreateWithTemplate: { + //caller: cRecMenuSearchTimerTemplates + //create new search timer from template + TVGuideEPGSearchTemplate templ; + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimerTemplates *menu = dynamic_cast(activeMenu)) { + templ = menu->GetTemplate(); + searchTimer = menu->GetSearchTimer(); + } else break; + delete activeMenu; + activeMenu = new cRecMenuSearchTimerTemplatesCreate(templ, searchTimer); + activeMenu->Display(); + break; } + case rmsSearchTimerDeleteConfirm: { + //caller: cRecMenuSearchTimers + //Ask for confirmation and if timers created by this search timer should alo be deleted + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else break; + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerDeleteConfirm(searchTimer); + activeMenu->Display(); + break; } + case rmsSearchTimerDelete: + case rmsSearchTimerDeleteWithTimers: { + //caller: cRecMenuSearchTimerDeleteConfirm + //actually delete searchtimer + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimerDeleteConfirm *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else break; + bool delTimers = (nextState==rmsSearchTimerDeleteWithTimers)?true:false; + recManager->DeleteSearchTimer(&searchTimer, delTimers); + delete activeMenuBuffer; + activeMenuBuffer = NULL; + DisplaySearchTimerList(); + break; } + case rmsSearchTimerRecord: { + //caller: cRecMenuSearchTimerResults + const cEvent *ev = NULL; + if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { + ev = menu->GetEvent(); + } else break; + if (!ev) + break; + recManager->createTimer(ev, ""); + activeMenuBuffer2 = activeMenu; + activeMenuBuffer2->Hide(); + activeMenu = new cRecMenuSearchConfirmTimer(ev, rmsFavoritesRecordConfirm); + activeMenu->Display(); + break; } + /********************************************************************************************** + * SWITCH TIMER + ***********************************************************************************************/ + case rmsSwitchTimer: + delete activeMenu; + activeMenu = new cRecMenuSwitchTimer(); + activeMenu->Display(); + break; + case rmsSwitchTimerCreate: { + cSwitchTimer switchTimer; + if (cRecMenuSwitchTimer *menu = dynamic_cast(activeMenu)) { + switchTimer = menu->GetSwitchTimer(); + } else break; + bool success = recManager->CreateSwitchTimer(event, switchTimer); + delete activeMenu; + activeMenu = new cRecMenuSwitchTimerConfirm(success); + activeMenu->Display(); + break; } + case rmsSwitchTimerDelete: + recManager->DeleteSwitchTimer(event); + delete activeMenu; + activeMenu = new cRecMenuSwitchTimerDelete(); + activeMenu->Display(); + break; + /********************************************************************************************** + * RECORDINGS SEARCH + ***********************************************************************************************/ + case rmsRecordingSearch: { + //caller: main menu or rmsRecordingSearchResult + std::string searchString = event->Title(); + if (cRecMenuRecordingSearchResults *menu = dynamic_cast(activeMenu)) { + searchString = menu->GetSearchString(); + }; + delete activeMenu; + activeMenu = new cRecMenuRecordingSearch(searchString); + activeMenu->Display(); + break; } + case rmsRecordingSearchResult: { + //caller: cRecMenuRecordingSearch + std::string searchString; + if (cRecMenuRecordingSearch *menu = dynamic_cast(activeMenu)) { + searchString = menu->GetSearchString(); + } else break; + delete activeMenu; + if (searchString.size() < 4) { + activeMenu = new cRecMenuRecordingSearch(searchString); + } else { + int numSearchResults = 0; + const cRecording **searchResult = recManager->SearchForRecordings(searchString, numSearchResults); + if (numSearchResults == 0) { + activeMenu = new cRecMenuRecordingSearchNotFound(searchString); + } else { + activeMenu = new cRecMenuRecordingSearchResults(searchString, searchResult, numSearchResults); + } + } + activeMenu->Display(); + break; } + /********************************************************************************************** + * SEARCH + ***********************************************************************************************/ + case rmsSearch: + case rmsSearchWithOptions: { + //caller: main menu, cRecMenuSearch, cRecMenuSearchResults + bool withOptions = false; + std::string searchString = event->Title(); + if (cRecMenuSearch *menu = dynamic_cast(activeMenu)) { + withOptions = true; + searchString = menu->GetSearchString(); + } else if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { + searchString = menu->GetSearchString(); + } + delete activeMenu; + activeMenu = new cRecMenuSearch(searchString, withOptions); + activeMenu->Display(); + break; } + case rmsSearchPerform: { + //caller: cRecMenuSearch + Epgsearch_searchresults_v1_0 epgSearchData; + if (cRecMenuSearch *menu = dynamic_cast(activeMenu)) { + epgSearchData = menu->GetEPGSearchStruct(); + } else break; + std::string searchString = epgSearchData.query; + if (searchString.size() < 3) { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchNothingFound(searchString, true); + } else { + int numSearchResults = 0; + const cEvent **searchResult = recManager->PerformSearch(epgSearchData, numSearchResults); + if (searchResult) { + delete activeMenu; + activeMenu = new cRecMenuSearchResults(searchString, searchResult, numSearchResults); + } else { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchNothingFound(searchString); + } + } + activeMenu->Display(); + break; } + case rmsSearchNothingFoundConfirm: + delete activeMenu; + activeMenu = activeMenuBuffer; + activeMenuBuffer = NULL; + activeMenu->Show(); + break; + case rmsSearchShowInfo: { + //caller: cRecMenuSearchResults, cRecMenuSearchTimerResults + const cEvent *ev = NULL; + if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { + ev = menu->GetEvent(); + } else if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { + ev = menu->GetEvent(); + } else break; + if (ev) { + DisplayDetailedView(ev); + } + break;} + case rmsSearchRecord: { + //caller: cRecMenuSearchResults + const cEvent *ev = NULL; + if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { + ev = menu->GetEvent(); + } else break; + if (!ev) + break; + recManager->createTimer(ev, ""); + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchConfirmTimer(ev, rmsSearchRecordConfirm); + activeMenu->Display(); + break;} + case rmsSearchRecordConfirm: + delete activeMenu; + activeMenu = activeMenuBuffer; + activeMenuBuffer = NULL; + activeMenu->UpdateActiveMenuItem(); + activeMenu->Show(); + break; + /********************************************************************************************** + * CHECK FOR TIMER CONFLICTS + ***********************************************************************************************/ + case rmsTimerConflicts: { + //caller: main menu + //Show timer conflict + if (timerConflicts) { + delete timerConflicts; + } + timerConflicts = recManager->CheckTimerConflict(); + delete activeMenu; + int numConflicts = timerConflicts->NumConflicts(); + if (numConflicts > 0) { + activeMenu = new cRecMenuTimerConflicts(timerConflicts); + } else { + activeMenu = new cRecMenuNoTimerConflict(); + } + activeMenu->Display(); + break; } + case rmsTimerConflict: { + //caller: cRecMenuTimerConflicts + //Show timer conflict + if (!timerConflicts) + break; + int timerConflict; + if (cRecMenuTimerConflicts *menu = dynamic_cast(activeMenu)) { + timerConflict = menu->GetTimerConflict(); + } else break; + timerConflicts->SetCurrentConflict(timerConflict); + delete activeMenu; + activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict()); + activeMenu->Display(); + break; } + case rmsSearchRerunsTimerConflictMenu: { + //caller: cRecMenuTimerConflict + //Show reruns for timer from timer conflict + if (!timerConflicts) + break; + int timerConflict; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { + timerConflict = menu->GetTimerConflictIndex(); + } else break; + int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict); +#if VDRVERSNUM >= 20301 + LOCK_TIMERS_READ; + const cTimer *timer = Timers->Get(timerID); +#else + cTimer *timer = Timers.Get(timerID); +#endif + if (timer) { + const cEvent *event = timer->Event(); + if (event) { + int numReruns = 0; + const cEvent **reruns = recManager->LoadReruns(event, numReruns); + if (reruns && (numReruns > 0)) { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuRerunResults(event, reruns, numReruns); + activeMenu->Display(); + } else { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuNoRerunsFound((event->Title())?event->Title():""); + activeMenu->Display(); + } + } + } + break; } + case rmsTimerConflictIgnoreReruns: { + delete activeMenu; + activeMenu = activeMenuBuffer; + activeMenuBuffer = NULL; + activeMenu->Show(); + break; } + case rmsTimerConflictRecordRerun: { + //caller: cRecMenuRerunResults + //buffer: cRecMenuTimerConflict + if (!activeMenuBuffer) + break; + if (!timerConflicts) + break; + const cEvent *replace; + int originalConflictIndex; + if (cRecMenuRerunResults *menu = dynamic_cast(activeMenu)) { + replace = menu->GetRerunEvent(); + } else break; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenuBuffer)) { + originalConflictIndex = menu->GetTimerConflictIndex(); + } else break; + int originalTimerID = timerConflicts->GetCurrentConflictTimerID(originalConflictIndex); +#if VDRVERSNUM >= 20301 + LOCK_TIMERS_READ; + const cTimer *timerOriginal = Timers->Get(originalTimerID); +#else + cTimer *timerOriginal = Timers.Get(originalTimerID); +#endif + if (replace && timerOriginal) { + recManager->DeleteTimer(timerOriginal->Event()); + recManager->createTimer(replace); + delete activeMenu; + if (activeMenuBuffer) { + delete activeMenuBuffer; + activeMenuBuffer = NULL; + } + activeMenu = new cRecMenuConfirmRerunUsed(timerOriginal->Event(), replace); + activeMenu->Display(); + } + break; } + /********************************************************************************************** + * TIMELINE + ***********************************************************************************************/ + case rmsTimeline: { + if (timerConflicts) { + delete timerConflicts; + } + timerConflicts = recManager->CheckTimerConflict(); + delete activeMenu; + activeMenu = new cRecMenuTimeline(timerConflicts); + activeMenu->Display(); + break; } + case rmsTimelineTimerEdit: { + const cTimer *timer; + if (cRecMenuTimeline *menu = dynamic_cast(activeMenu)) { + timer = menu->GetTimer(); + } else break; + if (timer) { + delete activeMenu; + activeMenu = new cRecMenuEditTimer(timer, rmsTimelineTimerSave); + activeMenu->Display(); + } + break;} + case rmsTimelineTimerSave: { + cTimer timerModified; + const cTimer *originalTimer; + if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { + timerModified = menu->GetTimer(); + originalTimer = menu->GetOriginalTimer(); + } else break; + recManager->SaveTimer(originalTimer, timerModified); + delete activeMenu; + if (timerConflicts) { + delete timerConflicts; + } + timerConflicts = recManager->CheckTimerConflict(); + activeMenu = new cRecMenuTimeline(timerConflicts); + activeMenu->Display(); + break; } + case rmsTimelineTimerDelete: { + const cTimer *timer; + if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { + timer = menu->GetOriginalTimer(); + } else break; +#if VDRVERSNUM >= 20301 + { + LOCK_TIMERS_WRITE; + recManager->DeleteTimer(Timers->GetTimer(timer)); + } +#else + recManager->DeleteTimer(Timers.GetTimer((cTimer*)timer)); +#endif + delete activeMenu; + if (timerConflicts) { + delete timerConflicts; + } + timerConflicts = recManager->CheckTimerConflict(); + activeMenu = new cRecMenuTimeline(timerConflicts); + activeMenu->Display(); + break; } + /********************************************************************************************** + * FAVORITES + *********************************************************************************************/ + case rmsFavoritesRecord: { + //caller: cRecMenuSearchTimerResults + const cEvent *ev = NULL; + if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { + ev = menu->GetEvent(); + } else break; + if (!ev) + break; + recManager->createTimer(ev, ""); + activeMenuBuffer2 = activeMenu; + activeMenuBuffer2->Hide(); + activeMenu = new cRecMenuSearchConfirmTimer(ev, rmsFavoritesRecordConfirm); + activeMenu->Display(); + break;} + case rmsFavoritesRecordConfirm: + delete activeMenu; + activeMenu = activeMenuBuffer2; + activeMenuBuffer2 = NULL; + activeMenu->UpdateActiveMenuItem(); + activeMenu->Show(); + break; + case rmsFavoritesNow: + case rmsFavoritesNext: { + int numResults = 0; + bool nowOrNext; + std::string header; + if (nextState == rmsFavoritesNow) { + nowOrNext = true; + header = tr("What's on now"); + } else { + nowOrNext = false; + header = tr("What's on next"); + } + const cEvent **result = recManager->WhatsOnNow(nowOrNext, numResults); + DisplayFavoriteResults(header, result, numResults); + break; } + case rmsFavoritesUser1: { + int numResults = 0; + const cEvent **result = recManager->UserDefinedTime(1, numResults); + DisplayFavoriteResults(tvguideConfig.descUser1, result, numResults); + break; } + case rmsFavoritesUser2: { + int numResults = 0; + const cEvent **result = recManager->UserDefinedTime(2, numResults); + DisplayFavoriteResults(tvguideConfig.descUser2, result, numResults); + break; } + case rmsFavoritesUser3: { + int numResults = 0; + const cEvent **result = recManager->UserDefinedTime(3, numResults); + DisplayFavoriteResults(tvguideConfig.descUser3, result, numResults); + break; } + case rmsFavoritesUser4: { + int numResults = 0; + const cEvent **result = recManager->UserDefinedTime(4, numResults); + DisplayFavoriteResults(tvguideConfig.descUser4, result, numResults); + break; } + + /********************************************************************************************** + * COMMON + *********************************************************************************************/ + case rmsClose: { + if (activeMenuBuffer == NULL) { + state = osEnd; + Close(); + } else { + delete activeMenu; + activeMenu = activeMenuBuffer; + activeMenuBuffer = NULL; + activeMenu->UpdateActiveMenuItem(); + activeMenu->Show(); + state = osContinue; + } + break; } + default: + break; + } + return state; +} + +void cRecMenuView::DisplayFavoriteResults(std::string header, const cEvent **result, int numResults) { + if (numResults) { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerResults(header, result, numResults, "", rmsFavoritesRecord); + activeMenu->Display(); + } else { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerNothingFound(header); + activeMenu->Display(); + } +} + +void cRecMenuView::DisplaySearchTimerList(void) { + delete activeMenu; + std::vector searchTimers; + recManager->GetSearchTimers(&searchTimers); + activeMenu = new cRecMenuSearchTimers(searchTimers); + activeMenu->Display(); +} + +bool cRecMenuView::DisplayTimerConflict(const cTimer *timer) { + int timerID = 0; +#if VDRVERSNUM >= 20301 + LOCK_TIMERS_READ; + for (const cTimer *t = Timers->First(); t; t = Timers->Next(t)) { +#else + for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) { +#endif + if (t == timer) + return DisplayTimerConflict(timerID); + timerID++; + } + return false; +} + +bool cRecMenuView::DisplayTimerConflict(int timerID) { + if (timerConflicts) + delete timerConflicts; + timerConflicts = recManager->CheckTimerConflict(); + if (!timerConflicts) + return false; + int showTimerConflict = timerConflicts->GetCorrespondingConflict(timerID); + if (showTimerConflict > -1) { + timerConflicts->SetCurrentConflict(showTimerConflict); + cTVGuideTimerConflict *conflict = timerConflicts->GetCurrentConflict(); + if (!conflict) + return false; + activeMenu = new cRecMenuTimerConflict(conflict); + activeMenu->Display(); + return true; + } + return false; +} + +void cRecMenuView::DisplayDetailedView(const cEvent *ev) { + activeMenu->Hide(); + detailView = new cDetailView(ev, footer); + footer->SetDetailedViewMode(true); + detailView->Start(); + detailViewActive = true; +} + +eOSState cRecMenuView::ProcessKey(eKeys Key) { + eOSState state = osContinue; + eRecMenuState nextState = rmsContinue; + if (!activeMenu) + return state; + if (detailViewActive) { + state = detailView->ProcessKey(Key); + if (state == osEnd) { + delete detailView; + detailView = NULL; + detailViewActive = false; + activeMenu->Show(); + state = osContinue; + } + } else { + nextState = activeMenu->ProcessKey(Key); + if ((nextState == rmsClose) || ((nextState == rmsNotConsumed)&&(Key == kBack))){ + if (activeMenuBuffer == NULL) { + state = osEnd; + Close(); + } else { + delete activeMenu; + activeMenu = activeMenuBuffer; + activeMenuBuffer = NULL; + activeMenu->UpdateActiveMenuItem(); + activeMenu->Show(); + state = osContinue; + osdManager.flush(); + } + return state; + } + state = StateMachine(nextState); + } + osdManager.flush(); + return state; +} diff --git a/recmenuview.h b/recmenuview.h index 6eaa20a..42b1f5e 100644 --- a/recmenuview.h +++ b/recmenuview.h @@ -1,43 +1,43 @@ -#ifndef __TVGUIDE_RECMENUVIEW_H -#define __TVGUIDE_RECMENUVIEW_H - -#include "recmenu.h" -#include "recmanager.h" -#include "services/epgsearch.h" -#include "footer.h" - -// --- cRecMenuView ------------------------------------------------------------- -class cRecMenuView { -private: - cFooter *footer; - bool active; - cRecMenu *activeMenu; - cRecMenu *activeMenuBuffer; - cRecMenu *activeMenuBuffer2; - const cEvent *event; - const cEvent *displayEvent; - cRecManager *recManager; - cTVGuideTimerConflicts *timerConflicts; - cDetailView *detailView; - cPixmap *pixmapBackground; - bool detailViewActive; - void SetBackground(void); - void DeleteBackground(void); - void DisplaySearchTimerList(void); - bool DisplayTimerConflict(const cTimer *timer); - bool DisplayTimerConflict(int timerID); - void DisplayDetailedView(const cEvent *ev); - void DisplayFavoriteResults(std::string header, const cEvent **result, int numResults); - eOSState StateMachine(eRecMenuState nextState); -public: - cRecMenuView(void); - virtual ~cRecMenuView(void); - void SetFooter(cFooter *footer) { this->footer = footer; }; - bool isActive(void) { return active; }; - void Start(const cEvent *event); - void StartFavorites(void); - void Close(void); - eOSState ProcessKey(eKeys Key); -}; - -#endif //__TVGUIDE_RECMENUVIEW_H +#ifndef __TVGUIDE_RECMENUVIEW_H +#define __TVGUIDE_RECMENUVIEW_H + +#include "recmenu.h" +#include "recmanager.h" +#include "services/epgsearch.h" +#include "footer.h" + +// --- cRecMenuView ------------------------------------------------------------- +class cRecMenuView { +private: + cFooter *footer; + bool active; + cRecMenu *activeMenu; + cRecMenu *activeMenuBuffer; + cRecMenu *activeMenuBuffer2; + const cEvent *event; + const cEvent *displayEvent; + cRecManager *recManager; + cTVGuideTimerConflicts *timerConflicts; + cDetailView *detailView; + cPixmap *pixmapBackground; + bool detailViewActive; + void SetBackground(void); + void DeleteBackground(void); + void DisplaySearchTimerList(void); + bool DisplayTimerConflict(const cTimer *timer); + bool DisplayTimerConflict(int timerID); + void DisplayDetailedView(const cEvent *ev); + void DisplayFavoriteResults(std::string header, const cEvent **result, int numResults); + eOSState StateMachine(eRecMenuState nextState); +public: + cRecMenuView(void); + virtual ~cRecMenuView(void); + void SetFooter(cFooter *footer) { this->footer = footer; }; + bool isActive(void) { return active; }; + void Start(const cEvent *event); + void StartFavorites(void); + void Close(void); + eOSState ProcessKey(eKeys Key); +}; + +#endif //__TVGUIDE_RECMENUVIEW_H