SlidingView: Properly animate fast scrolling
This commit is contained in:
parent
0e44037239
commit
e4ee49c2a1
1 changed files with 18 additions and 4 deletions
|
|
@ -250,7 +250,7 @@ mod imp {
|
||||||
for (page_index, page) in self.pages.borrow().iter().enumerate() {
|
for (page_index, page) in self.pages.borrow().iter().enumerate() {
|
||||||
match *self.position_tracking.borrow() {
|
match *self.position_tracking.borrow() {
|
||||||
PositionTracking::Position(_) => {
|
PositionTracking::Position(_) => {
|
||||||
self.size_allocate_position(page_index, page, width, height)
|
self.size_allocate_position(page_index, page, width, height);
|
||||||
}
|
}
|
||||||
PositionTracking::StackedCards(_) => {
|
PositionTracking::StackedCards(_) => {
|
||||||
// Hide all and show to relevant widgets later
|
// Hide all and show to relevant widgets later
|
||||||
|
|
@ -379,19 +379,29 @@ mod imp {
|
||||||
let progress = stacked_cards.progress;
|
let progress = stacked_cards.progress;
|
||||||
|
|
||||||
//New Page
|
//New Page
|
||||||
new_page.set_child_visible(true);
|
|
||||||
|
|
||||||
// Ensure that new image is on top
|
// Ensure that new image is on top
|
||||||
new_page.unparent();
|
new_page.unparent();
|
||||||
new_page.insert_after(&obj, Some(prev_page));
|
new_page.insert_after(&obj, Some(prev_page));
|
||||||
|
|
||||||
|
// Don't show spinner or error during animation
|
||||||
|
if new_page.image().is_loaded() {
|
||||||
|
new_page.set_child_visible(true);
|
||||||
|
} else {
|
||||||
|
// Set explicity since re-parenting resets the state
|
||||||
|
new_page.set_child_visible(false);
|
||||||
|
}
|
||||||
|
|
||||||
let x = direction_sign * STEP_PIXEL_SHIFT * (1. - progress as f32);
|
let x = direction_sign * STEP_PIXEL_SHIFT * (1. - progress as f32);
|
||||||
let transform = gsk::Transform::new().translate(&graphene::Point::new(x, 0.));
|
let transform = gsk::Transform::new().translate(&graphene::Point::new(x, 0.));
|
||||||
new_page.allocate(width, height, 0, Some(transform));
|
new_page.allocate(width, height, 0, Some(transform));
|
||||||
new_page.set_opacity(progress);
|
new_page.set_opacity(progress);
|
||||||
|
|
||||||
// Prev Page
|
// Prev Page
|
||||||
prev_page.set_child_visible(true);
|
if prev_page.image().is_loaded() {
|
||||||
|
prev_page.set_child_visible(true);
|
||||||
|
}
|
||||||
|
|
||||||
let x = -direction_sign
|
let x = -direction_sign
|
||||||
* f32::max(
|
* f32::max(
|
||||||
0.,
|
0.,
|
||||||
|
|
@ -478,7 +488,11 @@ impl LpSlidingView {
|
||||||
let current_index = self.current_index();
|
let current_index = self.current_index();
|
||||||
|
|
||||||
if let Some(index) = self.index_of(page) {
|
if let Some(index) = self.index_of(page) {
|
||||||
// Don't unparent here since page might still be needed in delete animation.
|
// Only unparent if far enough away to not be involved in delete animation
|
||||||
|
if current_index.map_or(false, |x| x.abs_diff(index) as isize > 1) {
|
||||||
|
page.unparent();
|
||||||
|
}
|
||||||
|
|
||||||
self.imp().pages.borrow_mut().remove(index);
|
self.imp().pages.borrow_mut().remove(index);
|
||||||
|
|
||||||
self.queue_allocate();
|
self.queue_allocate();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue