gint gcal_event_widget_sort_events (GcalEventWidget *widget1, GcalEventWidget *widget2) { g_autoptr (GDateTime) dt_time1 = NULL; g_autoptr (GDateTime) dt_time2 = NULL; icaltimetype *ical_dt; gint diff; diff = gcal_event_is_multiday (widget2->event) - gcal_event_is_multiday (widget1->event); if (diff != 0) return diff; diff = gcal_event_widget_compare_by_start_date (widget1, widget2); if (diff != 0) return diff; diff = gcal_event_widget_compare_by_length (widget1, widget2); if (diff != 0) return diff; e_cal_component_get_last_modified (gcal_event_get_component (widget1->event), &ical_dt); if (ical_dt) dt_time1 = gcal_date_time_from_icaltime (ical_dt); e_cal_component_get_last_modified (gcal_event_get_component (widget2->event), &ical_dt); if (ical_dt) dt_time2 = gcal_date_time_from_icaltime (ical_dt); return dt_time1 && dt_time2 ? g_date_time_compare (dt_time2, dt_time1) : 0; }
/* ECalDataModelSubscriber implementation */ static void gcal_week_view_component_added (ECalDataModelSubscriber *subscriber, ECalClient *client, ECalComponent *comp) { GcalWeekView *self = GCAL_WEEK_VIEW (subscriber); GcalEvent *event; GCAL_ENTRY; event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, NULL); if (gcal_event_is_multiday (event) || gcal_event_get_all_day (event)) gcal_week_header_add_event (GCAL_WEEK_HEADER (self->header), event); else gcal_week_grid_add_event (GCAL_WEEK_GRID (self->week_grid), event); GCAL_EXIT; }
static void gcal_event_widget_set_event_tooltip (GcalEventWidget *self, GcalEvent *event) { g_autoptr (GDateTime) tooltip_start, tooltip_end; g_autofree gchar *start, *end, *escaped_summary; GString *tooltip_mesg; gboolean allday, multiday, is_ltr; guint description_len; tooltip_mesg = g_string_new (NULL); escaped_summary = g_markup_escape_text (gcal_event_get_summary (event), -1); g_string_append_printf (tooltip_mesg, "<b>%s</b>", escaped_summary); allday = gcal_event_get_all_day (event); multiday = gcal_event_is_multiday (event); is_ltr = gtk_widget_get_direction (GTK_WIDGET (self)) != GTK_TEXT_DIR_RTL; if (allday) { /* All day events span from [ start, end - 1 day ] */ tooltip_start = g_date_time_ref (gcal_event_get_date_start (event)); tooltip_end = g_date_time_add_days (gcal_event_get_date_end (event), -1); if (multiday) { start = g_date_time_format (tooltip_start, "%x"); end = g_date_time_format (tooltip_end, "%x"); } else { start = g_date_time_format (tooltip_start, "%x"); end = NULL; } } else { tooltip_start = g_date_time_to_local (gcal_event_get_date_start (event)); tooltip_end = g_date_time_to_local (gcal_event_get_date_end (event)); if (multiday) { if (self->clock_format_24h) { if (is_ltr) { start = g_date_time_format (tooltip_start, "%x %R"); end = g_date_time_format (tooltip_end, "%x %R"); } else { start = g_date_time_format (tooltip_start, "%R %x"); end = g_date_time_format (tooltip_end, "%R %x"); } } else { if (is_ltr) { start = g_date_time_format (tooltip_start, "%x %I:%M %P"); end = g_date_time_format (tooltip_end, "%x %I:%M %P"); } else { start = g_date_time_format (tooltip_start, "%P %M:%I %x"); end = g_date_time_format (tooltip_end, "%P %M:%I %x"); } } } else { if (self->clock_format_24h) { if (is_ltr) { start = g_date_time_format (tooltip_start, "%x, %R"); end = g_date_time_format (tooltip_end, "%R"); } else { start = g_date_time_format (tooltip_start, "%R ,%x"); end = g_date_time_format (tooltip_end, "%R"); } } else { if (is_ltr) { start = g_date_time_format (tooltip_start, "%x, %I:%M %P"); end = g_date_time_format (tooltip_end, "%I:%M %P"); } else { start = g_date_time_format (tooltip_start, "%P %M:%I ,%x"); end = g_date_time_format (tooltip_end, "%P %M:%I"); } } } } if (allday && !multiday) { g_string_append_printf (tooltip_mesg, "\n%s", start); } else { g_string_append_printf (tooltip_mesg, "\n%s - %s", is_ltr ? start : end, is_ltr ? end : start); } /* Append event location */ if (g_utf8_strlen (gcal_event_get_location (event), -1) > 0) { g_autofree gchar *escaped_location; escaped_location = g_markup_escape_text (gcal_event_get_location (event), -1); g_string_append (tooltip_mesg, "\n\n"); /* Translators: %s is the location of the event (e.g. "Downtown, 3rd Avenue") */ g_string_append_printf (tooltip_mesg, _("At %s"), escaped_location); } description_len = g_utf8_strlen (gcal_event_get_description (event), -1); /* Truncate long descriptions at a white space and ellipsize */ if (description_len > 0) { g_autofree gchar *escaped_description; GString *tooltip_desc; tooltip_desc = g_string_new (gcal_event_get_description (event)); /* If the description is larger than DESC_MAX_CHAR, ellipsize it */ if (description_len > DESC_MAX_CHAR) { g_string_truncate (tooltip_desc, DESC_MAX_CHAR - 1); g_string_append (tooltip_desc, "…"); } escaped_description = g_markup_escape_text (tooltip_desc->str, -1); g_string_append_printf (tooltip_mesg, "\n\n%s", escaped_description); g_string_free (tooltip_desc, TRUE); } gtk_widget_set_tooltip_markup (GTK_WIDGET (self), tooltip_mesg->str); g_string_free (tooltip_mesg, TRUE); }
static void gcal_event_widget_update_style (GcalEventWidget *self) { GtkStyleContext *context; gboolean slanted_start; gboolean slanted_end; gboolean timed; context = gtk_widget_get_style_context (GTK_WIDGET (self)); slanted_start = FALSE; slanted_end = FALSE; /* Clear previous style classes */ gtk_style_context_remove_class (context, "slanted"); gtk_style_context_remove_class (context, "slanted-start"); gtk_style_context_remove_class (context, "slanted-end"); /* * If the event's dates differs from the widget's dates, * add a slanted edge class at the widget. */ if (self->dt_start) slanted_start = g_date_time_compare (gcal_event_get_date_start (self->event), self->dt_start) != 0; if (self->dt_end) slanted_end = g_date_time_compare (gcal_event_get_date_end (self->event), self->dt_end) != 0; if (slanted_start && slanted_end) gtk_style_context_add_class (context, "slanted"); else if (slanted_start) gtk_style_context_add_class (context, "slanted-start"); else if (slanted_end) gtk_style_context_add_class (context, "slanted-end"); /* TODO: adjust margins based on the CSS gradients sizes, not hardcoded */ gtk_widget_set_margin_start (self->stack, slanted_start ? 20 : 4); gtk_widget_set_margin_end (self->stack, slanted_end ? 20 : 4); /* Add style classes for orientation selectors */ if (self->orientation == GTK_ORIENTATION_HORIZONTAL) { gtk_style_context_add_class (context, "horizontal"); gtk_style_context_remove_class (context, "vertical"); } else { gtk_style_context_add_class (context, "vertical"); gtk_style_context_remove_class (context, "horizontal"); } /* * If the event is a timed, single-day event, draw it differently * from all-day or multi-day events. */ timed = !gcal_event_get_all_day (self->event) && !gcal_event_is_multiday (self->event); gtk_widget_set_visible (self->color_box, timed); if (timed) { GtkStyleContext *context; context = gtk_widget_get_style_context (GTK_WIDGET (self)); gtk_style_context_add_class (context, "timed"); if (self->orientation == GTK_ORIENTATION_HORIZONTAL) { gtk_widget_set_margin_start (self->stack, 0); gtk_widget_set_margin_end (self->stack, 2); } else { gtk_widget_set_visible (self->color_box, FALSE); } } }