[gtk+] GtkStack: Add position-dependent slide transitions
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkStack: Add position-dependent slide transitions
- Date: Thu, 13 Jun 2013 18:25:27 +0000 (UTC)
commit 33a1c4d6e03bbe2c0eee7b3ce4b8f26e848ae1cb
Author: Erick PĂ©rez Castellanos <erick red gmail com>
Date: Thu Jun 13 20:33:42 2013 +0200
GtkStack: Add position-dependent slide transitions
These go left/right or up/down depending on the relative
order of the children being switched between.
gtk/gtkstack.c | 33 +++++++++++++++++++++++++++++++++
gtk/gtkstack.h | 4 +++-
tests/teststack.c | 2 ++
3 files changed, 38 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtkstack.c b/gtk/gtkstack.c
index e890610..fcaa0b2 100644
--- a/gtk/gtkstack.c
+++ b/gtk/gtkstack.c
@@ -56,6 +56,8 @@
* @GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT: Slide from right to left
* @GTK_STACK_TRANSITION_TYPE_SLIDE_UP: Slide from bottom up
* @GTK_STACK_TRANSITION_TYPE_SLIDE_DOWN: Slide from top down
+ * @GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT: Slide from left or right according to the children order
+ * @GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN: Slide from top down or bottom up according to the order
*
* These enumeration values describe the possible transitions
* between pages in a #GtkStack widget.
@@ -870,6 +872,37 @@ set_visible_child (GtkStack *stack,
if (child_info)
gtk_widget_set_child_visible (child_info->widget, TRUE);
+ if ((child_info == NULL || priv->last_visible_child == NULL) &&
+ (transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT ||
+ transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN))
+ {
+ transition_type = GTK_STACK_TRANSITION_TYPE_NONE;
+ }
+ else if (transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT ||
+ transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN)
+ {
+ gboolean i_first = FALSE;
+ for (l = priv->children; l != NULL; l = g_list_next (l))
+ {
+ if (child_info == l->data)
+ {
+ i_first = TRUE;
+ break;
+ }
+ if (priv->last_visible_child == l->data)
+ break;
+ }
+
+ if (transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT)
+ {
+ transition_type = i_first ? GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT :
GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT;
+ }
+ if (transition_type == GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN)
+ {
+ transition_type = i_first ? GTK_STACK_TRANSITION_TYPE_SLIDE_UP :
GTK_STACK_TRANSITION_TYPE_SLIDE_DOWN;
+ }
+ }
+
gtk_widget_queue_resize (GTK_WIDGET (stack));
gtk_widget_queue_draw (GTK_WIDGET (stack));
diff --git a/gtk/gtkstack.h b/gtk/gtkstack.h
index 38824e1..baff1cd 100644
--- a/gtk/gtkstack.h
+++ b/gtk/gtkstack.h
@@ -44,7 +44,9 @@ typedef enum {
GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT,
GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT,
GTK_STACK_TRANSITION_TYPE_SLIDE_UP,
- GTK_STACK_TRANSITION_TYPE_SLIDE_DOWN
+ GTK_STACK_TRANSITION_TYPE_SLIDE_DOWN,
+ GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT,
+ GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN
} GtkStackTransitionType;
struct _GtkStack {
diff --git a/tests/teststack.c b/tests/teststack.c
index 0befd8d..3853af2 100644
--- a/tests/teststack.c
+++ b/tests/teststack.c
@@ -215,6 +215,8 @@ main (gint argc,
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "SLIDE_LEFT");
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "SLIDE_UP");
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "SLIDE_DOWN");
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "SLIDE_LEFT_RIGHT");
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "SLIDE_UP_DOWN");
gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
gtk_container_add (GTK_CONTAINER (hbox), combo);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]