summaryrefslogtreecommitdiffstats
path: root/widget/src/scrollable.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-07-13 02:53:45 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-07-13 02:56:28 +0200
commita9987cb32e4d65b83f134ba54f51dffe16e93a50 (patch)
tree20cda7929af3546e63a1ee3df8780819cdbd5fd7 /widget/src/scrollable.rs
parent11287c882e23e1f3081d06bf5ff3e99a02ef030a (diff)
downloadiced-a9987cb32e4d65b83f134ba54f51dffe16e93a50.tar.gz
iced-a9987cb32e4d65b83f134ba54f51dffe16e93a50.tar.bz2
iced-a9987cb32e4d65b83f134ba54f51dffe16e93a50.zip
Introduce `absolute_offset_reversed` to `scrollable::Viewport`
Diffstat (limited to 'widget/src/scrollable.rs')
-rw-r--r--widget/src/scrollable.rs75
1 files changed, 17 insertions, 58 deletions
diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs
index 3f49584c..5cd94538 100644
--- a/widget/src/scrollable.rs
+++ b/widget/src/scrollable.rs
@@ -554,14 +554,7 @@ pub fn update<Message>(
state.scroll(delta, direction, bounds, content_bounds);
- notify_on_scroll(
- state,
- on_scroll,
- bounds,
- content_bounds,
- direction,
- shell,
- );
+ notify_on_scroll(state, on_scroll, bounds, content_bounds, shell);
return event::Status::Captured;
}
@@ -599,7 +592,6 @@ pub fn update<Message>(
on_scroll,
bounds,
content_bounds,
- direction,
shell,
);
}
@@ -645,7 +637,6 @@ pub fn update<Message>(
on_scroll,
bounds,
content_bounds,
- direction,
shell,
);
@@ -681,7 +672,6 @@ pub fn update<Message>(
on_scroll,
bounds,
content_bounds,
- direction,
shell,
);
}
@@ -722,7 +712,6 @@ pub fn update<Message>(
on_scroll,
bounds,
content_bounds,
- direction,
shell,
);
}
@@ -758,7 +747,6 @@ pub fn update<Message>(
on_scroll,
bounds,
content_bounds,
- direction,
shell,
);
@@ -974,7 +962,6 @@ fn notify_on_scroll<Message>(
on_scroll: &Option<Box<dyn Fn(Viewport) -> Message + '_>>,
bounds: Rectangle,
content_bounds: Rectangle,
- direction: Direction,
shell: &mut Shell<'_, Message>,
) {
if let Some(on_scroll) = on_scroll {
@@ -984,23 +971,11 @@ fn notify_on_scroll<Message>(
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 {
offset_x: state.offset_x,
offset_y: state.offset_y,
bounds,
content_bounds,
- vertical_alignment,
- horizontal_alignment,
};
// Don't publish redundant viewports to shell
@@ -1105,8 +1080,6 @@ pub struct Viewport {
offset_y: Offset,
bounds: Rectangle,
content_bounds: Rectangle,
- vertical_alignment: Alignment,
- horizontal_alignment: Alignment,
}
impl Viewport {
@@ -1122,6 +1095,22 @@ impl Viewport {
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`].
pub fn relative_offset(&self) -> RelativeOffset {
let AbsoluteOffset { x, y } = self.absolute_offset();
@@ -1131,36 +1120,6 @@ impl Viewport {
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 {