fix(ui): preserve presentation display state when applying preferences

This commit is contained in:
Combiler01 committed 2026-11-10 23:08:08 +05:30
1 parent 6b51ed655a
commit 91e54eeb37
3 files changed
+133 -20

No files matched your search

+5
View File
@@ -62,6 +62,11 @@ impl DocView {
})
}
/// The display saved before entering full screen, while presenting.
pub fn saved_display_mut(&mut self) -> Option<&mut SavedDisplay> {
self.presentation.as_mut()
}
/// Whether the view is in full screen's one-page-at-a-time display.
pub fn presenting(&self) -> bool {
self.presentation.is_some()
+49 -20
View File
@@ -755,33 +755,62 @@ fn card_documents_and_view(ui: &mut egui::Ui, app: &mut PdfCraftApp, t: &Tokens,
if app.always_default_view && (always_changed || layout_changed || continuous_changed || gaps_changed || fit_changed || zoom_changed) {
let defaults = app.view_defaults;
for view in &mut app.views {
view.set_display(defaults.layout, defaults.continuous);
view.set_page_gaps(defaults.show_page_gaps);
match defaults.fit {
Fit::None => view.set_zoom(defaults.zoom),
fit if view.fit != fit => view.set_fit(fit),
_ => {}
if let Some(saved) = view.saved_display_mut() {
saved.layout = defaults.layout;
saved.continuous = defaults.continuous;
saved.fit = defaults.fit;
if defaults.fit == Fit::None {
saved.zoom = defaults.zoom;
}
} else {
view.set_display(defaults.layout, defaults.continuous);
match defaults.fit {
Fit::None => view.set_zoom(defaults.zoom),
fit if view.fit != fit => view.set_fit(fit),
_ => {}
}
}
}
} else if let Some(i) = app.active {
if layout_changed {
app.views[i].set_layout(layout_choice);
}
if continuous_changed {
app.views[i].set_continuous(continuous);
}
let view = &mut app.views[i];
if gaps_changed {
app.views[i].set_page_gaps(show_page_gaps);
view.set_page_gaps(show_page_gaps);
}
if fit_changed {
match app.view_defaults.fit {
Fit::None => app.views[i].set_zoom(app.view_defaults.zoom),
fit if app.views[i].fit != fit => app.views[i].set_fit(fit),
_ => {}
if let Some(saved) = view.saved_display_mut() {
if layout_changed {
saved.layout = layout_choice;
}
if continuous_changed {
saved.continuous = continuous;
}
if fit_changed {
saved.fit = app.view_defaults.fit;
if app.view_defaults.fit == Fit::None {
saved.zoom = app.view_defaults.zoom;
}
}
if zoom_changed {
saved.fit = Fit::None;
saved.zoom = app.view_defaults.zoom;
}
} else {
if layout_changed {
view.set_layout(layout_choice);
}
if continuous_changed {
view.set_continuous(continuous);
}
if fit_changed {
match app.view_defaults.fit {
Fit::None => view.set_zoom(app.view_defaults.zoom),
fit if view.fit != fit => view.set_fit(fit),
_ => {}
}
}
if zoom_changed {
view.set_zoom(app.view_defaults.zoom);
}
}
if zoom_changed {
app.views[i].set_zoom(app.view_defaults.zoom);
}
}
ctx.checkbox(ui, &mut app.text_links, tl!("Open web and email addresses written in the page text"), t);
+79
View File
@@ -1296,6 +1296,85 @@ fn preferences_toggle_continuous_scrolling_updates_active_document() {
assert!(h.state().views[0].continuous(), "active document view is updated");
}
#[test]
fn preferences_during_full_screen_updates_saved_normal_display_and_restores_on_exit() {
use egui_kittest::kittest::Queryable;
use pdfcraft_ui_egui::canvas::Fit;
let mut h = harness(&[("continuous", "off"), ("zoom", "50")]);
let v0 = &h.state().views[0];
assert!(!v0.continuous());
assert_eq!(v0.fit, Fit::None);
assert_eq!(v0.zoom, 0.5);
h.state_mut().views[0].enter_presentation();
assert!(h.state().views[0].presenting());
assert!(!h.state().views[0].continuous());
assert_eq!(h.state().views[0].fit, Fit::Page);
assert!(h.state_mut().execute("app.preferences"));
h.run_steps(3);
h.get_by_label("Always use my default zoom and page layout").scroll_to_me();
h.run_steps(4);
h.get_by_label("Always use my default zoom and page layout").click();
h.run_steps(2);
assert!(h.state().always_default_view);
{
let v = &h.state().views[0];
assert!(v.presenting(), "presentation display is preserved");
assert!(!v.continuous(), "presentation display is not continuous");
assert_eq!(v.fit, Fit::Page, "presentation display stays fitted to page");
assert!(v.normal_display().continuous, "saved normal display updated to continuous");
assert_eq!(v.normal_display().fit, Fit::Width, "saved normal display updated to default fit width");
}
h.state_mut().views[0].leave_presentation();
{
let v = &h.state().views[0];
assert!(!v.presenting());
assert!(v.continuous(), "continuous scrolling restored from updated preferences");
assert_eq!(v.fit, Fit::Width, "fit width restored from updated preferences");
}
}
#[test]
fn preferences_toggle_continuous_during_full_screen_updates_saved_normal_display() {
use egui_kittest::kittest::Queryable;
use pdfcraft_ui_egui::canvas::Fit;
let mut h = harness(&[("default-continuous", "off"), ("continuous", "off")]);
assert!(!h.state().views[0].continuous());
h.state_mut().views[0].enter_presentation();
assert!(h.state().views[0].presenting());
assert!(!h.state().views[0].continuous());
assert_eq!(h.state().views[0].fit, Fit::Page);
assert!(h.state_mut().execute("app.preferences"));
h.run_steps(3);
h.get_by_label("Continuous scrolling").scroll_to_me();
h.run_steps(4);
h.get_by_label("Continuous scrolling").click();
h.run_steps(2);
assert!(h.state().view_defaults.continuous);
{
let v = &h.state().views[0];
assert!(v.presenting(), "presentation display is preserved");
assert!(!v.continuous(), "presentation display is not continuous");
assert_eq!(v.fit, Fit::Page, "presentation display stays fitted to page");
assert!(v.normal_display().continuous, "saved normal display updated to continuous");
}
h.state_mut().views[0].leave_presentation();
{
let v = &h.state().views[0];
assert!(!v.presenting());
assert!(v.continuous(), "continuous scrolling restored on exit");
}
}
#[test]
fn preferences_set_the_default_zoom() {
use egui_kittest::kittest::Queryable;