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:
+44
-9
@@ -82,6 +82,7 @@ typedef struct
|
|||||||
/* states */
|
/* states */
|
||||||
gboolean new_event_mode;
|
gboolean new_event_mode;
|
||||||
gboolean search_mode;
|
gboolean search_mode;
|
||||||
|
gboolean leaving_search_mode;
|
||||||
|
|
||||||
NewEventData *event_creation_data;
|
NewEventData *event_creation_data;
|
||||||
/* FIXME: Review to see if this are needed */
|
/* FIXME: Review to see if this are needed */
|
||||||
@@ -120,6 +121,10 @@ static void view_changed (GObject *o
|
|||||||
GParamSpec *pspec,
|
GParamSpec *pspec,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
|
static void stack_transition_running (GObject *object,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
static void set_new_event_mode (GcalWindow *window,
|
static void set_new_event_mode (GcalWindow *window,
|
||||||
gboolean enabled);
|
gboolean enabled);
|
||||||
|
|
||||||
@@ -479,6 +484,41 @@ view_changed (GObject *object,
|
|||||||
update_view (GCAL_WINDOW (user_data));
|
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
|
static void
|
||||||
set_new_event_mode (GcalWindow *window,
|
set_new_event_mode (GcalWindow *window,
|
||||||
gboolean enabled)
|
gboolean enabled)
|
||||||
@@ -834,6 +874,7 @@ search_toggled (GObject *object,
|
|||||||
gtk_widget_hide (priv->today_button);
|
gtk_widget_hide (priv->today_button);
|
||||||
gtk_widget_hide (priv->nav_bar);
|
gtk_widget_hide (priv->nav_bar);
|
||||||
|
|
||||||
|
gtk_widget_show (priv->views[GCAL_WINDOW_VIEW_SEARCH]);
|
||||||
gtk_stack_add_named (GTK_STACK (priv->views_stack),
|
gtk_stack_add_named (GTK_STACK (priv->views_stack),
|
||||||
priv->views[GCAL_WINDOW_VIEW_SEARCH],
|
priv->views[GCAL_WINDOW_VIEW_SEARCH],
|
||||||
"search");
|
"search");
|
||||||
@@ -854,14 +895,7 @@ search_toggled (GObject *object,
|
|||||||
|
|
||||||
gtk_stack_set_visible_child (GTK_STACK (priv->views_stack),
|
gtk_stack_set_visible_child (GTK_STACK (priv->views_stack),
|
||||||
priv->views[priv->active_view]);
|
priv->views[priv->active_view]);
|
||||||
|
priv->leaving_search_mode = TRUE;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1120,7 +1154,6 @@ gcal_window_constructed (GObject *object)
|
|||||||
priv->views[GCAL_WINDOW_VIEW_SEARCH] =
|
priv->views[GCAL_WINDOW_VIEW_SEARCH] =
|
||||||
gcal_search_view_new (priv->manager);
|
gcal_search_view_new (priv->manager);
|
||||||
g_object_ref_sink (priv->views[GCAL_WINDOW_VIEW_SEARCH]);
|
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",
|
g_object_bind_property (GCAL_WINDOW (object), "active-date",
|
||||||
priv->views[GCAL_WINDOW_VIEW_SEARCH],
|
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_signal_connect (priv->views_stack, "notify::visible-child",
|
||||||
G_CALLBACK (view_changed), object);
|
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_signal_connect (priv->today_button, "clicked",
|
||||||
G_CALLBACK (date_updated), object);
|
G_CALLBACK (date_updated), object);
|
||||||
|
|||||||
Reference in New Issue
Block a user