Finished with the properties dialog. You can jump to days from the year

Finished with the properties dialog.  You can jump to days from the year view
now.  I'm off to rewrite gnome-popupmenu and friends.

1998-09-03  Federico Mena Quintero  <federico@nuclecu.unam.mx>

	* gncal-full-day.c (gncal_full_day_forall): Updated foreach ->
	forall from Gtk changes, bleah.

	* year-view.c (day_event): New function to handle events from
	days.  Jumps to the day that is clicked.

	* main.c: Use a watch cursor while the previous/today/next
	functions are doing their job.

	* mark.c (month_item_prepare_prelight): New public utility
	function to prepare a month item for prelighting.  It will store
	the proper prelight information and attach the appropriate signals.
	(mark_current_day): Make the current day bold as well (useful for
	color-blind people, I guess).

	* prop.c (set_current_day): Reset the date in the sample calendar
	and mark the current day.
	(fake_mark_days): Mark fake events in the sample calendar.

	* year-view.c (year_view_set): Use the general prelighting engine.

	* goto.c (day_event): Just process button presses, as prelighting
	is done behind the scenes now.
	(update): Use the general prelighting engine.

	* prop.c (create_colors_page): We can now configure the colors of

svn path=/trunk/; revision=361
This commit is contained in:
Federico Mena Quintero
1998-09-04 00:43:06 +00:00
committed by Arturo Espinosa
parent de704a7b45
commit 84fa00e42a
18 changed files with 623 additions and 140 deletions

View File

@ -1,5 +1,30 @@
1998-09-03 Federico Mena Quintero <federico@nuclecu.unam.mx>
* gncal-full-day.c (gncal_full_day_forall): Updated foreach ->
forall from Gtk changes, bleah.
* year-view.c (day_event): New function to handle events from
days. Jumps to the day that is clicked.
* main.c: Use a watch cursor while the previous/today/next
functions are doing their job.
* mark.c (month_item_prepare_prelight): New public utility
function to prepare a month item for prelighting. It will store
the proper prelight information and attach the appropriate signals.
(mark_current_day): Make the current day bold as well (useful for
color-blind people, I guess).
* prop.c (set_current_day): Reset the date in the sample calendar
and mark the current day.
(fake_mark_days): Mark fake events in the sample calendar.
* year-view.c (year_view_set): Use the general prelighting engine.
* goto.c (day_event): Just process button presses, as prelighting
is done behind the scenes now.
(update): Use the general prelighting engine.
* 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.

View File

@ -3,20 +3,8 @@ BUGS:
- 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?).
General:
- Color properties, highlight some days and such.
- Mark the current day in BOLD as well as different color (color blind users will need it).
- Write online help. Nice help. Lots of help.
Year view:
- Prelight days on mouse enter/leave. Share that code with goto.c.
- Double click on a day takes you to the day view.
- Button-3 popup with options:
Create new appointment in this day
--- separator ---
@ -56,3 +44,7 @@ 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.

View File

