[libadwaita/wip/exalm/spring-animation-swipes: 3/3] aaa
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libadwaita/wip/exalm/spring-animation-swipes: 3/3] aaa
- Date: Sat, 4 Dec 2021 17:46:28 +0000 (UTC)
commit 891ec6b11508ada2e9d3ed985dfc42f31d5c7cbf
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Sat Dec 4 22:46:33 2021 +0500
aaa
src/adw-carousel.c | 1 +
src/adw-flap.c | 66 +++++++++++++++++++++++++++++-----------------
src/adw-leaflet.c | 1 +
src/adw-spring-animation.c | 6 ++---
src/adw-swipe-tracker.c | 7 ++---
5 files changed, 51 insertions(+), 30 deletions(-)
---
diff --git a/src/adw-carousel.c b/src/adw-carousel.c
index fc09ba23..9f592b5c 100644
--- a/src/adw-carousel.c
+++ b/src/adw-carousel.c
@@ -423,6 +423,7 @@ static void
end_swipe_cb (AdwSwipeTracker *tracker,
guint duration,
double to,
+ double velocity,
AdwCarousel *self)
{
GtkWidget *child = get_page_at_position (self, to);
diff --git a/src/adw-flap.c b/src/adw-flap.c
index 4335dce1..d4401be1 100644
--- a/src/adw-flap.c
+++ b/src/adw-flap.c
@@ -14,9 +14,9 @@
#include "adw-gizmo-private.h"
#include "adw-macros-private.h"
#include "adw-shadow-helper-private.h"
+#include "adw-spring-animation.h"
#include "adw-swipeable.h"
#include "adw-swipe-tracker-private.h"
-#include "adw-timed-animation.h"
#include "adw-widget-utils-private.h"
/**
@@ -267,6 +267,7 @@ set_reveal_progress (AdwFlap *self,
double progress)
{
self->reveal_progress = progress;
+ g_print ("reval %lf\n", progress);
update_child_visibility (self);
update_shield (self);
@@ -288,14 +289,19 @@ fold_animation_value_cb (AdwFlap *self,
static void
animate_fold (AdwFlap *self)
{
- adw_timed_animation_set_value_from (ADW_TIMED_ANIMATION (self->fold_animation),
- self->fold_progress);
- adw_timed_animation_set_value_to (ADW_TIMED_ANIMATION (self->fold_animation),
- self->folded ? 1 : 0);
+ if (self->reveal_progress <= 0) {
+ fold_animation_value_cb (self, self->folded ? 1 : 0);
+ return;
+ }
+
+ adw_spring_animation_set_value_from (ADW_SPRING_ANIMATION (self->fold_animation),
+ self->fold_progress);
+ adw_spring_animation_set_value_to (ADW_SPRING_ANIMATION (self->fold_animation),
+ self->folded ? 1 : 0);
/* When the flap is completely hidden, we can skip animation */
- adw_timed_animation_set_duration (ADW_TIMED_ANIMATION (self->fold_animation),
- (self->reveal_progress > 0) ? self->fold_duration : 0);
+// adw_timed_animation_set_duration (ADW_TIMED_ANIMATION (self->fold_animation),
+// self->fold_duration);
adw_animation_play (self->fold_animation);
}
@@ -315,14 +321,18 @@ reveal_animation_done_cb (AdwFlap *self)
static void
animate_reveal (AdwFlap *self,
double to,
- guint duration)
+ double velocity)
{
- adw_timed_animation_set_value_from (ADW_TIMED_ANIMATION (self->reveal_animation),
- self->reveal_progress);
- adw_timed_animation_set_value_to (ADW_TIMED_ANIMATION (self->reveal_animation),
- to);
- adw_timed_animation_set_duration (ADW_TIMED_ANIMATION (self->reveal_animation),
- duration);
+ adw_spring_animation_set_value_from (ADW_SPRING_ANIMATION (self->reveal_animation),
+ self->reveal_progress);
+ adw_spring_animation_set_value_to (ADW_SPRING_ANIMATION (self->reveal_animation),
+ to);
+// adw_timed_animation_set_duration (ADW_TIMED_ANIMATION (self->reveal_animation),
+// duration);
+
+ adw_spring_animation_set_initial_velocity (ADW_SPRING_ANIMATION (self->reveal_animation),
+ velocity);
+ g_print ("WTF %lf\n", velocity);
adw_animation_play (self->reveal_animation);
}
@@ -330,7 +340,7 @@ animate_reveal (AdwFlap *self,
static void
set_reveal_flap (AdwFlap *self,
gboolean reveal_flap,
- guint duration)
+ double velocity)
{
reveal_flap = !!reveal_flap;
@@ -340,7 +350,7 @@ set_reveal_flap (AdwFlap *self,
self->reveal_flap = reveal_flap;
if (!self->swipe_active)
- animate_reveal (self, reveal_flap ? 1 : 0, duration);
+ animate_reveal (self, reveal_flap ? 1 : 0, velocity);
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_REVEAL_FLAP]);
}
@@ -370,7 +380,7 @@ set_folded (AdwFlap *self,
animate_fold (self);
if (!self->locked)
- set_reveal_flap (self, !self->folded, self->fold_duration);
+ set_reveal_flap (self, !self->folded, 0);
context = gtk_widget_get_style_context (GTK_WIDGET (self));
if (folded) {
@@ -420,6 +430,7 @@ update_swipe_cb (AdwSwipeTracker *tracker,
static void
end_swipe_cb (AdwSwipeTracker *tracker,
guint duration,
+ double velocity,
double to,
AdwFlap *self)
{
@@ -429,9 +440,9 @@ end_swipe_cb (AdwSwipeTracker *tracker,
self->swipe_active = FALSE;
if ((to > 0) == self->reveal_flap)
- animate_reveal (self, to, duration);
+ animate_reveal (self, to, velocity);
else
- set_reveal_flap (self, to > 0, duration);
+ set_reveal_flap (self, to > 0, velocity);
}
static void
@@ -756,6 +767,8 @@ compute_allocation (AdwFlap *self,
interpolate_fold (self, width, height, &flap_size, &content_size, &separator_size);
+ flap_size = (int) ceil (flap_size * MAX (self->reveal_progress, 1));
+
if (self->orientation == GTK_ORIENTATION_HORIZONTAL) {
flap_alloc->width = flap_size;
content_alloc->width = content_size;
@@ -778,14 +791,17 @@ compute_allocation (AdwFlap *self,
else
distance = flap_size + separator_size * (1 - self->fold_progress);
- flap_pos = -(int) round ((1 - self->reveal_progress) * transition_get_flap_motion_factor (self) *
distance);
+ flap_pos = -(int) round ((1 - MIN (self->reveal_progress, 1)) * transition_get_flap_motion_factor (self) *
distance);
if (content_above_flap) {
content_pos = (int) round (self->reveal_progress * transition_get_content_motion_factor (self) *
distance);
separator_pos = flap_pos + flap_size;
} else {
content_pos = total - content_size + (int) round (self->reveal_progress * self->fold_progress *
transition_get_content_motion_factor (self) * distance);
- separator_pos = content_pos - separator_size;
+ if (self->reveal_progress > 1)
+ separator_pos = flap_pos + flap_size;
+ else
+ separator_pos = content_pos - separator_size;
}
if (self->flap_position != get_start_or_end (self)) {
@@ -1603,13 +1619,15 @@ adw_flap_init (AdwFlap *self)
fold_animation_value_cb,
self, NULL);
self->fold_animation =
- adw_timed_animation_new (GTK_WIDGET (self), 0, 0, 0, target);
+ adw_spring_animation_new (GTK_WIDGET (self), 0, 0,
+ adw_spring_params_new (0.9, 1, 100), target);
target = adw_callback_animation_target_new ((AdwAnimationTargetFunc)
set_reveal_progress,
self, NULL);
self->reveal_animation =
- adw_timed_animation_new (GTK_WIDGET (self), 0, 0, 0, target);
+ adw_spring_animation_new (GTK_WIDGET (self), 0, 0,
+ adw_spring_params_new_full (10, 1, 100), target);
g_signal_connect_swapped (self->reveal_animation, "done",
G_CALLBACK (reveal_animation_done_cb), self);
@@ -2043,7 +2061,7 @@ adw_flap_set_reveal_flap (AdwFlap *self,
{
g_return_if_fail (ADW_IS_FLAP (self));
- set_reveal_flap (self, reveal_flap, self->reveal_duration);
+ set_reveal_flap (self, reveal_flap, 0);
}
/**
diff --git a/src/adw-leaflet.c b/src/adw-leaflet.c
index fa999e44..fc4dbcd8 100644
--- a/src/adw-leaflet.c
+++ b/src/adw-leaflet.c
@@ -1605,6 +1605,7 @@ update_swipe_cb (AdwSwipeTracker *tracker,
static void
end_swipe_cb (AdwSwipeTracker *tracker,
guint duration,
+ double velocity,
double to,
AdwLeaflet *self)
{
diff --git a/src/adw-spring-animation.c b/src/adw-spring-animation.c
index ef1bcbfd..8737c0cd 100644
--- a/src/adw-spring-animation.c
+++ b/src/adw-spring-animation.c
@@ -67,7 +67,7 @@ oscillate (AdwAnimation *animation,
double b = adw_spring_params_get_damping (self->spring_params);
double m = adw_spring_params_get_mass (self->spring_params);
double k = adw_spring_params_get_stiffness (self->spring_params);
- double v0 = self->initial_velocity;
+ double v0 = self->initial_velocity / (self->value_to - self->value_from);
double t = time / 1000.0;
@@ -369,8 +369,8 @@ adw_spring_animation_new (GtkWidget *widget,
"spring-params", spring_params,
"target", target,
NULL);
- g_object_unref (target);
- adw_spring_params_unref (spring_params);
+// g_object_unref (target);
+// adw_spring_params_unref (spring_params);
return animation;
}
diff --git a/src/adw-swipe-tracker.c b/src/adw-swipe-tracker.c
index 543e17c3..c4b4fc44 100644
--- a/src/adw-swipe-tracker.c
+++ b/src/adw-swipe-tracker.c
@@ -448,7 +448,7 @@ gesture_end (AdwSwipeTracker *self,
if (self->progress != end_progress)
duration = CLAMP (duration, MIN_ANIMATION_DURATION, max_duration);
- g_signal_emit (self, signals[SIGNAL_END_SWIPE], 0, duration, end_progress);
+ g_signal_emit (self, signals[SIGNAL_END_SWIPE], 0, duration, calculate_velocity (self) / distance,
end_progress);
if (!self->cancelled)
self->state = ADW_SWIPE_TRACKER_STATE_FINISHING;
@@ -1152,6 +1152,7 @@ adw_swipe_tracker_class_init (AdwSwipeTrackerClass *klass)
* AdwSwipeTracker::end-swipe:
* @self: the `AdwSwipeTracker` instance
* @duration: snap-back animation duration in milliseconds
+ * @velocity: velocity of the gesture
* @to: the progress value to animate to
*
* This signal is emitted as soon as the gesture has stopped.
@@ -1165,8 +1166,8 @@ adw_swipe_tracker_class_init (AdwSwipeTrackerClass *klass)
0,
NULL, NULL, NULL,
G_TYPE_NONE,
- 2,
- G_TYPE_UINT, G_TYPE_DOUBLE);
+ 3,
+ G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]