]> git.neil.brown.name Git - freerunner.git/commitdiff
cal: add frequency and simplify creation.
authorNeilBrown <neilb@suse.de>
Tue, 8 Feb 2011 07:10:56 +0000 (18:10 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 8 Feb 2011 07:13:09 +0000 (18:13 +1100)
Use same sequence for 'new' as 'change'.
And allow freq of weekly or fortnightly to be chosen

Signed-off-by: NeilBrown <neilb@suse.de>
alarm/cal.c

index dccdce793e1c742882f261fb06028a824ce4031a..75e8de2427b1f5f4c8f7ac7ae580c924dc3929bc 100644 (file)
@@ -28,10 +28,12 @@ GtkWidget *window, *clockw, *cal, *reasonw, *timerw;
 GtkWidget *browse_buttons, *event_buttons, *move_buttons, *move_event;
 GtkWidget *timer_display, *time_display;
 GtkWidget *today_btn, *undelete_btn;
+GtkWidget *once_btn, *weekly_btn, *fort_btn, *freq_buttons;
 GtkWidget *timers_list;
 GtkTextBuffer *reason_buffer;
 time_t dlist[42], chosen_date;
 int prev_mday, hour, minute;
+int freq;
 
 struct event *evlist, *active_event;
 struct event *deleted_event;
@@ -229,16 +231,20 @@ void move_confirm(void)
        gtk_container_add(GTK_CONTAINER(window), clockw);
 }
 
