Add a way to specify transition types on the fly
Add a gtk_stack_set_visible_child_full that takes a transition type.
This commit is contained in:
@ -111,6 +111,8 @@ struct _GtkStackPrivate {
|
|||||||
guint tick_id;
|
guint tick_id;
|
||||||
gint64 start_time;
|
gint64 start_time;
|
||||||
gint64 end_time;
|
gint64 end_time;
|
||||||
|
|
||||||
|
GtkStackTransitionType active_transition_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void gtk_stack_add (GtkContainer *widget,
|
static void gtk_stack_add (GtkContainer *widget,
|
||||||
@ -626,9 +628,9 @@ get_bin_window_x (GtkStack *stack,
|
|||||||
|
|
||||||
if (priv->transition_pos < 1.0)
|
if (priv->transition_pos < 1.0)
|
||||||
{
|
{
|
||||||
if (priv->transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT)
|
if (priv->active_transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT)
|
||||||
x = allocation->width * (1 - ease_out_cubic (priv->transition_pos));
|
x = allocation->width * (1 - ease_out_cubic (priv->transition_pos));
|
||||||
if (priv->transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT)
|
if (priv->active_transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT)
|
||||||
x = -allocation->width * (1 - ease_out_cubic (priv->transition_pos));
|
x = -allocation->width * (1 - ease_out_cubic (priv->transition_pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -646,8 +648,8 @@ gtk_stack_set_transition_position (GtkStack *stack,
|
|||||||
gtk_widget_queue_draw (GTK_WIDGET (stack));
|
gtk_widget_queue_draw (GTK_WIDGET (stack));
|
||||||
|
|
||||||
if (priv->bin_window != NULL &&
|
if (priv->bin_window != NULL &&
|
||||||
(priv->transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT ||
|
(priv->active_transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT ||
|
||||||
priv->transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT))
|
priv->active_transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT))
|
||||||
{
|
{
|
||||||
GtkAllocation allocation;
|
GtkAllocation allocation;
|
||||||
gtk_widget_get_allocation (GTK_WIDGET (stack), &allocation);
|
gtk_widget_get_allocation (GTK_WIDGET (stack), &allocation);
|
||||||
@ -735,7 +737,9 @@ gtk_stack_unschedule_ticks (GtkStack *stack)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_stack_start_transition (GtkStack *stack)
|
gtk_stack_start_transition (GtkStack *stack,
|
||||||
|
GtkStackTransitionType transition_type,
|
||||||
|
guint transition_duration)
|
||||||
{
|
{
|
||||||
GtkStackPrivate *priv = stack->priv;
|
GtkStackPrivate *priv = stack->priv;
|
||||||
GtkWidget *widget = GTK_WIDGET (stack);
|
GtkWidget *widget = GTK_WIDGET (stack);
|
||||||
@ -747,26 +751,31 @@ gtk_stack_start_transition (GtkStack *stack)
|
|||||||
|
|
||||||
if (gtk_widget_get_mapped (widget) &&
|
if (gtk_widget_get_mapped (widget) &&
|
||||||
animations_enabled &&
|
animations_enabled &&
|
||||||
priv->transition_type != GTK_STACK_TRANSITION_TYPE_NONE &&
|
transition_type != GTK_STACK_TRANSITION_TYPE_NONE &&
|
||||||
|
transition_duration != 0 &&
|
||||||
priv->last_visible_child != NULL)
|
priv->last_visible_child != NULL)
|
||||||
{
|
{
|
||||||
gtk_widget_set_opacity (widget, 0.999);
|
gtk_widget_set_opacity (widget, 0.999);
|
||||||
|
|
||||||
priv->transition_pos = 0.0;
|
priv->transition_pos = 0.0;
|
||||||
priv->start_time = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (widget));
|
priv->start_time = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (widget));
|
||||||
priv->end_time = priv->start_time + (priv->transition_duration * 1000);
|
priv->end_time = priv->start_time + (transition_duration * 1000);
|
||||||
|
priv->active_transition_type = transition_type;
|
||||||
gtk_stack_schedule_ticks (stack);
|
gtk_stack_schedule_ticks (stack);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gtk_stack_unschedule_ticks (stack);
|
gtk_stack_unschedule_ticks (stack);
|
||||||
|
priv->active_transition_type = GTK_STACK_TRANSITION_TYPE_NONE;
|
||||||
gtk_stack_set_transition_position (stack, 1.0);
|
gtk_stack_set_transition_position (stack, 1.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_visible_child (GtkStack *stack,
|
set_visible_child (GtkStack *stack,
|
||||||
GtkStackChildInfo *child_info)
|
GtkStackChildInfo *child_info,
|
||||||
|
GtkStackTransitionType transition_type,
|
||||||
|
guint transition_duration)
|
||||||
{
|
{
|
||||||
GtkStackPrivate *priv = stack->priv;
|
GtkStackPrivate *priv = stack->priv;
|
||||||
GtkStackChildInfo *info;
|
GtkStackChildInfo *info;
|
||||||
@ -817,7 +826,7 @@ set_visible_child (GtkStack *stack,
|
|||||||
g_object_notify (G_OBJECT (stack), "visible-child");
|
g_object_notify (G_OBJECT (stack), "visible-child");
|
||||||
g_object_notify (G_OBJECT (stack), "visible-child-name");
|
g_object_notify (G_OBJECT (stack), "visible-child-name");
|
||||||
|
|
||||||
gtk_stack_start_transition (stack);
|
gtk_stack_start_transition (stack, transition_type, transition_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -834,10 +843,10 @@ stack_child_visibility_notify_cb (GObject *obj,
|
|||||||
|
|
||||||
if (priv->visible_child == NULL &&
|
if (priv->visible_child == NULL &&
|
||||||
gtk_widget_get_visible (child))
|
gtk_widget_get_visible (child))
|
||||||
set_visible_child (stack, child_info);
|
set_visible_child (stack, child_info, priv->transition_type, priv->transition_duration);
|
||||||
else if (priv->visible_child == child_info &&
|
else if (priv->visible_child == child_info &&
|
||||||
!gtk_widget_get_visible (child))
|
!gtk_widget_get_visible (child))
|
||||||
set_visible_child (stack, NULL);
|
set_visible_child (stack, NULL, priv->transition_type, priv->transition_duration);
|
||||||
|
|
||||||
if (child_info == priv->last_visible_child)
|
if (child_info == priv->last_visible_child)
|
||||||
{
|
{
|
||||||
@ -929,7 +938,7 @@ gtk_stack_add (GtkContainer *container,
|
|||||||
|
|
||||||
if (priv->visible_child == NULL &&
|
if (priv->visible_child == NULL &&
|
||||||
gtk_widget_get_visible (child))
|
gtk_widget_get_visible (child))
|
||||||
set_visible_child (stack, child_info);
|
set_visible_child (stack, child_info, priv->transition_type, priv->transition_duration);
|
||||||
else
|
else
|
||||||
gtk_widget_set_child_visible (child, FALSE);
|
gtk_widget_set_child_visible (child, FALSE);
|
||||||
|
|
||||||
@ -961,7 +970,7 @@ gtk_stack_remove (GtkContainer *container,
|
|||||||
child_info->widget = NULL;
|
child_info->widget = NULL;
|
||||||
|
|
||||||
if (priv->visible_child == child_info)
|
if (priv->visible_child == child_info)
|
||||||
set_visible_child (stack, NULL);
|
set_visible_child (stack, NULL, priv->transition_type, priv->transition_duration);
|
||||||
|
|
||||||
if (priv->last_visible_child == child_info)
|
if (priv->last_visible_child == child_info)
|
||||||
priv->last_visible_child = NULL;
|
priv->last_visible_child = NULL;
|
||||||
@ -1185,7 +1194,9 @@ gtk_stack_set_visible_child (GtkStack *stack,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (gtk_widget_get_visible (child_info->widget))
|
if (gtk_widget_get_visible (child_info->widget))
|
||||||
set_visible_child (stack, child_info);
|
set_visible_child (stack, child_info,
|
||||||
|
stack->priv->transition_type,
|
||||||
|
stack->priv->transition_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1205,6 +1216,24 @@ gtk_stack_set_visible_child (GtkStack *stack,
|
|||||||
void
|
void
|
||||||
gtk_stack_set_visible_child_name (GtkStack *stack,
|
gtk_stack_set_visible_child_name (GtkStack *stack,
|
||||||
const gchar *name)
|
const gchar *name)
|
||||||
|
{
|
||||||
|
gtk_stack_set_visible_child_full (stack, name, stack->priv->transition_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_stack_set_visible_child_name:
|
||||||
|
* @stack: a #GtkStack
|
||||||
|
* @name: the name of the child to make visible
|
||||||
|
* @transition_type: the transition type to use
|
||||||
|
*
|
||||||
|
* Makes the child with the given name visible.
|
||||||
|
*
|
||||||
|
* Since: 3.10
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gtk_stack_set_visible_child_full (GtkStack *stack,
|
||||||
|
const gchar *name,
|
||||||
|
GtkStackTransitionType transition_type)
|
||||||
{
|
{
|
||||||
GtkStackPrivate *priv;
|
GtkStackPrivate *priv;
|
||||||
GtkStackChildInfo *child_info, *info;
|
GtkStackChildInfo *child_info, *info;
|
||||||
@ -1228,7 +1257,7 @@ gtk_stack_set_visible_child_name (GtkStack *stack,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (child_info != NULL && gtk_widget_get_visible (child_info->widget))
|
if (child_info != NULL && gtk_widget_get_visible (child_info->widget))
|
||||||
set_visible_child (stack, child_info);
|
set_visible_child (stack, child_info, transition_type, priv->transition_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1373,7 +1402,7 @@ gtk_stack_draw (GtkWidget *widget,
|
|||||||
cairo_destroy (pattern_cr);
|
cairo_destroy (pattern_cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (priv->transition_type)
|
switch (priv->active_transition_type)
|
||||||
{
|
{
|
||||||
case GTK_STACK_TRANSITION_TYPE_CROSSFADE:
|
case GTK_STACK_TRANSITION_TYPE_CROSSFADE:
|
||||||
gtk_stack_draw_crossfade (widget, cr);
|
gtk_stack_draw_crossfade (widget, cr);
|
||||||
|
@ -70,6 +70,9 @@ GtkWidget * gtk_stack_get_visible_child (GtkStack
|
|||||||
void gtk_stack_set_visible_child_name (GtkStack *stack,
|
void gtk_stack_set_visible_child_name (GtkStack *stack,
|
||||||
const gchar *name);
|
const gchar *name);
|
||||||
const gchar * gtk_stack_get_visible_child_name (GtkStack *stack);
|
const gchar * gtk_stack_get_visible_child_name (GtkStack *stack);
|
||||||
|
void gtk_stack_set_visible_child_full (GtkStack *stack,
|
||||||
|
const gchar *name,
|
||||||
|
GtkStackTransitionType transition_type);
|
||||||
void gtk_stack_set_homogeneous (GtkStack *stack,
|
void gtk_stack_set_homogeneous (GtkStack *stack,
|
||||||
gboolean homogeneous);
|
gboolean homogeneous);
|
||||||
gboolean gtk_stack_get_homogeneous (GtkStack *stack);
|
gboolean gtk_stack_get_homogeneous (GtkStack *stack);
|
||||||
|
@ -52,8 +52,7 @@ on_back_button_clicked (GtkButton *button, GtkStack *stack)
|
|||||||
{
|
{
|
||||||
if (g_str_equal (vis, seq[i]))
|
if (g_str_equal (vis, seq[i]))
|
||||||
{
|
{
|
||||||
gtk_stack_set_transition_type (stack, GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT);
|
gtk_stack_set_visible_child_full (stack, seq[i - 1], GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT);
|
||||||
gtk_stack_set_visible_child_name (stack, seq[i - 1]);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,8 +71,7 @@ on_forward_button_clicked (GtkButton *button, GtkStack *stack)
|
|||||||
{
|
{
|
||||||
if (g_str_equal (vis, seq[i]))
|
if (g_str_equal (vis, seq[i]))
|
||||||
{
|
{
|
||||||
gtk_stack_set_transition_type (stack, GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT);
|
gtk_stack_set_visible_child_full (stack, seq[i + 1], GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT);
|
||||||
gtk_stack_set_visible_child_name (stack, seq[i + 1]);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user