* Forms: push buttons run their show/hide-a-field action A push button whose Mouse Up action is a Hide action (ISO 32000-2 §12.6.4.11) did nothing when clicked: the action wasn't read, so the button counted as having no action at all. Buttons now read it: /T as a field name, a reference to a field or one of its widgets (named by its fully qualified name, following /Parent with a cycle guard), or an array of these; /H false shows instead of hiding. Clicking hides or shows the named fields and their kids through the same edit that a script setting field.display uses, so it is one undo step. A hidden widget (Hidden or NoView flag) no longer takes clicks, tab stops, hover frames or field highlights. That also covers fields that a script hides. Tests: forms push_buttons_read_hide_actions (names, references, arrays, /H, a /Parent cycle) and ui-egui hide_actions_hide_and_show_fields. parity: edit.action-show-hide-field is shipped. * Forms: push buttons with an action show the pointing hand Hovering a push button showed the "not allowed" cursor, although clicking it runs its action. Buttons that aren't read-only and have an action now show the pointing hand; read-only buttons and buttons with no action keep the "not allowed" cursor. Test: hide_actions_hide_and_show_fields checks the cursor (it fails without this change). * Clippy: needless borrow in the hide-action test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Brandon Thomas <echelon@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| src | ||
| Cargo.toml | ||
| README.md | ||
README.md
pdfcraft-forms
Interactive forms (AcroForm, ISO 32000-2 §12.7). Layer L3; depends on pdfcraft-cos and
pdfcraft-fonts.
API
let all: Vec<Field> = fields(&doc); // terminal fields with widgets, options, flags, /DA
set_value(&mut doc, "name", &FieldValue::Text("Ada".into()))?;
set_value(&mut doc, "agree", &FieldValue::Check(true))?;
set_value(&mut doc, "size", &FieldValue::Radio(Some("L".into())))?;
set_value(&mut doc, "toppings", &FieldValue::Choice(vec!["Ham".into()]))?;
reset(&mut doc, None)?; // Clear form (back to /DV)
// Prepare a form
let name = add_field(&mut doc, 0, [72.0, 700.0, 216.0, 722.0], &NewField::Text { multiline: false }, None)?; // "Text1"
set_props(&mut doc, &name, &FieldProps { name: Some("email".into()), required: Some(true), ..Default::default() })?;
delete_field(&mut doc, "email")?;
Behaviour
- Inheritable attributes (
/FT,/Ff,/V,/DV,/DA,/Q,/MaxLen) are resolved down the field tree; the form's/DAand/Qare the last fallback. - Text and choice fields get new appearance streams (
/Tx BMC … EMC): auto-size (0 Tf), comb, multiline wrapping, password masking, quadding,/MKbackground and border, list-box selection. The/DAfont is used when/DRhas it as a simple font; otherwise Helvetica (WinAnsi). - Check boxes and radio buttons switch
/Vand each widget's/AS. Widgets with no appearances get PdfCraft's own (a drawn check mark or dot; no symbol font needed). - Values are validated (options,
MaxLen, single vs multi-select, NoToggleToOff, read-only) and a failed call changes nothing. /RV(rich text) is removed when a value is set so it can't contradict/V.- New fields follow Acrobat: names Text1, Check Box1, Group1 (radio groups), Dropdown1, List Box1,
Button1, Date1, Signature1;
/Helvis added to/DR; appearances are drawn at once. Radio buttons joining a group become kid widgets with their own export state. Renaming changes only the last part of a dotted name.
Not yet
JavaScript actions (format, keystroke, validate, calculate; M6.4/M6.5), rich-text values,
/MK /R rotation, the Appearance (colours, fonts), Actions, Format, Validate and Calculate
property tabs, FDF/XFDF import and export (M6.7).