@ -106,7 +106,8 @@ static gint gncal_full_day_focus_in (GtkWidget *widget,
GdkEventFocus *event);
static gint gncal_full_day_focus_out (GtkWidget *widget,
GdkEventFocus *event);
static void gncal_full_day_foreach (GtkContainer *container,
static void gncal_full_day_forall (GtkContainer *container,
gboolean include_internals,
GtkCallback callback,
gpointer callback_data);
@ -981,7 +982,7 @@ gncal_full_day_class_init (GncalFullDayClass *class)
widget_class->focus_in_event = gncal_full_day_focus_in;
widget_class->focus_out_event = gncal_full_day_focus_out;
container_class->foreach = gncal_full_day_foreach;
container_class->forall = gncal_full_day_forall;
class->range_activated = range_activated;
}
@ -2097,7 +2098,7 @@ gncal_full_day_focus_out (GtkWidget *widget, GdkEventFocus *event)
}
static void
gncal_full_day_foreach (GtkContainer *container, GtkCallback callback, gpointer callback_data)
gncal_full_day_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data)
{
GncalFullDay *fullday;
GList *children;

View File

@ -17,7 +17,6 @@
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
@ -25,29 +24,9 @@ static gulong day_pixels[42]; /* Colors of the day backgrounds */
static void
update (void)
{
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";
item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item),
GNOME_MONTH_ITEM_DAY_BOX + i);
gtk_object_getv (GTK_OBJECT (item), 1, &arg);
c = GTK_VALUE_BOXED (arg);
day_pixels[i] = c->pixel;
g_free (c);
}
month_item_prepare_prelight (GNOME_MONTH_ITEM (month_item), default_prelight_func, NULL);
}
/* Callback used when the year adjustment is changed */
@ -163,24 +142,16 @@ set_scroll_region (GtkWidget *widget, GtkAllocation *allocation)
}
/* Event handler for day groups in the month item. A button press makes the calendar jump to the
* selected day and destroys the Go-to dialog box. Days are prelighted as appropriate on
* enter_notify and leave_notify events.
* selected day and destroys the Go-to dialog box.
*/
static gint
day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
{
GnomeCanvasItem *box;
int child_num, day;
GdkColor color;
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_DAY_GROUP;
if (day == 0)
return FALSE;
switch (event->type) {
case GDK_BUTTON_PRESS:
if ((event->button.button == 1) && (day != 0)) {
@ -191,23 +162,6 @@ day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
}
break;
case GDK_ENTER_NOTIFY:
box = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item),
child_num + GNOME_MONTH_ITEM_DAY_BOX);
gnome_canvas_item_set (box,
"fill_color", color_spec_from_prop (COLOR_PROP_PRELIGHT_DAY_BG),
NULL);
break;
case GDK_LEAVE_NOTIFY:
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_gdk", &color,
NULL);
break;
default:
break;
}

View File

@ -106,7 +106,8 @@ static gint gncal_full_day_focus_in (GtkWidget *widget,
GdkEventFocus *event);
static gint gncal_full_day_focus_out (GtkWidget *widget,
GdkEventFocus *event);
static void gncal_full_day_foreach (GtkContainer *container,
static void gncal_full_day_forall (GtkContainer *container,
gboolean include_internals,
GtkCallback callback,
gpointer callback_data);
@ -981,7 +982,7 @@ gncal_full_day_class_init (GncalFullDayClass *class)
widget_class->focus_in_event = gncal_full_day_focus_in;
widget_class->focus_out_event = gncal_full_day_focus_out;
container_class->foreach = gncal_full_day_foreach;
container_class->forall = gncal_full_day_forall;
class->range_activated = range_activated;
}
@ -2097,7 +2098,7 @@ gncal_full_day_focus_out (GtkWidget *widget, GdkEventFocus *event)
}
static void
gncal_full_day_foreach (GtkContainer *container, GtkCallback callback, gpointer callback_data)
gncal_full_day_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data)
{
GncalFullDay *fullday;
GList *children;

View File

@ -17,7 +17,6 @@
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
@ -25,29 +24,9 @@ static gulong day_pixels[42]; /* Colors of the day backgrounds */
static void
update (void)
{
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";
item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item),
GNOME_MONTH_ITEM_DAY_BOX + i);
gtk_object_getv (GTK_OBJECT (item), 1, &arg);
c = GTK_VALUE_BOXED (arg);
day_pixels[i] = c->pixel;
g_free (c);
}
month_item_prepare_prelight (GNOME_MONTH_ITEM (month_item), default_prelight_func, NULL);
}
/* Callback used when the year adjustment is changed */
@ -163,24 +142,16 @@ set_scroll_region (GtkWidget *widget, GtkAllocation *allocation)
}
/* Event handler for day groups in the month item. A button press makes the calendar jump to the
* selected day and destroys the Go-to dialog box. Days are prelighted as appropriate on
* enter_notify and leave_notify events.
* selected day and destroys the Go-to dialog box.
*/
static gint
day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
{
GnomeCanvasItem *box;
int child_num, day;
GdkColor color;
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_DAY_GROUP;
if (day == 0)
return FALSE;
switch (event->type) {
case GDK_BUTTON_PRESS:
if ((event->button.button == 1) && (day != 0)) {
@ -191,23 +162,6 @@ day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
}
break;
case GDK_ENTER_NOTIFY:
box = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item),
child_num + GNOME_MONTH_ITEM_DAY_BOX);
gnome_canvas_item_set (box,
"fill_color", color_spec_from_prop (COLOR_PROP_PRELIGHT_DAY_BG),
NULL);
break;
case GDK_LEAVE_NOTIFY:
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_gdk", &color,
NULL);
break;
default:
break;
}

