diff --git a/HISTORY b/HISTORY index f283c140..655be9ce 100644 --- a/HISTORY +++ b/HISTORY @@ -673,3 +673,6 @@ Video Disk Recorder Revision History calculation of matching timers has been completely rewritten). - Timers that are currently recording are now marked with '#' in the "Timers" menu. +- Timers are now sorted in the "Timers" menu, showing the sequence in which + they will be recording. This can be disabled in the "Setup" menu. Note + that the "Mark" button doesn't work if timers are displayed sorted. diff --git a/MANUAL b/MANUAL index 90a10ded..ae93099f 100644 --- a/MANUAL +++ b/MANUAL @@ -8,7 +8,7 @@ Video Disk Recorder User's Manual possible, several keys have different meanings in the various modes: - Key Normal Main Channels Timer Edit/New Recordings Replay + Key Normal Main Channels Timers Edit/New Recordings Replay Up Ch up Crsr up Crsr up Crsr up Crsr up Crsr up Play Down Ch down Crsr down Crsr down Crsr down Crsr down Crsr down Pause @@ -20,9 +20,12 @@ Video Disk Recorder User's Manual Red - Record Edit Edit - Play Jump Green - Language New New - Rewind Skip -60s Yellow - Eject DVD Delete Delete - Delete Skip +60s - Blue - Resume Mark Mark - Summary Stop + Blue - Resume Mark Mark(1) - Summary Stop 0..9 Ch select - - - Numeric inp. - Editing + (1) The "Mark" button in the "Timers" menu only works if sorting the timers + has been disabled in the "Setup" menu. + * Navigating through the On Screen Menus The "Main" menu can be called up with the "Menu" key of your remote @@ -297,6 +300,12 @@ Video Disk Recorder User's Manual OSDLanguage = 0 Defines the language used to display the OSD texts. 0 = Englisch 1 = Deutsch + 2 = Slovenian + 3 = Italian + 4 = Dutch + 5 = Portugese + 6 = French + 7 = Norwegian PrimaryDVB = 1 Defines the primary DVB interface (i.e. the one that will display the menus and will react on input through @@ -374,6 +383,10 @@ Video Disk Recorder User's Manual connection after which the connection is automatically closed. Default is 300, a value of 0 means no timeout. + SortTimers = 1 Turns sorting the timers in the "Timers" menu on/off. + Timers are sorted by ascending start times, with the + first one being the next timer that will start. + PrimaryLimit = 0 The minimum priority a timer must have to be allowed to use the primary DVB interface, or to force another timer with higher priority to use the primary DVB interface. diff --git a/config.c b/config.c index b0210a53..367b1075 100644 --- a/config.c +++ b/config.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.c 1.57 2001/08/26 11:57:52 kls Exp $ + * $Id: config.c 1.58 2001/08/26 14:11:29 kls Exp $ */ #include "config.h" @@ -394,6 +394,13 @@ cTimer& cTimer::operator= (const cTimer &Timer) return *this; } +bool cTimer::operator< (const cTimer &Timer) +{ + time_t t1 = StartTime(); + time_t t2 = (*(cTimer *)&Timer).StartTime(); + return t1 < t2 || (t1 == t2 && priority > Timer.priority); +} + const char *cTimer::ToText(cTimer *Timer) { delete buffer; @@ -799,6 +806,7 @@ cSetup::cSetup(void) EPGScanTimeout = 5; EPGBugfixLevel = 2; SVDRPTimeout = 300; + SortTimers = 1; PrimaryLimit = 0; DefaultPriority = 50; DefaultLifetime = 50; @@ -831,6 +839,7 @@ bool cSetup::Parse(char *s) else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value); else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value); else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value); + else if (!strcasecmp(Name, "SortTimers")) SortTimers = atoi(Value); else if (!strcasecmp(Name, "PrimaryLimit")) PrimaryLimit = atoi(Value); else if (!strcasecmp(Name, "DefaultPriority")) DefaultPriority = atoi(Value); else if (!strcasecmp(Name, "DefaultLifetime")) DefaultLifetime = atoi(Value); @@ -898,6 +907,7 @@ bool cSetup::Save(const char *FileName) fprintf(f, "EPGScanTimeout = %d\n", EPGScanTimeout); fprintf(f, "EPGBugfixLevel = %d\n", EPGBugfixLevel); fprintf(f, "SVDRPTimeout = %d\n", SVDRPTimeout); + fprintf(f, "SortTimers = %d\n", SortTimers); fprintf(f, "PrimaryLimit = %d\n", PrimaryLimit); fprintf(f, "DefaultPriority = %d\n", DefaultPriority); fprintf(f, "DefaultLifetime = %d\n", DefaultLifetime); diff --git a/config.h b/config.h index a49f5c21..36f89167 100644 --- a/config.h +++ b/config.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.64 2001/08/26 11:35:00 kls Exp $ + * $Id: config.h 1.65 2001/08/26 14:08:23 kls Exp $ */ #ifndef __CONFIG_H @@ -137,15 +137,16 @@ public: cTimer(const cEventInfo *EventInfo); virtual ~cTimer(); cTimer& operator= (const cTimer &Timer); + bool operator< (const cTimer &Timer); const char *ToText(void); bool Parse(const char *s); bool Save(FILE *f); bool IsSingleEvent(void); - int cTimer::GetMDay(time_t t); - int cTimer::GetWDay(time_t t); - bool cTimer::DayMatches(time_t t); - time_t cTimer::IncDay(time_t t, int Days); - time_t cTimer::SetTime(time_t t, int SecondsFromMidnight); + int GetMDay(time_t t); + int GetWDay(time_t t); + bool DayMatches(time_t t); + time_t IncDay(time_t t, int Days); + time_t SetTime(time_t t, int SecondsFromMidnight); bool Matches(time_t t = 0); time_t StartTime(void); time_t StopTime(void); @@ -287,6 +288,7 @@ public: int EPGScanTimeout; int EPGBugfixLevel; int SVDRPTimeout; + int SortTimers; int PrimaryLimit; int DefaultPriority, DefaultLifetime; int VideoFormat; diff --git a/i18n.c b/i18n.c index 76e9bb1a..35a6bb1e 100644 --- a/i18n.c +++ b/i18n.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.c 1.34 2001/08/25 13:41:57 kls Exp $ + * $Id: i18n.c 1.35 2001/08/26 13:45:10 kls Exp $ * * Slovenian translations provided by Miha Setina * Italian translations provided by Alberto Carraro @@ -794,6 +794,15 @@ const tPhrase Phrases[] = { "Temps maxi SVDRP", "Ubrukt SVDRP-levetid", }, + { "SortTimers", + "Timer sortieren", + "", // TODO + "", // TODO + "", // TODO + "", // TODO + "", // TODO + "", // TODO + }, { "PrimaryLimit", "Primär-Limit", "", // TODO diff --git a/menu.c b/menu.c index 4158f75f..6d6eae8e 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.108 2001/08/26 12:13:24 kls Exp $ + * $Id: menu.c 1.109 2001/08/26 14:03:27 kls Exp $ */ #include "menu.h" @@ -957,20 +957,25 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key) class cMenuTimerItem : public cOsdItem { private: - int index; cTimer *timer; public: - cMenuTimerItem(int Index, cTimer *Timer); + cMenuTimerItem(cTimer *Timer); + virtual bool operator< (const cListObject &ListObject); virtual void Set(void); + cTimer *Timer(void) { return timer; } }; -cMenuTimerItem::cMenuTimerItem(int Index, cTimer *Timer) +cMenuTimerItem::cMenuTimerItem(cTimer *Timer) { - index = Index; timer = Timer; Set(); } +bool cMenuTimerItem::operator< (const cListObject &ListObject) +{ + return *timer < *((cMenuTimerItem *)&ListObject)->timer; +} + void cMenuTimerItem::Set(void) { char *buffer = NULL; @@ -996,6 +1001,7 @@ private: eOSState Del(void); virtual void Move(int From, int To); eOSState Summary(void); + cTimer *CurrentTimer(void); public: cMenuTimers(void); virtual eOSState ProcessKey(eKeys Key); @@ -1008,15 +1014,23 @@ cMenuTimers::cMenuTimers(void) cTimer *timer; while ((timer = Timers.Get(i)) != NULL) { - Add(new cMenuTimerItem(i, timer)); + Add(new cMenuTimerItem(timer)); i++; } - SetHelp(tr("Edit"), tr("New"), tr("Delete"), tr("Mark")); + if (Setup.SortTimers) + Sort(); + SetHelp(tr("Edit"), tr("New"), tr("Delete"), Setup.SortTimers ? NULL : tr("Mark")); +} + +cTimer *cMenuTimers::CurrentTimer(void) +{ + cMenuTimerItem *item = (cMenuTimerItem *)Get(Current()); + return item ? item->Timer() : NULL; } eOSState cMenuTimers::Activate(bool On) { - cTimer *timer = Timers.Get(Current()); + cTimer *timer = CurrentTimer(); if (timer && timer->active != On) { timer->active = On; RefreshCurrent(); @@ -1031,8 +1045,8 @@ eOSState cMenuTimers::Edit(void) { if (HasSubMenu() || Count() == 0) return osContinue; - isyslog(LOG_INFO, "editing timer %d", Current() + 1); - return AddSubMenu(new cMenuEditTimer(Current())); + isyslog(LOG_INFO, "editing timer %d", CurrentTimer()->Index() + 1); + return AddSubMenu(new cMenuEditTimer(CurrentTimer()->Index())); } eOSState cMenuTimers::New(void) @@ -1041,22 +1055,22 @@ eOSState cMenuTimers::New(void) return osContinue; cTimer *timer = new cTimer; Timers.Add(timer); - Add(new cMenuTimerItem(timer->Index()/*XXX*/, timer), true); + Add(new cMenuTimerItem(timer), true); Timers.Save(); isyslog(LOG_INFO, "timer %d added", timer->Index() + 1); - return AddSubMenu(new cMenuEditTimer(Current(), true)); + return AddSubMenu(new cMenuEditTimer(timer->Index(), true)); } eOSState cMenuTimers::Del(void) { // Check if this timer is active: - int Index = Current(); - cTimer *ti = Timers.Get(Index); + cTimer *ti = CurrentTimer(); if (ti) { if (!ti->recording) { if (Interface->Confirm(tr("Delete timer?"))) { - Timers.Del(Timers.Get(Index)); - cOsdMenu::Del(Index); + int Index = ti->Index(); + Timers.Del(ti); + cOsdMenu::Del(Current()); Timers.Save(); Display(); isyslog(LOG_INFO, "timer %d deleted", Index + 1); @@ -1081,7 +1095,7 @@ eOSState cMenuTimers::Summary(void) { if (HasSubMenu() || Count() == 0) return osContinue; - cTimer *ti = Timers.Get(Current()); + cTimer *ti = CurrentTimer(); if (ti && ti->summary && *ti->summary) return AddSubMenu(new cMenuText(tr("Summary"), ti->summary)); return Edit(); // convenience for people not using the Summary feature ;-) @@ -1109,7 +1123,9 @@ eOSState cMenuTimers::ProcessKey(eKeys Key) case kRed: return Edit(); case kGreen: return New(); case kYellow: return Del(); - case kBlue: Mark(); break; + case kBlue: if (!Setup.SortTimers) + Mark(); + break; default: break; } } @@ -1706,6 +1722,7 @@ void cMenuSetup::Set(void) Add(new cMenuEditIntItem( tr("EPGScanTimeout"), &data.EPGScanTimeout)); Add(new cMenuEditIntItem( tr("EPGBugfixLevel"), &data.EPGBugfixLevel, 0, 3)); Add(new cMenuEditIntItem( tr("SVDRPTimeout"), &data.SVDRPTimeout)); + Add(new cMenuEditBoolItem(tr("SortTimers"), &data.SortTimers)); Add(new cMenuEditIntItem( tr("PrimaryLimit"), &data.PrimaryLimit, 0, MAXPRIORITY)); Add(new cMenuEditIntItem( tr("DefaultPriority"), &data.DefaultPriority, 0, MAXPRIORITY)); Add(new cMenuEditIntItem( tr("DefaultLifetime"), &data.DefaultLifetime, 0, MAXLIFETIME)); diff --git a/tools.c b/tools.c index 1045a0a2..8ae2c9d3 100644 --- a/tools.c +++ b/tools.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 1.41 2001/08/25 13:21:22 kls Exp $ + * $Id: tools.c 1.42 2001/08/26 13:11:17 kls Exp $ */ #define _GNU_SOURCE @@ -692,3 +692,19 @@ int cListBase::Count(void) const return n; } +void cListBase::Sort(void) +{ + bool swapped; + do { + swapped = false; + cListObject *object = objects; + while (object) { + if (object->Next() && *object->Next() < *object) { + Move(object->Next(), object); + swapped = true; + } + object = object->Next(); + } + } while (swapped); +} + diff --git a/tools.h b/tools.h index fc30f3f5..2f89f3f0 100644 --- a/tools.h +++ b/tools.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.h 1.30 2001/08/25 13:20:54 kls Exp $ + * $Id: tools.h 1.31 2001/08/26 12:52:49 kls Exp $ */ #ifndef __TOOLS_H @@ -95,6 +95,7 @@ private: public: cListObject(void); virtual ~cListObject(); + virtual bool operator< (const cListObject &ListObject) { return false; } void Append(cListObject *Object); void Unlink(void); int Index(void); @@ -115,6 +116,7 @@ public: virtual void Clear(void); cListObject *Get(int Index) const; int Count(void) const; + void Sort(void); }; template class cList : public cListBase {