[gdm] Dynamically slide destination from step function



commit 6197ec180d369899bf4b87c5e8adaed62ed3fdeb
Author: Ray Strode <rstrode redhat com>
Date:   Fri Oct 30 14:52:04 2009 -0400

    Dynamically slide destination from step function
    
    This lets us add items or swift directions while the animation is going.

 gui/simple-greeter/gdm-chooser-widget.c    |   10 +++++-----
 gui/simple-greeter/gdm-scrollable-widget.c |   19 ++++++++++++++++++-
 gui/simple-greeter/gdm-scrollable-widget.h |    1 +
 3 files changed, 24 insertions(+), 6 deletions(-)
---
diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c
index 4124195..4df03a6 100644
--- a/gui/simple-greeter/gdm-chooser-widget.c
+++ b/gui/simple-greeter/gdm-chooser-widget.c
@@ -97,7 +97,6 @@ struct GdmChooserWidgetPrivate
         GdmChooserWidgetState    state;
 
         double                   active_row_normalized_position;
-        int                      height_when_grown;
 };
 
 enum {
@@ -552,6 +551,7 @@ set_frame_text (GdmChooserWidget *widget,
 static void
 on_shrink_animation_step (GdmScrollableWidget *scrollable_widget,
                           double               progress,
+                          int                 *new_height,
                           GdmChooserWidget    *widget)
 {
         GtkTreePath   *active_row_path;
@@ -839,6 +839,7 @@ get_number_of_on_screen_rows (GdmChooserWidget *widget)
 static void
 on_grow_animation_step (GdmScrollableWidget *scrollable_widget,
                         double               progress,
+                        int                 *new_height,
                         GdmChooserWidget    *widget)
 {
         int number_of_visible_rows;
@@ -851,6 +852,8 @@ on_grow_animation_step (GdmScrollableWidget *scrollable_widget,
                 gdm_scrollable_widget_stop_sliding (scrollable_widget);
                 return;
         }
+
+        *new_height = GTK_BIN (scrollable_widget)->child->requisition.height;
 }
 
 static void
@@ -870,7 +873,7 @@ start_grow_animation (GdmChooserWidget *widget)
         set_inactive_items_visible (widget, TRUE);
 
         gdm_scrollable_widget_slide_to_height (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget),
-                                               widget->priv->height_when_grown,
+                                               GTK_BIN (widget->priv->scrollable_widget)->child->requisition.height,
                                                (GdmScrollableWidgetSlideStepFunc)
                                                on_grow_animation_step, widget,
                                                (GdmScrollableWidgetSlideDoneFunc)
@@ -1206,9 +1209,6 @@ gdm_chooser_widget_size_allocate (GtkWidget     *widget,
 
         chooser_widget = GDM_CHOOSER_WIDGET (widget);
 
-        if (chooser_widget->priv->state == GDM_CHOOSER_WIDGET_STATE_GROWN) {
-                chooser_widget->priv->height_when_grown = allocation->height;
-        }
 }
 
 static gboolean
diff --git a/gui/simple-greeter/gdm-scrollable-widget.c b/gui/simple-greeter/gdm-scrollable-widget.c
index 2c0407d..6d9dc83 100644
--- a/gui/simple-greeter/gdm-scrollable-widget.c
+++ b/gui/simple-greeter/gdm-scrollable-widget.c
@@ -132,9 +132,26 @@ on_animation_tick (GdmScrollableWidgetAnimation *animation,
         gtk_widget_set_size_request (animation->widget, width, height);
 
         if (animation->step_func != NULL) {
+                GdmTimer *timer;
+
+                height = animation->desired_height;
+
+                height -= animation->widget->style->ythickness * 2;
+                height -= GTK_CONTAINER (animation->widget)->border_width * 2;
+
+                timer = g_object_ref (animation->timer);
                 animation->step_func (GDM_SCROLLABLE_WIDGET (animation->widget),
                                       progress,
+                                      &height,
                                       animation->step_func_user_data);
+
+                if (gdm_timer_is_started (timer)) {
+                        height += animation->widget->style->ythickness * 2;
+                        height += GTK_CONTAINER (animation->widget)->border_width * 2;
+
+                        animation->desired_height = height;
+                }
+                g_object_unref (timer);
         }
 }
 
@@ -708,7 +725,7 @@ gdm_scrollable_widget_slide_to_height (GdmScrollableWidget *scrollable_widget,
 
         if (!input_redirected || gdm_scrollable_widget_animations_are_disabled (scrollable_widget)) {
                 if (step_func != NULL) {
-                        step_func (scrollable_widget, 0.0, step_user_data);
+                        step_func (scrollable_widget, 0.0, &height, step_user_data);
                 }
 
                 if (done_func != NULL) {
diff --git a/gui/simple-greeter/gdm-scrollable-widget.h b/gui/simple-greeter/gdm-scrollable-widget.h
index 9b8877e..2241cb1 100644
--- a/gui/simple-greeter/gdm-scrollable-widget.h
+++ b/gui/simple-greeter/gdm-scrollable-widget.h
@@ -40,6 +40,7 @@ typedef struct GdmScrollableWidget GdmScrollableWidget;
 typedef struct GdmScrollableWidgetPrivate GdmScrollableWidgetPrivate;
 typedef void (* GdmScrollableWidgetSlideStepFunc) (GdmScrollableWidget *scrollable_widget,
                                                    double               progress,
+                                                   int                 *new_height,
                                                    gpointer            *user_data);
 typedef void (* GdmScrollableWidgetSlideDoneFunc) (GdmScrollableWidget *scrollable_widget,
                                                    gpointer            *user_data);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]