summaryrefslogtreecommitdiff
path: root/menuitems.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2005-03-19 15:38:43 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2005-03-19 15:38:43 +0100
commitccc7c4a2d897f5e291a28d438a4fee9c6e45cd26 (patch)
tree995743cd01a2e133911b0ed4860085186dc781bd /menuitems.c
parentae5ee879d0b2fe661278be9337eeda88fd4c656f (diff)
downloadvdr-ccc7c4a2d897f5e291a28d438a4fee9c6e45cd26.tar.gz
vdr-ccc7c4a2d897f5e291a28d438a4fee9c6e45cd26.tar.bz2
The day of a timer is now stored as a full date in ISO notation
Diffstat (limited to 'menuitems.c')
-rw-r--r--menuitems.c202
1 files changed, 91 insertions, 111 deletions
diff --git a/menuitems.c b/menuitems.c
index 9b86db4b..18b001ee 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.21 2004/11/21 13:24:10 kls Exp $
+ * $Id: menuitems.c 1.22 2005/03/19 15:33:34 kls Exp $
*/
#include "menuitems.h"
@@ -535,117 +535,35 @@ eOSState cMenuEditTranItem::ProcessKey(eKeys Key)
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;
- md = 0;
- 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));
-}
+// --- cMenuEditDateItem -----------------------------------------------------
-eOSState cMenuEditDayItem::ProcessKey(eKeys Key)
+static int ParseWeekDays(const char *s)
{
- 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: {
- if (d >= 0) {
- if (k1 <= Key && Key <= k7) {
- int v = *value ^ (1 << (Key - k1));
- if ((v & 0xFF) != 0) {
- *value = v; // can't let this become all 0
- Set();
- }
- break;
- }
- }
- int v = *value;
- eOSState result = cMenuEditIntItem::ProcessKey(Key);
- if (result == osContinue && Key == k0) {
- if (d >= 0) {
- *value = md ? md : cTimer::GetMDay(time(NULL));
- md = 0;
- d = -1;
- Set();
- }
- else if (*value == 0 || *value == v) {
- md = v;
- d = cTimer::GetWDayFromMDay(v);
- *value = days[d];
- Set();
- }
- }
- return result;
- }
- }
- return osContinue;
+ time_t day;
+ int weekdays;
+ return cTimer::ParseDay(s, day, weekdays) ? weekdays : 0;
}
-// --- cMenuEditDateItem -----------------------------------------------------
+int cMenuEditDateItem::days[] = { ParseWeekDays("M------"),
+ ParseWeekDays("-T-----"),
+ ParseWeekDays("--W----"),
+ ParseWeekDays("---T---"),
+ ParseWeekDays("----F--"),
+ ParseWeekDays("-----S-"),
+ ParseWeekDays("------S"),
+ ParseWeekDays("MTWTF--"),
+ ParseWeekDays("MTWTFS-"),
+ ParseWeekDays("MTWTFSS"),
+ ParseWeekDays("-----SS"),
+ 0 };
-cMenuEditDateItem::cMenuEditDateItem(const char *Name, time_t *Value)
+cMenuEditDateItem::cMenuEditDateItem(const char *Name, time_t *Value, int *WeekDays)
:cMenuEditItem(Name)
{
value = Value;
+ weekdays = WeekDays;
+ oldvalue = 0;
+ dayindex = 0;
Set();
}
@@ -653,7 +571,11 @@ void cMenuEditDateItem::Set(void)
{
#define DATEBUFFERSIZE 32
char buf[DATEBUFFERSIZE];
- if (*value) {
+ if (weekdays && *weekdays) {
+ SetValue(cTimer::PrintDay(0, *weekdays));
+ return;
+ }
+ else if (*value) {
struct tm tm_r;
localtime_r(value, &tm_r);
strftime(buf, DATEBUFFERSIZE, "%Y-%m-%d ", &tm_r);
@@ -669,15 +591,73 @@ eOSState cMenuEditDateItem::ProcessKey(eKeys Key)
eOSState state = cMenuEditItem::ProcessKey(Key);
if (state == osUnknown) {
+ time_t now = time(NULL);
if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly?
- *value -= SECSINDAY;
- if (*value < time(NULL))
- *value = 0;
+ if (!weekdays || !*weekdays) {
+ // Decrement single day:
+ time_t v = *value;
+ v -= SECSINDAY;
+ if (v < now) {
+ if (now <= v + SECSINDAY) { // switched from tomorrow to today
+ if (!weekdays)
+ v = 0;
+ }
+ else if (weekdays) { // switched from today to yesterday, so enter weekdays mode
+ v = 0;
+ dayindex = sizeof(days) / sizeof(int) - 2;
+ *weekdays = days[dayindex];
+ }
+ else // don't go before today
+ v = *value;
+ }
+ *value = v;
+ }
+ else {
+ // Decrement weekday index:
+ if (dayindex > 0)
+ *weekdays = days[--dayindex];
+ }
}
else if (NORMALKEY(Key) == kRight) {
- if (!*value)
- *value = cTimer::SetTime(time(NULL), 0);
- *value += SECSINDAY;
+ if (!weekdays || !*weekdays) {
+ // Increment single day:
+ if (!*value)
+ *value = cTimer::SetTime(now, 0);
+ *value += SECSINDAY;
+ }
+ else {
+ // Increment weekday index:
+ *weekdays = days[++dayindex];
+ if (!*weekdays) { // was last weekday entry, so switch to today
+ *value = cTimer::SetTime(now, 0);
+ dayindex = 0;
+ }
+ }
+ }
+ else if (weekdays) {
+ if (Key == k0) {
+ // Toggle between weekdays and single day:
+ if (*weekdays) {
+ *value = cTimer::SetTime(oldvalue ? oldvalue : now, 0);
+ oldvalue = 0;
+ *weekdays = 0;
+ }
+ else {
+ *weekdays = days[cTimer::GetWDay(*value)];
+ oldvalue = *value;
+ *value = 0;
+ }
+ }
+ else if (k1 <= Key && Key <= k7) {
+ // Toggle individual weekdays:
+ if (*weekdays) {
+ int v = *weekdays ^ (1 << (Key - k1));
+ if (v != 0)
+ *weekdays = v; // can't let this become all 0
+ }
+ }
+ else
+ return state;
}
else
return state;