From 3c4010bb7525dc6497d38584692b8085d0f4fcad Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 28 Mar 2004 09:20:02 +0200 Subject: [PATCH] Moved several menu item classes from menu.c to menuitems.[hc] to make them available for plugins --- HISTORY | 2 + menu.c | 326 +--------------------------------------------------- menuitems.c | 279 +++++++++++++++++++++++++++++++++++++++++++- menuitems.h | 49 +++++++- 4 files changed, 329 insertions(+), 327 deletions(-) diff --git a/HISTORY b/HISTORY index 7211b8b0..f01465a7 100644 --- a/HISTORY +++ b/HISTORY @@ -2756,3 +2756,5 @@ Video Disk Recorder Revision History - Added some 3-letter language codes (thanks to Marcus Mönnig). - Added language code handling to the subtitling descriptor in 'libsi' (thanks to Pekka Virtanen). +- Moved several menu item classes from menu.c to menuitems.[hc] to make them + available for plugins. diff --git a/menu.c b/menu.c index 4fdb994b..3e29fd67 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.297 2004/03/14 13:24:02 kls Exp $ + * $Id: menu.c 1.298 2004/03/28 09:17:15 kls Exp $ */ #include "menu.h" @@ -37,330 +37,6 @@ #define CHNUMWIDTH (numdigits(Channels.MaxNumber()) + 1) -// --- cMenuEditChanItem ----------------------------------------------------- - -class cMenuEditChanItem : public cMenuEditIntItem { -protected: - virtual void Set(void); -public: - cMenuEditChanItem(const char *Name, int *Value); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuEditChanItem::cMenuEditChanItem(const char *Name, int *Value) -:cMenuEditIntItem(Name, Value, 1, Channels.MaxNumber()) -{ - Set(); -} - -void cMenuEditChanItem::Set(void) -{ - char buf[255]; - cChannel *channel = Channels.GetByNumber(*value); - snprintf(buf, sizeof(buf), "%d %s", *value, channel ? channel->Name() : ""); - SetValue(buf); -} - -eOSState cMenuEditChanItem::ProcessKey(eKeys Key) -{ - int delta = 1; - - switch (Key) { - case kLeft|k_Repeat: - case kLeft: delta = -1; - case kRight|k_Repeat: - case kRight: - { - cChannel *channel = Channels.GetByNumber(*value + delta, delta); - if (channel) { - *value = channel->Number(); - Set(); - } - } - break; - default : return cMenuEditIntItem::ProcessKey(Key); - } - return osContinue; -} - -// --- cMenuEditTranItem ----------------------------------------------------- - -class cMenuEditTranItem : public cMenuEditChanItem { -private: - int number; - int transponder; -public: - cMenuEditTranItem(const char *Name, int *Value); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuEditTranItem::cMenuEditTranItem(const char *Name, int *Value) -:cMenuEditChanItem(Name, Value) -{ - number = 0; - transponder = *Value; - cChannel *channel = Channels.First(); - while (channel) { - if (!channel->GroupSep() && ISTRANSPONDER(channel->Frequency(), *Value)) { - number = channel->Number(); - break; - } - channel = (cChannel *)channel->Next(); - } - *Value = number; - Set(); - *Value = transponder; -} - -eOSState cMenuEditTranItem::ProcessKey(eKeys Key) -{ - *value = number; - eOSState state = cMenuEditChanItem::ProcessKey(Key); - number = *value; - cChannel *channel = Channels.GetByNumber(*value); - if (channel) - transponder = channel->Frequency(); - *value = transponder; - return state; -} - -// --- cMenuEditDayItem ------------------------------------------------------ - -class cMenuEditDayItem : public cMenuEditIntItem { -protected: - static int days[]; - int d; - virtual void Set(void); -public: - cMenuEditDayItem(const char *Name, int *Value); - virtual eOSState ProcessKey(eKeys Key); - }; - -int cMenuEditDayItem::days[] ={ cTimer::ParseDay("M------"), - cTimer::ParseDay("-T-----"), - cTimer::ParseDay("--W----"), - cTimer::ParseDay("---T---"), - cTimer::ParseDay("----F--"), - cTimer::ParseDay("-----S-"), - cTimer::ParseDay("------S"), - cTimer::ParseDay("MTWTF--"), - cTimer::ParseDay("MTWTFS-"), - cTimer::ParseDay("MTWTFSS"), - cTimer::ParseDay("-----SS"), - 0 }; - -cMenuEditDayItem::cMenuEditDayItem(const char *Name, int *Value) -:cMenuEditIntItem(Name, Value, -INT_MAX, 31) -{ - d = -1; - if (*value < 0) { - int n = 0; - while (days[n]) { - if (days[n] == *value) { - d = n; - break; - } - n++; - } - } - Set(); -} - -void cMenuEditDayItem::Set(void) -{ - SetValue(cTimer::PrintDay(*value)); -} - -eOSState cMenuEditDayItem::ProcessKey(eKeys Key) -{ - switch (Key) { - case kLeft|k_Repeat: - case kLeft: if (d > 0) - *value = days[--d]; - else if (d == 0) { - *value = 31; - d = -1; - } - else if (*value == 1) { - d = sizeof(days) / sizeof(int) - 2; - *value = days[d]; - } - else - return cMenuEditIntItem::ProcessKey(Key); - Set(); - break; - case kRight|k_Repeat: - case kRight: if (d >= 0) { - *value = days[++d]; - if (*value == 0) { - *value = 1; - d = -1; - } - } - else if (*value == 31) { - d = 0; - *value = days[d]; - } - else - return cMenuEditIntItem::ProcessKey(Key); - Set(); - break; - default : return cMenuEditIntItem::ProcessKey(Key); - } - return osContinue; -} - -// --- cMenuEditDateItem ----------------------------------------------------- - -class cMenuEditDateItem : public cMenuEditItem { -protected: - time_t *value; - virtual void Set(void); -public: - cMenuEditDateItem(const char *Name, time_t *Value); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuEditDateItem::cMenuEditDateItem(const char *Name, time_t *Value) -:cMenuEditItem(Name) -{ - value = Value; - Set(); -} - -void cMenuEditDateItem::Set(void) -{ -#define DATEBUFFERSIZE 32 - char buf[DATEBUFFERSIZE]; - if (*value) { - struct tm tm_r; - localtime_r(value, &tm_r); - strftime(buf, DATEBUFFERSIZE, "%Y-%m-%d ", &tm_r); - strcat(buf, WeekDayName(tm_r.tm_wday)); - } - else - *buf = 0; - SetValue(buf); -} - -eOSState cMenuEditDateItem::ProcessKey(eKeys Key) -{ - eOSState state = cMenuEditItem::ProcessKey(Key); - - if (state == osUnknown) { - if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly? - *value -= SECSINDAY; - if (*value < time(NULL)) - *value = 0; - } - else if (NORMALKEY(Key) == kRight) { - if (!*value) - *value = cTimer::SetTime(time(NULL), 0); - *value += SECSINDAY; - } - else - return state; - Set(); - state = osContinue; - } - return state; -} - -// --- cMenuEditTimeItem ----------------------------------------------------- - -class cMenuEditTimeItem : public cMenuEditItem { -protected: - int *value; - int hh, mm; - int pos; - virtual void Set(void); -public: - cMenuEditTimeItem(const char *Name, int *Value); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuEditTimeItem::cMenuEditTimeItem(const char *Name, int *Value) -:cMenuEditItem(Name) -{ - value = Value; - hh = *value / 100; - mm = *value % 100; - pos = 0; - Set(); -} - -void cMenuEditTimeItem::Set(void) -{ - char buf[10]; - switch (pos) { - case 1: snprintf(buf, sizeof(buf), "%01d-:--", hh / 10); break; - case 2: snprintf(buf, sizeof(buf), "%02d:--", hh); break; - case 3: snprintf(buf, sizeof(buf), "%02d:%01d-", hh, mm / 10); break; - default: snprintf(buf, sizeof(buf), "%02d:%02d", hh, mm); - } - SetValue(buf); -} - -eOSState cMenuEditTimeItem::ProcessKey(eKeys Key) -{ - eOSState state = cMenuEditItem::ProcessKey(Key); - - if (state == osUnknown) { - if (k0 <= Key && Key <= k9) { - if (fresh || pos > 3) { - pos = 0; - fresh = false; - } - int n = Key - k0; - switch (pos) { - case 0: if (n <= 2) { - hh = n * 10; - mm = 0; - pos++; - } - break; - case 1: if (hh + n <= 23) { - hh += n; - pos++; - } - break; - case 2: if (n <= 5) { - mm += n * 10; - pos++; - } - break; - case 3: if (mm + n <= 59) { - mm += n; - pos++; - } - break; - } - } - else if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly? - if (--mm < 0) { - mm = 59; - if (--hh < 0) - hh = 23; - } - fresh = true; - } - else if (NORMALKEY(Key) == kRight) { - if (++mm > 59) { - mm = 0; - if (++hh > 23) - hh = 0; - } - fresh = true; - } - else - return state; - *value = hh * 100 + mm; - Set(); - state = osContinue; - } - return state; -} - // --- cMenuEditCaItem ------------------------------------------------------- class cMenuEditCaItem : public cMenuEditIntItem { diff --git a/menuitems.c b/menuitems.c index 49874f11..45d2066d 100644 --- a/menuitems.c +++ b/menuitems.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menuitems.c 1.15 2004/02/24 12:38:43 kls Exp $ + * $Id: menuitems.c 1.16 2004/03/28 09:17:51 kls Exp $ */ #include "menuitems.h" @@ -555,6 +555,283 @@ eOSState cMenuTextItem::ProcessKey(eKeys Key) return osContinue; } +// --- cMenuEditChanItem ----------------------------------------------------- + +cMenuEditChanItem::cMenuEditChanItem(const char *Name, int *Value) +:cMenuEditIntItem(Name, Value, 1, Channels.MaxNumber()) +{ + Set(); +} + +void cMenuEditChanItem::Set(void) +{ + char buf[255]; + cChannel *channel = Channels.GetByNumber(*value); + snprintf(buf, sizeof(buf), "%d %s", *value, channel ? channel->Name() : ""); + SetValue(buf); +} + +eOSState cMenuEditChanItem::ProcessKey(eKeys Key) +{ + int delta = 1; + + switch (Key) { + case kLeft|k_Repeat: + case kLeft: delta = -1; + case kRight|k_Repeat: + case kRight: + { + cChannel *channel = Channels.GetByNumber(*value + delta, delta); + if (channel) { + *value = channel->Number(); + Set(); + } + } + break; + default : return cMenuEditIntItem::ProcessKey(Key); + } + return osContinue; +} + +// --- cMenuEditTranItem ----------------------------------------------------- + +cMenuEditTranItem::cMenuEditTranItem(const char *Name, int *Value) +:cMenuEditChanItem(Name, Value) +{ + number = 0; + transponder = *Value; + cChannel *channel = Channels.First(); + while (channel) { + if (!channel->GroupSep() && ISTRANSPONDER(channel->Frequency(), *Value)) { + number = channel->Number(); + break; + } + channel = (cChannel *)channel->Next(); + } + *Value = number; + Set(); + *Value = transponder; +} + +eOSState cMenuEditTranItem::ProcessKey(eKeys Key) +{ + *value = number; + eOSState state = cMenuEditChanItem::ProcessKey(Key); + number = *value; + cChannel *channel = Channels.GetByNumber(*value); + if (channel) + transponder = channel->Frequency(); + *value = transponder; + return state; +} + +// --- cMenuEditDayItem ------------------------------------------------------ + +int cMenuEditDayItem::days[] ={ cTimer::ParseDay("M------"), + cTimer::ParseDay("-T-----"), + cTimer::ParseDay("--W----"), + cTimer::ParseDay("---T---"), + cTimer::ParseDay("----F--"), + cTimer::ParseDay("-----S-"), + cTimer::ParseDay("------S"), + cTimer::ParseDay("MTWTF--"), + cTimer::ParseDay("MTWTFS-"), + cTimer::ParseDay("MTWTFSS"), + cTimer::ParseDay("-----SS"), + 0 }; + +cMenuEditDayItem::cMenuEditDayItem(const char *Name, int *Value) +:cMenuEditIntItem(Name, Value, -INT_MAX, 31) +{ + d = -1; + if (*value < 0) { + int n = 0; + while (days[n]) { + if (days[n] == *value) { + d = n; + break; + } + n++; + } + } + Set(); +} + +void cMenuEditDayItem::Set(void) +{ + SetValue(cTimer::PrintDay(*value)); +} + +eOSState cMenuEditDayItem::ProcessKey(eKeys Key) +{ + switch (Key) { + case kLeft|k_Repeat: + case kLeft: if (d > 0) + *value = days[--d]; + else if (d == 0) { + *value = 31; + d = -1; + } + else if (*value == 1) { + d = sizeof(days) / sizeof(int) - 2; + *value = days[d]; + } + else + return cMenuEditIntItem::ProcessKey(Key); + Set(); + break; + case kRight|k_Repeat: + case kRight: if (d >= 0) { + *value = days[++d]; + if (*value == 0) { + *value = 1; + d = -1; + } + } + else if (*value == 31) { + d = 0; + *value = days[d]; + } + else + return cMenuEditIntItem::ProcessKey(Key); + Set(); + break; + default : return cMenuEditIntItem::ProcessKey(Key); + } + return osContinue; +} + +// --- cMenuEditDateItem ----------------------------------------------------- + +cMenuEditDateItem::cMenuEditDateItem(const char *Name, time_t *Value) +:cMenuEditItem(Name) +{ + value = Value; + Set(); +} + +void cMenuEditDateItem::Set(void) +{ +#define DATEBUFFERSIZE 32 + char buf[DATEBUFFERSIZE]; + if (*value) { + struct tm tm_r; + localtime_r(value, &tm_r); + strftime(buf, DATEBUFFERSIZE, "%Y-%m-%d ", &tm_r); + strcat(buf, WeekDayName(tm_r.tm_wday)); + } + else + *buf = 0; + SetValue(buf); +} + +eOSState cMenuEditDateItem::ProcessKey(eKeys Key) +{ + eOSState state = cMenuEditItem::ProcessKey(Key); + + if (state == osUnknown) { + if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly? + *value -= SECSINDAY; + if (*value < time(NULL)) + *value = 0; + } + else if (NORMALKEY(Key) == kRight) { + if (!*value) + *value = cTimer::SetTime(time(NULL), 0); + *value += SECSINDAY; + } + else + return state; + Set(); + state = osContinue; + } + return state; +} + +// --- cMenuEditTimeItem ----------------------------------------------------- + +cMenuEditTimeItem::cMenuEditTimeItem(const char *Name, int *Value) +:cMenuEditItem(Name) +{ + value = Value; + hh = *value / 100; + mm = *value % 100; + pos = 0; + Set(); +} + +void cMenuEditTimeItem::Set(void) +{ + char buf[10]; + switch (pos) { + case 1: snprintf(buf, sizeof(buf), "%01d-:--", hh / 10); break; + case 2: snprintf(buf, sizeof(buf), "%02d:--", hh); break; + case 3: snprintf(buf, sizeof(buf), "%02d:%01d-", hh, mm / 10); break; + default: snprintf(buf, sizeof(buf), "%02d:%02d", hh, mm); + } + SetValue(buf); +} + +eOSState cMenuEditTimeItem::ProcessKey(eKeys Key) +{ + eOSState state = cMenuEditItem::ProcessKey(Key); + + if (state == osUnknown) { + if (k0 <= Key && Key <= k9) { + if (fresh || pos > 3) { + pos = 0; + fresh = false; + } + int n = Key - k0; + switch (pos) { + case 0: if (n <= 2) { + hh = n * 10; + mm = 0; + pos++; + } + break; + case 1: if (hh + n <= 23) { + hh += n; + pos++; + } + break; + case 2: if (n <= 5) { + mm += n * 10; + pos++; + } + break; + case 3: if (mm + n <= 59) { + mm += n; + pos++; + } + break; + } + } + else if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly? + if (--mm < 0) { + mm = 59; + if (--hh < 0) + hh = 23; + } + fresh = true; + } + else if (NORMALKEY(Key) == kRight) { + if (++mm > 59) { + mm = 0; + if (++hh > 23) + hh = 0; + } + fresh = true; + } + else + return state; + *value = hh * 100 + mm; + Set(); + state = osContinue; + } + return state; +} + // --- cMenuSetupPage -------------------------------------------------------- cMenuSetupPage::cMenuSetupPage(void) diff --git a/menuitems.h b/menuitems.h index 7091740d..04779dc0 100644 --- a/menuitems.h +++ b/menuitems.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menuitems.h 1.6 2004/02/24 11:55:14 kls Exp $ + * $Id: menuitems.h 1.7 2004/03/28 09:16:24 kls Exp $ */ #ifndef __MENUITEMS_H @@ -119,6 +119,53 @@ public: virtual eOSState ProcessKey(eKeys Key); }; +class cMenuEditChanItem : public cMenuEditIntItem { +protected: + virtual void Set(void); +public: + cMenuEditChanItem(const char *Name, int *Value); + virtual eOSState ProcessKey(eKeys Key); + }; + +class cMenuEditTranItem : public cMenuEditChanItem { +private: + int number; + int transponder; +public: + cMenuEditTranItem(const char *Name, int *Value); + virtual eOSState ProcessKey(eKeys Key); + }; + +class cMenuEditDayItem : public cMenuEditIntItem { +protected: + static int days[]; + int d; + virtual void Set(void); +public: + cMenuEditDayItem(const char *Name, int *Value); + virtual eOSState ProcessKey(eKeys Key); + }; + +class cMenuEditDateItem : public cMenuEditItem { +protected: + time_t *value; + virtual void Set(void); +public: + cMenuEditDateItem(const char *Name, time_t *Value); + virtual eOSState ProcessKey(eKeys Key); + }; + +class cMenuEditTimeItem : public cMenuEditItem { +protected: + int *value; + int hh, mm; + int pos; + virtual void Set(void); +public: + cMenuEditTimeItem(const char *Name, int *Value); + virtual eOSState ProcessKey(eKeys Key); + }; + class cPlugin; class cMenuSetupPage : public cOsdMenu {