View File

@ -251,22 +251,48 @@ quit_cmd (void)
}
}
/* Sets a clock cursor for the specified calendar window */
static void
set_clock_cursor (GnomeCalendar *gcal)
{
GdkCursor *cursor;
cursor = gdk_cursor_new (GDK_WATCH);
gdk_window_set_cursor (GTK_WIDGET (gcal)->window, cursor);
gdk_cursor_destroy (cursor);
gdk_flush ();
}
/* Resets the normal cursor for the specified calendar window */
static void
set_normal_cursor (GnomeCalendar *gcal)
{
gdk_window_set_cursor (GTK_WIDGET (gcal)->window, NULL);
gdk_flush ();
}
static void
previous_clicked (GtkWidget *widget, GnomeCalendar *gcal)
{
set_clock_cursor (gcal);
gnome_calendar_previous (gcal);
set_normal_cursor (gcal);
}
static void
next_clicked (GtkWidget *widget, GnomeCalendar *gcal)
{
set_clock_cursor (gcal);
gnome_calendar_next (gcal);
set_normal_cursor (gcal);
}
static void
today_clicked (GtkWidget *widget, GnomeCalendar *gcal)
{
set_clock_cursor (gcal);
gnome_calendar_goto_today (gcal);
set_normal_cursor (gcal);
}
static void

View File

@ -61,6 +61,7 @@ mark_current_day (GnomeMonthItem *mitem)
item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_LABEL + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_prop (COLOR_PROP_CURRENT_DAY_FG),
"font", CURRENT_DAY_FONT,
NULL);
}
}
@ -115,4 +116,121 @@ unmark_month_item (GnomeMonthItem *mitem)
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"day_color", color_spec_from_prop (COLOR_PROP_DAY_FG),
NULL);
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"day_font", NORMAL_DAY_FONT,
NULL);
}
/* Frees the prelight information in the month item when it is destroyed */
static void
free_prelight_info (GtkObject *object, gpointer data)
{
g_free (gtk_object_get_data (object, "prelight_info"));
}
/* Handles EnterNotify and LeaveNotify events from the month item's day groups, and performs
* appropriate prelighting.
*/
static gint
day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
{
GnomeCanvasItem *mitem;
GnomeCanvasItem *box;
int child_num, day;
gulong *day_pixels;
GetPrelightColorFunc func;
gpointer func_data;
char *spec;
GdkColor color;
mitem = data;
child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (mitem), item);
day = gnome_month_item_num2day (GNOME_MONTH_ITEM (mitem), child_num);
if (day == 0)
return FALSE; /* it was a day outside the month's range */
child_num -= GNOME_MONTH_ITEM_DAY_GROUP;
box = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_BOX + child_num);
day_pixels = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_pixels");
func = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_func");
func_data = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_data");
switch (event->type) {
case GDK_ENTER_NOTIFY:
spec = (* func) (func_data);
gnome_canvas_item_set (box,
"fill_color", spec,
NULL);
break;
case GDK_LEAVE_NOTIFY:
color.pixel = day_pixels[child_num];
gnome_canvas_item_set (box,
"fill_color_gdk", &color,
NULL);
break;
default:
break;
}
return FALSE;
}
void
month_item_prepare_prelight (GnomeMonthItem *mitem, GetPrelightColorFunc func, gpointer func_data)
{
gulong *day_pixels;
GnomeCanvasItem *day_group;
GnomeCanvasItem *box;
GtkArg arg;
GdkColor *color;
int i;
day_pixels = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_pixels");
/* Set up the buffer for day background colors and attach it to the month item, if necessary */
if (!day_pixels) {
/* Create the buffer and attach it */
day_pixels = g_new (gulong, 42);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_pixels", day_pixels);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_func", func);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_data", func_data);
gtk_signal_connect (GTK_OBJECT (mitem), "destroy",
(GtkSignalFunc) free_prelight_info,
NULL);
/* Connect the appropriate signals to perform prelighting */
for (i = 0; i < 42; i++) {
day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_GROUP + i);
gtk_signal_connect (GTK_OBJECT (day_group), "event",
(GtkSignalFunc) day_event,
mitem);
}
}
/* Fetch the background colors from the day boxes and store them in the prelight info */
for (i = 0; i < 42; i++) {
box = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + i);
arg.name = "fill_color_gdk";
gtk_object_getv (GTK_OBJECT (box), 1, &arg);
color = GTK_VALUE_BOXED (arg);
day_pixels[i] = color->pixel;
g_free (color);
}
}
char *
default_prelight_func (gpointer data)
{
return color_spec_from_prop (COLOR_PROP_PRELIGHT_DAY_BG);
}

