diff options
author | Martin Schirrmacher <root@suffball.ath.cx> | 2013-04-11 13:25:51 +0200 |
---|---|---|
committer | Martin Schirrmacher <root@suffball.ath.cx> | 2013-04-11 13:25:51 +0200 |
commit | 4762c54a64e6390559dc12cc590d7095fac79795 (patch) | |
tree | 18460287e79628eb303f45f69971ab84d0c1c238 /menuevent.c | |
download | vdr-plugin-neutrinoepg-4762c54a64e6390559dc12cc590d7095fac79795.tar.gz vdr-plugin-neutrinoepg-4762c54a64e6390559dc12cc590d7095fac79795.tar.bz2 |
initial commit
Diffstat (limited to 'menuevent.c')
-rw-r--r-- | menuevent.c | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/menuevent.c b/menuevent.c new file mode 100644 index 0000000..cf8a722 --- /dev/null +++ b/menuevent.c @@ -0,0 +1,223 @@ +/* + * See the README file for copyright information and how to reach the author. + */ + +#include "menuevent.h" + +extern int keeposd; +extern time_t t; +char Title[32]; + +bool isMenuEvent; + +struct Epgsearch_search_v1_0 +{ +// in + char* query; // search term + int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression) + int channelNr; // channel number to search in (0=any) + bool useTitle; // search in title + bool useSubTitle; // search in subtitle + bool useDescription; // search in description +// out + cOsdMenu* pResultMenu; // pointer to the menu of results +}; + +myMenuEvent::myMenuEvent(myOsdItem *Item) : cOsdMenu(trVDR("Event")) +{ + item = Item; + event = item->event; + timer = item->timer; + channel = item->channel; + + isMenuEvent = true; + + SetTitle( channel->Name() ); + pEpgSearch = cPluginManager::GetPlugin("epgsearch"); + + if( timer ) + { + if( pEpgSearch ) + SetHelp(tr("Button$Edit T."), tr("Button$Delete T."), tr("Button$Search for repeats"), trVDR("Button$Switch")); + else + SetHelp(tr("Button$Edit T."), tr("Button$Delete T."), NULL, trVDR("Button$Switch")); + } + else + { + if( pEpgSearch && event ) + SetHelp(trVDR("Button$Record"), NULL, tr("Button$Search for repeats"), trVDR("Button$Switch")); + else + SetHelp(trVDR("Button$Record"), NULL, NULL, trVDR("Button$Switch")); + } +} +myMenuEvent::~myMenuEvent(void) +{ + isMenuEvent = false; +} +void myMenuEvent::Display() +{ + cOsdMenu::Display(); + + if(event) + { + DisplayMenu()->SetEvent(event); + cStatus::MsgOsdTextItem(event->Description()); + } + else + DisplayMenu()->SetText(tr("no program info"), 0); +} + +eOSState myMenuEvent::SearchRepeats(void) +{ + if( !pEpgSearch ) + return osContinue; + + Epgsearch_search_v1_0* serviceData = new Epgsearch_search_v1_0; + serviceData->query = strdup( event->Title() ); + serviceData->mode = 0; + serviceData->channelNr = 0; + serviceData->useTitle = true; + serviceData->useSubTitle = serviceData->useDescription = false; + + cOsdMenu* pMenu = NULL; + if (pEpgSearch->Service("Epgsearch-search-v1.0", serviceData)) + pMenu = serviceData->pResultMenu; + else + Skins.Message(mtError, "EPGSearch does not support this service!"); + + delete serviceData; + + if (pMenu) + return AddSubMenu(pMenu); + else + return osContinue; + +} + +eOSState myMenuEvent::Switch() +{ + const cChannel *channel = item->channel; + if(channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true)) + return keeposd ? osContinue : osEnd; + Skins.Message(mtError, tr("Can't switch channel!")); + return osContinue; +} + +eOSState myMenuEvent::Record() +{ + // if a timer exists, edit it + if(timer) + return AddSubMenu(new cMenuEditTimer(timer)); + else + { + // we have to create a new one + if(event) + { + timer = new cTimer(event); + Timers.Add(timer); + timer->Matches(); + Timers.SetModified(); + } + else + { + // this is a hack to create a timer for channels without events + char *buffer; + int starthh, startmm, stophh, stopmm; + + struct tm tm_t; + localtime_r(&t, &tm_t); + + sscanf(*TimeString(t), "%2d:%2d", &starthh, &startmm); + sscanf(*TimeString(t + Setup.InstantRecordTime*60), "%2d:%2d", &stophh, &stopmm); + + asprintf(&buffer, "1:%d:%d:%d%d:%d%d:%d:%d:%s", + item->channel->Number(), tm_t.tm_mday, starthh, startmm, stophh, stopmm, + Setup.DefaultPriority, Setup.DefaultLifetime, item->channel->Name()); + + timer = new cTimer(false, false); + timer->Parse(buffer); + free(buffer); + + // we start a cMenuEditTimer because there are no reasonable values + return AddSubMenu(new cMenuEditTimer(timer, true)); + } + } + SetHelp(tr("Button$Edit T."), tr("Button$Delete T."), NULL, trVDR("Button$Switch")); + // update item text + item->Set(); + return osContinue; +} + +eOSState myMenuEvent::Delete() +{ + if(Interface->Confirm(trVDR("Delete timer?"))) + { + if(timer->Recording()) + { + if(Interface->Confirm(trVDR("Timer still recording - really delete?"))) + { + timer->Skip(); + cRecordControls::Process(time(NULL)); + } + else + return osContinue; + } + Timers.Del(timer); + Timers.SetModified(); + timer = NULL; + + SetHelp(trVDR("Button$Record"), NULL, NULL, trVDR("Button$Switch")); + } + // update item text + item->Set(); + return osContinue; +} + +eOSState myMenuEvent::ProcessKey(eKeys Key) +{ + if(!HasSubMenu()) + { + switch((int)Key) + { + case kUp|k_Repeat: + case kUp: + case kDown|k_Repeat: + case kDown: + case kLeft|k_Repeat: + case kLeft: + case kRight|k_Repeat: + case kRight: + DisplayMenu()->Scroll( + NORMALKEY(Key) == kUp || NORMALKEY(Key) == kLeft, + NORMALKEY(Key) == kLeft || NORMALKEY(Key) == kRight); + cStatus::MsgOsdTextItem(NULL, NORMALKEY(Key) == kUp); + return osContinue; + default: + break; + } + } + + eOSState state = cOsdMenu::ProcessKey(Key); + + if(state == osUnknown) + { + switch(Key) + { + case kRecord: + case kRed: + return Record(); + case kGreen: + if(timer) + return Delete(); + case kYellow: + return SearchRepeats(); + case kBlue: + return Switch(); + case kOk: + return osBack; + default: + break; + } + } + return state; +} |