Fix #3759: vertical alignment buttons for area type in the Properties and Control panels

Squashed from #5100 onto main.
This commit is contained in:
Don Omondi
2026-11-04 20:08:06 +07:00
committed by bflatastic
parent 1348f827d0
commit 2b10694f99
32 changed files with 261 additions and 3 deletions
+5
View File
@@ -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();
+4
View File
@@ -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 Двустранно подравняване с дясно подравнен последен ред
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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 Πλήρης στοίχιση με τελευταία γραμμή δεξιά
Can't render this file because it contains an unexpected character in line 163 and column 5.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
1 # Indonesian (id) catalog. Same format as zh-hant.tsv: context <TAB> source <TAB> translation
886
887
888
889
890
891
892
893
894
895
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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 両端揃え (最終行右揃え)
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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 კლავიატურის მალსახმობების ნაკრები
Can't render this file because it is too large.
+4
View File
@@ -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 마지막 줄 오른쪽 정렬 양끝 맞춤
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 6 and column 47.
+4
View File
@@ -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 Выключить с последней строкой по правому краю
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 5 and column 25.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 5 and column 25.
+4
View File
@@ -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 Вирівняти за шириною, останній рядок — праворуч
Can't render this file because it contains an unexpected character in line 177 and column 5.
+4
View File
@@ -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
Can't render this file because it contains an unexpected character in line 199 and column 5.
+4
View File
@@ -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 两端对齐,末行右对齐
Can't render this file because it contains an unexpected character in line 2 and column 73.
+4
View File
@@ -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 兩端對齊,最後一行靠右
Can't render this file because it contains an unexpected character in line 6 and column 47.
+11 -1
View File
@@ -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, &para);
}
}
pub(crate) mod vertical_align;
#[cfg(test)]
mod tests;
@@ -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));
}
@@ -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<VerticalAlign>,
/// 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<Shown> {
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<Shown> = 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
}
+6 -1
View File
@@ -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. |
+2 -1
View File
@@ -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. |