View File

@ -12,6 +12,12 @@
#include "gnome-month-item.h"
/* These are the fonts used for the montly calendars */
#define NORMAL_DAY_FONT "-adobe-helvetica-medium-r-normal--10-*-72-72-p-*-iso8859-1"
#define CURRENT_DAY_FONT "-adobe-helvetica-bold-r-normal--12-*-72-72-p-*-iso8859-1"
/* Takes a monthly calendar item and marks the days that have events scheduled for them in the
* specified calendar. It also highlights the current day.
*/
@ -20,5 +26,20 @@ void mark_month_item (GnomeMonthItem *mitem, Calendar *cal);
/* Unmarks all the days in the specified month item */
void unmark_month_item (GnomeMonthItem *mitem);
/* Prepares a monthly calendar item to prelight when the mouse goes over the days. If it is called
* on a month item that had already been prepared, it updates the internal color buffers -- you need
* to do this if you re-mark the month item, or if you change the global color configuration. The
* specified function is used to query the prelight colors; it must return a color spec.
*/
typedef char * (* GetPrelightColorFunc) (gpointer data);
void month_item_prepare_prelight (GnomeMonthItem *mitem, GetPrelightColorFunc func, gpointer func_data);
/* This is the default prelight function you can use for most puposes. You can use NULL as the
* func_data.
*/
char *default_prelight_func (gpointer data);
#endif

View File

@ -9,6 +9,7 @@
#include <libgnomeui/gnome-canvas-text.h>
#include "month-view.h"
#include "main.h"
#include "mark.h"
#define SPACING 4 /* Spacing between title and calendar */
@ -212,6 +213,6 @@ 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);
unmark_month_item (GNOME_MONTH_ITEM (mv->mitem));
/* FIXME */
}

View File

