diff options
Diffstat (limited to 'calendar')
-rw-r--r-- | calendar/ChangeLog | 40 | ||||
-rw-r--r-- | calendar/TODO | 29 | ||||
-rw-r--r-- | calendar/gnome-cal.c | 12 | ||||
-rw-r--r-- | calendar/gnome-cal.h | 3 | ||||
-rw-r--r-- | calendar/gnome-month-item.c | 144 | ||||
-rw-r--r-- | calendar/gnome-month-item.h | 6 | ||||
-rw-r--r-- | calendar/goto.c | 151 | ||||
-rw-r--r-- | calendar/gui/gnome-cal.c | 12 | ||||
-rw-r--r-- | calendar/gui/gnome-cal.h | 3 | ||||
-rw-r--r-- | calendar/gui/gnome-month-item.c | 144 | ||||
-rw-r--r-- | calendar/gui/gnome-month-item.h | 6 | ||||
-rw-r--r-- | calendar/gui/goto.c | 151 | ||||
-rw-r--r-- | calendar/gui/main.c | 46 | ||||
-rw-r--r-- | calendar/gui/main.h | 40 | ||||
-rw-r--r-- | calendar/gui/mark.c | 44 | ||||
-rw-r--r-- | calendar/gui/month-view.c | 14 | ||||
-rw-r--r-- | calendar/gui/month-view.h | 3 | ||||
-rw-r--r-- | calendar/gui/prop.c | 292 | ||||
-rw-r--r-- | calendar/gui/year-view.c | 21 | ||||
-rw-r--r-- | calendar/gui/year-view.h | 3 | ||||
-rw-r--r-- | calendar/main.c | 46 | ||||
-rw-r--r-- | calendar/main.h | 40 | ||||
-rw-r--r-- | calendar/mark.c | 44 | ||||
-rw-r--r-- | calendar/month-view.c | 14 | ||||
-rw-r--r-- | calendar/month-view.h | 3 | ||||
-rw-r--r-- | calendar/prop.c | 292 | ||||
-rw-r--r-- | calendar/year-view.c | 21 | ||||
-rw-r--r-- | calendar/year-view.h | 3 |
28 files changed, 1261 insertions, 366 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index e818feb341..22c0b96b1e 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,43 @@ +1998-09-03 Federico Mena Quintero <federico@nuclecu.unam.mx> + + * prop.c (create_colors_page): We can now configure the colors of + the monthly calendars! Wheeeeee! There are still some nits to be + fixed, which are listed in the TODO file. + (build_color_spec): New function to build color specifications. + (parse_color_spec): New function to parse color specifications. + + * mark.c: Modified all functions to use the configured colors. + * goto.c: Likewise. + + * main.c (colors_changed): New function that notifies all + calendars that colors have changed. + + * gnome-cal.c (gnome_calendar_colors_changed): New function that + notifies all the views that the colors have changed. + + * month-view.c (month_view_colors_changed): New function that + notifies the month view that colors have changed. + + * year-view.c (year_view_colors_changed): New function that + notifies the year view that colors have changed. + + * gnome-month-item.h (struct _GnomeMonthItem): Added fields for + outline and day box colors. + + * gnome-month-item.c (gnome_month_item_set_arg): Added + outline_color, outline_color_gdk, day_box_color, and + day_box_color_gdk arguments to month items. These are convenient + to quickly set the colors of the month item. + (gnome_month_item_get_arg): Likewise. + + * main.[ch]: Added a global array of structures for color preferences. + +1998-08-31 Federico Mena Quintero <federico@nuclecu.unam.mx> + + * goto.c: Small code cleanup. + (day_event): Upon receiving a LeaveNotify event, Reset the day's + background to the correct color. + 1998-08-29 Federico Mena Quintero <federico@nuclecu.unam.mx> * mark.[ch]: New files with utility functions to mark calendars diff --git a/calendar/TODO b/calendar/TODO index 7ea072b486..7b9e28c545 100644 --- a/calendar/TODO +++ b/calendar/TODO @@ -1,26 +1,19 @@ BUGS: -- Goto dialog: fix recoloring of marked days when a LeaveNotify event - is gotten for an item. - - Recurrence end date is wrong. An event that repeats daily will not be included in the ending date of the recurrence (off-by-one error?). -Month view: +General: -- Display little boxes for the appointments of each day. +- Color properties, highlight some days and such. -- Double click on a day takes you to the day view. +- Mark the current day in BOLD as well as different color (color blind users will need it). -- DnD of appointments to move them around. +- Write online help. Nice help. Lots of help. Year view: -- Use a generic mark_month() function to mark a GnomeMonthItem with - all the events that touch it. Pass a function to mark_month() that - actually does the marking (the year view and goto dialog just change - the color of the days with events; the month view does more - sophisticated layout). +- Prelight days on mouse enter/leave. Share that code with goto.c. - Double click on a day takes you to the day view. @@ -33,6 +26,14 @@ Year view: - See why it is so fucking slow. +Month view: + +- Display little boxes for the appointments of each day. + +- Double click on a day takes you to the day view. + +- DnD of appointments to move them around. + Week view: - Nice display as in the Palm Pilot. @@ -55,7 +56,3 @@ Event editor dialog: Gnome date selection widget: - Make the displayed date be localized properly -- use strftime(). - -General: - -- Write online help. Nice help. Lots of help. diff --git a/calendar/gnome-cal.c b/calendar/gnome-cal.c index cf9dbefcc7..9f34a6277a 100644 --- a/calendar/gnome-cal.c +++ b/calendar/gnome-cal.c @@ -440,3 +440,15 @@ gnome_calendar_time_format_changed (GnomeCalendar *gcal) month_view_time_format_changed (MONTH_VIEW (gcal->month_view)); year_view_time_format_changed (YEAR_VIEW (gcal->year_view)); } + +void +gnome_calendar_colors_changed (GnomeCalendar *gcal) +{ + g_return_if_fail (gcal != NULL); + g_return_if_fail (GNOME_IS_CALENDAR (gcal)); + + /* FIXME: add day and week view when they are done */ + + month_view_colors_changed (MONTH_VIEW (gcal->month_view)); + year_view_colors_changed (YEAR_VIEW (gcal->year_view)); +} diff --git a/calendar/gnome-cal.h b/calendar/gnome-cal.h index 186e90bc83..afe546be2d 100644 --- a/calendar/gnome-cal.h +++ b/calendar/gnome-cal.h @@ -67,6 +67,9 @@ void gnome_calendar_object_changed (GnomeCalendar *gcal, /* Notifies the calendar that the time format has changed and it must update all its views */ void gnome_calendar_time_format_changed (GnomeCalendar *gcal); +/* Notifies the calendar that the colors have changed and it must update all its views */ +void gnome_calendar_colors_changed (GnomeCalendar *gcal); + END_GNOME_DECLS diff --git a/calendar/gnome-month-item.c b/calendar/gnome-month-item.c index 289664e535..b1ef4925bf 100644 --- a/calendar/gnome-month-item.c +++ b/calendar/gnome-month-item.c @@ -62,6 +62,10 @@ enum { ARG_DAY_FONT_GDK, ARG_HEAD_COLOR, ARG_HEAD_COLOR_GDK, + ARG_OUTLINE_COLOR, + ARG_OUTLINE_COLOR_GDK, + ARG_DAY_BOX_COLOR, + ARG_DAY_BOX_COLOR_GDK, ARG_DAY_COLOR, ARG_DAY_COLOR_GDK }; @@ -136,6 +140,10 @@ gnome_month_item_class_init (GnomeMonthItemClass *class) gtk_object_add_arg_type ("GnomeMonthItem::day_font_gdk", GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE, ARG_DAY_FONT_GDK); gtk_object_add_arg_type ("GnomeMonthItem::heading_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_HEAD_COLOR); gtk_object_add_arg_type ("GnomeMonthItem::heading_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_HEAD_COLOR_GDK); + gtk_object_add_arg_type ("GnomeMonthItem::outline_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_OUTLINE_COLOR); + gtk_object_add_arg_type ("GnomeMonthItem::outline_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_OUTLINE_COLOR_GDK); + gtk_object_add_arg_type ("GnomeMonthItem::day_box_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_DAY_BOX_COLOR); + gtk_object_add_arg_type ("GnomeMonthItem::day_box_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_DAY_BOX_COLOR_GDK); gtk_object_add_arg_type ("GnomeMonthItem::day_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_DAY_COLOR); gtk_object_add_arg_type ("GnomeMonthItem::day_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_DAY_COLOR_GDK); @@ -302,19 +310,26 @@ set_head_font (GnomeMonthItem *mitem) NULL); } -/* Sets the color for all the day headings */ +/* Sets the color for all the headings */ static void set_head_color (GnomeMonthItem *mitem) { int i; - GdkColor color; + GdkColor outline; + GdkColor head; - color.pixel = mitem->head_pixel; + outline.pixel = mitem->outline_pixel; + head.pixel = mitem->head_pixel; + + for (i = 0; i < 7; i++) { + gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_BOX + i], + "fill_color_gdk", &outline, + NULL); - for (i = 0; i < 7; i++) gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_LABEL + i], - "fill_color_gdk", &color, + "fill_color_gdk", &head, NULL); + } } /* Creates the items for the day name headings */ @@ -336,7 +351,6 @@ create_headings (GnomeMonthItem *mitem) mitem->items[GNOME_MONTH_ITEM_HEAD_BOX + i] = gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[GNOME_MONTH_ITEM_HEAD_GROUP + i]), gnome_canvas_rect_get_type (), - "fill_color", "black", NULL); /* Label */ @@ -491,19 +505,29 @@ set_day_font (GnomeMonthItem *mitem) NULL); } -/* Sets the color for all the day numbers */ +/* Sets the color for all the day items */ static void set_day_color (GnomeMonthItem *mitem) { int i; - GdkColor color; + GdkColor outline; + GdkColor day_box; + GdkColor day; - color.pixel = mitem->day_pixel; + outline.pixel = mitem->outline_pixel; + day_box.pixel = mitem->day_box_pixel; + day.pixel = mitem->day_pixel; + + for (i = 0; i < 42; i++) { + gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_BOX + i], + "outline_color_gdk", &outline, + "fill_color_gdk", &day_box, + NULL); - for (i = 0; i < 42; i++) gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i], - "fill_color_gdk", &color, + "fill_color_gdk", &day, NULL); + } } /* Creates the items for the days */ @@ -525,8 +549,6 @@ create_days (GnomeMonthItem *mitem) mitem->items[GNOME_MONTH_ITEM_DAY_BOX + i] = gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[GNOME_MONTH_ITEM_DAY_GROUP + i]), gnome_canvas_rect_get_type (), - "outline_color", "black", - "fill_color", "#d6d6d6d6d6d6", NULL); /* Label */ @@ -643,8 +665,10 @@ gnome_month_item_construct (GnomeMonthItem *mitem) gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, "#d6d6d6d6d6d6", &color); mitem->head_pixel = color.pixel; + mitem->day_box_pixel = color.pixel; gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, "black", &color); + mitem->outline_pixel = color.pixel; mitem->day_pixel = color.pixel; create_items (mitem); @@ -733,13 +757,36 @@ reanchor (GnomeMonthItem *mitem) NULL); } +/* Sets the color of the specified pixel value to that of the specified argument, which must be in + * GdkColor format if format is TRUE, otherwise it must be in string format. + */ +static void +set_color_arg (GnomeMonthItem *mitem, gulong *pixel, GtkArg *arg, int gdk_format, int set_head, int set_day) +{ + GdkColor color; + + if (gdk_format) + *pixel = ((GdkColor *) GTK_VALUE_BOXED (*arg))->pixel; + else { + if (gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, GTK_VALUE_STRING (*arg), &color)) + *pixel = color.pixel; + else + *pixel = 0; + } + + if (set_head) + set_head_color (mitem); + + if (set_day) + set_day_color (mitem); +} + static void gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) { GnomeMonthItem *mitem; char **day_names; int i; - GdkColor color; mitem = GNOME_MONTH_ITEM (object); @@ -873,31 +920,35 @@ gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) break; case ARG_HEAD_COLOR: - if (gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, GTK_VALUE_STRING (*arg), &color)) - mitem->head_pixel = color.pixel; - else - mitem->head_pixel = 0; - - set_head_color (mitem); + set_color_arg (mitem, &mitem->head_pixel, arg, FALSE, TRUE, FALSE); break; case ARG_HEAD_COLOR_GDK: - mitem->head_pixel = ((GdkColor *) GTK_VALUE_BOXED (*arg))->pixel; - set_head_color (mitem); + set_color_arg (mitem, &mitem->head_pixel, arg, TRUE, TRUE, FALSE); break; - case ARG_DAY_COLOR: - if (gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, GTK_VALUE_STRING (*arg), &color)) - mitem->day_pixel = color.pixel; - else - mitem->day_pixel = 0; + case ARG_OUTLINE_COLOR: + set_color_arg (mitem, &mitem->outline_pixel, arg, FALSE, TRUE, TRUE); + break; - set_day_color (mitem); + case ARG_OUTLINE_COLOR_GDK: + set_color_arg (mitem, &mitem->outline_pixel, arg, TRUE, TRUE, TRUE); + break; + + case ARG_DAY_BOX_COLOR: + set_color_arg (mitem, &mitem->day_box_pixel, arg, FALSE, FALSE, TRUE); + break; + + case ARG_DAY_BOX_COLOR_GDK: + set_color_arg (mitem, &mitem->day_box_pixel, arg, TRUE, FALSE, TRUE); + break; + + case ARG_DAY_COLOR: + set_color_arg (mitem, &mitem->day_pixel, arg, FALSE, FALSE, TRUE); break; case ARG_DAY_COLOR_GDK: - mitem->day_pixel = ((GdkColor *) GTK_VALUE_BOXED (*arg))->pixel; - set_day_color (mitem); + set_color_arg (mitem, &mitem->day_pixel, arg, TRUE, FALSE, TRUE); break; default: @@ -905,11 +956,24 @@ gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) } } +/* Allocates a GdkColor structure filled with the specified pixel, and puts it into the specified + * arg for returning it in the get_arg method. + */ +static void +get_color_arg (GnomeMonthItem *mitem, gulong pixel, GtkArg *arg) +{ + GdkColor *color; + + color = g_new (GdkColor, 1); + color->pixel = pixel; + gdk_color_context_query_color (GNOME_CANVAS_ITEM (mitem)->canvas->cc, color); + GTK_VALUE_BOXED (*arg) = color; +} + static void gnome_month_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) { GnomeMonthItem *mitem; - GdkColor *color; mitem = GNOME_MONTH_ITEM (object); @@ -975,17 +1039,19 @@ gnome_month_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) break; case ARG_HEAD_COLOR_GDK: - color = g_new (GdkColor, 1); - color->pixel = mitem->head_pixel; - gdk_color_context_query_color (GNOME_CANVAS_ITEM (mitem)->canvas->cc, color); - GTK_VALUE_BOXED (*arg) = color; + get_color_arg (mitem, mitem->head_pixel, arg); + break; + + case ARG_OUTLINE_COLOR_GDK: + get_color_arg (mitem, mitem->outline_pixel, arg); + break; + + case ARG_DAY_BOX_COLOR_GDK: + get_color_arg (mitem, mitem->day_box_pixel, arg); break; case ARG_DAY_COLOR_GDK: - color = g_new (GdkColor, 1); - color->pixel = mitem->day_pixel; - gdk_color_context_query_color (GNOME_CANVAS_ITEM (mitem)->canvas->cc, color); - GTK_VALUE_BOXED (*arg) = color; + get_color_arg (mitem, mitem->day_pixel, arg); break; default: diff --git a/calendar/gnome-month-item.h b/calendar/gnome-month-item.h index d117aa85b5..f529d1724c 100644 --- a/calendar/gnome-month-item.h +++ b/calendar/gnome-month-item.h @@ -72,6 +72,10 @@ typedef enum { * day_font_gdk GdkFont * RW Pointer to GdkFont for the day numbers * heading_color string W X color specification for heading labels * heading_color_gdk GdkColor * RW Pointer to an allocated GdkColor for heading labels + * outline_color string W X color specification for outline (lines and fill of heading boxes) + * outline_color_gdk GdkColor * RW Pointer to an allocated GdkColor for outline + * day_box_color string W X color specification for day boxes + * day_box_color_gdk GdkColor * RW Pointer to an allocated GdkColor for day boxes * day_color string W X color specification for day number labels * day_color_gdk GdkColor * RW Pointer to an allocated GdkColor for day number labels */ @@ -112,6 +116,8 @@ struct _GnomeMonthItem { GdkFont *day_font; /* Font for the day numbers */ gulong head_pixel; /* Color for heading labels */ + gulong outline_pixel; /* Color for the outline (lines and heading boxes) */ + gulong day_box_pixel; /* Color for the day boxes */ gulong day_pixel; /* Color for day number labels */ int start_on_monday : 1; /* Start the week on Monday? If false, then start from Sunday */ diff --git a/calendar/goto.c b/calendar/goto.c index c312189ce7..16fada2f5b 100644 --- a/calendar/goto.c +++ b/calendar/goto.c @@ -14,35 +14,55 @@ #include "timeutil.h" +static GtkWidget *goto_win; /* The goto dialog window */ +static GnomeCanvasItem *month_item; /* The month item in the dialog */ +static GnomeCalendar *gnome_calendar; /* The gnome calendar the dialog refers to */ +static gulong day_pixels[42]; /* Colors of the day backgrounds */ + + /* Updates the specified month item by marking it appropriately from the calendar the dialog refers * to. */ static void -update (GnomeMonthItem *mitem, GtkWidget *dialog) +update (void) { - GnomeCalendar *gcal; + int i; + GnomeCanvasItem *item; + GtkArg arg; + GdkColor *c; + + /* First, mark the days */ + + unmark_month_item (GNOME_MONTH_ITEM (month_item)); + mark_month_item (GNOME_MONTH_ITEM (month_item), gnome_calendar->cal); + + /* Now save the colors of the day backgrounds */ + + for (i = 0; i < 42; i++) { + arg.name = "fill_color_gdk"; - gcal = GNOME_CALENDAR (gtk_object_get_data (GTK_OBJECT (dialog), "gnome_calendar")); + item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), + GNOME_MONTH_ITEM_DAY_BOX + i); + gtk_object_getv (GTK_OBJECT (item), 1, &arg); - unmark_month_item (mitem); - mark_month_item (mitem, gcal->cal); + c = GTK_VALUE_BOXED (arg); + day_pixels[i] = c->pixel; + g_free (c); + } } /* Callback used when the year adjustment is changed */ static void -year_changed (GtkAdjustment *adj, GtkWidget *dialog) +year_changed (GtkAdjustment *adj, gpointer data) { - GnomeCanvasItem *mitem; - - mitem = gtk_object_get_data (GTK_OBJECT (dialog), "month_item"); - gnome_canvas_item_set (mitem, + gnome_canvas_item_set (month_item, "year", (int) adj->value, NULL); - update (GNOME_MONTH_ITEM (mitem), dialog); + update (); } /* Creates the year control with its adjustment */ static GtkWidget * -create_year (GtkWidget *dialog, GnomeCalendar *gcal, int year) +create_year (int year) { GtkWidget *hbox; GtkAdjustment *adj; @@ -57,7 +77,7 @@ create_year (GtkWidget *dialog, GnomeCalendar *gcal, int year) adj = GTK_ADJUSTMENT (gtk_adjustment_new (year, 1900, 9999, 1, 10, 10)); gtk_signal_connect (GTK_OBJECT (adj), "value_changed", (GtkSignalFunc) year_changed, - dialog); + NULL); w = gtk_spin_button_new (adj, 1.0, 0); gtk_widget_set_usize (w, 60, 0); @@ -71,23 +91,18 @@ create_year (GtkWidget *dialog, GnomeCalendar *gcal, int year) static void month_toggled (GtkToggleButton *toggle, gpointer data) { - GtkWidget *dialog; - GnomeCanvasItem *mitem; - if (!toggle->active) return; - dialog = gtk_object_get_user_data (GTK_OBJECT (toggle)); - mitem = gtk_object_get_data (GTK_OBJECT (dialog), "month_item"); - gnome_canvas_item_set (mitem, + gnome_canvas_item_set (month_item, "month", GPOINTER_TO_INT (data), NULL); - update (GNOME_MONTH_ITEM (mitem), dialog); + update (); } /* Creates the months control */ static GtkWidget * -create_months (GtkWidget *dialog, GnomeCalendar *gcal, int month) +create_months (int month) { GtkWidget *table; GtkWidget *w; @@ -96,7 +111,7 @@ create_months (GtkWidget *dialog, GnomeCalendar *gcal, int month) struct tm tm; char buf[100]; - tm = *localtime (&gcal->current_display); + tm = *localtime (&gnome_calendar->current_display); table = gtk_table_new (2, 6, TRUE); @@ -111,7 +126,6 @@ create_months (GtkWidget *dialog, GnomeCalendar *gcal, int month) w = gtk_radio_button_new (group); group = gtk_radio_button_group (GTK_RADIO_BUTTON (w)); - gtk_object_set_user_data (GTK_OBJECT (w), dialog); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (w), FALSE); gtk_container_add (GTK_CONTAINER (w), gtk_label_new (buf)); @@ -136,9 +150,9 @@ create_months (GtkWidget *dialog, GnomeCalendar *gcal, int month) /* Sets the scrolling region of the canvas to the allocation size */ static void -set_scroll_region (GtkWidget *widget, GtkAllocation *allocation, gpointer data) +set_scroll_region (GtkWidget *widget, GtkAllocation *allocation) { - gnome_canvas_item_set (data, + gnome_canvas_item_set (month_item, "width", (double) (allocation->width - 1), "height", (double) (allocation->height - 1), NULL); @@ -155,18 +169,14 @@ set_scroll_region (GtkWidget *widget, GtkAllocation *allocation, gpointer data) static gint day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) { - GtkWidget *dialog; - GnomeCalendar *gcal; - GnomeMonthItem *mitem; GnomeCanvasItem *box; int child_num, day; + GdkColor color; - dialog = GTK_WIDGET (data); - gcal = gtk_object_get_data (GTK_OBJECT (dialog), "gnome_calendar"); - mitem = gtk_object_get_data (GTK_OBJECT (dialog), "month_item"); + child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (month_item), item); + day = gnome_month_item_num2day (GNOME_MONTH_ITEM (month_item), child_num); - child_num = gnome_month_item_child2num (mitem, item); - day = gnome_month_item_num2day (mitem, child_num); + child_num -= GNOME_MONTH_ITEM_DAY_GROUP; if (day == 0) return FALSE; @@ -174,22 +184,27 @@ day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) switch (event->type) { case GDK_BUTTON_PRESS: if ((event->button.button == 1) && (day != 0)) { - gnome_calendar_goto (gcal, time_from_day (mitem->year, mitem->month, day)); - gtk_widget_destroy (dialog); + gnome_calendar_goto (gnome_calendar, + time_from_day (GNOME_MONTH_ITEM (month_item)->year, + GNOME_MONTH_ITEM (month_item)->month, day)); + gtk_widget_destroy (goto_win); } break; case GDK_ENTER_NOTIFY: - box = gnome_month_item_num2child (mitem, child_num - GNOME_MONTH_ITEM_DAY_GROUP + GNOME_MONTH_ITEM_DAY_BOX); + box = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), + child_num + GNOME_MONTH_ITEM_DAY_BOX); gnome_canvas_item_set (box, - "fill_color", "#ea60ea60ea60", + "fill_color", color_spec_from_prop (COLOR_PROP_PRELIGHT_DAY_BG), NULL); break; case GDK_LEAVE_NOTIFY: - box = gnome_month_item_num2child (mitem, child_num - GNOME_MONTH_ITEM_DAY_GROUP + GNOME_MONTH_ITEM_DAY_BOX); + box = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), + child_num + GNOME_MONTH_ITEM_DAY_BOX); + color.pixel = day_pixels[child_num]; gnome_canvas_item_set (box, - "fill_color", "#d6d6d6d6d6d6", + "fill_color_gdk", &color, NULL); break; @@ -202,26 +217,22 @@ day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) /* Creates the canvas with the month item for selecting days */ static GtkWidget * -create_days (GtkWidget *dialog, GnomeCalendar *gcal, int day, int month, int year) +create_days (int day, int month, int year) { GtkWidget *canvas; - GnomeCanvasItem *mitem; int i; GnomeCanvasItem *day_group; canvas = gnome_canvas_new (); gnome_canvas_set_size (GNOME_CANVAS (canvas), 150, 120); - mitem = gnome_month_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (canvas)->root)); - gnome_canvas_item_set (mitem, + month_item = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (canvas))); + gnome_canvas_item_set (month_item, "month", month, "year", year, "start_on_monday", week_starts_on_monday, - "heading_color", "white", NULL); - update (GNOME_MONTH_ITEM (mitem), dialog); - - gtk_object_set_data (GTK_OBJECT (dialog), "month_item", mitem); + update (); /* Connect to size_allocate so that we can change the size of the month item and the * scrolling region appropriately. @@ -229,15 +240,15 @@ create_days (GtkWidget *dialog, GnomeCalendar *gcal, int day, int month, int yea gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate", (GtkSignalFunc) set_scroll_region, - mitem); + NULL); /* Bind the day groups to our event handler */ for (i = 0; i < 42; i++) { - day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), i + GNOME_MONTH_ITEM_DAY_GROUP); + day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), i + GNOME_MONTH_ITEM_DAY_GROUP); gtk_signal_connect (GTK_OBJECT (day_group), "event", (GtkSignalFunc) day_event, - dialog); + NULL); } return canvas; @@ -246,34 +257,28 @@ create_days (GtkWidget *dialog, GnomeCalendar *gcal, int day, int month, int yea static void goto_today (GtkWidget *widget, gpointer data) { - GtkWidget *dialog; - GnomeCalendar *gcal; - - dialog = GTK_WIDGET (data); - gcal = gtk_object_get_data (GTK_OBJECT (dialog), "gnome_calendar"); - - gnome_calendar_goto_today (gcal); - gtk_widget_destroy (dialog); + gnome_calendar_goto_today (gnome_calendar); + gtk_widget_destroy (goto_win); } /* Creates a "goto date" dialog and runs it */ void goto_dialog (GnomeCalendar *gcal) { - GtkWidget *dialog; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *w; struct tm *tm; - tm = localtime (&gcal->current_display); + gnome_calendar = gcal; + + tm = localtime (&gnome_calendar->current_display); - dialog = gnome_dialog_new (_("Go to date"), - GNOME_STOCK_BUTTON_CANCEL, - NULL); - gtk_object_set_data (GTK_OBJECT (dialog), "gnome_calendar", gcal); + goto_win = gnome_dialog_new (_("Go to date"), + GNOME_STOCK_BUTTON_CANCEL, + NULL); - vbox = GNOME_DIALOG (dialog)->vbox; + vbox = GNOME_DIALOG (goto_win)->vbox; /* Instructions */ @@ -287,19 +292,19 @@ goto_dialog (GnomeCalendar *gcal) /* Year */ - w = create_year (dialog, gcal, tm->tm_year + 1900); + w = create_year (tm->tm_year + 1900); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); gtk_widget_show (w); /* Month */ - w = create_months (dialog, gcal, tm->tm_mon); + w = create_months (tm->tm_mon); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); gtk_widget_show (w); /* Days (canvas with month item) */ - w = create_days (dialog, gcal, tm->tm_mday, tm->tm_mon, tm->tm_year + 1900); + w = create_days (tm->tm_mday, tm->tm_mon, tm->tm_year + 1900); gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0); gtk_widget_show (w); @@ -312,14 +317,14 @@ goto_dialog (GnomeCalendar *gcal) w = gtk_button_new_with_label (_("Go to today")); gtk_signal_connect (GTK_OBJECT (w), "clicked", (GtkSignalFunc) goto_today, - dialog); + NULL); gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0); gtk_widget_show (w); /* Run! */ - gnome_dialog_set_modal (GNOME_DIALOG (dialog)); - gnome_dialog_set_close (GNOME_DIALOG (dialog), TRUE); - gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (gcal)); - gtk_widget_show (dialog); + gnome_dialog_set_modal (GNOME_DIALOG (goto_win)); + gnome_dialog_set_close (GNOME_DIALOG (goto_win), TRUE); + gnome_dialog_set_parent (GNOME_DIALOG (goto_win), GTK_WINDOW (gnome_calendar)); + gtk_widget_show (goto_win); } diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index cf9dbefcc7..9f34a6277a 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -440,3 +440,15 @@ gnome_calendar_time_format_changed (GnomeCalendar *gcal) month_view_time_format_changed (MONTH_VIEW (gcal->month_view)); year_view_time_format_changed (YEAR_VIEW (gcal->year_view)); } + +void +gnome_calendar_colors_changed (GnomeCalendar *gcal) +{ + g_return_if_fail (gcal != NULL); + g_return_if_fail (GNOME_IS_CALENDAR (gcal)); + + /* FIXME: add day and week view when they are done */ + + month_view_colors_changed (MONTH_VIEW (gcal->month_view)); + year_view_colors_changed (YEAR_VIEW (gcal->year_view)); +} diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h index 186e90bc83..afe546be2d 100644 --- a/calendar/gui/gnome-cal.h +++ b/calendar/gui/gnome-cal.h @@ -67,6 +67,9 @@ void gnome_calendar_object_changed (GnomeCalendar *gcal, /* Notifies the calendar that the time format has changed and it must update all its views */ void gnome_calendar_time_format_changed (GnomeCalendar *gcal); +/* Notifies the calendar that the colors have changed and it must update all its views */ +void gnome_calendar_colors_changed (GnomeCalendar *gcal); + END_GNOME_DECLS diff --git a/calendar/gui/gnome-month-item.c b/calendar/gui/gnome-month-item.c index 289664e535..b1ef4925bf 100644 --- a/calendar/gui/gnome-month-item.c +++ b/calendar/gui/gnome-month-item.c @@ -62,6 +62,10 @@ enum { ARG_DAY_FONT_GDK, ARG_HEAD_COLOR, ARG_HEAD_COLOR_GDK, + ARG_OUTLINE_COLOR, + ARG_OUTLINE_COLOR_GDK, + ARG_DAY_BOX_COLOR, + ARG_DAY_BOX_COLOR_GDK, ARG_DAY_COLOR, ARG_DAY_COLOR_GDK }; @@ -136,6 +140,10 @@ gnome_month_item_class_init (GnomeMonthItemClass *class) gtk_object_add_arg_type ("GnomeMonthItem::day_font_gdk", GTK_TYPE_GDK_FONT, GTK_ARG_READWRITE, ARG_DAY_FONT_GDK); gtk_object_add_arg_type ("GnomeMonthItem::heading_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_HEAD_COLOR); gtk_object_add_arg_type ("GnomeMonthItem::heading_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_HEAD_COLOR_GDK); + gtk_object_add_arg_type ("GnomeMonthItem::outline_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_OUTLINE_COLOR); + gtk_object_add_arg_type ("GnomeMonthItem::outline_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_OUTLINE_COLOR_GDK); + gtk_object_add_arg_type ("GnomeMonthItem::day_box_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_DAY_BOX_COLOR); + gtk_object_add_arg_type ("GnomeMonthItem::day_box_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_DAY_BOX_COLOR_GDK); gtk_object_add_arg_type ("GnomeMonthItem::day_color", GTK_TYPE_STRING, GTK_ARG_WRITABLE, ARG_DAY_COLOR); gtk_object_add_arg_type ("GnomeMonthItem::day_color_gdk", GTK_TYPE_GDK_COLOR, GTK_ARG_READWRITE, ARG_DAY_COLOR_GDK); @@ -302,19 +310,26 @@ set_head_font (GnomeMonthItem *mitem) NULL); } -/* Sets the color for all the day headings */ +/* Sets the color for all the headings */ static void set_head_color (GnomeMonthItem *mitem) { int i; - GdkColor color; + GdkColor outline; + GdkColor head; - color.pixel = mitem->head_pixel; + outline.pixel = mitem->outline_pixel; + head.pixel = mitem->head_pixel; + + for (i = 0; i < 7; i++) { + gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_BOX + i], + "fill_color_gdk", &outline, + NULL); - for (i = 0; i < 7; i++) gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_HEAD_LABEL + i], - "fill_color_gdk", &color, + "fill_color_gdk", &head, NULL); + } } /* Creates the items for the day name headings */ @@ -336,7 +351,6 @@ create_headings (GnomeMonthItem *mitem) mitem->items[GNOME_MONTH_ITEM_HEAD_BOX + i] = gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[GNOME_MONTH_ITEM_HEAD_GROUP + i]), gnome_canvas_rect_get_type (), - "fill_color", "black", NULL); /* Label */ @@ -491,19 +505,29 @@ set_day_font (GnomeMonthItem *mitem) NULL); } -/* Sets the color for all the day numbers */ +/* Sets the color for all the day items */ static void set_day_color (GnomeMonthItem *mitem) { int i; - GdkColor color; + GdkColor outline; + GdkColor day_box; + GdkColor day; - color.pixel = mitem->day_pixel; + outline.pixel = mitem->outline_pixel; + day_box.pixel = mitem->day_box_pixel; + day.pixel = mitem->day_pixel; + + for (i = 0; i < 42; i++) { + gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_BOX + i], + "outline_color_gdk", &outline, + "fill_color_gdk", &day_box, + NULL); - for (i = 0; i < 42; i++) gnome_canvas_item_set (mitem->items[GNOME_MONTH_ITEM_DAY_LABEL + i], - "fill_color_gdk", &color, + "fill_color_gdk", &day, NULL); + } } /* Creates the items for the days */ @@ -525,8 +549,6 @@ create_days (GnomeMonthItem *mitem) mitem->items[GNOME_MONTH_ITEM_DAY_BOX + i] = gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[GNOME_MONTH_ITEM_DAY_GROUP + i]), gnome_canvas_rect_get_type (), - "outline_color", "black", - "fill_color", "#d6d6d6d6d6d6", NULL); /* Label */ @@ -643,8 +665,10 @@ gnome_month_item_construct (GnomeMonthItem *mitem) gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, "#d6d6d6d6d6d6", &color); mitem->head_pixel = color.pixel; + mitem->day_box_pixel = color.pixel; gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, "black", &color); + mitem->outline_pixel = color.pixel; mitem->day_pixel = color.pixel; create_items (mitem); @@ -733,13 +757,36 @@ reanchor (GnomeMonthItem *mitem) NULL); } +/* Sets the color of the specified pixel value to that of the specified argument, which must be in + * GdkColor format if format is TRUE, otherwise it must be in string format. + */ +static void +set_color_arg (GnomeMonthItem *mitem, gulong *pixel, GtkArg *arg, int gdk_format, int set_head, int set_day) +{ + GdkColor color; + + if (gdk_format) + *pixel = ((GdkColor *) GTK_VALUE_BOXED (*arg))->pixel; + else { + if (gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, GTK_VALUE_STRING (*arg), &color)) + *pixel = color.pixel; + else + *pixel = 0; + } + + if (set_head) + set_head_color (mitem); + + if (set_day) + set_day_color (mitem); +} + static void gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) { GnomeMonthItem *mitem; char **day_names; int i; - GdkColor color; mitem = GNOME_MONTH_ITEM (object); @@ -873,31 +920,35 @@ gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) break; case ARG_HEAD_COLOR: - if (gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, GTK_VALUE_STRING (*arg), &color)) - mitem->head_pixel = color.pixel; - else - mitem->head_pixel = 0; - - set_head_color (mitem); + set_color_arg (mitem, &mitem->head_pixel, arg, FALSE, TRUE, FALSE); break; case ARG_HEAD_COLOR_GDK: - mitem->head_pixel = ((GdkColor *) GTK_VALUE_BOXED (*arg))->pixel; - set_head_color (mitem); + set_color_arg (mitem, &mitem->head_pixel, arg, TRUE, TRUE, FALSE); break; - case ARG_DAY_COLOR: - if (gnome_canvas_get_color (GNOME_CANVAS_ITEM (mitem)->canvas, GTK_VALUE_STRING (*arg), &color)) - mitem->day_pixel = color.pixel; - else - mitem->day_pixel = 0; + case ARG_OUTLINE_COLOR: + set_color_arg (mitem, &mitem->outline_pixel, arg, FALSE, TRUE, TRUE); + break; - set_day_color (mitem); + case ARG_OUTLINE_COLOR_GDK: + set_color_arg (mitem, &mitem->outline_pixel, arg, TRUE, TRUE, TRUE); + break; + + case ARG_DAY_BOX_COLOR: + set_color_arg (mitem, &mitem->day_box_pixel, arg, FALSE, FALSE, TRUE); + break; + + case ARG_DAY_BOX_COLOR_GDK: + set_color_arg (mitem, &mitem->day_box_pixel, arg, TRUE, FALSE, TRUE); + break; + + case ARG_DAY_COLOR: + set_color_arg (mitem, &mitem->day_pixel, arg, FALSE, FALSE, TRUE); break; case ARG_DAY_COLOR_GDK: - mitem->day_pixel = ((GdkColor *) GTK_VALUE_BOXED (*arg))->pixel; - set_day_color (mitem); + set_color_arg (mitem, &mitem->day_pixel, arg, TRUE, FALSE, TRUE); break; default: @@ -905,11 +956,24 @@ gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) } } +/* Allocates a GdkColor structure filled with the specified pixel, and puts it into the specified + * arg for returning it in the get_arg method. + */ +static void +get_color_arg (GnomeMonthItem *mitem, gulong pixel, GtkArg *arg) +{ + GdkColor *color; + + color = g_new (GdkColor, 1); + color->pixel = pixel; + gdk_color_context_query_color (GNOME_CANVAS_ITEM (mitem)->canvas->cc, color); + GTK_VALUE_BOXED (*arg) = color; +} + static void gnome_month_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) { GnomeMonthItem *mitem; - GdkColor *color; mitem = GNOME_MONTH_ITEM (object); @@ -975,17 +1039,19 @@ gnome_month_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) break; case ARG_HEAD_COLOR_GDK: - color = g_new (GdkColor, 1); - color->pixel = mitem->head_pixel; - gdk_color_context_query_color (GNOME_CANVAS_ITEM (mitem)->canvas->cc, color); - GTK_VALUE_BOXED (*arg) = color; + get_color_arg (mitem, mitem->head_pixel, arg); + break; + + case ARG_OUTLINE_COLOR_GDK: + get_color_arg (mitem, mitem->outline_pixel, arg); + break; + + case ARG_DAY_BOX_COLOR_GDK: + get_color_arg (mitem, mitem->day_box_pixel, arg); break; case ARG_DAY_COLOR_GDK: - color = g_new (GdkColor, 1); - color->pixel = mitem->day_pixel; - gdk_color_context_query_color (GNOME_CANVAS_ITEM (mitem)->canvas->cc, color); - GTK_VALUE_BOXED (*arg) = color; + get_color_arg (mitem, mitem->day_pixel, arg); break; default: diff --git a/calendar/gui/gnome-month-item.h b/calendar/gui/gnome-month-item.h index d117aa85b5..f529d1724c 100644 --- a/calendar/gui/gnome-month-item.h +++ b/calendar/gui/gnome-month-item.h @@ -72,6 +72,10 @@ typedef enum { * day_font_gdk GdkFont * RW Pointer to GdkFont for the day numbers * heading_color string W X color specification for heading labels * heading_color_gdk GdkColor * RW Pointer to an allocated GdkColor for heading labels + * outline_color string W X color specification for outline (lines and fill of heading boxes) + * outline_color_gdk GdkColor * RW Pointer to an allocated GdkColor for outline + * day_box_color string W X color specification for day boxes + * day_box_color_gdk GdkColor * RW Pointer to an allocated GdkColor for day boxes * day_color string W X color specification for day number labels * day_color_gdk GdkColor * RW Pointer to an allocated GdkColor for day number labels */ @@ -112,6 +116,8 @@ struct _GnomeMonthItem { GdkFont *day_font; /* Font for the day numbers */ gulong head_pixel; /* Color for heading labels */ + gulong outline_pixel; /* Color for the outline (lines and heading boxes) */ + gulong day_box_pixel; /* Color for the day boxes */ gulong day_pixel; /* Color for day number labels */ int start_on_monday : 1; /* Start the week on Monday? If false, then start from Sunday */ diff --git a/calendar/gui/goto.c b/calendar/gui/goto.c index c312189ce7..16fada2f5b 100644 --- a/calendar/gui/goto.c +++ b/calendar/gui/goto.c @@ -14,35 +14,55 @@ #include "timeutil.h" +static GtkWidget *goto_win; /* The goto dialog window */ +static GnomeCanvasItem *month_item; /* The month item in the dialog */ +static GnomeCalendar *gnome_calendar; /* The gnome calendar the dialog refers to */ +static gulong day_pixels[42]; /* Colors of the day backgrounds */ + + /* Updates the specified month item by marking it appropriately from the calendar the dialog refers * to. */ static void -update (GnomeMonthItem *mitem, GtkWidget *dialog) +update (void) { - GnomeCalendar *gcal; + int i; + GnomeCanvasItem *item; + GtkArg arg; + GdkColor *c; + + /* First, mark the days */ + + unmark_month_item (GNOME_MONTH_ITEM (month_item)); + mark_month_item (GNOME_MONTH_ITEM (month_item), gnome_calendar->cal); + + /* Now save the colors of the day backgrounds */ + + for (i = 0; i < 42; i++) { + arg.name = "fill_color_gdk"; - gcal = GNOME_CALENDAR (gtk_object_get_data (GTK_OBJECT (dialog), "gnome_calendar")); + item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), + GNOME_MONTH_ITEM_DAY_BOX + i); + gtk_object_getv (GTK_OBJECT (item), 1, &arg); - unmark_month_item (mitem); - mark_month_item (mitem, gcal->cal); + c = GTK_VALUE_BOXED (arg); + day_pixels[i] = c->pixel; + g_free (c); + } } /* Callback used when the year adjustment is changed */ static void -year_changed (GtkAdjustment *adj, GtkWidget *dialog) +year_changed (GtkAdjustment *adj, gpointer data) { - GnomeCanvasItem *mitem; - - mitem = gtk_object_get_data (GTK_OBJECT (dialog), "month_item"); - gnome_canvas_item_set (mitem, + gnome_canvas_item_set (month_item, "year", (int) adj->value, NULL); - update (GNOME_MONTH_ITEM (mitem), dialog); + update (); } /* Creates the year control with its adjustment */ static GtkWidget * -create_year (GtkWidget *dialog, GnomeCalendar *gcal, int year) +create_year (int year) { GtkWidget *hbox; GtkAdjustment *adj; @@ -57,7 +77,7 @@ create_year (GtkWidget *dialog, GnomeCalendar *gcal, int year) adj = GTK_ADJUSTMENT (gtk_adjustment_new (year, 1900, 9999, 1, 10, 10)); gtk_signal_connect (GTK_OBJECT (adj), "value_changed", (GtkSignalFunc) year_changed, - dialog); + NULL); w = gtk_spin_button_new (adj, 1.0, 0); gtk_widget_set_usize (w, 60, 0); @@ -71,23 +91,18 @@ create_year (GtkWidget *dialog, GnomeCalendar *gcal, int year) static void month_toggled (GtkToggleButton *toggle, gpointer data) { - GtkWidget *dialog; - GnomeCanvasItem *mitem; - if (!toggle->active) return; - dialog = gtk_object_get_user_data (GTK_OBJECT (toggle)); - mitem = gtk_object_get_data (GTK_OBJECT (dialog), "month_item"); - gnome_canvas_item_set (mitem, + gnome_canvas_item_set (month_item, "month", GPOINTER_TO_INT (data), NULL); - update (GNOME_MONTH_ITEM (mitem), dialog); + update (); } /* Creates the months control */ static GtkWidget * -create_months (GtkWidget *dialog, GnomeCalendar *gcal, int month) +create_months (int month) { GtkWidget *table; GtkWidget *w; @@ -96,7 +111,7 @@ create_months (GtkWidget *dialog, GnomeCalendar *gcal, int month) struct tm tm; char buf[100]; - tm = *localtime (&gcal->current_display); + tm = *localtime (&gnome_calendar->current_display); table = gtk_table_new (2, 6, TRUE); @@ -111,7 +126,6 @@ create_months (GtkWidget *dialog, GnomeCalendar *gcal, int month) w = gtk_radio_button_new (group); group = gtk_radio_button_group (GTK_RADIO_BUTTON (w)); - gtk_object_set_user_data (GTK_OBJECT (w), dialog); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (w), FALSE); gtk_container_add (GTK_CONTAINER (w), gtk_label_new (buf)); @@ -136,9 +150,9 @@ create_months (GtkWidget *dialog, GnomeCalendar *gcal, int month) /* Sets the scrolling region of the canvas to the allocation size */ static void -set_scroll_region (GtkWidget *widget, GtkAllocation *allocation, gpointer data) +set_scroll_region (GtkWidget *widget, GtkAllocation *allocation) { - gnome_canvas_item_set (data, + gnome_canvas_item_set (month_item, "width", (double) (allocation->width - 1), "height", (double) (allocation->height - 1), NULL); @@ -155,18 +169,14 @@ set_scroll_region (GtkWidget *widget, GtkAllocation *allocation, gpointer data) static gint day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) { - GtkWidget *dialog; - GnomeCalendar *gcal; - GnomeMonthItem *mitem; GnomeCanvasItem *box; int child_num, day; + GdkColor color; - dialog = GTK_WIDGET (data); - gcal = gtk_object_get_data (GTK_OBJECT (dialog), "gnome_calendar"); - mitem = gtk_object_get_data (GTK_OBJECT (dialog), "month_item"); + child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (month_item), item); + day = gnome_month_item_num2day (GNOME_MONTH_ITEM (month_item), child_num); - child_num = gnome_month_item_child2num (mitem, item); - day = gnome_month_item_num2day (mitem, child_num); + child_num -= GNOME_MONTH_ITEM_DAY_GROUP; if (day == 0) return FALSE; @@ -174,22 +184,27 @@ day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) switch (event->type) { case GDK_BUTTON_PRESS: if ((event->button.button == 1) && (day != 0)) { - gnome_calendar_goto (gcal, time_from_day (mitem->year, mitem->month, day)); - gtk_widget_destroy (dialog); + gnome_calendar_goto (gnome_calendar, + time_from_day (GNOME_MONTH_ITEM (month_item)->year, + GNOME_MONTH_ITEM (month_item)->month, day)); + gtk_widget_destroy (goto_win); } break; case GDK_ENTER_NOTIFY: - box = gnome_month_item_num2child (mitem, child_num - GNOME_MONTH_ITEM_DAY_GROUP + GNOME_MONTH_ITEM_DAY_BOX); + box = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), + child_num + GNOME_MONTH_ITEM_DAY_BOX); gnome_canvas_item_set (box, - "fill_color", "#ea60ea60ea60", + "fill_color", color_spec_from_prop (COLOR_PROP_PRELIGHT_DAY_BG), NULL); break; case GDK_LEAVE_NOTIFY: - box = gnome_month_item_num2child (mitem, child_num - GNOME_MONTH_ITEM_DAY_GROUP + GNOME_MONTH_ITEM_DAY_BOX); + box = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), + child_num + GNOME_MONTH_ITEM_DAY_BOX); + color.pixel = day_pixels[child_num]; gnome_canvas_item_set (box, - "fill_color", "#d6d6d6d6d6d6", + "fill_color_gdk", &color, NULL); break; @@ -202,26 +217,22 @@ day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) /* Creates the canvas with the month item for selecting days */ static GtkWidget * -create_days (GtkWidget *dialog, GnomeCalendar *gcal, int day, int month, int year) +create_days (int day, int month, int year) { GtkWidget *canvas; - GnomeCanvasItem *mitem; int i; GnomeCanvasItem *day_group; canvas = gnome_canvas_new (); gnome_canvas_set_size (GNOME_CANVAS (canvas), 150, 120); - mitem = gnome_month_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (canvas)->root)); - gnome_canvas_item_set (mitem, + month_item = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (canvas))); + gnome_canvas_item_set (month_item, "month", month, "year", year, "start_on_monday", week_starts_on_monday, - "heading_color", "white", NULL); - update (GNOME_MONTH_ITEM (mitem), dialog); - - gtk_object_set_data (GTK_OBJECT (dialog), "month_item", mitem); + update (); /* Connect to size_allocate so that we can change the size of the month item and the * scrolling region appropriately. @@ -229,15 +240,15 @@ create_days (GtkWidget *dialog, GnomeCalendar *gcal, int day, int month, int yea gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate", (GtkSignalFunc) set_scroll_region, - mitem); + NULL); /* Bind the day groups to our event handler */ for (i = 0; i < 42; i++) { - day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), i + GNOME_MONTH_ITEM_DAY_GROUP); + day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), i + GNOME_MONTH_ITEM_DAY_GROUP); gtk_signal_connect (GTK_OBJECT (day_group), "event", (GtkSignalFunc) day_event, - dialog); + NULL); } return canvas; @@ -246,34 +257,28 @@ create_days (GtkWidget *dialog, GnomeCalendar *gcal, int day, int month, int yea static void goto_today (GtkWidget *widget, gpointer data) { - GtkWidget *dialog; - GnomeCalendar *gcal; - - dialog = GTK_WIDGET (data); - gcal = gtk_object_get_data (GTK_OBJECT (dialog), "gnome_calendar"); - - gnome_calendar_goto_today (gcal); - gtk_widget_destroy (dialog); + gnome_calendar_goto_today (gnome_calendar); + gtk_widget_destroy (goto_win); } /* Creates a "goto date" dialog and runs it */ void goto_dialog (GnomeCalendar *gcal) { - GtkWidget *dialog; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *w; struct tm *tm; - tm = localtime (&gcal->current_display); + gnome_calendar = gcal; + + tm = localtime (&gnome_calendar->current_display); - dialog = gnome_dialog_new (_("Go to date"), - GNOME_STOCK_BUTTON_CANCEL, - NULL); - gtk_object_set_data (GTK_OBJECT (dialog), "gnome_calendar", gcal); + goto_win = gnome_dialog_new (_("Go to date"), + GNOME_STOCK_BUTTON_CANCEL, + NULL); - vbox = GNOME_DIALOG (dialog)->vbox; + vbox = GNOME_DIALOG (goto_win)->vbox; /* Instructions */ @@ -287,19 +292,19 @@ goto_dialog (GnomeCalendar *gcal) /* Year */ - w = create_year (dialog, gcal, tm->tm_year + 1900); + w = create_year (tm->tm_year + 1900); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); gtk_widget_show (w); /* Month */ - w = create_months (dialog, gcal, tm->tm_mon); + w = create_months (tm->tm_mon); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); gtk_widget_show (w); /* Days (canvas with month item) */ - w = create_days (dialog, gcal, tm->tm_mday, tm->tm_mon, tm->tm_year + 1900); + w = create_days (tm->tm_mday, tm->tm_mon, tm->tm_year + 1900); gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0); gtk_widget_show (w); @@ -312,14 +317,14 @@ goto_dialog (GnomeCalendar *gcal) w = gtk_button_new_with_label (_("Go to today")); gtk_signal_connect (GTK_OBJECT (w), "clicked", (GtkSignalFunc) goto_today, - dialog); + NULL); gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0); gtk_widget_show (w); /* Run! */ - gnome_dialog_set_modal (GNOME_DIALOG (dialog)); - gnome_dialog_set_close (GNOME_DIALOG (dialog), TRUE); - gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (gcal)); - gtk_widget_show (dialog); + gnome_dialog_set_modal (GNOME_DIALOG (goto_win)); + gnome_dialog_set_close (GNOME_DIALOG (goto_win), TRUE); + gnome_dialog_set_parent (GNOME_DIALOG (goto_win), GTK_WINDOW (gnome_calendar)); + gtk_widget_show (goto_win); } diff --git a/calendar/gui/main.c b/calendar/gui/main.c index 066aac783c..5ccdeee3ff 100644 --- a/calendar/gui/main.c +++ b/calendar/gui/main.c @@ -42,7 +42,20 @@ int day_begin, day_end; /* Whether weeks starts on Sunday or Monday */ int week_starts_on_monday; -/* Number of calendars active */ +/* The array of color properties -- keep in sync with the enumeration defined in main.h. The color + * values specified here are the defaults for the program. + */ +struct color_prop color_props[] = { + { 0x0000, 0x0000, 0x0000, "Outline:", "/calendar/Colors/outline" }, + { 0xffff, 0xffff, 0xffff, "Headings:", "/calendar/Colors/headings" }, + { 0xd6d6, 0xd6d6, 0xd6d6, "Empty days:", "/calendar/Colors/empty_bg" }, + { 0xd2d2, 0xb4b4, 0x8c8c, "Appointment days:", "/calendar/Colors/mark_bg" }, + { 0xea60, 0xea60, 0xea60, "Highlighted day:", "/calendar/Colors/prelight_bg" }, + { 0x0000, 0x0000, 0x0000, "Day numbers:", "/calendar/Colors/day_fg" }, + { 0x0000, 0x0000, 0xffff, "Current day's number:", "/calendar/Colors/current_fg" } +}; + +/* Number of active calendars */ int active_calendars = 0; /* A list of all of the calendars started */ @@ -105,10 +118,17 @@ range_check_hour (int hour) static void init_calendar (void) { + int i; + char *cspec, *color; + char *str; + init_username (); user_calendar_file = g_concat_dir_and_file (gnome_util_user_home (), ".gnome/user-cal.vcf"); gnome_config_push_prefix (calendar_settings); + + /* Read calendar settings */ + day_begin = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day start=8")); day_end = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day end=17")); am_pm_flag = gnome_config_get_bool ("/calendar/Calendar/AM PM flag=0"); @@ -119,6 +139,21 @@ init_calendar (void) day_end = 17; } + /* Read color settings */ + + for (i = 0; i < COLOR_PROP_LAST; i++) { + cspec = build_color_spec (color_props[i].r, color_props[i].g, color_props[i].b); + str = g_copy_strings (color_props[i].key, "=", cspec, NULL); + + color = gnome_config_get_string (str); + parse_color_spec (color, &color_props[i].r, &color_props[i].g, &color_props[i].b); + + g_free (str); + g_free (color); + } + + /* Done */ + gnome_config_pop_prefix (); } @@ -197,6 +232,15 @@ time_format_changed (void) gnome_calendar_time_format_changed (GNOME_CALENDAR (l->data)); } +void +colors_changed (void) +{ + GList *l; + + for (l = all_calendars; l; l = l->next) + gnome_calendar_colors_changed (GNOME_CALENDAR (l->data)); +} + static void quit_cmd (void) { diff --git a/calendar/gui/main.h b/calendar/gui/main.h index 6f22f946f9..5cd0d1c5c4 100644 --- a/calendar/gui/main.h +++ b/calendar/gui/main.h @@ -1,13 +1,36 @@ #ifndef MAIN_H #define MAIN_H -/* Global preferences */ +/* Calendar preferences */ extern int day_begin, day_end; extern char *user_name; extern int am_pm_flag; extern int week_starts_on_monday; +/* This enum and the following array define the color preferences */ + +enum { + COLOR_PROP_OUTLINE_COLOR, /* Color of calendar outline */ + COLOR_PROP_HEADING_COLOR, /* Color for headings */ + COLOR_PROP_EMPTY_DAY_BG, /* Background color for empty days */ + COLOR_PROP_MARK_DAY_BG, /* Background color for days with appointments */ + COLOR_PROP_PRELIGHT_DAY_BG, /* Background color for prelighted day */ + COLOR_PROP_DAY_FG, /* Color for day numbers */ + COLOR_PROP_CURRENT_DAY_FG, /* Color for current day's number */ + COLOR_PROP_LAST /* Number of color properties */ +}; + +struct color_prop { + int r; /* Values are in [0, 65535] */ + int g; + int b; + char *label; /* Label for properties dialog */ + char *key; /* Key for gnome_config */ +}; + +extern struct color_prop color_props[]; + /* Creates and runs the preferences dialog box */ void properties (void); @@ -16,7 +39,22 @@ void properties (void); */ void time_format_changed (void); +/* Asks for all the month items' colors to be reset */ +void colors_changed (void); + /* Creates and runs the Go-to date dialog */ void goto_dialog (GnomeCalendar *gcal); +/* Returns a pointer to a statically-allocated string with a representation of the specified color. + * Values must be in [0, 65535]. + */ +char *build_color_spec (int r, int g, int b); + +/* Parses a color specification of the form "#%04x%04x%04x" and returns the color components. */ +void parse_color_spec (char *spec, int *r, int *g, int *b); + +/* Calls build_color_spec() for the color in the specified property number */ +char *color_spec_from_prop (int propnum); + + #endif diff --git a/calendar/gui/mark.c b/calendar/gui/mark.c index b1c6df8fa3..6aab8b1b74 100644 --- a/calendar/gui/mark.c +++ b/calendar/gui/mark.c @@ -6,6 +6,8 @@ */ #include <config.h> +#include "gnome-cal.h" +#include "main.h" #include "mark.h" #include "timeutil.h" @@ -34,14 +36,7 @@ mark_event_in_month (GnomeMonthItem *mitem, time_t start, time_t end) item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + day_index); gnome_canvas_item_set (item, - "fill_color", "tan", - NULL); - - /* Mark the day label */ - - item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_LABEL + day_index); - gnome_canvas_item_set (item, - "fill_color", "black", + "fill_color", color_spec_from_prop (COLOR_PROP_MARK_DAY_BG), NULL); /* Next day */ @@ -65,7 +60,7 @@ mark_current_day (GnomeMonthItem *mitem) day_index = gnome_month_item_day2index (mitem, tm->tm_mday); item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_LABEL + day_index); gnome_canvas_item_set (item, - "fill_color", "blue", + "fill_color", color_spec_from_prop (COLOR_PROP_CURRENT_DAY_FG), NULL); } } @@ -98,25 +93,26 @@ mark_month_item (GnomeMonthItem *mitem, Calendar *cal) void unmark_month_item (GnomeMonthItem *mitem) { - int i; - GnomeCanvasItem *item; - g_return_if_fail (mitem != NULL); g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem)); - for (i = 0; i < 42; i++) { - /* Box */ + /* We have to do this in several calls to gnome_canvas_item_set(), as color_spec_from_prop() + * returns a pointer to a static string -- and we need several values. + */ - item = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_BOX + i); - gnome_canvas_item_set (item, - "fill_color", "#d6d6d6d6d6d6", - NULL); + gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem), + "heading_color", color_spec_from_prop (COLOR_PROP_HEADING_COLOR), + NULL); - /* Label */ + gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem), + "outline_color", color_spec_from_prop (COLOR_PROP_OUTLINE_COLOR), + NULL); - item = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_LABEL + i); - gnome_canvas_item_set (item, - "fill_color", "black", - NULL); - } + gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem), + "day_box_color", color_spec_from_prop (COLOR_PROP_EMPTY_DAY_BG), + NULL); + + gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem), + "day_color", color_spec_from_prop (COLOR_PROP_DAY_FG), + NULL); } diff --git a/calendar/gui/month-view.c b/calendar/gui/month-view.c index 16e6c72e8a..4d1a9bf967 100644 --- a/calendar/gui/month-view.c +++ b/calendar/gui/month-view.c @@ -66,7 +66,7 @@ month_view_init (MonthView *mv) { /* Title */ - mv->title = gnome_canvas_item_new (GNOME_CANVAS_GROUP (mv->canvas.root), + mv->title = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (mv)), gnome_canvas_text_get_type (), "anchor", GTK_ANCHOR_N, "font", "-*-helvetica-bold-r-normal--18-*-*-*-p-*-iso8859-1", @@ -75,7 +75,7 @@ month_view_init (MonthView *mv) /* Month item */ - mv->mitem = gnome_month_item_new (GNOME_CANVAS_GROUP (mv->canvas.root)); + mv->mitem = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (mv))); gnome_canvas_item_set (mv->mitem, "x", 0.0, "anchor", GTK_ANCHOR_NW, @@ -205,3 +205,13 @@ month_view_time_format_changed (MonthView *mv) /* FIXME: update events */ } + +void +month_view_colors_changed (MonthView *mv) +{ + g_return_if_fail (mv != NULL); + g_return_if_fail (IS_MONTH_VIEW (mv)); + + unmark_month_item (mv->mitem); + /* FIXME */ +} diff --git a/calendar/gui/month-view.h b/calendar/gui/month-view.h index a164332f98..70476c82f2 100644 --- a/calendar/gui/month-view.h +++ b/calendar/gui/month-view.h @@ -55,6 +55,9 @@ void month_view_set (MonthView *mv, time_t month); /* Notifies the month view that the time format has changed */ void month_view_time_format_changed (MonthView *mv); +/* Notifies the month view that the colors have changed */ +void month_view_colors_changed (MonthView *mv); + END_GNOME_DECLS diff --git a/calendar/gui/prop.c b/calendar/gui/prop.c index 709d321229..bdc8c9e937 100644 --- a/calendar/gui/prop.c +++ b/calendar/gui/prop.c @@ -10,8 +10,18 @@ #include <gnome.h> #include "gnome-cal.h" #include "main.h" +#include "gnome-month-item.h" + +/* These specify the page numbers in the preferences notebook */ +enum { + PROP_TIME_DISPLAY, + PROP_COLORS +}; static GtkWidget *prop_win; /* The preferences dialog */ + +/* Widgets for the time display page */ + static GtkWidget *time_format_12; /* Radio button for 12-hour format */ static GtkWidget *time_format_24; /* Radio button for 24-hour format */ static GtkWidget *start_on_sunday; /* Check button for weeks starting on Sunday */ @@ -21,6 +31,12 @@ static GtkWidget *end_omenu; /* Option menu for end of day */ static GtkWidget *start_items[24]; /* Menu items for start of day menu */ static GtkWidget *end_items[24]; /* Menu items for end of day menu */ +/* Widgets for the colors page */ + +static GtkWidget *color_pickers[COLOR_PROP_LAST]; +static GnomeCanvasItem *month_item; + + /* Callback used when the property box is closed -- just sets the prop_win variable to null. */ static int prop_cancel (void) @@ -39,13 +55,10 @@ get_active_index (GtkWidget *menu) return GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (active))); } -/* Callback used when the Apply button is clicked. */ +/* Applies the settings in the time display page */ static void -prop_apply (GtkWidget *w, int page) +prop_apply_time_display (void) { - if (page != -1) - return; - /* Day begin/end */ day_begin = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu))); @@ -67,16 +80,57 @@ prop_apply (GtkWidget *w, int page) time_format_changed (); } +/* Applies the settings in the colors page */ +static void +prop_apply_colors (void) +{ + int i; + char *cspec; + + for (i = 0; i < COLOR_PROP_LAST; i++) { + gnome_color_picker_get_i16 (GNOME_COLOR_PICKER (color_pickers[i]), + &color_props[i].r, &color_props[i].g, &color_props[i].b, NULL); + + cspec = build_color_spec (color_props[i].r, color_props[i].g, color_props[i].b); + gnome_config_set_string (color_props[i].key, cspec); + } + + gnome_config_sync (); + colors_changed (); +} + +/* Callback used when the Apply button is clicked. */ +static void +prop_apply (GtkWidget *w, int page) +{ + switch (page) { + case PROP_TIME_DISPLAY: + prop_apply_time_display (); + break; + + case PROP_COLORS: + prop_apply_colors (); + break; + + case -1: + break; + + default: + g_warning ("We have a loose penguin!"); + g_assert_not_reached (); + } +} + /* Notifies the property box that the data has changed */ static void -toggled (GtkWidget *widget, gpointer data) +prop_changed (void) { gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win)); } /* Builds and returns a two-element radio button group surrounded by a frame. The radio buttons are * stored in the specified variables, and the first radio button's state is set according to the - * specified flag value. The buttons are connected to the toggled() function to update the property + * specified flag value. The buttons are connected to the prop_changed() function to update the property * box's dirty state. */ static GtkWidget * @@ -90,7 +144,7 @@ build_two_radio_group (char *title, frame = gtk_frame_new (title); - vbox = gtk_vbox_new (TRUE, 0); + vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (frame), vbox); *radio_1_widget = gtk_radio_button_new_with_label (NULL, radio_1_title); @@ -104,7 +158,7 @@ build_two_radio_group (char *title, gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (*radio_2_widget), !radio_1_value); gtk_signal_connect (GTK_OBJECT (*radio_1_widget), "toggled", - (GtkSignalFunc) toggled, + (GtkSignalFunc) prop_changed, NULL); return frame; @@ -174,40 +228,35 @@ build_hours_menu (GtkWidget **items, int active) return omenu; } -/* Creates and displays the preferences dialog for the whole application */ -void -properties (void) +/* Creates the time display page in the preferences dialog */ +static void +create_time_display_page (void) { - GtkWidget *hbox; + GtkWidget *table; GtkWidget *vbox; GtkWidget *frame; GtkWidget *hbox2; GtkWidget *hbox3; GtkWidget *w; - if (prop_win) - return; - - /* Main window and hbox for property page */ - - prop_win = gnome_property_box_new (); - gtk_window_set_title (GTK_WINDOW (prop_win), _("Preferences")); - - hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); - gtk_container_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL); - gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), hbox, + table = gtk_table_new (2, 2, FALSE); + gtk_container_border_width (GTK_CONTAINER (table), GNOME_PAD_SMALL); + gtk_table_set_row_spacings (GTK_TABLE (table), GNOME_PAD_SMALL); + gtk_table_set_col_spacings (GTK_TABLE (table), GNOME_PAD_SMALL); + gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), table, gtk_label_new (_("Time display"))); /* Time format */ - vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); - gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); - w = build_two_radio_group (_("Time format"), _("12-hour (AM/PM)"), &time_format_12, _("24-hour"), &time_format_24, am_pm_flag); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); + gtk_table_attach (GTK_TABLE (table), w, + 0, 1, 0, 1, + GTK_EXPAND | GTK_FILL, + GTK_EXPAND | GTK_FILL, + 0, 0); /* Weeks start on */ @@ -215,12 +264,20 @@ properties (void) _("Sunday"), &start_on_sunday, _("Monday"), &start_on_monday, !week_starts_on_monday); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); + gtk_table_attach (GTK_TABLE (table), w, + 0, 1, 1, 2, + GTK_EXPAND | GTK_FILL, + GTK_EXPAND | GTK_FILL, + 0, 0); /* Day range */ frame = gtk_frame_new (_("Day range")); - gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + gtk_table_attach (GTK_TABLE (table), frame, + 1, 2, 0, 2, + GTK_EXPAND | GTK_FILL, + GTK_EXPAND | GTK_FILL, + 0, 0); vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); gtk_container_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL); @@ -258,9 +315,152 @@ properties (void) end_omenu = build_hours_menu (end_items, day_end); gtk_box_pack_start (GTK_BOX (hbox3), end_omenu, FALSE, FALSE, 0); +} + +/* Called when the canvas for the month item is size allocated. We use this to change the canvas' + * scrolling region and the month item's size. + */ +static void +canvas_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data) +{ + gnome_canvas_item_set (month_item, + "width", (double) (allocation->width - 1), + "height", (double) (allocation->height - 1), + NULL); + + gnome_canvas_set_scroll_region (GNOME_CANVAS (widget), + 0, 0, + allocation->width, allocation->height); +} + +/* Returns a color spec based on the color pickers */ +static char * +color_spec_from_picker (int num) +{ + int r, g, b; + + gnome_color_picker_get_i16 (GNOME_COLOR_PICKER (color_pickers[num]), &r, &g, &b, NULL); - /* Done! */ + return build_color_spec (r, g, b); +} + +/* Sets the colors of the month item to the current prerences */ +static void +reconfigure_month (void) +{ + /* We have to do this in two calls to gnome_canvas_item_set(), as color_spec_from_picker() + * returns a pointer to a static string -- and we need two values. + */ + + gnome_canvas_item_set (month_item, + "heading_color", color_spec_from_picker (COLOR_PROP_HEADING_COLOR), + NULL); + + gnome_canvas_item_set (month_item, + "outline_color", color_spec_from_picker (COLOR_PROP_OUTLINE_COLOR), + NULL); + + /* FIXME: set the rest of the colors -- simulate marking of the month item, set the + * current day, etc. The following is incorrect. + */ + + gnome_canvas_item_set (month_item, + "day_box_color", color_spec_from_picker (COLOR_PROP_EMPTY_DAY_BG), + NULL); + + gnome_canvas_item_set (month_item, + "day_color", color_spec_from_picker (COLOR_PROP_DAY_FG), + NULL); +} + +/* Callback used when a color is changed */ +static void +color_set (void) +{ + reconfigure_month (); + prop_changed (); +} + +/* Creates the colors page in the preferences dialog */ +static void +create_colors_page (void) +{ + GtkWidget *frame; + GtkWidget *hbox; + GtkWidget *table; + GtkWidget *w; + int i; + + frame = gtk_frame_new (_("Colors for months")); + gtk_container_border_width (GTK_CONTAINER (frame), GNOME_PAD_SMALL); + gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), frame, + gtk_label_new (_("Colors"))); + + hbox = gtk_hbox_new (FALSE, GNOME_PAD); + gtk_container_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL); + gtk_container_add (GTK_CONTAINER (frame), hbox); + + table = gtk_table_new (COLOR_PROP_LAST, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), GNOME_PAD_SMALL); + gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0); + + /* Create the color pickers */ + + for (i = 0; i < COLOR_PROP_LAST; i++) { + /* Label */ + + w = gtk_label_new (_(color_props[i].label)); + gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); + gtk_table_attach (GTK_TABLE (table), w, + 0, 1, i, i + 1, + GTK_FILL, 0, + 0, 0); + + /* Color picker */ + + color_pickers[i] = gnome_color_picker_new (); + gnome_color_picker_set_title (GNOME_COLOR_PICKER (color_pickers[i]), _(color_props[i].label)); + gnome_color_picker_set_i16 (GNOME_COLOR_PICKER (color_pickers[i]), + color_props[i].r, color_props[i].g, color_props[i].b, 0); + gtk_table_attach (GTK_TABLE (table), color_pickers[i], + 1, 2, i, i + 1, + 0, 0, + 0, 0); + gtk_signal_connect (GTK_OBJECT (color_pickers[i]), "color_set", + (GtkSignalFunc) color_set, + NULL); + } + + /* Create the sample calendar */ + + w = gnome_canvas_new (); + gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0); + + month_item = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (w))); + gnome_canvas_item_set (month_item, + "start_on_monday", week_starts_on_monday, + NULL); + reconfigure_month (); + gtk_signal_connect (GTK_OBJECT (w), "size_allocate", + canvas_size_allocate, + NULL); + +} + +/* Creates and displays the preferences dialog for the whole application */ +void +properties (void) +{ + if (prop_win) + return; + + prop_win = gnome_property_box_new (); + gtk_window_set_title (GTK_WINDOW (prop_win), _("Preferences")); + + create_time_display_page (); + create_colors_page (); + gtk_signal_connect (GTK_OBJECT (prop_win), "destroy", (GtkSignalFunc) prop_cancel, NULL); @@ -272,3 +472,33 @@ properties (void) gtk_widget_show_all (prop_win); } + +char * +build_color_spec (int r, int g, int b) +{ + static char spec[100]; + + sprintf (spec, "#%04x%04x%04x", r, g, b); + return spec; +} + +void +parse_color_spec (char *spec, int *r, int *g, int *b) +{ + g_return_if_fail (spec != NULL); + g_return_if_fail (r != NULL); + g_return_if_fail (r != NULL); + g_return_if_fail (r != NULL); + + if (sscanf (spec, "#%04x%04x%04x", r, g, b) != 3) { + g_warning ("Invalid color specification %s, returning black", spec); + + *r = *g = *b = 0; + } +} + +char * +color_spec_from_prop (int propnum) +{ + return build_color_spec (color_props[propnum].r, color_props[propnum].g, color_props[propnum].b); +} diff --git a/calendar/gui/year-view.c b/calendar/gui/year-view.c index a09862f5f0..7458b61500 100644 --- a/calendar/gui/year-view.c +++ b/calendar/gui/year-view.c @@ -165,7 +165,7 @@ year_view_init (YearView *yv) /* Heading */ - yv->heading = gnome_canvas_item_new (GNOME_CANVAS_GROUP (yv->canvas.root), + yv->heading = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (yv)), gnome_canvas_text_get_type (), "anchor", GTK_ANCHOR_N, "font", "-*-helvetica-bold-r-normal--14-*-*-*-*-*-iso8859-1", @@ -180,7 +180,7 @@ year_view_init (YearView *yv) strftime (buf, 100, "%B", &tm); tm.tm_mon++; - yv->titles[i] = gnome_canvas_item_new (GNOME_CANVAS_GROUP (yv->canvas.root), + yv->titles[i] = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (yv)), gnome_canvas_text_get_type (), "text", buf, "anchor", GTK_ANCHOR_N, @@ -190,11 +190,10 @@ year_view_init (YearView *yv) /* Month item */ - yv->mitems[i] = gnome_month_item_new (GNOME_CANVAS_GROUP (yv->canvas.root)); + yv->mitems[i] = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (yv))); gnome_canvas_item_set (yv->mitems[i], "anchor", GTK_ANCHOR_NW, "start_on_monday", week_starts_on_monday, - "heading_color", "white", NULL); } @@ -339,3 +338,17 @@ year_view_time_format_changed (YearView *yv) year_view_set (yv, time_year_begin (time_from_day (yv->year, 0, 1))); } + +void +year_view_colors_changed (YearView *yv) +{ + int i; + + g_return_if_fail (yv != NULL); + g_return_if_fail (IS_YEAR_VIEW (yv)); + + for (i = 0; i < 12; i++) { + unmark_month_item (GNOME_MONTH_ITEM (yv->mitems[i])); + mark_month_item (GNOME_MONTH_ITEM (yv->mitems[i]), yv->calendar->cal); + } +} diff --git a/calendar/gui/year-view.h b/calendar/gui/year-view.h index fa0b4ed65c..071380ba2b 100644 --- a/calendar/gui/year-view.h +++ b/calendar/gui/year-view.h @@ -63,6 +63,9 @@ void year_view_set (YearView *yv, time_t year); /* Notifies the year view that the time format has changed */ void year_view_time_format_changed (YearView *yv); +/* Notifies the year view that colors have changed */ +void year_view_colors_changed (YearView *yv); + END_GNOME_DECLS diff --git a/calendar/main.c b/calendar/main.c index 066aac783c..5ccdeee3ff 100644 --- a/calendar/main.c +++ b/calendar/main.c @@ -42,7 +42,20 @@ int day_begin, day_end; /* Whether weeks starts on Sunday or Monday */ int week_starts_on_monday; -/* Number of calendars active */ +/* The array of color properties -- keep in sync with the enumeration defined in main.h. The color + * values specified here are the defaults for the program. + */ +struct color_prop color_props[] = { + { 0x0000, 0x0000, 0x0000, "Outline:", "/calendar/Colors/outline" }, + { 0xffff, 0xffff, 0xffff, "Headings:", "/calendar/Colors/headings" }, + { 0xd6d6, 0xd6d6, 0xd6d6, "Empty days:", "/calendar/Colors/empty_bg" }, + { 0xd2d2, 0xb4b4, 0x8c8c, "Appointment days:", "/calendar/Colors/mark_bg" }, + { 0xea60, 0xea60, 0xea60, "Highlighted day:", "/calendar/Colors/prelight_bg" }, + { 0x0000, 0x0000, 0x0000, "Day numbers:", "/calendar/Colors/day_fg" }, + { 0x0000, 0x0000, 0xffff, "Current day's number:", "/calendar/Colors/current_fg" } +}; + +/* Number of active calendars */ int active_calendars = 0; /* A list of all of the calendars started */ @@ -105,10 +118,17 @@ range_check_hour (int hour) static void init_calendar (void) { + int i; + char *cspec, *color; + char *str; + init_username (); user_calendar_file = g_concat_dir_and_file (gnome_util_user_home (), ".gnome/user-cal.vcf"); gnome_config_push_prefix (calendar_settings); + + /* Read calendar settings */ + day_begin = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day start=8")); day_end = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day end=17")); am_pm_flag = gnome_config_get_bool ("/calendar/Calendar/AM PM flag=0"); @@ -119,6 +139,21 @@ init_calendar (void) day_end = 17; } + /* Read color settings */ + + for (i = 0; i < COLOR_PROP_LAST; i++) { + cspec = build_color_spec (color_props[i].r, color_props[i].g, color_props[i].b); + str = g_copy_strings (color_props[i].key, "=", cspec, NULL); + + color = gnome_config_get_string (str); + parse_color_spec (color, &color_props[i].r, &color_props[i].g, &color_props[i].b); + + g_free (str); + g_free (color); + } + + /* Done */ + gnome_config_pop_prefix (); } @@ -197,6 +232,15 @@ time_format_changed (void) gnome_calendar_time_format_changed (GNOME_CALENDAR (l->data)); } +void +colors_changed (void) +{ + GList *l; + + for (l = all_calendars; l; l = l->next) + gnome_calendar_colors_changed (GNOME_CALENDAR (l->data)); +} + static void quit_cmd (void) { diff --git a/calendar/main.h b/calendar/main.h index 6f22f946f9..5cd0d1c5c4 100644 --- a/calendar/main.h +++ b/calendar/main.h @@ -1,13 +1,36 @@ #ifndef MAIN_H #define MAIN_H -/* Global preferences */ +/* Calendar preferences */ extern int day_begin, day_end; extern char *user_name; extern int am_pm_flag; extern int week_starts_on_monday; +/* This enum and the following array define the color preferences */ + +enum { + COLOR_PROP_OUTLINE_COLOR, /* Color of calendar outline */ + COLOR_PROP_HEADING_COLOR, /* Color for headings */ + COLOR_PROP_EMPTY_DAY_BG, /* Background color for empty days */ + COLOR_PROP_MARK_DAY_BG, /* Background color for days with appointments */ + COLOR_PROP_PRELIGHT_DAY_BG, /* Background color for prelighted day */ + COLOR_PROP_DAY_FG, /* Color for day numbers */ + COLOR_PROP_CURRENT_DAY_FG, /* Color for current day's number */ + COLOR_PROP_LAST /* Number of color properties */ +}; + +struct color_prop { + int r; /* Values are in [0, 65535] */ + int g; + int b; + char *label; /* Label for properties dialog */ + char *key; /* Key for gnome_config */ +}; + +extern struct color_prop color_props[]; + /* Creates and runs the preferences dialog box */ void properties (void); @@ -16,7 +39,22 @@ void properties (void); */ void time_format_changed (void); +/* Asks for all the month items' colors to be reset */ +void colors_changed (void); + /* Creates and runs the Go-to date dialog */ void goto_dialog (GnomeCalendar *gcal); +/* Returns a pointer to a statically-allocated string with a representation of the specified color. + * Values must be in [0, 65535]. + */ +char *build_color_spec (int r, int g, int b); + +/* Parses a color specification of the form "#%04x%04x%04x" and returns the color components. */ +void parse_color_spec (char *spec, int *r, int *g, int *b); + +/* Calls build_color_spec() for the color in the specified property number */ +char *color_spec_from_prop (int propnum); + + #endif diff --git a/calendar/mark.c b/calendar/mark.c index b1c6df8fa3..6aab8b1b74 100644 --- a/calendar/mark.c +++ b/calendar/mark.c @@ -6,6 +6,8 @@ */ #include <config.h> +#include "gnome-cal.h" +#include "main.h" #include "mark.h" #include "timeutil.h" @@ -34,14 +36,7 @@ mark_event_in_month (GnomeMonthItem *mitem, time_t start, time_t end) item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + day_index); gnome_canvas_item_set (item, - "fill_color", "tan", - NULL); - - /* Mark the day label */ - - item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_LABEL + day_index); - gnome_canvas_item_set (item, - "fill_color", "black", + "fill_color", color_spec_from_prop (COLOR_PROP_MARK_DAY_BG), NULL); /* Next day */ @@ -65,7 +60,7 @@ mark_current_day (GnomeMonthItem *mitem) day_index = gnome_month_item_day2index (mitem, tm->tm_mday); item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_LABEL + day_index); gnome_canvas_item_set (item, - "fill_color", "blue", + "fill_color", color_spec_from_prop (COLOR_PROP_CURRENT_DAY_FG), NULL); } } @@ -98,25 +93,26 @@ mark_month_item (GnomeMonthItem *mitem, Calendar *cal) void unmark_month_item (GnomeMonthItem *mitem) { - int i; - GnomeCanvasItem *item; - g_return_if_fail (mitem != NULL); g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem)); - for (i = 0; i < 42; i++) { - /* Box */ + /* We have to do this in several calls to gnome_canvas_item_set(), as color_spec_from_prop() + * returns a pointer to a static string -- and we need several values. + */ - item = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_BOX + i); - gnome_canvas_item_set (item, - "fill_color", "#d6d6d6d6d6d6", - NULL); + gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem), + "heading_color", color_spec_from_prop (COLOR_PROP_HEADING_COLOR), + NULL); - /* Label */ + gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem), + "outline_color", color_spec_from_prop (COLOR_PROP_OUTLINE_COLOR), + NULL); - item = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_LABEL + i); - gnome_canvas_item_set (item, - "fill_color", "black", - NULL); - } + gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem), + "day_box_color", color_spec_from_prop (COLOR_PROP_EMPTY_DAY_BG), + NULL); + + gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem), + "day_color", color_spec_from_prop (COLOR_PROP_DAY_FG), + NULL); } diff --git a/calendar/month-view.c b/calendar/month-view.c index 16e6c72e8a..4d1a9bf967 100644 --- a/calendar/month-view.c +++ b/calendar/month-view.c @@ -66,7 +66,7 @@ month_view_init (MonthView *mv) { /* Title */ - mv->title = gnome_canvas_item_new (GNOME_CANVAS_GROUP (mv->canvas.root), + mv->title = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (mv)), gnome_canvas_text_get_type (), "anchor", GTK_ANCHOR_N, "font", "-*-helvetica-bold-r-normal--18-*-*-*-p-*-iso8859-1", @@ -75,7 +75,7 @@ month_view_init (MonthView *mv) /* Month item */ - mv->mitem = gnome_month_item_new (GNOME_CANVAS_GROUP (mv->canvas.root)); + mv->mitem = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (mv))); gnome_canvas_item_set (mv->mitem, "x", 0.0, "anchor", GTK_ANCHOR_NW, @@ -205,3 +205,13 @@ month_view_time_format_changed (MonthView *mv) /* FIXME: update events */ } + +void +month_view_colors_changed (MonthView *mv) +{ + g_return_if_fail (mv != NULL); + g_return_if_fail (IS_MONTH_VIEW (mv)); + + unmark_month_item (mv->mitem); + /* FIXME */ +} diff --git a/calendar/month-view.h b/calendar/month-view.h index a164332f98..70476c82f2 100644 --- a/calendar/month-view.h +++ b/calendar/month-view.h @@ -55,6 +55,9 @@ void month_view_set (MonthView *mv, time_t month); /* Notifies the month view that the time format has changed */ void month_view_time_format_changed (MonthView *mv); +/* Notifies the month view that the colors have changed */ +void month_view_colors_changed (MonthView *mv); + END_GNOME_DECLS diff --git a/calendar/prop.c b/calendar/prop.c index 709d321229..bdc8c9e937 100644 --- a/calendar/prop.c +++ b/calendar/prop.c @@ -10,8 +10,18 @@ #include <gnome.h> #include "gnome-cal.h" #include "main.h" +#include "gnome-month-item.h" + +/* These specify the page numbers in the preferences notebook */ +enum { + PROP_TIME_DISPLAY, + PROP_COLORS +}; static GtkWidget *prop_win; /* The preferences dialog */ + +/* Widgets for the time display page */ + static GtkWidget *time_format_12; /* Radio button for 12-hour format */ static GtkWidget *time_format_24; /* Radio button for 24-hour format */ static GtkWidget *start_on_sunday; /* Check button for weeks starting on Sunday */ @@ -21,6 +31,12 @@ static GtkWidget *end_omenu; /* Option menu for end of day */ static GtkWidget *start_items[24]; /* Menu items for start of day menu */ static GtkWidget *end_items[24]; /* Menu items for end of day menu */ +/* Widgets for the colors page */ + +static GtkWidget *color_pickers[COLOR_PROP_LAST]; +static GnomeCanvasItem *month_item; + + /* Callback used when the property box is closed -- just sets the prop_win variable to null. */ static int prop_cancel (void) @@ -39,13 +55,10 @@ get_active_index (GtkWidget *menu) return GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (active))); } -/* Callback used when the Apply button is clicked. */ +/* Applies the settings in the time display page */ static void -prop_apply (GtkWidget *w, int page) +prop_apply_time_display (void) { - if (page != -1) - return; - /* Day begin/end */ day_begin = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu))); @@ -67,16 +80,57 @@ prop_apply (GtkWidget *w, int page) time_format_changed (); } +/* Applies the settings in the colors page */ +static void +prop_apply_colors (void) +{ + int i; + char *cspec; + + for (i = 0; i < COLOR_PROP_LAST; i++) { + gnome_color_picker_get_i16 (GNOME_COLOR_PICKER (color_pickers[i]), + &color_props[i].r, &color_props[i].g, &color_props[i].b, NULL); + + cspec = build_color_spec (color_props[i].r, color_props[i].g, color_props[i].b); + gnome_config_set_string (color_props[i].key, cspec); + } + + gnome_config_sync (); + colors_changed (); +} + +/* Callback used when the Apply button is clicked. */ +static void +prop_apply (GtkWidget *w, int page) +{ + switch (page) { + case PROP_TIME_DISPLAY: + prop_apply_time_display (); + break; + + case PROP_COLORS: + prop_apply_colors (); + break; + + case -1: + break; + + default: + g_warning ("We have a loose penguin!"); + g_assert_not_reached (); + } +} + /* Notifies the property box that the data has changed */ static void -toggled (GtkWidget *widget, gpointer data) +prop_changed (void) { gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win)); } /* Builds and returns a two-element radio button group surrounded by a frame. The radio buttons are * stored in the specified variables, and the first radio button's state is set according to the - * specified flag value. The buttons are connected to the toggled() function to update the property + * specified flag value. The buttons are connected to the prop_changed() function to update the property * box's dirty state. */ static GtkWidget * @@ -90,7 +144,7 @@ build_two_radio_group (char *title, frame = gtk_frame_new (title); - vbox = gtk_vbox_new (TRUE, 0); + vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (frame), vbox); *radio_1_widget = gtk_radio_button_new_with_label (NULL, radio_1_title); @@ -104,7 +158,7 @@ build_two_radio_group (char *title, gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (*radio_2_widget), !radio_1_value); gtk_signal_connect (GTK_OBJECT (*radio_1_widget), "toggled", - (GtkSignalFunc) toggled, + (GtkSignalFunc) prop_changed, NULL); return frame; @@ -174,40 +228,35 @@ build_hours_menu (GtkWidget **items, int active) return omenu; } -/* Creates and displays the preferences dialog for the whole application */ -void -properties (void) +/* Creates the time display page in the preferences dialog */ +static void +create_time_display_page (void) { - GtkWidget *hbox; + GtkWidget *table; GtkWidget *vbox; GtkWidget *frame; GtkWidget *hbox2; GtkWidget *hbox3; GtkWidget *w; - if (prop_win) - return; - - /* Main window and hbox for property page */ - - prop_win = gnome_property_box_new (); - gtk_window_set_title (GTK_WINDOW (prop_win), _("Preferences")); - - hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); - gtk_container_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL); - gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), hbox, + table = gtk_table_new (2, 2, FALSE); + gtk_container_border_width (GTK_CONTAINER (table), GNOME_PAD_SMALL); + gtk_table_set_row_spacings (GTK_TABLE (table), GNOME_PAD_SMALL); + gtk_table_set_col_spacings (GTK_TABLE (table), GNOME_PAD_SMALL); + gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), table, gtk_label_new (_("Time display"))); /* Time format */ - vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); - gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); - w = build_two_radio_group (_("Time format"), _("12-hour (AM/PM)"), &time_format_12, _("24-hour"), &time_format_24, am_pm_flag); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); + gtk_table_attach (GTK_TABLE (table), w, + 0, 1, 0, 1, + GTK_EXPAND | GTK_FILL, + GTK_EXPAND | GTK_FILL, + 0, 0); /* Weeks start on */ @@ -215,12 +264,20 @@ properties (void) _("Sunday"), &start_on_sunday, _("Monday"), &start_on_monday, !week_starts_on_monday); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); + gtk_table_attach (GTK_TABLE (table), w, + 0, 1, 1, 2, + GTK_EXPAND | GTK_FILL, + GTK_EXPAND | GTK_FILL, + 0, 0); /* Day range */ frame = gtk_frame_new (_("Day range")); - gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + gtk_table_attach (GTK_TABLE (table), frame, + 1, 2, 0, 2, + GTK_EXPAND | GTK_FILL, + GTK_EXPAND | GTK_FILL, + 0, 0); vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); gtk_container_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL); @@ -258,9 +315,152 @@ properties (void) end_omenu = build_hours_menu (end_items, day_end); gtk_box_pack_start (GTK_BOX (hbox3), end_omenu, FALSE, FALSE, 0); +} + +/* Called when the canvas for the month item is size allocated. We use this to change the canvas' + * scrolling region and the month item's size. + */ +static void +canvas_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data) +{ + gnome_canvas_item_set (month_item, + "width", (double) (allocation->width - 1), + "height", (double) (allocation->height - 1), + NULL); + + gnome_canvas_set_scroll_region (GNOME_CANVAS (widget), + 0, 0, + allocation->width, allocation->height); +} + +/* Returns a color spec based on the color pickers */ +static char * +color_spec_from_picker (int num) +{ + int r, g, b; + + gnome_color_picker_get_i16 (GNOME_COLOR_PICKER (color_pickers[num]), &r, &g, &b, NULL); - /* Done! */ + return build_color_spec (r, g, b); +} + +/* Sets the colors of the month item to the current prerences */ +static void +reconfigure_month (void) +{ + /* We have to do this in two calls to gnome_canvas_item_set(), as color_spec_from_picker() + * returns a pointer to a static string -- and we need two values. + */ + + gnome_canvas_item_set (month_item, + "heading_color", color_spec_from_picker (COLOR_PROP_HEADING_COLOR), + NULL); + + gnome_canvas_item_set (month_item, + "outline_color", color_spec_from_picker (COLOR_PROP_OUTLINE_COLOR), + NULL); + + /* FIXME: set the rest of the colors -- simulate marking of the month item, set the + * current day, etc. The following is incorrect. + */ + + gnome_canvas_item_set (month_item, + "day_box_color", color_spec_from_picker (COLOR_PROP_EMPTY_DAY_BG), + NULL); + + gnome_canvas_item_set (month_item, + "day_color", color_spec_from_picker (COLOR_PROP_DAY_FG), + NULL); +} + +/* Callback used when a color is changed */ +static void +color_set (void) +{ + reconfigure_month (); + prop_changed (); +} + +/* Creates the colors page in the preferences dialog */ +static void +create_colors_page (void) +{ + GtkWidget *frame; + GtkWidget *hbox; + GtkWidget *table; + GtkWidget *w; + int i; + + frame = gtk_frame_new (_("Colors for months")); + gtk_container_border_width (GTK_CONTAINER (frame), GNOME_PAD_SMALL); + gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), frame, + gtk_label_new (_("Colors"))); + + hbox = gtk_hbox_new (FALSE, GNOME_PAD); + gtk_container_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL); + gtk_container_add (GTK_CONTAINER (frame), hbox); + + table = gtk_table_new (COLOR_PROP_LAST, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), GNOME_PAD_SMALL); + gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0); + + /* Create the color pickers */ + + for (i = 0; i < COLOR_PROP_LAST; i++) { + /* Label */ + + w = gtk_label_new (_(color_props[i].label)); + gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); + gtk_table_attach (GTK_TABLE (table), w, + 0, 1, i, i + 1, + GTK_FILL, 0, + 0, 0); + + /* Color picker */ + + color_pickers[i] = gnome_color_picker_new (); + gnome_color_picker_set_title (GNOME_COLOR_PICKER (color_pickers[i]), _(color_props[i].label)); + gnome_color_picker_set_i16 (GNOME_COLOR_PICKER (color_pickers[i]), + color_props[i].r, color_props[i].g, color_props[i].b, 0); + gtk_table_attach (GTK_TABLE (table), color_pickers[i], + 1, 2, i, i + 1, + 0, 0, + 0, 0); + gtk_signal_connect (GTK_OBJECT (color_pickers[i]), "color_set", + (GtkSignalFunc) color_set, + NULL); + } + + /* Create the sample calendar */ + + w = gnome_canvas_new (); + gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0); + + month_item = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (w))); + gnome_canvas_item_set (month_item, + "start_on_monday", week_starts_on_monday, + NULL); + reconfigure_month (); + gtk_signal_connect (GTK_OBJECT (w), "size_allocate", + canvas_size_allocate, + NULL); + +} + +/* Creates and displays the preferences dialog for the whole application */ +void +properties (void) +{ + if (prop_win) + return; + + prop_win = gnome_property_box_new (); + gtk_window_set_title (GTK_WINDOW (prop_win), _("Preferences")); + + create_time_display_page (); + create_colors_page (); + gtk_signal_connect (GTK_OBJECT (prop_win), "destroy", (GtkSignalFunc) prop_cancel, NULL); @@ -272,3 +472,33 @@ properties (void) gtk_widget_show_all (prop_win); } + +char * +build_color_spec (int r, int g, int b) +{ + static char spec[100]; + + sprintf (spec, "#%04x%04x%04x", r, g, b); + return spec; +} + +void +parse_color_spec (char *spec, int *r, int *g, int *b) +{ + g_return_if_fail (spec != NULL); + g_return_if_fail (r != NULL); + g_return_if_fail (r != NULL); + g_return_if_fail (r != NULL); + + if (sscanf (spec, "#%04x%04x%04x", r, g, b) != 3) { + g_warning ("Invalid color specification %s, returning black", spec); + + *r = *g = *b = 0; + } +} + +char * +color_spec_from_prop (int propnum) +{ + return build_color_spec (color_props[propnum].r, color_props[propnum].g, color_props[propnum].b); +} diff --git a/calendar/year-view.c b/calendar/year-view.c index a09862f5f0..7458b61500 100644 --- a/calendar/year-view.c +++ b/calendar/year-view.c @@ -165,7 +165,7 @@ year_view_init (YearView *yv) /* Heading */ - yv->heading = gnome_canvas_item_new (GNOME_CANVAS_GROUP (yv->canvas.root), + yv->heading = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (yv)), gnome_canvas_text_get_type (), "anchor", GTK_ANCHOR_N, "font", "-*-helvetica-bold-r-normal--14-*-*-*-*-*-iso8859-1", @@ -180,7 +180,7 @@ year_view_init (YearView *yv) strftime (buf, 100, "%B", &tm); tm.tm_mon++; - yv->titles[i] = gnome_canvas_item_new (GNOME_CANVAS_GROUP (yv->canvas.root), + yv->titles[i] = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (yv)), gnome_canvas_text_get_type (), "text", buf, "anchor", GTK_ANCHOR_N, @@ -190,11 +190,10 @@ year_view_init (YearView *yv) /* Month item */ - yv->mitems[i] = gnome_month_item_new (GNOME_CANVAS_GROUP (yv->canvas.root)); + yv->mitems[i] = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (yv))); gnome_canvas_item_set (yv->mitems[i], "anchor", GTK_ANCHOR_NW, "start_on_monday", week_starts_on_monday, - "heading_color", "white", NULL); } @@ -339,3 +338,17 @@ year_view_time_format_changed (YearView *yv) year_view_set (yv, time_year_begin (time_from_day (yv->year, 0, 1))); } + +void +year_view_colors_changed (YearView *yv) +{ + int i; + + g_return_if_fail (yv != NULL); + g_return_if_fail (IS_YEAR_VIEW (yv)); + + for (i = 0; i < 12; i++) { + unmark_month_item (GNOME_MONTH_ITEM (yv->mitems[i])); + mark_month_item (GNOME_MONTH_ITEM (yv->mitems[i]), yv->calendar->cal); + } +} diff --git a/calendar/year-view.h b/calendar/year-view.h index fa0b4ed65c..071380ba2b 100644 --- a/calendar/year-view.h +++ b/calendar/year-view.h @@ -63,6 +63,9 @@ void year_view_set (YearView *yv, time_t year); /* Notifies the year view that the time format has changed */ void year_view_time_format_changed (YearView *yv); +/* Notifies the year view that colors have changed */ +void year_view_colors_changed (YearView *yv); + END_GNOME_DECLS |