[libhandy/wip/haecker-felix/flap-widget: 79/98] Implement last animation pieces. Phew.




commit eaa77a2cfab3c14ce2cecf11209b94438f6491b7
Author: Felix Häcker <haeckerfelix gnome org>
Date:   Mon Jul 27 21:48:51 2020 +0200

    Implement last animation pieces. Phew.

 src/hdy-flap.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 78 insertions(+), 3 deletions(-)
---
diff --git a/src/hdy-flap.c b/src/hdy-flap.c
index 2d8f5629..61ed6ef8 100644
--- a/src/hdy-flap.c
+++ b/src/hdy-flap.c
@@ -150,10 +150,16 @@ hdy_flap_set_property (GObject      *object,
   }
 }
 
+static gdouble
+ease_out_cubic (gdouble t) {
+  gdouble p;
+  p = t -1;
+  return p * p * p + 1;
+}
+
 static gboolean
-reveal_tick_cb (HdyFlap       *self,
-                GdkFrameClock *frame_clock,
-                gpointer       user_data)
+reveal_tick_cb (HdyFlap *self,
+                 GdkFrameClock* frame_clock)
 {
   guint64 frame_time = gdk_frame_clock_get_frame_time (frame_clock) / 1000;
   gdouble t = (gdouble) (frame_time - self->reveal_start_time) / self->reveal_duration;
@@ -177,6 +183,73 @@ reveal_tick_cb (HdyFlap       *self,
   return TRUE;
 }
 
+static gboolean
+overlay_tick_cb (HdyFlap *self,
+                 GdkFrameClock* frame_clock)
+{
+  gdouble t;
+  gint64 frame_time;
+
+  frame_time = gdk_frame_clock_get_frame_time (frame_clock) / 1000;
+  t = (frame_time - self->overlay_start_time) / self->overlay_duration;
+
+  if (t >= 1) {
+    self->overlay_progress = self->overlay ? 1 : 0;
+    self->overlay_tick_cb_id = 0;
+
+    gtk_widget_queue_resize ((GtkWidget*) self);
+
+    return FALSE;
+  }
+
+  self->overlay_progress = ease_out_cubic (t);
+
+  if (!self->overlay)
+      self->overlay_progress = 1 - self->overlay_progress;
+
+  gtk_widget_queue_resize ((GtkWidget*) self);
+
+  return TRUE;
+}
+
+static void
+animate_overlay (HdyFlap *self)
+{
+  if (!hdy_get_enable_animations ((GtkWidget*) self) || !gtk_widget_get_mapped ((GtkWidget*) self)) {
+    self->overlay_progress = self->overlay ? 1 : 0;
+    gtk_widget_queue_resize ((GtkWidget*) self);
+    return;
+  }
+
+  if (self->overlay_tick_cb_id != 0) {
+    gtk_widget_remove_tick_callback ((GtkWidget*) self, self->overlay_tick_cb_id);
+    self->overlay_tick_cb_id = 0;
+  }
+
+  self->overlay_start_time = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock ((GtkWidget*) self)) 
/ 1000;
+  self->overlay_progress = self->overlay ? 0 : 1;
+  self->overlay_tick_cb_id = gtk_widget_add_tick_callback ((GtkWidget*) self, (GtkTickCallback) 
overlay_tick_cb, &self, g_object_unref);
+}
+
+static void
+animate_reveal (HdyFlap *self)
+{
+  if (!hdy_get_enable_animations ((GtkWidget*) self) || !gtk_widget_get_mapped ((GtkWidget*) self)) {
+    self->reveal_progress = self->reveal_flap ? 1 : 0;
+    gtk_widget_queue_resize ((GtkWidget*) self);
+    return;
+  }
+
+  if (self->reveal_tick_cb_id != 0) {
+    gtk_widget_remove_tick_callback ((GtkWidget*) self, self->reveal_tick_cb_id);
+    self->reveal_tick_cb_id = 0;
+  }
+
+  self->reveal_start_time = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock ((GtkWidget*) self)) 
/ 1000;
+  self->reveal_progress = self->reveal_flap ? 0 : 1;
+  self->reveal_tick_cb_id = gtk_widget_add_tick_callback ((GtkWidget*) self, (GtkTickCallback) 
reveal_tick_cb, &self, g_object_unref);
+}
+
 static gint
 adjust_for_overlay (HdyFlap *self,
                     gint     value)
@@ -769,6 +842,7 @@ hdy_flap_set_reveal_flap (HdyFlap  *self,
     return;
 
   self->reveal_flap = reveal_flap;
+  animate_reveal(self);
 
   g_object_notify_by_pspec (G_OBJECT (self), props[PROP_REVEAL_FLAP]);
 }
@@ -807,6 +881,7 @@ hdy_flap_set_overlay (HdyFlap  *self,
     return;
 
   self->overlay = overlay;
+  animate_overlay(self);
 
   g_object_notify_by_pspec (G_OBJECT (self), props[PROP_OVERLAY]);
 }


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