diff --git a/HISTORY b/HISTORY index 21850b6d..53ab8bea 100644 --- a/HISTORY +++ b/HISTORY @@ -3998,7 +3998,11 @@ Video Disk Recorder Revision History - Removed an invalid access to Event->schedule in cSchedule::DelEvent(). - Modified cSchedule::Cleanup() (events are always sorted by time). - Schedules are now cleaned up once every hour (not only at 05:00). -- The "Schedules" and "What's on now/next?" menus are now updated if a timer +- The "Schedule" and "What's on now/next?" menus are now updated if a timer is set or modified. - cTimer no longer has its own 'schedule' member, it rather uses that of the event it has been set to. +- The "Red" button in the "Schedule", "What's on now/next?" and "Event" menus + now immediately creates a timer for the selected event and marks it with 'T'. + If the event is already marked with 'T', the "Red" button opens the "Edit + timer" menu for that timer. diff --git a/MANUAL b/MANUAL index 3d53d4f7..5d4f2b5e 100644 --- a/MANUAL +++ b/MANUAL @@ -141,14 +141,17 @@ Version 1.2 "Schedule" menu of the current channel in the list. The "Red" button allows you to instantly program a timer to record the - selected programme. You will get into the "Edit Timer" menu in which - everything has already been filled in, and you can make any modifications + selected programme. After pressing this button, the current event will + be marked with 'T', and the function of the "Red" button will change from + "Record" to "Timer". Pressing "Red" on an event marked with 'T' will open + the "Edit timer" menu for this timer, where you can make any modifications you may want to apply. Note that the Start and Stop time are offset by the MarginStart and MarginStop parameters (see Setup) in order to make sure the entire programme is recorded in case it doesn't exactly adhere to its published start/stop times. Of course, no guarantee can be given that the default margin values will be sufficient, so in case this recording is - really important you may want to add an extra margin ;-) + really important you may want to add an extra margin ;-). VPS recordings + will use the exact Start (or VPS) and Stop times as given in the event. The "Blue" button can be pressed to switch to the channel with the selected programme. @@ -373,7 +376,7 @@ Version 1.2 * Programming the Timer Use the "Timer" menu to maintain your list of timer controlled recordings. - The parameters in the "Edit Timer" menu have the following meanings: + The parameters in the "Edit timer" menu have the following meanings: Active: Defines whether the timer will be processed (set it to 'no' to temporarily disable a timer). diff --git a/menu.c b/menu.c index 804a059e..e97e95b1 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.379 2005/12/27 11:23:30 kls Exp $ + * $Id: menu.c 1.380 2005/12/27 14:54:47 kls Exp $ */ #include "menu.h" @@ -898,7 +898,9 @@ cMenuEvent::cMenuEvent(const cEvent *Event, bool CanSwitch) cChannel *channel = Channels.GetByChannelID(event->ChannelID(), true); if (channel) { SetTitle(channel->Name()); - SetHelp(tr("Record"), NULL, NULL, CanSwitch ? tr("Switch") : NULL); + int TimerMatch = tmNone; + Timers.GetMatch(event, &TimerMatch); + SetHelp(TimerMatch == tmFull ? tr("Timer") : tr("Record"), NULL, NULL, CanSwitch ? tr("Switch") : NULL); } } } @@ -985,11 +987,14 @@ bool cMenuScheduleItem::Update(bool Force) class cMenuWhatsOn : public cOsdMenu { private: + bool now; + int helpKeys; eOSState Record(void); eOSState Switch(void); static int currentChannel; static const cEvent *scheduleEvent; bool Update(void); + void SetHelpKeys(void); public: cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentChannelNr); static int CurrentChannel(void) { return currentChannel; } @@ -1004,6 +1009,8 @@ 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) { + now = Now; + helpKeys = -1; for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { if (!Channel->GroupSep()) { const cSchedule *Schedule = Schedules->GetSchedule(Channel->GetChannelID()); @@ -1015,7 +1022,7 @@ cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentCha } } currentChannel = CurrentChannelNr; - SetHelp(Count() ? tr("Record") : NULL, Now ? tr("Next") : tr("Now"), tr("Button$Schedule"), tr("Switch")); + SetHelpKeys(); } bool cMenuWhatsOn::Update(void) @@ -1028,6 +1035,23 @@ bool cMenuWhatsOn::Update(void) return result; } +void cMenuWhatsOn::SetHelpKeys(void) +{ + cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current()); + int NewHelpKeys = 0; + if (item) { + if (item->timerMatch == tmFull) + NewHelpKeys = 2; + else + NewHelpKeys = 1; + } + if (NewHelpKeys != helpKeys) { + const char *Red[] = { NULL, tr("Record"), tr("Timer") }; + SetHelp(Red[NewHelpKeys], now ? tr("Next") : tr("Now"), tr("Button$Schedule"), tr("Switch")); + helpKeys = NewHelpKeys; + } +} + const cEvent *cMenuWhatsOn::ScheduleEvent(void) { const cEvent *ei = scheduleEvent; @@ -1056,8 +1080,19 @@ eOSState cMenuWhatsOn::Record(void) if (t) { delete timer; timer = t; + return AddSubMenu(new cMenuEditTimer(timer)); + } + else { + Timers.Add(timer); + timer->Matches(); + Timers.SetModified(); + isyslog("timer %s added (active)", *timer->ToDescr()); + if (HasSubMenu()) + CloseSubMenu(); + if (Update()) + Display(); + SetHelpKeys(); } - return AddSubMenu(new cMenuEditTimer(timer, !t)); } return osContinue; } @@ -1088,8 +1123,12 @@ eOSState cMenuWhatsOn::ProcessKey(eKeys Key) default: break; } } - else if (HadSubMenu && !HasSubMenu() && Update()) - Display(); + else if (!HasSubMenu()) { + if (HadSubMenu && Update()) + Display(); + if (Key != kNone) + SetHelpKeys(); + } return state; } @@ -1101,10 +1140,12 @@ private: const cSchedules *schedules; bool now, next; int otherChannel; + int helpKeys; eOSState Record(void); eOSState Switch(void); void PrepareSchedule(cChannel *Channel); bool Update(void); + void SetHelpKeys(void); public: cMenuSchedule(void); virtual ~cMenuSchedule(); @@ -1116,12 +1157,13 @@ cMenuSchedule::cMenuSchedule(void) { now = next = false; otherChannel = 0; + helpKeys = -1; 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")); + SetHelpKeys(); } } @@ -1160,6 +1202,23 @@ bool cMenuSchedule::Update(void) return result; } +void cMenuSchedule::SetHelpKeys(void) +{ + cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current()); + int NewHelpKeys = 0; + if (item) { + if (item->timerMatch == tmFull) + NewHelpKeys = 2; + else + NewHelpKeys = 1; + } + if (NewHelpKeys != helpKeys) { + const char *Red[] = { NULL, tr("Record"), tr("Timer") }; + SetHelp(Red[NewHelpKeys], tr("Now"), tr("Next")); + helpKeys = NewHelpKeys; + } +} + eOSState cMenuSchedule::Record(void) { cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current()); @@ -1169,8 +1228,19 @@ eOSState cMenuSchedule::Record(void) if (t) { delete timer; timer = t; + return AddSubMenu(new cMenuEditTimer(timer)); + } + else { + Timers.Add(timer); + timer->Matches(); + Timers.SetModified(); + isyslog("timer %s added (active)", *timer->ToDescr()); + if (HasSubMenu()) + CloseSubMenu(); + if (Update()) + Display(); + SetHelpKeys(); } - return AddSubMenu(new cMenuEditTimer(timer, !t)); } return osContinue; } @@ -1237,6 +1307,8 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key) } else if (HadSubMenu && Update()) Display(); + if (Key != kNone) + SetHelpKeys(); } return state; }