From 3774c3312a4a795a33f1627c41c8a0d4aa973d4a Mon Sep 17 00:00:00 2001 From: bflatastic Date: Mon, 9 Nov 2026 21:03:12 +0700 Subject: [PATCH] Fit the landed changes together The forms editor's test draft sets the focus's obj and list, which main added, and the focus scripts look up the focused field with focused_field so a same-name twin is read as main reads it. --- crates/ui-egui/src/editing.rs | 10 +++++----- crates/ui-egui/src/tools/forms_ui.rs | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/ui-egui/src/editing.rs b/crates/ui-egui/src/editing.rs index 3d76132ac5..0c810437f4 100644 --- a/crates/ui-egui/src/editing.rs +++ b/crates/ui-egui/src/editing.rs @@ -789,14 +789,14 @@ impl PdfCraftApp { } let left = std::mem::replace(&mut view.forms.focused, now.clone()); let id = view.id; - let edited = now.as_ref().map(|(name, _)| name.clone()); + let edited = view.forms.focus.clone(); use pdfcraft_engine::js::FieldFocus; for ((name, widget), focus) in [left.map(|l| (l, FieldFocus::Exit)), now.map(|n| (n, FieldFocus::Enter))].into_iter().flatten() { // The edited field's value before this script, to tell its untouched draft from typing: // the exit of the field left may have changed it already, and the draft with it. - let before: Option<(String, Vec)> = edited - .as_ref() - .and_then(|e| self.session.get(id)?.form.iter().find(|f| &f.name == e).map(|f| (crate::forms_ui::draft_text(f), f.value.clone()))); + let before: Option<(String, Vec)> = edited.as_ref().and_then(|e| { + crate::forms_ui::focused_field(e, &self.session.get(id)?.form).map(|f| (crate::forms_ui::draft_text(f), f.value.clone())) + }); match self.session.field_focus(id, &name, widget, focus) { Ok(changed) => { if changed @@ -806,7 +806,7 @@ impl PdfCraftApp { view.document_changed(&info); if let Some(before) = &before && let Some(draft) = view.forms.focus.as_mut() - && let Some(f) = self.session.get(id).and_then(|d| d.form.iter().find(|f| f.name == draft.name)) + && let Some(f) = self.session.get(id).and_then(|d| crate::forms_ui::focused_field(draft, &d.form)) { crate::forms_ui::refresh_draft(draft, (&before.0, &before.1), (crate::forms_ui::draft_text(f), &f.value)); } diff --git a/crates/ui-egui/src/tools/forms_ui.rs b/crates/ui-egui/src/tools/forms_ui.rs index d151943ec6..2c956aeec4 100644 --- a/crates/ui-egui/src/tools/forms_ui.rs +++ b/crates/ui-egui/src/tools/forms_ui.rs @@ -1404,6 +1404,7 @@ mod tests { fn draft(value: &[&str]) -> Focus { Focus { name: "hint".into(), + obj: None, widget: 0, text: value.first().map(|s| s.to_string()).unwrap_or_default(), picked: value.iter().map(|s| s.to_string()).collect(), @@ -1413,6 +1414,7 @@ mod tests { calendar: None, calendar_rect: None, calendar_text: None, + list: ChoiceList::default(), had_focus: false, } }