summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkhidingbox.c162
-rw-r--r--tests/testhidingbox.c2
2 files changed, 48 insertions, 116 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,
diff --git a/tests/testhidingbox.c b/tests/testhidingbox.c
index 8ac75bf964..fda67ef7c9 100644
--- a/tests/testhidingbox.c
+++ b/tests/testhidingbox.c
@@ -5,7 +5,7 @@
#define N_BUTTONS 10
static GtkWidget *hiding_box;
-static char *lorem_ipsum = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+static char *lorem_ipsum = "Loremipsumdolorsitamet, consecteturadipisicingelit,";
static char*
get_lorem_ipsum ()