From 61d372bb7f911633ce1c5f21270c4c17ad39610d Mon Sep 17 00:00:00 2001 From: bflatastic Date: Sat, 10 Oct 2026 07:47:57 +0700 Subject: [PATCH] Fix #775: the Properties panel's Paragraph section justifies and hyphenates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With type selected, the Properties panel's Paragraph section had only Align Left, Center and Right. It now has the Paragraph panel's seven alignments (the justified ones too), its Hyphenate checkbox and a "…" button that opens the Paragraph panel, as Illustrator's does. Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/i18n/es.tsv | 1 + crates/ui-egui/src/i18n/fr.tsv | 1 + crates/ui-egui/src/i18n/it.tsv | 1 + crates/ui-egui/src/i18n/ja.tsv | 1 + crates/ui-egui/src/i18n/pt-br.tsv | 1 + crates/ui-egui/src/i18n/ru.tsv | 1 + crates/ui-egui/src/i18n/uk.tsv | 1 + crates/ui-egui/src/i18n/zh-hans.tsv | 1 + crates/ui-egui/src/i18n/zh-hant.tsv | 1 + crates/ui-egui/src/panels/paragraph.rs | 29 ++++++++++++++++-------- crates/ui-egui/src/panels/properties.rs | 30 ++++++++++++++++++++----- 11 files changed, 53 insertions(+), 15 deletions(-) diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 20999294..5e550b49 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -1498,6 +1498,7 @@ More Más More Pathfinder options Más opciones de Buscatrazos More Align options Más opciones de alineación + More Paragraph options Más opciones de párrafo More Settings Más ajustes Move Mover Move All Objects Mover todos los objetos diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index ab47b7f4..58d52e35 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -1497,6 +1497,7 @@ More Plus More Pathfinder options Plus d’options Pathfinder More Align options Plus d’options d’alignement + More Paragraph options Plus d’options de paragraphe More Settings Plus de réglages Move Déplacer Move All Objects Déplacer tous les objets diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index e23a10f5..7ee24bd8 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -1498,6 +1498,7 @@ More Altro More Pathfinder options Altre opzioni di Elaborazione tracciati More Align options Altre opzioni di allineamento + More Paragraph options Altre opzioni di paragrafo More Settings Altre impostazioni Move Sposta Move All Objects Sposta tutti gli oggetti diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index 75df7057..1dc6a340 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -1640,6 +1640,7 @@ More 多く More Pathfinder options その他のパスファインダーオプション More Align options その他の整列オプション + More Paragraph options その他の段落オプション More Settings その他の設定 Move 移動 Move Anchors アンカーポイントを移動 diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 09b12d79..64c7b2af 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -1314,6 +1314,7 @@ More Mais More Pathfinder options Mais opções de Localizador de Caminhos More Align options Mais opções de alinhamento + More Paragraph options Mais opções de parágrafo More Settings Mais Configurações Move Mover Move Anchors Mover Âncoras diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 504b52a9..68dd631b 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -1496,6 +1496,7 @@ More Больше More Pathfinder options Дополнительные параметры обработки контуров More Align options Дополнительные параметры выравнивания + More Paragraph options Дополнительные параметры абзаца More Settings Дополнительные настройки Move Переместить Move All Objects Переместить все объекты diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index 0f19a210..de22dc22 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -1492,6 +1492,7 @@ More Більше More Pathfinder options Додаткові параметри обробки контурів More Align options Додаткові параметри вирівнювання + More Paragraph options Додаткові параметри абзацу More Settings Додаткові налаштування Move Перемістити Move All Objects Перемістити всі об’єкти diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index 03119810..b1021820 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -1456,6 +1456,7 @@ More 较多 More Pathfinder options 更多路径查找器选项 More Align options 更多对齐选项 + More Paragraph options 更多段落选项 More Settings 更多设置 Move 移动 Move All Objects 移动所有对象 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 7aabf141..177b1869 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -1498,6 +1498,7 @@ More 更多 More Pathfinder options 更多路徑管理員選項 More Align options 更多對齊選項 + More Paragraph options 更多段落選項 More Settings 更多設定 Move 移動 Move All Objects 移動所有物件 diff --git a/crates/ui-egui/src/panels/paragraph.rs b/crates/ui-egui/src/panels/paragraph.rs index 101072bd..ed9f2a62 100644 --- a/crates/ui-egui/src/panels/paragraph.rs +++ b/crates/ui-egui/src/panels/paragraph.rs @@ -60,6 +60,24 @@ fn shown_alignment(justify: Justify, rtl: bool) -> Justify { } } +/// The seven alignment buttons, `size` points square, the one of `para`'s alignment on (the +/// Paragraph panel's and the Properties panel's). +pub fn alignment_buttons(app: &mut VectorcraftApp, ui: &mut Ui, para: &ParaStyle, size: f32) { + let shown = shown_alignment(para.justify, resolved_rtl(app, para)); + for (j, icon, tip, id) in ALIGNMENTS { + if widgets::icon_button(ui, icon, tip, shown == j, size).clicked() { + para_cmd(app, "text.setStyle", json!({"justify": id})); + } + } +} + +/// The Hyphenate checkbox of `para`'s paragraphs. +pub fn hyphenate_check(app: &mut VectorcraftApp, ui: &mut Ui, para: &ParaStyle) { + if widgets::check(ui, tl!("Hyphenate"), para.hyphenate, true) { + format(app, json!({"hyphenate": !para.hyphenate})); + } +} + pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) { let t = Tokens::get(ui.ctx()); let Some((_, para)) = text_style(app) else { @@ -67,14 +85,9 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) { return; }; let rtl = resolved_rtl(app, ¶); - let shown = shown_alignment(para.justify, rtl); ui.horizontal(|ui| { ui.spacing_mut().item_spacing.x = 3.0; - for (j, icon, tip, id) in ALIGNMENTS { - if widgets::icon_button(ui, icon, tip, shown == j, 28.0).clicked() { - para_cmd(app, "text.setStyle", json!({"justify": id})); - } - } + alignment_buttons(app, ui, ¶, 28.0); // Paragraph direction, with the Middle Eastern (Indic) options. if app.session.prefs.show_indic_options { ui.add_space(6.0); @@ -127,9 +140,7 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) { if pstate::(ui.ctx(), "pa-hide-options") { return; } - if widgets::check(ui, tl!("Hyphenate"), para.hyphenate, true) { - format(app, json!({"hyphenate": !para.hyphenate})); - } + hyphenate_check(app, ui, ¶); // Japanese composition: how punctuation is spaced (JLREQ 3.1), with the East Asian options. if app.session.prefs.show_east_asian_options { ui.horizontal(|ui| { diff --git a/crates/ui-egui/src/panels/properties.rs b/crates/ui-egui/src/panels/properties.rs index 88a636ae..e69a1d82 100644 --- a/crates/ui-egui/src/panels/properties.rs +++ b/crates/ui-egui/src/panels/properties.rs @@ -523,13 +523,17 @@ pub fn type_sections(app: &mut VectorcraftApp, ui: &mut Ui) { super::character::font_pickers(app, ui, &s, ("font", "font-style"), (w - 4.0, w - 4.0)); super::character::metrics_grid(app, ui, "props-char", &s, w, false); section_header(ui, tl!("Paragraph")); - ui.horizontal(|ui| { - for (icon, j) in [("align-start-vertical", "left"), ("align-center-vertical", "center"), ("align-end-vertical", "right")] { - if widgets::icon_button(ui, icon, j, false, 24.0).clicked() { - app.run("text.setStyle", json!({"justify": j})).ok(); + // As in the Paragraph panel: the seven alignments and Hyphenate (#775); the rest is there. + if let Some((_, para)) = super::character::text_style(app) { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 3.0; + super::paragraph::alignment_buttons(app, ui, ¶, 24.0); + if widgets::icon_button(ui, "ellipsis", tl!("More Paragraph options"), false, 24.0).clicked() { + app.ui.open_panel = Some("paragraph".into()); } - } - }); + }); + super::paragraph::hyphenate_check(app, ui, ¶); + } } #[cfg(test)] @@ -592,6 +596,20 @@ mod tests { } /// #530: Edit Artboards shows the active artboard, with New Artboard, Delete Artboard and Exit. + /// #775: type's Paragraph section has Hyphenate, and its checkbox turns it on. + #[test] + fn type_paragraph_section_hyphenates() { + let mut app = VectorcraftApp::new(Session::new(), Default::default()); + app.run("file.new", json!({"width": 200, "height": 100})).unwrap(); + app.run("text.create", json!({"x": 10, "y": 50, "text": "Paragraph"})).unwrap(); + let ctx = egui::Context::default(); + frame(&mut app, &ctx, vec![]); + let texts = frame(&mut app, &ctx, vec![]); + click(&mut app, &ctx, &texts, "Hyphenate"); + let hyphenate = |app: &VectorcraftApp| crate::panels::character::text_style(app).unwrap().1.hyphenate; + assert!(hyphenate(&app)); + } + #[test] fn edit_artboards_adds_artboards_and_exits() { let mut app = VectorcraftApp::new(Session::new(), Default::default());