month-view: fix ::add, ::remove, ::forall vfuncs

Fixed some bugs:
1. Insert single-day event-widgets on the proper structure
(GcalMonthView::single_day_children)
2. Add FIXME for keep single-day events-widgets ordered
3. Properly handle hash table replacement. GHashTable::replace call
key_destroy_func() and value_destroy_func() if those are provided
4. Don't keep NULL lists on any of the hashes kept by GcalMonthView
5. Change the order in which forall is executed. Don't modify the hashes
while iterating over it.
This commit is contained in:
Erick Pérez Castellanos
2014-12-18 01:03:45 -05:00
parent 9c29618fb6
commit 4c7626cad2
+26 -19
View File
@@ -1200,10 +1200,11 @@ gcal_month_view_add (GtkContainer *container,
date = gcal_event_widget_get_date (GCAL_EVENT_WIDGET (widget)); date = gcal_event_widget_get_date (GCAL_EVENT_WIDGET (widget));
l = g_hash_table_lookup (priv->single_day_children, GINT_TO_POINTER (date->day)); l = g_hash_table_lookup (priv->single_day_children, GINT_TO_POINTER (date->day));
/* FIXME add sorted */
l = g_list_append (l, widget); l = g_list_append (l, widget);
if (g_list_length (l) == 1) if (g_list_length (l) == 1)
g_hash_table_insert (priv->children, GINT_TO_POINTER (date->day), l); g_hash_table_insert (priv->single_day_children, GINT_TO_POINTER (date->day), l);
g_free (date); g_free (date);
} }
@@ -1220,6 +1221,7 @@ gcal_month_view_remove (GtkContainer *container,
GList *l, *aux; GList *l, *aux;
gboolean was_visible = FALSE; gboolean was_visible = FALSE;
GtkWidget *master_widget; GtkWidget *master_widget;
icaltimetype *date;
g_return_if_fail (gtk_widget_get_parent (widget) == GTK_WIDGET (container)); g_return_if_fail (gtk_widget_get_parent (widget) == GTK_WIDGET (container));
priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (container)); priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (container));
@@ -1229,29 +1231,34 @@ gcal_month_view_remove (GtkContainer *container,
{ {
master_widget = (GtkWidget*) l->data; master_widget = (GtkWidget*) l->data;
was_visible = gtk_widget_get_visible (widget);
gtk_widget_unparent (widget);
if (widget == master_widget) if (widget == master_widget)
{ {
g_debug ("removing a master widget"); g_debug ("removing a master widget");
/* FIXME, should I remove every parts when removing a master widget */
if (gcal_event_widget_is_multiday (GCAL_EVENT_WIDGET (widget))) if (gcal_event_widget_is_multiday (GCAL_EVENT_WIDGET (widget)))
{ {
priv->multiday_children = g_list_remove (priv->multiday_children, widget); priv->multiday_children = g_list_remove (priv->multiday_children, widget);
} }
else else
{ {
icaltimetype *date;
date = gcal_event_widget_get_date (GCAL_EVENT_WIDGET (widget)); date = gcal_event_widget_get_date (GCAL_EVENT_WIDGET (widget));
aux = g_hash_table_lookup (priv->single_day_children, GINT_TO_POINTER (date->day)); aux = g_hash_table_lookup (priv->single_day_children, GINT_TO_POINTER (date->day));
aux = g_list_remove (aux, widget); aux = g_list_remove (g_list_copy (aux), widget);
if (aux == NULL)
g_hash_table_remove (priv->single_day_children, GINT_TO_POINTER (date->day));
else
g_hash_table_replace (priv->single_day_children, GINT_TO_POINTER (date->day), aux); g_hash_table_replace (priv->single_day_children, GINT_TO_POINTER (date->day), aux);
} }
} }
l = g_list_remove (l, widget); l = g_list_remove (g_list_copy (l), widget);
g_hash_table_replace (priv->children, (gchar*) gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (widget)), l); if (l == NULL)
g_hash_table_remove (priv->children, (gchar*) gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (widget)));
was_visible = gtk_widget_get_visible (widget); else
gtk_widget_unparent (widget); g_hash_table_replace (priv->children, g_strdup (gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (widget))), l);
if (was_visible) if (was_visible)
gtk_widget_queue_resize (GTK_WIDGET (container)); gtk_widget_queue_resize (GTK_WIDGET (container));
@@ -1265,24 +1272,24 @@ gcal_month_view_forall (GtkContainer *container,
gpointer callback_data) gpointer callback_data)
{ {
GcalMonthViewPrivate *priv; GcalMonthViewPrivate *priv;
GList *l, *last; GList *l, *aux;
priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (container)); priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (container));
l = g_hash_table_get_values (priv->children); aux = NULL;
while (l != NULL)
{
last = g_list_last (l);
l = l->next;
while (last != NULL) for (l = g_hash_table_get_values (priv->children); l != NULL; l = g_list_next (l))
aux = g_list_concat (aux, g_list_copy (l->data)); /* FIXME: check if reverse puts parts ahead of master */
g_list_free (l);
while (aux != NULL)
{ {
GtkWidget *widget = (GtkWidget*) last->data; GtkWidget *widget = (GtkWidget*) aux->data;
last = last->prev; aux = aux->next;
(*callback) (widget, callback_data); (*callback) (widget, callback_data);
} }
} g_list_free (aux);
} }
/* GcalView Interface API */ /* GcalView Interface API */