diff options
Diffstat (limited to 'gtk/gtkhidingbox.c')
-rw-r--r-- | gtk/gtkhidingbox.c | 162 |
1 files changed, 47 insertions, 115 deletions
diff --git a/gtk/gtkhidingbox.c b/gtk/gtkhidingbox.c index d786c0c1c9..2417741e79 100644 --- a/gtk/gtkhidingbox.c +++ b/gtk/gtkhidingbox.c @@ -40,8 +40,7 @@ #include "glib.h" #define REVEALER_ANIMATION_TIME 250 //ms -#define INVERT_ANIMATION_TIME 750 //ms -#define REVEALER_INVERT_ANIMATION_TIME INVERT_ANIMATION_TIME / 4 //ms +#define INVERT_ANIMATION_SPEED 0.1 //px/ms struct _GtkHidingBoxPrivate { @@ -62,8 +61,11 @@ struct _GtkHidingBoxPrivate GtkAdjustment *hadjustment; guint invert_animation_tick_id; - float invert_animation_progress; + double invert_animation_progress; guint64 invert_animation_initial_time; + gint allocated_children_width; + gint total_children_width; + gint previous_child_width; }; static void @@ -261,98 +263,6 @@ gtk_hiding_box_forall (GtkContainer *container, } static void -update_children_visibility_invert_animation (GtkHidingBox *box, - GtkAllocation *allocation) -{ - GtkHidingBoxPrivate *priv = gtk_hiding_box_get_instance_private (box); - GtkWidget *child_widget; - GList *child; - GtkRequestedSize *sizes_temp; - gint i; - GList *children; - gboolean allocate_more_children = TRUE; - gint invert_animation_start_x; - gint total_children_size = 0; - gint inverted_animation_first_child; - GList *inverted_animation_first_child_list; - gint to_allocate_children_size = 0; - gint current_children_size = 0; - - g_list_free (priv->widgets_to_show); - priv->widgets_to_show = NULL; - g_list_free (priv->widgets_to_hide); - priv->widgets_to_hide = NULL; - children = g_list_copy (priv->children); - sizes_temp = g_newa (GtkRequestedSize, g_list_length (priv->children)); - - // It's more convenient to go in the oposite direction than normal for that - // inverted state - if (!priv->inverted) - children = g_list_reverse (children); - - for (i = 0, child = children; child != NULL; i++, child = child->next) - { - child_widget = GTK_WIDGET (child->data); - - gtk_widget_get_preferred_width_for_height (child_widget, - allocation->height, - &sizes_temp[i].minimum_size, - &sizes_temp[i].natural_size); - total_children_size += sizes_temp[i].minimum_size; - } - - if (priv->inverted) - invert_animation_start_x = priv->invert_animation_progress * - (total_children_size - allocation->width); - else - invert_animation_start_x = (1 - priv->invert_animation_progress) * - (total_children_size - allocation->width); - - inverted_animation_first_child = 0; - inverted_animation_first_child_list = children; - /* Retrieve desired size for visible children. */ - for (i = 0, child = children; child != NULL; i++, child = child->next) - { - child_widget = GTK_WIDGET (child->data); - - gtk_widget_get_preferred_width_for_height (child_widget, - allocation->height, - &sizes_temp[i].minimum_size, - &sizes_temp[i].natural_size); - - current_children_size += sizes_temp[i].minimum_size; - - if (priv->invert_animation) - { - if (current_children_size - sizes_temp[i].minimum_size >= invert_animation_start_x) - { - to_allocate_children_size += sizes_temp[i].minimum_size; - } - else - { - if (gtk_revealer_get_child_revealed (GTK_REVEALER (gtk_widget_get_parent (child_widget)))) - priv->widgets_to_hide = g_list_append (priv->widgets_to_hide, child_widget); - continue; - } - } - - if (!allocate_more_children || to_allocate_children_size > allocation->width) - { - allocate_more_children = FALSE; - if (gtk_revealer_get_child_revealed (GTK_REVEALER (gtk_widget_get_parent (child_widget)))) - priv->widgets_to_hide = g_list_append (priv->widgets_to_hide, child_widget); - - continue; - } - - if (!g_list_find (priv->widgets_to_remove, child_widget)) - priv->widgets_to_show = g_list_append (priv->widgets_to_show, child_widget); - } - - g_list_free (children); -} - -static void update_children_visibility (GtkHidingBox *box, GtkAllocation *allocation) { @@ -363,7 +273,7 @@ update_children_visibility (GtkHidingBox *box, gint i; GList *children; gboolean allocate_more_children = TRUE; - gint current_children_size = 0; + gint current_children_width = 0; g_list_free (priv->widgets_to_show); priv->widgets_to_show = NULL; @@ -384,11 +294,14 @@ update_children_visibility (GtkHidingBox *box, &sizes_temp[i].minimum_size, &sizes_temp[i].natural_size); - current_children_size += sizes_temp[i].minimum_size; + current_children_width += sizes_temp[i].minimum_size; - if (!allocate_more_children || current_children_size > allocation->width) + if (!allocate_more_children || current_children_width > allocation->width) { + if (allocate_more_children) + priv->allocated_children_width = current_children_width - sizes_temp[i].minimum_size; allocate_more_children = FALSE; + priv->previous_child_width = sizes_temp[i].minimum_size; if (gtk_revealer_get_child_revealed (GTK_REVEALER (gtk_widget_get_parent (child_widget)))) priv->widgets_to_hide = g_list_append (priv->widgets_to_hide, child_widget); @@ -399,6 +312,7 @@ update_children_visibility (GtkHidingBox *box, priv->widgets_to_show = g_list_append (priv->widgets_to_show, child_widget); } + priv->total_children_width = current_children_width; g_list_free (children); } @@ -470,12 +384,23 @@ idle_update_revealers (GtkHidingBox *box) if (gtk_revealer_get_reveal_child (GTK_REVEALER (revealer))) { remove_all_opacity_classes (revealer); - g_print ("to hide %f\n", ABS (priv->invert_animation_progress * INVERT_ANIMATION_TIME - INVERT_ANIMATION_TIME)); - if (priv->invert_animation) + if (priv->invert_animation && priv->invert_animation_progress >= 1) { + gdouble velocity = INVERT_ANIMATION_SPEED; // px / ms + gint revealer_animation_time; + gdouble max_real_adjustment; + + max_real_adjustment = gtk_adjustment_get_upper (priv->hadjustment) - + gtk_widget_get_allocated_width (priv->scrolled_window); + + g_print ("animation velocity %f %f\n", max_real_adjustment, velocity); + revealer_animation_time = (gtk_widget_get_allocated_width (priv->scrolled_window) - + priv->allocated_children_width) / + velocity; + g_print ("animation time %d %d %d\n", priv->allocated_children_width, gtk_widget_get_allocated_width (priv->scrolled_window), revealer_animation_time); add_opacity_class (revealer, "pathbar-invert-animation-opacity-off"); g_signal_connect (revealer, "notify::child-revealed", (GCallback) opacity_off, box); - gtk_revealer_set_transition_duration (GTK_REVEALER (revealer), REVEALER_ANIMATION_TIME); + gtk_revealer_set_transition_duration (GTK_REVEALER (revealer), revealer_animation_time); gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), FALSE); } @@ -486,6 +411,15 @@ idle_update_revealers (GtkHidingBox *box) gtk_revealer_set_transition_duration (GTK_REVEALER (revealer), REVEALER_ANIMATION_TIME); gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), FALSE); } +#if 0 + if (!priv->invert_animation) + { + add_opacity_class (revealer, "pathbar-opacity-off"); + g_signal_connect (revealer, "notify::child-revealed", (GCallback) opacity_off, box); + gtk_revealer_set_transition_duration (GTK_REVEALER (revealer), REVEALER_ANIMATION_TIME); + gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), FALSE); + } +#endif } } @@ -511,7 +445,7 @@ idle_update_revealers (GtkHidingBox *box) } } - if ((priv->widgets_to_remove || priv->widgets_to_hide) && !priv->invert_animation) + if (priv->widgets_to_remove || priv->widgets_to_hide) return; for (l = priv->widgets_to_show; l != NULL; l = l->next) @@ -546,10 +480,7 @@ gtk_hiding_box_size_allocate (GtkWidget *widget, gtk_widget_set_allocation (widget, allocation); sizes = g_newa (GtkRequestedSize, g_list_length (priv->children)); - if (priv->invert_animation) - update_children_visibility_invert_animation (box, allocation); - else - update_children_visibility (box, allocation); + update_children_visibility (box, allocation); idle_update_revealers (box); @@ -569,15 +500,15 @@ update_hadjustment (GtkHidingBox *self) gdouble adjustment_value; gdouble max_real_adjustment; -return; - g_print ("aligment changed %d\n", priv->invert_animation); max_real_adjustment = gtk_adjustment_get_upper (priv->hadjustment) - gtk_widget_get_allocated_width (priv->scrolled_window); + + g_print ("aligment changed %f %f %d %f\n", max_real_adjustment, gtk_adjustment_get_upper (priv->hadjustment), gtk_widget_get_allocated_width (priv->scrolled_window), gtk_adjustment_get_lower (priv->hadjustment)); if (priv->invert_animation) { if (priv->inverted) { - adjustment_value = priv->invert_animation_progress * + adjustment_value = (priv->invert_animation_progress) * (max_real_adjustment - gtk_adjustment_get_lower (priv->hadjustment)); } @@ -608,6 +539,7 @@ finish_invert_animation (GtkHidingBox *self) GtkHidingBoxPrivate *priv = gtk_hiding_box_get_instance_private (self); g_print ("\n\n\n\n\n\n\n\n##################ss#######finish invert animation\n\n\n\n\n\n\n"); + idle_update_revealers (self); priv->invert_animation = FALSE; priv->invert_animation_initial_time = 0; gtk_widget_remove_tick_callback (priv->scrolled_window, @@ -624,17 +556,19 @@ invert_animation_on_tick (GtkWidget *widget, GtkHidingBox *self = GTK_HIDING_BOX (user_data); GtkHidingBoxPrivate *priv = gtk_hiding_box_get_instance_private (self); guint64 elapsed; + gdouble max_real_adjustment; + + max_real_adjustment = gtk_adjustment_get_upper (priv->hadjustment) - + (gdouble) gtk_widget_get_allocated_width (priv->scrolled_window); if (priv->invert_animation_initial_time == 0) priv->invert_animation_initial_time = gdk_frame_clock_get_frame_time (frame_clock); elapsed = gdk_frame_clock_get_frame_time (frame_clock) - priv->invert_animation_initial_time; - priv->invert_animation_progress = elapsed / (1000. * INVERT_ANIMATION_TIME); - g_print ("################animation progres %lu %f\n", elapsed, priv->invert_animation_progress); + priv->invert_animation_progress = elapsed * INVERT_ANIMATION_SPEED / (1000. * max_real_adjustment); + g_print ("################animation progres %d %f %f %f\n", gtk_widget_get_allocated_width (priv->scrolled_window), max_real_adjustment, elapsed / 1000., priv->invert_animation_progress); update_hadjustment (self); - gtk_widget_queue_resize (GTK_WIDGET (self)); - if (priv->invert_animation_progress >= 1) { finish_invert_animation (self); @@ -654,7 +588,6 @@ start_invert_animation (GtkHidingBox *self) priv->invert_animation = TRUE; priv->invert_animation_progress = 0; -/* for (child = priv->children; child != NULL; child = child->next) { GtkWidget *revealer; @@ -668,7 +601,6 @@ start_invert_animation (GtkHidingBox *self) 0); gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), TRUE); } -*/ priv->invert_animation_tick_id = gtk_widget_add_tick_callback (priv->scrolled_window, (GtkTickCallback) invert_animation_on_tick, |