window: sync search-view hiding with stack transition

The previous approach was causing an error on the animation code of
GtkStack because the search-view's GdkWindow was banishing before
the end of the animation.
This commit is contained in:
Erick Pérez Castellanos
2014-12-04 17:10:50 -05:00
parent e68ca325b4
commit 461057727b
+44 -9
View File
@@ -82,6 +82,7 @@ typedef struct
/* states */
gboolean new_event_mode;
gboolean search_mode;
gboolean leaving_search_mode;
NewEventData *event_creation_data;
/* FIXME: Review to see if this are needed */
@@ -120,6 +121,10 @@ static void view_changed (GObject *o
GParamSpec *pspec,
gpointer user_data);
static void stack_transition_running (GObject *object,
GParamSpec *pspec,
gpointer user_data);
static void set_new_event_mode (GcalWindow *window,
gboolean enabled);
@@ -479,6 +484,41 @@ view_changed (GObject *object,
update_view (GCAL_WINDOW (user_data));
}
/**
* stack_transition_running:
* @object:
* @pspec:
* @user_data:
*
* Listen on the transition of the stack to leave search-mode properly
**/
static void
stack_transition_running (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
GcalWindowPrivate *priv;
priv = gcal_window_get_instance_private (GCAL_WINDOW (user_data));
/* XXX: this is the destruction process */
if (!gtk_widget_get_visible (priv->views_stack))
return;
if (!priv->leaving_search_mode)
return;
priv->leaving_search_mode = FALSE;
gtk_container_remove (GTK_CONTAINER (priv->views_stack),
priv->views[GCAL_WINDOW_VIEW_SEARCH]);
gtk_widget_hide (priv->views[GCAL_WINDOW_VIEW_SEARCH]);
gtk_header_bar_set_custom_title (GTK_HEADER_BAR (priv->header_bar),
priv->views_switcher);
/* Reset manager filter */
gcal_manager_set_query (priv->manager, NULL);
}
static void
set_new_event_mode (GcalWindow *window,
gboolean enabled)
@@ -834,6 +874,7 @@ search_toggled (GObject *object,
gtk_widget_hide (priv->today_button);
gtk_widget_hide (priv->nav_bar);
gtk_widget_show (priv->views[GCAL_WINDOW_VIEW_SEARCH]);
gtk_stack_add_named (GTK_STACK (priv->views_stack),
priv->views[GCAL_WINDOW_VIEW_SEARCH],
"search");
@@ -854,14 +895,7 @@ search_toggled (GObject *object,
gtk_stack_set_visible_child (GTK_STACK (priv->views_stack),
priv->views[priv->active_view]);
gtk_container_remove (GTK_CONTAINER (priv->views_stack),
priv->views[GCAL_WINDOW_VIEW_SEARCH]);
gtk_header_bar_set_custom_title (GTK_HEADER_BAR (priv->header_bar),
priv->views_switcher);
/* Reset manager filter */
gcal_manager_set_query (priv->manager, NULL);
priv->leaving_search_mode = TRUE;
}
}
@@ -1120,7 +1154,6 @@ gcal_window_constructed (GObject *object)
priv->views[GCAL_WINDOW_VIEW_SEARCH] =
gcal_search_view_new (priv->manager);
g_object_ref_sink (priv->views[GCAL_WINDOW_VIEW_SEARCH]);
gtk_widget_show (priv->views[GCAL_WINDOW_VIEW_SEARCH]);
g_object_bind_property (GCAL_WINDOW (object), "active-date",
priv->views[GCAL_WINDOW_VIEW_SEARCH],
@@ -1177,6 +1210,8 @@ gcal_window_constructed (GObject *object)
g_signal_connect (priv->views_stack, "notify::visible-child",
G_CALLBACK (view_changed), object);
g_signal_connect (priv->views_stack, "notify::transition-running",
G_CALLBACK (stack_transition_running), object);
g_signal_connect (priv->today_button, "clicked",
G_CALLBACK (date_updated), object);