@ -1,6 +1,6 @@
/*
* Calendar properties dialog box
* (C) 1998 the Free Software Foundation
/* Calendar properties dialog box
*
* Copyright (C) 1998 the Free Software Foundation
*
* Authors: Miguel de Icaza <miguel@kernel.org>
* Federico Mena <federico@nuclecu.unam.mx>
@ -9,8 +9,9 @@
#include <langinfo.h>
#include <gnome.h>
#include "gnome-cal.h"
#include "main.h"
#include "gnome-month-item.h"
#include "main.h"
#include "mark.h"
/* These specify the page numbers in the preferences notebook */
enum {
@ -344,6 +345,60 @@ color_spec_from_picker (int num)
return build_color_spec (r, g, b);
}
/* Callback used to query prelight color information for the properties box */
static char *
fetch_prelight_spec (gpointer data)
{
return color_spec_from_picker (COLOR_PROP_PRELIGHT_DAY_BG);
}
/* Marks fake event days in the month item sample */
static void
fake_mark_days (void)
{
static int day_nums[] = { 1, 4, 8, 16, 17, 18, 20, 25, 28 }; /* some random days */
int day_index;
int i;
GnomeCanvasItem *item;
for (i = 0; i < (sizeof (day_nums) / sizeof (day_nums[0])); i++) {
day_index = gnome_month_item_day2index (GNOME_MONTH_ITEM (month_item), day_nums[i]);
item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), GNOME_MONTH_ITEM_DAY_BOX + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_picker (COLOR_PROP_MARK_DAY_BG),
NULL);
}
}
/* Switches the month item to the current date and highlights the current day's number */
static void
set_current_day (void)
{
struct tm *tm;
time_t t;
GnomeCanvasItem *item;
int day_index;
/* Set the date */
t = time (NULL);
tm = localtime (&t);
gnome_canvas_item_set (month_item,
"year", tm->tm_year + 1900,
"month", tm->tm_mon,
NULL);
/* Highlight current day */
day_index = gnome_month_item_day2index (GNOME_MONTH_ITEM (month_item), tm->tm_mday);
item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), GNOME_MONTH_ITEM_DAY_LABEL + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_picker (COLOR_PROP_CURRENT_DAY_FG),
"font", CURRENT_DAY_FONT,
NULL);
}
/* Sets the colors of the month item to the current prerences */
static void
reconfigure_month (void)
@ -360,10 +415,6 @@ reconfigure_month (void)
"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);
@ -371,6 +422,17 @@ reconfigure_month (void)
gnome_canvas_item_set (month_item,
"day_color", color_spec_from_picker (COLOR_PROP_DAY_FG),
NULL);
gnome_canvas_item_set (month_item,
"day_font", NORMAL_DAY_FONT,
NULL);
fake_mark_days ();
set_current_day ();
/* Reset prelighting information */
month_item_prepare_prelight (GNOME_MONTH_ITEM (month_item), fetch_prelight_spec, NULL);
}
/* Callback used when a color is changed */

View File

@ -154,6 +154,56 @@ need_resize (YearView *yv)
yv->idle_id = gtk_idle_add (idle_handler, yv);
}
/* Event handler for days in the year's month items */
static gint
day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
{
YearView *yv;
GnomeCanvasItem *mitem;
int child_num, day;
mitem = data;
child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (mitem), item);
day = gnome_month_item_num2day (GNOME_MONTH_ITEM (mitem), child_num);
yv = gtk_object_get_user_data (GTK_OBJECT (mitem));
switch (event->type) {
case GDK_BUTTON_PRESS:
if ((event->button.button == 1) && (day != 0))
gnome_calendar_dayjump (yv->calendar,
time_from_day (GNOME_MONTH_ITEM (mitem)->year,
GNOME_MONTH_ITEM (mitem)->month,
day));
break;
default:
break;
}
return FALSE;
}
/* Sets up the month item with the specified index -- connects signals for handling events, etc. */
static void
setup_month_item (YearView *yv, int n)
{
GnomeCanvasItem *mitem;
GnomeCanvasItem *item;
int i;
mitem = yv->mitems[n];
/* Connect signals */
for (i = 0; i < 42; i++) {
item = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_GROUP + i);
gtk_signal_connect (GTK_OBJECT (item), "event",
(GtkSignalFunc) day_event,
mitem);
}
}
static void
year_view_init (YearView *yv)
{
@ -191,10 +241,12 @@ year_view_init (YearView *yv)
/* Month item */
yv->mitems[i] = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (yv)));
gtk_object_set_user_data (GTK_OBJECT (yv->mitems[i]), yv);
gnome_canvas_item_set (yv->mitems[i],
"anchor", GTK_ANCHOR_NW,
"start_on_monday", week_starts_on_monday,
NULL);
setup_month_item (yv, i);
}
/* We will need to resize the items when we paint for the first time */
@ -317,10 +369,7 @@ year_view_set (YearView *yv, time_t year)
/* Unmark and re-mark all the months */
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);
}
year_view_colors_changed (yv);
}
void
@ -350,5 +399,6 @@ year_view_colors_changed (YearView *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);
month_item_prepare_prelight (GNOME_MONTH_ITEM (yv->mitems[i]), default_prelight_func, NULL);
}
}

