📄 gtkcalendar.c
字号:
{ GtkCalendar *calendar; GdkGC *gc; gchar buffer[255]; gint day; gint day_height; gint x_left; gint x_loc; gint y_top; gint y_baseline; gint day_xspace; GtkCalendarPrivateData *private_data; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_CALENDAR (widget)); g_return_if_fail (row < 6); g_return_if_fail (col < 7); calendar = GTK_CALENDAR (widget); private_data = GTK_CALENDAR_PRIVATE_DATA (widget); /* * Handle freeze/thaw functionality */ if (private_data->freeze_count) { private_data->dirty_main = 1; return; } day_height = row_height (calendar); day_xspace = private_data->day_width - private_data->max_day_char_width*2; day = calendar->day[row][col]; x_left = left_x_for_column (calendar, col); x_loc = x_left + private_data->day_width / 2 + private_data->max_day_char_width; y_top = top_y_for_row (calendar, row); y_baseline = y_top + (day_height + private_data->max_day_char_ascent)/2; gdk_window_clear_area (private_data->main_win, x_left, y_top, private_data->day_width, day_height); gc = calendar->gc; if (calendar->day_month[row][col] == MONTH_PREV) { gdk_gc_set_foreground (gc, PREV_MONTH_COLOR (GTK_WIDGET (calendar))); } else if (calendar->day_month[row][col] == MONTH_NEXT) { gdk_gc_set_foreground (gc, NEXT_MONTH_COLOR (GTK_WIDGET (calendar))); } else { /* if (calendar->highlight_row == row && calendar->highlight_col == col) { gdk_gc_set_foreground (gc, HIGHLIGHT_BACK_COLOR (GTK_WIDGET (calendar))); gdk_draw_rectangle (private_data->main_win, gc, TRUE, x_left, y_top, private_data->day_width, day_height); } */ if (calendar->selected_day == day) { gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->bg[GTK_STATE_SELECTED])); gdk_draw_rectangle (private_data->main_win, gc, TRUE, x_left, y_top, private_data->day_width, day_height); } if (calendar->marked_date[day-1]) gdk_gc_set_foreground (gc, MARKED_COLOR (GTK_WIDGET (calendar))); else gdk_gc_set_foreground (gc, NORMAL_DAY_COLOR (GTK_WIDGET (calendar))); if (calendar->selected_day == day) gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->fg[GTK_STATE_SELECTED])); else gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->fg[GTK_WIDGET_STATE (calendar)])); } sprintf (buffer, "%d", day); x_loc -= gdk_string_measure (DAY_FONT (widget), buffer); sprintf (buffer, "%d", day); gdk_draw_string (private_data->main_win, DAY_FONT (widget), gc, x_loc, y_baseline, buffer); if (calendar->marked_date[day-1] && calendar->day_month[row][col] == MONTH_CURRENT) gdk_draw_string (private_data->main_win, DAY_FONT (widget), gc, x_loc-1, y_baseline, buffer); if (GTK_WIDGET_HAS_FOCUS (calendar) && calendar->focus_row == row && calendar->focus_col == col) { gdk_draw_rectangle (private_data->main_win, calendar->xor_gc, FALSE, x_left, y_top, private_data->day_width-1, day_height-1); }}static voidgtk_calendar_paint_main (GtkWidget *widget){ GtkCalendar *calendar; GtkCalendarPrivateData *private_data; gint row, col; g_return_if_fail (widget != NULL); g_return_if_fail (widget->window != NULL); g_return_if_fail (GTK_IS_CALENDAR (widget)); calendar = GTK_CALENDAR (widget); private_data = GTK_CALENDAR_PRIVATE_DATA (widget); if (private_data->freeze_count) { private_data->dirty_main = 1; return; } private_data->dirty_main = 0; gdk_window_clear (private_data->main_win); /* gtk_calendar_compute_days (calendar); */ /* REMOVE later */ for (col = 0; col < 7; col++) for (row = 0; row < 6; row++) gtk_calendar_paint_day (widget, row, col);}static voidgtk_calendar_compute_days (GtkCalendar *calendar){ gint month; gint year; gint ndays_in_month; gint ndays_in_prev_month; gint first_day; gint row; gint col; gint day; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_CALENDAR (calendar)); year = calendar->year; month = calendar->month + 1; ndays_in_month = month_length[leap (year)][month]; first_day = day_of_week (year, month, 1); if (calendar->display_flags & GTK_CALENDAR_WEEK_START_MONDAY) first_day--; else first_day %= 7; /* Compute days of previous month */ if (month > 1) ndays_in_prev_month = month_length[leap (year)][month-1]; else ndays_in_prev_month = month_length[leap (year)][12]; day = ndays_in_prev_month - first_day + 1; row = 0; if (first_day > 0) { for (col = 0; col < first_day; col++) { calendar->day[row][col] = day; calendar->day_month[row][col] = MONTH_PREV; day++; } } /* Compute days of current month */ col = first_day; for (day = 1; day <= ndays_in_month; day++) { calendar->day[row][col] = day; calendar->day_month[row][col] = MONTH_CURRENT; col++; if (col == 7) { row++; col = 0; } } /* Compute days of next month */ day = 1; for (; row <= 5; row++) { for (; col <= 6; col++) { calendar->day[row][col] = day; calendar->day_month[row][col] = MONTH_NEXT; day++; } col = 0; }}/* ---------------------------------------------------------------------- NAME: gtk_calendar_display_options DESCRIPTION: Set display options (whether to display the heading and the month headings) flags is can be an XOR of: GTK_CALENDAR_SHOW_HEADING GTK_CALENDAR_SHOW_DAY_NAMES GTK_CALENDAR_NO_MONTH_CHANGE GTK_CALENDAR_SHOW_WEEK_NUMBERS GTK_CALENDAR_WEEK_START_MONDAY ---------------------------------------------------------------------- */voidgtk_calendar_display_options (GtkCalendar *calendar, GtkCalendarDisplayOptions flags){ GtkCalendarPrivateData *private_data; gint resize = 0; GtkWidget *widget; gint i; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_CALENDAR (calendar)); widget = GTK_WIDGET (calendar); private_data = GTK_CALENDAR_PRIVATE_DATA (calendar); if (GTK_WIDGET_REALIZED (widget)) { if ((flags ^ calendar->display_flags) & GTK_CALENDAR_NO_MONTH_CHANGE) { resize ++; if (! (flags & GTK_CALENDAR_NO_MONTH_CHANGE) && (private_data->header_win)) { calendar->display_flags &= ~GTK_CALENDAR_NO_MONTH_CHANGE; gtk_calendar_realize_arrows (widget); } else { for (i = 0; i < 4; i++) { if (private_data->arrow_win[i]) { gdk_window_set_user_data (private_data->arrow_win[i], NULL); gdk_window_destroy (private_data->arrow_win[i]); private_data->arrow_win[i] = NULL; } } } } if ((flags ^ calendar->display_flags) & GTK_CALENDAR_SHOW_HEADING) { resize++; if (flags & GTK_CALENDAR_SHOW_HEADING) { calendar->display_flags |= GTK_CALENDAR_SHOW_HEADING; gtk_calendar_realize_header (widget); } else { for (i = 0; i < 4; i++) { if (private_data->arrow_win[i]) { gdk_window_set_user_data (private_data->arrow_win[i], NULL); gdk_window_destroy (private_data->arrow_win[i]); private_data->arrow_win[i] = NULL; } } gdk_window_set_user_data (private_data->header_win, NULL); gdk_window_destroy (private_data->header_win); private_data->header_win = NULL; } } if ((flags ^ calendar->display_flags) & GTK_CALENDAR_SHOW_DAY_NAMES) { resize++; if (flags & GTK_CALENDAR_SHOW_DAY_NAMES) { calendar->display_flags |= GTK_CALENDAR_SHOW_DAY_NAMES; gtk_calendar_realize_day_names (widget); } else { gdk_window_set_user_data (private_data->day_name_win, NULL); gdk_window_destroy (private_data->day_name_win); private_data->day_name_win = NULL; } } if ((flags ^ calendar->display_flags) & GTK_CALENDAR_SHOW_WEEK_NUMBERS) { resize++; if (flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS) { calendar->display_flags |= GTK_CALENDAR_SHOW_WEEK_NUMBERS; gtk_calendar_realize_week_numbers (widget); } else { gdk_window_set_user_data (private_data->week_win, NULL); gdk_window_destroy (private_data->week_win); private_data->week_win = NULL; } } if ((flags ^ calendar->display_flags) & GTK_CALENDAR_WEEK_START_MONDAY) { if (calendar->display_flags & GTK_CALENDAR_WEEK_START_MONDAY) calendar->display_flags &= ~GTK_CALENDAR_WEEK_START_MONDAY; else calendar->display_flags |= GTK_CALENDAR_WEEK_START_MONDAY; gtk_calendar_compute_days (calendar); gtk_calendar_paint_main (GTK_WIDGET (calendar)); if (private_data->day_name_win) gtk_calendar_paint_day_names (GTK_WIDGET (calendar)); } calendar->display_flags = flags; if (resize) gtk_widget_queue_resize (GTK_WIDGET (calendar)); } else calendar->display_flags = flags; }gintgtk_calendar_select_month (GtkCalendar *calendar, guint month, guint year){ g_return_val_if_fail (calendar != NULL, FALSE); g_return_val_if_fail (GTK_IS_CALENDAR (calendar), FALSE); g_return_val_if_fail (month <= 11, FALSE); calendar->month = month; calendar->year = year; gtk_calendar_compute_days (calendar); if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) gtk_calendar_paint (GTK_WIDGET (calendar), NULL); gtk_signal_emit (GTK_OBJECT (calendar), gtk_calendar_signals[MONTH_CHANGED_SIGNAL]); return TRUE;}voidgtk_calendar_select_day (GtkCalendar *calendar, guint day){ g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_CALENDAR (calendar)); g_return_if_fail (day <= 31); /* gtk_calendar_compute_days (calendar); */ /* Deselect the old day */ if (calendar->selected_day > 0) { gint selected_day; selected_day = calendar->selected_day; calendar->selected_day = 0; if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) gtk_calendar_paint_day_num (GTK_WIDGET (calendar), selected_day); } calendar->selected_day = day; /* Deselect the new day */ if (day != 0) { if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) gtk_calendar_paint_day_num (GTK_WIDGET (calendar), day); } gtk_signal_emit (GTK_OBJECT (calendar), gtk_calendar_signals[DAY_SELECTED_SIGNAL]);}voidgtk_calendar_clear_marks (GtkCalendar *calendar){ guint day; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_CALENDAR (calendar)); for (day = 0; day < 31; day++) { calendar->marked_date[day] = FALSE; } if (GTK_WIDGET_DRAWABLE (calendar)) { gtk_calendar_paint_main (GTK_WIDGET (calendar)); }}gintgtk_calendar_mark_day (GtkCalendar *calendar, guint day){ g_return_val_if_fail (calendar != NULL, FALSE); g_return_val_if_fail (GTK_IS_CALENDAR (calendar), FALSE); if (day >= 1 && day <= 31) calendar->marked_date[day - 1] = TRUE; if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) { gtk_calendar_paint_main (GTK_WIDGET (calendar)); } return TRUE;}gintgtk_calendar_unmark_day (GtkCalendar *calendar, guint day){ g_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -