Allow disabling animations on a ScrollArea (#4309)

<!--
Please read the "Making a PR" section of
[`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/master/CONTRIBUTING.md)
before opening a Pull Request!

* Keep your PR:s small and focused.
* The PR title is what ends up in the changelog, so make it descriptive!
* If applicable, add a screenshot or gif.
* If it is a non-trivial addition, consider adding a demo for it to
`egui_demo_lib`, or a new example.
* Do NOT open PR:s from your `master` branch, as that makes it hard for
maintainers to add commits to your PR.
* Remember to run `cargo fmt` and `cargo cranky`.
* Open the PR as a draft until you have self-reviewed it and run
`./scripts/check.sh`.
* When you have addressed a PR comment, mark it as resolved.

Please be patient! I will review your PR, but my time is limited!
-->

Adds a flag to ScrollArea that disables animations for the scroll_to_*
functions
This commit is contained in:
lucasmerlin 2024-04-02 17:53:54 +02:00 committed by GitHub
parent 36ebce163a
commit de9e0adf17
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 20 additions and 1 deletions

View File

@ -176,6 +176,9 @@ pub struct ScrollArea {
/// end position until user manually changes position. It will become true /// end position until user manually changes position. It will become true
/// again once scroll handle makes contact with end. /// again once scroll handle makes contact with end.
stick_to_end: Vec2b, stick_to_end: Vec2b,
/// If false, `scroll_to_*` functions will not be animated
animated: bool,
} }
impl ScrollArea { impl ScrollArea {
@ -219,6 +222,7 @@ impl ScrollArea {
scrolling_enabled: true, scrolling_enabled: true,
drag_to_scroll: true, drag_to_scroll: true,
stick_to_end: Vec2b::FALSE, stick_to_end: Vec2b::FALSE,
animated: true,
} }
} }
@ -393,6 +397,15 @@ impl ScrollArea {
self self
} }
/// Should the scroll area animate `scroll_to_*` functions?
///
/// Default: `true`.
#[inline]
pub fn animated(mut self, animated: bool) -> Self {
self.animated = animated;
self
}
/// Is any scrolling enabled? /// Is any scrolling enabled?
pub(crate) fn is_any_scroll_enabled(&self) -> bool { pub(crate) fn is_any_scroll_enabled(&self) -> bool {
self.scroll_enabled[0] || self.scroll_enabled[1] self.scroll_enabled[0] || self.scroll_enabled[1]
@ -459,6 +472,7 @@ struct Prepared {
scrolling_enabled: bool, scrolling_enabled: bool,
stick_to_end: Vec2b, stick_to_end: Vec2b,
animated: bool,
} }
impl ScrollArea { impl ScrollArea {
@ -475,6 +489,7 @@ impl ScrollArea {
scrolling_enabled, scrolling_enabled,
drag_to_scroll, drag_to_scroll,
stick_to_end, stick_to_end,
animated,
} = self; } = self;
let ctx = ui.ctx().clone(); let ctx = ui.ctx().clone();
@ -650,6 +665,7 @@ impl ScrollArea {
viewport, viewport,
scrolling_enabled, scrolling_enabled,
stick_to_end, stick_to_end,
animated,
} }
} }
@ -761,6 +777,7 @@ impl Prepared {
viewport: _, viewport: _,
scrolling_enabled, scrolling_enabled,
stick_to_end, stick_to_end,
animated,
} = self; } = self;
let content_size = content_ui.min_size(); let content_size = content_ui.min_size();
@ -804,7 +821,9 @@ impl Prepared {
if delta != 0.0 { if delta != 0.0 {
let target_offset = state.offset[d] + delta; let target_offset = state.offset[d] + delta;
if let Some(animation) = &mut state.offset_target[d] { if !animated {
state.offset[d] = target_offset;
} else if let Some(animation) = &mut state.offset_target[d] {
// For instance: the user is continuously calling `ui.scroll_to_cursor`, // For instance: the user is continuously calling `ui.scroll_to_cursor`,
// so we don't want to reset the animation, but perhaps update the target: // so we don't want to reset the animation, but perhaps update the target:
animation.target_offset = target_offset; animation.target_offset = target_offset;