View File

@ -251,22 +251,48 @@ quit_cmd (void)
}
}
/* Sets a clock cursor for the specified calendar window */
static void
set_clock_cursor (GnomeCalendar *gcal)
{
GdkCursor *cursor;
cursor = gdk_cursor_new (GDK_WATCH);
gdk_window_set_cursor (GTK_WIDGET (gcal)->window, cursor);
gdk_cursor_destroy (cursor);
gdk_flush ();
}
/* Resets the normal cursor for the specified calendar window */
static void
set_normal_cursor (GnomeCalendar *gcal)
{
gdk_window_set_cursor (GTK_WIDGET (gcal)->window, NULL);
gdk_flush ();
}
static void
previous_clicked (GtkWidget *widget, GnomeCalendar *gcal)
{
set_clock_cursor (gcal);
gnome_calendar_previous (gcal);
set_normal_cursor (gcal);
}
static void
next_clicked (GtkWidget *widget, GnomeCalendar *gcal)
{
set_clock_cursor (gcal);
gnome_calendar_next (gcal);
set_normal_cursor (gcal);
}
static void
today_clicked (GtkWidget *widget, GnomeCalendar *gcal)
{
set_clock_cursor (gcal);
gnome_calendar_goto_today (gcal);
set_normal_cursor (gcal);
}
static void

View File

@ -61,6 +61,7 @@ mark_current_day (GnomeMonthItem *mitem)
item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_LABEL + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_prop (COLOR_PROP_CURRENT_DAY_FG),
"font", CURRENT_DAY_FONT,
NULL);
}
}
@ -115,4 +116,121 @@ unmark_month_item (GnomeMonthItem *mitem)
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"day_color", color_spec_from_prop (COLOR_PROP_DAY_FG),
NULL);
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"day_font", NORMAL_DAY_FONT,
NULL);
}
/* Frees the prelight information in the month item when it is destroyed */
static void
free_prelight_info (GtkObject *object, gpointer data)
{
g_free (gtk_object_get_data (object, "prelight_info"));
}
/* Handles EnterNotify and LeaveNotify events from the month item's day groups, and performs
* appropriate prelighting.
*/
static gint
day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
{
GnomeCanvasItem *mitem;
GnomeCanvasItem *box;
int child_num, day;
gulong *day_pixels;
GetPrelightColorFunc func;
gpointer func_data;
char *spec;
GdkColor color;
mitem = data;
child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (mitem), item);
day = gnome_month_item_num2day (GNOME_MONTH_ITEM (mitem), child_num);
if (day == 0)
return FALSE; /* it was a day outside the month's range */
child_num -= GNOME_MONTH_ITEM_DAY_GROUP;
box = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_BOX + child_num);
day_pixels = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_pixels");
func = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_func");
func_data = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_data");
switch (event->type) {
case GDK_ENTER_NOTIFY:
spec = (* func) (func_data);
gnome_canvas_item_set (box,
"fill_color", spec,
NULL);
break;
case GDK_LEAVE_NOTIFY:
color.pixel = day_pixels[child_num];
gnome_canvas_item_set (box,
"fill_color_gdk", &color,
NULL);
break;
default:
break;
}
return FALSE;
}
void
month_item_prepare_prelight (GnomeMonthItem *mitem, GetPrelightColorFunc func, gpointer func_data)
{
gulong *day_pixels;
GnomeCanvasItem *day_group;
GnomeCanvasItem *box;
GtkArg arg;
GdkColor *color;
int i;
day_pixels = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_pixels");
/* Set up the buffer for day background colors and attach it to the month item, if necessary */
if (!day_pixels) {
/* Create the buffer and attach it */
day_pixels = g_new (gulong, 42);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_pixels", day_pixels);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_func", func);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_data", func_data);
gtk_signal_connect (GTK_OBJECT (mitem), "destroy",
(GtkSignalFunc) free_prelight_info,
NULL);
/* Connect the appropriate signals to perform prelighting */
for (i = 0; i < 42; i++) {
day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_GROUP + i);
gtk_signal_connect (GTK_OBJECT (day_group), "event",
(GtkSignalFunc) day_event,
mitem);
}
}
/* Fetch the background colors from the day boxes and store them in the prelight info */
for (i = 0; i < 42; i++) {
box = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + i);
arg.name = "fill_color_gdk";
gtk_object_getv (GTK_OBJECT (box), 1, &arg);
color = GTK_VALUE_BOXED (arg);
day_pixels[i] = color->pixel;
g_free (color);
}
}
char *
default_prelight_func (gpointer data)
{
return color_spec_from_prop (COLOR_PROP_PRELIGHT_DAY_BG);
}