+void update_freq(void);
 void events_move(void)
 {
        if (!active_event)
                return;
 
        moving = 1;
+       freq = active_event->recur;
        set_cal(active_event->when);
 
        gtk_widget_hide(event_buttons);
        gtk_widget_show(move_buttons);
+       update_freq();
+       gtk_widget_show(freq_buttons);
 
        gtk_widget_hide(alarm_selector->drawing);
        gtk_widget_show(move_event);
@@ -248,13 +254,23 @@ void events_move(void)
 
 void events_new(void)
 {
-       gtk_text_buffer_set_text(reason_buffer, "New Event", -1);
-       move_confirm();
+       moving = 2;
+       freq = 0;
+       gtk_widget_hide(event_buttons);
+       gtk_widget_hide(browse_buttons);
+       gtk_widget_show(move_buttons);
+       update_freq();
+       gtk_widget_show(freq_buttons);
+
+       gtk_widget_hide(alarm_selector->drawing);
+       gtk_widget_show(move_event);
+       gtk_text_buffer_set_text(reason_buffer, "", -1);
 }
 
 void move_abort(void)
 {
        gtk_widget_hide(move_buttons);
+       gtk_widget_hide(freq_buttons);
        if (active_event) {
                gtk_widget_hide(browse_buttons);
                gtk_widget_show(event_buttons);
@@ -291,10 +307,45 @@ void cal_restore(void)
        gtk_container_add(GTK_CONTAINER(window), cal);
 }
 
+void reason_confirm(void);
 void clock_confirm(void)
 {
        gtk_container_remove(GTK_CONTAINER(window), clockw);
        gtk_container_add(GTK_CONTAINER(window), reasonw);
+       reason_confirm();
+}
+
+void update_freq(void)
+{
+       if (freq == 0)
+               gtk_label_set_markup(GTK_LABEL(GTK_BIN(once_btn)->child), "<span background=\"pink\">Once</span>");
+       else
+               gtk_label_set_markup(GTK_LABEL(GTK_BIN(once_btn)->child), "Once");
+
+       if (freq == 7*24*3600)
+               gtk_label_set_markup(GTK_LABEL(GTK_BIN(weekly_btn)->child), "<span background=\"pink\">Weekly</span>");
+       else
+               gtk_label_set_markup(GTK_LABEL(GTK_BIN(weekly_btn)->child), "Weekly");
+
+       if (freq == 14*24*3600)
+               gtk_label_set_markup(GTK_LABEL(GTK_BIN(fort_btn)->child), "<span background=\"pink\">Fortnightly</span>");
+       else
+               gtk_label_set_markup(GTK_LABEL(GTK_BIN(fort_btn)->child), "Fortnightly");
+}
+void set_once(void)
+{
+       freq = 0;
+       update_freq();
+}
+void set_weekly(void)
+{
+       freq = 7 * 24 * 3600;
+       update_freq();
+}
+void set_fort(void)
+{
+       freq = 14 * 24 * 3600;
+       update_freq();
 }
 
 /********************************************************************/
@@ -516,7 +567,7 @@ struct list_entry *alarms_item(void *list, int n)
                tm = localtime(&chosen_date);
                today = *tm;
                for (i=0; ev ; i++, ev = ev->next) {
-                       char buf[50], o, c;
+                       char buf[50], o, c, r;
                        struct tm *tm = localtime(&ev->when);
                        if (tm->tm_mday == today.tm_mday &&
                            tm->tm_mon == today.tm_mon &&
@@ -535,9 +586,16 @@ struct list_entry *alarms_item(void *list, int n)
                                o = '(';
                                c = ')';
                        }
+                       if (ev->recur == 0)
+                               r = ' ';
+                       else if (ev->recur == 3600*24*7)
+                               r = '+'; /* weekly */
+                       else if (ev->recur == 3600*24*14)
+                               r = '*'; /* fortnightly */
+                       else
+                               r = '#'; /* other period */
                        asprintf(&alarm_entries[i].text, "%c%c %s %s%c",
-                                o,
-                                ev->recur ? '*' : ' ',
+                                o, r,
                                 buf, ev->mesg, c);
                        alarm_entries[i].bg = "white";
                        alarm_entries[i].fg = "blue";
@@ -726,15 +784,26 @@ GtkWidget *create_cal_window(void)
 
        move_buttons = blist;
 
+       blist = NULL;
+       once_btn = add_button(&blist, "Once", desc, set_once);
+       weekly_btn = add_button(&blist, "Weekly", desc, set_weekly);
+       fort_btn = add_button(&blist, "Fortnightly", desc, set_fort);
+       gtk_widget_hide(blist);
+       gtk_box_pack_end(GTK_BOX(v), blist, FALSE, FALSE, 0);
+       freq_buttons = blist;
+
        return v;
 }
 
 void set_cal(time_t then)
 {
-       struct tm now, first, *tm;
+       struct tm now, first, today, *tm;
        int d, x;
+       time_t today_s;
        char buf[400];
 
+       time(&today_s);
+       localtime_r(&today_s, &today);
        localtime_r(&then, &now);
 
        then -= now.tm_sec;
@@ -767,12 +836,18 @@ void set_cal(time_t then)
        }
 
        for (d=0; d<42; d++) {
-               char *bg = "", *fg = "black";
+               char *bg = "", *fg = "black", *today_fg = "blue";
 
-               if (tm->tm_mon != now.tm_mon)
-                       fg = "grey";
-               else if (tm->tm_mday == now.tm_mday)
+               if (tm->tm_mon != now.tm_mon) {
+                       fg = "grey"; today_fg = "pink";
+               else if (tm->tm_mday == now.tm_mday)
                        bg = "background=\"green\"";
+
+               if (tm->tm_year == today.tm_year &&
+                   tm->tm_mon == today.tm_mon &&
+                   tm->tm_mday == today.tm_mday)
+                       fg = today_fg;
+
                sprintf(buf, "<span %s foreground=\"%s\"> %02d </span>",
                        bg, fg, tm->tm_mday);
                if (abs(dlist[d] - then) > 48*3600 ||
@@ -944,13 +1019,13 @@ void reason_confirm(void)
 
        if (!active_event) {
                ev = malloc(sizeof(*ev));
-               ev->recur = 0;
                ev->next = evlist;
                evlist = ev;
        } else {
                ev = active_event;
                free(ev->mesg);
        }
+       ev->recur = freq;
        ev->when = ev->first = chosen_date + hour*3600 + minute*60;
        gtk_text_buffer_get_bounds(reason_buffer, &start, &finish);
        ev->mesg = gtk_text_buffer_get_text(reason_buffer,