@@ -303,6 +303,8 @@
CurrentChannel = -1;
CurrentVolume = MAXVOLUME;
CurrentDolby = 0;
+ PrimeTime = 2015;
+ sprintf(PrimeTimeText, tr("At %02d:%02d"), PrimeTime / 100, PrimeTime % 100);
}
cSetup& cSetup::operator= (const cSetup &s)
@@ -361,6 +363,7 @@
result = false;
}
}
+ sprintf(PrimeTimeText, tr("At %02d:%02d"), PrimeTime / 100, PrimeTime % 100);
return result;
}
return false;
@@ -461,6 +464,7 @@
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value);
else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value);
+ else if (!strcasecmp(Name, "PrimeTime")) PrimeTime = atoi(Value);
else
return false;
return true;
@@ -526,6 +530,8 @@
Store("CurrentChannel", CurrentChannel);
Store("CurrentVolume", CurrentVolume);
Store("CurrentDolby", CurrentDolby);
+ Store("PrimeTime", PrimeTime);
+ sprintf(PrimeTimeText, tr("At %02d:%02d"), PrimeTime / 100, PrimeTime % 100);
Sort();
@@ -255,7 +255,9 @@
int CurrentChannel;
int CurrentVolume;
int CurrentDolby;
+ int PrimeTime;
int __EndData__;
+ char PrimeTimeText[10];
cSetup(void);
cSetup& operator= (const cSetup &s);
bool Load(const char *FileName);
@@ -504,6 +504,27 @@
"Järgmisena eetris",
"Hvad vises som det næste?",
},
+ { "What's on at Prime Time?",
+ "Was läuft zur Prime Time?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ },
// Button texts (should not be more than 10 characters!):
{ "Edit",
"Editieren",
@@ -819,6 +840,27 @@
"Slijedi",
"Järgmine",
"Næste",
+ },
+ { "At %02d:%02d",
+ "Um %02d:%02d im TV",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
},
{ "Button$Schedule",
"Programm",
@@ -968,8 +968,11 @@
eOSState Switch(void);
static int currentChannel;
static const cEvent *scheduleEvent;
+ static const char *whenStrings[3];
+ static char atString[10];
public:
- cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentChannelNr);
+ enum eWhen { wNow, wNext, wPrime, wMaxWhen };
+ cMenuWhatsOn(const cSchedules *Schedules, eWhen When, int CurrentChannelNr);
static int CurrentChannel(void) { return currentChannel; }
static void SetCurrentChannel(int ChannelNr) { currentChannel = ChannelNr; }
static const cEvent *ScheduleEvent(void);
@@ -978,22 +981,54 @@
int cMenuWhatsOn::currentChannel = 0;
const cEvent *cMenuWhatsOn::scheduleEvent = NULL;
-
-cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentChannelNr)
-:cOsdMenu(Now ? tr("What's on now?") : tr("What's on next?"), CHNUMWIDTH, 7, 6, 4)
+const char *cMenuWhatsOn::whenStrings[3] = { "What's on now?", "What's on next?", "What's on at Prime Time?" };
+char cMenuWhatsOn::atString[10] = "";
+
+cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, eWhen When, int CurrentChannelNr)
+:cOsdMenu(tr(whenStrings[When]), CHNUMWIDTH, 7, 6, 4, 4)
{
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
if (!Channel->GroupSep()) {
const cSchedule *Schedule = Schedules->GetSchedule(Channel->GetChannelID());
if (Schedule) {
- const cEvent *Event = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent();
+ const cEvent *Event = NULL;
+ switch (When) {
+ case wNow: Event = Schedule->GetPresentEvent(); break;
+ case wNext: Event = Schedule->GetFollowingEvent(); break;
+ case wPrime: {
+ time_t now = time(NULL);
+ struct tm prime;
+ time_t primestamp;
+ localtime_r(&now, &prime);
+ prime.tm_hour = Setup.PrimeTime / 100;
+ prime.tm_min = Setup.PrimeTime % 100;
+ primestamp = mktime(&prime);
+ Event = Schedule->GetEventAround(primestamp);
+ if (Event == NULL) {
+ prime.tm_mday++; // gets normalized according to manual
+ Event = Schedule->GetEventAround(mktime(&prime));
+ }
+ else if (Event->EndTime() < primestamp + 600) {
+ prime.tm_min += 10;
+ Event = Schedule->GetEventAround(mktime(&prime));
+ }
+ } // run into default
+ default: break;
+ }
if (Event)
Add(new cMenuWhatsOnItem(Event, Channel), Channel->Number() == CurrentChannelNr);
}
}
}
currentChannel = CurrentChannelNr;
- SetHelp(Count() ? tr("Record") : NULL, Now ? tr("Next") : tr("Now"), tr("Button$Schedule"), tr("Switch"));
+ const char *next = NULL;
+ switch (When) {
+ case wNow: next = tr("Next"); break;
+ case wNext: next = Setup.PrimeTimeText; break;
+ case wPrime: next = tr("Now"); // run into default
+ default: break;
+ }
+ SetHelp(Count() ? tr("Record") : NULL, next, tr("Button$Schedule"), tr("Switch"));
}
const cEvent *cMenuWhatsOn::ScheduleEvent(void)
@@ -1083,8 +1118,9 @@
class cMenuSchedule : public cOsdMenu {
private:
cSchedulesLock schedulesLock;
+ bool schedule;
const cSchedules *schedules;
- bool now, next;
+ cMenuWhatsOn::eWhen when;
int otherChannel;
eOSState Record(void);
eOSState Switch(void);
@@ -1098,14 +1134,15 @@
cMenuSchedule::cMenuSchedule(void)
:cOsdMenu("", 7, 6, 4)
{
- now = next = false;
+ schedule = false;
+ when = (cMenuWhatsOn::eWhen)-1;
otherChannel = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
cMenuWhatsOn::SetCurrentChannel(channel->Number());
schedules = cSchedules::Schedules(schedulesLock);
PrepareSchedule(channel);
- SetHelp(Count() ? tr("Record") : NULL, tr("Now"), tr("Next"));
+ SetHelp(Count() ? tr("Record") : NULL, tr("Now"), tr("Next"), Setup.PrimeTimeText);
}
}
@@ -1166,27 +1203,34 @@
if (state == osUnknown) {
switch (Key) {
case kRecord:
- case kRed: return Record();
+ case kRed: if (((cMenuScheduleItem *)Get(Current()))->event != NULL)
+ return Record();
+ break;
case kGreen: if (schedules) {
- if (!now && !next) {
+ if (!schedule) {
int ChannelNr = 0;
if (Count()) {
cChannel *channel = Channels.GetByChannelID(((cMenuScheduleItem *)Get(Current()))->event->ChannelID(), true);
if (channel)
ChannelNr = channel->Number();
}
- now = true;
- return AddSubMenu(new cMenuWhatsOn(schedules, true, ChannelNr));
+ when = cMenuWhatsOn::wNow;
+ schedule = true;
+ return AddSubMenu(new cMenuWhatsOn(schedules, when, ChannelNr));
}
- now = !now;
- next = !next;
- return AddSubMenu(new cMenuWhatsOn(schedules, now, cMenuWhatsOn::CurrentChannel()));
+ when = (cMenuWhatsOn::eWhen)((when + 1) % cMenuWhatsOn::wMaxWhen);
+ return AddSubMenu(new cMenuWhatsOn(schedules, when, cMenuWhatsOn::CurrentChannel()));
+ }
+ case kYellow: if (schedules) {
+ when = cMenuWhatsOn::wNext;
+ schedule = true;
+ return AddSubMenu(new cMenuWhatsOn(schedules, cMenuWhatsOn::wNext, cMenuWhatsOn::CurrentChannel()));
}
- case kYellow: if (schedules)
- return AddSubMenu(new cMenuWhatsOn(schedules, false, cMenuWhatsOn::CurrentChannel()));
break;
- case kBlue: if (Count())
+ case kBlue: if (Count() && cDevice::CurrentChannel() != cMenuWhatsOn::CurrentChannel())
return Switch();
+ else if (schedules)
+ return AddSubMenu(new cMenuWhatsOn(schedules, cMenuWhatsOn::wPrime, cMenuWhatsOn::CurrentChannel()));
break;
case kOk: if (Count())
return AddSubMenu(new cMenuEvent(((cMenuScheduleItem *)Get(Current()))->event, otherChannel));
@@ -1195,16 +1239,18 @@
}
}
else if (!HasSubMenu()) {
- now = next = false;
+ schedule = false;
const cEvent *ei = cMenuWhatsOn::ScheduleEvent();
if (ei) {
cChannel *channel = Channels.GetByChannelID(ei->ChannelID(), true);
if (channel) {
PrepareSchedule(channel);
+ const char *blue = Setup.PrimeTimeText;
if (channel->Number() != cDevice::CurrentChannel()) {
otherChannel = channel->Number();
- SetHelp(Count() ? tr("Record") : NULL, tr("Now"), tr("Next"), tr("Switch"));
+ blue = tr("Switch");
}
+ SetHelp(Count() ? tr("Record") : NULL, tr("Now"), tr("Next"), blue);
Display();
}
}
@@ -1914,6 +1960,7 @@
Add(new cMenuEditIntItem( tr("Setup.EPG$Preferred languages"), &numLanguages, 0, I18nNumLanguages));
for (int i = 0; i < numLanguages; i++)
Add(new cMenuEditStraItem(tr("Setup.EPG$Preferred language"), &data.EPGLanguages[i], I18nNumLanguages, I18nLanguages()));
+ Add(new cMenuEditTimeItem(tr("Setup.EPG$Prime Time"), &data.PrimeTime));
SetCurrent(Get(current));
Display();