View File

@ -12,6 +12,12 @@
#include "gnome-month-item.h"
/* These are the fonts used for the montly calendars */
#define NORMAL_DAY_FONT "-adobe-helvetica-medium-r-normal--10-*-72-72-p-*-iso8859-1"
#define CURRENT_DAY_FONT "-adobe-helvetica-bold-r-normal--12-*-72-72-p-*-iso8859-1"
/* Takes a monthly calendar item and marks the days that have events scheduled for them in the
* specified calendar. It also highlights the current day.
*/
@ -20,5 +26,20 @@ void mark_month_item (GnomeMonthItem *mitem, Calendar *cal);
/* Unmarks all the days in the specified month item */
void unmark_month_item (GnomeMonthItem *mitem);
/* Prepares a monthly calendar item to prelight when the mouse goes over the days. If it is called
* on a month item that had already been prepared, it updates the internal color buffers -- you need
* to do this if you re-mark the month item, or if you change the global color configuration. The
* specified function is used to query the prelight colors; it must return a color spec.
*/
typedef char * (* GetPrelightColorFunc) (gpointer data);
void month_item_prepare_prelight (GnomeMonthItem *mitem, GetPrelightColorFunc func, gpointer func_data);
/* This is the default prelight function you can use for most puposes. You can use NULL as the
* func_data.
*/
char *default_prelight_func (gpointer data);
#endif

View File

@ -9,6 +9,7 @@
#include <libgnomeui/gnome-canvas-text.h>
#include "month-view.h"
#include "main.h"
#include "mark.h"
#define SPACING 4 /* Spacing between title and calendar */
@ -212,6 +213,6 @@ 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);
unmark_month_item (GNOME_MONTH_ITEM (mv->mitem));
/* FIXME */
}

View File

