Keep disabled scroll animations in Preferences (#5886)

This commit is contained in:
.CooCoo authored and GitHub committed 2026-11-03 09:20:09 -05:00
1 parent ea353f7a59
commit 15e45069cc
2 files changed
+48 -4

No files matched your search

+13 -4
View File
@@ -20,6 +20,9 @@ pub(super) mod protect;
pub(super) mod standards_ui;
pub(super) mod word_count_ui;
#[cfg(test)]
mod tests;
pub(crate) use prompts::{PromptButton, save_prompt_key};
use prompts::{full_screen_prompt, link_prompt, password, remote_link_prompt, save_prompt, unlock};
@@ -1371,20 +1374,26 @@ fn dialog_preferences(ui: &mut egui::Ui, app: &mut PdfCraftApp, req: &mut Pendin
// (which only applies when the settings overflow it) opens the dialog at full size.
// A scrollbar of its own: the floating one lies over the right edge of the theme
// cards and other full-width rows (#3557).
preferences_scroll(ui, max, |ui| preferences::preferences_body(ui, app, &t));
req.close = preferences::preferences_buttons(ui);
false
}
fn preferences_scroll(ui: &mut egui::Ui, max: f32, add_contents: impl FnOnce(&mut egui::Ui)) {
ui.scope(|ui| {
ui.spacing_mut().scroll.floating = false;
ui.spacing_mut().scroll.bar_inner_margin = 14.0;
ui.spacing_mut().scroll.bar_outer_margin = 2.0;
ui.style_mut().scroll_animation = egui::style::ScrollAnimation::duration(0.25);
if ui.style().scroll_animation != egui::style::ScrollAnimation::none() {
ui.style_mut().scroll_animation = egui::style::ScrollAnimation::duration(0.25);
}
egui::ScrollArea::vertical()
.id_salt("preferences-dialog-scroll")
.max_height(max)
.min_scrolled_height(max)
.animated(true)
.show(ui, |ui| preferences::preferences_body(ui, app, &t));
.show(ui, add_contents);
});
req.close = preferences::preferences_buttons(ui);
false
}
/// `Dialog::NumberPages` content. Returns `false` when it has its own buttons and no footer is wanted.
+35
View File
@@ -0,0 +1,35 @@
use std::cell::Cell;
use std::rc::Rc;
use egui_kittest::Harness;
use egui_kittest::kittest::Queryable;
#[test]
fn preferences_scroll_preserves_disabled_animation() {
for animated in [false, true] {
let scroll = Rc::new(Cell::new(false));
let requested = scroll.clone();
let mut h = Harness::builder().with_size(egui::vec2(600.0, 400.0)).with_step_dt(1.0 / 60.0).build_ui(move |ui| {
super::preferences_scroll(ui, 200.0, |ui| {
ui.add_space(1000.0);
let target = ui.label("Scroll target");
if requested.replace(false) {
ui.scroll_to_rect(target.rect, Some(egui::Align::BOTTOM));
}
ui.add_space(300.0);
});
});
h.ctx.all_styles_mut(|style| {
style.scroll_animation = if animated { egui::style::ScrollAnimation::default() } else { egui::style::ScrollAnimation::none() };
});
h.run_steps(4);
let before = h.get_by_label("Scroll target").rect().top();
scroll.set(true);
h.run_steps(4);
let early = h.get_by_label("Scroll target").rect().top();
h.run_steps(20);
let settled = h.get_by_label("Scroll target").rect().top();
assert!((before - settled).abs() > 50.0, "the target must scroll: {before} -> {settled}");
assert_eq!((early - settled).abs() > 1.0, animated, "animated: {animated}, early: {early}, settled: {settled}");
}
}