Expose methods to change viewport alignment
This commit is contained in:
parent
21bd51426d
commit
11287c882e
1 changed files with 58 additions and 1 deletions
|
|
@ -554,7 +554,14 @@ pub fn update<Message>(
|
||||||
|
|
||||||
state.scroll(delta, direction, bounds, content_bounds);
|
state.scroll(delta, direction, bounds, content_bounds);
|
||||||
|
|
||||||
notify_on_scroll(state, on_scroll, bounds, content_bounds, shell);
|
notify_on_scroll(
|
||||||
|
state,
|
||||||
|
on_scroll,
|
||||||
|
bounds,
|
||||||
|
content_bounds,
|
||||||
|
direction,
|
||||||
|
shell,
|
||||||
|
);
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
}
|
}
|
||||||
|
|
@ -592,6 +599,7 @@ pub fn update<Message>(
|
||||||
on_scroll,
|
on_scroll,
|
||||||
bounds,
|
bounds,
|
||||||
content_bounds,
|
content_bounds,
|
||||||
|
direction,
|
||||||
shell,
|
shell,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -637,6 +645,7 @@ pub fn update<Message>(
|
||||||
on_scroll,
|
on_scroll,
|
||||||
bounds,
|
bounds,
|
||||||
content_bounds,
|
content_bounds,
|
||||||
|
direction,
|
||||||
shell,
|
shell,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -672,6 +681,7 @@ pub fn update<Message>(
|
||||||
on_scroll,
|
on_scroll,
|
||||||
bounds,
|
bounds,
|
||||||
content_bounds,
|
content_bounds,
|
||||||
|
direction,
|
||||||
shell,
|
shell,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -712,6 +722,7 @@ pub fn update<Message>(
|
||||||
on_scroll,
|
on_scroll,
|
||||||
bounds,
|
bounds,
|
||||||
content_bounds,
|
content_bounds,
|
||||||
|
direction,
|
||||||
shell,
|
shell,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -747,6 +758,7 @@ pub fn update<Message>(
|
||||||
on_scroll,
|
on_scroll,
|
||||||
bounds,
|
bounds,
|
||||||
content_bounds,
|
content_bounds,
|
||||||
|
direction,
|
||||||
shell,
|
shell,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -962,6 +974,7 @@ 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 {
|
||||||
|
|
@ -971,11 +984,23 @@ 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
|
||||||
|
|
@ -1080,6 +1105,8 @@ 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 {
|
||||||
|
|
@ -1104,6 +1131,36 @@ 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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue