vdr-plugin-tvguide/recmenumanager.c
2019-06-19 13:28:22 +02:00

940 lines
40 KiB
C

#include "recmenu.h"
#include "recmenus.h"
#include "switchtimer.h"
#include "timerconflict.h"
#include "recmenumanager.h"
cRecMenuManager::cRecMenuManager(void) {
footer = NULL;
active = false;
activeMenu = NULL;
activeMenuBuffer = NULL;
activeMenuBuffer2 = NULL;
recManager = new cRecManager();
recManager->SetEPGSearchPlugin();
timerConflicts = NULL;
detailViewActive = false;
}
cRecMenuManager::~cRecMenuManager(void) {
if (activeMenu) {
active = false;
delete activeMenu;
activeMenu = NULL;
}
if (timerConflicts) {
delete timerConflicts;
timerConflicts = NULL;
}
delete recManager;
}
void cRecMenuManager::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 cRecMenuManager::StartFavorites(void) {
active = true;
activeMenuBuffer = NULL;
detailViewActive = false;
SetBackground();
std::vector<cTVGuideSearchTimer> favorites;
recManager->GetFavorites(&favorites);
activeMenu = new cRecMenuFavorites(favorites);
activeMenu->Display();
osdManager.flush();
}
void cRecMenuManager::Close(void) {
event = NULL;
active = false;
if (activeMenu) {
delete activeMenu;
activeMenu = NULL;
}
if (timerConflicts) {
delete timerConflicts;
timerConflicts = NULL;
}
DeleteBackground();
}
void cRecMenuManager::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 cRecMenuManager::DeleteBackground(void) {
osdManager.releasePixmap(pixmapBackground);
}
eOSState cRecMenuManager::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<cRecMenuAskFolder*>(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<cRecMenuTimerConflict*>(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<cRecMenuTimerConflict*>(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<cRecMenuTimerConflict*>(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<cRecMenuEditTimer*>(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<cRecMenuEditTimer*>(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<cRecMenuAskFolder*>(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<cRecMenuSeriesTimer*>(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<cRecMenuSearchTimer*>(activeMenu)) {
searchString = menu->GetSearchString();
} else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast<cRecMenuSearchTimerTemplatesCreate*>(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<TVGuideEPGSearchTemplate> epgSearchTemplates;
recManager->ReadEPGSearchTemplates(&epgSearchTemplates);
if (epgSearchTemplates.size() > 0) {
activeMenu = new cRecMenuSearchTimerTemplates(searchTimer, epgSearchTemplates);
} else {
std::vector<std::string> 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<cRecMenuSearchTimers*>(activeMenu)) {
searchTimer = menu->GetSearchTimer();
} else if (cRecMenuSearchTimerEdit *menu = dynamic_cast<cRecMenuSearchTimerEdit*>(activeMenu)) {
searchTimer = menu->GetSearchTimer();
} else if (cRecMenuSearchTimerTemplates *menu = dynamic_cast<cRecMenuSearchTimerTemplates*>(activeMenu)) {
searchTimer = menu->GetSearchTimer();
} else break;
delete activeMenu;
std::vector<std::string> 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<cRecMenuSearchTimerEdit*>(activeMenu)) {
searchTimer = menu->GetSearchTimer();
recState = rmsSearchTimerRecord;
} else if (cRecMenuSearchTimers *menu = dynamic_cast<cRecMenuSearchTimers*>(activeMenu)) {
searchTimer = menu->GetSearchTimer();
recState = rmsSearchTimerRecord;
} else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast<cRecMenuSearchTimerTemplatesCreate*>(activeMenu)) {
searchTimer = menu->GetSearchTimer();
TVGuideEPGSearchTemplate tmpl = menu->GetTemplate();
searchTimer.SetTemplate(tmpl.templValue);
searchTimer.Parse(true);
} else if (cRecMenuFavorites *menu = dynamic_cast<cRecMenuFavorites*>(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<cRecMenuSearchTimerEdit*>(activeMenu)) {
searchTimer = menu->GetSearchTimer();
} else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast<cRecMenuSearchTimerTemplatesCreate*>(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<cRecMenuSearchTimerTemplates*>(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<cRecMenuSearchTimers*>(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<cRecMenuSearchTimerDeleteConfirm*>(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<cRecMenuSearchTimerResults*>(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<cRecMenuSwitchTimer*>(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<cRecMenuRecordingSearchResults*>(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<cRecMenuRecordingSearch*>(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<cRecMenuSearch*>(activeMenu)) {
withOptions = true;
searchString = menu->GetSearchString();
} else if (cRecMenuSearchResults *menu = dynamic_cast<cRecMenuSearchResults*>(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<cRecMenuSearch*>(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<cRecMenuSearchResults*>(activeMenu)) {
ev = menu->GetEvent();
} else if (cRecMenuSearchTimerResults *menu = dynamic_cast<cRecMenuSearchTimerResults*>(activeMenu)) {
ev = menu->GetEvent();
} else break;
if (ev) {
DisplayDetailedView(ev);
}
break;}
case rmsSearchRecord: {
//caller: cRecMenuSearchResults
const cEvent *ev = NULL;
if (cRecMenuSearchResults *menu = dynamic_cast<cRecMenuSearchResults*>(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<cRecMenuTimerConflicts*>(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<cRecMenuTimerConflict*>(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<cRecMenuRerunResults*>(activeMenu)) {
replace = menu->GetRerunEvent();
} else break;
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(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<cRecMenuTimeline*>(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<cRecMenuEditTimer*>(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<cRecMenuEditTimer*>(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<cRecMenuSearchTimerResults*>(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 cRecMenuManager::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 cRecMenuManager::DisplaySearchTimerList(void) {
delete activeMenu;
std::vector<cTVGuideSearchTimer> searchTimers;
recManager->GetSearchTimers(&searchTimers);
activeMenu = new cRecMenuSearchTimers(searchTimers);
activeMenu->Display();
}
bool cRecMenuManager::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 cRecMenuManager::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 cRecMenuManager::DisplayDetailedView(const cEvent *ev) {
activeMenu->Hide();
detailView = new cDetailView(ev, footer);
footer->SetDetailedViewMode(true);
detailView->Start();
detailViewActive = true;
}
eOSState cRecMenuManager::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;
}