summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY2
-rw-r--r--menu.c326
-rw-r--r--menuitems.c279
-rw-r--r--menuitems.h49
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 {