summaryrefslogtreecommitdiff
path: root/menuevent.c
diff options
context:
space:
mode:
authorMartin Schirrmacher <root@suffball.ath.cx>2013-04-11 13:25:51 +0200
committerMartin Schirrmacher <root@suffball.ath.cx>2013-04-11 13:25:51 +0200
commit4762c54a64e6390559dc12cc590d7095fac79795 (patch)
tree18460287e79628eb303f45f69971ab84d0c1c238 /menuevent.c
downloadvdr-plugin-neutrinoepg-4762c54a64e6390559dc12cc590d7095fac79795.tar.gz
vdr-plugin-neutrinoepg-4762c54a64e6390559dc12cc590d7095fac79795.tar.bz2
initial commit
Diffstat (limited to 'menuevent.c')
-rw-r--r--menuevent.c223
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;
+}