week-view: display events in header

Displaying events in the week-header based on duration of the event.
This commit is contained in:
pandusonu2
2016-12-01 23:48:53 -02:00
committed by Georges Basile Stavracas Neto
parent 16a1c9b55b
commit 188d7742b4
4 changed files with 107 additions and 4 deletions
+78
View File
@@ -154,6 +154,79 @@ gcal_week_header_finalize (GObject *object)
g_clear_pointer (&self->current_date, g_free);
}
void
gcal_week_header_add_event (GcalWeekHeader *self,
GcalEvent *event)
{
GDateTime *week_start, *week_end, *event_start, *event_end;
GtkWidget *child_widget, *place_holder_left, *place_holder_right;
gint start, end;
start = -1;
end = -1;
week_start = get_start_of_week (self);
week_end = g_date_time_add_days (week_start, 7);
event_start = gcal_event_get_date_start (event);
event_end = gcal_event_get_date_end (event);
child_widget = gcal_event_widget_new (event);
place_holder_left = gtk_invisible_new ();
place_holder_right = gtk_invisible_new ();
gtk_widget_set_visible (child_widget, TRUE);
gtk_widget_set_visible (place_holder_left, TRUE);
gtk_widget_set_visible (place_holder_right, TRUE);
start = (g_date_time_get_day_of_week (event_start) - self->first_weekday + 7) % 7;
end = (g_date_time_get_day_of_week (event_end) - self->first_weekday + 7) % 7;
if (g_date_time_compare (event_start, week_start) < 0)
start = 0;
if (g_date_time_compare (event_end, week_end) >= 0)
end = 6;
gtk_grid_insert_row (GTK_GRID (self->grid), 0);
if (gcal_event_get_all_day (event))
{
start = (g_date_time_get_day_of_week (event_start) - self->first_weekday + 7) % 7;
end = start;
}
gtk_grid_attach (GTK_GRID (self->grid),
child_widget,
start,
0,
end - start + 1,
1);
}
void
gcal_week_header_remove_event (GcalWeekHeader *header,
gchar *uuid)
{
GList *children, *l;
children = gtk_container_get_children (GTK_CONTAINER (header->grid));
for (l = children; l != NULL; l = g_list_next (l))
{
GcalEventWidget *child_widget;
GcalEvent *event;
if (!GCAL_IS_EVENT_WIDGET(l->data))
continue;
child_widget = GCAL_EVENT_WIDGET (l->data);
event = gcal_event_widget_get_event (child_widget);
if(child_widget != NULL && g_strcmp0 (uuid, gcal_event_get_uid (event)) == 0)
gtk_widget_destroy (GTK_WIDGET (l->data));
}
g_list_free (children);
}
static void
gcal_week_header_get_property (GObject *object,
guint prop_id,
@@ -366,7 +439,12 @@ gcal_week_header_class_init (GcalWeekHeaderClass *kclass)
static void
gcal_week_header_init (GcalWeekHeader *self)
{
gint i;
gtk_widget_init_template (GTK_WIDGET (self));
for (i = 1; i <= 7; i++)
gtk_grid_insert_column (GTK_GRID (self->grid), 0);
}
/* Public API */
+4
View File
@@ -39,6 +39,10 @@ void gcal_week_header_set_use_24h_format (GcalWeekHeader *self,
gboolean use_24h_format);
void gcal_week_header_set_current_date (GcalWeekHeader *self,
icaltimetype *current_date);
void gcal_week_header_add_event (GcalWeekHeader *header,
GcalEvent *event);
void gcal_week_header_remove_event (GcalWeekHeader *header,
gchar *uuid);
G_END_DECLS
+23 -4
View File
@@ -225,6 +225,9 @@ gcal_week_view_component_added (ECalDataModelSubscriber *subscriber,
GcalEvent *event;
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);
}
static void
@@ -233,10 +236,21 @@ gcal_week_view_component_modified (ECalDataModelSubscriber *subscriber,
ECalComponent *comp)
{
GcalWeekView *self = GCAL_WEEK_VIEW (subscriber);
GcalEvent *event;
GcalWeekHeader *header;
gchar *uuid;
header = GCAL_WEEK_HEADER (self->header);
event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, NULL);
uuid = get_uuid_from_component (e_client_get_source (E_CLIENT (client)), comp);
/* TODO: Implement for week_header and week_grid with if */
if (gcal_event_is_multiday (event) || gcal_event_get_all_day (event))
gcal_week_header_remove_event (header, uuid);
g_free (uuid);
gcal_week_view_component_added (subscriber, client, comp);
}
static void
@@ -245,18 +259,23 @@ gcal_week_view_component_removed (ECalDataModelSubscriber *subscriber,
const gchar *uid,
const gchar *rid)
{
GcalWeekView *week_view = GCAL_WEEK_VIEW (subscriber);
GList *children, *l;
GcalWeekView *self = GCAL_WEEK_VIEW (subscriber);
GcalWeekHeader *header;
ESource *source;
gchar *uuid;
header = GCAL_WEEK_HEADER (self->header);
source = e_client_get_source (E_CLIENT (client));
if (rid != NULL)
uuid = g_strdup_printf ("%s:%s:%s", e_source_get_uid (source), uid, rid);
else
uuid = g_strdup_printf ("%s:%s", e_source_get_uid (source), uid);
/* TODO: Implement for week_header and week_grid with if */
gcal_week_header_remove_event (header, uuid);
g_free (uuid);
}
static void