[gtk] revealer: Add swing transitions
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk] revealer: Add swing transitions
- Date: Thu, 7 Mar 2019 14:07:59 +0000 (UTC)
commit ad5c5d477e3d856a00f55f00fe4342f86d3117d9
Author: Benjamin Otte <otte redhat com>
Date: Thu Mar 7 13:06:37 2019 +0100
revealer: Add swing transitions
And make the revealer on page 2 of the widget-factory use one.
demos/widget-factory/widget-factory.ui | 1 +
gtk/gtkrevealer.c | 86 ++++++++++++++++++++++++++++++----
gtk/gtkrevealer.h | 6 ++-
3 files changed, 84 insertions(+), 9 deletions(-)
---
diff --git a/demos/widget-factory/widget-factory.ui b/demos/widget-factory/widget-factory.ui
index f7b624c7a0..1662b9fc36 100644
--- a/demos/widget-factory/widget-factory.ui
+++ b/demos/widget-factory/widget-factory.ui
@@ -1432,6 +1432,7 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
<object class="GtkOverlay" id="page2">
<child type="overlay">
<object class="GtkRevealer" id="page2revealer">
+ <property name="transition-type">swing-down</property>
<property name="halign">center</property>
<property name="valign">start</property>
<child>
diff --git a/gtk/gtkrevealer.c b/gtk/gtkrevealer.c
index 3f521baa4c..f594b11f63 100644
--- a/gtk/gtkrevealer.c
+++ b/gtk/gtkrevealer.c
@@ -66,6 +66,10 @@
* @GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT: Slide in from the right
* @GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP: Slide in from the bottom
* @GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN: Slide in from the top
+ * @GTK_REVEALER_TRANSITION_TYPE_SWING_RIGHT: Floop in from the left
+ * @GTK_REVEALER_TRANSITION_TYPE_SWING_LEFT: Floop in from the right
+ * @GTK_REVEALER_TRANSITION_TYPE_SWING_UP: Floop in from the bottom
+ * @GTK_REVEALER_TRANSITION_TYPE_SWING_DOWN: Floop in from the top
*
* These enumeration values describe the possible transitions
* when the child of a #GtkRevealer widget is shown or hidden.
@@ -287,6 +291,10 @@ effective_transition (GtkRevealer *revealer)
return GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT;
else if (priv->transition_type == GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT)
return GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT;
+ if (priv->transition_type == GTK_REVEALER_TRANSITION_TYPE_SWING_LEFT)
+ return GTK_REVEALER_TRANSITION_TYPE_SWING_RIGHT;
+ else if (priv->transition_type == GTK_REVEALER_TRANSITION_TYPE_SWING_RIGHT)
+ return GTK_REVEALER_TRANSITION_TYPE_SWING_LEFT;
}
return priv->transition_type;
@@ -328,6 +336,20 @@ get_child_size_scale (GtkRevealer *revealer,
else
return 1.0;
+ case GTK_REVEALER_TRANSITION_TYPE_SWING_RIGHT:
+ case GTK_REVEALER_TRANSITION_TYPE_SWING_LEFT:
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ return sin (G_PI * priv->current_pos / 2);
+ else
+ return 1.0;
+
+ case GTK_REVEALER_TRANSITION_TYPE_SWING_DOWN:
+ case GTK_REVEALER_TRANSITION_TYPE_SWING_UP:
+ if (orientation == GTK_ORIENTATION_VERTICAL)
+ return sin (G_PI * priv->current_pos / 2);
+ else
+ return 1.0;
+
case GTK_REVEALER_TRANSITION_TYPE_NONE:
case GTK_REVEALER_TRANSITION_TYPE_CROSSFADE:
default:
@@ -342,14 +364,18 @@ gtk_revealer_real_size_allocate (GtkWidget *widget,
int baseline)
{
GtkRevealer *revealer = GTK_REVEALER (widget);
+ GtkRevealerPrivate *priv = gtk_revealer_get_instance_private (revealer);
GtkWidget *child;
child = gtk_bin_get_child (GTK_BIN (revealer));
if (child != NULL && gtk_widget_get_visible (child))
{
- GtkAllocation child_allocation = {0, 0, width, height};
+ GskTransform *transform;
double hscale, vscale;
+ int child_width, child_height;
+ child_width = width;
+ child_height = height;
hscale = get_child_size_scale (revealer, GTK_ORIENTATION_HORIZONTAL);
vscale = get_child_size_scale (revealer, GTK_ORIENTATION_VERTICAL);
@@ -362,17 +388,61 @@ gtk_revealer_real_size_allocate (GtkWidget *widget,
else if (hscale < 1.0)
{
g_assert (vscale == 1.0);
- child_allocation.width = MIN (G_MAXINT, ceil (width / hscale));
- if (effective_transition (revealer) == GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT)
- child_allocation.x = width - child_allocation.width;
+ child_width = MIN (G_MAXINT, ceil (width / hscale));
}
else if (vscale < 1.0)
{
- child_allocation.height = MIN (G_MAXINT, ceil (height / vscale));
- if (effective_transition (revealer) == GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN)
- child_allocation.y = height - child_allocation.height;
+ child_height = MIN (G_MAXINT, ceil (height / vscale));
+ }
+
+ transform = NULL;
+ switch (effective_transition (revealer))
+ {
+ case GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT:
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width - child_width, 0));
+ break;
+
+ case GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN:
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, height - child_height));
+
+ case GTK_REVEALER_TRANSITION_TYPE_SWING_LEFT:
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width, height / 2));
+ transform = gsk_transform_perspective (transform, 2 * MAX (width, height));
+ transform = gsk_transform_rotate_3d (transform, -90 * (1.0 - priv->current_pos),
graphene_vec3_y_axis ());
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width, -
child_height / 2));
+ break;
+
+ case GTK_REVEALER_TRANSITION_TYPE_SWING_RIGHT:
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, height / 2));
+ transform = gsk_transform_perspective (transform, 2 * MAX (width, height));
+ transform = gsk_transform_rotate_3d (transform, 90 * (1.0 - priv->current_pos),
graphene_vec3_y_axis ());
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, - child_height / 2));
+ break;
+
+ case GTK_REVEALER_TRANSITION_TYPE_SWING_DOWN:
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width / 2, 0));
+ transform = gsk_transform_perspective (transform, 2 * MAX (width, height));
+ transform = gsk_transform_rotate_3d (transform, -90 * (1.0 - priv->current_pos),
graphene_vec3_x_axis ());
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width / 2, 0));
+ break;
+
+ case GTK_REVEALER_TRANSITION_TYPE_SWING_UP:
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width / 2, height));
+ transform = gsk_transform_perspective (transform, 2 * MAX (width, height));
+ transform = gsk_transform_rotate_3d (transform, 90 * (1.0 - priv->current_pos),
graphene_vec3_x_axis ());
+ transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width / 2, -
child_height));
+ break;
+
+ case GTK_REVEALER_TRANSITION_TYPE_NONE:
+ case GTK_REVEALER_TRANSITION_TYPE_CROSSFADE:
+ case GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT:
+ case GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP:
+ default:
+ break;
}
- gtk_widget_size_allocate (child, &child_allocation, -1);
+
+ gtk_widget_allocate (child, child_width, child_height, -1, transform);
+ gsk_transform_unref (transform);
}
}
diff --git a/gtk/gtkrevealer.h b/gtk/gtkrevealer.h
index 4faffabfea..8fad1b4f14 100644
--- a/gtk/gtkrevealer.h
+++ b/gtk/gtkrevealer.h
@@ -43,7 +43,11 @@ typedef enum {
GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT,
GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT,
GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP,
- GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN
+ GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN,
+ GTK_REVEALER_TRANSITION_TYPE_SWING_RIGHT,
+ GTK_REVEALER_TRANSITION_TYPE_SWING_LEFT,
+ GTK_REVEALER_TRANSITION_TYPE_SWING_UP,
+ GTK_REVEALER_TRANSITION_TYPE_SWING_DOWN
} GtkRevealerTransitionType;
struct _GtkRevealer {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]