diff options
Diffstat (limited to 'calendar/gui/e-week-view-event-item.c')
-rw-r--r-- | calendar/gui/e-week-view-event-item.c | 260 |
1 files changed, 154 insertions, 106 deletions
diff --git a/calendar/gui/e-week-view-event-item.c b/calendar/gui/e-week-view-event-item.c index 074aebe486..d50172787b 100644 --- a/calendar/gui/e-week-view-event-item.c +++ b/calendar/gui/e-week-view-event-item.c @@ -48,6 +48,12 @@ static void e_week_view_event_item_draw (GnomeCanvasItem *item, int y, int width, int height); +static void e_week_view_draw_time (EWeekView *week_view, + GdkDrawable *drawable, + gint time_x, + gint time_y, + gint hour, + gint minute); static void e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem, GdkDrawable *drawable, gint icon_x, @@ -237,13 +243,12 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, EWeekViewEventSpan *span; GtkStyle *style; GdkGC *fg_gc, *gc; - GdkFont *font; - gint x1, y1, x2, y2, time_x, time_y, time_y_small_min; - gint icon_x, icon_y, time_width, min_end_time_x; + gint x1, y1, x2, y2, time_x, time_y; + gint icon_x, icon_y, time_width, min_end_time_x, max_icon_x; gint rect_x, rect_w, rect_x2; gboolean one_day_event, editing_span = FALSE; - gint start_minute, end_minute; - gchar buffer[128]; + gint start_hour, start_minute, end_hour, end_minute; + gboolean draw_start, draw_end; gboolean draw_start_triangle = FALSE, draw_end_triangle = FALSE; GdkRectangle clip_rect; @@ -265,7 +270,6 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, event->spans_index + wveitem->span_num); style = GTK_WIDGET (week_view)->style; - font = style->font; fg_gc = style->fg_gc[GTK_STATE_NORMAL]; gc = week_view->main_gc; @@ -277,84 +281,64 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, if (x1 == x2 || y1 == y2) return; - icon_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT + E_WEEK_VIEW_ICON_Y_PAD; - start_minute = event->start_minute; - end_minute = event->end_minute; - time_y_small_min = 0; icon_x = 0; + icon_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT + E_WEEK_VIEW_ICON_Y_PAD; - time_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT - + E_WEEK_VIEW_EVENT_TEXT_Y_PAD + font->ascent; + /* Get the start & end times in 24-hour format. */ + start_hour = event->start_minute / 60; + start_minute = event->start_minute % 60; + end_hour = event->end_minute / 60; + end_minute = event->end_minute % 60; - if (week_view->small_font) - time_y_small_min = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT - + E_WEEK_VIEW_EVENT_TEXT_Y_PAD - + week_view->small_font->ascent; + time_y = y1 + E_WEEK_VIEW_EVENT_BORDER_HEIGHT + + E_WEEK_VIEW_EVENT_TEXT_Y_PAD; - if (week_view->use_small_font && week_view->small_font) - time_width = week_view->digit_width * 2 - + week_view->small_digit_width * 2; - else - time_width = week_view->digit_width * 4 - + week_view->colon_width; + time_width = e_week_view_get_time_string_width (week_view); one_day_event = e_week_view_is_one_day_event (week_view, wveitem->event_num); if (one_day_event) { time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD; - /* Convert the time into a string. We use different parts of - the string for the different time formats. Notice that the - string is always 11 characters long. */ - sprintf (buffer, "%02i:%02i %02i:%02i", - start_minute / 60, start_minute % 60, - end_minute / 60, end_minute % 60); - /* Draw the start and end times, as required. */ switch (week_view->time_format) { case E_WEEK_VIEW_TIME_BOTH_SMALL_MIN: - gdk_draw_text (drawable, font, fg_gc, - time_x, time_y, buffer, 2); - gdk_draw_text (drawable, week_view->small_font, fg_gc, - time_x + week_view->digit_width * 2, - time_y_small_min, buffer + 3, 2); - gdk_draw_text (drawable, font, fg_gc, - time_x + week_view->digit_width * 4 - 2, - time_y, buffer + 6, 2); - gdk_draw_text (drawable, week_view->small_font, fg_gc, - time_x + week_view->digit_width * 6 - 2, - time_y_small_min, buffer + 9, 2); - - icon_x = x1 + time_width * 2 + week_view->space_width - + E_WEEK_VIEW_EVENT_TEXT_X_PAD; - break; - case E_WEEK_VIEW_TIME_START_SMALL_MIN: - gdk_draw_text (drawable, font, fg_gc, - time_x, time_y, buffer, 2); - gdk_draw_text (drawable, week_view->small_font, fg_gc, - time_x + week_view->digit_width * 2, - time_y_small_min, buffer + 3, 2); - - icon_x = x1 + time_width - + E_WEEK_VIEW_EVENT_TEXT_X_PAD; - break; case E_WEEK_VIEW_TIME_BOTH: - gdk_draw_text (drawable, font, fg_gc, - time_x, time_y, buffer, 11); - icon_x = x1 + time_width * 2 + week_view->space_width - + E_WEEK_VIEW_EVENT_TEXT_X_PAD; + draw_start = TRUE; + draw_end = TRUE; break; + + case E_WEEK_VIEW_TIME_START_SMALL_MIN: case E_WEEK_VIEW_TIME_START: - gdk_draw_text (drawable, font, fg_gc, - time_x, time_y, buffer, 5); - icon_x = x1 + time_width - + E_WEEK_VIEW_EVENT_TEXT_X_PAD; + draw_start = TRUE; + draw_end = FALSE; break; + case E_WEEK_VIEW_TIME_NONE: - icon_x = x1 + E_WEEK_VIEW_EVENT_L_PAD; + draw_start = FALSE; + draw_end = FALSE; break; } + if (draw_start) { + e_week_view_draw_time (week_view, drawable, + time_x, time_y, + start_hour, start_minute); + time_x += time_width; + } + + if (draw_end) { + time_x += E_WEEK_VIEW_EVENT_TIME_SPACING; + e_week_view_draw_time (week_view, drawable, + time_x, time_y, + end_hour, end_minute); + time_x += time_width; + } + + icon_x = time_x; + if (draw_start) + icon_x += E_WEEK_VIEW_EVENT_TIME_X_PAD; + /* Draw the icons. */ e_week_view_event_item_draw_icons (wveitem, drawable, icon_x, icon_y, @@ -365,7 +349,10 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, rect_w = x2 - x1 - E_WEEK_VIEW_EVENT_L_PAD - E_WEEK_VIEW_EVENT_R_PAD + 1; - /* Draw the triangles at the start & end, if needed. */ + /* Draw the triangles at the start & end, if needed. + They also use the first few pixels at the edge of the + event so we update rect_x & rect_w so we don't draw over + them. */ if (event->start < week_view->day_starts[span->start_day]) { draw_start_triangle = TRUE; rect_x += 2; @@ -402,17 +389,21 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, if (span->text_item && E_TEXT (span->text_item)->editing) editing_span = TRUE; - /* Draw the start & end times, if necessary. */ + /* Draw the start & end times, if they are not on day + boundaries. The start time would always be shown if it was + needed, though it may be clipped as the window shrinks. + The end time is only displayed if there is enough room. + We calculate the minimum position for the end time, which + depends on whether the start time is displayed. If the end + time doesn't fit, then we don't draw it. */ min_end_time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD + E_WEEK_VIEW_EVENT_BORDER_WIDTH - + E_WEEK_VIEW_EVENT_TEXT_X_PAD; + + E_WEEK_VIEW_EVENT_EDGE_X_PAD; if (!editing_span && event->start > week_view->day_starts[span->start_day]) { - sprintf (buffer, "%02i:%02i", - start_minute / 60, start_minute % 60); time_x = x1 + E_WEEK_VIEW_EVENT_L_PAD + E_WEEK_VIEW_EVENT_BORDER_WIDTH - + E_WEEK_VIEW_EVENT_TEXT_X_PAD; + + E_WEEK_VIEW_EVENT_EDGE_X_PAD; clip_rect.x = x1; clip_rect.y = y1; @@ -421,52 +412,39 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, clip_rect.height = y2 - y1 + 1; gdk_gc_set_clip_rectangle (fg_gc, &clip_rect); - if (week_view->use_small_font - && week_view->small_font) { - gdk_draw_text (drawable, font, fg_gc, - time_x, time_y, buffer, 2); - gdk_draw_text (drawable, week_view->small_font, - fg_gc, - time_x + week_view->digit_width * 2, - time_y_small_min, - buffer + 3, 2); - } else { - gdk_draw_text (drawable, font, fg_gc, - time_x, time_y, buffer, 5); - } + e_week_view_draw_time (week_view, drawable, + time_x, time_y, + start_hour, start_minute); gdk_gc_set_clip_rectangle (fg_gc, NULL); - min_end_time_x += time_width + 2; + /* We don't want the end time to be drawn over the + start time, so we increase the minimum position. */ + min_end_time_x += time_width + + E_WEEK_VIEW_EVENT_TIME_X_PAD; } + max_icon_x = x2 + 1 - E_WEEK_VIEW_EVENT_R_PAD + - E_WEEK_VIEW_EVENT_BORDER_WIDTH + - E_WEEK_VIEW_EVENT_EDGE_X_PAD; + if (!editing_span && event->end < week_view->day_starts[span->start_day + span->num_days]) { - sprintf (buffer, "%02i:%02i", - end_minute / 60, end_minute % 60); - time_x = x2 - E_WEEK_VIEW_EVENT_R_PAD + /* Calculate where the end time should be displayed. */ + time_x = x2 + 1 - E_WEEK_VIEW_EVENT_R_PAD - E_WEEK_VIEW_EVENT_BORDER_WIDTH - - E_WEEK_VIEW_EVENT_TEXT_X_PAD - 1 + - E_WEEK_VIEW_EVENT_EDGE_X_PAD - time_width; + /* Draw the end time, if the position is greater than + the minimum calculated above. */ if (time_x >= min_end_time_x) { - if (week_view->use_small_font - && week_view->small_font) { - gdk_draw_text (drawable, font, fg_gc, + e_week_view_draw_time (week_view, drawable, time_x, time_y, - buffer, 2); - gdk_draw_text (drawable, - week_view->small_font, - fg_gc, - time_x + week_view->digit_width * 2, - time_y_small_min, - buffer + 3, 2); - } else { - gdk_draw_text (drawable, font, fg_gc, - time_x, time_y, - buffer, 5); - } + end_hour, end_minute); + max_icon_x -= time_width + + E_WEEK_VIEW_EVENT_TIME_X_PAD; } } @@ -475,13 +453,83 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, icon_x = span->text_item->x1 - x; e_week_view_event_item_draw_icons (wveitem, drawable, icon_x, icon_y, - x2, TRUE); + max_icon_x, TRUE); } } } static void +e_week_view_draw_time (EWeekView *week_view, + GdkDrawable *drawable, + gint time_x, + gint time_y, + gint hour, + gint minute) +{ + GtkStyle *style; + GdkGC *fg_gc; + GdkFont *font, *small_font; + gint hour_to_display, suffix_width; + gint time_y_normal_font, time_y_small_font; + gchar buffer[128], *suffix; + + style = GTK_WIDGET (week_view)->style; + font = style->font; + small_font = week_view->small_font; + fg_gc = style->fg_gc[GTK_STATE_NORMAL]; + + time_y_normal_font = time_y_small_font = time_y + font->ascent; + if (small_font) + time_y_small_font = time_y + small_font->ascent; + + e_week_view_convert_time_to_display (week_view, hour, &hour_to_display, + &suffix, &suffix_width); + + if (week_view->use_small_font && week_view->small_font) { + g_snprintf (buffer, sizeof (buffer), "%2i:%02i", + hour_to_display, minute); + + /* Draw the hour. */ + if (hour_to_display < 10) + gdk_draw_text (drawable, font, fg_gc, + time_x + week_view->digit_width, + time_y_normal_font, buffer + 1, 1); + else + gdk_draw_text (drawable, font, fg_gc, + time_x, time_y_normal_font, buffer, 2); + + time_x += week_view->digit_width * 2; + + /* Draw the start minute, in the small font. */ + gdk_draw_text (drawable, week_view->small_font, fg_gc, + time_x, time_y_small_font, buffer + 3, 2); + + time_x += week_view->small_digit_width * 2; + + /* Draw the 'am'/'pm' suffix, if 12-hour format. */ + if (!week_view->use_24_hour_format) { + gdk_draw_string (drawable, font, fg_gc, + time_x, time_y_normal_font, suffix); + } + } else { + /* Draw the start time in one go. */ + g_snprintf (buffer, sizeof (buffer), "%2i:%02i%s", + hour_to_display, minute, suffix); + if (hour_to_display < 10) + gdk_draw_string (drawable, font, fg_gc, + time_x + week_view->digit_width, + time_y_normal_font, buffer + 1); + else + gdk_draw_string (drawable, font, fg_gc, + time_x, time_y_normal_font, + buffer); + + } +} + + +static void e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem, GdkDrawable *drawable, gint icon_x, @@ -741,12 +789,12 @@ e_week_view_event_item_get_position (EWeekViewEventItem *wveitem, if (!e_week_view_is_one_day_event (week_view, wveitem->event_num)) { if (x < item->x1 + E_WEEK_VIEW_EVENT_L_PAD + E_WEEK_VIEW_EVENT_BORDER_WIDTH - + E_WEEK_VIEW_EVENT_TEXT_X_PAD) + + E_WEEK_VIEW_EVENT_EDGE_X_PAD) return E_WEEK_VIEW_POS_LEFT_EDGE; - if (x >= item->x2 - E_WEEK_VIEW_EVENT_R_PAD + if (x >= item->x2 + 1 - E_WEEK_VIEW_EVENT_R_PAD - E_WEEK_VIEW_EVENT_BORDER_WIDTH - - E_WEEK_VIEW_EVENT_TEXT_X_PAD) + - E_WEEK_VIEW_EVENT_EDGE_X_PAD) return E_WEEK_VIEW_POS_RIGHT_EDGE; } |