@ -1,6 +1,6 @@
/*
* Calendar properties dialog box
* (C) 1998 the Free Software Foundation
/* Calendar properties dialog box
*
* Copyright (C) 1998 the Free Software Foundation
*
* Authors: Miguel de Icaza <miguel@kernel.org>
* Federico Mena <federico@nuclecu.unam.mx>
@ -9,8 +9,9 @@
#include <langinfo.h>
#include <gnome.h>
#include "gnome-cal.h"
#include "main.h"
#include "gnome-month-item.h"
#include "main.h"
#include "mark.h"
/* These specify the page numbers in the preferences notebook */
enum {
@ -344,6 +345,60 @@ color_spec_from_picker (int num)
return build_color_spec (r, g, b);
}
/* Callback used to query prelight color information for the properties box */
static char *
fetch_prelight_spec (gpointer data)
{
return color_spec_from_picker (COLOR_PROP_PRELIGHT_DAY_BG);
}
/* Marks fake event days in the month item sample */
static void
fake_mark_days (void)
{
static int day_nums[] = { 1, 4, 8, 16, 17, 18, 20, 25, 28 }; /* some random days */
int day_index;
int i;
GnomeCanvasItem *item;
for (i = 0; i < (sizeof (day_nums) / sizeof (day_nums[0])); i++) {
day_index = gnome_month_item_day2index (GNOME_MONTH_ITEM (month_item), day_nums[i]);
item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), GNOME_MONTH_ITEM_DAY_BOX + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_picker (COLOR_PROP_MARK_DAY_BG),
NULL);
}
}
/* Switches the month item to the current date and highlights the current day's number */
static void
set_current_day (void)
{
struct tm *tm;
time_t t;
GnomeCanvasItem *item;
int day_index;
/* Set the date */
t = time (NULL);
tm = localtime (&t);
gnome_canvas_item_set (month_item,
"year", tm->tm_year + 1900,
"month", tm->tm_mon,
NULL);
/* Highlight current day */
day_index = gnome_month_item_day2index (GNOME_MONTH_ITEM (month_item), tm->tm_mday);
item = gnome_month_item_num2child (GNOME_MONTH_ITEM (month_item), GNOME_MONTH_ITEM_DAY_LABEL + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_picker (COLOR_PROP_CURRENT_DAY_FG),
"font", CURRENT_DAY_FONT,
NULL);
}
/* Sets the colors of the month item to the current prerences */
static void
reconfigure_month (void)
@ -360,10 +415,6 @@ reconfigure_month (void)
"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);
@ -371,6 +422,17 @@ reconfigure_month (void)
gnome_canvas_item_set (month_item,
"day_color", color_spec_from_picker (COLOR_PROP_DAY_FG),
NULL);
gnome_canvas_item_set (month_item,
"day_font", NORMAL_DAY_FONT,
NULL);
fake_mark_days ();
set_current_day ();
/* Reset prelighting information */
month_item_prepare_prelight (GNOME_MONTH_ITEM (month_item), fetch_prelight_spec, NULL);
}
/* Callback used when a color is changed */

View File

@ -154,6 +154,56 @@ need_resize (YearView *yv)
yv->idle_id = gtk_idle_add (idle_handler, yv);
}
/* Event handler for days in the year's month items */
static gint
day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
{
YearView *yv;
GnomeCanvasItem *mitem;
int child_num, day;
mitem = data;
child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (mitem), item);
day = gnome_month_item_num2day (GNOME_MONTH_ITEM (mitem), child_num);
yv = gtk_object_get_user_data (GTK_OBJECT (mitem));
switch (event->type) {
case GDK_BUTTON_PRESS:
if ((event->button.button == 1) && (day != 0))
gnome_calendar_dayjump (yv->calendar,
time_from_day (GNOME_MONTH_ITEM (mitem)->year,
GNOME_MONTH_ITEM (mitem)->month,
day));
break;
default:
break;
}
return FALSE;
}
/* Sets up the month item with the specified index -- connects signals for handling events, etc. */
static void
setup_month_item (YearView *yv, int n)
{
GnomeCanvasItem *mitem;
GnomeCanvasItem *item;
int i;
mitem = yv->mitems[n];
/* Connect signals */
for (i = 0; i < 42; i++) {
item = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_GROUP + i);
gtk_signal_connect (GTK_OBJECT (item), "event",
(GtkSignalFunc) day_event,
mitem);
}
}
static void
year_view_init (YearView *yv)
{
@ -191,10 +241,12 @@ year_view_init (YearView *yv)
/* Month item */
yv->mitems[i] = gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (yv)));
gtk_object_set_user_data (GTK_OBJECT (yv->mitems[i]), yv);
gnome_canvas_item_set (yv->mitems[i],
"anchor", GTK_ANCHOR_NW,
"start_on_monday", week_starts_on_monday,
NULL);
setup_month_item (yv, i);
}
/* We will need to resize the items when we paint for the first time */
@ -317,10 +369,7 @@ year_view_set (YearView *yv, time_t year)
/* Unmark and re-mark all the months */
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);
}
year_view_colors_changed (yv);
}
void
@ -350,5 +399,6 @@ year_view_colors_changed (YearView *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);
month_item_prepare_prelight (GNOME_MONTH_ITEM (yv->mitems[i]), default_prelight_func, NULL);
}
}