From d7026367f7f5773971d90e6cfb233e0bdb5eb048 Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Fri, 16 Oct 2026 07:28:40 -0700 Subject: [PATCH] Paragraph: Reset Panel also resets the Hyphenation options The Paragraph panel menu's Reset Panel turned Hyphenate off but left the Hyphenation options: Words Longer Than, After First, Before Last, Hyphen Limit, Hyphenation Zone and Hyphenate Capitalized Words. A paragraph kept its custom hyphenation limits after a reset. Reset Panel now also sets those six options to the values of HyphenationOptions::default(), in the same text.setFormat call. The reset paragraphs then save no hyphenation options. --- crates/ui-egui/src/panels/paragraph.rs | 54 +++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/crates/ui-egui/src/panels/paragraph.rs b/crates/ui-egui/src/panels/paragraph.rs index 0f56fe7a0..84c52281f 100644 --- a/crates/ui-egui/src/panels/paragraph.rs +++ b/crates/ui-egui/src/panels/paragraph.rs @@ -4,7 +4,7 @@ use egui::{Ui, vec2}; use serde_json::{Value, json}; -use vectorcraft_doc::{Composer, Justify, NodeKind, ParaDirection, ParaStyle}; +use vectorcraft_doc::{Composer, HyphenationOptions, Justify, NodeKind, ParaDirection, ParaStyle}; use super::character::text_style; use super::{pstate, set_pstate}; @@ -330,14 +330,27 @@ pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) { } ui.separator(); if menu_item(ui, tl!("Reset Panel"), has, false) { - para_cmd(app, "text.setStyle", json!({"justify": "auto"})); - format( - app, - json!({"leftIndent": 0, "rightIndent": 0, "firstLineIndent": 0, "spaceBefore": 0, "spaceAfter": 0, "hyphenate": false, "direction": "auto", "leadingModel": "romanBaseline", "burasagari": "standard", "kinsoku": "hard", "composer": "everyLine"}), - ); + reset_panel(app); } } +/// Reset Panel: the paragraphs the panel acts on ([`format`]) take Auto alignment, no indents or +/// paragraph spacing, Hyphenate off with the default Hyphenation options, Auto direction, +/// Bottom-to-Bottom Leading, Regular burasagari, the Hard kinsoku set and the Every-line Composer. +fn reset_panel(app: &mut VectorcraftApp) { + let h = HyphenationOptions::default(); + para_cmd(app, "text.setStyle", json!({"justify": "auto"})); + format( + app, + json!({ + "leftIndent": 0, "rightIndent": 0, "firstLineIndent": 0, "spaceBefore": 0, "spaceAfter": 0, "hyphenate": false, + "wordsLongerThan": h.words_longer_than, "afterFirst": h.after_first, "beforeLast": h.before_last, + "hyphenLimit": h.hyphen_limit, "hyphenationZone": h.zone, "hyphenateCapitalized": h.capitalized, + "direction": "auto", "leadingModel": "romanBaseline", "burasagari": "standard", "kinsoku": "hard", "composer": "everyLine" + }), + ); +} + #[cfg(test)] mod tests { use super::*; @@ -560,4 +573,33 @@ mod tests { app.session.prefs.show_indic_options = true; assert!(tips(&mut app) > without, "two more buttons"); } + + /// Reset Panel turns Hyphenate off and sets the Hyphenation options back to their defaults in + /// every paragraph it acts on, so the paragraphs save no hyphenation options. + #[test] + fn reset_panel_resets_the_hyphenation_options() { + let mut app = VectorcraftApp::new(Session::new(), Default::default()); + app.run("file.new", json!({"width": 400, "height": 200})).unwrap(); + let id = app.run("text.create", json!({"x": 20, "y": 50, "text": "First\nSecond"})).unwrap()["id"].clone(); + app.run( + "text.setFormat", + json!({"hyphenate": true, "wordsLongerThan": 8, "afterFirst": 2, "beforeLast": 4, "hyphenLimit": 2, "hyphenationZone": 18, "hyphenateCapitalized": false}), + ) + .unwrap(); + let paras = |app: &VectorcraftApp| { + let node = app.session.active().unwrap().doc.node(vectorcraft_doc::NodeId(id.as_u64().unwrap())).unwrap(); + let NodeKind::Text(text) = &node.kind else { panic!("text") }; + [text.para_at(0).clone(), text.para_at(1).clone()] + }; + for para in paras(&app) { + assert!(para.hyphenate); + assert_ne!(para.hyphenation, HyphenationOptions::default()); + } + reset_panel(&mut app); + for para in paras(&app) { + assert!(!para.hyphenate); + assert_eq!(para.hyphenation, HyphenationOptions::default()); + assert_eq!(serde_json::to_value(¶).unwrap().get("hyphenation"), None, "saves no hyphenation options"); + } + } }