From de704a7b4576df4f84ed859c7d3337cce0f89e57 Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Thu, 3 Sep 1998 05:33:07 +0000 Subject: Today: we can now configure the colors for the monthly items, courtesy of Today: we can now configure the colors for the monthly items, courtesy of the canvas and GnomeColorPicker. Look at the preferences dialog, it is kind of nice. There are still some bugs to be fixed, nothing major. 1998-09-03 Federico Mena Quintero * 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. svn path=/trunk/; revision=360 --- calendar/ChangeLog | 40 ++++++ calendar/TODO | 29 ++-- calendar/gnome-cal.c | 12 ++ calendar/gnome-cal.h | 3 + calendar/gnome-month-item.c | 144 ++++++++++++++------ calendar/gnome-month-item.h | 6 + calendar/goto.c | 151 +++++++++++---------- calendar/gui/gnome-cal.c | 12 ++ calendar/gui/gnome-cal.h | 3 + calendar/gui/gnome-month-item.c | 144 ++++++++++++++------ calendar/gui/gnome-month-item.h | 6 + calendar/gui/goto.c | 151 +++++++++++---------- calendar/gui/main.c | 46 ++++++- calendar/gui/main.h | 40 +++++- calendar/gui/mark.c | 44 +++--- calendar/gui/month-view.c | 14 +- calendar/gui/month-view.h | 3 + calendar/gui/prop.c | 292 +++++++++++++++++++++++++++++++++++----- calendar/gui/year-view.c | 21 ++- calendar/gui/year-view.h | 3 + calendar/main.c | 46 ++++++- calendar/main.h | 40 +++++- calendar/mark.c | 44 +++--- calendar/month-view.c | 14 +- calendar/month-view.h | 3 + calendar/prop.c | 292 +++++++++++++++++++++++++++++++++++----- calendar/year-view.c | 21 ++- 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 + + * 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 + + * 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 * 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 +#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 #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 +#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 #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 -- cgit v1.2.3