Introduce absolute_offset_reversed to scrollable::Viewport

This commit is contained in:
Héctor Ramón Jiménez 2023-07-13 02:53:45 +02:00
parent 11287c882e
commit a9987cb32e
No known key found for this signature in database
GPG key ID: 140CC052C94F138E

View file

@ -554,14 +554,7 @@ pub fn update<Message>(
state.scroll(delta, direction, bounds, content_bounds); state.scroll(delta, direction, bounds, content_bounds);
notify_on_scroll( notify_on_scroll(state, on_scroll, bounds, content_bounds, shell);
state,
on_scroll,
bounds,
content_bounds,
direction,
shell,
);
return event::Status::Captured; return event::Status::Captured;
} }
@ -599,7 +592,6 @@ pub fn update<Message>(
on_scroll, on_scroll,
bounds, bounds,
content_bounds, content_bounds,
direction,
shell, shell,
); );
} }
@ -645,7 +637,6 @@ pub fn update<Message>(
on_scroll, on_scroll,
bounds, bounds,
content_bounds, content_bounds,
direction,
shell, shell,
); );
@ -681,7 +672,6 @@ pub fn update<Message>(
on_scroll, on_scroll,
bounds, bounds,
content_bounds, content_bounds,
direction,
shell, shell,
); );
} }
@ -722,7 +712,6 @@ pub fn update<Message>(
on_scroll, on_scroll,
bounds, bounds,
content_bounds, content_bounds,
direction,
shell, shell,
); );
} }
@ -758,7 +747,6 @@ pub fn update<Message>(
on_scroll, on_scroll,
bounds, bounds,
content_bounds, content_bounds,
direction,
shell, shell,
); );
@ -974,7 +962,6 @@ fn notify_on_scroll<Message>(
on_scroll: &Option<Box<dyn Fn(Viewport) -> Message + '_>>, on_scroll: &Option<Box<dyn Fn(Viewport) -> Message + '_>>,
bounds: Rectangle, bounds: Rectangle,
content_bounds: Rectangle, content_bounds: Rectangle,
direction: Direction,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
) { ) {
if let Some(on_scroll) = on_scroll { if let Some(on_scroll) = on_scroll {
@ -984,23 +971,11 @@ fn notify_on_scroll<Message>(
return; return;
} }
let horizontal_alignment = direction
.horizontal()
.map(|p| p.alignment)
.unwrap_or_default();
let vertical_alignment = direction
.vertical()
.map(|p| p.alignment)
.unwrap_or_default();
let viewport = Viewport { let viewport = Viewport {
offset_x: state.offset_x, offset_x: state.offset_x,
offset_y: state.offset_y, offset_y: state.offset_y,
bounds, bounds,
content_bounds, content_bounds,
vertical_alignment,
horizontal_alignment,
}; };
// Don't publish redundant viewports to shell // Don't publish redundant viewports to shell
@ -1105,8 +1080,6 @@ pub struct Viewport {
offset_y: Offset, offset_y: Offset,
bounds: Rectangle, bounds: Rectangle,
content_bounds: Rectangle, content_bounds: Rectangle,
vertical_alignment: Alignment,
horizontal_alignment: Alignment,
} }
impl Viewport { impl Viewport {
@ -1122,6 +1095,22 @@ impl Viewport {
AbsoluteOffset { x, y } AbsoluteOffset { x, y }
} }
/// Returns the [`AbsoluteOffset`] of the current [`Viewport`], but with its
/// alignment reversed.
///
/// This method can be useful to switch the alignment of a [`Scrollable`]
/// while maintaining its scrolling position.
pub fn absolute_offset_reversed(&self) -> AbsoluteOffset {
let AbsoluteOffset { x, y } = self.absolute_offset();
AbsoluteOffset {
x: ((self.content_bounds.width - self.bounds.width).max(0.0) - x)
.max(0.0),
y: ((self.content_bounds.height - self.bounds.height).max(0.0) - y)
.max(0.0),
}
}
/// Returns the [`RelativeOffset`] of the current [`Viewport`]. /// Returns the [`RelativeOffset`] of the current [`Viewport`].
pub fn relative_offset(&self) -> RelativeOffset { pub fn relative_offset(&self) -> RelativeOffset {
let AbsoluteOffset { x, y } = self.absolute_offset(); let AbsoluteOffset { x, y } = self.absolute_offset();
@ -1131,36 +1120,6 @@ impl Viewport {
RelativeOffset { x, y } RelativeOffset { x, y }
} }
/// Returns a new [`Viewport`] with the supplied vertical [`Alignment`].
pub fn with_vertical_alignment(self, alignment: Alignment) -> Self {
if self.vertical_alignment != alignment {
let relative = 1.0 - self.relative_offset().y;
Self {
offset_y: Offset::Relative(relative),
vertical_alignment: alignment,
..self
}
} else {
self
}
}
/// Returns a new [`Viewport`] with the supplied horizontal [`Alignment`].
pub fn with_horizontal_alignment(self, alignment: Alignment) -> Self {
if self.horizontal_alignment != alignment {
let relative = 1.0 - self.relative_offset().x;
Self {
offset_x: Offset::Relative(relative),
horizontal_alignment: alignment,
..self
}
} else {
self
}
}
} }
impl State { impl State {