diff --git a/crates/ui-egui/src/chrome/control_bar.rs b/crates/ui-egui/src/chrome/control_bar.rs index 1df1f08ab..58e203b75 100644 --- a/crates/ui-egui/src/chrome/control_bar.rs +++ b/crates/ui-egui/src/chrome/control_bar.rs @@ -263,6 +263,11 @@ pub fn control_bar(app: &mut VectorcraftApp, ui: &mut Ui) { } ui.separator(); crate::panels::character::control_bar(app, ui); + // Area type: its vertical alignment in the frame (#3759). + if crate::panels::properties::vertical_align::buttons(app, ui, 24.0) { + ui.add_space(4.0); + ui.separator(); + } if sel.is_empty() { if widgets::flat_button(ui, tl!("Document Setup"), 112.0).clicked() { app.run("file.documentSetup", json!({})).ok(); diff --git a/crates/ui-egui/src/i18n/bg.tsv b/crates/ui-egui/src/i18n/bg.tsv index 4f7feb3ee..ac5f629c1 100644 --- a/crates/ui-egui/src/i18n/bg.tsv +++ b/crates/ui-egui/src/i18n/bg.tsv @@ -1597,6 +1597,10 @@ font-technology Variable Променливи Join Tool Инструмент „Свързване“ Justification… Подравняване… Justify all lines Двустранно подравняване на всички редове + Align Top Подравняване горе + Align Center Подравняване в средата + Align Bottom Подравняване долу + Justify Vertically Двустранно вертикално подравняване Justify with last line aligned center Двустранно подравняване с центриран последен ред Justify with last line aligned left Двустранно подравняване с ляво подравнен последен ред Justify with last line aligned right Двустранно подравняване с дясно подравнен последен ред diff --git a/crates/ui-egui/src/i18n/bs.tsv b/crates/ui-egui/src/i18n/bs.tsv index fa7f049f6..c4280273c 100644 --- a/crates/ui-egui/src/i18n/bs.tsv +++ b/crates/ui-egui/src/i18n/bs.tsv @@ -950,6 +950,10 @@ lighting Light Svjetlo Home Početna Import Keyboard Shortcuts… Uvezi prečice na tastaturi… Justify all lines Obostrano poravnaj sve redove + Align Top Poravnaj gore + Align Center Poravnaj u sredinu + Align Bottom Poravnaj dolje + Justify Vertically Obostrano poravnaj okomito Justify with last line aligned left Obostrano s posljednjim redom lijevo Keyboard Shortcut Conflicts Konflikti prečica na tastaturi Keyboard Shortcut Set Skup prečica na tastaturi diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index 05d058dbc..9d5ce938d 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -2053,6 +2053,10 @@ digits Malayalam Malaiàlam Justification… Justificació… Justify Justifica Justify all lines Justifica totes les línies + Align Top Alinea a dalt + Align Center Alinea al mig + Align Bottom Alinea a baix + Justify Vertically Justifica verticalment Justify with last line aligned center Justifica amb l’última línia centrada Justify with last line aligned left Justifica amb l’última línia alineada a l’esquerra Justify with last line aligned right Justifica amb l’última línia alineada a la dreta diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 03c6020b8..4a3fe5695 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -969,6 +969,10 @@ lighting Light Světlo Home Domů Import Keyboard Shortcuts… Importovat klávesové zkratky… Justify all lines Do bloku včetně posledního řádku + Align Top Zarovnat nahoru + Align Center Zarovnat svisle na střed + Align Bottom Zarovnat dolů + Justify Vertically Zarovnat svisle do bloku Justify with last line aligned left Do bloku, poslední řádek vlevo Keyboard Shortcut Conflicts Konflikty klávesových zkratek Keyboard Shortcut Set Sada klávesových zkratek diff --git a/crates/ui-egui/src/i18n/da.tsv b/crates/ui-egui/src/i18n/da.tsv index 37cfc9647..b671f79d1 100644 --- a/crates/ui-egui/src/i18n/da.tsv +++ b/crates/ui-egui/src/i18n/da.tsv @@ -886,6 +886,10 @@ lighting Light Lys Home Home Import Keyboard Shortcuts… Importér tastaturgenveje… Justify all lines Justér alle linjer + Align Top Justér mod toppen + Align Center Justér lodret mod midten + Align Bottom Justér mod bunden + Justify Vertically Justér lodret Justify with last line aligned left Justér med sidste linje venstrejusteret Keyboard Shortcut Conflicts Konflikter mellem tastaturgenveje Keyboard Shortcut Set Tastaturgenvejssæt diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index 9658d5729..f7c7faea0 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -1642,6 +1642,10 @@ file-filter Templates Vorlagen Join Tool Zusammenfügen-Werkzeug Justification… Abstände… Justify all lines Blocksatz, alle Zeilen + Align Top Oben ausrichten + Align Center Mittig ausrichten + Align Bottom Unten ausrichten + Justify Vertically Vertikaler Blocksatz Justify with last line aligned center Blocksatz, letzte Zeile zentriert Justify with last line aligned left Blocksatz, letzte Zeile linksbündig Justify with last line aligned right Blocksatz, letzte Zeile rechtsbündig diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index eca62bdb9..445720603 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -1561,6 +1561,10 @@ font-technology Variable Μεταβλητές Join Tool Ένωση (Join Tool) Justification… Πλήρης στοίχιση… Justify all lines Πλήρης στοίχιση όλων των γραμμών + Align Top Στοίχιση επάνω + Align Center Στοίχιση στη μέση + Align Bottom Στοίχιση κάτω + Justify Vertically Κατακόρυφη πλήρης στοίχιση Justify with last line aligned center Πλήρης στοίχιση με τελευταία γραμμή στο κέντρο Justify with last line aligned left Πλήρης στοίχιση με τελευταία γραμμή αριστερά Justify with last line aligned right Πλήρης στοίχιση με τελευταία γραμμή δεξιά diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index e739c742c..c6950dae5 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -1647,6 +1647,10 @@ font-technology Variable Variables Join Tool Herramienta Unir Justification… Justificación… Justify all lines Justificar todas las líneas + Align Top Alinear arriba + Align Center Alinear en el medio + Align Bottom Alinear abajo + Justify Vertically Justificar verticalmente Justify with last line aligned center Justificar con la última línea centrada Justify with last line aligned left Justificar con la última línea alineada a la izquierda Justify with last line aligned right Justificar con la última línea alineada a la derecha diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index e27750497..ae6d114bb 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -948,6 +948,10 @@ lighting Light Valo Home Aloitus Import Keyboard Shortcuts… Tuo pikanäppäimet… Justify all lines Tasaa kaikki rivit + Align Top Tasaa ylös + Align Center Tasaa pystysuunnassa keskelle + Align Bottom Tasaa alas + Justify Vertically Tasaa pystysuunnassa Justify with last line aligned left Tasaa, viimeinen rivi vasemmalle Keyboard Shortcut Conflicts Pikanäppäinristiriidat Keyboard Shortcut Set Pikanäppäinjoukko diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index bac0097a6..3caae7f68 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -1641,6 +1641,10 @@ font-technology Variable Variables Join Tool Outil Jonction Justification… Justification… Justify all lines Justifier toutes les lignes + Align Top Aligner en haut + Align Center Aligner au milieu + Align Bottom Aligner en bas + Justify Vertically Justifier verticalement Justify with last line aligned center Justifier, dernière ligne centrée Justify with last line aligned left Justifier, dernière ligne alignée à gauche Justify with last line aligned right Justifier, dernière ligne alignée à droite diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index 225fa709f..3bc6b9861 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -2074,6 +2074,10 @@ file-filter Templates Sablonok Justification… Sorkizárás… Justify Sorkizárt Justify all lines Sorkizárás minden sorra + Align Top Igazítás felülre + Align Center Igazítás függőlegesen középre + Align Bottom Igazítás alulra + Justify Vertically Függőleges sorkizárás Justify with last line aligned center Sorkizárás, utolsó sor középre Justify with last line aligned left Sorkizárás, utolsó sor balra Justify with last line aligned right Sorkizárás, utolsó sor jobbra diff --git a/crates/ui-egui/src/i18n/id.tsv b/crates/ui-egui/src/i18n/id.tsv index d0d09e839..7948e08ba 100644 --- a/crates/ui-egui/src/i18n/id.tsv +++ b/crates/ui-egui/src/i18n/id.tsv @@ -886,6 +886,10 @@ lighting Light Cahaya Home Home Import Keyboard Shortcuts… Impor pintasan papan ketik… Justify all lines Ratakan semua baris + Align Top Sejajarkan ke atas + Align Center Sejajarkan ke tengah vertikal + Align Bottom Sejajarkan ke bawah + Justify Vertically Ratakan vertikal Justify with last line aligned left Ratakan dengan baris terakhir rata kiri Keyboard Shortcut Conflicts Konflik pintasan papan ketik Keyboard Shortcut Set Set pintasan papan ketik diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index a4a7d547a..5a11b455e 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -1674,6 +1674,10 @@ file-filter Templates Modelli Join Tool Strumento Unisci Justification… Giustificazione… Justify all lines Giustifica tutte le righe + Align Top Allinea in alto + Align Center Allinea al centro verticalmente + Align Bottom Allinea in basso + Justify Vertically Giustifica verticalmente Justify with last line aligned center Giustifica con l'ultima riga centrata Justify with last line aligned left Giustifica con l'ultima riga allineata a sinistra Justify with last line aligned right Giustifica con l'ultima riga allineata a destra diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index 3d04b70ce..178aaef86 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -3598,6 +3598,10 @@ file-filter Templates テンプレート Installed plug-in {} プラグイン {} をインストールしました Internal CSS 内部 CSS Justify all lines 両端揃え (最終行も均等配置) + Align Top 上揃え + Align Center 上下中央揃え + Align Bottom 下揃え + Justify Vertically 縦方向に均等配置 Justify with last line aligned center 両端揃え (最終行中央揃え) Justify with last line aligned left 両端揃え (最終行左揃え) Justify with last line aligned right 両端揃え (最終行右揃え) diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index d0c69c179..0d806a220 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -836,6 +836,10 @@ lighting Light სინათლე Home საწყისი ეკრანი Import Keyboard Shortcuts… კლავიატურის მალსახმობების იმპორტირება… Justify all lines ყველა სტრიქონის ორმხრივი სწორება + Align Top ზემოთ სწორება + Align Center შუაში სწორება + Align Bottom ქვემოთ სწორება + Justify Vertically ვერტიკალური ორმხრივი სწორება Justify with last line aligned left ორმხრივი სწორება, ბოლო სტრიქონი მარცხნივ Keyboard Shortcut Conflicts კლავიატურის მალსახმობების კონფლიქტები Keyboard Shortcut Set კლავიატურის მალსახმობების ნაკრები diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index 926896ebb..a216b4036 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -3586,6 +3586,10 @@ file-filter Templates 템플릿 Installed plug-in {} 플러그인 {}을(를) 설치했습니다 Internal CSS 내부 CSS Justify all lines 모든 줄 양끝 맞춤 + Align Top 위쪽 정렬 + Align Center 세로 가운데 정렬 + Align Bottom 아래쪽 정렬 + Justify Vertically 세로 양끝 맞춤 Justify with last line aligned center 마지막 줄 가운데 정렬 양끝 맞춤 Justify with last line aligned left 마지막 줄 왼쪽 정렬 양끝 맞춤 Justify with last line aligned right 마지막 줄 오른쪽 정렬 양끝 맞춤 diff --git a/crates/ui-egui/src/i18n/nl.tsv b/crates/ui-egui/src/i18n/nl.tsv index 8e23b89e8..3e15af341 100644 --- a/crates/ui-egui/src/i18n/nl.tsv +++ b/crates/ui-egui/src/i18n/nl.tsv @@ -900,6 +900,10 @@ lighting Light Licht Home Home Import Keyboard Shortcuts… Sneltoetsen importeren… Justify all lines Alle regels uitvullen + Align Top Boven uitlijnen + Align Center Midden uitlijnen + Align Bottom Onder uitlijnen + Justify Vertically Verticaal uitvullen Justify with last line aligned left Uitvullen met laatste regel links uitgelijnd Keyboard Shortcut Conflicts Sneltoetsconflicten Keyboard Shortcut Set Sneltoetsset diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index 6fd390d6d..cc5d041e7 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -906,6 +906,10 @@ lighting Light Światło Home Strona startowa Import Keyboard Shortcuts… Importuj skróty klawiaturowe… Justify all lines Justuj wszystkie wiersze + Align Top Wyrównaj do góry + Align Center Wyrównaj pionowo do środka + Align Bottom Wyrównaj do dołu + Justify Vertically Justuj w pionie Justify with last line aligned left Justuj z ostatnim wierszem do lewej Keyboard Shortcut Conflicts Konflikty skrótów klawiaturowych Keyboard Shortcut Set Zestaw skrótów klawiaturowych diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 331edd6bc..0921b0c72 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -4590,6 +4590,10 @@ axis Both Ambos Installed plug-in {} Plug-in {} instalado Internal CSS CSS Interno Justify all lines Justificar Todas as Linhas + Align Top Alinhar em Cima + Align Center Alinhar ao Meio + Align Bottom Alinhar em Baixo + Justify Vertically Justificar Verticalmente Justify with last line aligned center Justificar com Última Linha Centralizada Justify with last line aligned left Justificar com Última Linha à Esquerda Justify with last line aligned right Justificar com Última Linha à Direita diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 654e0a143..f620e8659 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -1671,6 +1671,10 @@ file-filter Templates Шаблоны Join Tool Инструмент «Соединение» Justification… Выключка… Justify all lines Выключить все строки + Align Top Выровнять по верху + Align Center Выровнять по середине + Align Bottom Выровнять по низу + Justify Vertically Выключка по вертикали Justify with last line aligned center Выключить с последней строкой по центру Justify with last line aligned left Выключить с последней строкой по левому краю Justify with last line aligned right Выключить с последней строкой по правому краю diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index 58a91b888..23a96006a 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -1603,6 +1603,10 @@ font-technology Variable Variabla Join Tool Sammanfogningsverktyg Justification… Justering… Justify all lines Marginaljustera alla rader + Align Top Justera överkant + Align Center Centrera vertikalt + Align Bottom Justera nederkant + Justify Vertically Marginaljustera vertikalt Justify with last line aligned center Marginaljustera med sista raden centrerad Justify with last line aligned left Marginaljustera med sista raden vänsterjusterad Justify with last line aligned right Marginaljustera med sista raden högerjusterad diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 5f41a5198..e16c913b7 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -1485,6 +1485,10 @@ font-technology Variable Değişken Join Tool Birleştirme Aracı Justification… İki Yana Yaslama… Justify all lines Tüm satırları iki yana yasla + Align Top Üste hizala + Align Center Dikey ortala + Align Bottom Alta hizala + Justify Vertically Dikey olarak iki yana yasla Justify with last line aligned center Son satıra hizalanmış merkeze yasla Justify with last line aligned left Son satırı sola hizalanmış şekilde iki yana yasla Justify with last line aligned right Son satırı sağa hizalayarak yasla diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index ad511f3ed..49dd42a05 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -1668,6 +1668,10 @@ file-filter Templates Шаблони Join Tool Інструмент «З’єднання» Justification… Вирівнювання за шириною… Justify all lines Вирівняти всі рядки за шириною + Align Top Вирівняти по верху + Align Center Вирівняти по середині + Align Bottom Вирівняти по низу + Justify Vertically Вирівняти по вертикалі за висотою Justify with last line aligned center Вирівняти за шириною, останній рядок — по центру Justify with last line aligned left Вирівняти за шириною, останній рядок — ліворуч Justify with last line aligned right Вирівняти за шириною, останній рядок — праворуч diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index fb24f7d04..0bfce04b8 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -1955,6 +1955,10 @@ digits Hindi Hindi Joins Kiểu nối Justification… Căn đều… Justify all lines Căn đều tất cả dòng + Align Top Căn trên + Align Center Căn giữa theo chiều dọc + Align Bottom Căn dưới + Justify Vertically Căn đều theo chiều dọc Justify with last line aligned center Căn đều, dòng cuối giữa Justify with last line aligned left Căn đều, dòng cuối trái Justify with last line aligned right Căn đều, dòng cuối phải diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index bf2a49b37..e70d78656 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -1599,6 +1599,10 @@ file-filter Templates 模板 Join Tool 连接工具 Justification… 对齐设置… Justify all lines 全部两端对齐 + Align Top 顶对齐 + Align Center 垂直居中对齐 + Align Bottom 底对齐 + Justify Vertically 垂直两端对齐 Justify with last line aligned center 两端对齐,末行居中 Justify with last line aligned left 两端对齐,末行左对齐 Justify with last line aligned right 两端对齐,末行右对齐 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 5f48b4307..b4a60cc3b 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -1638,6 +1638,10 @@ file-filter Templates 範本 Join Tool 連接工具 Justification… 對齊設定… Justify all lines 兩端對齊所有行 + Align Top 靠上對齊 + Align Center 垂直置中對齊 + Align Bottom 靠下對齊 + Justify Vertically 垂直齊行 Justify with last line aligned center 兩端對齊,最後一行置中 Justify with last line aligned left 兩端對齊,最後一行靠左 Justify with last line aligned right 兩端對齊,最後一行靠右 diff --git a/crates/ui-egui/src/panels/properties.rs b/crates/ui-egui/src/panels/properties.rs index b775dc05a..b8a42e928 100644 --- a/crates/ui-egui/src/panels/properties.rs +++ b/crates/ui-egui/src/panels/properties.rs @@ -1004,7 +1004,8 @@ pub fn type_sections(app: &mut VectorcraftApp, ui: &mut Ui) { super::character::variable_font(app, ui, &s, w - 4.0); super::character::metrics_grid(app, ui, "props-char", &s, w, false); section_header(ui, tl!("Paragraph")); - // As in the Paragraph panel: the seven alignments and Hyphenate (#775); the rest is there. + // As in the Paragraph panel: the seven alignments and Hyphenate (#775), and area type's + // vertical alignment (#3759); the rest is there. if let Some((_, para)) = super::character::text_style(app) { ui.horizontal(|ui| { ui.spacing_mut().item_spacing.x = 3.0; @@ -1013,9 +1014,18 @@ pub fn type_sections(app: &mut VectorcraftApp, ui: &mut Ui) { app.ui.open_panel = Some("paragraph".into()); } }); + // Area type: its vertical alignment in the frame (#3759). + if vertical_align::shown(app).is_some() { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 3.0; + vertical_align::buttons(app, ui, 24.0); + }); + } super::paragraph::hyphenate_check(app, ui, ¶); } } +pub(crate) mod vertical_align; + #[cfg(test)] mod tests; diff --git a/crates/ui-egui/src/panels/properties/tests.rs b/crates/ui-egui/src/panels/properties/tests.rs index 1a38e4f70..30ac3cd45 100644 --- a/crates/ui-egui/src/panels/properties/tests.rs +++ b/crates/ui-egui/src/panels/properties/tests.rs @@ -1792,3 +1792,71 @@ fn objects_on_path_options_set_pivot_and_rotate_in_one_undo_step() { assert_eq!((pivot_rotate(&app, &group), pivot_rotate(&app, &other)), ((8, 30.0), (8, 45.0)), "both groups' Pivot"); assert_eq!(undo_depth(&app), depth + 1, "one undo step for both groups"); } + +/// #3759: with area type selected, the Properties panel's Paragraph section shows Align Top, Align +/// Center, Align Bottom and Justify Vertically; a click sets the alignment on every selected frame +/// in one undo step. Point type shows none; frames with rows or columns and threaded frames turn +/// the buttons off, as the public documentation limits vertical alignment to them. +#[test] +fn vertical_alignment_buttons_align_the_selected_area_type() { + use vectorcraft_doc::{NodeId, VerticalAlign}; + let mut app = VectorcraftApp::new(Session::new(), Default::default()); + app.run("file.new", json!({"width": 500, "height": 400})).unwrap(); + let make = |app: &mut VectorcraftApp, x: f64, y: f64| { + app.run("text.create", json!({"x": x, "y": y, "text": "Panel", "area": {"width": 100, "height": 120}})).unwrap()["id"].as_u64().unwrap() + }; + let (a, b) = (make(&mut app, 10.0, 10.0), make(&mut app, 200.0, 10.0)); + let point = app.run("text.create", json!({"x": 10, "y": 350, "text": "Point"})).unwrap()["id"].as_u64().unwrap(); + let align = |app: &VectorcraftApp, id: u64| match &app.session.active().unwrap().doc.node(NodeId(id)).unwrap().kind { + NodeKind::Text(t) => t.area.vertical_align, + k => panic!("{k:?}"), + }; + app.run("select.set", json!({"ids": [point]})).unwrap(); + assert_eq!(vertical_align::shown(&app), None, "point type: no buttons"); + app.run("select.set", json!({"ids": [a, b]})).unwrap(); + assert_eq!(vertical_align::shown(&app), Some(vertical_align::Shown { shared: Some(VerticalAlign::Top), enabled: true })); + // The buttons sit in the panel's Paragraph section: click Align Center (the second). + let ctx = egui::Context::default(); + let mut row = Rect::NOTHING; + let draw = |app: &mut VectorcraftApp, ui: &mut Ui, row: &mut Rect| { + *row = ui + .horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 3.0; + vertical_align::buttons(app, ui, 24.0); + }) + .response + .rect; + }; + let mut out = ctx.run_ui(egui::RawInput::default(), |ui| draw(&mut app, ui, &mut row)); + out.textures_delta.clear(); + let texts = panel_frame(&mut app, &ctx, vec![], type_sections); + assert!(texts.iter().any(|(t, _)| t == "Paragraph"), "{texts:?}"); + let undo = app.session.active().unwrap().history.undo.len(); + let center = row.min + vec2(12.0 + 27.0, 12.0); + super::super::tests_appearance::click(&ctx, &mut app, center, |app, ui| { + let mut r = Rect::NOTHING; + draw(app, ui, &mut r); + }); + assert_eq!((align(&app, a), align(&app, b)), (VerticalAlign::Center, VerticalAlign::Center)); + assert_eq!(app.session.active().unwrap().history.undo.len(), undo + 1, "one undo step for both frames"); + // Differing alignments show none selected. + app.run("text.areaOptions", json!({"ids": [b], "verticalAlign": "bottom"})).unwrap(); + assert_eq!(vertical_align::shown(&app).map(|s| s.shared), Some(None)); + // Columns turn the buttons off, and a click does nothing. + app.run("text.areaOptions", json!({"ids": [b], "columns": 2})).unwrap(); + assert_eq!(vertical_align::shown(&app).map(|s| s.enabled), Some(false)); + let undo = app.session.active().unwrap().history.undo.len(); + super::super::tests_appearance::click(&ctx, &mut app, center, |app, ui| { + let mut r = Rect::NOTHING; + draw(app, ui, &mut r); + }); + assert_eq!(app.session.active().unwrap().history.undo.len(), undo, "turned off: no change"); + assert_eq!(align(&app, a), VerticalAlign::Center); + // So does threading: a and c threaded, b left out of the selection. + let c = make(&mut app, 10.0, 200.0); + app.run("select.set", json!({"ids": [a, c]})).unwrap(); + assert_eq!(vertical_align::shown(&app).map(|s| s.enabled), Some(true)); + app.run("text.thread.create", json!({})).unwrap(); + app.run("select.set", json!({"ids": [a]})).unwrap(); + assert_eq!(vertical_align::shown(&app).map(|s| s.enabled), Some(false)); +} diff --git a/crates/ui-egui/src/panels/properties/vertical_align.rs b/crates/ui-egui/src/panels/properties/vertical_align.rs new file mode 100644 index 000000000..bf2fef4a0 --- /dev/null +++ b/crates/ui-egui/src/panels/properties/vertical_align.rs @@ -0,0 +1,65 @@ +//! Area type's vertical alignment in its frame (#3759): the Align Top, Align Center, Align Bottom +//! and Justify Vertically buttons of the Properties panel's Paragraph section and of the Control +//! panel. Per the public documentation they align area type with one row and one column that isn't +//! threaded ([Align text](https://helpx.adobe.com/illustrator/desktop/design-with-text/edit-format-text/align-text.html)), +//! so they are turned off when a selected frame has rows or columns or is threaded. + +use egui::Ui; +use serde_json::json; +use vectorcraft_doc::{NodeKind, TextKind, VerticalAlign}; + +use crate::VectorcraftApp; +use crate::widgets; + +/// The vertical alignment the selected area type shows, and whether the buttons can change it. +#[derive(Clone, Copy, Debug, PartialEq)] +pub(crate) struct Shown { + /// The alignment every selected frame shares; `None` when they differ. + pub(crate) shared: Option, + /// Every selected frame has one row and one column and isn't threaded. + pub(crate) enabled: bool, +} + +/// The vertical alignment of the selected area type (and area type in selected groups, the frames +/// `text.areaOptions` changes); `None` when no area type is selected. +pub(crate) fn shown(app: &VectorcraftApp) -> Option { + let st = app.session.active()?; + let threaded = |id| st.doc.text_threads.iter().any(|t| t.len() > 1 && t.contains(&id)); + let mut out: Option = None; + for n in st.selection.objects.iter().filter_map(|id| st.doc.node(*id)) { + n.walk(&mut |c| { + let NodeKind::Text(t) = &c.kind else { return }; + if !matches!(t.kind, TextKind::Area { .. }) { + return; + } + let a = t.area.vertical_align; + let plain = t.area.rows <= 1 && t.area.columns <= 1 && !threaded(c.id); + out = Some(match out { + None => Shown { shared: Some(a), enabled: plain }, + Some(s) => Shown { shared: s.shared.filter(|b| *b == a), enabled: s.enabled && plain }, + }); + }); + } + out +} + +/// The four buttons for the selected area type: the shared alignment shows selected; a click sets +/// it on every selected frame in one undo step (`text.areaOptions {verticalAlign}`, as Area Type +/// Options does, each frame keeping its other options). Turned off for frames with rows or columns +/// and threaded ones; nothing shows without area type. Returns whether the buttons were drawn. +pub(crate) fn buttons(app: &mut VectorcraftApp, ui: &mut Ui, size: f32) -> bool { + let Some(s) = shown(app) else { return false }; + for (a, icon, tip, id) in [ + (VerticalAlign::Top, "dc-al-top", tl!("Align Top"), "top"), + (VerticalAlign::Center, "dc-al-vcenter", tl!("Align Center"), "center"), + (VerticalAlign::Bottom, "dc-al-bottom", tl!("Align Bottom"), "bottom"), + (VerticalAlign::Justify, "dc-dist-vcenter", tl!("Justify Vertically"), "justify"), + ] { + if widgets::icon_button_enabled(ui, icon, tip, s.enabled && s.shared == Some(a), s.enabled, size).clicked() + && let Err(e) = app.run("text.areaOptions", json!({ "verticalAlign": id })) + { + app.status(e); + } + } + true +} diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index 534aff206..adcdb060a 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -1,6 +1,6 @@ # Parity with Adobe Illustrator -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-03 · **Change:** minor (Object › Expand turns symbol instances into their art; scores and estimates unchanged) · **Target:** Adobe Illustrator 2026 (30.x; public release notes through 30.7, August 2026) +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-04 · **Change:** minor (area type vertical alignment in the Properties and Control panels, #3759; scores and estimates unchanged) · **Target:** Adobe Illustrator 2026 (30.x; public release notes through 30.7, August 2026) ## Feature submission evidence @@ -1589,10 +1589,15 @@ While a corner widget is pressed or dragged with the Selection or Direct Selecti A double-click on a Repeat (Radial, Grid or Mirror) with the Selection tool enters isolation mode on it ([isolate objects](https://helpx.adobe.com/illustrator/desktop/manage-objects/select-objects/isolate-objects.html): a double-click with the Selection tool isolates an object; [repeat patterns overview](https://helpx.adobe.com/illustrator/desktop/paint-and-fill/create-and-edit-patterns/repeat-patterns-overview.html): every instance follows edits to the original object); there the source art is selected and edited as usual (a double-click on type in it switches to the Type tool on that text) and every copy follows, with the repeat's settings kept (#5054). Test: `tests::repeat_edit::a_double_click_on_a_repeat_isolates_it_to_edit_its_text`. +## Area type: vertical alignment in the Properties and Control panels (2026-11-04) + +With area type selected, the Properties panel's Paragraph section and the Control panel show Align Top, Align Center, Align Bottom and Justify Vertically buttons, as the public documentation places them ([Align text](https://helpx.adobe.com/illustrator/desktop/design-with-text/edit-format-text/align-text.html)). They set the type's vertical alignment in its frame (`text.areaOptions {verticalAlign}`, as Area Type Options does) on every selected frame in one undo step, each frame keeping its other options; the shared alignment shows selected, none when the frames differ (#3759). As that page limits vertical alignment to area type without rows, columns or threads, the buttons are turned off while a selected frame has rows or columns or is threaded; Area Type Options and `text.areaOptions` still align each row/column cell (a VectorCraft extension, unchanged here). Tests: `panels::properties::tests::vertical_alignment_buttons_align_the_selected_area_type`. + ## Revision history | Date | Change | Summary | |---|---|---| +| 2026-11-04 | minor | Area type vertical alignment buttons in the Properties panel's Paragraph section and the Control panel, off for columns, rows and threaded frames (#3759); evidence added; scores unchanged. | | 2026-11-03 | minor | Enclosing Lasso is an add-on with no default shortcut or Basic toolbar slot. Scores and estimates remain unchanged. | | 2026-11-02 | minor | Wheel input over closed font-family fields changes selected text (#5253); public documentation and application choices distinguished; scores and estimates unchanged. | | 2026-11-03 | minor | Find Font's replacement-source chooser offers Document, Recent and System (#5217); scores and estimates unchanged. | diff --git a/docs/ui-parity.md b/docs/ui-parity.md index b1f034cda..a51fdd99d 100644 --- a/docs/ui-parity.md +++ b/docs/ui-parity.md @@ -1,6 +1,6 @@ # UI and interaction parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-03 · **Change:** minor (Type on a Path Options has a Preview checkbox, #5360; the Action Options row cites the public Actions panel page; scores and estimates unchanged) · **Target:** Adobe Illustrator 2026 (30.x; Units › East Asian Type acts, with Q and Ha units; scores unchanged) · **Target:** Adobe Illustrator 2026 (30.x) +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-04 · **Change:** minor (area type vertical alignment buttons in the Properties and Control panels, turned off for rows, columns and threads, #3759; scores and estimates unchanged) · **Target:** Adobe Illustrator 2026 (30.x; Units › East Asian Type acts, with Q and Ha units; scores unchanged) · **Target:** Adobe Illustrator 2026 (30.x) ## Feature submission evidence @@ -420,6 +420,7 @@ separate. Scores and hours unchanged. [Behavior and command details](development | Date | Change | Summary | |---|---|---| +| 2026-11-04 | minor | Area type: Align Top / Center / Bottom / Justify Vertically buttons in the Properties panel (Paragraph section) and the Control panel set its vertical alignment in the frame, as Area Type Options does; turned off for frames with rows or columns and threaded frames (#3759); scores and estimates unchanged | | 2026-11-03 | minor | Enclosing Lasso selects fully enclosed objects with a freehand loop under Object › Plug-ins; scores and estimates unchanged. | | 2026-11-03 | minor | Type on a Path Options has a Preview checkbox (#5360, as public tutorials of the dialog show); scores and estimates unchanged | | 2026-11-02 | minor | Font-family fields in Character, Properties and Control accept the wheel without opening the menu (#5253); scores and estimates unchanged. |